From 3c2a7fdfccc87cb8ec9e8e48c31c622555078c54 Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Tue, 24 Oct 2017 11:33:55 +0700 Subject: Added field 'inclusion' to ExportTrialLabelCriterion --- .../export/trial/ExportTrialLabelCriterion.scala | 5 +- .../driver/pdsuidomain/fakes/entities/export.scala | 3 +- .../formats/json/sprayformats/export.scala | 86 ++++++++++++++++------ .../services/fake/FakeTrialService.scala | 3 +- 4 files changed, 70 insertions(+), 27 deletions(-) (limited to 'src/main') diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/export/trial/ExportTrialLabelCriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/export/trial/ExportTrialLabelCriterion.scala index 8376e34..98bd084 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/entities/export/trial/ExportTrialLabelCriterion.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/entities/export/trial/ExportTrialLabelCriterion.scala @@ -11,13 +11,14 @@ final case class ExportTrialLabelCriterion(criterionId: LongId[Criterion], armIds: Set[LongId[EligibilityArm]], criteria: String, isCompound: Boolean, - isDefining: Boolean) + isDefining: Boolean, + inclusion: Option[Boolean]) object ExportTrialLabelCriterion { implicit def toPhiString(x: ExportTrialLabelCriterion): PhiString = { import x._ phi"TrialLabelCriterion(criterionId=$criterionId, value=$value, labelId=$labelId, " + - phi"criteria=${Unsafe(criteria)}, isCompound=$isCompound, isDefining=$isDefining)" + phi"criteria=${Unsafe(criteria)}, isCompound=$isCompound, isDefining=$isDefining), inclusion=${Unsafe(inclusion)}" } } diff --git a/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/export.scala b/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/export.scala index 2c7d0e0..33da392 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/export.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/export.scala @@ -28,7 +28,8 @@ object export { armIds = setOf(nextLongId[EligibilityArm]), criteria = nextString(100), isCompound = nextBoolean(), - isDefining = nextBoolean() + isDefining = nextBoolean(), + inclusion = nextOption(nextBoolean()) ) def nextExportTrialWithLabels(): ExportTrialWithLabels = diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/export.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/export.scala index 4391453..9579288 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/export.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/export.scala @@ -3,6 +3,7 @@ package xyz.driver.pdsuidomain.formats.json.sprayformats import spray.json._ import xyz.driver.entities.labels.Label import xyz.driver.formats.json.labels._ +import xyz.driver.pdsuicommon.domain.LongId import xyz.driver.pdsuidomain.entities.export.patient._ import xyz.driver.pdsuidomain.entities.export.trial.{ExportTrialArm, ExportTrialLabelCriterion, ExportTrialWithLabels} import xyz.driver.pdsuidomain.entities.{Criterion, EligibilityArm} @@ -13,6 +14,14 @@ object export { import document._ import record._ + private def deserializationErrorFieldMessage(field: String, json: JsValue)(implicit className: String) = { + deserializationError(s"$className json object do not contain '$field' field: $json") + } + + private def deserializationErrorEntityMessage(json: JsValue)(implicit className: String) = { + deserializationError(s"Expected Json Object as $className, but got $json") + } + implicit val patientLabelEvidenceDocumentFormat: RootJsonFormat[ExportPatientLabelEvidenceDocument] = jsonFormat5(ExportPatientLabelEvidenceDocument.apply) @@ -29,6 +38,8 @@ object export { implicit val trialLabelCriterionFormat: RootJsonFormat[ExportTrialLabelCriterion] = new RootJsonFormat[ExportTrialLabelCriterion] { + implicit val className: String = "ExportTrialLabelCriterion" + override def write(obj: ExportTrialLabelCriterion): JsValue = JsObject( "value" -> obj.value @@ -43,40 +54,69 @@ object export { "criterionText" -> obj.criteria.toJson, "armIds" -> obj.armIds.toJson, "isCompound" -> obj.isCompound.toJson, - "isDefining" -> obj.isDefining.toJson + "isDefining" -> obj.isDefining.toJson, + "inclusion" -> obj.inclusion.toJson ) override def read(json: JsValue): ExportTrialLabelCriterion = { + json match { + case JsObject(fields) => + val value = fields + .get("value") + .map(_.convertTo[String]) + .map { + case "Yes" => Option(true) + case "No" => Option(false) + case "Unknown" => Option.empty[Boolean] + } + .getOrElse(deserializationErrorFieldMessage("value", json)) - val fields = Seq("value", "labelId", "criterionId", "criterionText", "armIds", "isCompound", "isDefining") - - json.asJsObject.getFields(fields: _*) match { - case Seq(JsString(valueString), - labelId, - criterionId, - JsString(criterionText), - JsArray(armIdsVector), - JsBoolean(isCompound), - JsBoolean(isDefining)) => - val value = valueString match { - case "Yes" => Option(true) - case "No" => Option(false) - case "Unknown" => Option.empty[Boolean] - } + val labelId = fields + .get("labelId") + .map(_.convertTo[LongId[Label]]) + .getOrElse(deserializationErrorFieldMessage("labelId", json)) + + val criterionId = fields + .get("criterionId") + .map(_.convertTo[LongId[Criterion]]) + .getOrElse(deserializationErrorFieldMessage("criterionId", json)) + + val criterionText = fields + .get("criterionText") + .map(_.convertTo[String]) + .getOrElse(deserializationErrorFieldMessage("criterionText", json)) + + val armIds = fields + .get("armIds") + .map(_.convertTo[Set[LongId[EligibilityArm]]]) + .getOrElse(deserializationErrorFieldMessage("armIds", json)) + + val isCompound = fields + .get("isCompound") + .map(_.convertTo[Boolean]) + .getOrElse(deserializationErrorFieldMessage("isCompound", json)) + + val isDefining = fields + .get("isDefining") + .map(_.convertTo[Boolean]) + .getOrElse(deserializationErrorFieldMessage("isDefining", json)) + + val inclusion = fields + .get("inclusion") + .flatMap(_.convertTo[Option[Boolean]]) ExportTrialLabelCriterion( - longIdFormat[Criterion].read(criterionId), + criterionId, value, - longIdFormat[Label].read(labelId), - armIdsVector.map(longIdFormat[EligibilityArm].read).toSet, + labelId, + armIds, criterionText, isCompound, - isDefining + isDefining, + inclusion ) - case _ => - deserializationError( - s"Cannot find required fields ${fields.mkString(", ")} in ExportTrialLabelCriterion object!") + case _ => deserializationErrorEntityMessage(json) } } } diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala index e0efcd1..e23449c 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala @@ -85,7 +85,8 @@ class FakeTrialService extends TrialService { generators.setOf(LongId[EligibilityArm](generators.nextInt(999999).toLong)), generators.nextName().value, generators.nextBoolean(), - generators.nextBoolean() + generators.nextBoolean(), + generators.nextOption(generators.nextBoolean()) )) ) -- cgit v1.2.3