From 7c612dcb2d7ec18ac4e1bc13b50992cea9b43c94 Mon Sep 17 00:00:00 2001 From: Michael Busch Date: Thu, 12 Jul 2007 16:23:46 +0000 Subject: [PATCH] LUCENE-951: Fixed NullPointerException in MultiLevelSkipListReader that was thrown after a call of TermPositions.seek(). git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@555683 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES.txt | 4 ++++ .../index/MultiLevelSkipListReader.java | 4 +++- .../lucene/index/TestMultiLevelSkipList.java | 21 +++++++++++-------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index ef1fa8cbeef..0684926305f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -23,6 +23,10 @@ Bug fixes 2. LUCENE-955: Fixed SegmentTermPositions to work correctly with the first term in the dictionary. (Michael Busch) + + 3. LUCENE-951: Fixed NullPointerException in MultiLevelSkipListReader + that was thrown after a call of TermPositions.seek(). + (Rich Johnson via Michael Busch) New features diff --git a/src/java/org/apache/lucene/index/MultiLevelSkipListReader.java b/src/java/org/apache/lucene/index/MultiLevelSkipListReader.java index 73cb861ae9d..ede8e8f6231 100644 --- a/src/java/org/apache/lucene/index/MultiLevelSkipListReader.java +++ b/src/java/org/apache/lucene/index/MultiLevelSkipListReader.java @@ -172,9 +172,11 @@ abstract class MultiLevelSkipListReader { this.docCount = df; Arrays.fill(skipDoc, 0); Arrays.fill(numSkipped, 0); + Arrays.fill(childPointer, 0); + haveSkipped = false; for (int i = 1; i < numberOfSkipLevels; i++) { - skipStream[0] = null; + skipStream[i] = null; } } diff --git a/src/test/org/apache/lucene/index/TestMultiLevelSkipList.java b/src/test/org/apache/lucene/index/TestMultiLevelSkipList.java index 7511ff14644..bee96d5c595 100644 --- a/src/test/org/apache/lucene/index/TestMultiLevelSkipList.java +++ b/src/test/org/apache/lucene/index/TestMultiLevelSkipList.java @@ -57,18 +57,21 @@ public class TestMultiLevelSkipList extends TestCase { writer.close(); IndexReader reader = IndexReader.open(dir); - SegmentTermPositions tp = (SegmentTermPositions) reader.termPositions(term); + SegmentTermPositions tp = (SegmentTermPositions) reader.termPositions(); tp.freqStream = new CountingStream(tp.freqStream); - - tp.next(); - checkSkipTo(tp, 14, 185); // no skips - checkSkipTo(tp, 17, 190); // one skip on level 0 - checkSkipTo(tp, 287, 200); // one skip on level 1, two on level 0 + for (int i = 0; i < 2; i++) { + counter = 0; + tp.seek(term); + + checkSkipTo(tp, 14, 185); // no skips + checkSkipTo(tp, 17, 190); // one skip on level 0 + checkSkipTo(tp, 287, 200); // one skip on level 1, two on level 0 - // this test would fail if we had only one skip level, - // because than more bytes would be read from the freqStream - checkSkipTo(tp, 4800, 250);// one skip on level 2 + // this test would fail if we had only one skip level, + // because than more bytes would be read from the freqStream + checkSkipTo(tp, 4800, 250);// one skip on level 2 + } } public void checkSkipTo(TermPositions tp, int target, int maxCounter) throws IOException {