Slicing an element using its type as discriminator

367 views
Skip to first unread message

tom.toutene...@gmail.com

unread,
Apr 3, 2019, 4:19:58 AM4/3/19
to HAPI FHIR
Hi,

We're developing a FHIR-based solution for a Belgian governmental institution.

We're trying to slice an element using its type as discriminator (we need a different mapping depending on the type), but we're not sure if we're doing it correctly. 

Here's the relevant part of the structure definition:

    <element id="Patient.deceased[x]">
        <path value="Patient.deceased[x]" />
        <slicing>
        <discriminator>
            <type value="type" />
            <path value="$this" />
        </discriminator>
        <rules value="open" />
        </slicing>
    </element>
    <element id="Patient.deceased[x]:deceasedBoolean">
        <path value="Patient.deceased[x]" />
        <sliceName value="deceasedBoolean" />
        <type>
            <code value="boolean" />
        </type>
        <mapping>
            <identity value="ctm" />
            <language value="Patient.deceasedBoolean" />
            <map value="DEC" />
        </mapping>
    </element>
    <element id="Patient.deceased[x]:deceasedDateTime">
        <path value="Patient.deceased[x]" />
        <sliceName value="deceasedDateTime" />
        <type>
            <code value="dateTime" />
        </type>
        <mapping>
            <identity value="ctm" />
            <language value="Patient.deceasedDateTime" />
            <map value="DOD" />
        </mapping>
    </element>

and here's an example resource:

    {
        "resourceType": "Patient",
        "meta": {
            ...
        },
        "id": "...",
        "identifier": [
            ...
        ],
        "gender": "male",
        "birthDate": "2000-01-01",
        "deceasedDateTime": "2000-01-02",
        "address": [
            ...
        ]
    }

Hapi 3.6.0 throws a NullPointerException:

java.lang.NullPointerException: null
at org.hl7.fhir.r4.utils.FHIRPathEngine.tailMatches(FHIRPathEngine.java:3755) ~[hapi-fhir-structures-r4-3.6.0.jar:na]
at org.hl7.fhir.r4.utils.FHIRPathEngine.evaluateDefinition(FHIRPathEngine.java:3683) ~[hapi-fhir-structures-r4-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.getCriteriaForDiscriminator(InstanceValidator.java:1935) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.sliceMatches(InstanceValidator.java:2411) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validateElement(InstanceValidator.java:3374) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.start(InstanceValidator.java:2580) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validateResource(InstanceValidator.java:3840) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validateContains(InstanceValidator.java:3277) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validateElement(InstanceValidator.java:3591) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.start(InstanceValidator.java:2580) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validateResource(InstanceValidator.java:3840) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validate(InstanceValidator.java:653) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validate(InstanceValidator.java:606) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.r4.validation.InstanceValidator.validate(InstanceValidator.java:590) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.dstu3.hapi.validation.FhirInstanceValidator.validate(FhirInstanceValidator.java:309) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.dstu3.hapi.validation.FhirInstanceValidator.validate(FhirInstanceValidator.java:335) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.dstu3.hapi.validation.BaseValidatorBridge.doValidate(BaseValidatorBridge.java:20) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.dstu3.hapi.validation.BaseValidatorBridge.validateResource(BaseValidatorBridge.java:43) ~[hapi-fhir-validation-3.6.0.jar:na]
at org.hl7.fhir.dstu3.hapi.validation.FhirInstanceValidator.validateResource(FhirInstanceValidator.java:51) ~[hapi-fhir-validation-3.6.0.jar:na]
at ca.uhn.fhir.validation.FhirValidator.validateWithResult(FhirValidator.java:235) ~[hapi-fhir-base-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor.doValidate(RequestValidatingInterceptor.java:67) ~[hapi-fhir-server-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor.doValidate(RequestValidatingInterceptor.java:48) ~[hapi-fhir-server-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.interceptor.BaseValidatingInterceptor.validate(BaseValidatingInterceptor.java:292) ~[hapi-fhir-server-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor.incomingRequestPostProcessed(RequestValidatingInterceptor.java:86) ~[hapi-fhir-server-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.RestfulServer.handleRequest(RestfulServer.java:955) ~[hapi-fhir-server-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.RestfulServer.doPost(RestfulServer.java:341) ~[hapi-fhir-server-3.6.0.jar:na]
at ca.uhn.fhir.rest.server.RestfulServer.service(RestfulServer.java:1548) ~[hapi-fhir-server-3.6.0.jar:na]

and HAPI 3.7.0 throws a DefinitionException "Unable to resolve discriminator".

In both cases FHIRPathEngine.evaluateDefinition() seems to fetch "http://hl7.org/fhir/StructureDefinition/boolean" as the structure definition for element "Patient.deceased[x]:deceasedBoolean" and then tries and fails to find a child definition which ends with "$this".

Any help or pointers would be greatly appreciated.
Reply all
Reply to author
Forward
0 new messages