44import java .util .HashSet ;
55import java .util .List ;
66import java .util .Set ;
7+ import java .util .Collections ;
78
89import org .cqframework .cql .cql2elm .CqlCompilerOptions ;
910import org .cqframework .cql .cql2elm .LibraryManager ;
1718import org .hl7 .fhir .r5 .model .Reference ;
1819import org .hl7 .fhir .r5 .model .RelatedArtifact ;
1920import org .hl7 .fhir .r5 .model .Resource ;
21+ import org .hl7 .fhir .r5 .model .StringType ;
2022
2123public class MeasureRefreshProcessor {
22- public Measure refreshMeasure (Measure measureToUse , LibraryManager libraryManager , CompiledLibrary CompiledLibrary , CqlCompilerOptions options ) {
2324
24- Library moduleDefinitionLibrary = getModuleDefinitionLibrary ( measureToUse , libraryManager , CompiledLibrary , options ) ;
25+ public Boolean includePopulationDataRequirements = false ;
2526
26- measureToUse .setDate (new Date ());
27- // http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/measure-cqfm
28- setMeta (measureToUse , moduleDefinitionLibrary );
29- // Don't need to do this... it is required information to perform this processing in the first place, should just be left alone
30- //setLibrary(measureToUse, CompiledLibrary);
31- // Don't need to do this... type isn't a computable attribute, it's just metadata and will come from the source measure
32- //setType(measureToUse);
27+ public Measure refreshMeasure (Measure measureToUse , LibraryManager libraryManager , CompiledLibrary compiledLibrary , CqlCompilerOptions options ) {
3328
3429 // Computable measure http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/computable-measure-cqfm
3530 clearMeasureExtensions (measureToUse , "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-parameter" );
@@ -39,29 +34,46 @@ public Measure refreshMeasure(Measure measureToUse, LibraryManager libraryManage
3934 clearMeasureExtensions (measureToUse , "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-effectiveDataRequirements" );
4035 clearRelatedArtifacts (measureToUse );
4136
37+ Library moduleDefinitionLibrary = getModuleDefinitionLibrary (measureToUse , libraryManager , compiledLibrary , options );
38+ measureToUse .setDate (new Date ());
39+ // http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/measure-cqfm
40+ setMeta (measureToUse , moduleDefinitionLibrary );
41+ moduleDefinitionLibrary .setId ("effective-data-requirements" );
4242 setEffectiveDataRequirements (measureToUse , moduleDefinitionLibrary );
43+ setEffectiveDataRequirementsReference (measureToUse );
44+ if (Boolean .TRUE .equals (includePopulationDataRequirements )) {
45+ setPopulationDataRequirements (measureToUse , libraryManager , compiledLibrary , options );
46+ }
4347
4448 return measureToUse ;
4549 }
4650
47- private Library getModuleDefinitionLibrary (Measure measureToUse , LibraryManager libraryManager , CompiledLibrary CompiledLibrary , CqlCompilerOptions options ){
51+ private Library getModuleDefinitionLibrary (Measure measureToUse , LibraryManager libraryManager , CompiledLibrary compiledLibrary , CqlCompilerOptions options ){
4852 Set <String > expressionList = getExpressions (measureToUse );
4953 DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor ();
50- return dqReqTrans .gatherDataRequirements (libraryManager , CompiledLibrary , options , expressionList , true );
54+ return dqReqTrans .gatherDataRequirements (libraryManager , compiledLibrary , options , expressionList , true );
55+ }
56+
57+ private void setPopulationDataRequirements (Measure measureToUse , LibraryManager libraryManager , CompiledLibrary compiledLibrary , CqlCompilerOptions options ) {
58+ DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor ();
59+ measureToUse .getGroup ().forEach (groupMember -> groupMember .getPopulation ().forEach (population -> {
60+ if (population .hasId ()) { // Requirement for computable measures
61+ var popMDL = dqReqTrans .gatherDataRequirements (libraryManager , compiledLibrary , options , Collections .singleton (population .getCriteria ().getExpression ()), false );
62+ var mdlID = population .getId () + "-effectiveDataRequirements" ;
63+ popMDL .setId (mdlID );
64+ setEffectiveDataRequirements (measureToUse , popMDL );
65+ population .getExtension ().removeAll (population .getExtensionsByUrl ("http://hl7.org/fhir/StructureDefinition/artifact-reference" ));
66+ population .addExtension ("http://hl7.org/fhir/StructureDefinition/artifact-reference" , new StringType ("#" + mdlID ));
67+ }
68+ }));
5169 }
5270
5371 private Set <String > getExpressions (Measure measureToUse ) {
5472 Set <String > expressionSet = new HashSet <>();
55- measureToUse .getSupplementalData ().forEach (supData ->{
56- expressionSet .add (supData .getCriteria ().getExpression ());
57- });
73+ measureToUse .getSupplementalData ().forEach (supData -> expressionSet .add (supData .getCriteria ().getExpression ()));
5874 measureToUse .getGroup ().forEach (groupMember ->{
59- groupMember .getPopulation ().forEach (population ->{
60- expressionSet .add (population .getCriteria ().getExpression ());
61- });
62- groupMember .getStratifier ().forEach (stratifier ->{
63- expressionSet .add (stratifier .getCriteria ().getExpression ());
64- });
75+ groupMember .getPopulation ().forEach (population -> expressionSet .add (population .getCriteria ().getExpression ()));
76+ groupMember .getStratifier ().forEach (stratifier -> expressionSet .add (stratifier .getCriteria ().getExpression ()));
6577 });
6678 return expressionSet ;
6779 }
@@ -76,12 +88,9 @@ private void clearRelatedArtifacts(Measure measure) {
7688 }
7789
7890 private void setEffectiveDataRequirements (Measure measureToUse , Library moduleDefinitionLibrary ) {
79-
80- moduleDefinitionLibrary .setId ("effective-data-requirements" );
81-
8291 int delIndex = -1 ;
8392 for (Resource res : measureToUse .getContained ()) {
84- if (res instanceof Library && (( Library ) res ) .getId ().equalsIgnoreCase ("effective-data-requirements" )) {
93+ if (res instanceof Library && res .getId ().equalsIgnoreCase (moduleDefinitionLibrary . getId () )) {
8594 delIndex = measureToUse .getContained ().indexOf (res );
8695 break ;
8796 }
@@ -92,9 +101,11 @@ private void setEffectiveDataRequirements(Measure measureToUse, Library moduleDe
92101 }
93102
94103 measureToUse .getContained ().add (moduleDefinitionLibrary );
104+ }
95105
96- Extension effDataReqExtension = new Extension ();
97- effDataReqExtension .setUrl ("http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-effectiveDataRequirements" );
106+ private void setEffectiveDataRequirementsReference (Measure measureToUse ) {
107+ Extension effDataReqExtension = new Extension ();
108+ effDataReqExtension .setUrl ("http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-effectiveDataRequirements" );
98109 effDataReqExtension .setId ("effective-data-requirements" );
99110 effDataReqExtension .setValue (new Reference ().setReference ("#effective-data-requirements" ));
100111 measureToUse .addExtension (effDataReqExtension );
0 commit comments