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
+
+ 10.0 'g' / 0
+
+
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'
+
+ 1'cm':2'cm' = 2'cm':4'cm'
+
+
Tuple { Id : 1, Name : 'John' } = Tuple { Id : 1, Name : 'John' }
@@ -722,6 +726,14 @@
1'cm':2'cm' ~ 1'cm':2'cm'
+
+ 1'cm':2'cm' ~ 2'cm':4'cm'
+
+
+
+ 1'cm':0'cm' ~ 2'cm':0'cm'
+
+
1'cm':2'cm' ~ 1'cm':3'cm'
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