/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.lucene.search;
import java.io.IOException;
import org.apache.lucene.util.Accountable;
import org.apache.lucene.util.Bits;
A DocIdSet contains a set of doc ids. Implementing classes must only implement iterator
to provide access to the set. /**
* A DocIdSet contains a set of doc ids. Implementing classes must
* only implement {@link #iterator} to provide access to the set.
*/
public abstract class DocIdSet implements Accountable {
An empty DocIdSet
instance /** An empty {@code DocIdSet} instance */
public static final DocIdSet EMPTY = new DocIdSet() {
@Override
public DocIdSetIterator iterator() {
return DocIdSetIterator.empty();
}
// we explicitly provide no random access, as this filter is 100% sparse and iterator exits faster
@Override
public Bits bits() {
return null;
}
@Override
public long ramBytesUsed() {
return 0L;
}
};
Provides a DocIdSetIterator
to access the set. This implementation can return null
if there
are no docs that match. /** Provides a {@link DocIdSetIterator} to access the set.
* This implementation can return <code>null</code> if there
* are no docs that match. */
public abstract DocIdSetIterator iterator() throws IOException;
// TODO: somehow this class should express the cost of
// iteration vs the cost of random access Bits; for
// expensive Filters (e.g. distance < 1 km) we should use
// bits() after all other Query/Filters have matched, but
// this is the opposite of what bits() is for now
// (down-low filtering using e.g. FixedBitSet)
Optionally provides a Bits
interface for random access to matching documents. Returns: null
, if this DocIdSet
does not support random access. In contrast to iterator()
, a return value of null
does not imply that no documents match the filter! The default implementation does not provide random access, so you only need to implement this method if your DocIdSet can guarantee random access to every docid in O(1) time without external disk access (as Bits
interface cannot throw IOException
). This is generally true for bit sets like FixedBitSet
, which return itself if they are used as DocIdSet
.
/** Optionally provides a {@link Bits} interface for random access
* to matching documents.
* @return {@code null}, if this {@code DocIdSet} does not support random access.
* In contrast to {@link #iterator()}, a return value of {@code null}
* <b>does not</b> imply that no documents match the filter!
* The default implementation does not provide random access, so you
* only need to implement this method if your DocIdSet can
* guarantee random access to every docid in O(1) time without
* external disk access (as {@link Bits} interface cannot throw
* {@link IOException}). This is generally true for bit sets
* like {@link org.apache.lucene.util.FixedBitSet}, which return
* itself if they are used as {@code DocIdSet}.
*/
public Bits bits() throws IOException {
return null;
}
}