You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ji...@apache.org on 2018/01/05 11:39:09 UTC

lucene-solr:branch_7_2: LUCENE-8117: Fix advanceExact on SortedNumericDocValues produced by Lucene54DocValues.

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_7_2 bd83fe48e -> 420461337


LUCENE-8117: Fix advanceExact on SortedNumericDocValues produced by Lucene54DocValues.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/42046133
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/42046133
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/42046133

Branch: refs/heads/branch_7_2
Commit: 420461337070b3316634e5ac16a5b65cc99e8f87
Parents: bd83fe4
Author: Jim Ferenczi <ji...@apache.org>
Authored: Fri Jan 5 12:37:42 2018 +0100
Committer: Jim Ferenczi <ji...@apache.org>
Committed: Fri Jan 5 12:38:51 2018 +0100

----------------------------------------------------------------------
 .../lucene54/Lucene54DocValuesProducer.java     |  2 +
 .../lucene54/TestLucene54DocValuesFormat.java   | 74 ++++++++++++++++++++
 2 files changed, 76 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/42046133/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java
----------------------------------------------------------------------
diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java
index a35f503..8e4da03 100644
--- a/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java
+++ b/lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene54/Lucene54DocValuesProducer.java
@@ -1172,6 +1172,7 @@ final class Lucene54DocValuesProducer extends DocValuesProducer implements Close
           docID = target;
           startOffset = ordIndex.get(docID);
           endOffset = ordIndex.get(docID+1L);
+          upto = startOffset;
           return endOffset > startOffset;
         }
         
@@ -1244,6 +1245,7 @@ final class Lucene54DocValuesProducer extends DocValuesProducer implements Close
           int ord = (int) ordinals.get(docID);
           startOffset = offsets[ord];
           endOffset = offsets[ord+1];
+          upto = startOffset;
           return endOffset > startOffset;
         }
         

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/42046133/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java
----------------------------------------------------------------------
diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java
index a761dfc..3dbf11a 100644
--- a/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java
+++ b/lucene/backward-codecs/src/test/org/apache/lucene/codecs/lucene54/TestLucene54DocValuesFormat.java
@@ -637,4 +637,78 @@ public class TestLucene54DocValuesFormat extends BaseCompressingDocValuesFormatT
       dir.close();
     }
   }
+
+  public void testSortedNumericAdvanceExact() throws Exception {
+    // test SORTED_WITH_ADDRESSES
+    doTestSortedNumericAdvanceExact(TestUtil.nextInt(random(), 100, 200), 17, null);
+    // test SORTED_SET_TABLE
+    long[] values = new long[255];
+    for (int i = 0; i < values.length; i++) {
+      values[i] = random().nextLong();
+    }
+    doTestSortedNumericAdvanceExact(TestUtil.nextInt(random(), 50, 100), 4, values);
+  }
+
+  private void doTestSortedNumericAdvanceExact(int numDocs, int maxValuesPerDoc, long[] possibleValues) throws Exception {
+    Directory dir = newFSDirectory(createTempDir());
+    IndexWriterConfig conf = newIndexWriterConfig().setMergePolicy(newLogMergePolicy());
+    conf.setMergeScheduler(new SerialMergeScheduler());
+    // set to duel against a codec which has ordinals:
+    final PostingsFormat pf = TestUtil.getPostingsFormatWithOrds(random());
+    final DocValuesFormat dv = new Lucene54DocValuesFormat();
+    conf.setCodec(new AssertingCodec() {
+      @Override
+      public PostingsFormat getPostingsFormatForField(String field) {
+        return pf;
+      }
+
+      @Override
+      public DocValuesFormat getDocValuesFormatForField(String field) {
+        return dv;
+      }
+    });
+    IndexWriter writer = new IndexWriter(dir, conf);
+
+    List<long[]> expected = new ArrayList<>();
+    for (int i = 0; i < numDocs; i++) {
+      Document doc = new Document();
+      int numValues = random().nextInt(maxValuesPerDoc);
+      // create a random list of strings
+      long[] values = new long[numValues];
+      for (int v = 0; v < numValues; v++) {
+        final long value;
+        if (possibleValues == null) {
+          value = random().nextLong();
+        } else {
+          value = possibleValues[TestUtil.nextInt(random(), 0, possibleValues.length-1)];
+        }
+        values[v] = value;
+        doc.add(new SortedNumericDocValuesField("numeric", value));
+      }
+      Arrays.sort(values);
+      expected.add(values);
+      writer.addDocument(doc);
+    }
+    writer.commit();
+    writer.forceMerge(1);
+    DirectoryReader ir = DirectoryReader.open(writer);
+    writer.close();
+    LeafReader ar = getOnlyLeafReader(ir);
+    for (int i = 0; i < numDocs; i++) {
+      int doc = TestUtil.nextInt(random(), 0, numDocs-1);
+      SortedNumericDocValues values = ar.getSortedNumericDocValues("numeric");
+      long[] array = expected.get(doc);
+      if (array.length == 0) {
+        assertFalse(values.advanceExact(doc));
+      } else {
+        assertTrue(values.advanceExact(doc));
+        assertEquals(array.length, values.docValueCount());
+        for (int j = 0; j < values.docValueCount(); j++) {
+          assertEquals(array[j], values.nextValue());
+        }
+      }
+    }
+    ir.close();
+    dir.close();
+  }
 }