Search in sources :

Example 1 with MeasureGroupComponent

use of org.hl7.fhir.r5.model.Measure.MeasureGroupComponent in project org.hl7.fhir.core by hapifhir.

the class MeasureValidator method validateMeasureReportGroups.

private void validateMeasureReportGroups(ValidatorHostContext hostContext, MeasureContext m, List<ValidationMessage> errors, Element mr, NodeStack stack, boolean inProgress) {
    if (m.groups().size() == 0) {
        // only validate the report groups if the measure has groups.
        return;
    }
    List<MeasureGroupComponent> groups = new ArrayList<MeasureGroupComponent>();
    List<Element> glist = mr.getChildrenByName("group");
    if (glist.size() == 1 && m.groups().size() == 1) {
        // if there's only one group, it can be ((and usually is) anonymous)
        // but we still check that the code, if both have one, is consistent.
        Element mrg = glist.get(0);
        NodeStack ns = stack.push(mrg, 0, mrg.getProperty().getDefinition(), mrg.getProperty().getDefinition());
        if (m.groups().get(0).hasCode() && mrg.hasChild("code")) {
            CodeableConcept cc = ObjectConverter.readAsCodeableConcept(mrg.getNamedChild("code"));
            if (rule(errors, IssueType.BUSINESSRULE, mrg.line(), mrg.col(), ns.getLiteralPath(), hasUseableCode(cc), I18nConstants.MEASURE_MR_GRP_NO_USABLE_CODE)) {
                rule(errors, IssueType.BUSINESSRULE, mrg.line(), mrg.col(), ns.getLiteralPath(), cc.matches(m.groups().get(0).getCode()), I18nConstants.MEASURE_MR_GRP_NO_WRONG_CODE, DataRenderer.display(context, cc), DataRenderer.display(context, m.groups().get(0).getCode()));
            }
        }
        validateMeasureReportGroup(hostContext, m, m.groups().get(0), errors, mrg, ns, inProgress);
    } else {
        int i = 0;
        for (Element mrg : glist) {
            NodeStack ns = stack.push(mrg, i, mrg.getProperty().getDefinition(), mrg.getProperty().getDefinition());
            CodeableConcept cc = ObjectConverter.readAsCodeableConcept(mrg.getNamedChild("code"));
            if (rule(errors, IssueType.BUSINESSRULE, mrg.line(), mrg.col(), ns.getLiteralPath(), cc != null, I18nConstants.MEASURE_MR_GRP_NO_CODE)) {
                MeasureGroupComponent mg = getGroupForCode(cc, m.measure());
                if (rule(errors, IssueType.BUSINESSRULE, mrg.line(), mrg.col(), ns.getLiteralPath(), mg != null, I18nConstants.MEASURE_MR_GRP_UNK_CODE)) {
                    if (rule(errors, IssueType.BUSINESSRULE, mrg.line(), mrg.col(), ns.getLiteralPath(), !groups.contains(mg), I18nConstants.MEASURE_MR_GRP_DUPL_CODE)) {
                        groups.add(mg);
                        validateMeasureReportGroup(hostContext, m, mg, errors, mrg, ns, inProgress);
                    }
                }
            }
            i++;
        }
        boolean dataCollection = isDataCollection(mr);
        for (MeasureGroupComponent mg : m.groups()) {
            if (!groups.contains(mg)) {
                rule(errors, IssueType.BUSINESSRULE, mr.line(), mr.col(), stack.getLiteralPath(), groups.contains(mg) || dataCollection, I18nConstants.MEASURE_MR_GRP_MISSING_BY_CODE, DataRenderer.display(context, mg.getCode()));
            }
        }
    }
}
Also used : Element(org.hl7.fhir.r5.elementmodel.Element) ArrayList(java.util.ArrayList) MeasureGroupComponent(org.hl7.fhir.r5.model.Measure.MeasureGroupComponent) NodeStack(org.hl7.fhir.validation.instance.utils.NodeStack) CodeableConcept(org.hl7.fhir.r5.model.CodeableConcept)

Example 2 with MeasureGroupComponent

use of org.hl7.fhir.r5.model.Measure.MeasureGroupComponent in project org.hl7.fhir.core by hapifhir.

the class MeasureValidator method validateMeasureReportGroupPopulations.

