static String reason(FixedBitSet actual, FixedBitSet expected, IndexSearcher indexSearcher) throws IOException { StringBuilder builder = new StringBuilder(); builder.append("expected cardinality:").append(expected.cardinality()).append('\n'); DocIdSetIterator iterator = expected.iterator(); for (int doc = iterator.nextDoc(); doc != DocIdSetIterator.NO_MORE_DOCS; doc = iterator.nextDoc()) { builder .append("Expected doc[") .append(doc) .append("] with id value ") .append(indexSearcher.doc(doc).get(UidFieldMapper.NAME)) .append('\n'); } builder.append("actual cardinality: ").append(actual.cardinality()).append('\n'); iterator = actual.iterator(); for (int doc = iterator.nextDoc(); doc != DocIdSetIterator.NO_MORE_DOCS; doc = iterator.nextDoc()) { builder .append("Actual doc[") .append(doc) .append("] with id value ") .append(indexSearcher.doc(doc).get(UidFieldMapper.NAME)) .append('\n'); } return builder.toString(); }
@Override public int advance(int target) throws IOException { doc = _innerIter.advance(target); if (doc != NO_MORE_DOCS) { if (!reader.isDeleted(doc)) { return doc; } else { while ((doc = _innerIter.nextDoc()) != NO_MORE_DOCS) { if (!reader.isDeleted(doc)) { return doc; } } return doc; } } return doc; }
@Override public int nextDoc() throws IOException { while ((doc = _innerIter.nextDoc()) != NO_MORE_DOCS) { if (!reader.isDeleted(doc)) { return doc; } } return doc; }
// inherit javadoc public void search(Weight weight, Filter filter, final HitCollector results) throws IOException { Scorer scorer = weight.scorer(reader); if (scorer == null) return; if (filter == null) { scorer.score(results); return; } DocIdSetIterator filterDocIdIterator = filter.getDocIdSet(reader).iterator(); // CHECKME: use ConjunctionScorer here? boolean more = filterDocIdIterator.next() && scorer.skipTo(filterDocIdIterator.doc()); while (more) { int filterDocId = filterDocIdIterator.doc(); if (filterDocId > scorer.doc() && !scorer.skipTo(filterDocId)) { more = false; } else { int scorerDocId = scorer.doc(); if (scorerDocId == filterDocId) { // permitted by filter results.collect(scorerDocId, scorer.score()); more = filterDocIdIterator.next(); } else { more = filterDocIdIterator.skipTo(scorerDocId); } } } }
@Override public int advance(int target) throws IOException { currentChildDoc = childrenIterator.advance(target); if (currentChildDoc == DocIdSetIterator.NO_MORE_DOCS) { return currentChildDoc; } BytesReference uid = typeCache.idByDoc(currentChildDoc); if (uid == null) { return nextDoc(); } currentScore = uidToScore.get(uid); if (currentScore == 0) { return nextDoc(); } return currentChildDoc; }
@Override public int nextDoc() throws IOException { while (true) { currentChildDoc = childrenIterator.nextDoc(); if (currentChildDoc == DocIdSetIterator.NO_MORE_DOCS) { return currentChildDoc; } BytesReference uid = typeCache.parentIdByDoc(currentChildDoc); if (uid == null) { continue; } currentScore = uidToScore.get(uid); if (currentScore != 0) { return currentChildDoc; } } }
@Override public int advance(int target) throws IOException { if (remaining == 0) { return currentDocId = NO_MORE_DOCS; } currentDocId = parentsIterator.advance(target); if (currentDocId == DocIdSetIterator.NO_MORE_DOCS) { return currentDocId; } HashedBytesArray uid = idTypeCache.idByDoc(currentDocId); if (uidToScore.containsKey(uid)) { // Can use lget b/c uidToScore is only used by one thread at the time (via CacheRecycler) currentScore = uidToScore.lget(); remaining--; return currentDocId; } else { return nextDoc(); } }
@Override public int advance(int target) throws IOException { if (remaining == 0) { return currentDocId = NO_MORE_DOCS; } currentDocId = parentsIterator.advance(target); if (currentDocId == DocIdSetIterator.NO_MORE_DOCS) { return currentDocId; } bytesValues.setDocument(currentDocId); long index = parentIds.find(bytesValues.nextValue(), bytesValues.currentValueHash()); if (index != -1) { currentScore = scores.get(index); remaining--; return currentDocId; } else { return nextDoc(); } }
@Override public long cost() { return docIdSetIterator.cost(); }
@Override public int advance(int target) throws IOException { return docIdSetIterator.advance(target); }
@Override public float score() throws IOException { assert docIdSetIterator.docID() != NO_MORE_DOCS; return theScore; }
@Override public int docID() { return docIdSetIterator.docID(); }
@Override public int nextDoc() throws IOException { return docIdSetIterator.nextDoc(); }
@Override public long cost() { return parentsIterator.cost(); }
@Override public DocIdSetIterator iterator() { return DocIdSetIterator.empty(); }
@Override public long cost() { return childrenIterator.cost(); }
public boolean next() throws IOException { return docIdSetIterator.next(); }
public void testFilteredDocIdSet() throws Exception { final int maxdoc = 10; final DocIdSet innerSet = new DocIdSet() { @Override public long ramBytesUsed() { return 0L; } @Override public DocIdSetIterator iterator() { return new DocIdSetIterator() { int docid = -1; @Override public int docID() { return docid; } @Override public int nextDoc() { docid++; return docid < maxdoc ? docid : (docid = NO_MORE_DOCS); } @Override public int advance(int target) throws IOException { return slowAdvance(target); } @Override public long cost() { return 1; } }; } }; DocIdSet filteredSet = new FilteredDocIdSet(innerSet) { @Override protected boolean match(int docid) { return docid % 2 == 0; // validate only even docids } }; DocIdSetIterator iter = filteredSet.iterator(); ArrayList<Integer> list = new ArrayList<>(); int doc = iter.advance(3); if (doc != DocIdSetIterator.NO_MORE_DOCS) { list.add(Integer.valueOf(doc)); while ((doc = iter.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) { list.add(Integer.valueOf(doc)); } } int[] docs = new int[list.size()]; int c = 0; Iterator<Integer> intIter = list.iterator(); while (intIter.hasNext()) { docs[c++] = intIter.next().intValue(); } int[] answer = new int[] {4, 6, 8}; boolean same = Arrays.equals(answer, docs); if (!same) { System.out.println("answer: " + Arrays.toString(answer)); System.out.println("gotten: " + Arrays.toString(docs)); fail(); } }
public boolean skipTo(int target) throws IOException { return docIdSetIterator.skipTo(target); }
public int doc() { return docIdSetIterator.doc(); }