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

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

Introduction

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

Prototype

DocIdSetIterator

Source Link

Usage

From source file:cn.hbu.cs.esearch.document.UIDDocIdSet.java

License:Apache License

@Override
public DocIdSetIterator iterator() {
    return new DocIdSetIterator() {
        int doc = -1;
        int current = -1;

        @Override// w w  w  .  java 2s  .c  o m
        public int docID() {
            return doc;
        }

        @Override
        public int nextDoc() throws IOException {
            if (current < sorted.length - 1) {
                current++;
                doc = sorted[current];
                return doc;
            }
            return DocIdSetIterator.NO_MORE_DOCS;
        }

        @Override
        public int advance(int target) throws IOException {
            int idx = Arrays.binarySearch(sorted, target);
            if (idx < 0) {
                idx = -(idx + 1);
                if (idx >= sorted.length) {
                    return DocIdSetIterator.NO_MORE_DOCS;
                }
            }
            current = idx;
            doc = sorted[current];
            return doc;
        }

        // No use, just implement abstract function
        @Override
        public long cost() {
            return 0;
        }
    };
}

From source file:cn.hbu.cs.esearch.store.LuceneStore.java

License:Apache License

@Override
protected void persistDelete(long uid) throws IOException {
    final int docid = mapDocId(uid);
    if (docid < 0) {
        return;/* ww  w  .  j  a v a  2  s .  co m*/
    }

    Query deleteQ = new ConstantScoreQuery(new Filter() {

        @Override
        public DocIdSet getDocIdSet(AtomicReaderContext readerCtx, Bits acceptedDocs) throws IOException {
            return new DocIdSet() {

                @Override
                public DocIdSetIterator iterator() throws IOException {
                    return new DocIdSetIterator() {
                        int currId = -1;

                        @Override
                        public int nextDoc() throws IOException {
                            if (currId == -1) {
                                currId = docid;
                            } else {
                                currId = DocIdSetIterator.NO_MORE_DOCS;
                            }
                            return currId;
                        }

                        @Override
                        public int docID() {
                            return currId;
                        }

                        @Override
                        public int advance(int target) throws IOException {
                            if (currId != DocIdSetIterator.NO_MORE_DOCS) {
                                if (target < docid) {
                                    currId = docid;
                                } else {
                                    currId = DocIdSetIterator.NO_MORE_DOCS;
                                }
                            }
                            return currId;
                        }

                        @Override
                        public long cost() {
                            // TODO Auto-generated method stub
                            return 0;
                        }
                    };
                }

            };
        }

    });
    indexWriter.deleteDocuments(deleteQ);
    if (currentReaderData != null) {
        currentReaderData.uidMap.remove(uid);
    }

}

From source file:cn.hbu.cs.esearch.util.ArrayDocIdSet.java

License:Apache License

@Override
public DocIdSetIterator iterator() {
    return new DocIdSetIterator() {
        int doc = -1;
        int current = -1;
        int largest = lengthMinusone;

        @Override//  w  w w  .java 2 s  . c om
        public int docID() {
            return doc;
        }

        @Override
        public int nextDoc() throws IOException {
            if (current < lengthMinusone) {
                current++;
                doc = docIds[current];
                return doc;
            }
            return DocIdSetIterator.NO_MORE_DOCS;
        }

        @Override
        public int advance(int target) throws IOException {
            int idx = current < 0 ? binarySearch(docIds, target)
                    : binarySearch(docIds, target, current, largest);
            if (idx < 0) {
                idx = -(idx + 1);
                if (idx >= docIds.length) {
                    return DocIdSetIterator.NO_MORE_DOCS;
                }
            }
            current = idx;
            doc = docIds[current];
            return doc;
        }

        @Override
        public long cost() {
            // TODO Auto-generated method stub
            return 0;
        }
    };
}

From source file:javaewah.EWAHCompressedBitmap.java

License:Open Source License

