Package | hl7.fhir.uv.sdc |
Resource Type | StructureMap |
Id | QuestionnairePopulationTransform |
FHIR Version | R4 |
Source | http://hl7.org/fhir/uv/sdc/https://build.fhir.org/ig/HL7/sdc/StructureMap-QuestionnairePopulationTransform.html |
URL | http://hl7.org/fhir/uv/sdc/StructureMap/QuestionnairePopulationTransform |
Version | 4.0.0-ballot |
Status | draft |
Date | 2025-07-14T18:38:59+00:00 |
Name | QuestionnairePopulationTransform |
Realm | uv |
Authority | hl7 |
No resources found
No resources found
Note: links and images are rebased to the (stated) source
/// name = "QuestionnairePopulationTransform" /// status = "active" /// title = "Questionnaire Population Transform Example" /// description = "An example of a StructureMap used to support population of a QuestionnaireResponse from a search bundle" /// experimental = "true" map "http://hl7.org/fhir/uv/sdc/StructureMap/QuestionnairePopulationTransform" = "QuestionnairePopulationTransform" uses 'http://hl7.org/fhir/StructureDefinition/Bundle' as source uses 'http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse' as target uses 'http://hl7.org/fhir/StructureDefinition/MedicationStatement' as source // The input bundle is a search bundle that contains search bundles for patient, condition, and medication statement resources group main(source src : Bundle, target qr : QuestionnaireResponse) { src -> qr.questionnaire = 'http://hl7.org/fhir/uv/sdc/Questionnaire/questionnaire-sdc-test-fhirpath-prepop-source-query' "questionnaire"; src -> qr.status = 'in-progress' "status"; src -> qr.authored = (now()) "authored"; src.entry first as patient -> qr.subject as subject, subject.reference = (%patient.resource.entry.fullUrl.toString()) "subject"; src -> qr.item as grp, grp.linkId = 'grp' then { src -> grp.item as partDetails, partDetails.linkId = 'part-details' then { src.entry first as patient then { patient.resource : Bundle as patientRes -> partDetails then populatePatientGroup(patientRes, partDetails) "partBundleDetails"; } "patientDetails"; src.entry as conditions where (resource.link.url.contains("/Condition?")) -> partDetails.item as conditionItem, conditionItem.linkId = 'condition-count' then { conditions -> conditionItem.answer as conditionCountAnswer, conditionCountAnswer.value = (%conditions.resource.entry.count()) "conditionCountAnswer"; } "conditionCount"; } "partDetails"; // Scan the search bundle for a medication statement bunde src.entry as medications where (resource.link.url.contains("/MedicationStatement?")) -> grp then { medications.resource : Bundle as medRes then populateMedicationsGroup(medRes, grp) "medEntry"; } "meds"; } "grp"; } group populatePatientGroup(source patientRes : Bundle, target partDetails) { patientRes -> partDetails.item as participantId, participantId.linkId = 'participant-id', participantId.answer as participantIdAnswer, participantIdAnswer.value = (%patientRes.entry.resource.id.toString()) "participantIdValue"; patientRes -> partDetails.item as familyName, familyName.linkId = 'family-name', familyName.answer as familyNameAnswer, familyNameAnswer.value = (%patientRes.entry.resource.name.first().family) "familyNameValue"; patientRes -> partDetails.item as givenName, givenName.linkId = 'given-names', givenName.answer as givenNameAnswer, givenNameAnswer.value = (%patientRes.entry.resource.name.first().given.join(', ')) "givenNameValue"; patientRes -> partDetails.item as dob, dob.linkId = 'dob', dob.answer as dobAnswer, dobAnswer.value = (%patientRes.entry.resource.birthDate) "dobValue"; } group populateMedicationsGroup(source medRes : Bundle, target grp) { medRes.entry as med where (resource is MedicationStatement) -> grp.item as medsItem, medsItem.linkId = 'meds' then { med.resource : MedicationStatement as medResource -> medsItem.item as medsName, medsName.linkId = 'med-name', medsName.answer as medsNameAnswer, medsNameAnswer.value = (%medResource.medication.select(iif(text.exists(), text, coding.display.first()))) "medsNameAnswer"; /* Todo handle medicationReference once resolve is supported iif($this is Reference, iif($this.resolve().text.exists(), $this.resolve().text, $this.resolve().coding.display.first()), iif(text, text, coding.display.first())))) "medsNameAnswer"; */ med.resource : MedicationStatement as medResource -> medsItem.item as medsStatus, medsStatus.linkId = 'med-status' then { medResource.status as medsMedicationStatus -> medsStatus.answer as medsStatusAnswer, medsStatusAnswer.value = c('http://hl7.org/fhir/CodeSystem/medication-status', medsMedicationStatus) "medsStatusAnswer"; } "medsStatus"; med.resource as medResource where (category.coding.where(system='http://terminology.hl7.org/CodeSystem/medicationrequest-category').exists()) -> medsItem.item as medsCategory, medsCategory.linkId = 'meds-category' then { medResource -> medsCategory.answer as medsCategoryAnswer, medsCategoryAnswer.value = (%medResource.category.coding.where(system='http://terminology.hl7.org/CodeSystem/medicationrequest-category').code.join(' ')) "medsCategoryAnswer"; } "medsCategory"; } "medItem"; }
{ "resourceType": "StructureMap", "id": "QuestionnairePopulationTransform", "text": { "status": "additional", "div": "<!-- snip (see above) -->" }, "extension": [ { "url": "http://hl7.org/fhir/StructureDefinition/structuredefinition-wg", "valueCode": "fhir" } ], "url": "http://hl7.org/fhir/uv/sdc/StructureMap/QuestionnairePopulationTransform", "identifier": [ { "system": "urn:ietf:rfc:3986", "value": "urn:oid:2.16.840.1.113883.4.642.40.17.43.4" } ], "version": "4.0.0-ballot", "name": "QuestionnairePopulationTransform", "status": "draft", "date": "2025-07-14T18:38:59+00:00", "publisher": "HL7 International / FHIR Infrastructure", "contact": [ { "name": "HL7 International / FHIR Infrastructure", "telecom": [ { "system": "url", "value": "http://www.hl7.org/Special/committees/fiwg" } ] }, { "telecom": [ { "system": "url", "value": "http://www.hl7.org/Special/committees/fiwg" } ] } ], "jurisdiction": [ { "coding": [ { "system": "http://unstats.un.org/unsd/methods/m49/m49.htm", "code": "001", "display": "World" } ] } ], "structure": [ { "url": "http://hl7.org/fhir/StructureDefinition/Bundle", "mode": "source" }, { "url": "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse", "mode": "target" }, { "url": "http://hl7.org/fhir/StructureDefinition/MedicationStatement", "mode": "source" } ], "group": [ { "name": "main", "typeMode": "none", "input": [ { "name": "src", "type": "Bundle", "mode": "source" }, { "name": "qr", "type": "QuestionnaireResponse", "mode": "target" } ], "rule": [ { "name": "questionnaire", "source": [ { "context": "src" } ], "target": [ { "context": "qr", "contextType": "variable", "element": "questionnaire", "transform": "copy", "parameter": [ { "valueString": "http://hl7.org/fhir/uv/sdc/Questionnaire/questionnaire-sdc-test-fhirpath-prepop-source-query" } ] } ] }, { "name": "status", "source": [ { "context": "src" } ], "target": [ { "context": "qr", "contextType": "variable", "element": "status", "transform": "copy", "parameter": [ { "valueString": "in-progress" } ] } ] }, { "name": "authored", "source": [ { "context": "src" } ], "target": [ { "context": "qr", "contextType": "variable", "element": "authored", "transform": "evaluate", "parameter": [ { "valueString": "now()" } ] } ] }, { "name": "subject", "source": [ { "context": "src", "element": "entry", "listMode": "first", "variable": "patient" } ], "target": [ { "context": "qr", "contextType": "variable", "element": "subject", "variable": "subject" }, { "context": "subject", "contextType": "variable", "element": "reference", "transform": "evaluate", "parameter": [ { "valueString": "%patient.resource.entry.fullUrl.toString()" } ] } ] }, { "name": "grp", "source": [ { "context": "src" } ], "target": [ { "context": "qr", "contextType": "variable", "element": "item", "variable": "grp" }, { "context": "grp", "contextType": "variable", "element": "linkId", "transform": "copy", "parameter": [ { "valueString": "grp" } ] } ], "rule": [ { "name": "partDetails", "source": [ { "context": "src" } ], "target": [ { "context": "grp", "contextType": "variable", "element": "item", "variable": "partDetails" }, { "context": "partDetails", "contextType": "variable", "element": "linkId", "transform": "copy", "parameter": [ { "valueString": "part-details" } ] } ], "rule": [ { "name": "patientDetails", "source": [ { "context": "src", "element": "entry", "listMode": "first", "variable": "patient" } ], "rule": [ { "name": "partBundleDetails", "source": [ { "context": "patient", "type": "Bundle", "element": "resource", "variable": "patientRes" } ], "target": [ { "contextType": "variable", "transform": "copy", "parameter": [ { "valueId": "partDetails" } ] } ], "dependent": [ { "name": "populatePatientGroup", "variable": [ "patientRes", "partDetails" ] } ] } ] }, { "name": "conditionCount", "source": [ { "context": "src", "element": "entry", "variable": "conditions", "condition": "(resource.link.url.contains('/Condition?'))" } ], "target": [ { "context": "partDetails", "contextType": "variable", "element": "item", "variable": "conditionItem" }, { "context": "conditionItem", "contextType": "variable", "element": "linkId", "transform": "copy", "parameter": [ { "valueString": "condition-count" } ] } ], "rule": [ { "name": "conditionCountAnswer", "source": [ { "context": "conditions" } ], "target": [ { "context": "conditionItem", "contextType": "variable", "element": "answer", "variable": "conditionCountAnswer" }, { "context": "conditionCountAnswer", "contextType": "variable", "element": "value", "transform": "evaluate", "parameter": [ { "valueString": "%conditions.resource.entry.count()" } ] } ] } ] } ] }, { "name": "meds", "source": [ { "context": "src", "element": "entry", "variable": "medications", "condition": "(resource.link.url.contains('/MedicationStatement?'))" } ], "target": [ { "contextType": "variable", "transform": "copy", "parameter": [ { "valueId": "grp" } ] } ], "rule": [ { "name": "medEntry", "source": [ { "context": "medications", "type": "Bundle", "element": "resource", "variable": "medRes" } ], "dependent": [ { "name": "populateMedicationsGroup", "variable": [ "medRes", "grp" ] } ] } ] } ] } ] }, { "name": "populatePatientGroup", "typeMode": "none", "input": [ { "name": "patientRes", "type": "Bundle", "mode": "source" }, { "name": "partDetails", "mode": "target" } ], "rule": [ { "name": "participantIdValue", "source": [ { "context": "patientRes" } ], "target": [ { "context": "partDetails", "contextType": "variable", "element": "item", "variable": "participantId" }, { "context": "participantId", "contextType": "variable", "element": "linkId", "transform": "copy", "parameter": [ { "valueString": "participant-id" } ] }, { "context": "participantId", "contextType": "variable", "element": "answer", "variable": "participantIdAnswer" }, { "context": "participantIdAnswer", "contextType": "variable", "element": "value", "transform": "evaluate", "parameter": [ { "valueString": "%patientRes.entry.resource.id.toString()" } ] } ] }, { "name": "familyNameValue", "source": [ { "context": "patientRes" } ], "target": [ { "context": "partDetails", "contextType": "variable", "element": "item", "variable": "familyName" }, { "context": "familyName", "contextType": "variable", "element": "linkId", "transform": "copy", "parameter": [ { "valueString": "family-name" } ] }, { "context": "familyName", "contextType": "variable", "element": "answer", "variable": "familyNameAnswer" }, { "context": "familyNameAnswer", "contextType": "variable", "element": "value", "transform": "evaluate", "parameter": [ { "valueString": "%patientRes.entry.resource.name.first().family" } ] } ] }, { "name": "givenNameValue", "source": [ { "context": "patientRes" } ], "target": [ { "context": "partDetails", "contextType": "variable", "element": "item", "variable": "givenName" }, { "context": "givenName", "contextType": "variable", "element": "linkId", "transform": "copy", "parameter": [ { "valueString": "given-names" } ] }, { "context": "givenName", "contextType": "variable", "element": "answer", "variable": "givenNameAnswer" }, { "context": "givenNameAnswer", "contextType": "variable", "element": "value", "transform": "evaluate", "parameter": [ { "valueString": "%patientRes.entry.resource.name.first().given.join(', ')" } ] } ] }, { "name": "dobValue", "source": [ { "context": "patientRes" } ], "target": [ { "context": "partDetails", "contextType": "variable", "element": "item", "variable": "dob" }, { "context": "dob", "contextType": "variable", "element": "linkId", "transform": "copy", "parameter": [ { "valueString": "dob" } ] }, { "context": "dob", "contextType": "variable", "element": "answer", "variable": "dobAnswer" }, { "context": "dobAnswer", "contextType": "variable", "element": "value", "transform": "evaluate", "parameter": [ { "valueString": "%patientRes.entry.resource.birthDate" } ] } ] } ] }, { "name": "populateMedicationsGroup", "typeMode": "none", "input": [ { "name": "medRes", "type": "Bundle", "mode": "source" }, { "name": "grp", "mode": "target" } ], "rule": [ { "name": "medItem", "source": [ { "context": "medRes", "element": "entry", "variable": "med", "condition": "(resource is MedicationStatement)" } ], "target": [ { "context": "grp", "contextType": "variable", "element": "item", "variable": "medsItem" }, { "context": "medsItem", "contextType": "variable", "element": "linkId", "transform": "copy", "parameter": [ { "valueString": "meds" } ] } ], "rule": [ { "name": "medsNameAnswer", "source": [ { "context": "med", "type": "MedicationStatement", "element": "resource", "variable": "medResource" } ], "target": [ { "context": "medsItem", "contextType": "variable", "element": "item", "variable": "medsName" }, { "context": "medsName", "contextType": "variable", "element": "linkId", "transform": "copy", "parameter": [ { "valueString": "med-name" } ] }, { "context": "medsName", "contextType": "variable", "element": "answer", "variable": "medsNameAnswer" }, { "context": "medsNameAnswer", "contextType": "variable", "element": "value", "transform": "evaluate", "parameter": [ { "valueString": "%medResource.medication.select(iif(text.exists(), text, coding.display.first()))" } ] } ] }, { "name": "medsStatus", "source": [ { "context": "med", "type": "MedicationStatement", "element": "resource", "variable": "medResource" } ], "target": [ { "context": "medsItem", "contextType": "variable", "element": "item", "variable": "medsStatus" }, { "context": "medsStatus", "contextType": "variable", "element": "linkId", "transform": "copy", "parameter": [ { "valueString": "med-status" } ] } ], "rule": [ { "name": "medsStatusAnswer", "source": [ { "context": "medResource", "element": "status", "variable": "medsMedicationStatus" } ], "target": [ { "context": "medsStatus", "contextType": "variable", "element": "answer", "variable": "medsStatusAnswer" }, { "context": "medsStatusAnswer", "contextType": "variable", "element": "value", "transform": "c", "parameter": [ { "valueString": "http://hl7.org/fhir/CodeSystem/medication-status" }, { "valueId": "medsMedicationStatus" } ] } ] } ] }, { "name": "medsCategory", "source": [ { "context": "med", "element": "resource", "variable": "medResource", "condition": "(category.coding.where(system = 'http://terminology.hl7.org/CodeSystem/medicationrequest-category').exists())" } ], "target": [ { "context": "medsItem", "contextType": "variable", "element": "item", "variable": "medsCategory" }, { "context": "medsCategory", "contextType": "variable", "element": "linkId", "transform": "copy", "parameter": [ { "valueString": "meds-category" } ] } ], "rule": [ { "name": "medsCategoryAnswer", "source": [ { "context": "medResource" } ], "target": [ { "context": "medsCategory", "contextType": "variable", "element": "answer", "variable": "medsCategoryAnswer" }, { "context": "medsCategoryAnswer", "contextType": "variable", "element": "value", "transform": "evaluate", "parameter": [ { "valueString": "%medResource.category.coding.where(system = 'http://terminology.hl7.org/CodeSystem/medicationrequest-category').code.join(' ')" } ] } ] } ] } ] } ] } ] }