diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/ReleaseVisitor.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/ReleaseVisitor.java index 4ad4173914..30bbbc4085 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/ReleaseVisitor.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/ReleaseVisitor.java @@ -391,7 +391,7 @@ private void gatherDependencies( } } - extractMeasureDirectReferenceCodes(rootAdapter, artifactAdapter); + extractMeasureDirectReferenceCodes(rootAdapter, artifactAdapter, endpoint); } } @@ -410,13 +410,15 @@ private void ensureResourceTypeExtension(String resourceType, ICompositeType new } private void extractMeasureDirectReferenceCodes( - IKnowledgeArtifactAdapter rootAdapter, IKnowledgeArtifactAdapter artifactAdapter) { + IKnowledgeArtifactAdapter rootAdapter, + IKnowledgeArtifactAdapter artifactAdapter, + IEndpointAdapter endpoint) { if (artifactAdapter instanceof org.opencds.cqf.fhir.utility.adapter.r4.MeasureAdapter measureAdapter) { org.opencds.cqf.fhir.cr.visitor.r4.ReleaseVisitor.extractDirectReferenceCodes( - rootAdapter, measureAdapter.get()); + rootAdapter, measureAdapter.get(), endpoint); } else if (artifactAdapter instanceof org.opencds.cqf.fhir.utility.adapter.r5.MeasureAdapter measureAdapter) { org.opencds.cqf.fhir.cr.visitor.r5.ReleaseVisitor.extractDirectReferenceCodes( - rootAdapter, measureAdapter.get()); + rootAdapter, measureAdapter.get(), endpoint); } } diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/r4/ReleaseVisitor.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/r4/ReleaseVisitor.java index 31004a400d..cf08b9ff5a 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/r4/ReleaseVisitor.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/r4/ReleaseVisitor.java @@ -22,16 +22,19 @@ import org.hl7.fhir.r4.model.Library; import org.hl7.fhir.r4.model.Measure; import org.hl7.fhir.r4.model.MetadataResource; +import org.hl7.fhir.r4.model.Parameters; import org.hl7.fhir.r4.model.Period; import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.ResourceType; import org.hl7.fhir.r4.model.StringType; +import org.hl7.fhir.r4.model.UriType; import org.hl7.fhir.r4.model.ValueSet; import org.opencds.cqf.fhir.cr.visitor.r4.CRMIReleaseExperimentalBehavior.CRMIReleaseExperimentalBehaviorCodes; import org.opencds.cqf.fhir.cr.visitor.r4.CRMIReleaseVersionBehavior.CRMIReleaseVersionBehaviorCodes; import org.opencds.cqf.fhir.utility.Constants; import org.opencds.cqf.fhir.utility.PackageHelper; import org.opencds.cqf.fhir.utility.SearchHelper; +import org.opencds.cqf.fhir.utility.adapter.IEndpointAdapter; import org.opencds.cqf.fhir.utility.adapter.IKnowledgeArtifactAdapter; import org.opencds.cqf.fhir.utility.r4.ArtifactAssessment; import org.slf4j.Logger; @@ -163,7 +166,8 @@ public static List findArtifactCommentsToUpdate( return returnEntries; } - public static void extractDirectReferenceCodes(IKnowledgeArtifactAdapter rootAdapter, Measure measure) { + public static void extractDirectReferenceCodes( + IKnowledgeArtifactAdapter rootAdapter, Measure measure, IEndpointAdapter endpointAdapter) { Optional effectiveDataRequirementsExt = measure.getExtension().stream() .filter(ext -> ext.getUrl().equals(Constants.CQFM_EFFECTIVE_DATA_REQUIREMENTS) || ext.getUrl().equals(Constants.CRMI_EFFECTIVE_DATA_REQUIREMENTS)) @@ -187,9 +191,21 @@ public static void extractDirectReferenceCodes(IKnowledgeArtifactAdapter rootAda || ext.getUrl().equals(Constants.CQF_DIRECT_REFERENCE_EXTENSION)) .toList(); + var expansionParams = rootAdapter.getExpansionParameters().map(p -> ((Parameters) p)); + List systemVersions = new ArrayList<>(); + if (expansionParams.isPresent()) { + systemVersions = expansionParams.get().getParameter().stream() + .filter(param -> param.getName().equals(Constants.SYSTEM_VERSION)) + .map(sysVerParam -> (UriType) sysVerParam.getValue()) + .toList(); + } + for (var proposedExt : proposedExtensions) { boolean shouldAddExtension = true; Coding proposedCoding = (Coding) proposedExt.getValue(); + + setCodeSystemVersion(endpointAdapter, proposedCoding, systemVersions); + for (var existingExt : existingRootAdapterExtensions) { Coding existingCoding = (Coding) existingExt.getValue(); boolean systemMatches = proposedCoding.getSystem().equals(existingCoding.getSystem()); @@ -210,4 +226,22 @@ public static void extractDirectReferenceCodes(IKnowledgeArtifactAdapter rootAda } } } + + private static void setCodeSystemVersion( + IEndpointAdapter endpointAdapter, Coding proposedCoding, List systemVersions) { + if (proposedCoding.getVersion() == null && !systemVersions.isEmpty()) { + for (var sysVer : systemVersions) { + var idParts = sysVer.getValue().split("\\|"); + if (idParts[0].equals(proposedCoding.getSystem())) { + proposedCoding.setVersion(idParts[1]); + break; + } + } + } + + // version can still be null after trying to set via expansionParams + if (proposedCoding.getVersion() == null && endpointAdapter != null) { + // use TxServer to set version + } + } } diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/r5/ReleaseVisitor.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/r5/ReleaseVisitor.java index 1459a3d48e..cb885d717d 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/r5/ReleaseVisitor.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/r5/ReleaseVisitor.java @@ -22,17 +22,20 @@ import org.hl7.fhir.r5.model.Library; import org.hl7.fhir.r5.model.Measure; import org.hl7.fhir.r5.model.MetadataResource; +import org.hl7.fhir.r5.model.Parameters; import org.hl7.fhir.r5.model.Period; import org.hl7.fhir.r5.model.Reference; import org.hl7.fhir.r5.model.RelatedArtifact.RelatedArtifactType; import org.hl7.fhir.r5.model.ResourceType; import org.hl7.fhir.r5.model.StringType; +import org.hl7.fhir.r5.model.UriType; import org.hl7.fhir.r5.model.ValueSet; import org.opencds.cqf.fhir.cr.visitor.r5.CRMIReleaseExperimentalBehavior.CRMIReleaseExperimentalBehaviorCodes; import org.opencds.cqf.fhir.cr.visitor.r5.CRMIReleaseVersionBehavior.CRMIReleaseVersionBehaviorCodes; import org.opencds.cqf.fhir.utility.Constants; import org.opencds.cqf.fhir.utility.PackageHelper; import org.opencds.cqf.fhir.utility.SearchHelper; +import org.opencds.cqf.fhir.utility.adapter.IEndpointAdapter; import org.opencds.cqf.fhir.utility.adapter.IKnowledgeArtifactAdapter; import org.slf4j.Logger; @@ -150,7 +153,8 @@ public static List findArtifactCommentsToUpdate( return returnEntries; } - public static void extractDirectReferenceCodes(IKnowledgeArtifactAdapter rootAdapter, Measure measure) { + public static void extractDirectReferenceCodes( + IKnowledgeArtifactAdapter rootAdapter, Measure measure, IEndpointAdapter endpointAdapter) { Optional effectiveDataRequirementsExt = measure.getExtension().stream() .filter(ext -> ext.getUrl().equals(Constants.CQFM_EFFECTIVE_DATA_REQUIREMENTS) || ext.getUrl().equals(Constants.CRMI_EFFECTIVE_DATA_REQUIREMENTS)) @@ -173,9 +177,21 @@ public static void extractDirectReferenceCodes(IKnowledgeArtifactAdapter rootAda || ext.getUrl().equals(Constants.CQF_DIRECT_REFERENCE_EXTENSION)) .toList(); + var expansionParams = rootAdapter.getExpansionParameters().map(p -> ((Parameters) p)); + List systemVersions = new ArrayList<>(); + if (expansionParams.isPresent()) { + systemVersions = expansionParams.get().getParameter().stream() + .filter(param -> param.getName().equals(Constants.SYSTEM_VERSION)) + .map(sysVerParam -> (UriType) sysVerParam.getValue()) + .toList(); + } + for (var proposedExt : proposedExtensions) { boolean shouldAddExtension = true; Coding proposedCoding = (Coding) proposedExt.getValue(); + + setCodeSystemVersion(endpointAdapter, proposedCoding, systemVersions); + for (var existingExt : existingRootAdapterExtensions) { Coding existingCoding = (Coding) existingExt.getValue(); boolean systemMatches = proposedCoding.getSystem().equals(existingCoding.getSystem()); @@ -196,4 +212,22 @@ public static void extractDirectReferenceCodes(IKnowledgeArtifactAdapter rootAda } } } + + private static void setCodeSystemVersion( + IEndpointAdapter endpointAdapter, Coding proposedCoding, List systemVersions) { + if (proposedCoding.getVersion() == null && !systemVersions.isEmpty()) { + for (var sysVer : systemVersions) { + var idParts = sysVer.getValue().split("\\|"); + if (idParts[0].equals(proposedCoding.getSystem())) { + proposedCoding.setVersion(idParts[1]); + break; + } + } + } + + // version can still be null after trying to set via expansionParams + if (proposedCoding.getVersion() == null && endpointAdapter != null) { + // use TxServer to set version + } + } }