From dfdb1c689615ab79bafa4e904dc61a15db3bbffe Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Fri, 10 Nov 2017 20:48:44 +0700 Subject: Fixed calculation of eligibility status with "Unknown" value (instead of NULL) --- .../xyz/driver/pdsuidomain/entities/Document.scala | 1 - .../pdsuidomain/entities/PatientCriterion.scala | 23 ++++++++++----------- .../entities/PatientEligibleTrial.scala | 24 +++++++++++----------- .../driver/pdsuidomain/entities/PatientLabel.scala | 4 ++-- .../fakes/entities/treatmentmatching.scala | 12 +++++------ .../formats/json/patientcriterion.scala | 4 ++-- .../formats/json/patientdefiningcriteria.scala | 1 - .../pdsuidomain/formats/json/patientlabel.scala | 4 ++-- .../services/PatientCriterionService.scala | 2 +- .../formats/json/PatientCriterionFormatSuite.scala | 8 ++++---- .../json/PatientEligibleTrialFormatSuite.scala | 4 ++-- .../formats/json/PatientLabelFormatSuite.scala | 12 +++++------ 12 files changed, 48 insertions(+), 51 deletions(-) diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/Document.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/Document.scala index 471d345..e9085ec 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/entities/Document.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/entities/Document.scala @@ -7,7 +7,6 @@ import com.fasterxml.jackson.core.{JsonGenerator, JsonParser} import com.fasterxml.jackson.databind._ import com.fasterxml.jackson.databind.annotation.{JsonDeserialize, JsonSerialize} import xyz.driver.core.auth.User -import xyz.driver.pdsuicommon.compat.Implicits._ import xyz.driver.pdsuicommon.domain._ import xyz.driver.pdsuicommon.logging._ import xyz.driver.pdsuicommon.utils.Utils diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala index 7027eef..5d84a5c 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala @@ -19,17 +19,16 @@ object PatientCriterion { /** * @see https://driverinc.atlassian.net/wiki/display/MTCH/EV+Business+Process */ - def getEligibilityStatus(criterionValue: Option[Boolean], primaryValue: Option[LabelValue]): Option[LabelValue] = { + def getEligibilityStatus(criterionValue: Option[Boolean], primaryValue: LabelValue): LabelValue = { primaryValue match { - case None => None - case Some(LabelValue.Maybe) => Some(LabelValue.Maybe) - case Some(_) if criterionValue.isEmpty => Some(LabelValue.Maybe) - case Some(status) => - Some( + case LabelValue.Unknown => LabelValue.Unknown + case LabelValue.Maybe => LabelValue.Maybe + case _ if criterionValue.isEmpty => LabelValue.Maybe + case status => + LabelValue.fromBoolean( LabelValue.fromBoolean( - LabelValue.fromBoolean( - criterionValue.getOrElse(throw new IllegalArgumentException("Criterion should not be empty"))) == status - )) + criterionValue.getOrElse(throw new IllegalArgumentException("Criterion should not be empty"))) == status + ) } } @@ -48,13 +47,13 @@ final case class PatientCriterion(id: LongId[PatientCriterion], criterionText: String, criterionValue: Option[Boolean], criterionIsDefining: Boolean, - eligibilityStatus: Option[LabelValue], - verifiedEligibilityStatus: Option[LabelValue], + eligibilityStatus: LabelValue, + verifiedEligibilityStatus: LabelValue, isVerified: Boolean, isVisible: Boolean, lastUpdate: LocalDateTime, inclusion: Option[Boolean]) { - def isIneligibleForEv: Boolean = eligibilityStatus.contains(LabelValue.No) && isVerified + def isIneligibleForEv: Boolean = eligibilityStatus == LabelValue.No && isVerified } object PatientCriterionArm { diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/PatientEligibleTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/PatientEligibleTrial.scala index ff272a8..179056a 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/entities/PatientEligibleTrial.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/entities/PatientEligibleTrial.scala @@ -38,22 +38,22 @@ object PatientTrialArmGroup { /** * @see https://driverinc.atlassian.net/wiki/display/DMPD/EV+Business+Process */ - def getEligibilityStatusForRc(criterionList: TraversableOnce[PatientCriterion]): Option[LabelValue] = { - def isEligible: Boolean = criterionList.forall(_.verifiedEligibilityStatus.contains(LabelValue.Yes)) - def isIneligible: Boolean = criterionList.exists(_.verifiedEligibilityStatus.contains(LabelValue.No)) - def isUnknown: Boolean = criterionList.forall(_.verifiedEligibilityStatus.isEmpty) + def getEligibilityStatusForRc(criterionList: TraversableOnce[PatientCriterion]): LabelValue = { + def isEligible: Boolean = criterionList.forall(_.verifiedEligibilityStatus == LabelValue.Yes) + def isIneligible: Boolean = criterionList.exists(_.verifiedEligibilityStatus == LabelValue.No) + def isUnknown: Boolean = criterionList.forall(_.verifiedEligibilityStatus == LabelValue.Unknown) - if (isEligible) Some(LabelValue.Yes) - else if (isIneligible) Some(LabelValue.No) - else if (isUnknown) None - else Some(LabelValue.Maybe) + if (isEligible) LabelValue.Yes + else if (isIneligible) LabelValue.No + else if (isUnknown) LabelValue.Unknown + else LabelValue.Maybe } } final case class PatientTrialArmGroup(id: LongId[PatientTrialArmGroup], eligibleTrialId: UuidId[PatientEligibleTrial], - eligibilityStatus: Option[LabelValue], - verifiedEligibilityStatus: Option[LabelValue], + eligibilityStatus: LabelValue, + verifiedEligibilityStatus: LabelValue, isVerified: Boolean) object PatientTrialArmGroupView { @@ -70,8 +70,8 @@ final case class PatientTrialArmGroupView(id: LongId[PatientTrialArmGroup], patientId: UuidId[Patient], trialId: StringId[Trial], hypothesisId: UuidId[Hypothesis], - eligibilityStatus: Option[LabelValue], - verifiedEligibilityStatus: Option[LabelValue], + eligibilityStatus: LabelValue, + verifiedEligibilityStatus: LabelValue, isVerified: Boolean) { def applyTo(trialArmGroup: PatientTrialArmGroup) = { diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/PatientLabel.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/PatientLabel.scala index 4c0f4ef..df86175 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/entities/PatientLabel.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/entities/PatientLabel.scala @@ -17,8 +17,8 @@ final case class PatientLabel(id: LongId[PatientLabel], patientId: UuidId[Patient], labelId: LongId[Label], score: Int, - primaryValue: Option[LabelValue], - verifiedPrimaryValue: Option[LabelValue], + primaryValue: LabelValue, + verifiedPrimaryValue: LabelValue, isImplicitMatch: Boolean, isVisible: Boolean) diff --git a/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/treatmentmatching.scala b/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/treatmentmatching.scala index 441c1db..f2d6a1b 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/treatmentmatching.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/treatmentmatching.scala @@ -62,8 +62,8 @@ object treatmentmatching { patientId = nextUuidId[Patient], labelId = nextLongId[Label], score = generators.nextInt(100), - primaryValue = generators.nextOption(fakes.entities.labels.nextLabelValue()), - verifiedPrimaryValue = generators.nextOption(fakes.entities.labels.nextLabelValue()), + primaryValue = fakes.entities.labels.nextLabelValue(), + verifiedPrimaryValue = fakes.entities.labels.nextLabelValue(), isImplicitMatch = generators.nextBoolean(), isVisible = generators.nextBoolean() ) @@ -82,8 +82,8 @@ object treatmentmatching { criterionText = generators.nextString(), criterionValue = generators.nextOption(generators.nextBoolean()), criterionIsDefining = generators.nextBoolean(), - eligibilityStatus = generators.nextOption(fakes.entities.labels.nextLabelValue()), - verifiedEligibilityStatus = generators.nextOption(fakes.entities.labels.nextLabelValue()), + eligibilityStatus = fakes.entities.labels.nextLabelValue(), + verifiedEligibilityStatus = fakes.entities.labels.nextLabelValue(), isVerified = generators.nextBoolean(), isVisible = generators.nextBoolean(), lastUpdate = nextLocalDateTime, @@ -139,8 +139,8 @@ object treatmentmatching { patientId = nextUuidId[Patient], trialId = trialId, hypothesisId = nextUuidId[Hypothesis], - eligibilityStatus = generators.nextOption(fakes.entities.labels.nextLabelValue()), - verifiedEligibilityStatus = generators.nextOption(fakes.entities.labels.nextLabelValue()), + eligibilityStatus = fakes.entities.labels.nextLabelValue(), + verifiedEligibilityStatus = fakes.entities.labels.nextLabelValue(), isVerified = generators.nextBoolean() ) diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala index b5696f7..1004c5b 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala @@ -15,12 +15,12 @@ object patientcriterion { case JsObject(fields) => val eligibilityStatus = fields .get("eligibilityStatus") - .map(_.convertTo[Option[LabelValue]]) + .map(_.convertTo[LabelValue]) .getOrElse(orig.eligibilityStatus) val verifiedEligibilityStatus = fields .get("verifiedEligibilityStatus") - .map(_.convertTo[Option[LabelValue]]) + .map(_.convertTo[LabelValue]) .getOrElse(orig.verifiedEligibilityStatus) orig.copy( diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientdefiningcriteria.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientdefiningcriteria.scala index 0b4fbae..a67115c 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientdefiningcriteria.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientdefiningcriteria.scala @@ -5,7 +5,6 @@ import xyz.driver.formats.json.labels._ import xyz.driver.pdsuidomain.entities.PatientLabel object patientdefiningcriteria { - import DefaultJsonProtocol._ import common._ implicit val patientLabelDefiningCriteriaWriter: RootJsonWriter[PatientLabel] = new RootJsonWriter[PatientLabel] { diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientlabel.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientlabel.scala index d944e42..6499318 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientlabel.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientlabel.scala @@ -17,12 +17,12 @@ object patientlabel { case JsObject(fields) => val primaryValue = fields .get("primaryValue") - .map(_.convertTo[Option[LabelValue]]) + .map(_.convertTo[LabelValue]) .getOrElse(orig.primaryValue) val verifiedPrimaryValue = fields .get("verifiedPrimaryValue") - .map(_.convertTo[Option[LabelValue]]) + .map(_.convertTo[LabelValue]) .getOrElse(orig.verifiedPrimaryValue) orig.copy( diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/PatientCriterionService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/PatientCriterionService.scala index 21ec73a..68e7b50 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/services/PatientCriterionService.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/services/PatientCriterionService.scala @@ -20,7 +20,7 @@ object PatientCriterionService { isVerified: Option[Boolean]) { def applyTo(orig: PatientCriterion) = { orig.copy( - eligibilityStatus = eligibilityStatus.orElse(orig.eligibilityStatus), + eligibilityStatus = eligibilityStatus.getOrElse(orig.eligibilityStatus), isVerified = isVerified.getOrElse(orig.isVerified) ) } diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientCriterionFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientCriterionFormatSuite.scala index e0f96bb..94d80c9 100644 --- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientCriterionFormatSuite.scala +++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientCriterionFormatSuite.scala @@ -22,8 +22,8 @@ class PatientCriterionFormatSuite extends FlatSpec with Matchers { criterionText = "criterion text", criterionValue = Some(true), criterionIsDefining = false, - eligibilityStatus = Some(LabelValue.Yes), - verifiedEligibilityStatus = None, + eligibilityStatus = LabelValue.Yes, + verifiedEligibilityStatus = LabelValue.Unknown, isVisible = true, isVerified = true, lastUpdate = LocalDateTime.parse("2017-08-10T18:00:00"), @@ -39,12 +39,12 @@ class PatientCriterionFormatSuite extends FlatSpec with Matchers { writtenJson should be( """{"isVerified":true,"patientLabelId":1,"lastUpdate":"2017-08-10T18:00Z","trialId":0, "armList":[{"patientCriterionId":1,"armId":31,"armName":"arm 31"},{"patientCriterionId":1, - "armId":32,"armName":"arm 32"}],"eligibilityStatus":"Yes","id":1,"nctId":"NCT00001", + "armId":32,"armName":"arm 32"}],"eligibilityStatus":"Yes","verifiedEligibilityStatus":"Unknown","id":1,"nctId":"NCT00001", "criterionId":101,"criterionValue":true,"criterionIsDefining":false,"labelId":21, "isVisible":true,"criterionText":"criterion text","inclusion":true}""".parseJson) val updatePatientCriterionJson = """{"verifiedEligibilityStatus":"No"}""".parseJson - val expectedUpdatedPatientCriterion = orig.copy(verifiedEligibilityStatus = Some(LabelValue.No)) + val expectedUpdatedPatientCriterion = orig.copy(verifiedEligibilityStatus = LabelValue.No) val parsedUpdatePatientCriterion = applyUpdateToPatientCriterion(updatePatientCriterionJson, orig) parsedUpdatePatientCriterion should be(expectedUpdatedPatientCriterion) diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala index b5fbf3f..faef0f6 100644 --- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala +++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala @@ -38,8 +38,8 @@ class PatientEligibleTrialFormatSuite extends FlatSpec with Matchers { patientId = UuidId("748b5884-3528-4cb9-904b-7a8151d6e343"), trialId = StringId("NCT000001"), hypothesisId = UuidId("e76e2fc4-a29c-44fb-a81b-8856d06bb1d4"), - eligibilityStatus = Some(LabelValue.Yes), - verifiedEligibilityStatus = Some(LabelValue.Yes), + eligibilityStatus = LabelValue.Yes, + verifiedEligibilityStatus = LabelValue.Yes, isVerified = false ) val arms = List( diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientLabelFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientLabelFormatSuite.scala index b83aad1..289de53 100644 --- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientLabelFormatSuite.scala +++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientLabelFormatSuite.scala @@ -17,8 +17,8 @@ class PatientLabelFormatSuite extends FlatSpec with Matchers { id = LongId(1), patientId = UuidId("748b5884-3528-4cb9-904b-7a8151d6e343"), labelId = LongId(20), - primaryValue = Some(LabelValue.Yes), - verifiedPrimaryValue = None, + primaryValue = LabelValue.Yes, + verifiedPrimaryValue = LabelValue.Unknown, isVisible = true, score = 1, isImplicitMatch = false @@ -26,11 +26,11 @@ class PatientLabelFormatSuite extends FlatSpec with Matchers { val writtenJson = richPatientLabelFormat.write(RichPatientLabel(orig, isVerified = true)) writtenJson should be( - """{"id":1,"labelId":20,"primaryValue":"Yes","isVisible":true,"isVerified":true, + """{"id":1,"labelId":20,"primaryValue":"Yes","isVisible":true,"isVerified":true,"verifiedPrimaryValue":"Unknown", "score":1,"isImplicitMatch":false, "patientId":"748b5884-3528-4cb9-904b-7a8151d6e343"}""".parseJson) val updatePatientLabelJson = """{"verifiedPrimaryValue":"No"}""".parseJson - val expectedUpdatedPatientLabel = orig.copy(verifiedPrimaryValue = Some(LabelValue.No)) + val expectedUpdatedPatientLabel = orig.copy(verifiedPrimaryValue = LabelValue.No) val parsedUpdatePatientLabel = applyUpdateToPatientLabel(updatePatientLabelJson, orig) parsedUpdatePatientLabel should be(expectedUpdatedPatientLabel) } @@ -65,8 +65,8 @@ class PatientLabelFormatSuite extends FlatSpec with Matchers { id = LongId(1), patientId = UuidId("748b5884-3528-4cb9-904b-7a8151d6e343"), labelId = LongId(20), - primaryValue = Some(LabelValue.Yes), - verifiedPrimaryValue = Some(LabelValue.Yes), + primaryValue = LabelValue.Yes, + verifiedPrimaryValue = LabelValue.Yes, isVisible = true, score = 1, isImplicitMatch = false -- cgit v1.2.3 From 77b54e459d6478ae9685e8cac56ae21f08c263ef Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Mon, 13 Nov 2017 16:46:38 +0700 Subject: Review fix --- src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala index 5d84a5c..193e8cb 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala @@ -53,7 +53,8 @@ final case class PatientCriterion(id: LongId[PatientCriterion], isVisible: Boolean, lastUpdate: LocalDateTime, inclusion: Option[Boolean]) { - def isIneligibleForEv: Boolean = eligibilityStatus == LabelValue.No && isVerified + import scalaz.syntax.equal._ + def isIneligibleForEv: Boolean = eligibilityStatus === LabelValue.No && isVerified } object PatientCriterionArm { -- cgit v1.2.3