@Override
public DocIdSetIterator iterator() {
    return new DocIdSetIterator() {

        final private IntIterator under = intIterator();
        int docID;

        @Override/*from  ww  w. j  a v a 2s  .c  om*/
        public int docID() {
            return docID;
        }

        @Override
        public int nextDoc() throws IOException {
            if (under.hasNext())
                return docID = under.next();
            else
                return docID = DocIdSetIterator.NO_MORE_DOCS;
        }

        @Override
        public int advance(int target) throws IOException {
            // we can do faster! -> wordinbits
            while ((docID = nextDoc()) < target) {
            }
            return docID;
        }
    };
}

From source file:lucene.security.search.DocumentVisibilityFilter.java

License:Apache License

public static DocIdSet getLogicalOr(final List<DocIdSet> list) throws IOException {
    if (list.size() == 0) {
        return DocIdSet.EMPTY_DOCIDSET;
    }//from w  ww  .  j av a 2s .  com
    if (list.size() == 1) {
        DocIdSet docIdSet = list.get(0);
        Bits bits = docIdSet.bits();
        if (bits == null) {
            throw new IOException("Bits are not allowed to be null for DocIdSet [" + docIdSet + "].");
        }
        return docIdSet;
    }
    int index = 0;
    final Bits[] bitsArray = new Bits[list.size()];
    int length = -1;
    for (DocIdSet docIdSet : list) {
        Bits bits = docIdSet.bits();
        if (bits == null) {
            throw new IOException("Bits are not allowed to be null for DocIdSet [" + docIdSet + "].");
        }
        bitsArray[index] = bits;
        index++;
        if (length < 0) {
            length = bits.length();
        } else if (length != bits.length()) {
            throw new IOException(
                    "Bits length need to be the same [" + length + "] and [" + bits.length() + "]");
        }
    }
    final int len = length;
    return new DocIdSet() {

        @Override
        public Bits bits() throws IOException {
            return new Bits() {

                @Override
                public boolean get(int index) {
                    for (int i = 0; i < bitsArray.length; i++) {
                        if (bitsArray[i].get(index)) {
                            return true;
                        }
                    }
                    return false;
                }

                @Override
                public int length() {
                    return len;
                }

            };
        }

        @Override
        public boolean isCacheable() {
            return true;
        }

        @Override
        public DocIdSetIterator iterator() throws IOException {
            final DocIdSetIterator[] docIdSetIteratorArray = new DocIdSetIterator[list.size()];
            long c = 0;
            int index = 0;
            for (DocIdSet docIdSet : list) {
                DocIdSetIterator iterator = docIdSet.iterator();
                iterator.nextDoc();
                docIdSetIteratorArray[index] = iterator;
                c += iterator.cost();
                index++;
            }
            final long cost = c;
            return new DocIdSetIterator() {

                private int _docId = -1;

                @Override
                public int advance(int target) throws IOException {
                    callAdvanceOnAllThatAreBehind(target);
                    Arrays.sort(docIdSetIteratorArray, COMPARATOR);
                    DocIdSetIterator iterator = docIdSetIteratorArray[0];
                    return _docId = iterator.docID();
                }

                private void callAdvanceOnAllThatAreBehind(int target) throws IOException {
                    for (int i = 0; i < docIdSetIteratorArray.length; i++) {
                        DocIdSetIterator iterator = docIdSetIteratorArray[i];
                        if (iterator.docID() < target) {
                            iterator.advance(target);
                        }
                    }
                }

                @Override
                public int nextDoc() throws IOException {
                    return advance(_docId + 1);
                }

                @Override
                public int docID() {
                    return _docId;
                }

                @Override
                public long cost() {
                    return cost;
                }

            };
        }
    };
}

From source file:nl.inl.blacklab.search.SingleDocIdSet.java

License:Apache License

@Override
public DocIdSetIterator iterator() {
    return new DocIdSetIterator() {
        private boolean nexted = false;

        private boolean done = false;

        @Override//ww w  . jav  a2  s .  c o m
        public int nextDoc() {
            if (done)
                return NO_MORE_DOCS;
            nexted = true;
            return id;
        }

        @Override
        public int docID() {
            if (!nexted || done)
                return NO_MORE_DOCS;
            return id;
        }

        @Override
        public int advance(int target) {
            if (done || target > id)
                return NO_MORE_DOCS;
            return id;
        }
    };
}

