private static DocIdSetIterator createConjunction( List<DocIdSetIterator> allIterators, List<TwoPhaseIterator> twoPhaseIterators) { long minCost = allIterators.stream().mapToLong(DocIdSetIterator::cost).min().getAsLong(); List<BitSetIterator> bitSetIterators = new ArrayList<>(); List<DocIdSetIterator> iterators = new ArrayList<>(); for (DocIdSetIterator iterator : allIterators) { if (iterator.cost() > minCost && iterator instanceof BitSetIterator) { // we put all bitset iterators into bitSetIterators // except if they have the minimum cost, since we need // them to lead the iteration in that case bitSetIterators.add((BitSetIterator) iterator); } else { iterators.add(iterator); } } DocIdSetIterator disi; if (iterators.size() == 1) { disi = iterators.get(0); } else { disi = new ConjunctionDISI(iterators); } if (bitSetIterators.size() > 0) { disi = new BitSetConjunctionDISI(disi, bitSetIterators); } if (twoPhaseIterators.isEmpty() == false) { disi = TwoPhaseIterator.asDocIdSetIterator(new ConjunctionTwoPhaseIterator(disi, twoPhaseIterators)); } return disi; }
/** Create a conjunction over the provided DocIdSetIterators. */ public static ConjunctionDISI intersectIterators(List<DocIdSetIterator> iterators) { if (iterators.size() < 2) { throw new IllegalArgumentException("Cannot make a ConjunctionDISI of less than 2 iterators"); } final List<DocIdSetIterator> allIterators = new ArrayList<>(); final List<TwoPhaseIterator> twoPhaseIterators = new ArrayList<>(); for (DocIdSetIterator iterator : iterators) { addIterator(iterator, allIterators, twoPhaseIterators); } if (twoPhaseIterators.isEmpty()) { return new ConjunctionDISI(allIterators); } else { return new TwoPhase(allIterators, twoPhaseIterators); } }
/** Create a conjunction over the provided {@link Scorer}s, taking advantage * of {@link TwoPhaseIterator}. */ public static ConjunctionDISI intersectScorers(List<Scorer> scorers) { if (scorers.size() < 2) { throw new IllegalArgumentException("Cannot make a ConjunctionDISI of less than 2 iterators"); } final List<DocIdSetIterator> allIterators = new ArrayList<>(); final List<TwoPhaseIterator> twoPhaseIterators = new ArrayList<>(); for (Scorer scorer : scorers) { addScorer(scorer, allIterators, twoPhaseIterators); } if (twoPhaseIterators.isEmpty()) { return new ConjunctionDISI(allIterators); } else { return new TwoPhase(allIterators, twoPhaseIterators); } }
/** Create a conjunction over the provided DocIdSetIterators. */ public static ConjunctionDISI intersectIterators(List<DocIdSetIterator> iterators) { if (iterators.size() < 2) { throw new IllegalArgumentException("Cannot make a ConjunctionDISI of less than 2 iterators"); } final List<DocIdSetIterator> allIterators = new ArrayList<>(); final List<TwoPhaseIterator> twoPhaseIterators = new ArrayList<>(); for (DocIdSetIterator iterator : iterators) { addIterator(iterator, allIterators, twoPhaseIterators); } if (twoPhaseIterators.isEmpty()) { return new ConjunctionDISI(allIterators); } else { return new TwoPhase(allIterators, twoPhaseIterators); } }
/** Create a conjunction over the provided {@link Scorer}s, taking advantage * of {@link TwoPhaseIterator}. */ public static ConjunctionDISI intersectScorers(List<Scorer> scorers) { if (scorers.size() < 2) { throw new IllegalArgumentException("Cannot make a ConjunctionDISI of less than 2 iterators"); } final List<DocIdSetIterator> allIterators = new ArrayList<>(); final List<TwoPhaseIterator> twoPhaseIterators = new ArrayList<>(); for (Scorer scorer : scorers) { addScorer(scorer, allIterators, twoPhaseIterators); } if (twoPhaseIterators.isEmpty()) { return new ConjunctionDISI(allIterators); } else { return new TwoPhase(allIterators, twoPhaseIterators); } }
/** Create a conjunction over the provided {@link Scorer}s, taking advantage * of {@link TwoPhaseIterator}. */ public static ConjunctionDISI intersectSpans(List<Spans> spanList) { if (spanList.size() < 2) { throw new IllegalArgumentException("Cannot make a ConjunctionDISI of less than 2 iterators"); } final List<DocIdSetIterator> allIterators = new ArrayList<>(); final List<TwoPhaseIterator> twoPhaseIterators = new ArrayList<>(); for (Spans spans : spanList) { addSpans(spans, allIterators, twoPhaseIterators); } if (twoPhaseIterators.isEmpty()) { return new ConjunctionDISI(allIterators); } else { return new TwoPhase(allIterators, twoPhaseIterators); } }
/** Create a conjunction over the provided {@link Scorer}s, taking advantage * of {@link TwoPhaseIterator}. */ public static ConjunctionDISI intersectSpans(List<Spans> spanList) { if (spanList.size() < 2) { throw new IllegalArgumentException("Cannot make a ConjunctionDISI of less than 2 iterators"); } final List<DocIdSetIterator> allIterators = new ArrayList<>(); final List<TwoPhaseIterator> twoPhaseIterators = new ArrayList<>(); for (Spans spans : spanList) { addSpans(spans, allIterators, twoPhaseIterators); } if (twoPhaseIterators.isEmpty()) { return new ConjunctionDISI(allIterators); } else { return new TwoPhase(allIterators, twoPhaseIterators); } }
private TwoPhaseConjunctionDISI(List<? extends DocIdSetIterator> iterators, List<TwoPhaseIterator> twoPhaseIterators) { super(new ConjunctionDISI(iterators)); assert twoPhaseIterators.size() > 0; CollectionUtil.timSort(twoPhaseIterators, new Comparator<TwoPhaseIterator>() { @Override public int compare(TwoPhaseIterator o1, TwoPhaseIterator o2) { return Float.compare(o1.matchCost(), o2.matchCost()); } }); this.twoPhaseIterators = twoPhaseIterators.toArray(new TwoPhaseIterator[twoPhaseIterators.size()]); // Compute the matchCost as the total matchCost of the sub iterators. // TODO: This could be too high because the matching is done cheapest first: give the lower matchCosts a higher weight. float totalMatchCost = 0; for (TwoPhaseIterator tpi : twoPhaseIterators) { totalMatchCost += tpi.matchCost(); } matchCost = totalMatchCost; }
private TwoPhaseConjunctionDISI(List<? extends DocIdSetIterator> iterators, List<TwoPhaseIterator> twoPhaseIterators) { super(new ConjunctionDISI(iterators)); assert twoPhaseIterators.size() > 0; CollectionUtil.timSort(twoPhaseIterators, new Comparator<TwoPhaseIterator>() { @Override public int compare(TwoPhaseIterator o1, TwoPhaseIterator o2) { return Float.compare(o1.matchCost(), o2.matchCost()); } }); this.twoPhaseIterators = twoPhaseIterators.toArray(new TwoPhaseIterator[twoPhaseIterators.size()]); // Compute the matchCost as the total matchCost of the sub iterators. // TODO: This could be too high because the matching is done cheapest first: give the lower matchCosts a higher weight. float totalMatchCost = 0; for (TwoPhaseIterator tpi : twoPhaseIterators) { totalMatchCost += tpi.matchCost(); } matchCost = totalMatchCost; }
private static DocIdSetIterator createConjunction( List<DocIdSetIterator> allIterators, List<TwoPhaseIterator> twoPhaseIterators) { long minCost = allIterators.stream().mapToLong(DocIdSetIterator::cost).min().getAsLong(); List<BitSetIterator> bitSetIterators = new ArrayList<>(); List<DocIdSetIterator> iterators = new ArrayList<>(); for (DocIdSetIterator iterator : allIterators) { if (iterator.cost() > minCost && iterator instanceof BitSetIterator) { // we put all bitset iterators into bitSetIterators // except if they have the minimum cost, since we need // them to lead the iteration in that case bitSetIterators.add((BitSetIterator) iterator); } else { iterators.add(iterator); } } DocIdSetIterator disi; if (iterators.size() == 1) { disi = iterators.get(0); } else { disi = new ConjunctionDISI(iterators); } if (bitSetIterators.size() > 0) { disi = new BitSetConjunctionDISI(disi, bitSetIterators); } if (twoPhaseIterators.isEmpty() == false) { disi = TwoPhaseIterator.asDocIdSetIterator(new ConjunctionTwoPhaseIterator(disi, twoPhaseIterators)); } return disi; }