Index: lucene/core/src/test/org/apache/lucene/index/TestMergedSegmentFilter.java =================================================================== --- lucene/core/src/test/org/apache/lucene/index/TestMergedSegmentFilter.java (revision 0) +++ lucene/core/src/test/org/apache/lucene/index/TestMergedSegmentFilter.java (working copy) @@ -0,0 +1,192 @@ +package org.apache.lucene.index; + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.junit.Assert; + +import java.util.List; +import java.util.ArrayList; +import java.io.IOException; +import java.util.Iterator; + +import org.apache.lucene.analysis.*; +import org.apache.lucene.store.Directory; +import org.apache.lucene.util.Version; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.FieldType; +import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.util.Bits; + + +public class TestMergedSegmentFilter extends LuceneTestCase { + + + public void addDocument(IndexWriter writer) throws IOException { + final FieldType type = new FieldType(); + type.setIndexed(true); + type.setStored(true); + type.setTokenized(true); + type.setIndexOptions(FieldInfo.IndexOptions.DOCS_AND_FREQS_AND_POSITIONS); + + final Document doc = new Document(); + doc.add( new Field("a", "A Value", type) ); + doc.add( new Field("b", "B Value", type) ); + doc.add( new Field("c", "C Value", type) ); + writer.addDocument(doc); + } + + + /** + * Test removing a field during segment merging. + */ + public void testRemoveField() throws IOException { + final IndexWriterConfig config = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random())); + final Directory dir = newDirectory(); + try { + final IndexWriter writer = new IndexWriter(dir, config); + addDocument(writer); + writer.commit(); + addDocument(writer); + writer.commit(); + DirectoryReader reader = DirectoryReader.open(writer, true); + // get a NRT reader: + Assert.assertEquals("segments needed", 2, reader.leaves().size()); + // do this after getting the NRT reader: + writer.deleteAll(); + // readd all segments and transform them: + for (AtomicReaderContext ctx : reader.leaves()) { + writer.addIndexes(new RemoveFieldReader(ctx.reader())); + } + reader.close(); + writer.close(); + + reader = DirectoryReader.open(dir); + try { + Assert.assertEquals("segments needed", 2, reader.leaves().size()); + + for (AtomicReaderContext segment : reader.leaves()) { + Assert.assertNotNull(segment.reader().terms("a")); + Assert.assertNull(segment.reader().terms("b")); + Assert.assertNotNull(segment.reader().terms("c")); + } + } finally { + reader.close(); + } + } finally { + dir.close(); + } + } + + private static final class RemoveFieldReader extends AtomicReader { + private final AtomicReader reader; + + public RemoveFieldReader(AtomicReader reader) { + this.reader = reader; + } + + @Override + public Fields fields() throws IOException { + return new RemoveFieldFields(reader.fields()); + } + + @Override + public DocValues docValues(String field) throws IOException { + return reader.docValues(field); + } + + @Override + public DocValues normValues(String field) throws IOException { + return reader.normValues(field); + } + + @Override + public FieldInfos getFieldInfos() { + return reader.getFieldInfos(); + } + + @Override + public Bits getLiveDocs() { + return reader.getLiveDocs(); + } + + @Override + public void document(int doc, StoredFieldVisitor visitor) throws IOException { + reader.document(doc, visitor); + } + + @Override + public Fields getTermVectors(int doc) throws IOException { + return reader.getTermVectors(doc); + } + + @Override + public int numDocs() { + return reader.numDocs(); + } + + @Override + public int maxDoc() { + return reader.maxDoc(); + } + + @Override + public boolean hasDeletions() { + return reader.hasDeletions(); + } + + @Override + public void doClose() throws IOException { + reader.doClose(); + } + + } + + private static final class RemoveFieldFields extends Fields { + public final Fields fields; + private final List fieldNames = new ArrayList(); + + public RemoveFieldFields(Fields fields) { + this.fields = fields; + for (String name : fields) { + if (!"b".equals(name)) { + fieldNames.add(name); + } + } + } + + @Override + public Iterator iterator() { + return fieldNames.iterator(); + } + + @Override + public Terms terms(String field) throws IOException { + if ("b".equals(field)) { + return null; + } else { + return fields.terms(field); + } + } + + @Override + public int size() { + return fieldNames.size(); + } + } +} Index: lucene/core/src/test/org/apache/lucene/index/TestMergedSegmentFilter.java =================================================================== --- lucene/core/src/test/org/apache/lucene/index/TestMergedSegmentFilter.java (revision 0) +++ lucene/core/src/test/org/apache/lucene/index/TestMergedSegmentFilter.java (working copy) Property changes on: lucene/core/src/test/org/apache/lucene/index/TestMergedSegmentFilter.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property