From source file:org.apache.solr.search.BitDocSet.java

License:Apache License

@Override
public Filter getTopFilter() {
    final OpenBitSet bs = bits;
    // TODO: if cardinality isn't cached, do a quick measure of sparseness
    // and return null from bits() if too sparse.

    return new Filter() {
        @Override/*  w  ww. j ava2  s. c  o m*/
        public DocIdSet getDocIdSet(final AtomicReaderContext context, final Bits acceptDocs) {
            AtomicReader reader = context.reader();
            // all Solr DocSets that are used as filters only include live docs
            final Bits acceptDocs2 = acceptDocs == null ? null
                    : (reader.getLiveDocs() == acceptDocs ? null : acceptDocs);

            if (context.isTopLevel) {
                return BitsFilteredDocIdSet.wrap(bs, acceptDocs);
            }

            final int base = context.docBase;
            final int maxDoc = reader.maxDoc();
            final int max = base + maxDoc; // one past the max doc in this segment.

            return BitsFilteredDocIdSet.wrap(new DocIdSet() {
                @Override
                public DocIdSetIterator iterator() {
                    return new DocIdSetIterator() {
                        int pos = base - 1;
                        int adjustedDoc = -1;

                        @Override
                        public int docID() {
                            return adjustedDoc;
                        }

                        @Override
                        public int nextDoc() {
                            pos = bs.nextSetBit(pos + 1);
                            return adjustedDoc = (pos >= 0 && pos < max) ? pos - base : NO_MORE_DOCS;
                        }

                        @Override
                        public int advance(int target) {
                            if (target == NO_MORE_DOCS)
                                return adjustedDoc = NO_MORE_DOCS;
                            pos = bs.nextSetBit(target + base);
                            return adjustedDoc = (pos >= 0 && pos < max) ? pos - base : NO_MORE_DOCS;
                        }

                        @Override
                        public long cost() {
                            // we don't want to actually compute cardinality, but
                            // if its already been computed, we use it
                            if (size != -1) {
                                return size;
                            } else {
                                return bs.capacity();
                            }
                        }
                    };
                }

                @Override
                public boolean isCacheable() {
                    return true;
                }

                @Override
                public Bits bits() {
                    return new Bits() {
                        @Override
                        public boolean get(int index) {
                            return bs.fastGet(index + base);
                        }

                        @Override
                        public int length() {
                            return maxDoc;
                        }
                    };
                }

            }, acceptDocs2);
        }
    };
}

From source file:org.apache.solr.search.DocSetBase.java

License:Apache License

@Override
public Filter getTopFilter() {
    final OpenBitSet bs = getBits();

    return new Filter() {
        @Override//from  w ww  .  j  av  a 2 s .c  o m
        public DocIdSet getDocIdSet(final AtomicReaderContext context, Bits acceptDocs) {
            AtomicReader reader = context.reader();
            // all Solr DocSets that are used as filters only include live docs
            final Bits acceptDocs2 = acceptDocs == null ? null
                    : (reader.getLiveDocs() == acceptDocs ? null : acceptDocs);

            if (context.isTopLevel) {
                return BitsFilteredDocIdSet.wrap(bs, acceptDocs);
            }

            final int base = context.docBase;
            final int maxDoc = reader.maxDoc();
            final int max = base + maxDoc; // one past the max doc in this segment.

            return BitsFilteredDocIdSet.wrap(new DocIdSet() {
                @Override
                public DocIdSetIterator iterator() {
                    return new DocIdSetIterator() {
                        int pos = base - 1;
                        int adjustedDoc = -1;

                        @Override
                        public int docID() {
                            return adjustedDoc;
                        }

                        @Override
                        public int nextDoc() {
                            pos = bs.nextSetBit(pos + 1);
                            return adjustedDoc = (pos >= 0 && pos < max) ? pos - base : NO_MORE_DOCS;
                        }

                        @Override
                        public int advance(int target) {
                            if (target == NO_MORE_DOCS)
                                return adjustedDoc = NO_MORE_DOCS;
                            pos = bs.nextSetBit(target + base);
                            return adjustedDoc = (pos >= 0 && pos < max) ? pos - base : NO_MORE_DOCS;
                        }

                        @Override
                        public long cost() {
                            return bs.capacity();
                        }
                    };
                }

                @Override
                public boolean isCacheable() {
                    return true;
                }

                @Override
                public Bits bits() {
                    // sparse filters should not use random access
                    return null;
                }

            }, acceptDocs2);
        }
    };
}

