Stream: shorthand
Topic: HowTo: Recursive element restrictions
Jean Duteau (Apr 05 2022 at 17:55):
I'm profiling Composition.section and it contains itself in the resource. I'm trying to figure out how to apply my profile restrictions to the recursive elements without restating them. Since I will essentially support unlimited recursion like the resource itself, I can't just restate them. I can't see in the FSH specification how to support this.
David Pyke (Apr 05 2022 at 18:03):
When I gofsh'd a resource that had a recursive (Consent), it gave me:
* provision.provision ^contentReference = "#Consent.provision"
Al Pivonka (Apr 05 2022 at 18:23):
moving to logical model mapping
Notification Bot (Apr 05 2022 at 18:29):
Al Pivonka has marked this topic as resolved.
Notification Bot (Apr 05 2022 at 18:29):
Jean Duteau has marked this topic as unresolved.
Jean Duteau (Apr 05 2022 at 18:45):
David Pyke said:
When I gofsh'd a resource that had a recursive (Consent), it gave me:
* provision.provision ^contentReference = "#Consent.provision"
I've done that for logical models, but I'm not sure how to do that for profiles.
I did * section ^contentReference = "#Composition.section.section" and that "works" in that it does do the reference. But it's not a reference to my constraints. I then tried * section ^contentReference = "#ProductSubmissionDocument.section.section" and that doesn't work.
Chris Moesel (Apr 06 2022 at 12:58):
Hey @Jean Duteau. Getting constraints to apply recursively w/ contentRefs is a little tricky - and not very intuitive. There is a previous zulip conversation where Grahame suggests that the elementdefinition-profile-element extension should be used for this. Based on that conversation, we built in support to ensure that SUSHI handles this correctly. It's described in the SUSHI 2.0.0 Release Notes:
Extension for Profiling BackboneElements
The
profile-elementextension can be used to profile a BackboneElement by pointing at another BackboneElement defined elsewhere. This is typically used to indicate that constraints on the target of a contentReference should be applied to all the references as well. For example, the following snippet indicates the all recursive references toQuestionnaire.item(e.g.,Questionnaire.item.item) should conform to the same constraints as the originalQuestionnaire.itemin this profile:
Profile: MyQuestionnaire
Parent: Questionnaire
* Questionnaire.item ^type.profile = http://example.org/StructureDefinition/MyQuestionnaire
* Questionnaire.item ^type.profile.extension.url = http://hl7.org/fhir/StructureDefinition/elementdefinition-profile-element
* Questionnaire.item ^type.profile.extension.valueString = "Questionnaire.item"
// ...
Jean Duteau (Apr 06 2022 at 15:12):
I tried this yesterday because a little bird whispered in my ear about this, but I wasn't sure how to generalize what was in the Release Notes to what I wanted to do...
Profile: ProductSubmissionDocument
Parent: Composition
Description: "A profile that represents a document that is required for Product Submission to the FDA."
* extension contains VersionNumber named versionNumber 1..1 MS
* type MS
* type from SPLDocumentCodes (required)
* title MS
* identifier 1..1 MS
* author 1..1 MS
* author only Reference(IdentifiedLabeler)
* section 1..* MS
* extension contains SectionIdentifier named sectionID 0..1 MS and SectionEffectiveTime named sectionTime 0..1 MS
* code 1..1 MS
* code from SPLSectionCodes (required)
* title MS
* text MS
* entry MS
* section MS
* Composition.section ^type.profile = http://hl7.org/fhir/us/spl/StructureDefinition/ProductSubmissionDocument
* Composition.section ^type.profile.extension.url = http://hl7.org/fhir/StructureDefinition/elementdefinition-profile-element
* Composition.section ^type.profile.extension.valueString = "Composition.section"
error No element found at path Composition.section for CaretValueRule in ProductSubmissionDocument, skipping rule
File: /Users/jeanduteau/Documents/DDIWork/Samvit/SPL/fhir-spl/input/fsh/ProductSubmission.fsh
Line: 38
error No element found at path Composition.section for CaretValueRule in ProductSubmissionDocument, skipping rule
File: /Users/jeanduteau/Documents/DDIWork/Samvit/SPL/fhir-spl/input/fsh/ProductSubmission.fsh
Line: 39
error No element found at path Composition.section for CaretValueRule in ProductSubmissionDocument, skipping rule
File: /Users/jeanduteau/Documents/DDIWork/Samvit/SPL/fhir-spl/input/fsh/ProductSubmission.fsh
Line: 40
Jean Duteau (Apr 06 2022 at 15:13):
And my next question is whether I can make a different set of constraints on Composition.section.section and have those constraints apply recursively.
Chris Moesel (Apr 06 2022 at 15:34):
Well, that's embarrassing. The release notes had invalid paths. This is FSH, so you don't prefix the resource name to the path. So for those last three rules, it should be * section ... not * Composition.section .... I've updated the release notes and the comment above so no one else trips up on this.
Chris Moesel (Apr 06 2022 at 15:36):
As for your next question, I'm not 100% sure, but maybe this?
* section.section ^type.profile = http://hl7.org/fhir/us/spl/StructureDefinition/ProductSubmissionDocument
* section.section ^type.profile.extension.url = http://hl7.org/fhir/StructureDefinition/elementdefinition-profile-element
* section.section ^type.profile.extension.valueString = "Composition.section.section"
TBH, this was always a little bit of black magic to me, so I can't guarantee that this would work (for recursing constraints in section.section).
Jean Duteau (Apr 06 2022 at 15:39):
When I do that (which I did try yesterday), I get IGPublisher errors:
* section 0..* MS
* extension contains SectionIdentifier named sectionID 0..1 MS and SectionEffectiveTime named sectionTime 0..1 MS
* code 1..1 MS
* code from SPLSectionCodes (required)
* title MS
* text MS
* entry MS
* section ^type.profile = http://hl7.org/fhir/us/spl/StructureDefinition/ProductSubmissionDocument
* section ^type.profile.extension.url = http://hl7.org/fhir/StructureDefinition/elementdefinition-profile-element
* section ^type.profile.extension.valueString = "Composition.section"
java.lang.Exception: Error generating snapshot for ProductSubmissionBundle(ProductSubmissionBundle): Unable to generate snapshot for http://hl7.org/fhir/us/spl/StructureDefinition/ProductSubmissionBundle in /Users/jeanduteau/Documents/DDIWork/Samvit/SPL/fhir-spl/fsh-generated/resources/structuredefinition-ProductSubmissionBundle
at org.hl7.fhir.igtools.publisher.Publisher.generateSnapshots(Publisher.java:5411)
at org.hl7.fhir.igtools.publisher.Publisher.loadConformance(Publisher.java:4668)
at org.hl7.fhir.igtools.publisher.Publisher.createIg(Publisher.java:1006)
at org.hl7.fhir.igtools.publisher.Publisher.execute(Publisher.java:857)
at org.hl7.fhir.igtools.publisher.Publisher.main(Publisher.java:10033)
Caused by: org.hl7.fhir.exceptions.FHIRException: Unable to generate snapshot for http://hl7.org/fhir/us/spl/StructureDefinition/ProductSubmissionBundle in /Users/jeanduteau/Documents/DDIWork/Samvit/SPL/fhir-spl/fsh-generated/resources/structuredefinition-ProductSubmissionBundle
at org.hl7.fhir.igtools.publisher.Publisher.generateSnapshot(Publisher.java:5464)
at org.hl7.fhir.igtools.publisher.Publisher.generateSnapshots(Publisher.java:5409)
... 4 more
Caused by: org.hl7.fhir.exceptions.DefinitionException: Unable to find element Composition.section in http://hl7.org/fhir/us/spl/StructureDefinition/ProductSubmissionDocument
at org.hl7.fhir.r5.conformance.ProfileUtilities.processPaths(ProfileUtilities.java:1214)
at org.hl7.fhir.r5.conformance.ProfileUtilities.processPaths(ProfileUtilities.java:1485)
at org.hl7.fhir.r5.conformance.ProfileUtilities.processPaths(ProfileUtilities.java:1109)
at org.hl7.fhir.r5.conformance.ProfileUtilities.generateSnapshot(ProfileUtilities.java:669)
at org.hl7.fhir.r5.conformance.ProfileUtilities.processPaths(ProfileUtilities.java:1203)
at org.hl7.fhir.r5.conformance.ProfileUtilities.processPaths(ProfileUtilities.java:1548)
Chris Moesel (Apr 06 2022 at 17:23):
I see ProductSubmissionBundle and ProductSubmissionDocument in that stack trace. I assume that ProductSubmissionBundle is profiled to have an entry slice with a resource conforming to ProductSubmissionDocument? If you comment out that slice, does the IG Publisher choke on ProductSubmissionDocument when it processes it standalone? Or only in the context of ProductSubmissionBundle?
I actually have no idea what's going on here, but sometimes narrowing it down helps. For example, if we know the IGP generates the ProductSubmissionDocument snapshot fine (which is the profile w/ the recursive magic in it), then it would appear the issue is related to using it in another context. Either way, I think you've likely crossed the line into #IG creation or #conformance at that point, as I think you're doing things as Grahame specified in that original thread.
Jean Duteau (Apr 06 2022 at 17:26):
ah, I hadn't noticed the two profiles. let me go try that...
Jean Duteau (Apr 06 2022 at 17:28):
no beans. when I comment out the slice in the bundle, the error just shifts to the document:
java.lang.Exception: Error generating snapshot for ProductSubmissionDocument(ProductSubmissionDocument): Unable to generate snapshot for http://hl7.org/fhir/us/spl/StructureDefinition/ProductSubmissionDocument in /Users/jeanduteau/Documents/DDIWork/Samvit/SPL/fhir-spl/fsh-generated/resources/structuredefinition-ProductSubmissionDocument
at org.hl7.fhir.igtools.publisher.Publisher.generateSnapshots(Publisher.java:5411)
at org.hl7.fhir.igtools.publisher.Publisher.loadConformance(Publisher.java:4668)
at org.hl7.fhir.igtools.publisher.Publisher.createIg(Publisher.java:1006)
at org.hl7.fhir.igtools.publisher.Publisher.execute(Publisher.java:857)
at org.hl7.fhir.igtools.publisher.Publisher.main(Publisher.java:10033)
Caused by: org.hl7.fhir.exceptions.FHIRException: Unable to generate snapshot for http://hl7.org/fhir/us/spl/StructureDefinition/ProductSubmissionDocument in /Users/jeanduteau/Documents/DDIWork/Samvit/SPL/fhir-spl/fsh-generated/resources/structuredefinition-ProductSubmissionDocument
at org.hl7.fhir.igtools.publisher.Publisher.generateSnapshot(Publisher.java:5464)
at org.hl7.fhir.igtools.publisher.Publisher.generateSnapshots(Publisher.java:5409)
... 4 more
Caused by: org.hl7.fhir.exceptions.DefinitionException: Unable to find element Composition.section in http://hl7.org/fhir/us/spl/StructureDefinition/ProductSubmissionDocument
at org.hl7.fhir.r5.conformance.ProfileUtilities.processPaths(ProfileUtilities.java:1214)
at org.hl7.fhir.r5.conformance.ProfileUtilities.processPaths(ProfileUtilities.java:1485)
at org.hl7.fhir.r5.conformance.ProfileUtilities.generateSnapshot(ProfileUtilities.java:669)
at org.hl7.fhir.igtools.publisher.Publisher.generateSnapshot(Publisher.java:5459)
... 5 more
Jean Duteau (Apr 06 2022 at 17:28):
I'll raise this on #IG creation
Last updated: Apr 12 2022 at 19:14 UTC