diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java index 672d6d8ad..0cabfd16b 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java @@ -1087,7 +1087,7 @@ public class StructureMapUtilities { if (lexer.hasToken("log")) { lexer.take(); ExpressionNode node = fpe.parse(lexer); - source.setUserData(MAP_WHERE_CHECK, node); + source.setUserData(MAP_WHERE_LOG, node); source.setLogMessage(node.toString()); } } @@ -1629,17 +1629,20 @@ public class StructureMapUtilities { } items.removeAll(remove); } - + if (src.hasCondition()) { ExpressionNode expr = (ExpressionNode) src.getUserData(MAP_WHERE_EXPRESSION); if (expr == null) { expr = fpe.parse(src.getCondition()); - // fpe.check(context.appInfo, ??, ??, expr) src.setUserData(MAP_WHERE_EXPRESSION, expr); } List remove = new ArrayList(); for (Base item : items) { - if (!fpe.evaluateToBoolean(vars, null, null, item, expr)) { + Variables varsForSource = vars.copy(); + if (src.hasVariable()) { + varsForSource.add(VariableMode.INPUT, src.getVariable(), item); + } + if (!fpe.evaluateToBoolean(varsForSource, null, null, item, expr)) { log(indent + " condition [" + src.getCondition() + "] for " + item.toString() + " : false"); remove.add(item); } else @@ -1652,12 +1655,14 @@ public class StructureMapUtilities { ExpressionNode expr = (ExpressionNode) src.getUserData(MAP_WHERE_CHECK); if (expr == null) { expr = fpe.parse(src.getCheck()); - // fpe.check(context.appInfo, ??, ??, expr) src.setUserData(MAP_WHERE_CHECK, expr); } - List remove = new ArrayList(); for (Base item : items) { - if (!fpe.evaluateToBoolean(vars, null, null, item, expr)) + Variables varsForSource = vars.copy(); + if (src.hasVariable()) { + varsForSource.add(VariableMode.INPUT, src.getVariable(), item); + } + if (!fpe.evaluateToBoolean(varsForSource, null, null, item, expr)) throw new FHIRException("Rule \"" + ruleId + "\": Check condition failed"); } } @@ -1666,16 +1671,20 @@ public class StructureMapUtilities { ExpressionNode expr = (ExpressionNode) src.getUserData(MAP_WHERE_LOG); if (expr == null) { expr = fpe.parse(src.getLogMessage()); - // fpe.check(context.appInfo, ??, ??, expr) src.setUserData(MAP_WHERE_LOG, expr); } CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(); - for (Base item : items) - b.appendIfNotNull(fpe.evaluateToString(vars, null, null, item, expr)); + for (Base item : items) { + Variables varsForSource = vars.copy(); + if (src.hasVariable()) { + varsForSource.add(VariableMode.INPUT, src.getVariable(), item); + } + b.appendIfNotNull(fpe.evaluateToString(varsForSource, null, null, item, expr)); + } if (b.length() > 0) services.log(b.toString()); } - + if (src.hasListMode() && !items.isEmpty()) { switch (src.getListMode()) { @@ -1753,7 +1762,7 @@ public class StructureMapUtilities { if (tgt.hasVariable() && v != null) vars.add(VariableMode.OUTPUT, tgt.getVariable(), v); } - + private Base runTransform(String rulePath, TransformContext context, StructureMap map, StructureMapGroupComponent group, StructureMapGroupRuleTargetComponent tgt, Variables vars, Base dest, String element, String srcVar, boolean root) throws FHIRException { try { switch (tgt.getTransform()) { @@ -2520,7 +2529,6 @@ public class StructureMapUtilities { ExpressionNode expr = (ExpressionNode) tgt.getUserData(MAP_EXPRESSION); if (expr == null) { expr = fpe.parse(getParamString(vars, tgt.getParameter().get(tgt.getParameter().size() - 1))); - tgt.setUserData(MAP_WHERE_EXPRESSION, expr); } return fpe.check(vars, null, expr); case TRANSLATE: diff --git a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/test/StructureMapUtilitiesTest.java b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/test/StructureMapUtilitiesTest.java index a5e1c1279..d88820f7e 100644 --- a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/test/StructureMapUtilitiesTest.java +++ b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/test/StructureMapUtilitiesTest.java @@ -71,6 +71,19 @@ public class StructureMapUtilitiesTest implements ITransformerServices { assertEquals("2023-10-26", fp.evaluateToString(target, "birthDate")); assertEquals("2023-09-20T13:19:13.502Z", fp.evaluateToString(target, "deceased")); } + + @Test + public void testWhereClause() throws IOException, FHIRException { + StructureMapUtilities scu = new StructureMapUtilities(context, this); + scu.setDebug(true); + String fileMap = TestingUtilities.loadTestResource("r5", "structure-mapping", "whereclause.map"); + Element source = Manager.parseSingle(context, TestingUtilities.loadTestResourceStream("r4", "examples", "capabilitystatement-example.json"), FhirFormat.JSON); + StructureMap structureMap = scu.parse(fileMap, "whereclause"); + Element target = Manager.build(context, scu.getTargetType(structureMap)); + scu.transform(null, source, structureMap, target); + FHIRPathEngine fp = new FHIRPathEngine(context); + assertEquals("true", fp.evaluateToString(target, "rest.resource.interaction.where(code='create').exists()")); + } private void assertSerializeDeserialize(StructureMap structureMap) { Assertions.assertEquals("syntax", structureMap.getName());