From source file:org.apache.solr.search.SortedIntDocSet.java

License:Apache License

@Override
public Filter getTopFilter() {
    return new Filter() {
        int lastEndIdx = 0;

        @Override//  w  w  w.ja va2s . co  m
        public DocIdSet getDocIdSet(final AtomicReaderContext context, final Bits acceptDocs) {
            AtomicReader reader = context.reader();
            // all Solr DocSets that are used as filters only include live docs
            final Bits acceptDocs2 = acceptDocs == null ? null
                    : (reader.getLiveDocs() == acceptDocs ? null : acceptDocs);

            final int base = context.docBase;
            final int maxDoc = reader.maxDoc();
            final int max = base + maxDoc; // one past the max doc in this segment.
            int sidx = Math.max(0, lastEndIdx);

            if (sidx > 0 && docs[sidx - 1] >= base) {
                // oops, the lastEndIdx isn't correct... we must have been used
                // in a multi-threaded context, or the indexreaders are being
                // used out-of-order.  start at 0.
                sidx = 0;
            }
            if (sidx < docs.length && docs[sidx] < base) {
                // if docs[sidx] is < base, we need to seek to find the real start.
                sidx = findIndex(docs, base, sidx, docs.length - 1);
            }

            final int startIdx = sidx;

            // Largest possible end index is limited to the start index
            // plus the number of docs contained in the segment.  Subtract 1 since
            // the end index is inclusive.
            int eidx = Math.min(docs.length, startIdx + maxDoc) - 1;

            // find the real end
            eidx = findIndex(docs, max, startIdx, eidx) - 1;

            final int endIdx = eidx;
            lastEndIdx = endIdx;

            return BitsFilteredDocIdSet.wrap(new DocIdSet() {
                @Override
                public DocIdSetIterator iterator() {
                    return new DocIdSetIterator() {
                        int idx = startIdx;
                        int adjustedDoc = -1;

                        @Override
                        public int docID() {
                            return adjustedDoc;
                        }

                        @Override
                        public int nextDoc() {
                            return adjustedDoc = (idx > endIdx) ? NO_MORE_DOCS : (docs[idx++] - base);
                        }

                        @Override
                        public int advance(int target) {
                            if (idx > endIdx || target == NO_MORE_DOCS)
                                return adjustedDoc = NO_MORE_DOCS;
                            target += base;

                            // probe next
                            int rawDoc = docs[idx++];
                            if (rawDoc >= target)
                                return adjustedDoc = rawDoc - base;

                            int high = endIdx;

                            // TODO: probe more before resorting to binary search?

                            // binary search
                            while (idx <= high) {
                                int mid = (idx + high) >>> 1;
                                rawDoc = docs[mid];

                                if (rawDoc < target) {
                                    idx = mid + 1;
                                } else if (rawDoc > target) {
                                    high = mid - 1;
                                } else {
                                    idx = mid + 1;
                                    return adjustedDoc = rawDoc - base;
                                }
                            }

                            // low is on the insertion point...
                            if (idx <= endIdx) {
                                return adjustedDoc = docs[idx++] - base;
                            } else {
                                return adjustedDoc = NO_MORE_DOCS;
                            }
                        }

                        @Override
                        public long cost() {
                            return docs.length;
                        }
                    };
                }

                @Override
                public boolean isCacheable() {
                    return true;
                }

                @Override
                public Bits bits() {
                    // random access is expensive for this set
                    return null;
                }

            }, acceptDocs2);
        }
    };
}

From source file:org.apache.solr.search.TestFilteredDocIdSet.java

License:Apache License

public void testFilteredDocIdSet() throws Exception {
    final int maxdoc = 10;
    final DocIdSet innerSet = new DocIdSet() {

        @Override/*from   www  .j  ava2s .  co  m*/
        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();
    }
}