From ad9f9685180c95977bfa9b91d8fcc01576651a99 Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Fri, 6 May 2022 09:41:28 +0100 Subject: [PATCH] LUCENE-10436: Reinstate public getdocValuesdocIdSetIterator method on DocValues (#869) The method moved from DocValuesFieldExistsQuery to DocValuesIterator, but the latter is a package-private utility class, making it invisible to client code. This commit moves it back onto FieldExistsQuery, meaning that the upgrade path will be the same as for all other uses of DocValuesFieldExistsQuery. --- .../org/apache/lucene/index/CheckIndex.java | 3 +- .../lucene/index/DocValuesIterator.java | 36 ------------------- .../org/apache/lucene/index/IndexWriter.java | 6 ++-- .../lucene/index/PendingSoftDeletes.java | 3 +- .../SoftDeletesDirectoryReaderWrapper.java | 3 +- .../lucene/search/FieldExistsQuery.java | 36 +++++++++++++++++++ 6 files changed, 45 insertions(+), 42 deletions(-) diff --git a/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java b/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java index 07506eb260f1..e6bb64131127 100644 --- a/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java +++ b/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java @@ -56,6 +56,7 @@ import org.apache.lucene.index.PointValues.IntersectVisitor; import org.apache.lucene.index.PointValues.Relation; import org.apache.lucene.search.DocIdSetIterator; +import org.apache.lucene.search.FieldExistsQuery; import org.apache.lucene.search.LeafFieldComparator; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; @@ -4145,7 +4146,7 @@ private static Status.SoftDeletsStatus checkSoftDeletes( try { int softDeletes = PendingSoftDeletes.countSoftDeletes( - DocValuesIterator.getDocValuesDocIdSetIterator(softDeletesField, reader), + FieldExistsQuery.getDocValuesDocIdSetIterator(softDeletesField, reader), reader.getLiveDocs()); if (softDeletes != info.getSoftDelCount()) { throw new CheckIndexException( diff --git a/lucene/core/src/java/org/apache/lucene/index/DocValuesIterator.java b/lucene/core/src/java/org/apache/lucene/index/DocValuesIterator.java index d60537a33f05..f08268e5841b 100644 --- a/lucene/core/src/java/org/apache/lucene/index/DocValuesIterator.java +++ b/lucene/core/src/java/org/apache/lucene/index/DocValuesIterator.java @@ -28,40 +28,4 @@ abstract class DocValuesIterator extends DocIdSetIterator { * returns {@code target}. */ public abstract boolean advanceExact(int target) throws IOException; - - /** - * Returns a {@link DocIdSetIterator} from the given field or null if the field doesn't exist in - * the reader or if the reader has no doc values for the field. - */ - public static DocIdSetIterator getDocValuesDocIdSetIterator(String field, LeafReader reader) - throws IOException { - FieldInfo fieldInfo = reader.getFieldInfos().fieldInfo(field); - final DocIdSetIterator iterator; - if (fieldInfo != null) { - switch (fieldInfo.getDocValuesType()) { - case NONE: - iterator = null; - break; - case NUMERIC: - iterator = reader.getNumericDocValues(field); - break; - case BINARY: - iterator = reader.getBinaryDocValues(field); - break; - case SORTED: - iterator = reader.getSortedDocValues(field); - break; - case SORTED_NUMERIC: - iterator = reader.getSortedNumericDocValues(field); - break; - case SORTED_SET: - iterator = reader.getSortedSetDocValues(field); - break; - default: - throw new AssertionError(); - } - return iterator; - } - return null; - } } diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java index 8b2e5b328d30..31c2ae157306 100644 --- a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java +++ b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java @@ -59,6 +59,7 @@ import org.apache.lucene.internal.tests.IndexWriterAccess; import org.apache.lucene.internal.tests.TestSecrets; import org.apache.lucene.search.DocIdSetIterator; +import org.apache.lucene.search.FieldExistsQuery; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.Sort; @@ -3142,8 +3143,7 @@ public long addIndexes(CodecReader... readers) throws IOException { Bits liveDocs = leaf.getLiveDocs(); numSoftDeleted += PendingSoftDeletes.countSoftDeletes( - DocValuesIterator.getDocValuesDocIdSetIterator( - config.getSoftDeletesField(), leaf), + FieldExistsQuery.getDocValuesDocIdSetIterator(config.getSoftDeletesField(), leaf), liveDocs); } } @@ -4848,7 +4848,7 @@ private void countSoftDeletes( int hardDeleteCount = 0; int softDeletesCount = 0; DocIdSetIterator softDeletedDocs = - DocValuesIterator.getDocValuesDocIdSetIterator(config.getSoftDeletesField(), reader); + FieldExistsQuery.getDocValuesDocIdSetIterator(config.getSoftDeletesField(), reader); if (softDeletedDocs != null) { int docId; while ((docId = softDeletedDocs.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) { diff --git a/lucene/core/src/java/org/apache/lucene/index/PendingSoftDeletes.java b/lucene/core/src/java/org/apache/lucene/index/PendingSoftDeletes.java index d9d10c3a259f..a8377ad8f6dc 100644 --- a/lucene/core/src/java/org/apache/lucene/index/PendingSoftDeletes.java +++ b/lucene/core/src/java/org/apache/lucene/index/PendingSoftDeletes.java @@ -21,6 +21,7 @@ import java.io.IOException; import org.apache.lucene.codecs.FieldInfosFormat; import org.apache.lucene.search.DocIdSetIterator; +import org.apache.lucene.search.FieldExistsQuery; import org.apache.lucene.store.Directory; import org.apache.lucene.store.IOContext; import org.apache.lucene.util.Bits; @@ -77,7 +78,7 @@ void onNewReader(CodecReader reader, SegmentCommitInfo info) throws IOException // only re-calculate this if we haven't seen this generation if (dvGeneration < info.getDocValuesGen()) { final DocIdSetIterator iterator = - DocValuesIterator.getDocValuesDocIdSetIterator(field, reader); + FieldExistsQuery.getDocValuesDocIdSetIterator(field, reader); int newDelCount; if (iterator != null) { // nothing is deleted we don't have a soft deletes field in this segment diff --git a/lucene/core/src/java/org/apache/lucene/index/SoftDeletesDirectoryReaderWrapper.java b/lucene/core/src/java/org/apache/lucene/index/SoftDeletesDirectoryReaderWrapper.java index 96e6bb1ba159..149b17992315 100644 --- a/lucene/core/src/java/org/apache/lucene/index/SoftDeletesDirectoryReaderWrapper.java +++ b/lucene/core/src/java/org/apache/lucene/index/SoftDeletesDirectoryReaderWrapper.java @@ -27,6 +27,7 @@ import java.util.Objects; import org.apache.lucene.document.Field; import org.apache.lucene.search.DocIdSetIterator; +import org.apache.lucene.search.FieldExistsQuery; import org.apache.lucene.util.Bits; import org.apache.lucene.util.FixedBitSet; @@ -126,7 +127,7 @@ public LeafReader wrap(LeafReader reader) { } static LeafReader wrap(LeafReader reader, String field) throws IOException { - DocIdSetIterator iterator = DocValuesIterator.getDocValuesDocIdSetIterator(field, reader); + DocIdSetIterator iterator = FieldExistsQuery.getDocValuesDocIdSetIterator(field, reader); if (iterator == null) { return reader; } diff --git a/lucene/core/src/java/org/apache/lucene/search/FieldExistsQuery.java b/lucene/core/src/java/org/apache/lucene/search/FieldExistsQuery.java index c58ceb9f3bb2..fa63be639425 100644 --- a/lucene/core/src/java/org/apache/lucene/search/FieldExistsQuery.java +++ b/lucene/core/src/java/org/apache/lucene/search/FieldExistsQuery.java @@ -41,6 +41,42 @@ public FieldExistsQuery(String field) { this.field = Objects.requireNonNull(field); } + /** + * Returns a {@link DocIdSetIterator} from the given field or null if the field doesn't exist in + * the reader or if the reader has no doc values for the field. + */ + public static DocIdSetIterator getDocValuesDocIdSetIterator(String field, LeafReader reader) + throws IOException { + FieldInfo fieldInfo = reader.getFieldInfos().fieldInfo(field); + final DocIdSetIterator iterator; + if (fieldInfo != null) { + switch (fieldInfo.getDocValuesType()) { + case NONE: + iterator = null; + break; + case NUMERIC: + iterator = reader.getNumericDocValues(field); + break; + case BINARY: + iterator = reader.getBinaryDocValues(field); + break; + case SORTED: + iterator = reader.getSortedDocValues(field); + break; + case SORTED_NUMERIC: + iterator = reader.getSortedNumericDocValues(field); + break; + case SORTED_SET: + iterator = reader.getSortedSetDocValues(field); + break; + default: + throw new AssertionError(); + } + return iterator; + } + return null; + } + public String getField() { return field; }