FirelyTeam / firely-net-sdk

The official Firely .NET SDK for HL7 FHIR
Other
830 stars 344 forks source link

Incorrect shall have a contained resource if a local reference is provided #2941

Open mmsmits opened 1 week ago

mmsmits commented 1 week ago

I have a situation which I don't fully understand with validation.

Example : https://simplifier.net/erezept-workflow/fsh-generated-resources-Parameters-ExampleCloseInputParametersRezeptur/~overview Base profile: https://simplifier.net/erezept-workflow/gem_erp_pr_par_closeoperation_input

The legacy validator returns this:

Invariant : Instance failed constraint ref-1 "SHALL have a contained resource if a local reference is provided"
Rule: reference.exists() implies (reference.startsWith('#').not() or (reference.substring(1).trace('url') in %rootResource.contained.id.trace('ids')) or (reference='#' and %rootResource!=%resource))
Parameters.parameter[0].part[1].resource[0].ingredient[0].item[0] 

The new validator returns this similar error, but with different explanation:

[ERROR] Instance failed constraint ref-1 "SHALL have a contained resource if a local reference is provided" (at Parameters.parameter[0].part[0].resource[0].performer[0].actor[0], element Parameters(https://gematik.de/fhir/erp/StructureDefinition/GEM_ERP_PR_PAR_CloseOperation_Input).parameter.part.resource->MedicationDispense.performer.actor) 

ref-1 (https://hl7.org/fhir/references.html#Reference) states:

reference.exists() implies (reference.startsWith('#').not() or (reference.substring(1).trace('url') in %rootResource.contained.id.trace('ids')) or (reference='#' and %rootResource!=%resource)) 

Does calling %rootResource cause our Validator to jump to the Parameters Resource, and should it not go towards the Medication Resource? Is this the part that is causing the issue?

reference.substring(1).trace('url') in %rootResource.contained.id.trace('ids')

What it does is it checks whether the ID of the referenced contained resource exists within the parent resource's contained resource IDs. The Java Validator does not throw an error here.

Ghost-writer of @MatthijsvdWielen

MatthijsvdWielen commented 1 week ago

Thank you @mmsmits for being my Ghost-writer. I was unable to verify if this was already fixed in v2.5.0 of the new validator.

mmsmits commented 1 week ago

Yes, that's ok, we'll check that. :)

mmsmits commented 1 week ago

This is a duplicate of #https://github.com/FirelyTeam/firely-validator-api/issues/384

mmsmits commented 1 week ago

@Kasdejong, this error was introduced after your work on contained resources I believe.

Short story: It occurs on reference, that only have an identifier set. The validator sees this as a local reference, and tries to find a contained resource, but the reference.reference is not set, so it returns null (I think). and throws this error. Probably easy to fix.