package xyz.driver.pdsuidomain.storage import xyz.driver.pdsuicommon.domain.{LongId, UuidId} import xyz.driver.pdsuicommon.logging._ import xyz.driver.pdsuidomain.entities.{Arm, Patient} import scala.collection.concurrent.TrieMap object RequestStorage { type Key = (UuidId[Patient], String) type Value = Set[LongId[Arm]] } class RequestStorage extends PhiLogging { import RequestStorage._ private val storage = new TrieMap[Key, Value]() def put(patientId: UuidId[Patient], disease: String, ineligibleArms: Set[LongId[Arm]]): Unit = { logger.debug(phi"put($patientId, ${Unsafe(disease)}, $ineligibleArms") val key = (patientId, disease.toLowerCase) get(patientId, disease.toLowerCase) match { case Some(oldValue) => logger.trace(phi"Requested ineligible arms=$oldValue, replace it") storage.replace(key, oldValue, ineligibleArms) case None => logger.trace(phi"Put request into storage") storage.put(key, ineligibleArms) } } def get(patientId: UuidId[Patient], disease: String): Option[Value] = { logger.debug(phi"get($patientId,${Unsafe(disease)}") val key = (patientId, disease.toLowerCase) storage.get(key) } def contains(patientId: UuidId[Patient], disease: String, value: Set[LongId[Arm]]): Boolean = { logger.debug(phi"contains(key=($patientId,${Unsafe(disease)}),value=$value") get(patientId, disease.toLowerCase).contains(value) } def remove(patientId: UuidId[Patient], disease: String): Unit = { logger.debug(phi"remove($patientId,${Unsafe(disease)}") val key = (patientId, disease.toLowerCase) storage.remove(key) } }