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 KnownPropertyFilter extends ConceptFilter {
017
018  private ConceptSetFilterComponent filter;
019  private String code;
020
021  public KnownPropertyFilter(List<String> allErrors, ConceptSetFilterComponent fc, String code) {
022    super (allErrors);
023    this.filter = fc;
024    this.code = code;
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: throw fail("not supported yet: "+filter.getOp().toCode());
043      default:
044        throw fail("Shouldn't get here");        
045      }            
046    } else {
047      return false;
048    }
049  }
050
051  private ConceptPropertyComponent getPropertyForConcept(ConceptDefinitionComponent def) {
052    for (ConceptPropertyComponent pc : def.getProperty()) {
053      if (pc.hasCode() && pc.getCode().equals(code)) {
054        return pc;
055      }
056    }
057    return null;
058  }
059
060}