private void validateMeasureReportGroupPopulations(ValidatorHostContext hostContext, MeasureContext m, MeasureGroupComponent mg, List<ValidationMessage> errors, Element mrg, NodeStack stack, boolean inProgress) {
    // there must be a population for each population defined in the measure, and no 4others.
    List<MeasureGroupPopulationComponent> pops = new ArrayList<MeasureGroupPopulationComponent>();
    List<Element> plist = mrg.getChildrenByName("population");
    int i = 0;
    for (Element mrgp : plist) {
        NodeStack ns = stack.push(mrgp, i, mrgp.getProperty().getDefinition(), mrgp.getProperty().getDefinition());
        CodeableConcept cc = ObjectConverter.readAsCodeableConcept(mrgp.getNamedChild("code"));
        if (rule(errors, IssueType.BUSINESSRULE, mrgp.line(), mrgp.col(), ns.getLiteralPath(), cc != null, I18nConstants.MEASURE_MR_GRP_POP_NO_CODE)) {
            MeasureGroupPopulationComponent mgp = getGroupPopForCode(cc, mg);
            if (rule(errors, IssueType.BUSINESSRULE, mrg.line(), mrg.col(), ns.getLiteralPath(), mgp != null, I18nConstants.MEASURE_MR_GRP_POP_UNK_CODE)) {
                if (rule(errors, IssueType.BUSINESSRULE, mrg.line(), mrg.col(), ns.getLiteralPath(), !pops.contains(mgp), I18nConstants.MEASURE_MR_GRP_POP_DUPL_CODE)) {
                    pops.add(mgp);
                    validateMeasureReportGroupPopulation(hostContext, m, mgp, errors, mrgp, ns, inProgress);
                }
            }
        }
        i++;
    }
    for (MeasureGroupPopulationComponent mgp : mg.getPopulation()) {
        if (!pops.contains(mgp) && !mgp.getCode().hasCoding("http://terminology.hl7.org/CodeSystem/measure-population", "measure-observation")) {
            rule(errors, IssueType.BUSINESSRULE, mrg.line(), mrg.col(), stack.getLiteralPath(), pops.contains(mg), I18nConstants.MEASURE_MR_GRP_MISSING_BY_CODE, DataRenderer.display(context, mgp.getCode()));
        }
    }
}
Also used : Element(org.hl7.fhir.r5.elementmodel.Element) ArrayList(java.util.ArrayList) NodeStack(org.hl7.fhir.validation.instance.utils.NodeStack) MeasureGroupPopulationComponent(org.hl7.fhir.r5.model.Measure.MeasureGroupPopulationComponent) CodeableConcept(org.hl7.fhir.r5.model.CodeableConcept)

Example 3 with MeasureGroupComponent

use of org.hl7.fhir.r5.model.Measure.MeasureGroupComponent in project org.hl7.fhir.core by hapifhir.

the class MeasureValidator method validateMeasureReportGroupStratifiers.

private void validateMeasureReportGroupStratifiers(ValidatorHostContext hostContext, MeasureContext m, MeasureGroupComponent mg, List<ValidationMessage> errors, Element mrg, NodeStack stack, boolean inProgress) {
    // there must be a population for each population defined in the measure, and no 4others.
    List<MeasureGroupStratifierComponent> strats = new ArrayList<>();
    List<Element> slist = mrg.getChildrenByName("stratifier");
    int i = 0;
    for (Element mrgs : slist) {
        NodeStack ns = stack.push(mrgs, i, mrgs.getProperty().getDefinition(), mrgs.getProperty().getDefinition());
        CodeableConcept cc = ObjectConverter.readAsCodeableConcept(mrgs.getNamedChild("code"));
        if (rule(errors, IssueType.BUSINESSRULE, mrgs.line(), mrgs.col(), ns.getLiteralPath(), cc != null, I18nConstants.MEASURE_MR_GRP_POP_NO_CODE)) {
            MeasureGroupStratifierComponent mgs = getGroupStratifierForCode(cc, mg);
            if (rule(errors, IssueType.BUSINESSRULE, mrg.line(), mrg.col(), ns.getLiteralPath(), mgs != null, I18nConstants.MEASURE_MR_GRP_POP_UNK_CODE)) {
                if (rule(errors, IssueType.BUSINESSRULE, mrg.line(), mrg.col(), ns.getLiteralPath(), !strats.contains(mgs), I18nConstants.MEASURE_MR_GRP_POP_DUPL_CODE)) {
                    strats.add(mgs);
                    validateMeasureReportGroupStratifier(hostContext, m, mgs, errors, mrgs, ns, inProgress);
                }
            }
        }
        i++;
    }
    for (MeasureGroupStratifierComponent mgs : mg.getStratifier()) {
        if (!strats.contains(mgs)) {
            rule(errors, IssueType.BUSINESSRULE, mrg.line(), mrg.col(), stack.getLiteralPath(), strats.contains(mg), I18nConstants.MEASURE_MR_GRP_MISSING_BY_CODE, DataRenderer.display(context, mgs.getCode()));
        }
    }
}
Also used : MeasureGroupStratifierComponent(org.hl7.fhir.r5.model.Measure.MeasureGroupStratifierComponent) Element(org.hl7.fhir.r5.elementmodel.Element) ArrayList(java.util.ArrayList) NodeStack(org.hl7.fhir.validation.instance.utils.NodeStack) CodeableConcept(org.hl7.fhir.r5.model.CodeableConcept)

Aggregations

ArrayList (java.util.ArrayList)3 Element (org.hl7.fhir.r5.elementmodel.Element)3 CodeableConcept (org.hl7.fhir.r5.model.CodeableConcept)3 NodeStack (org.hl7.fhir.validation.instance.utils.NodeStack)3 MeasureGroupComponent (org.hl7.fhir.r5.model.Measure.MeasureGroupComponent)1 MeasureGroupPopulationComponent (org.hl7.fhir.r5.model.Measure.MeasureGroupPopulationComponent)1 MeasureGroupStratifierComponent (org.hl7.fhir.r5.model.Measure.MeasureGroupStratifierComponent)1