From 5063f1772bda3413e78428710f6ca77d15f10cee Mon Sep 17 00:00:00 2001 From: Vera Prinsen Date: Mon, 5 Feb 2024 16:16:22 +0100 Subject: [PATCH 1/6] temp --- .../archie/rminfo/UpdatedValueHandler.java | 8 +- .../FixableAssertionsCheckerTest.java | 37 +++-- .../rules/evaluation/fixable_matches.adls | 154 +++++++++++------- 3 files changed, 131 insertions(+), 68 deletions(-) diff --git a/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java b/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java index 792e275d5..9d1802ac8 100644 --- a/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java +++ b/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java @@ -16,8 +16,10 @@ import com.nedap.archie.rm.archetyped.Archetyped; import com.nedap.archie.rm.archetyped.Locatable; import com.nedap.archie.rm.datatypes.CodePhrase; +import com.nedap.archie.rm.datavalues.DataValue; import com.nedap.archie.rm.datavalues.DvCodedText; import com.nedap.archie.rm.datavalues.quantity.DvOrdinal; +import com.nedap.archie.rm.datavalues.quantity.DvScale; import com.nedap.archie.rm.support.identification.TerminologyId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,7 +61,11 @@ private static Map fixDvOrdinal(Object rmObject, Archetype arche Map result = new HashMap<>(); RMPathQuery rmPathQuery = new RMPathQuery(pathOfParent.replace("/symbol/defining_code", "")); - DvOrdinal ordinal = rmPathQuery.find(ArchieRMInfoLookup.getInstance(), rmObject); + DataValue archetypeModelObject = rmPathQuery.find(ArchieRMInfoLookup.getInstance(), rmObject); + if (archetypeModelObject instanceof DvScale) { + return result; + } + DvOrdinal ordinal = (DvOrdinal) archetypeModelObject; Long value = null; CAttribute symbolAttribute = archetype.itemAtPath(pathOfParent.replace("/symbol/defining_code", "/symbol"));//TODO: remove all numeric indices from path! if (symbolAttribute != null) { diff --git a/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java b/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java index 64de095a8..089bbb4eb 100644 --- a/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java +++ b/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java @@ -60,26 +60,38 @@ public void fixableMatches() throws Exception { ItemTree itemTree = (ItemTree) root.itemAtPath("/data[id2]/events[id3]/data[id4]"); // Add a second cluster with the boolean set to true - Cluster cluster2 = new Cluster("id81", new DvText("Cluster"), new ArrayList<>()); + Cluster cluster2 = new Cluster("id24", new DvText("Cluster"), new ArrayList<>()); DvBoolean dvBoolean = new DvBoolean(); dvBoolean.setValue(true); - cluster2.addItem(new Element("id82", new DvText("First element"), dvBoolean)); + cluster2.addItem(new Element("id25", new DvText("First element"), dvBoolean)); itemTree.addItem(cluster2); EvaluationResult evaluate = ruleEvaluation.evaluate(root, archetype.getRules().getRules()); - assertEquals("There are eleven values that must be set", 11, evaluate.getSetPathValues().size()); + assertEquals("There are eleven values that must be set", 12, evaluate.getSetPathValues().size()); //assert that paths must be set to specific values + // DvText assertEquals("test string", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id5]/value/value").getValue()); - assertEquals("at1", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id6]/value/defining_code/code_string").getValue()); - assertEquals("local", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id6]/value/defining_code/terminology_id/value").getValue()); - assertEquals("Option 1", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id6]/value/value").getValue()); - assertEquals("at6", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id7]/value/symbol/defining_code/code_string").getValue()); - assertEquals("local", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id7]/value/symbol/defining_code/terminology_id/value").getValue()); - assertEquals(0l, evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id7]/value/value").getValue()); - assertEquals("at1", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/defining_code/code_string").getValue()); - assertEquals("local", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/defining_code/terminology_id/value").getValue()); - assertEquals("Option 1", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/value").getValue()); + // DvCodedText + assertEquals("at10", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id7]/value/defining_code/code_string").getValue()); + assertEquals("local", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id7]/value/defining_code/terminology_id/value").getValue()); + assertEquals("Option 1", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id7]/value/value").getValue()); + // DvOrdinal + assertEquals("at11", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id13]/value/symbol/defining_code/code_string").getValue()); + assertEquals("local", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id13]/value/symbol/defining_code/terminology_id/value").getValue()); + assertEquals(1l, evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id13]/value/value").getValue()); + assertEquals("Option 2", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id13]/value/symbol/value")); + // DvScale + assertEquals("at12", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id15]/value/symbol/defining_code/code_string").getValue()); + assertEquals("local", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id15]/value/symbol/defining_code/terminology_id/value").getValue()); + assertEquals(2.5, evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id15]/value/value").getValue()); + assertEquals("Option 3", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id15]/value/symbol/value")); + // DvCodedText with null flavour + assertEquals("at10", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/defining_code/code_string").getValue()); + assertEquals("local", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/defining_code/terminology_id/value").getValue()); + assertEquals("Option 1", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/value").getValue()); + + assertEquals("The boolean is true", evaluate.getSetPathValues().get("/data[id2]/events[id3, 1]/data[id4]/items[id81, 6]/items[id84]/value/value").getValue()); //now assert that the RM Object cloned by rule evaluation has been modified with the new values for further evaluation @@ -98,6 +110,7 @@ public void fixableMatches() throws Exception { //and of course the DV_ORDINAL and DV_CODED_TEXT should be constructed correctly, with the correct numeric respectively a textual value assertEquals(0l, ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/value")); assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id6]/value/value")); + assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id9]/value/value")); assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/value")); diff --git a/tools/src/test/resources/com/nedap/archie/rules/evaluation/fixable_matches.adls b/tools/src/test/resources/com/nedap/archie/rules/evaluation/fixable_matches.adls index 99d7ed981..9a8f99455 100644 --- a/tools/src/test/resources/com/nedap/archie/rules/evaluation/fixable_matches.adls +++ b/tools/src/test/resources/com/nedap/archie/rules/evaluation/fixable_matches.adls @@ -22,7 +22,7 @@ description copyright = <"copyright © 2004 openEHR Foundation "> definition - OBSERVATION[id1] matches { -- Body mass index + OBSERVATION[id1] matches { -- Title data matches { HISTORY[id2] matches { events cardinality matches {1..*; unordered} matches { @@ -32,48 +32,59 @@ definition items cardinality matches {1..*; unordered} matches { ELEMENT[id5] matches { value matches { - DV_TEXT[id64] - } - } - ELEMENT[id6] matches { - value matches { - DV_CODED_TEXT[id54] matches { - defining_code matches {[ac1]} - } + DV_TEXT[id6] } } ELEMENT[id7] matches { value matches { - DV_ORDINAL[id75] matches { - [value, symbol] matches { - [{0}, {[at6]}], - [{1}, {[at7]}], - [{2}, {[at8]}] - } - } - } - } - ELEMENT[id8] matches { - null_flavour matches { - DV_CODED_TEXT[id80] matches { - defining_code matches {[ac1]} - } - } - } - CLUSTER[id81] matches { -- Repeatable cluster - items matches { - ELEMENT[id82] occurrences matches {0..1} matches { -- First element - value matches { - DV_BOOLEAN[id83] - } - } - ELEMENT[id84] occurrences matches {0..1} matches { -- Second element - value matches { - DV_TEXT[id85] - } + DV_CODED_TEXT[id8] matches { + defining_code matches {[ac9]} } } } + ELEMENT[id13] matches { + value matches { + DV_ORDINAL[id14] matches { + [value, symbol] matches { + [{0}, {[at10]}], + [{1}, {[at11]}], + [{2}, {[at12]}] + } + } + } + } + ELEMENT[id15] matches { + value matches { + DV_SCALE[id16] matches { + [value, symbol] matches { + [{0.5}, {[at10]}], + [{1.5}, {[at11]}], + [{2.5}, {[at12]}] + } + } + } + } + ELEMENT[id17] matches { + null_flavour matches { + DV_CODED_TEXT[id18] matches { + defining_code matches {[ac9]} + } + } + } + CLUSTER[id19] matches { + items matches { + ELEMENT[id20] occurrences matches {0..1} matches { + value matches { + DV_BOOLEAN[id21] + } + } + ELEMENT[id22] occurrences matches {0..1} matches { + value matches { + DV_TEXT[id23] + } + } + } + } } } } @@ -85,43 +96,76 @@ definition rules /data[id2]/events[id3]/data[id4]/items[id5]/value/value matches {"test string"} - /data[id2]/events[id3]/data[id4]/items[id6]/value/defining_code matches {[at1]} - /data[id2]/events[id3]/data[id4]/items[id7]/value/symbol matches {[at6]} - /data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/defining_code matches {[at1]} - for_all $cluster in /data[id2]/events[id3]/data[id4]/items[id81] - ($cluster/items[id82]/value/value implies - $cluster/items[id84]/value/value matches {"The boolean is true"}) - + /data[id2]/events[id3]/data[id4]/items[id7]/value/defining_code matches {[at10]} + /data[id2]/events[id3]/data[id4]/items[id13]/value/symbol matches {[at11]} + /data[id2]/events[id3]/data[id4]/items[id15]/value/symbol matches {[at12]} + /data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/defining_code matches {[at10]} + for_all $cluster in /data[id2]/events[id3]/data[id4]/items[id19] + ($cluster/items[id20]/value/value implies + $cluster/items[id22]/value/value matches {"The boolean is true"}) terminology term_definitions = < ["en"] = < ["id1"] = < - text = <"Blood Pressure"> + text = <"Title"> + description = <"The local measurement of arterial blood pressure which is a surrogate for arterial. pressure in the systemic circulation. Most commonly, use of the term 'blood pressure' refers to measurement of brachial artery pressure in the upper arm."> + > + ["id5"] = < + text = <"DvText"> + description = <"The local measurement of arterial blood pressure which is a surrogate for arterial. pressure in the systemic circulation. Most commonly, use of the term 'blood pressure' refers to measurement of brachial artery pressure in the upper arm."> + > + ["id7"] = < + text = <"DvCodedText"> description = <"The local measurement of arterial blood pressure which is a surrogate for arterial. pressure in the systemic circulation. Most commonly, use of the term 'blood pressure' refers to measurement of brachial artery pressure in the upper arm."> > - ["at1"] = < + ["ac9"] = < + text = <"ValueSet"> + description = <""> + > + ["at10"] = < text = <"Option 1"> - description = <"Option 1"> + description = <""> + > + ["at11"] = < + text = <"Option 2"> + description = <""> + > + ["at12"] = < + text = <"Option 3"> + description = <""> > - ["id81"] = < - text = <"Repeatable cluster"> + ["id13"] = < + text = <"DvOrdinal"> description = <""> > - ["id82"] = < - text = <"First element"> + ["id15"] = < + text = <"DvScale"> description = <""> > - ["id84"] = < - text = <"Second element"> + ["id17"] = < + text = <"DvCodedText with null flavour"> + description = <""> + > + ["id19"] = < + text = <"Cluster"> + description = <""> + > + ["id20"] = < + text = <"DvBoolean"> + description = <""> + > + ["id22"] = < + text = <"DvText in Cluster"> description = <""> > > > + value_sets = < - ["ac1"] = < - id = <"ac1"> - members = <"at1", "at2", "at3"> + ["ac9"] = < + id = <"ac9"> + members = <"at10", "at11", "at12"> > > From 96485514bb1489a37c39c2c4b2c606e5b624d6ae Mon Sep 17 00:00:00 2001 From: Vera Prinsen Date: Mon, 5 Feb 2024 16:47:54 +0100 Subject: [PATCH 2/6] temp --- .../archie/rminfo/UpdatedValueHandler.java | 58 ++++++++++++++++--- .../FixableAssertionsCheckerTest.java | 38 ++++++------ .../rules/evaluation/fixable_matches.adls | 4 +- 3 files changed, 71 insertions(+), 29 deletions(-) diff --git a/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java b/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java index 9d1802ac8..d2b076452 100644 --- a/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java +++ b/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java @@ -47,7 +47,7 @@ private static Map fixCodePhrase(Object rmObject, Archetype arch if (pathOfParent.endsWith("value/defining_code") || pathOfParent.endsWith("null_flavour/defining_code")) { return fixDvCodedText(rmObject, archetype, pathOfParent); } else if (pathOfParent.endsWith("symbol/defining_code")) { - return fixDvOrdinal(rmObject, archetype, pathOfParent); + return fixDvOrdinalOrScale(rmObject, archetype, pathOfParent); } else { } } catch (Exception e) { @@ -57,16 +57,20 @@ private static Map fixCodePhrase(Object rmObject, Archetype arch return new HashMap<>(); } - private static Map fixDvOrdinal(Object rmObject, Archetype archetype, String pathOfParent) throws XPathExpressionException { - Map result = new HashMap<>(); - + private static Map fixDvOrdinalOrScale(Object rmObject, Archetype archetype, String pathOfParent) throws XPathExpressionException { RMPathQuery rmPathQuery = new RMPathQuery(pathOfParent.replace("/symbol/defining_code", "")); DataValue archetypeModelObject = rmPathQuery.find(ArchieRMInfoLookup.getInstance(), rmObject); - if (archetypeModelObject instanceof DvScale) { - return result; + if (archetypeModelObject instanceof DvOrdinal) { + return fixDvOrdinal(rmObject, archetype, pathOfParent, (DvOrdinal) archetypeModelObject); + } else if (archetypeModelObject instanceof DvScale) { + return fixDvScale(rmObject, archetype, pathOfParent, (DvScale) archetypeModelObject); } - DvOrdinal ordinal = (DvOrdinal) archetypeModelObject; - Long value = null; + return null; + } + + private static Map fixDvOrdinal(Object rmObject, Archetype archetype, String pathOfParent, DvOrdinal ordinal) throws XPathExpressionException { + Map result = new HashMap<>(); + Long value; CAttribute symbolAttribute = archetype.itemAtPath(pathOfParent.replace("/symbol/defining_code", "/symbol"));//TODO: remove all numeric indices from path! if (symbolAttribute != null) { CAttributeTuple socParent = (CAttributeTuple) symbolAttribute.getSocParent(); @@ -101,6 +105,44 @@ private static Map fixDvOrdinal(Object rmObject, Archetype arche return result; } + private static Map fixDvScale(Object rmObject, Archetype archetype, String pathOfParent, DvScale scale) throws XPathExpressionException { + Map result = new HashMap<>(); + + Double value; + CAttribute symbolAttribute = archetype.itemAtPath(pathOfParent.replace("/symbol/defining_code", "/symbol"));//TODO: remove all numeric indices from path! + if (symbolAttribute != null) { + CAttributeTuple socParent = (CAttributeTuple) symbolAttribute.getSocParent(); + if (socParent != null) { + int valueIndex = socParent.getMemberIndex("value"); + int symbolIndex = socParent.getMemberIndex("symbol"); + if (valueIndex != -1 && symbolIndex != -1) { + for (CPrimitiveTuple tuple : socParent.getTuples()) { + if (tuple.getMembers().get(symbolIndex).getConstraint().get(0).equals(scale.getSymbol().getDefiningCode().getCodeString())) { + List> valueConstraint = (List>) tuple.getMembers().get(valueIndex).getConstraint(); + if(valueConstraint.size() == 1) { + Interval interval = valueConstraint.get(0); + if(interval.getLower().equals(interval.getUpper()) && !interval.isLowerUnbounded() && !interval.isUpperUnbounded()) { + value = interval.getLower(); + scale.setValue(value); + String pathToValue = pathOfParent.replace("/symbol/defining_code", "/value"); + result.put(pathToValue, value); + } + + } + } + } + + } + } + } + if(scale.getSymbol() != null && scale.getSymbol().getDefiningCode() != null) { + //also fix the DvCodedText inside the DvScale + result.putAll(fixDvCodedText(rmObject, archetype, pathOfParent)); + } + + return result; + } + private static Map fixDvCodedText(Object rmObject, Archetype archetype, String pathOfParent) throws XPathExpressionException { String path = pathOfParent.replace("/defining_code", ""); RMPathQuery rmPathQuery = new RMPathQuery(path); diff --git a/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java b/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java index 089bbb4eb..f8bdd702a 100644 --- a/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java +++ b/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java @@ -67,7 +67,7 @@ public void fixableMatches() throws Exception { itemTree.addItem(cluster2); EvaluationResult evaluate = ruleEvaluation.evaluate(root, archetype.getRules().getRules()); - assertEquals("There are eleven values that must be set", 12, evaluate.getSetPathValues().size()); + assertEquals("There are eleven values that must be set", 15, evaluate.getSetPathValues().size()); //assert that paths must be set to specific values // DvText @@ -80,38 +80,38 @@ public void fixableMatches() throws Exception { assertEquals("at11", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id13]/value/symbol/defining_code/code_string").getValue()); assertEquals("local", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id13]/value/symbol/defining_code/terminology_id/value").getValue()); assertEquals(1l, evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id13]/value/value").getValue()); - assertEquals("Option 2", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id13]/value/symbol/value")); + assertEquals("Option 2", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id13]/value/symbol/value").getValue()); // DvScale assertEquals("at12", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id15]/value/symbol/defining_code/code_string").getValue()); assertEquals("local", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id15]/value/symbol/defining_code/terminology_id/value").getValue()); assertEquals(2.5, evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id15]/value/value").getValue()); - assertEquals("Option 3", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id15]/value/symbol/value")); + assertEquals("Option 3", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id15]/value/symbol/value").getValue()); // DvCodedText with null flavour assertEquals("at10", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/defining_code/code_string").getValue()); assertEquals("local", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/defining_code/terminology_id/value").getValue()); assertEquals("Option 1", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/value").getValue()); - - - assertEquals("The boolean is true", evaluate.getSetPathValues().get("/data[id2]/events[id3, 1]/data[id4]/items[id81, 6]/items[id84]/value/value").getValue()); + // DvText in Cluster + assertEquals("The boolean is true", evaluate.getSetPathValues().get("/data[id2]/events[id3, 1]/data[id4]/items[id19, 6]/items[id22]/value/value").getValue()); //now assert that the RM Object cloned by rule evaluation has been modified with the new values for further evaluation assertEquals("test string", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id5]/value/value")); - assertEquals("at1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id6]/value/defining_code/code_string")); - assertEquals("local", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id6]/value/defining_code/terminology_id/value")); - assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id6]/value/value")); - assertEquals("at6", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/symbol/defining_code/code_string")); - assertEquals("local", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/symbol/defining_code/terminology_id/value")); - assertEquals(0l, ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/value")); - assertEquals("at1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/defining_code/code_string")); + assertEquals("at10", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/defining_code/code_string")); + assertEquals("local", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/defining_code/terminology_id/value")); + assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/value")); + assertEquals("at11", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id13]/value/symbol/defining_code/code_string")); + assertEquals("local", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id13]/value/symbol/defining_code/terminology_id/value")); + assertEquals(1l, ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id13]/value/value")); + assertEquals("at12", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/defining_code/code_string")); assertEquals("local", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/defining_code/terminology_id/value")); - assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/value")); - assertEquals("The boolean is true", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3, 1]/data[id4]/items[id81, 6]/items[id84]/value/value")); + assertEquals("Option 3", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/value")); + assertEquals("The boolean is true", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3, 1]/data[id4]/items[id19, 6]/items[id22]/value/value")); //and of course the DV_ORDINAL and DV_CODED_TEXT should be constructed correctly, with the correct numeric respectively a textual value - assertEquals(0l, ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/value")); - assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id6]/value/value")); - assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id9]/value/value")); - assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/value")); + assertEquals(1l, ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id13]/value/value")); + assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/value")); + assertEquals("Option 2", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id13]/value/value")); + assertEquals("Option 3", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id15]/value/value")); + assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/value")); evaluate = ruleEvaluation.evaluate(ruleEvaluation.getRMRoot(), archetype.getRules().getRules()); diff --git a/tools/src/test/resources/com/nedap/archie/rules/evaluation/fixable_matches.adls b/tools/src/test/resources/com/nedap/archie/rules/evaluation/fixable_matches.adls index 9a8f99455..96ca97899 100644 --- a/tools/src/test/resources/com/nedap/archie/rules/evaluation/fixable_matches.adls +++ b/tools/src/test/resources/com/nedap/archie/rules/evaluation/fixable_matches.adls @@ -101,8 +101,8 @@ rules /data[id2]/events[id3]/data[id4]/items[id15]/value/symbol matches {[at12]} /data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/defining_code matches {[at10]} for_all $cluster in /data[id2]/events[id3]/data[id4]/items[id19] - ($cluster/items[id20]/value/value implies - $cluster/items[id22]/value/value matches {"The boolean is true"}) + ($cluster/items[id20]/value/value implies + $cluster/items[id22]/value/value matches {"The boolean is true"}) terminology term_definitions = < From f70fcaf58c9e00a235c4b0b64ecd9967a8906719 Mon Sep 17 00:00:00 2001 From: Vera Prinsen Date: Tue, 6 Feb 2024 15:09:32 +0100 Subject: [PATCH 3/6] fix test --- .../FixableAssertionsCheckerTest.java | 40 ++- .../rules/evaluation/fixable_matches.adls | 321 +++++++++--------- 2 files changed, 186 insertions(+), 175 deletions(-) diff --git a/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java b/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java index f8bdd702a..f48739558 100644 --- a/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java +++ b/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java @@ -60,16 +60,16 @@ public void fixableMatches() throws Exception { ItemTree itemTree = (ItemTree) root.itemAtPath("/data[id2]/events[id3]/data[id4]"); // Add a second cluster with the boolean set to true - Cluster cluster2 = new Cluster("id24", new DvText("Cluster"), new ArrayList<>()); + Cluster cluster2 = new Cluster("id19", new DvText("Cluster"), new ArrayList<>()); DvBoolean dvBoolean = new DvBoolean(); dvBoolean.setValue(true); - cluster2.addItem(new Element("id25", new DvText("First element"), dvBoolean)); + cluster2.addItem(new Element("id20", new DvText("First element"), dvBoolean)); itemTree.addItem(cluster2); EvaluationResult evaluate = ruleEvaluation.evaluate(root, archetype.getRules().getRules()); - assertEquals("There are eleven values that must be set", 15, evaluate.getSetPathValues().size()); + assertEquals("There are eleven values that must be set", 16, evaluate.getSetPathValues().size()); - //assert that paths must be set to specific values + // Assert that paths must be set to specific values // DvText assertEquals("test string", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id5]/value/value").getValue()); // DvCodedText @@ -91,34 +91,42 @@ public void fixableMatches() throws Exception { assertEquals("local", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/defining_code/terminology_id/value").getValue()); assertEquals("Option 1", evaluate.getSetPathValues().get("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/value").getValue()); // DvText in Cluster - assertEquals("The boolean is true", evaluate.getSetPathValues().get("/data[id2]/events[id3, 1]/data[id4]/items[id19, 6]/items[id22]/value/value").getValue()); + assertEquals("The boolean is true", evaluate.getSetPathValues().get("/data[id2]/events[id3, 1]/data[id4]/items[id19, 7]/items[id22]/value/value").getValue()); - //now assert that the RM Object cloned by rule evaluation has been modified with the new values for further evaluation + // Now assert that the RM Object cloned by rule evaluation has been modified with the new values for further evaluation + // DvText assertEquals("test string", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id5]/value/value")); + // DvCodedText assertEquals("at10", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/defining_code/code_string")); assertEquals("local", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/defining_code/terminology_id/value")); assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/value")); + // DvOrdinal assertEquals("at11", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id13]/value/symbol/defining_code/code_string")); assertEquals("local", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id13]/value/symbol/defining_code/terminology_id/value")); assertEquals(1l, ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id13]/value/value")); - assertEquals("at12", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/defining_code/code_string")); - assertEquals("local", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/defining_code/terminology_id/value")); - assertEquals("Option 3", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id8]/null_flavour/value")); - assertEquals("The boolean is true", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3, 1]/data[id4]/items[id19, 6]/items[id22]/value/value")); + // DvScale + assertEquals("at12", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id15]/value/symbol/defining_code/code_string")); + assertEquals("local", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id15]/value/symbol/defining_code/terminology_id/value")); + assertEquals(2.5, ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id15]/value/value")); + // DvCodedText with null flavour + assertEquals("at10", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/defining_code/code_string")); + assertEquals("local", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/defining_code/terminology_id/value")); + assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/value")); + // DvText in Cluster + assertEquals("The boolean is true", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3, 1]/data[id4]/items[id19, 7]/items[id22]/value/value")); - //and of course the DV_ORDINAL and DV_CODED_TEXT should be constructed correctly, with the correct numeric respectively a textual value - assertEquals(1l, ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id13]/value/value")); + // And of course the DV_CODED_TEXT, DV_ORDINAL and DV_SCALE should be constructed correctly, with the correct numeric respectively a textual value assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id7]/value/value")); - assertEquals("Option 2", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id13]/value/value")); - assertEquals("Option 3", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id15]/value/value")); + assertEquals("Option 2", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id13]/value/symbol/value")); + assertEquals(1l, ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id13]/value/value")); + assertEquals("Option 3", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id15]/value/symbol/value")); + assertEquals(2.5, ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id15]/value/value")); assertEquals("Option 1", ruleEvaluation.getRMRoot().itemAtPath("/data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/value")); - evaluate = ruleEvaluation.evaluate(ruleEvaluation.getRMRoot(), archetype.getRules().getRules()); for(AssertionResult result:evaluate.getAssertionResults()) { assertTrue(result.getResult()); } - } @Test diff --git a/tools/src/test/resources/com/nedap/archie/rules/evaluation/fixable_matches.adls b/tools/src/test/resources/com/nedap/archie/rules/evaluation/fixable_matches.adls index 96ca97899..4eb52c7ec 100644 --- a/tools/src/test/resources/com/nedap/archie/rules/evaluation/fixable_matches.adls +++ b/tools/src/test/resources/com/nedap/archie/rules/evaluation/fixable_matches.adls @@ -1,171 +1,174 @@ -archetype (adl_version=2.0.5; rm_release=1.0.2; generated) - openEHR-EHR-OBSERVATION.matches.v1.0.0 +archetype (adl_version=2.0.5; rm_release=1.1.0; generated) + openEHR-EHR-OBSERVATION.matches.v1.0.0 language - original_language = <[ISO_639-1::en]> + original_language = <[ISO_639-1::en]> description - original_author = < - ["name"] = <"Pieter Bos"> - > - details = < - ["en"] = < - language = <[ISO_639-1::en]> - purpose = <"Test for rules, simple constant arithmetics"> - keywords = <"ADL", "test"> - > - > - lifecycle_state = <"published"> - other_details = < - ["regression"] = <"PASS"> - > - copyright = <"copyright © 2004 openEHR Foundation "> + original_author = < + ["name"] = <"Pieter Bos"> + > + lifecycle_state = <"published"> + copyright = <"copyright © 2004 openEHR Foundation "> + other_details = < + ["regression"] = <"PASS"> + > + details = < + ["en"] = < + language = <[ISO_639-1::en]> + purpose = <"Test for rules, simple constant arithmetics"> + keywords = <"ADL", "test"> + > + > definition - OBSERVATION[id1] matches { -- Title - data matches { - HISTORY[id2] matches { - events cardinality matches {1..*; unordered} matches { - EVENT[id3] occurrences matches {1..*} matches { -- Any event - data matches { - ITEM_TREE[id4] matches { - items cardinality matches {1..*; unordered} matches { - ELEMENT[id5] matches { - value matches { - DV_TEXT[id6] - } - } - ELEMENT[id7] matches { - value matches { - DV_CODED_TEXT[id8] matches { - defining_code matches {[ac9]} - } - } - } - ELEMENT[id13] matches { - value matches { - DV_ORDINAL[id14] matches { - [value, symbol] matches { - [{0}, {[at10]}], - [{1}, {[at11]}], - [{2}, {[at12]}] + OBSERVATION[id1] matches { -- Title + data matches { + HISTORY[id2] matches { + events cardinality matches {1..*; unordered} matches { + EVENT[id3] occurrences matches {1..*} matches { -- Event + data matches { + ITEM_TREE[id4] matches { + items cardinality matches {1..*; unordered} matches { + ELEMENT[id5] matches { -- DvText + value matches { + DV_TEXT[id6] + } + } + ELEMENT[id7] matches { -- DvCodedText + value matches { + DV_CODED_TEXT[id8] matches { + defining_code matches {[ac9]} -- ValueSet + } + } + } + ELEMENT[id13] matches { -- DvOrdinal + value matches { + DV_ORDINAL[id14] matches { + [value, symbol] matches { + [{0}, {[at10]}], + [{1}, {[at11]}], + [{2}, {[at12]}] + } + } + } + } + ELEMENT[id15] matches { -- DvScale + value matches { + DV_SCALE[id16] matches { + [value, symbol] matches { + [{0.5}, {[at10]}], + [{1.5}, {[at11]}], + [{2.5}, {[at12]}] + } + } + } + } + ELEMENT[id17] matches { -- DvCodedText with null flavour + null_flavour matches { + DV_CODED_TEXT[id18] matches { + defining_code matches {[ac9]} -- ValueSet + } + } + } + CLUSTER[id19] matches { -- Cluster + items matches { + ELEMENT[id20] occurrences matches {0..1} matches { -- DvBoolean + value matches { + DV_BOOLEAN[id21] + } + } + ELEMENT[id22] occurrences matches {0..1} matches { -- DvText in Cluster + value matches { + DV_TEXT[id23] + } + } + } + } + } + } } - } } - } - ELEMENT[id15] matches { - value matches { - DV_SCALE[id16] matches { - [value, symbol] matches { - [{0.5}, {[at10]}], - [{1.5}, {[at11]}], - [{2.5}, {[at12]}] - } - } - } - } - ELEMENT[id17] matches { - null_flavour matches { - DV_CODED_TEXT[id18] matches { - defining_code matches {[ac9]} - } - } - } - CLUSTER[id19] matches { - items matches { - ELEMENT[id20] occurrences matches {0..1} matches { - value matches { - DV_BOOLEAN[id21] - } - } - ELEMENT[id22] occurrences matches {0..1} matches { - value matches { - DV_TEXT[id23] - } - } - } - } - } - } - } - } - } - } - } - } + } + } + } + } rules - /data[id2]/events[id3]/data[id4]/items[id5]/value/value matches {"test string"} - /data[id2]/events[id3]/data[id4]/items[id7]/value/defining_code matches {[at10]} - /data[id2]/events[id3]/data[id4]/items[id13]/value/symbol matches {[at11]} - /data[id2]/events[id3]/data[id4]/items[id15]/value/symbol matches {[at12]} - /data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/defining_code matches {[at10]} - for_all $cluster in /data[id2]/events[id3]/data[id4]/items[id19] - ($cluster/items[id20]/value/value implies - $cluster/items[id22]/value/value matches {"The boolean is true"}) - -terminology - term_definitions = < - ["en"] = < - ["id1"] = < - text = <"Title"> - description = <"The local measurement of arterial blood pressure which is a surrogate for arterial. pressure in the systemic circulation. Most commonly, use of the term 'blood pressure' refers to measurement of brachial artery pressure in the upper arm."> - > - ["id5"] = < - text = <"DvText"> - description = <"The local measurement of arterial blood pressure which is a surrogate for arterial. pressure in the systemic circulation. Most commonly, use of the term 'blood pressure' refers to measurement of brachial artery pressure in the upper arm."> - > - ["id7"] = < - text = <"DvCodedText"> - description = <"The local measurement of arterial blood pressure which is a surrogate for arterial. pressure in the systemic circulation. Most commonly, use of the term 'blood pressure' refers to measurement of brachial artery pressure in the upper arm."> - > - ["ac9"] = < - text = <"ValueSet"> - description = <""> - > - ["at10"] = < - text = <"Option 1"> - description = <""> - > - ["at11"] = < - text = <"Option 2"> - description = <""> - > - ["at12"] = < - text = <"Option 3"> - description = <""> - > - ["id13"] = < - text = <"DvOrdinal"> - description = <""> - > - ["id15"] = < - text = <"DvScale"> - description = <""> - > - ["id17"] = < - text = <"DvCodedText with null flavour"> - description = <""> - > - ["id19"] = < - text = <"Cluster"> - description = <""> - > - ["id20"] = < - text = <"DvBoolean"> - description = <""> - > - ["id22"] = < - text = <"DvText in Cluster"> - description = <""> - > - > - > + /data[id2]/events[id3]/data[id4]/items[id5]/value/value matches {"test string"} + /data[id2]/events[id3]/data[id4]/items[id7]/value/defining_code matches {[at10]} + /data[id2]/events[id3]/data[id4]/items[id13]/value/symbol matches {[at11]} + /data[id2]/events[id3]/data[id4]/items[id15]/value/symbol matches {[at12]} + /data[id2]/events[id3]/data[id4]/items[id17]/null_flavour/defining_code matches {[at10]} + for_all $cluster in /data[id2]/events[id3]/data[id4]/items[id19] + ($cluster/items[id20]/value/value implies + $cluster/items[id22]/value/value matches {"The boolean is true"}) - value_sets = < - ["ac9"] = < - id = <"ac9"> - members = <"at10", "at11", "at12"> - > - > +terminology + term_definitions = < + ["en"] = < + ["id1"] = < + text = <"Title"> + description = <"The local measurement of arterial blood pressure which is a surrogate for arterial. pressure in the systemic circulation. Most commonly, use of the term 'blood pressure' refers to measurement of brachial artery pressure in the upper arm."> + > + ["id3"] = < + text = <"Event"> + description = <""> + > + ["id5"] = < + text = <"DvText"> + description = <"The local measurement of arterial blood pressure which is a surrogate for arterial. pressure in the systemic circulation. Most commonly, use of the term 'blood pressure' refers to measurement of brachial artery pressure in the upper arm."> + > + ["id7"] = < + text = <"DvCodedText"> + description = <"The local measurement of arterial blood pressure which is a surrogate for arterial. pressure in the systemic circulation. Most commonly, use of the term 'blood pressure' refers to measurement of brachial artery pressure in the upper arm."> + > + ["ac9"] = < + text = <"ValueSet"> + description = <""> + > + ["at10"] = < + text = <"Option 1"> + description = <""> + > + ["at11"] = < + text = <"Option 2"> + description = <""> + > + ["at12"] = < + text = <"Option 3"> + description = <""> + > + ["id13"] = < + text = <"DvOrdinal"> + description = <""> + > + ["id15"] = < + text = <"DvScale"> + description = <""> + > + ["id17"] = < + text = <"DvCodedText with null flavour"> + description = <""> + > + ["id19"] = < + text = <"Cluster"> + description = <""> + > + ["id20"] = < + text = <"DvBoolean"> + description = <""> + > + ["id22"] = < + text = <"DvText in Cluster"> + description = <""> + > + > + > + value_sets = < + ["ac9"] = < + id = <"ac9"> + members = <"at10", "at11", "at12"> + > + > From f2e486592bdb73c6d11138cc3aa6e3a36664d05c Mon Sep 17 00:00:00 2001 From: Vera Prinsen Date: Tue, 6 Feb 2024 15:25:54 +0100 Subject: [PATCH 4/6] Fix duplicate code issue --- .../archie/rminfo/UpdatedValueHandler.java | 73 +++++-------------- 1 file changed, 18 insertions(+), 55 deletions(-) diff --git a/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java b/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java index d2b076452..c7198485a 100644 --- a/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java +++ b/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java @@ -18,6 +18,7 @@ import com.nedap.archie.rm.datatypes.CodePhrase; import com.nedap.archie.rm.datavalues.DataValue; import com.nedap.archie.rm.datavalues.DvCodedText; +import com.nedap.archie.rm.datavalues.quantity.DvOrdered; import com.nedap.archie.rm.datavalues.quantity.DvOrdinal; import com.nedap.archie.rm.datavalues.quantity.DvScale; import com.nedap.archie.rm.support.identification.TerminologyId; @@ -47,7 +48,7 @@ private static Map fixCodePhrase(Object rmObject, Archetype arch if (pathOfParent.endsWith("value/defining_code") || pathOfParent.endsWith("null_flavour/defining_code")) { return fixDvCodedText(rmObject, archetype, pathOfParent); } else if (pathOfParent.endsWith("symbol/defining_code")) { - return fixDvOrdinalOrScale(rmObject, archetype, pathOfParent); + return fixDvOrdinalOrDvScale(rmObject, archetype, pathOfParent); } else { } } catch (Exception e) { @@ -57,58 +58,13 @@ private static Map fixCodePhrase(Object rmObject, Archetype arch return new HashMap<>(); } - private static Map fixDvOrdinalOrScale(Object rmObject, Archetype archetype, String pathOfParent) throws XPathExpressionException { + private static Map fixDvOrdinalOrDvScale(Object rmObject, Archetype archetype, String pathOfParent) throws XPathExpressionException { RMPathQuery rmPathQuery = new RMPathQuery(pathOfParent.replace("/symbol/defining_code", "")); - DataValue archetypeModelObject = rmPathQuery.find(ArchieRMInfoLookup.getInstance(), rmObject); - if (archetypeModelObject instanceof DvOrdinal) { - return fixDvOrdinal(rmObject, archetype, pathOfParent, (DvOrdinal) archetypeModelObject); - } else if (archetypeModelObject instanceof DvScale) { - return fixDvScale(rmObject, archetype, pathOfParent, (DvScale) archetypeModelObject); - } - return null; - } + DvOrdered ordered = rmPathQuery.find(ArchieRMInfoLookup.getInstance(), rmObject); - private static Map fixDvOrdinal(Object rmObject, Archetype archetype, String pathOfParent, DvOrdinal ordinal) throws XPathExpressionException { Map result = new HashMap<>(); - Long value; - CAttribute symbolAttribute = archetype.itemAtPath(pathOfParent.replace("/symbol/defining_code", "/symbol"));//TODO: remove all numeric indices from path! - if (symbolAttribute != null) { - CAttributeTuple socParent = (CAttributeTuple) symbolAttribute.getSocParent(); - if (socParent != null) { - int valueIndex = socParent.getMemberIndex("value"); - int symbolIndex = socParent.getMemberIndex("symbol"); - if (valueIndex != -1 && symbolIndex != -1) { - for (CPrimitiveTuple tuple : socParent.getTuples()) { - if (tuple.getMembers().get(symbolIndex).getConstraint().get(0).equals(ordinal.getSymbol().getDefiningCode().getCodeString())) { - List> valueConstraint = (List>) tuple.getMembers().get(valueIndex).getConstraint(); - if(valueConstraint.size() == 1) { - Interval interval = valueConstraint.get(0); - if(interval.getLower().equals(interval.getUpper()) && !interval.isLowerUnbounded() && !interval.isUpperUnbounded()) { - value = interval.getLower(); - ordinal.setValue(value); - String pathToValue = pathOfParent.replace("/symbol/defining_code", "/value"); - result.put(pathToValue, value); - } + Number value; - } - } - } - - } - } - } - if(ordinal.getSymbol() != null && ordinal.getSymbol().getDefiningCode() != null) { - //also fix the DvCodedText inside the DvOrdinal - result.putAll(fixDvCodedText(rmObject, archetype, pathOfParent)); - } - - return result; - } - - private static Map fixDvScale(Object rmObject, Archetype archetype, String pathOfParent, DvScale scale) throws XPathExpressionException { - Map result = new HashMap<>(); - - Double value; CAttribute symbolAttribute = archetype.itemAtPath(pathOfParent.replace("/symbol/defining_code", "/symbol"));//TODO: remove all numeric indices from path! if (symbolAttribute != null) { CAttributeTuple socParent = (CAttributeTuple) symbolAttribute.getSocParent(); @@ -117,13 +73,18 @@ private static Map fixDvScale(Object rmObject, Archetype archety int symbolIndex = socParent.getMemberIndex("symbol"); if (valueIndex != -1 && symbolIndex != -1) { for (CPrimitiveTuple tuple : socParent.getTuples()) { - if (tuple.getMembers().get(symbolIndex).getConstraint().get(0).equals(scale.getSymbol().getDefiningCode().getCodeString())) { - List> valueConstraint = (List>) tuple.getMembers().get(valueIndex).getConstraint(); + if ((ordered instanceof DvOrdinal && tuple.getMembers().get(symbolIndex).getConstraint().get(0).equals(((DvOrdinal) ordered).getSymbol().getDefiningCode().getCodeString())) || + ordered instanceof DvScale && tuple.getMembers().get(symbolIndex).getConstraint().get(0).equals(((DvScale) ordered).getSymbol().getDefiningCode().getCodeString())) { + List> valueConstraint = (List>) tuple.getMembers().get(valueIndex).getConstraint(); if(valueConstraint.size() == 1) { - Interval interval = valueConstraint.get(0); + Interval interval = valueConstraint.get(0); if(interval.getLower().equals(interval.getUpper()) && !interval.isLowerUnbounded() && !interval.isUpperUnbounded()) { value = interval.getLower(); - scale.setValue(value); + if (ordered instanceof DvOrdinal) { + ((DvOrdinal) ordered).setValue((Long) value); + } else { + ((DvScale) ordered).setValue((Double) value); + } String pathToValue = pathOfParent.replace("/symbol/defining_code", "/value"); result.put(pathToValue, value); } @@ -135,8 +96,10 @@ private static Map fixDvScale(Object rmObject, Archetype archety } } } - if(scale.getSymbol() != null && scale.getSymbol().getDefiningCode() != null) { - //also fix the DvCodedText inside the DvScale + + if ((ordered instanceof DvOrdinal && (((DvOrdinal) ordered).getSymbol() != null && ((DvOrdinal) ordered).getSymbol().getDefiningCode() != null)) || + (ordered instanceof DvScale && (((DvScale) ordered).getSymbol() != null && ((DvScale) ordered).getSymbol().getDefiningCode() != null))) { + //also fix the DvCodedText inside the DvOrdinal result.putAll(fixDvCodedText(rmObject, archetype, pathOfParent)); } From afb80690f49473007bf285f462a1009ce4ec6c06 Mon Sep 17 00:00:00 2001 From: Vera Prinsen Date: Tue, 6 Feb 2024 15:28:16 +0100 Subject: [PATCH 5/6] format imports --- .../main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java | 3 --- .../archie/rules/evaluation/FixableAssertionsCheckerTest.java | 3 --- 2 files changed, 6 deletions(-) diff --git a/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java b/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java index c7198485a..25c2f4319 100644 --- a/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java +++ b/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java @@ -4,19 +4,16 @@ import com.google.common.base.Strings; import com.nedap.archie.ArchieLanguageConfiguration; import com.nedap.archie.aom.*; -import com.nedap.archie.aom.primitives.CTerminologyCode; import com.nedap.archie.aom.terminology.ArchetypeTerm; import com.nedap.archie.aom.terminology.ArchetypeTerminology; import com.nedap.archie.aom.utils.AOMUtils; import com.nedap.archie.base.Interval; -import com.nedap.archie.paths.PathSegment; import com.nedap.archie.query.APathQuery; import com.nedap.archie.query.RMObjectWithPath; import com.nedap.archie.query.RMPathQuery; import com.nedap.archie.rm.archetyped.Archetyped; import com.nedap.archie.rm.archetyped.Locatable; import com.nedap.archie.rm.datatypes.CodePhrase; -import com.nedap.archie.rm.datavalues.DataValue; import com.nedap.archie.rm.datavalues.DvCodedText; import com.nedap.archie.rm.datavalues.quantity.DvOrdered; import com.nedap.archie.rm.datavalues.quantity.DvOrdinal; diff --git a/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java b/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java index f48739558..40215a8d7 100644 --- a/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java +++ b/tools/src/test/java/com/nedap/archie/rules/evaluation/FixableAssertionsCheckerTest.java @@ -2,11 +2,9 @@ import com.nedap.archie.ArchieLanguageConfiguration; import com.nedap.archie.adlparser.ADLParser; -import com.nedap.archie.adlparser.modelconstraints.RMConstraintImposer; import com.nedap.archie.aom.Archetype; import com.nedap.archie.creation.RMObjectCreator; import com.nedap.archie.rm.archetyped.Locatable; -import com.nedap.archie.rm.archetyped.Pathable; import com.nedap.archie.rm.datastructures.Cluster; import com.nedap.archie.rm.datastructures.Element; import com.nedap.archie.rm.datastructures.ItemTree; @@ -14,7 +12,6 @@ import com.nedap.archie.rm.datavalues.DvText; import com.nedap.archie.rminfo.ArchieRMInfoLookup; import com.nedap.archie.testutil.TestUtil; -import com.nedap.archie.xml.JAXBUtil; import org.junit.After; import org.junit.Before; import org.junit.Test; From 8fb58de5543427fb0033030ccbd60492d7e2f659 Mon Sep 17 00:00:00 2001 From: Vera Prinsen Date: Tue, 6 Feb 2024 15:31:11 +0100 Subject: [PATCH 6/6] Fix formatting --- .../java/com/nedap/archie/rminfo/UpdatedValueHandler.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java b/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java index 25c2f4319..1242d9a94 100644 --- a/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java +++ b/openehr-rm/src/main/java/com/nedap/archie/rminfo/UpdatedValueHandler.java @@ -56,12 +56,11 @@ private static Map fixCodePhrase(Object rmObject, Archetype arch } private static Map fixDvOrdinalOrDvScale(Object rmObject, Archetype archetype, String pathOfParent) throws XPathExpressionException { + Map result = new HashMap<>(); + RMPathQuery rmPathQuery = new RMPathQuery(pathOfParent.replace("/symbol/defining_code", "")); DvOrdered ordered = rmPathQuery.find(ArchieRMInfoLookup.getInstance(), rmObject); - - Map result = new HashMap<>(); Number value; - CAttribute symbolAttribute = archetype.itemAtPath(pathOfParent.replace("/symbol/defining_code", "/symbol"));//TODO: remove all numeric indices from path! if (symbolAttribute != null) { CAttributeTuple socParent = (CAttributeTuple) symbolAttribute.getSocParent(); @@ -85,11 +84,9 @@ private static Map fixDvOrdinalOrDvScale(Object rmObject, Archet String pathToValue = pathOfParent.replace("/symbol/defining_code", "/value"); result.put(pathToValue, value); } - } } } - } } }