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}