001package org.hl7.fhir.r5.terminologies.expansion; 002 003import java.util.List; 004 005import org.hl7.fhir.r5.model.CodeSystem; 006import org.hl7.fhir.r5.model.CodeSystem.ConceptDefinitionComponent; 007import org.hl7.fhir.r5.model.CodeSystem.ConceptPropertyComponent; 008import org.hl7.fhir.r5.model.CodeSystem.PropertyComponent; 009import org.hl7.fhir.r5.model.CodeSystem.PropertyType; 010import org.hl7.fhir.r5.model.Enumerations.FilterOperator; 011import org.hl7.fhir.r5.model.ValueSet.ConceptSetFilterComponent; 012import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage; 013import org.hl7.fhir.utilities.Utilities; 014 015@MarkedToMoveToAdjunctPackage 016public class PropertyFilter extends ConceptFilter { 017 018 private ConceptSetFilterComponent filter; 019 private PropertyComponent property; 020 021 public PropertyFilter(List<String> allErrors, ConceptSetFilterComponent fc, PropertyComponent propertyDefinition) { 022 super (allErrors); 023 this.filter = fc; 024 this.property = propertyDefinition; 025 } 026 027 @Override 028 public boolean includeConcept(CodeSystem cs, ConceptDefinitionComponent def) { 029 ConceptPropertyComponent pc = getPropertyForConcept(def); 030 if (pc != null) { 031 String v = pc.getValue().isPrimitive() ? pc.getValue().primitiveValue() : null; 032 switch (filter.getOp()) { 033 case DESCENDENTOF: throw fail("not supported yet: "+filter.getOp().toCode()); 034 case EQUAL: return filter.getValue().equals(v); 035 case EXISTS: throw fail("not supported yet: "+filter.getOp().toCode()); 036 case GENERALIZES: throw fail("not supported yet: "+filter.getOp().toCode()); 037 case IN: return Utilities.existsInListTrimmed(v, filter.getValue().split("\\,")); 038 case ISA: throw fail("not supported yet: "+filter.getOp().toCode()); 039 case ISNOTA: throw fail("not supported yet: "+filter.getOp().toCode()); 040 case NOTIN: return !Utilities.existsInListTrimmed(v, filter.getValue().split("\\,")); 041 case NULL: throw fail("not supported yet: "+filter.getOp().toCode()); 042 case REGEX: 043 return v != null && v.matches(filter.getValue()); 044 default: 045 throw fail("Shouldn't get here"); 046 } 047 } else { 048 return filter.getOp() == FilterOperator.NOTIN; 049 } 050 } 051 052 private ConceptPropertyComponent getPropertyForConcept(ConceptDefinitionComponent def) { 053 for (ConceptPropertyComponent pc : def.getProperty()) { 054 if (pc.hasCode() && pc.getCode().equals(property.getCode())) { 055 return pc; 056 } 057 } 058 return null; 059 } 060 061}