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());