diff -r ffd225664560 -r 2720015f5883 lucene/contrib/misc/src/java/org/apache/lucene/index/MultiPassIndexSplitter.java --- a/lucene/contrib/misc/src/java/org/apache/lucene/index/MultiPassIndexSplitter.java Wed Aug 11 21:33:28 2010 +0000 +++ b/lucene/contrib/misc/src/java/org/apache/lucene/index/MultiPassIndexSplitter.java Wed Aug 11 19:34:22 2010 -0400 @@ -205,7 +205,6 @@ if (oldDels != null) { dels.or(oldDels); } - storeDelDocs(null); } @Override diff -r ffd225664560 -r 2720015f5883 lucene/src/java/org/apache/lucene/index/IndexReader.java --- a/lucene/src/java/org/apache/lucene/index/IndexReader.java Wed Aug 11 21:33:28 2010 +0000 +++ b/lucene/src/java/org/apache/lucene/index/IndexReader.java Wed Aug 11 19:34:22 2010 -0400 @@ -1304,16 +1304,4 @@ Fields retrieveFields() { return fields; } - - private Bits storedDelDocs; - - /** @lucene.internal */ - void storeDelDocs(Bits delDocs) { - this.storedDelDocs = delDocs; - } - - /** @lucene.internal */ - Bits retrieveDelDocs() { - return storedDelDocs; - } } diff -r ffd225664560 -r 2720015f5883 lucene/src/java/org/apache/lucene/index/MultiFields.java --- a/lucene/src/java/org/apache/lucene/index/MultiFields.java Wed Aug 11 21:33:28 2010 +0000 +++ b/lucene/src/java/org/apache/lucene/index/MultiFields.java Wed Aug 11 19:34:22 2010 -0400 @@ -103,31 +103,27 @@ Bits result; if (r.hasDeletions()) { - result = r.retrieveDelDocs(); - if (result == null) { + final List bits = new ArrayList(); + final List starts = new ArrayList(); - final List bits = new ArrayList(); - final List starts = new ArrayList(); - - final int maxDoc = new ReaderUtil.Gather(r) { + final int maxDoc = new ReaderUtil.Gather(r) { @Override - protected void add(int base, IndexReader r) throws IOException { + protected void add(int base, IndexReader r) throws IOException { // record all delDocs, even if they are null bits.add(r.getDeletedDocs()); starts.add(base); } }.run(); - starts.add(maxDoc); + starts.add(maxDoc); - assert bits.size() > 0; - if (bits.size() == 1) { - // Only one actual sub reader -- optimize this case - result = bits.get(0); - } else { - result = new MultiBits(bits, starts); - } - r.storeDelDocs(result); + assert bits.size() > 0; + if (bits.size() == 1) { + // Only one actual sub reader -- optimize this case + result = bits.get(0); + } else { + result = new MultiBits(bits, starts); } + } else { result = null; } diff -r ffd225664560 -r 2720015f5883 lucene/src/java/org/apache/lucene/index/SegmentMerger.java --- a/lucene/src/java/org/apache/lucene/index/SegmentMerger.java Wed Aug 11 21:33:28 2010 +0000 +++ b/lucene/src/java/org/apache/lucene/index/SegmentMerger.java Wed Aug 11 19:34:22 2010 -0400 @@ -647,10 +647,7 @@ // NOTE: this is silly, yet, necessary -- we create a // MultiBits as our skip docs only to have it broken // apart when we step through the docs enums in - // MultidDcsEnum.... this only matters when we are - // interacting with a non-core IR subclass, because - // LegacyFieldsEnum.LegacyDocs[AndPositions]Enum checks - // that the skipDocs matches the delDocs for the reader + // MultiDocsEnum. mergeState.multiDeletedDocs = new MultiBits(bits, bitsStarts); try { diff -r 8f66a89eec11 -r 126e01e8f085 lucene/src/test/org/apache/lucene/index/TestIndexReader.java --- a/lucene/src/test/org/apache/lucene/index/TestIndexReader.java Thu Aug 12 06:34:13 2010 -0400 +++ b/lucene/src/test/org/apache/lucene/index/TestIndexReader.java Thu Aug 12 06:51:44 2010 -0400 @@ -1146,6 +1146,35 @@ dir.close(); } + public void testMultiReaderDeletes() throws Exception { + Directory dir = new MockRAMDirectory(); + RandomIndexWriter w = new RandomIndexWriter(random, dir); + Document doc = new Document(); + doc.add(new Field("f", "doctor", Field.Store.NO, Field.Index.NOT_ANALYZED)); + w.addDocument(doc); + doc = new Document(); + w.commit(); + doc.add(new Field("f", "who", Field.Store.NO, Field.Index.NOT_ANALYZED)); + w.addDocument(doc); + IndexReader r = w.getReader(); + IndexReader wr = SlowMultiReaderWrapper.wrap(r); + w.close(); + + assertNull(wr.getDeletedDocs()); + r.close(); + + r = IndexReader.open(dir, false); + wr = SlowMultiReaderWrapper.wrap(r); + + assertNull(wr.getDeletedDocs()); + assertEquals(1, r.deleteDocuments(new Term("f", "doctor"))); + assertTrue(wr.getDeletedDocs().get(0)); + assertEquals(1, r.deleteDocuments(new Term("f", "who"))); + assertTrue(wr.getDeletedDocs().get(1)); + r.close(); + dir.close(); + } + private void deleteReaderReaderConflict(boolean optimize) throws IOException { Directory dir = getDirectory(); @@ -1247,7 +1276,6 @@ dir.close(); } - private void addDocumentWithFields(IndexWriter writer) throws IOException { Document doc = new Document(); diff -r ffd225664560 -r 2720015f5883 lucene/contrib/misc/src/java/org/apache/lucene/index/MultiPassIndexSplitter.java --- a/lucene/contrib/misc/src/java/org/apache/lucene/index/MultiPassIndexSplitter.java Wed Aug 11 21:33:28 2010 +0000 +++ b/lucene/contrib/misc/src/java/org/apache/lucene/index/MultiPassIndexSplitter.java Wed Aug 11 19:34:22 2010 -0400 @@ -205,7 +205,6 @@ if (oldDels != null) { dels.or(oldDels); } - storeDelDocs(null); } @Override diff -r ffd225664560 -r 2720015f5883 lucene/src/java/org/apache/lucene/index/IndexReader.java --- a/lucene/src/java/org/apache/lucene/index/IndexReader.java Wed Aug 11 21:33:28 2010 +0000 +++ b/lucene/src/java/org/apache/lucene/index/IndexReader.java Wed Aug 11 19:34:22 2010 -0400 @@ -1304,16 +1304,4 @@ Fields retrieveFields() { return fields; } - - private Bits storedDelDocs; - - /** @lucene.internal */ - void storeDelDocs(Bits delDocs) { - this.storedDelDocs = delDocs; - } - - /** @lucene.internal */ - Bits retrieveDelDocs() { - return storedDelDocs; - } } diff -r ffd225664560 -r 2720015f5883 lucene/src/java/org/apache/lucene/index/MultiFields.java --- a/lucene/src/java/org/apache/lucene/index/MultiFields.java Wed Aug 11 21:33:28 2010 +0000 +++ b/lucene/src/java/org/apache/lucene/index/MultiFields.java Wed Aug 11 19:34:22 2010 -0400 @@ -103,31 +103,27 @@ Bits result; if (r.hasDeletions()) { - result = r.retrieveDelDocs(); - if (result == null) { + final List bits = new ArrayList(); + final List starts = new ArrayList(); - final List bits = new ArrayList(); - final List starts = new ArrayList(); - - final int maxDoc = new ReaderUtil.Gather(r) { + final int maxDoc = new ReaderUtil.Gather(r) { @Override - protected void add(int base, IndexReader r) throws IOException { + protected void add(int base, IndexReader r) throws IOException { // record all delDocs, even if they are null bits.add(r.getDeletedDocs()); starts.add(base); } }.run(); - starts.add(maxDoc); + starts.add(maxDoc); - assert bits.size() > 0; - if (bits.size() == 1) { - // Only one actual sub reader -- optimize this case - result = bits.get(0); - } else { - result = new MultiBits(bits, starts); - } - r.storeDelDocs(result); + assert bits.size() > 0; + if (bits.size() == 1) { + // Only one actual sub reader -- optimize this case + result = bits.get(0); + } else { + result = new MultiBits(bits, starts); } + } else { result = null; } diff -r ffd225664560 -r 2720015f5883 lucene/src/java/org/apache/lucene/index/SegmentMerger.java --- a/lucene/src/java/org/apache/lucene/index/SegmentMerger.java Wed Aug 11 21:33:28 2010 +0000 +++ b/lucene/src/java/org/apache/lucene/index/SegmentMerger.java Wed Aug 11 19:34:22 2010 -0400 @@ -647,10 +647,7 @@ // NOTE: this is silly, yet, necessary -- we create a // MultiBits as our skip docs only to have it broken // apart when we step through the docs enums in - // MultidDcsEnum.... this only matters when we are - // interacting with a non-core IR subclass, because - // LegacyFieldsEnum.LegacyDocs[AndPositions]Enum checks - // that the skipDocs matches the delDocs for the reader + // MultiDocsEnum. mergeState.multiDeletedDocs = new MultiBits(bits, bitsStarts); try { diff -r 126e01e8f085 -r 6397fc3194af lucene/src/test/org/apache/lucene/index/TestIndexReader.java --- a/lucene/src/test/org/apache/lucene/index/TestIndexReader.java Thu Aug 12 06:51:44 2010 -0400 +++ b/lucene/src/test/org/apache/lucene/index/TestIndexReader.java Thu Aug 12 06:53:16 2010 -0400 @@ -53,7 +53,6 @@ import org.apache.lucene.store.LockObtainFailedException; import org.apache.lucene.store.MockRAMDirectory; import org.apache.lucene.store.NoSuchDirectoryException; -import org.apache.lucene.store.MockRAMDirectory; import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util._TestUtil; import org.apache.lucene.util.BytesRef;