private InternalListMultiMap<String, GreaterLessPredicate> addIntoCandidates( GreaterLessPredicate predicate, InternalListMultiMap<String, GreaterLessPredicate> currentCandidates) { if (currentCandidates == null) { currentCandidates = new InternalListMultiMap<String, GreaterLessPredicate>(); } String attributeName = predicate.attributeName; currentCandidates.put(attributeName, predicate); return currentCandidates; }
@Override public Predicate visit(OrPredicate orPredicate, Indexes indexes) { Predicate[] originalInnerPredicates = orPredicate.predicates; if (originalInnerPredicates == null || originalInnerPredicates.length < MINIMUM_NUMBER_OF_OR_TO_REPLACE) { return orPredicate; } InternalListMultiMap<String, Integer> candidates = findAndGroupCandidates(originalInnerPredicates); if (candidates == null) { return orPredicate; } int toBeRemoved = 0; boolean modified = false; Predicate[] target = originalInnerPredicates; for (Map.Entry<String, List<Integer>> candidate : candidates.entrySet()) { String attribute = candidate.getKey(); List<Integer> positions = candidate.getValue(); if (positions.size() < MINIMUM_NUMBER_OF_OR_TO_REPLACE) { continue; } if (!modified) { modified = true; target = createCopy(target); } toBeRemoved = replaceForAttribute(attribute, target, positions, toBeRemoved); } Predicate[] newInnerPredicates = replaceInnerPredicates(target, toBeRemoved); return getOrCreateFinalPredicate(orPredicate, originalInnerPredicates, newInnerPredicates); }
@Override public Predicate visit(OrPredicate orPredicate, Indexes indexes) { Predicate[] originalInnerPredicates = orPredicate.predicates; if (originalInnerPredicates == null || originalInnerPredicates.length < MINIMUM_NUMBER_OF_OR_TO_REPLACE) { return orPredicate; } InternalListMultiMap<String, Integer> candidates = findAndGroupCandidates(originalInnerPredicates); if (candidates == null) { return orPredicate; } int toBeRemoved = 0; boolean modified = false; Predicate[] target = originalInnerPredicates; for (Map.Entry<String, List<Integer>> candidate : candidates.entrySet()) { String attribute = candidate.getKey(); List<Integer> positions = candidate.getValue(); if (positions.size() < MINIMUM_NUMBER_OF_OR_TO_REPLACE) { continue; } if (!modified) { modified = true; target = createCopy(target); } toBeRemoved = replaceForAttribute(attribute, target, positions, toBeRemoved); } Predicate[] newInnerPredicates = replaceInnerPredicates(target, toBeRemoved); return getOrCreateFinalPredicate(orPredicate, originalInnerPredicates, newInnerPredicates); }
private InternalListMultiMap<String, Integer> findAndGroupCandidates(Predicate[] innerPredicates) { InternalListMultiMap<String, Integer> candidates = null; for (int i = 0; i < innerPredicates.length; i++) { Predicate p = innerPredicates[i]; if (p.getClass().equals(EqualPredicate.class)) { EqualPredicate equalPredicate = (EqualPredicate) p; String attribute = equalPredicate.attributeName; if (candidates == null) { candidates = new InternalListMultiMap<String, Integer>(); } candidates.put(attribute, i); } } return candidates; } }
boolean modified = false; Predicate[] target = originalPredicates; for (Map.Entry<String, List<GreaterLessPredicate>> entry : candidates.entrySet()) { List<GreaterLessPredicate> predicates = entry.getValue(); if (predicates.size() == 1) {
private InternalListMultiMap<String, Integer> findAndGroupCandidates(Predicate[] innerPredicates) { InternalListMultiMap<String, Integer> candidates = null; for (int i = 0; i < innerPredicates.length; i++) { Predicate p = innerPredicates[i]; if (p.getClass().equals(EqualPredicate.class)) { EqualPredicate equalPredicate = (EqualPredicate) p; String attribute = equalPredicate.attributeName; if (candidates == null) { candidates = new InternalListMultiMap<String, Integer>(); } candidates.put(attribute, i); } } return candidates; } }