execute method

  1. @override
List execute(
  1. List results,
  2. Map<String, dynamic> passed
)
override

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];
  }
}