diff --git a/Src/java/engine-fhir/src/test/resources/org/hl7/fhirpath/cql/CqlArithmeticFunctionsTest.xml b/Src/java/engine-fhir/src/test/resources/org/hl7/fhirpath/cql/CqlArithmeticFunctionsTest.xml index e609a4d7e..60724a865 100644 --- a/Src/java/engine-fhir/src/test/resources/org/hl7/fhirpath/cql/CqlArithmeticFunctionsTest.xml +++ b/Src/java/engine-fhir/src/test/resources/org/hl7/fhirpath/cql/CqlArithmeticFunctionsTest.xml @@ -151,6 +151,10 @@ 10.0 'g' / 5 2.0'g' + + 10.0 'g' / 0 + null + diff --git a/Src/java/engine-fhir/src/test/resources/org/hl7/fhirpath/cql/CqlComparisonOperatorsTest.xml b/Src/java/engine-fhir/src/test/resources/org/hl7/fhirpath/cql/CqlComparisonOperatorsTest.xml index ebc2cd899..7657f7107 100644 --- a/Src/java/engine-fhir/src/test/resources/org/hl7/fhirpath/cql/CqlComparisonOperatorsTest.xml +++ b/Src/java/engine-fhir/src/test/resources/org/hl7/fhirpath/cql/CqlComparisonOperatorsTest.xml @@ -100,6 +100,10 @@ 1'cm':2'cm' = 1.1'cm':2'cm' false + + 1'cm':2'cm' = 2'cm':4'cm' + false + Tuple { Id : 1, Name : 'John' } = Tuple { Id : 1, Name : 'John' } true @@ -722,6 +726,14 @@ 1'cm':2'cm' ~ 1'cm':2'cm' true + + 1'cm':2'cm' ~ 2'cm':4'cm' + true + + + 1'cm':0'cm' ~ 2'cm':0'cm' + true + 1'cm':2'cm' ~ 1'cm':3'cm' false diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/DivideEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/DivideEvaluator.java index 8e0e93eb2..dcd9d5090 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/DivideEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/DivideEvaluator.java @@ -46,10 +46,16 @@ public static Object divide(Object left, Object right, State state) { return divideHelper((BigDecimal) left, (BigDecimal) right, state); } else if (left instanceof Quantity && right instanceof Quantity) { BigDecimal value = divideHelper(((Quantity) left).getValue(), ((Quantity) right).getValue(), state); - return new Quantity().withValue(Value.verifyPrecision(value, null)).withUnit(((Quantity) left).getUnit()); + if (value == null) { + return null; + } + return new Quantity().withValue(value).withUnit(((Quantity) left).getUnit()); } else if (left instanceof Quantity && right instanceof BigDecimal) { BigDecimal value = divideHelper(((Quantity) left).getValue(), (BigDecimal) right, state); - return new Quantity().withValue(Value.verifyPrecision(value, null)).withUnit(((Quantity) left).getUnit()); + if (value == null) { + return null; + } + return new Quantity().withValue(value).withUnit(((Quantity) left).getUnit()); } else if (left instanceof Interval && right instanceof Interval) { Interval leftInterval = (Interval) left; Interval rightInterval = (Interval) right; diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/runtime/Ratio.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/runtime/Ratio.java index 82ae98602..3495dee5a 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/runtime/Ratio.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/runtime/Ratio.java @@ -2,6 +2,7 @@ import org.opencds.cqf.cql.engine.elm.executing.EqualEvaluator; import org.opencds.cqf.cql.engine.elm.executing.EquivalentEvaluator; +import org.opencds.cqf.cql.engine.elm.executing.MultiplyEvaluator; public class Ratio implements CqlType { @@ -26,10 +27,15 @@ public Ratio setDenominator(Quantity denominator) { return this; } + /** + * For ratios, equivalent means that the numerator and denominator represent the same ratio (e.g. 1:100 ~ 10:1000). + */ @Override public Boolean equivalent(Object other) { - return EquivalentEvaluator.equivalent(this.getNumerator(), ((Ratio) other).getNumerator()) - && EquivalentEvaluator.equivalent(this.getDenominator(), ((Ratio) other).getDenominator()); + var otherRatio = (Ratio) other; + return EquivalentEvaluator.equivalent( + MultiplyEvaluator.multiply(this.getNumerator(), otherRatio.getDenominator()), + MultiplyEvaluator.multiply(otherRatio.getNumerator(), this.getDenominator())); } @Override