Example usage for org.apache.lucene.search DocIdSetIterator advance

List of usage examples for org.apache.lucene.search DocIdSetIterator advance

Introduction

In this page you can find the example usage for org.apache.lucene.search DocIdSetIterator advance.

Prototype

public abstract int advance(int target) throws IOException;

Source Link

Document

Advances to the first beyond the current whose document number is greater than or equal to target, and returns the document number itself.

Usage

From source file:org.elasticsearch.search.profile.ProfileScorer.java

License:Apache License

@Override
public TwoPhaseIterator twoPhaseIterator() {
    final TwoPhaseIterator in = scorer.twoPhaseIterator();
    if (in == null) {
        return null;
    }/*  ww w  . j  a  va  2s .co  m*/
    final DocIdSetIterator inApproximation = in.approximation();
    final DocIdSetIterator approximation = new DocIdSetIterator() {

        @Override
        public int advance(int target) throws IOException {
            profile.startTime(ProfileBreakdown.TimingType.ADVANCE);
            try {
                return inApproximation.advance(target);
            } finally {
                profile.stopAndRecordTime();
            }
        }

        @Override
        public int nextDoc() throws IOException {
            profile.startTime(ProfileBreakdown.TimingType.NEXT_DOC);
            try {
                return inApproximation.nextDoc();
            } finally {
                profile.stopAndRecordTime();
            }
        }

        @Override
        public int docID() {
            return inApproximation.docID();
        }

        @Override
        public long cost() {
            return inApproximation.cost();
        }
    };
    return new TwoPhaseIterator(approximation) {
        @Override
        public boolean matches() throws IOException {
            profile.startTime(ProfileBreakdown.TimingType.MATCH);
            try {
                return in.matches();
            } finally {
                profile.stopAndRecordTime();
            }
        }

        @Override
        public float matchCost() {
            return in.matchCost();
        }
    };
}

From source file:org.hibernate.search.filter.impl.AndDocIdSet.java

License:Open Source License

private DocIdSet makeDocIdSetOnAgreedBits(final DocIdSetIterator[] iterators) throws IOException {
    final OpenBitSet result = new OpenBitSet(maxDocNumber);
    final int numberOfIterators = iterators.length;

    int targetPosition = findFirstTargetPosition(iterators, result);

    if (targetPosition == DocIdSetIterator.NO_MORE_DOCS) {
        return DocIdSet.EMPTY_DOCIDSET;
    }//from  w ww .  j a v a  2  s. c om

    // Each iterator can vote "ok" for the current target to
    // be reached; when all agree the bit is set.
    // if an iterator disagrees (it jumped longer), it's current position becomes the new targetPosition
    // for the others and he is considered "first" in the voting round (every iterator votes for himself ;-)

    int i = 0;
    int votes = 0; //could be smarter but would make the code even more complex for a minor optimization out of cycle.
    // enter main loop:
    while (true) {
        final DocIdSetIterator iterator = iterators[i];
        int position = targetPosition;
        if (!iteratorAlreadyOnTargetPosition(targetPosition, iterator)) {
            position = iterator.advance(targetPosition);
        }
        if (position == DocIdSetIterator.NO_MORE_DOCS) {
            return result;
        } //exit condition
        if (position == targetPosition) {
            if (++votes == numberOfIterators) {
                result.fastSet(position);
                votes = 0;
                targetPosition++;
            }
        } else {
            votes = 1;
            targetPosition = position;
        }
        i = ++i % numberOfIterators;
    }
}

From source file:org.hibernate.search.test.filter.AndDocIdSetsTest.java

License:Open Source License

@Test
public void testIteratorMatchesTestArray() throws IOException {
    DocIdSet docIdSet0_9 = arrayToDocIdSet(testDataFrom0to9);
    DocIdSetIterator docIdSetIterator = docIdSet0_9.iterator();
    assertTrue(docIdSetIterator.nextDoc() != DocIdSetIterator.NO_MORE_DOCS);
    assertEquals(0, docIdSetIterator.docID());
    assertEquals(9, docIdSetIterator.advance(9));
    assertEquals(DocIdSetIterator.NO_MORE_DOCS, docIdSetIterator.advance(10));
}

From source file:org.hippoecm.repository.query.lucene.util.MultiDocIdSetTest.java

License:Apache License

@Test
public void testAdvance() throws IOException {
    Random rand = new Random(13);

    int[] maxDoc = new int[NUM_BITSETS];
    OpenBitSet[] bitsets = new OpenBitSet[NUM_BITSETS];
    for (int i = 0; i < NUM_BITSETS; i++) {
        OpenBitSet bitset = bitsets[i] = new OpenBitSet();
        for (int j = 0; j < NUM_DOCS_IN_BITSET; j++) {
            if (rand.nextInt(5) == 0) {
                bitset.set(j);/*from  w  w w.  j a  v  a  2 s  .c om*/
            }
        }
        maxDoc[i] = NUM_DOCS_IN_BITSET;
    }
    int totalMaxDoc = NUM_BITSETS * NUM_DOCS_IN_BITSET;

    // compare nextDoc invocations with advance
    MultiDocIdSet docIdSet = new MultiDocIdSet(bitsets, maxDoc);
    final DocIdSetIterator simpleIterator = docIdSet.iterator();
    final DocIdSetIterator advancedIterator = docIdSet.iterator();

    int docId = 0;
    while (true) {
        final int delta = rand.nextInt(CHECK_INTERVAL);
        docId = docId + delta + 1;

        if (docId > totalMaxDoc) {
            break;
        }

        while (simpleIterator.docID() < docId && simpleIterator.nextDoc() != DocIdSetIterator.NO_MORE_DOCS)
            ;

        advancedIterator.advance(docId);

        assertEquals(simpleIterator.docID(), advancedIterator.docID());
    }
}

From source file:org.tallison.lucene.search.concordance.charoffsets.SpansCrawler.java

License:Apache License

static boolean visitLeafReader(LeafReaderContext leafCtx, Spans spans, DocIdSetIterator filterItr,
        DocTokenOffsetsVisitor visitor) throws IOException, TargetTokenNotFoundException {
    int filterDoc = -1;
    int spansDoc = spans.nextDoc();
    while (true) {
        if (spansDoc == DocIdSetIterator.NO_MORE_DOCS) {
            break;
        }//from ww  w. ja va 2s .  co m
        filterDoc = filterItr.advance(spansDoc);
        if (filterDoc == DocIdSetIterator.NO_MORE_DOCS) {
            break;
        } else if (filterDoc > spansDoc) {
            while (spansDoc <= filterDoc) {
                spansDoc = spans.nextDoc();
                if (spansDoc == filterDoc) {
                    boolean cont = visit(leafCtx, spans, visitor);
                    if (!cont) {
                        return false;
                    }

                } else {
                    continue;
                }
            }
        } else if (filterDoc == spansDoc) {
            boolean cont = visit(leafCtx, spans, visitor);
            if (!cont) {
                return false;
            }
            //then iterate spans
            spansDoc = spans.nextDoc();
        } else if (filterDoc < spansDoc) {
            throw new IllegalArgumentException("FILTER doc is < spansdoc!!!");
        } else {
            throw new IllegalArgumentException("Something horrible happened");
        }
    }
    return true;
}