execute method
The iterable, nested function that evaluates the entire FHIRPath expression one object at a time
Implementation
@override
List execute(List results, Map<String, dynamic> passed) {
final executedBefore = before.execute(results.toList(), passed);
final executedAfter = after.execute(results.toList(), passed);
if (executedBefore.isEmpty) {
if (executedAfter.isEmpty) {
return [true];
} else {
return [false];
}
} else if (executedBefore.length != executedAfter.length) {
return [false];
} else {
executedBefore.removeWhere((lhsElement) =>
executedAfter.indexWhere((rhsElement) {
if (lhsElement is FhirDateTime ||
lhsElement is FhirDate ||
rhsElement is FhirDateTime ||
rhsElement is FhirDate) {
/// As long as one is, we convert them both to strings then back
/// to DateTimes
final lhsDateTime = FhirDateTime(lhsElement.toString());
final rhsDateTime = FhirDateTime(rhsElement.toString());
/// As long as they are both valid we try and compare them
if (lhsDateTime.isValid && rhsDateTime.isValid) {
return lhsDateTime == rhsDateTime;
} else {
return false;
}
} else if (lhsElement is FhirPathQuantity ||
rhsElement is FhirPathQuantity) {
if (lhsElement is FhirPathQuantity) {
return lhsElement.equivalent(rhsElement as Object);
} else {
return (rhsElement as FhirPathQuantity)
.equivalent(lhsElement as Object);
}
} else if (lhsElement is num || rhsElement is num) {
final sigDigsLhs = num.tryParse(lhsElement.toString())
?.toStringAsExponential()
.split('e');
final sigDigsRhs = num.tryParse(rhsElement.toString())
?.toStringAsExponential()
.split('e');
if (sigDigsLhs == null || sigDigsRhs == null) {
return false;
} else {
if (sigDigsLhs.first.length < sigDigsRhs.first.length) {
return num.parse('${sigDigsLhs.first}e${sigDigsLhs.last}') ==
num.parse(
'${sigDigsRhs.first.toString().substring(0, sigDigsLhs.first.length)}'
'e${sigDigsRhs.last}');
} else {
return num.parse(
'${sigDigsLhs.first.toString().substring(0, sigDigsRhs.first.length)}'
'e${sigDigsLhs.last}') ==
num.parse('${sigDigsRhs.first}e${sigDigsRhs.last}');
}
}
} else if (lhsElement is String || rhsElement is String) {
return lhsElement.toString().toLowerCase() ==
rhsElement.toString().toLowerCase();
} else {
return lhsElement == rhsElement || rhsElement == lhsElement;
}
}) !=
-1);
return [executedBefore.isEmpty];
}
}