コード例 #1
0
  public static ObjectFilter simplify(ObjectFilter filter) {
    if (filter == null) {
      return null;
    }
    if (filter instanceof AndFilter) {
      List<ObjectFilter> conditions = ((AndFilter) filter).getConditions();
      AndFilter simplifiedFilter = ((AndFilter) filter).cloneEmpty();
      for (ObjectFilter subfilter : conditions) {
        if (subfilter instanceof NoneFilter) {
          // AND with "false"
          return NoneFilter.createNone();
        } else if (subfilter instanceof AllFilter) {
          // AND with "true", just skip it
        } else {
          ObjectFilter simplifiedSubfilter = simplify(subfilter);
          simplifiedFilter.addCondition(simplifiedSubfilter);
        }
      }
      if (simplifiedFilter.isEmpty()) {
        return AllFilter.createAll();
      }
      return simplifiedFilter;

    } else if (filter instanceof OrFilter) {
      List<ObjectFilter> conditions = ((OrFilter) filter).getConditions();
      OrFilter simplifiedFilter = ((OrFilter) filter).cloneEmpty();
      for (ObjectFilter subfilter : conditions) {
        if (subfilter instanceof NoneFilter) {
          // OR with "false", just skip it
        } else if (subfilter instanceof AllFilter) {
          // OR with "true"
          return AllFilter.createAll();
        } else {
          ObjectFilter simplifiedSubfilter = simplify(subfilter);
          simplifiedFilter.addCondition(simplifiedSubfilter);
        }
      }
      if (simplifiedFilter.isEmpty()) {
        return AllFilter.createAll();
      }
      return simplifiedFilter;

    } else if (filter instanceof NotFilter) {
      ObjectFilter subfilter = ((NotFilter) filter).getFilter();
      ObjectFilter simplifiedSubfilter = simplify(subfilter);
      if (subfilter instanceof NoneFilter) {
        return AllFilter.createAll();
      } else if (subfilter instanceof AllFilter) {
        return NoneFilter.createNone();
      } else {
        NotFilter simplifiedFilter = ((NotFilter) filter).cloneEmpty();
        simplifiedFilter.setFilter(simplifiedSubfilter);
        return simplifiedFilter;
      }
    } else {
      // Cannot simplify
      return filter.clone();
    }
  }