|
28 | 28 | import org.apache.lucene.index.IndexWriterConfig; |
29 | 29 | import org.apache.lucene.index.LeafReaderContext; |
30 | 30 | import org.apache.lucene.search.DocIdSetIterator; |
| 31 | +import org.apache.lucene.search.FieldDoc; |
| 32 | +import org.apache.lucene.search.MatchAllDocsQuery; |
31 | 33 | import org.apache.lucene.search.Pruning; |
| 34 | +import org.apache.lucene.search.Sort; |
32 | 35 | import org.apache.lucene.search.SortField; |
33 | 36 | import org.apache.lucene.tests.util.LuceneTestCase; |
34 | 37 |
|
@@ -105,6 +108,61 @@ public void testEmptyCompetitiveIteratorOptimization() throws Exception { |
105 | 108 | } |
106 | 109 | } |
107 | 110 |
|
| 111 | + public void testEmptyCompetitiveIteratorOptimizationWithMissingValue() throws Exception { |
| 112 | + final int numDocs = atLeast(1000); |
| 113 | + try (var dir = newDirectory()) { |
| 114 | + try (var writer = |
| 115 | + new IndexWriter(dir, new IndexWriterConfig().setMergePolicy(newLogMergePolicy()))) { |
| 116 | + // index docs without missing values: |
| 117 | + for (int i = 0; i < numDocs; i++) { |
| 118 | + var doc = new Document(); |
| 119 | + |
| 120 | + doc.add(NumericDocValuesField.indexedField("long_field_1", i)); |
| 121 | + doc.add(new LongPoint("long_field_2", i)); |
| 122 | + doc.add(new NumericDocValuesField("long_field_2", i)); |
| 123 | + |
| 124 | + writer.addDocument(doc); |
| 125 | + if (i % 100 == 0) { |
| 126 | + writer.flush(); |
| 127 | + } |
| 128 | + } |
| 129 | + |
| 130 | + // Index one doc with without long_field_1 and long_field_2 fields |
| 131 | + var doc = new Document(); |
| 132 | + doc.add(new NumericDocValuesField("another_field", numDocs)); |
| 133 | + writer.addDocument(doc); |
| 134 | + writer.flush(); |
| 135 | + |
| 136 | + try (var reader = DirectoryReader.open(writer)) { |
| 137 | + var indexSearcher = newSearcher(reader); |
| 138 | + indexSearcher.setQueryCache(null); |
| 139 | + { |
| 140 | + var sortField = new SortField("long_field_1", SortField.Type.LONG, false); |
| 141 | + sortField.setMissingValue(Long.MIN_VALUE); |
| 142 | + var topDocs = indexSearcher.search(new MatchAllDocsQuery(), 3, new Sort(sortField)); |
| 143 | + assertEquals(numDocs, topDocs.scoreDocs[0].doc); |
| 144 | + assertEquals(Long.MIN_VALUE, ((FieldDoc) topDocs.scoreDocs[0]).fields[0]); |
| 145 | + assertEquals(0, topDocs.scoreDocs[1].doc); |
| 146 | + assertEquals(0L, ((FieldDoc) topDocs.scoreDocs[1]).fields[0]); |
| 147 | + assertEquals(1, topDocs.scoreDocs[2].doc); |
| 148 | + assertEquals(1L, ((FieldDoc) topDocs.scoreDocs[2]).fields[0]); |
| 149 | + } |
| 150 | + { |
| 151 | + var sortField = new SortField("long_field_2", SortField.Type.LONG, false); |
| 152 | + sortField.setMissingValue(Long.MIN_VALUE); |
| 153 | + var topDocs = indexSearcher.search(new MatchAllDocsQuery(), 3, new Sort(sortField)); |
| 154 | + assertEquals(numDocs, topDocs.scoreDocs[0].doc); |
| 155 | + assertEquals(Long.MIN_VALUE, ((FieldDoc) topDocs.scoreDocs[0]).fields[0]); |
| 156 | + assertEquals(0, topDocs.scoreDocs[1].doc); |
| 157 | + assertEquals(0L, ((FieldDoc) topDocs.scoreDocs[1]).fields[0]); |
| 158 | + assertEquals(1, topDocs.scoreDocs[2].doc); |
| 159 | + assertEquals(1L, ((FieldDoc) topDocs.scoreDocs[2]).fields[0]); |
| 160 | + } |
| 161 | + } |
| 162 | + } |
| 163 | + } |
| 164 | + } |
| 165 | + |
108 | 166 | private static void assertLongField( |
109 | 167 | String fieldName, boolean reverse, int bottom, LeafReaderContext leafContext) |
110 | 168 | throws IOException { |
|
0 commit comments