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 || executedAfter.isEmpty) {
return [];
} else if (executedBefore.length != 1 || executedAfter.length != 1) {
throw FhirPathEvaluationException(
'Math Operators require each operand to result in a '
'single object. The "+" operator was passed the following:\n'
'Operand 1: $executedBefore\n'
'Operand 2: $executedAfter',
operation: '+',
collection: results);
} else {
switch (executedBefore.first.runtimeType) {
case int:
{
if (executedAfter.first is num) {
return [executedBefore.first + executedAfter.first];
}
break;
}
case double:
{
if (executedAfter.first is num) {
return [executedBefore.first + executedAfter.first];
}
break;
}
case ValidatedQuantity:
{
if (executedAfter.first is ValidatedQuantity) {
return [
(executedBefore.first as ValidatedQuantity) +
(executedAfter.first as ValidatedQuantity)
];
} else if (executedAfter.first is FhirDateTimeBase) {
if ((executedBefore.first as ValidatedQuantity).isDuration) {
return [
executedAfter.first +
extendedDurationFromValidatedQuantity(
executedBefore.first)
];
}
}
break;
}
case FhirDateTime:
{
if (executedAfter.first is ValidatedQuantity &&
(executedAfter.first as ValidatedQuantity).isDuration) {
return [
(executedBefore.first +
extendedDurationFromValidatedQuantity(
executedAfter.first as ValidatedQuantity))
.toString()
];
}
break;
}
case FhirDate:
{
if (executedAfter.first is ValidatedQuantity &&
(executedAfter.first as ValidatedQuantity).isDuration) {
return [
(executedBefore.first +
extendedDurationFromValidatedQuantity(
executedAfter.first as ValidatedQuantity))
.toString()
];
}
break;
}
case FhirTime:
{
if (executedAfter.first is ValidatedQuantity &&
(executedAfter.first as ValidatedQuantity).isDuration) {
return [
(addToFhirTime(executedBefore.first,
(executedAfter.first as ValidatedQuantity)))
.toString()
];
}
break;
}
case String:
{
if (executedAfter.first is String) {
return [executedBefore.first + executedAfter.first];
} else if (executedAfter.first is ValidatedQuantity &&
(executedAfter.first as ValidatedQuantity).isDuration) {
if (FhirDateTime(executedBefore.first).isValid) {
return [
(FhirDateTime(executedBefore.first) +
extendedDurationFromValidatedQuantity(
executedAfter.first))
.toString()
];
} else if (FhirTime(executedBefore.first).isValid) {
return [
addToFhirTime(FhirTime(executedBefore.first),
executedAfter.first as ValidatedQuantity)
.toString()
];
}
}
break;
}
default:
break;
}
}
throw FhirPathEvaluationException(
'The "+" operator only accepts (FHIR) Integers, '
'Decimals, Quantities, String or (Dart) int, double, num, '
'or Strings, but was passed the following:\n'
'Operand 1: ${executedBefore.first} (${executedBefore.first.runtimeType})\n'
'Operand 2: ${executedAfter.first} (${executedAfter.first.runtimeType})',
operation: '+',
collection: results);
}