hapifhir / hapi-fhir

🔥 HAPI FHIR - Java API for HL7 FHIR Clients and Servers
http://hapifhir.io
Apache License 2.0
1.98k stars 1.3k forks source link

ValueSet pre-expansion invalidation when concept added to underlying CodeSystem #3364

Open tyfoni-systematic opened 2 years ago

tyfoni-systematic commented 2 years ago

Describe the issue We find that when a ValueSet pre-expansion have been persisted, then the pre-expansion is not invalidated if an underlying CodeSystem is changed by adding a concept.

If a ValueSet is composed by including a CodeSystem (complete), then we would expect that adding a concept to the CodeSystem should cause the ValueSet expansion to also contain the added concept.

If we touch the ValueSet (with a dummy update), then the pre-expansion is invalidated and the ValueSet is picked up for pre-expansion by scheduled job. This can be used as a workaround, but requires traversal of the dependency tree.

Environment :

Additional context ` { "resourceType" : "ValueSet", "id" : "ehealth-oio-bpp-roles", "url" : "http://ehealth.sundhed.dk/vs/oio-bpp-roles", "version" : "0.6.0", "name" : "OIOBPPRoles", "title" : "OIO BPP Roles", "status" : "active", "experimental" : true, "date" : "2019-12-02T00:00:00+00:00", "publisher" : "ehealth.sundhed.dk", "contact" : [ { "name" : "ehealth.sundhed.dk", "telecom" : [ { "system" : "url", "value" : "http://ehealth.sundhed.dk/terminology" } ] } ], "description" : "OIO BPP roles.", "compose" : { "include" : [ { "system" : "http://ehealth.sundhed.dk/cs/oio-bpp-roles" } ] } }

{ "resourceType": "CodeSystem", "id": "ehealth-oio-bpp-roles", "url": "http://ehealth.sundhed.dk/cs/oio-bpp-roles", "version": "0.6.0", "name": "OIOBPPRole", "title": "OIO-BPP Role", "status": "active", "experimental": false, "date": "2019-12-02T00:00:00+00:00", "publisher": "ehealth.sundhed.dk", "contact": [ { "telecom": [ { "system": "url", "value": "http://ehealth.sundhed.dk/terminology" } ] } ], "description": "OIO BPP Role", "caseSensitive": true, "content": "complete", "concept": [ { "code": "urn:dk:sundhed:ehealth:role:citizen_enroller", "display": "Borgeropretter", "definition": "Kan oprette borger i telemedicinsk forløb og tildele borger en foruddefineret plan", "designation": [ { "language": "da", "value": "Borgeropretter" } ] }, { "code": "urn:dk:sundhed:ehealth:role:clinical_viewer", "display": "Klinisk se adgang", "definition": "Kan se telemedicinske Måledata for at kunne understøtte dagligt ikke-telemedicinsk arbejde rettet på konkret borger", "designation": [ { "language": "da", "value": "Klinisk se adgang" } ] }, { "code": "urn:dk:sundhed:ehealth:role:monitoring_assistor", "display": "Monitoreringsmedhjælper", "definition": "Kan håndtere Måledata og kommunikation til/fra borger", "designation": [ { "language": "da", "value": "Monitoreringsmedhjælper" } ] }, { "code": "urn:dk:sundhed:ehealth:role:monitoring_adjuster", "display": "Monitoreringstilretter", "definition": "Kan håndtere og ændre i Måleregime, Grænseværdier og telemedicinsk forløb/pakke til borger", "designation": [ { "language": "da", "value": "Monitoreringstilretter" } ] }, { "code": "urn:dk:sundhed:ehealth:role:report_user", "display": "Nøgletalsmedarbejder", "definition": "Kan udføre datatrækning, rapporter og statistik", "designation": [ { "language": "da", "value": "Nøgletalsmedarbejder" } ] }, { "code": "urn:dk:sundhed:ehealth:role:questionnaire_editor", "display": "Sundhedsfaglig spørgeskemaeditor", "definition": "Kan udarbejde, ændre og teste Spørgeskema", "designation": [ { "language": "da", "value": "Sundhedsfaglig spørgeskemaeditor" } ] }, { "code": "urn:dk:sundhed:ehealth:role:clinical_administrator", "display": "Pakke- og forløbsbygger", "definition": "Kan udvælge Spørgeskema/Måling, sammensætte indholdet af pakker og forløb, navngive pakke/forløb og tilrette de generelle Grænseværdier", "designation": [ { "language": "da", "value": "Pakke- og forløbsbygger" } ] }, { "code": "urn:dk:sundhed:ehealth:role:clinical_supporter", "display": "Klinisk supporter", "definition": "Kan undersøge hændelser ud fra div. kriterier fx borger, bruger, dato, hændelse", "designation": [ { "language": "da", "value": "Klinisk supporter" } ] }, { "code": "urn:dk:sundhed:ehealth:role:careteam_administrator", "display": "Care Team administrator", "definition": "Kan håndtere Care Teams i den telemedicinske løsning", "designation": [ { "language": "da", "value": "Care Team administrator" } ] }, { "code": "urn:dk:sundhed:ehealth:role:order_placer", "display": "Bestiller af udstyr", "definition": "Håndterer bestilling af telemedicinsk udstyr ud fra lokale aftaler", "designation": [ { "language": "da", "value": "Bestiller af udstyr" } ] }, { "code": "urn:dk:sundhed:ehealth:role:service_and_logistics", "display": "Service og logistik samarbejdspartner", "definition": "Kan håndtere bestilling ud fra lokale aftaler", "designation": [ { "language": "da", "value": "Service og logistik samarbejdspartner" } ] }, { "code": "urn:dk:sundhed:ehealth:role:incident_reporter", "display": "Fejlmelder", "definition": "Kan indberette fejl på telemedicinske løsninger og udstyr", "designation": [ { "language": "da", "value": "Fejlmelder" } ] }, { "code": "urn:dk:sundhed:ehealth:role:incident_manager", "display": "Support samarbejdspartner", "definition": "Kan håndtere fejlmelding ud fra lokale aftaler", "designation": [ { "language": "da", "value": "Support samarbejdspartner" } ] }, { "code": "urn:dk:sundhed:ehealth:role:terminology_administrator", "display": "Terminologiadministrator", "definition": "Oprette og vedligeholde terminologi", "designation": [ { "language": "da", "value": "Terminologiadministrator" } ] }, { "code": "urn:dk:sundhed:ehealth:role:ssl_catalogue_responsible", "display": "Katalogansvarlig", "definition": "Oprette og vedligeholde SSL kataloger", "designation": [ { "language": "da", "value": "Katalogansvarlig" } ] }, { "code": "urn:dk:sundhed:ehealth:role:ssl_catalogue_annotator", "display": "Katalogopmærker", "definition": "Opmærke varer og serviceydelser i SSL kataloger", "designation": [ { "language": "da", "value": "Katalogopmærker" } ] }, { "code": "urn:dk:sundhed:ehealth:role:ssl_contract_responsible", "display": "Aftaleansvarlig", "definition": "Oprette og rette SSL samarbejdsaftaler", "designation": [ { "language": "da", "value": "Aftaleansvarlig" } ] } ] } `

tyfoni-systematic commented 2 years ago

According to the spec: https://hl7.org/fhir/R4/valueset.html#storage Whether to store expanded value sets, or simply to store their definitions and expand on the fly is a matter for system deployment. Some servers, including public value sets servers, only store expansions. However, any system that stores an expansion must be concerned with how to determine whether the expansion is still current, and this requires deep knowledge of how the expansion was created.

tyfoni-systematic commented 2 years ago

I can see that version 5.6.0 introduces $invalidate-expansion:

#2994 | When performing ValueSet expansions and ValueSet-based code validations, the HAPI FHIR terminology service will allow ValueSets to be expanded if they contain an enumeration of codes, even if the corresponding CodeSystem resource can not be found. Response messages have also been improved to give better insight into whether a precalculated expansion was used. In addition, a new operation called $invalidate-expansion has been added that allows for manual invalidation of previously calculated ValueSet expansions. -- | -- But it is still a manual process to determine which valueset might require invalidation.