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