use of au.csiro.pathling.fhirpath.ResourcePath in project pathling by aehrc.
the class IifFunctionTest method throwsErrorWithResourceAndLiteralResults.
@Test
void throwsErrorWithResourceAndLiteralResults() {
final NonLiteralPath condition = new ElementPathBuilder(spark).fhirType(FHIRDefinedType.BOOLEAN).expression("valueBoolean").singular(true).build().toThisPath();
final ResourcePath ifTrue = new ResourcePathBuilder(spark).expression("someResource").resourceType(ResourceType.PATIENT).build();
final StringLiteralPath otherwise = StringLiteralPath.fromString("foo", condition);
final NamedFunctionInput iifInput = new NamedFunctionInput(parserContext, condition, Arrays.asList(condition, ifTrue, otherwise));
final NamedFunction notFunction = NamedFunction.getInstance("iif");
final InvalidUserInputError error = assertThrows(InvalidUserInputError.class, () -> notFunction.invoke(iifInput));
assertEquals("Paths cannot be merged into a collection together: someResource, 'foo'", error.getMessage());
}
use of au.csiro.pathling.fhirpath.ResourcePath in project pathling by aehrc.
the class OfTypeFunctionTest method resolvesPolymorphicReference.
@Test
void resolvesPolymorphicReference() {
final Dataset<Row> inputDataset = new DatasetBuilder(spark).withIdColumn().withEidColumn().withTypeColumn().withStructTypeColumns(referenceStructType()).withRow("encounter-1", makeEid(1), "Patient", RowFactory.create(null, "Patient/patient-1", null)).withRow("encounter-1", makeEid(0), "Patient", RowFactory.create(null, "Patient/patient-2", null)).withRow("encounter-2", makeEid(0), "Patient", RowFactory.create(null, "Patient/patient-3", null)).withRow("encounter-2", makeEid(1), "Group", RowFactory.create(null, "Group/group-1", null)).withRow("encounter-3", makeEid(0), "Patient", RowFactory.create(null, "Patient/patient-2", null)).withRow("encounter-4", makeEid(0), "Patient", RowFactory.create(null, "Patient/patient-2", null)).withRow("encounter-5", makeEid(0), "Group", RowFactory.create(null, "Group/group-1", null)).withRow("encounter-6", null, null, null).buildWithStructValue();
final UntypedResourcePath inputPath = new UntypedResourcePathBuilder(spark).expression("subject.resolve()").dataset(inputDataset).idEidTypeAndValueColumns().singular(false).build();
final Dataset<Row> argumentDataset = new ResourceDatasetBuilder(spark).withIdColumn().withColumn(DataTypes.StringType).withColumn(DataTypes.BooleanType).withRow("patient-1", "female", true).withRow("patient-2", "female", false).withRow("patient-3", "male", true).build();
when(database.read(ResourceType.PATIENT)).thenReturn(argumentDataset);
final ResourcePath argumentPath = new ResourcePathBuilder(spark).database(database).resourceType(ResourceType.PATIENT).expression("Patient").build();
final ParserContext parserContext = new ParserContextBuilder(spark, fhirContext).idColumn(inputPath.getIdColumn()).build();
final NamedFunctionInput ofTypeInput = new NamedFunctionInput(parserContext, inputPath, Collections.singletonList(argumentPath));
final NamedFunction ofType = NamedFunction.getInstance("ofType");
final FhirPath result = ofType.invoke(ofTypeInput);
assertTrue(result instanceof ResourcePath);
assertThat((ResourcePath) result).hasExpression("subject.resolve().ofType(Patient)").isNotSingular().hasResourceType(ResourceType.PATIENT);
final Dataset<Row> expectedDataset = new DatasetBuilder(spark).withIdColumn().withEidColumn().withIdColumn().withRow("encounter-1", makeEid(0), "patient-2").withRow("encounter-1", makeEid(1), "patient-1").withRow("encounter-2", makeEid(0), "patient-3").withRow("encounter-2", makeEid(1), null).withRow("encounter-3", makeEid(0), "patient-2").withRow("encounter-4", makeEid(0), "patient-2").withRow("encounter-5", makeEid(0), null).withRow("encounter-6", null, null).build();
assertThat(result).selectOrderedResultWithEid().hasRows(expectedDataset);
}
use of au.csiro.pathling.fhirpath.ResourcePath in project pathling by aehrc.
the class OfTypeFunctionTest method throwsErrorIfInputNotPolymorphic.
@Test
void throwsErrorIfInputNotPolymorphic() {
final ResourcePath input = new ResourcePathBuilder(spark).expression("Patient").build();
final ResourcePath argument = new ResourcePathBuilder(spark).build();
final ParserContext parserContext = new ParserContextBuilder(spark, fhirContext).build();
final NamedFunctionInput ofTypeInput = new NamedFunctionInput(parserContext, input, Collections.singletonList(argument));
final NamedFunction ofTypeFunction = NamedFunction.getInstance("ofType");
final InvalidUserInputError error = assertThrows(InvalidUserInputError.class, () -> ofTypeFunction.invoke(ofTypeInput));
assertEquals("Input to ofType function must be a polymorphic resource type: Patient", error.getMessage());
}
use of au.csiro.pathling.fhirpath.ResourcePath in project pathling by aehrc.
the class OfTypeFunctionTest method throwsErrorIfMoreThanOneArgument.
@Test
void throwsErrorIfMoreThanOneArgument() {
final UntypedResourcePath input = new UntypedResourcePathBuilder(spark).expression("subject").build();
final ResourcePath argument1 = new ResourcePathBuilder(spark).expression("Patient").build();
final ResourcePath argument2 = new ResourcePathBuilder(spark).expression("Condition").build();
final ParserContext parserContext = new ParserContextBuilder(spark, fhirContext).build();
final NamedFunctionInput ofTypeInput = new NamedFunctionInput(parserContext, input, Arrays.asList(argument1, argument2));
final NamedFunction ofTypeFunction = NamedFunction.getInstance("ofType");
final InvalidUserInputError error = assertThrows(InvalidUserInputError.class, () -> ofTypeFunction.invoke(ofTypeInput));
assertEquals("ofType function must have one argument: subject.ofType(Patient, Condition)", error.getMessage());
}
use of au.csiro.pathling.fhirpath.ResourcePath in project pathling by aehrc.
the class ReverseResolveFunctionTest method throwsErrorIfArgumentTypeDoesNotMatchInput.
@Test
void throwsErrorIfArgumentTypeDoesNotMatchInput() {
final ResourcePath input = new ResourcePathBuilder(spark).resourceType(ResourceType.PATIENT).expression("Patient").build();
final BaseRuntimeChildDefinition childDefinition = fhirContext.getResourceDefinition("Encounter").getChildByName("episodeOfCare");
final ElementDefinition definition = ElementDefinition.build(childDefinition, "episodeOfCare");
final ElementPath argument = new ElementPathBuilder(spark).expression("Encounter.episodeOfCare").fhirType(FHIRDefinedType.REFERENCE).definition(definition).buildDefined();
final ParserContext parserContext = new ParserContextBuilder(spark, fhirContext).inputExpression("Patient").build();
final NamedFunctionInput reverseResolveInput = new NamedFunctionInput(parserContext, input, Collections.singletonList(argument));
final NamedFunction reverseResolveFunction = NamedFunction.getInstance("reverseResolve");
final InvalidUserInputError error = assertThrows(InvalidUserInputError.class, () -> reverseResolveFunction.invoke(reverseResolveInput));
assertEquals("Reference in argument to reverseResolve does not support input resource type: reverseResolve(Encounter.episodeOfCare)", error.getMessage());
}
Aggregations