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; 012 013public class PropertyFilter extends ConceptFilter { 014 015 private ConceptSetFilterComponent filter; 016 private PropertyComponent property; 017 018 public PropertyFilter(List<String> allErrors, ConceptSetFilterComponent fc, PropertyComponent propertyDefinition) { 019 super (allErrors); 020 this.filter = fc; 021 this.property = propertyDefinition; 022 } 023 024 @Override 025 public boolean includeConcept(CodeSystem cs, ConceptDefinitionComponent def) { 026 ConceptPropertyComponent pc = getPropertyForConcept(def); 027 if (pc != null) { 028 String v = pc.getValue().isPrimitive() ? pc.getValue().primitiveValue() : null; 029 switch (filter.getOp()) { 030 case DESCENDENTOF: throw fail("not supported yet: "+filter.getOp().toCode()); 031 case EQUAL: return filter.getValue().equals(v); 032 case EXISTS: throw fail("not supported yet: "+filter.getOp().toCode()); 033 case GENERALIZES: throw fail("not supported yet: "+filter.getOp().toCode()); 034 case IN: throw fail("not supported yet: "+filter.getOp().toCode()); 035 case ISA: throw fail("not supported yet: "+filter.getOp().toCode()); 036 case ISNOTA: throw fail("not supported yet: "+filter.getOp().toCode()); 037 case NOTIN: throw fail("not supported yet: "+filter.getOp().toCode()); 038 case NULL: throw fail("not supported yet: "+filter.getOp().toCode()); 039 case REGEX: throw fail("not supported yet: "+filter.getOp().toCode()); 040 default: 041 throw fail("Shouldn't get here"); 042 } 043 } else if (property.getType() == PropertyType.BOOLEAN && filter.getOp() == FilterOperator.EQUAL) { 044 return "false".equals(filter.getValue()); 045 } else { 046 return false; 047 } 048 } 049 050 private ConceptPropertyComponent getPropertyForConcept(ConceptDefinitionComponent def) { 051 for (ConceptPropertyComponent pc : def.getProperty()) { 052 if (pc.getCode().equals(property.getCode())) { 053 return pc; 054 } 055 } 056 return null; 057 } 058 059}