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}