if (newEI instanceof PredicateGeneratedElementInstance) { PredicateGeneratedElementInstance pgeiNew = (PredicateGeneratedElementInstance) newEI; ElementInstance prevEI = arPrev.getElementInstancesMap().get(pgeiNew.getId()); if (prevEI instanceof PredicateGeneratedElementInstance) { PredicateGeneratedElementInstance pgeiPrev = (PredicateGeneratedElementInstance) prevEI; if (!pgeiNew.getOperatorKind().equals(pgeiPrev.getOperatorKind()) || DVUtil.compareDVs(pgeiNew.getDataValue(), pgeiPrev.getDataValue()) != 0) { .setId(pgeiPrev.getId()) .setArchetypeReference(pgeiPrev.getArchetypeReference()) .setNullFlavour(OpenEHRConstUI.NULL_FLAVOUR_CODE_NO_INFO) .createPredicateGeneratedElementInstance();
private static DataValue getResolveDataValueIfNeeded(Map<String, Guide> guideMap, Calendar date, ElementInstance ei, Set<String> guideIds) { DataValue dv = ei.getDataValue(); if (ei instanceof PredicateGeneratedElementInstance) { Set<String> localGuideIds = new HashSet<>(); PredicateGeneratedElementInstance pgei = ((PredicateGeneratedElementInstance) ei); for (RuleReference ruleReference : pgei.getRuleReferences()) { Guide guide = guideMap.get(ruleReference.getGuideId()); if (guide == null) { LoggerFactory.getLogger(ElementInstanceCollectionManager.class).warn("Null guideline for rule reference '" + ruleReference + "'"); } else { localGuideIds.add(guide.getId()); } } Collection<Guide> localGuides = new ArrayList<>(); for (String guideId : localGuideIds) { Guide guide = guideMap.get(guideId); localGuides.add(guide); } if (pgei.getOperatorKind().equals(OperatorKind.IS_A)) { dv = ei.getDataValue(); } else { dv = resolvePredicate(ei.getDataValue(), pgei.getOperatorKind(), localGuides, date); } guideIds.addAll(localGuideIds); } return dv; }
private void filterEhrData( Collection<ArchetypeReference> ehrArchetypeReferences, Calendar date, PredicateGeneratedElementInstance predicate) { if (OperatorKind.MAX.equals(predicate.getOperatorKind())) { filterMaxMin(predicate.getId(), ehrArchetypeReferences, true); } else if (OperatorKind.MIN.equals(predicate.getOperatorKind())) { filterMaxMin(predicate.getId(), ehrArchetypeReferences, false); } else if (OperatorKind.IS_A.equals(predicate.getOperatorKind())) { filterIsA(predicate, ehrArchetypeReferences, false); } else if (OperatorKind.IS_NOT_A.equals(predicate.getOperatorKind())) { filterIsA(predicate, ehrArchetypeReferences, true); } else if (OperatorKind.EQUALITY.equals(predicate.getOperatorKind())) { filterEquals(predicate, ehrArchetypeReferences, false); } else if (OperatorKind.INEQUAL.equals(predicate.getOperatorKind())) { filterEquals(predicate, ehrArchetypeReferences, true); } else if (OperatorKind.GREATER_THAN_OR_EQUAL.equals(predicate.getOperatorKind())) { filterGreaterLessThanPredicate(predicate.getId(), predicate.getDataValue(), ehrArchetypeReferences, true, date); } else if (OperatorKind.LESS_THAN_OR_EQUAL.equals(predicate.getOperatorKind())) { filterGreaterLessThanPredicate(predicate.getId(), predicate.getDataValue(), ehrArchetypeReferences, false, date); } }
private void filterEquals( PredicateGeneratedElementInstance predicate, Collection<ArchetypeReference> ehrArchetypeReferences, boolean negation) { final Set<ArchetypeReference> archetypeReferencesToRemove = new HashSet<>(); for (ArchetypeReference archetypeReference : ehrArchetypeReferences) { ElementInstance elementInstance = archetypeReference.getElementInstancesMap().get(predicate.getId()); if (elementInstance != null) { DataValue dataValue = elementInstance.getDataValue(); if (dataValue != null) { boolean equals = dataValue.equals(predicate.getDataValue()); if ((!equals && !negation) || (equals && negation)) { archetypeReferencesToRemove.add(elementInstance.getArchetypeReference()); } } else { archetypeReferencesToRemove.add(elementInstance.getArchetypeReference()); } } } ehrArchetypeReferences.removeAll(archetypeReferencesToRemove); }
if (guideManager != null) { Collection<Guide> guides = getGuides(guideManager, predicateOriginalEI, dv); dv = ElementInstanceCollectionManager.resolvePredicate(dv, predicateOriginalEI.getOperatorKind(), guides, date); .setId(predicateOriginalEI.getId()) .setDataValue(dv) .setArchetypeReference(arAux) .setOperatorKind(predicateOriginalEI.getOperatorKind()) .createPredicateGeneratedElementInstance(); pgei.setRuleReferences(predicateOriginalEI.getRuleReferences());
private static PredicateGeneratedElementInstance generateElementInstanceForPredicate( ArchetypeReference ar, OperatorKind op, String idElement, DataValue dv, Guide guide, DateTime dateTime, boolean resolvePredicates) { Collection<RuleReference> previousRuleReferences = new ArrayList<>(); ElementInstance elementInstance = ar.getElementInstancesMap().get(idElement); if (elementInstance instanceof GeneratedElementInstance) { GeneratedElementInstance generatedElementInstance = (GeneratedElementInstance) elementInstance; previousRuleReferences.addAll(generatedElementInstance.getRuleReferences()); } if (dv != null && guide != null && dateTime != null && resolvePredicates) { dv = ElementInstanceCollectionManager.resolvePredicate(dv, op, Collections.singleton(guide), dateTime.toCalendar(Locale.getDefault())); } PredicateGeneratedElementInstance predicateGeneratedElementInstance = new PredicateGeneratedElementInstanceBuilder() .setId(idElement) .setDataValue(dv) .setArchetypeReference(ar) .setOperatorKind(op) .createPredicateGeneratedElementInstance(); predicateGeneratedElementInstance.getRuleReferences().addAll(previousRuleReferences); return predicateGeneratedElementInstance; }
private Integer getComparisonNumber(PredicateGeneratedElementInstance pred) { if (OperatorKind.IS_A.equals(pred.getOperatorKind())) { return 0; } else if (OperatorKind.IS_NOT_A.equals(pred.getOperatorKind())) { return 1; } else if (OperatorKind.EQUALITY.equals(pred.getOperatorKind())) { return 2; } else if (OperatorKind.INEQUAL.equals(pred.getOperatorKind())) { return 3; } else if (OperatorKind.GREATER_THAN_OR_EQUAL.equals(pred.getOperatorKind())) { return 4; } else if (OperatorKind.LESS_THAN_OR_EQUAL.equals(pred.getOperatorKind())) { return 5; } else if (OperatorKind.GREATER_THAN.equals(pred.getOperatorKind())) { return 6; } else if (OperatorKind.LESS_THAN.equals(pred.getOperatorKind())) { return 7; } else if (OperatorKind.MAX.equals(pred.getOperatorKind())) { return 8; } else if (OperatorKind.MIN.equals(pred.getOperatorKind())) { return 9; } return 0; }
private Set<CodePhrase> getCodePhrases(PredicateGeneratedElementInstance predicate) { DataValue dataValue = predicate.getDataValue(); Set<CodePhrase> codePhrases = new HashSet<>(); if (dataValue instanceof DvCodedText) { DvCodedText codedText = (DvCodedText) dataValue; List<TermMapping> mappings = codedText.getMappings(); if (mappings != null) { for (TermMapping termMapping : mappings) { codePhrases.add(termMapping.getTarget()); } } else { codePhrases.add(codedText.getDefiningCode()); } } return codePhrases; }
private void filterIsA( PredicateGeneratedElementInstance predicate, Collection<ArchetypeReference> ehrArchetypeReferences, boolean negation) { final Set<ArchetypeReference> archetypeReferencesToRemove = new HashSet<>(); final Set<CodePhrase> codePhrases = getCodePhrases(predicate); ElementInstance elementInstance; for (ArchetypeReference archetypeReference : ehrArchetypeReferences) { elementInstance = archetypeReference.getElementInstancesMap().get(predicate.getId()); if (elementInstance != null && codePhrases != null) { CodePhrase codePhrase = getCodePhrase(elementInstance); try { if (codePhrase != null) { if ("local".equalsIgnoreCase(codePhrase.getTerminologyId().name())) { filterIsALocalTerminology(negation, archetypeReferencesToRemove, codePhrases, elementInstance, codePhrase); } else { filterIsAExternalTerminology(negation, archetypeReferencesToRemove, codePhrases, elementInstance, codePhrase); } } else { archetypeReferencesToRemove.add(elementInstance.getArchetypeReference()); } } catch (Exception exception) { archetypeReferencesToRemove.add(elementInstance.getArchetypeReference()); logger.warn("Filter isA ", exception); } } } ehrArchetypeReferences.removeAll(archetypeReferencesToRemove); }
String gtCode = getGTCodeForPredicate(archetypeBinding, path, dv); if (gtCode != null) { ei.getRuleReferences().add(new RuleReference(guideId, gtCode));
public boolean matches(GeneratedArchetypeReference ar1, ArchetypeReference ar2, Map<String, Guide> guideMap, Calendar date) { if (!ar1.getIdArchetype().equals(ar2.getIdArchetype())) { return false; } else { for (String idElement : ar1.getElementInstancesMap().keySet()) { ElementInstance ei1 = ar1.getElementInstancesMap().get(idElement); ElementInstance ei2 = ar2.getElementInstancesMap().get(idElement); if (ei1 instanceof PredicateGeneratedElementInstance) { if (ei2 != null) { OperatorKind operatorKind = ((PredicateGeneratedElementInstance) ei1).getOperatorKind(); Set<String> guideIds = new HashSet<>(); DataValue dv = getResolveDataValueIfNeeded(guideMap, date, ei1, guideIds); DataValue dv2 = getResolveDataValueIfNeeded(guideMap, date, ei2, guideIds); Collection<Guide> guides = getGuides(guideMap, guideIds); if (!matches(dv, dv2, operatorKind, guides)) { return false; } } else { return false; } } } return true; } }