private boolean isCovered(OIndexSearchResult indexMatch, OQueryOperator operator, Object fieldCandidate, Object valueCandidate) { if (fieldCandidate instanceof OSQLFilterItemField) { final OSQLFilterItemField field = (OSQLFilterItemField) fieldCandidate; if (operator instanceof OQueryOperatorEquals) for (Map.Entry<String, Object> e : indexMatch.fieldValuePairs.entrySet()) { if (isSameField(field, e.getKey()) && isSameValue(valueCandidate, e.getValue())) return true; } return operator.equals(indexMatch.lastOperator) && isSameField(field, indexMatch.lastField) && isSameValue(valueCandidate, indexMatch.lastValue); } return false; }
switch (reuseType) { case INDEX_METHOD: if (isCovered(indexMatch, operator, condition.getLeft(), condition.getRight()) || isCovered(indexMatch, operator, condition.getRight(), condition.getLeft())) { return null; condition.setLeft(optimize((OSQLFilterCondition) condition.getLeft(), indexMatch)); condition.setRight(optimize((OSQLFilterCondition) condition.getRight(), indexMatch)); if (isCovered(indexMatch, operator, condition.getLeft(), condition.getRight()) || isCovered(indexMatch, operator, condition.getRight(), condition.getLeft())) { return null;
public void optimize(OSQLFilter filter, OIndexSearchResult indexMatch) { filter.setRootCondition(optimize(filter.getRootCondition(), indexMatch)); }
filterOptimizer.optimize(compiledFilter, lastSearchResult);