Index: CHANGES.txt =================================================================== --- CHANGES.txt (revision 922776) +++ CHANGES.txt (working copy) @@ -27,6 +27,15 @@ This means that terms with a position increment gap of zero do not affect the norms calculation by default. (Robert Muir) +* LUCENE-2320: MergePolicy.writer is now of type SetOnce, which allows setting + the IndexWriter for a MergePolicy exactly once. You can change references to + 'writer' from writer.doXYZ() to writer.get().doXYZ() + (it is also advisable to add an assert writer != null; before you + access the wrapped IndexWriter. + In addition, MergePolicy only exposes a default constructor, and the one that + took IndexWriter as argument has been removed from all MergePolicy extensions. + (Shai Erera via Mike McCandless) + Changes in runtime behavior * LUCENE-1923: Made IndexReader.toString() produce something @@ -94,6 +103,10 @@ Additionally, the setter/getter related to MergePolicy were deprecated as well. One should interact with the MergePolicy directly. (Shai Erera via Mike McCandless) + +* LUCENE-2320: IndexWriter's MergePolicy configuration was moved to + IndexWriterConfig and the respective methods on IndexWriter were deprecated. + (Shai Erera via ?) Bug fixes @@ -166,6 +179,9 @@ * LUCENE-2247: Added a CharArrayMap for performance improvements in some stemmers and synonym filters. (Uwe Schindler) + +* LUCENE-2320: Added SetOnce which wraps an object and allows it to be set + exactly once. (Shai Erera via ?) Optimizations Index: backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/IndexWriter.java =================================================================== --- backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/IndexWriter.java (revision 922601) +++ backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/IndexWriter.java (working copy) @@ -279,7 +279,7 @@ // merges private HashSet mergingSegments = new HashSet(); - private MergePolicy mergePolicy = new LogByteSizeMergePolicy(this); + private MergePolicy mergePolicy = new LogByteSizeMergePolicy(); private MergeScheduler mergeScheduler = new ConcurrentMergeScheduler(); private LinkedList pendingMerges = new LinkedList(); private Set runningMerges = new HashSet(); Index: backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/LogByteSizeMergePolicy.java =================================================================== --- backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/LogByteSizeMergePolicy.java (revision 922601) +++ backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/LogByteSizeMergePolicy.java (working copy) @@ -30,8 +30,7 @@ * or larger will never be merged. @see setMaxMergeMB */ public static final double DEFAULT_MAX_MERGE_MB = Long.MAX_VALUE; - public LogByteSizeMergePolicy(IndexWriter writer) { - super(writer); + public LogByteSizeMergePolicy() { minMergeSize = (long) (DEFAULT_MIN_MERGE_MB*1024*1024); maxMergeSize = (long) (DEFAULT_MAX_MERGE_MB*1024*1024); } Index: backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/LogDocMergePolicy.java =================================================================== --- backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/LogDocMergePolicy.java (revision 922601) +++ backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/LogDocMergePolicy.java (working copy) @@ -28,8 +28,7 @@ /** Default minimum segment size. @see setMinMergeDocs */ public static final int DEFAULT_MIN_MERGE_DOCS = 1000; - public LogDocMergePolicy(IndexWriter writer) { - super(writer); + public LogDocMergePolicy() { minMergeSize = DEFAULT_MIN_MERGE_DOCS; // maxMergeSize is never used by LogDocMergePolicy; set Index: backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/LogMergePolicy.java =================================================================== --- backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/LogMergePolicy.java (revision 922601) +++ backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/LogMergePolicy.java (working copy) @@ -66,10 +66,6 @@ private boolean useCompoundFile = true; private boolean useCompoundDocStore = true; - public LogMergePolicy(IndexWriter writer) { - super(writer); - } - protected boolean verbose() { return writer != null && writer.verbose(); } Index: backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/MergePolicy.java =================================================================== --- backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/MergePolicy.java (revision 922601) +++ backwards/lucene_3_0_back_compat_tests/src/java/org/apache/lucene/index/MergePolicy.java (working copy) @@ -200,8 +200,8 @@ final protected IndexWriter writer; - public MergePolicy(IndexWriter writer) { - this.writer = writer; + public MergePolicy() { + this.writer = null; } /** Index: backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestAddIndexesNoOptimize.java =================================================================== --- backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestAddIndexesNoOptimize.java (revision 922601) +++ backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestAddIndexesNoOptimize.java (working copy) @@ -429,7 +429,7 @@ private IndexWriter newWriter(Directory dir, boolean create) throws IOException { final IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), create, IndexWriter.MaxFieldLength.UNLIMITED); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); return writer; } @@ -503,7 +503,7 @@ Directory dir = new MockRAMDirectory(); IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); - writer.setMergePolicy(new LogByteSizeMergePolicy(writer)); + writer.setMergePolicy(new LogByteSizeMergePolicy()); writer.setMaxBufferedDocs(5); writer.setUseCompoundFile(false); writer.setMergeFactor(100); @@ -529,7 +529,7 @@ Directory dir2 = new MockRAMDirectory(); writer = new IndexWriter(dir2, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); - LogByteSizeMergePolicy lmp = new LogByteSizeMergePolicy(writer); + LogByteSizeMergePolicy lmp = new LogByteSizeMergePolicy(); lmp.setMinMergeMB(0.0001); writer.setMergePolicy(lmp); writer.setMergeFactor(4); Index: backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java =================================================================== --- backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java (revision 922601) +++ backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java (working copy) @@ -120,7 +120,7 @@ ConcurrentMergeScheduler cms = new ConcurrentMergeScheduler(); writer.setMergeScheduler(cms); - LogDocMergePolicy mp = new LogDocMergePolicy(writer); + LogDocMergePolicy mp = new LogDocMergePolicy(); writer.setMergePolicy(mp); // Force degenerate merging so we can get a mix of Index: backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestIndexReaderReopen.java =================================================================== --- backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestIndexReaderReopen.java (revision 922601) +++ backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestIndexReaderReopen.java (working copy) @@ -949,7 +949,7 @@ IndexWriter.unlock(dir); IndexWriter w = new IndexWriter(dir, new WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.LIMITED); - w.setMergePolicy(new LogDocMergePolicy(w)); + w.setMergePolicy(new LogDocMergePolicy()); for (int i = 0; i < 100; i++) { w.addDocument(createDocument(i, 4)); Index: backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestIndexWriter.java =================================================================== --- backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestIndexWriter.java (revision 922601) +++ backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestIndexWriter.java (working copy) @@ -608,7 +608,7 @@ for(int numDocs=38;numDocs<500;numDocs += 38) { IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); - LogDocMergePolicy ldmp = new LogDocMergePolicy(writer); + LogDocMergePolicy ldmp = new LogDocMergePolicy(); ldmp.setMinMergeDocs(1); writer.setMergePolicy(ldmp); writer.setMergeFactor(5); @@ -622,6 +622,8 @@ final int segCount = sis.size(); writer = new IndexWriter(dir, new WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.LIMITED); + ldmp = new LogDocMergePolicy(); + ldmp.setMinMergeDocs(1); writer.setMergePolicy(ldmp); writer.setMergeFactor(5); writer.optimize(3); @@ -645,7 +647,7 @@ doc.add(new Field("content", "aaa", Field.Store.YES, Field.Index.ANALYZED)); IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); - LogDocMergePolicy ldmp = new LogDocMergePolicy(writer); + LogDocMergePolicy ldmp = new LogDocMergePolicy(); ldmp.setMinMergeDocs(1); writer.setMergePolicy(ldmp); writer.setMergeFactor(4); @@ -2757,7 +2759,7 @@ writer.setMaxBufferedDocs(2); writer.setRAMBufferSizeMB(IndexWriter.DISABLE_AUTO_FLUSH); writer.setMergeScheduler(new SerialMergeScheduler()); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); Document document = new Document(); @@ -2790,7 +2792,7 @@ writer.setMaxBufferedDocs(2); writer.setRAMBufferSizeMB(IndexWriter.DISABLE_AUTO_FLUSH); writer.setMergeScheduler(new SerialMergeScheduler()); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); Directory[] indexDirs = {new MockRAMDirectory(dir)}; writer.addIndexesNoOptimize(indexDirs); @@ -2809,7 +2811,7 @@ writer.setMaxBufferedDocs(2); writer.setRAMBufferSizeMB(IndexWriter.DISABLE_AUTO_FLUSH); writer.setMergeScheduler(new SerialMergeScheduler()); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); Document document = new Document(); @@ -2847,7 +2849,7 @@ writer.setMaxBufferedDocs(2); writer.setRAMBufferSizeMB(IndexWriter.DISABLE_AUTO_FLUSH); writer.setMergeScheduler(new SerialMergeScheduler()); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); Document document = new Document(); @@ -2869,7 +2871,7 @@ writer.setMaxBufferedDocs(2); writer.setRAMBufferSizeMB(IndexWriter.DISABLE_AUTO_FLUSH); writer.setMergeScheduler(new SerialMergeScheduler()); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); for(int i=0;i<6;i++) writer.addDocument(document); Index: backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java =================================================================== --- backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java (revision 922601) +++ backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java (working copy) @@ -37,7 +37,7 @@ IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); writer.setMaxBufferedDocs(10); writer.setMergeFactor(10); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); for (int i = 0; i < 100; i++) { addDoc(writer); @@ -54,7 +54,7 @@ IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); writer.setMaxBufferedDocs(10); writer.setMergeFactor(10); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); boolean noOverMerge = false; for (int i = 0; i < 100; i++) { @@ -76,7 +76,7 @@ IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); writer.setMaxBufferedDocs(10); writer.setMergeFactor(10); - LogDocMergePolicy mp = new LogDocMergePolicy(writer); + LogDocMergePolicy mp = new LogDocMergePolicy(); mp.setMinMergeDocs(100); writer.setMergePolicy(mp); @@ -86,6 +86,7 @@ writer = new IndexWriter(dir, new WhitespaceAnalyzer(), false, IndexWriter.MaxFieldLength.LIMITED); writer.setMaxBufferedDocs(10); + mp = new LogDocMergePolicy(); writer.setMergePolicy(mp); mp.setMinMergeDocs(100); writer.setMergeFactor(10); @@ -102,7 +103,7 @@ IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); writer.setMaxBufferedDocs(10); writer.setMergeFactor(100); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); for (int i = 0; i < 250; i++) { addDoc(writer); @@ -128,7 +129,7 @@ IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED); writer.setMaxBufferedDocs(101); writer.setMergeFactor(101); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); // leftmost* segment has 1 doc // rightmost* segment has 100 docs @@ -142,7 +143,7 @@ writer = new IndexWriter(dir, new WhitespaceAnalyzer(), false, IndexWriter.MaxFieldLength.UNLIMITED); writer.setMaxBufferedDocs(101); writer.setMergeFactor(101); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); } writer.setMaxBufferedDocs(10); @@ -171,7 +172,7 @@ Directory dir = new RAMDirectory(); IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); writer.setMaxBufferedDocs(10); writer.setMergeFactor(100); @@ -186,7 +187,7 @@ reader.close(); writer = new IndexWriter(dir, new WhitespaceAnalyzer(), false, IndexWriter.MaxFieldLength.UNLIMITED); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer.setMergePolicy(new LogDocMergePolicy()); writer.setMaxBufferedDocs(10); writer.setMergeFactor(5); Index: backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestIndexWriterReader.java =================================================================== --- backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestIndexWriterReader.java (revision 922601) +++ backwards/lucene_3_0_back_compat_tests/src/test/org/apache/lucene/index/TestIndexWriterReader.java (working copy) @@ -572,7 +572,7 @@ boolean multiSegment) throws IOException { IndexWriter w = new IndexWriter(dir1, new WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.LIMITED); - w.setMergePolicy(new LogDocMergePolicy(w)); + w.setMergePolicy(new LogDocMergePolicy()); for (int i = 0; i < 100; i++) { w.addDocument(createDocument(i, indexName, 4)); if (multiSegment && (i % 10) == 0) { Index: contrib/ant/src/java/org/apache/lucene/ant/IndexTask.java =================================================================== --- contrib/ant/src/java/org/apache/lucene/ant/IndexTask.java (revision 922776) +++ contrib/ant/src/java/org/apache/lucene/ant/IndexTask.java (working copy) @@ -283,13 +283,14 @@ log("checkLastModified = " + checkLastModified, Project.MSG_VERBOSE); - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( + IndexWriterConfig conf = new IndexWriterConfig( Version.LUCENE_CURRENT, analyzer).setOpenMode( - create ? OpenMode.CREATE : OpenMode.APPEND)); - LogMergePolicy lmp = (LogMergePolicy) writer.getMergePolicy(); + create ? OpenMode.CREATE : OpenMode.APPEND); + LogMergePolicy lmp = (LogMergePolicy) conf.getMergePolicy(); lmp.setUseCompoundFile(useCompoundIndex); lmp.setUseCompoundDocStore(useCompoundIndex); lmp.setMergeFactor(mergeFactor); + IndexWriter writer = new IndexWriter(dir, conf); int totalFiles = 0; int totalIndexed = 0; int totalIgnored = 0; Index: contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/CreateIndexTask.java =================================================================== --- contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/CreateIndexTask.java (revision 922776) +++ contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/CreateIndexTask.java (working copy) @@ -91,7 +91,7 @@ final String mergePolicy = config.get("merge.policy", "org.apache.lucene.index.LogByteSizeMergePolicy"); try { - writer.setMergePolicy(Class.forName(mergePolicy).asSubclass(MergePolicy.class).getConstructor(IndexWriter.class).newInstance(writer)); + writer.setMergePolicy(Class.forName(mergePolicy).asSubclass(MergePolicy.class).newInstance()); } catch (Exception e) { throw new RuntimeException("unable to instantiate class '" + mergePolicy + "' as merge policy", e); } Index: contrib/benchmark/src/test/org/apache/lucene/benchmark/byTask/TestPerfTasksLogic.java =================================================================== --- contrib/benchmark/src/test/org/apache/lucene/benchmark/byTask/TestPerfTasksLogic.java (revision 922776) +++ contrib/benchmark/src/test/org/apache/lucene/benchmark/byTask/TestPerfTasksLogic.java (working copy) @@ -677,11 +677,11 @@ public static class MyMergePolicy extends LogDocMergePolicy { boolean called; - public MyMergePolicy(IndexWriter writer) { - super(writer); + public MyMergePolicy() { called = true; } } + /** * Test that we can set merge policy". */ @@ -711,7 +711,7 @@ // 2. execute the algorithm (required in every "logic" test) Benchmark benchmark = execBenchmark(algLines); - assertTrue("did not use the specified MergeScheduler", ((MyMergePolicy) benchmark.getRunData().getIndexWriter().getMergePolicy()).called); + assertTrue("did not use the specified MergePolicy", ((MyMergePolicy) benchmark.getRunData().getIndexWriter().getConfig().getMergePolicy()).called); benchmark.getRunData().getIndexWriter().close(); // 3. test number of docs in the index @@ -755,8 +755,8 @@ final IndexWriter writer = benchmark.getRunData().getIndexWriter(); assertEquals(2, writer.getConfig().getMaxBufferedDocs()); assertEquals(IndexWriterConfig.DISABLE_AUTO_FLUSH, (int) writer.getConfig().getRAMBufferSizeMB()); - assertEquals(3, ((LogMergePolicy) writer.getMergePolicy()).getMergeFactor()); - assertFalse(((LogMergePolicy) writer.getMergePolicy()).getUseCompoundFile()); + assertEquals(3, ((LogMergePolicy) writer.getConfig().getMergePolicy()).getMergeFactor()); + assertFalse(((LogMergePolicy) writer.getConfig().getMergePolicy()).getUseCompoundFile()); writer.close(); Directory dir = benchmark.getRunData().getDirectory(); IndexReader reader = IndexReader.open(dir, true); Index: contrib/misc/src/java/org/apache/lucene/index/BalancedSegmentMergePolicy.java =================================================================== --- contrib/misc/src/java/org/apache/lucene/index/BalancedSegmentMergePolicy.java (revision 922776) +++ contrib/misc/src/java/org/apache/lucene/index/BalancedSegmentMergePolicy.java (working copy) @@ -30,19 +30,18 @@ *

This is based on code from zoie, described in more detail * at http://code.google.com/p/zoie/wiki/ZoieMergePolicy.

*/ -public class BalancedSegmentMergePolicy extends LogByteSizeMergePolicy -{ +public class BalancedSegmentMergePolicy extends LogByteSizeMergePolicy { + public static final int DEFAULT_NUM_LARGE_SEGMENTS = 10; private boolean _partialExpunge = false; private int _numLargeSegments = DEFAULT_NUM_LARGE_SEGMENTS; private int _maxSmallSegments = 2 * LogMergePolicy.DEFAULT_MERGE_FACTOR; private int _maxSegments = _numLargeSegments + _maxSmallSegments; - - public BalancedSegmentMergePolicy(IndexWriter writer) { - super(writer); + + public BalancedSegmentMergePolicy() { } - + public void setMergePolicyParams(MergePolicyParams params) { if (params!=null) { setPartialExpunge(params._doPartialExpunge); @@ -122,6 +121,7 @@ private boolean isOptimized(IndexWriter writer, SegmentInfo info) throws IOException { + assert writer != null; return !info.hasDeletions() && !info.hasSeparateNorms() && info.dir == writer.getDirectory() && @@ -135,7 +135,7 @@ MergeSpecification spec = null; - if (!isOptimized(infos, writer, maxNumSegments, segmentsToOptimize)) { + if (!isOptimized(infos, writer.get(), maxNumSegments, segmentsToOptimize)) { // Find the newest (rightmost) segment that needs to // be optimized (other segments may have been flushed @@ -158,7 +158,7 @@ // Since we must optimize down to 1 segment, the // choice is simple: boolean useCompoundFile = getUseCompoundFile(); - if (last > 1 || !isOptimized(writer, infos.info(0))) { + if (last > 1 || !isOptimized(writer.get(), infos.info(0))) { spec = new MergeSpecification(); spec.add(new OneMerge(infos.range(0, last), useCompoundFile)); Index: contrib/remote/src/test/org/apache/lucene/search/TestRemoteSort.java =================================================================== --- contrib/remote/src/test/org/apache/lucene/search/TestRemoteSort.java (revision 922776) +++ contrib/remote/src/test/org/apache/lucene/search/TestRemoteSort.java (working copy) @@ -114,7 +114,7 @@ IndexWriter writer = new IndexWriter(indexStore, new IndexWriterConfig( TEST_VERSION_CURRENT, new SimpleAnalyzer(TEST_VERSION_CURRENT)) .setMaxBufferedDocs(2)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(1000); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(1000); for (int i=0; i iter = dict.getWordsIterator(); while (iter.hasNext()) { Index: contrib/wordnet/src/java/org/apache/lucene/wordnet/Syns2Index.java =================================================================== --- contrib/wordnet/src/java/org/apache/lucene/wordnet/Syns2Index.java (revision 922776) +++ contrib/wordnet/src/java/org/apache/lucene/wordnet/Syns2Index.java (working copy) @@ -250,8 +250,8 @@ // override the specific index if it already exists IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( Version.LUCENE_CURRENT, ana).setOpenMode(OpenMode.CREATE)); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(true); // why? - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(true); // why? + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(true); // why? + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundDocStore(true); // why? Iterator i1 = word2Nums.keySet().iterator(); while (i1.hasNext()) // for each word { Index: src/java/org/apache/lucene/index/IndexWriter.java =================================================================== --- src/java/org/apache/lucene/index/IndexWriter.java (revision 922776) +++ src/java/org/apache/lucene/index/IndexWriter.java (working copy) @@ -290,7 +290,7 @@ // merges private HashSet mergingSegments = new HashSet(); - private MergePolicy mergePolicy = new LogByteSizeMergePolicy(this); + private MergePolicy mergePolicy; // TODO 4.0: this should be made final once the setter is removed private /*final*/MergeScheduler mergeScheduler; private LinkedList pendingMerges = new LinkedList(); @@ -1077,6 +1077,8 @@ termIndexInterval = conf.getTermIndexInterval(); writeLockTimeout = conf.getWriteLockTimeout(); similarity = conf.getSimilarity(); + mergePolicy = conf.getMergePolicy(); + mergePolicy.setIndexWriter(this); mergeScheduler = conf.getMergeScheduler(); mergedSegmentWarmer = conf.getMergedSegmentWarmer(); @@ -1210,6 +1212,8 @@ /** * Expert: set the merge policy used by this writer. + * + * @deprecated use {@link IndexWriterConfig#setMergePolicy(MergePolicy)} instead. */ public void setMergePolicy(MergePolicy mp) { ensureOpen(); @@ -1219,14 +1223,20 @@ if (mergePolicy != mp) mergePolicy.close(); mergePolicy = mp; + mergePolicy.setIndexWriter(this); pushMaxBufferedDocs(); if (infoStream != null) message("setMergePolicy " + mp); + // Required so config.getMergePolicy returns the right value. But this will + // go away together with the method in 4.0. + config.setMergePolicy(mp); } /** * Expert: returns the current MergePolicy in use by this writer. * @see #setMergePolicy + * + * @deprecated use {@link IndexWriterConfig#getMergePolicy()} instead */ public MergePolicy getMergePolicy() { ensureOpen(); Index: src/java/org/apache/lucene/index/IndexWriterConfig.java =================================================================== --- src/java/org/apache/lucene/index/IndexWriterConfig.java (revision 922776) +++ src/java/org/apache/lucene/index/IndexWriterConfig.java (working copy) @@ -110,6 +110,7 @@ private int maxBufferedDocs; private IndexingChain indexingChain; private IndexReaderWarmer mergedSegmentWarmer; + private MergePolicy mergePolicy; // required for clone private Version matchVersion; @@ -137,6 +138,7 @@ maxBufferedDocs = DEFAULT_MAX_BUFFERED_DOCS; indexingChain = DocumentsWriter.defaultIndexingChain; mergedSegmentWarmer = null; + mergePolicy = new LogByteSizeMergePolicy(); } @Override @@ -483,7 +485,27 @@ return mergedSegmentWarmer; } + /** + * Expert: {@link MergePolicy} is invoked whenever there are changes to the + * segments in the index. Its role is to select which merges to do, if any, + * and return a {@link MergePolicy.MergeSpecification} describing the merges. + * It also selects merges to do for optimize(). (The default is + * {@link LogByteSizeMergePolicy}. + */ + public IndexWriterConfig setMergePolicy(MergePolicy mergePolicy) { + this.mergePolicy = mergePolicy == null ? new LogByteSizeMergePolicy() : mergePolicy; + return this; + } + /** + * Returns the current MergePolicy in use by this writer. + * + * @see #setMergePolicy(MergePolicy) + */ + public MergePolicy getMergePolicy() { + return mergePolicy; + } + /** Expert: sets the {@link DocConsumer} chain to be used to process documents. */ IndexWriterConfig setIndexingChain(IndexingChain indexingChain) { this.indexingChain = indexingChain == null ? DocumentsWriter.defaultIndexingChain : indexingChain; @@ -513,6 +535,7 @@ sb.append("ramBufferSizeMB=").append(ramBufferSizeMB).append("\n"); sb.append("maxBufferedDocs=").append(maxBufferedDocs).append("\n"); sb.append("mergedSegmentWarmer=").append(mergedSegmentWarmer).append("\n"); + sb.append("mergePolicy=").append(mergePolicy).append("\n"); return sb.toString(); } } Index: src/java/org/apache/lucene/index/LogByteSizeMergePolicy.java =================================================================== --- src/java/org/apache/lucene/index/LogByteSizeMergePolicy.java (revision 922776) +++ src/java/org/apache/lucene/index/LogByteSizeMergePolicy.java (working copy) @@ -30,11 +30,11 @@ * or larger will never be merged. @see setMaxMergeMB */ public static final double DEFAULT_MAX_MERGE_MB = Long.MAX_VALUE; - public LogByteSizeMergePolicy(IndexWriter writer) { - super(writer); + public LogByteSizeMergePolicy() { minMergeSize = (long) (DEFAULT_MIN_MERGE_MB*1024*1024); maxMergeSize = (long) (DEFAULT_MAX_MERGE_MB*1024*1024); } + @Override protected long size(SegmentInfo info) throws IOException { return sizeBytes(info); Index: src/java/org/apache/lucene/index/LogDocMergePolicy.java =================================================================== --- src/java/org/apache/lucene/index/LogDocMergePolicy.java (revision 922776) +++ src/java/org/apache/lucene/index/LogDocMergePolicy.java (working copy) @@ -28,14 +28,14 @@ /** Default minimum segment size. @see setMinMergeDocs */ public static final int DEFAULT_MIN_MERGE_DOCS = 1000; - public LogDocMergePolicy(IndexWriter writer) { - super(writer); + public LogDocMergePolicy() { minMergeSize = DEFAULT_MIN_MERGE_DOCS; - + // maxMergeSize is never used by LogDocMergePolicy; set // it to Long.MAX_VALUE to disable it maxMergeSize = Long.MAX_VALUE; } + @Override protected long size(SegmentInfo info) throws IOException { return sizeDocs(info); Index: src/java/org/apache/lucene/index/LogMergePolicy.java =================================================================== --- src/java/org/apache/lucene/index/LogMergePolicy.java (revision 922776) +++ src/java/org/apache/lucene/index/LogMergePolicy.java (working copy) @@ -66,17 +66,18 @@ private boolean useCompoundFile = true; private boolean useCompoundDocStore = true; - public LogMergePolicy(IndexWriter writer) { - super(writer); + public LogMergePolicy() { + super(); } - + protected boolean verbose() { - return writer != null && writer.verbose(); + IndexWriter w = writer.get(); + return w != null && w.verbose(); } private void message(String message) { if (verbose()) - writer.message("LMP: " + message); + writer.get().message("LMP: " + message); } /**

Returns the number of segments that are merged at @@ -160,7 +161,7 @@ protected long sizeDocs(SegmentInfo info) throws IOException { if (calibrateSizeByDeletes) { - int delCount = writer.numDeletedDocs(info); + int delCount = writer.get().numDeletedDocs(info); return (info.docCount - (long)delCount); } else { return info.docCount; @@ -170,7 +171,7 @@ protected long sizeBytes(SegmentInfo info) throws IOException { long byteSize = info.sizeInBytes(); if (calibrateSizeByDeletes) { - int delCount = writer.numDeletedDocs(info); + int delCount = writer.get().numDeletedDocs(info); float delRatio = (info.docCount <= 0 ? 0.0f : ((float)delCount / (float)info.docCount)); return (info.docCount <= 0 ? byteSize : (long)(byteSize * (1.0f - delRatio))); } else { @@ -199,10 +200,12 @@ * writer, and matches the current compound file setting */ private boolean isOptimized(SegmentInfo info) throws IOException { - boolean hasDeletions = writer.numDeletedDocs(info) > 0; + IndexWriter w = writer.get(); + assert w != null; + boolean hasDeletions = w.numDeletedDocs(info) > 0; return !hasDeletions && !info.hasSeparateNorms() && - info.dir == writer.getDirectory() && + info.dir == w.getDirectory() && info.getUseCompoundFile() == useCompoundFile; } @@ -309,9 +312,11 @@ MergeSpecification spec = new MergeSpecification(); int firstSegmentWithDeletions = -1; + IndexWriter w = writer.get(); + assert w != null; for(int i=0;i 0) { if (verbose()) message(" segment " + info.name + " has deletions"); Index: src/java/org/apache/lucene/index/MergePolicy.java =================================================================== --- src/java/org/apache/lucene/index/MergePolicy.java (revision 922776) +++ src/java/org/apache/lucene/index/MergePolicy.java (working copy) @@ -18,6 +18,8 @@ */ import org.apache.lucene.store.Directory; +import org.apache.lucene.util.SetOnce; +import org.apache.lucene.util.SetOnce.AlreadySetException; import java.io.IOException; import java.util.List; @@ -225,13 +227,29 @@ } } - final protected IndexWriter writer; - - public MergePolicy(IndexWriter writer) { - this.writer = writer; + protected final SetOnce writer; + + /** + * Creates a new merge policy instance. Note that if you intend to use it + * without passing it to {@link IndexWriter}, you should call + * {@link #setIndexWriter(IndexWriter)}. + */ + public MergePolicy() { + writer = new SetOnce(); } /** + * Sets the {@link IndexWriter} to use by this merge policy. This method is + * allowed to be called only once, and is usually set by IndexWriter. If it is + * called more than once, {@link AlreadySetException} is thrown. + * + * @see SetOnce + */ + public void setIndexWriter(IndexWriter writer) { + this.writer.set(writer); + } + + /** * Determine what set of merge operations are now necessary on the index. * {@link IndexWriter} calls this whenever there is a change to the segments. * This call is always synchronized on the {@link IndexWriter} instance so Index: src/java/org/apache/lucene/util/SetOnce.java =================================================================== --- src/java/org/apache/lucene/util/SetOnce.java (revision 0) +++ src/java/org/apache/lucene/util/SetOnce.java (revision 0) @@ -0,0 +1,74 @@ +package org.apache.lucene.util; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 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. + */ + +/** + * A convenient class which offers a semi-immutable object wrapper + * implementation which allows one to set the value of an object exactly once, + * and retrieve it many times. If {@link #set(Object)} is called more than once, + * {@link AlreadySetException} is thrown and the operation will fail. + */ +public final class SetOnce { + + /** Thrown when {@link SetOnce#set(Object)} is called more than once. */ + public static final class AlreadySetException extends RuntimeException { + public AlreadySetException() { + super("The object cannot be set twice!"); + } + } + + private volatile T obj = null; + private final AtomicBoolean set; + + /** + * A default constructor which does not set the internal object, and allows + * setting it by calling {@link #set(Object)}. + */ + public SetOnce() { + set = new AtomicBoolean(false); + } + + /** + * Creates a new instnace with the internal object set to the given object. + * Note that any calls to {@link #set(Object)} afterwards will result in + * {@link AlreadySetException} + * + * @throws AlreadySetException if called more than once + * @see #set(Object) + */ + public SetOnce(T obj) { + this.obj = obj; + set = new AtomicBoolean(true); + } + + /** Sets the given object. If the object has already been set, an exception is thrown. */ + public final void set(T obj) { + if (set.compareAndSet(false, true)) { + this.obj = obj; + } else { + throw new AlreadySetException(); + } + } + + /** Returns the object set by {@link #set(Object)}. */ + public final T get() { + return obj; + } +} Property changes on: src\java\org\apache\lucene\util\SetOnce.java ___________________________________________________________________ Added: svn:keywords + Date Author Id Revision HeadURL Added: svn:eol-style + native Index: src/test/org/apache/lucene/TestSearch.java =================================================================== --- src/test/org/apache/lucene/TestSearch.java (revision 922776) +++ src/test/org/apache/lucene/TestSearch.java (working copy) @@ -73,11 +73,11 @@ throws Exception { Directory directory = new RAMDirectory(); Analyzer analyzer = new SimpleAnalyzer(TEST_VERSION_CURRENT); - IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig( - TEST_VERSION_CURRENT, analyzer)); - LogMergePolicy lmp = (LogMergePolicy) writer.getMergePolicy(); + IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, analyzer); + LogMergePolicy lmp = (LogMergePolicy) conf.getMergePolicy(); lmp.setUseCompoundFile(useCompoundFile); lmp.setUseCompoundDocStore(useCompoundFile); + IndexWriter writer = new IndexWriter(directory, conf); String[] docs = { "a b c d e", Index: src/test/org/apache/lucene/TestSearchForDuplicates.java =================================================================== --- src/test/org/apache/lucene/TestSearchForDuplicates.java (revision 922776) +++ src/test/org/apache/lucene/TestSearchForDuplicates.java (working copy) @@ -78,11 +78,11 @@ private void doTest(PrintWriter out, boolean useCompoundFiles) throws Exception { Directory directory = new RAMDirectory(); Analyzer analyzer = new SimpleAnalyzer(TEST_VERSION_CURRENT); - IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig( - TEST_VERSION_CURRENT, analyzer)); - LogMergePolicy lmp = (LogMergePolicy) writer.getMergePolicy(); + IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, analyzer); + LogMergePolicy lmp = (LogMergePolicy) conf.getMergePolicy(); lmp.setUseCompoundFile(useCompoundFiles); lmp.setUseCompoundDocStore(useCompoundFiles); + IndexWriter writer = new IndexWriter(directory, conf); final int MAX_DOCS = 225; Index: src/test/org/apache/lucene/index/TestAddIndexesNoOptimize.java =================================================================== --- src/test/org/apache/lucene/index/TestAddIndexesNoOptimize.java (revision 922776) +++ src/test/org/apache/lucene/index/TestAddIndexesNoOptimize.java (working copy) @@ -49,8 +49,8 @@ writer.close(); writer = newWriter(aux, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode(OpenMode.CREATE)); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(false); // use one without a compound file - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(false); // use one without a compound file + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(false); // use one without a compound file + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundDocStore(false); // use one without a compound file // add 40 documents in separate files addDocs(writer, 40); assertEquals(40, writer.maxDoc()); @@ -257,14 +257,14 @@ writer.close(); writer = newWriter(aux, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode(OpenMode.CREATE).setMaxBufferedDocs(1000)); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(false); // use one without a compound file - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(false); // use one without a compound file + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(false); // use one without a compound file + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundDocStore(false); // use one without a compound file // add 140 documents in separate files addDocs(writer, 40); writer.close(); writer = newWriter(aux, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode(OpenMode.CREATE).setMaxBufferedDocs(1000)); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(false); // use one without a compound file - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(false); // use one without a compound file + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(false); // use one without a compound file + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundDocStore(false); // use one without a compound file addDocs(writer, 100); writer.close(); @@ -297,7 +297,7 @@ IndexWriter writer = newWriter(dir, new IndexWriterConfig( TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) .setOpenMode(OpenMode.APPEND).setMaxBufferedDocs(10)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(4); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(4); addDocs(writer, 10); writer.addIndexesNoOptimize(new Directory[] { aux }); @@ -320,7 +320,7 @@ setUpDirs(dir, aux); IndexWriter writer = newWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode(OpenMode.APPEND).setMaxBufferedDocs(9)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(4); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(4); addDocs(writer, 2); writer.addIndexesNoOptimize(new Directory[] { aux }); @@ -345,7 +345,7 @@ IndexWriter writer = newWriter(dir, new IndexWriterConfig( TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) .setOpenMode(OpenMode.APPEND).setMaxBufferedDocs(10)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(4); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(4); writer.addIndexesNoOptimize(new Directory[] { aux, new RAMDirectory(aux) }); assertEquals(1060, writer.maxDoc()); @@ -375,7 +375,7 @@ IndexWriter writer = newWriter(dir, new IndexWriterConfig( TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) .setOpenMode(OpenMode.APPEND).setMaxBufferedDocs(4)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(4); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(4); writer.addIndexesNoOptimize(new Directory[] { aux, new RAMDirectory(aux) }); assertEquals(1020, writer.maxDoc()); @@ -399,7 +399,7 @@ IndexWriter writer = newWriter(aux2, new IndexWriterConfig( TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) .setOpenMode(OpenMode.CREATE).setMaxBufferedDocs(100)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(10); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(10); writer.addIndexesNoOptimize(new Directory[] { aux }); assertEquals(30, writer.maxDoc()); assertEquals(3, writer.getSegmentCount()); @@ -421,7 +421,7 @@ writer = newWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) .setOpenMode(OpenMode.APPEND).setMaxBufferedDocs(6)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(4); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(4); writer.addIndexesNoOptimize(new Directory[] { aux, aux2 }); assertEquals(1025, writer.maxDoc()); @@ -434,8 +434,8 @@ private IndexWriter newWriter(Directory dir, IndexWriterConfig conf) throws IOException { + conf.setMergePolicy(new LogDocMergePolicy()); final IndexWriter writer = new IndexWriter(dir, conf); - writer.setMergePolicy(new LogDocMergePolicy(writer)); return writer; } @@ -486,17 +486,17 @@ writer.close(); writer = newWriter(aux, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode(OpenMode.CREATE).setMaxBufferedDocs(100)); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(false); // use one without a compound file - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(false); // use one without a compound file - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(10); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(false); // use one without a compound file + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundDocStore(false); // use one without a compound file + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(10); // add 30 documents in 3 segments for (int i = 0; i < 3; i++) { addDocs(writer, 10); writer.close(); writer = newWriter(aux, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode(OpenMode.APPEND).setMaxBufferedDocs(100)); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(false); // use one without a compound file - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(false); // use one without a compound file - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(10); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(false); // use one without a compound file + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundDocStore(false); // use one without a compound file + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(10); } assertEquals(30, writer.maxDoc()); assertEquals(3, writer.getSegmentCount()); @@ -507,12 +507,13 @@ public void testHangOnClose() throws IOException { Directory dir = new MockRAMDirectory(); - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(5)); - LogByteSizeMergePolicy lmp = new LogByteSizeMergePolicy(writer); + LogByteSizeMergePolicy lmp = new LogByteSizeMergePolicy(); lmp.setUseCompoundFile(false); lmp.setUseCompoundDocStore(false); lmp.setMergeFactor(100); - writer.setMergePolicy(lmp); + IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( + TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) + .setMaxBufferedDocs(5).setMergePolicy(lmp)); Document doc = new Document(); doc.add(new Field("content", "aaa bbb ccc ddd eee fff ggg hhh iii", Field.Store.YES, @@ -534,13 +535,14 @@ writer.close(); Directory dir2 = new MockRAMDirectory(); - writer = new IndexWriter(dir2, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMergeScheduler(new SerialMergeScheduler())); - lmp = new LogByteSizeMergePolicy(writer); + lmp = new LogByteSizeMergePolicy(); lmp.setMinMergeMB(0.0001); lmp.setUseCompoundFile(false); lmp.setUseCompoundDocStore(false); lmp.setMergeFactor(4); - writer.setMergePolicy(lmp); + writer = new IndexWriter(dir2, new IndexWriterConfig(TEST_VERSION_CURRENT, + new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) + .setMergeScheduler(new SerialMergeScheduler()).setMergePolicy(lmp)); writer.addIndexesNoOptimize(new Directory[] {dir}); writer.close(); dir.close(); @@ -552,15 +554,15 @@ public void testTargetCFS() throws IOException { Directory dir = new RAMDirectory(); IndexWriter writer = newWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT))); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(false); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(false); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(false); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundDocStore(false); addDocs(writer, 1); writer.close(); Directory other = new RAMDirectory(); writer = newWriter(other, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT))); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(true); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(true); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(true); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundDocStore(true); writer.addIndexesNoOptimize(new Directory[] {dir}); assertTrue(writer.newestSegment().getUseCompoundFile()); writer.close(); Index: src/test/org/apache/lucene/index/TestAtomicUpdate.java =================================================================== --- src/test/org/apache/lucene/index/TestAtomicUpdate.java (revision 922776) +++ src/test/org/apache/lucene/index/TestAtomicUpdate.java (working copy) @@ -126,10 +126,11 @@ TimedThread[] threads = new TimedThread[4]; - IndexWriter writer = new MockIndexWriter(directory, new IndexWriterConfig( + IndexWriterConfig conf = new IndexWriterConfig( TEST_VERSION_CURRENT, new SimpleAnalyzer(TEST_VERSION_CURRENT)) - .setMaxBufferedDocs(7)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(3); + .setMaxBufferedDocs(7); + ((LogMergePolicy) conf.getMergePolicy()).setMergeFactor(3); + IndexWriter writer = new MockIndexWriter(directory, conf); // Establish a base index of 100 docs: for(int i=0;i<100;i++) { Index: src/test/org/apache/lucene/index/TestBackwardsCompatibility.java =================================================================== --- src/test/org/apache/lucene/index/TestBackwardsCompatibility.java (revision 922776) +++ src/test/org/apache/lucene/index/TestBackwardsCompatibility.java (working copy) @@ -472,9 +472,10 @@ dirName = fullDir(dirName); Directory dir = FSDirectory.open(new File(dirName)); - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(10)); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(doCFS); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(doCFS); + IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(10); + ((LogMergePolicy) conf.getMergePolicy()).setUseCompoundFile(doCFS); + ((LogMergePolicy) conf.getMergePolicy()).setUseCompoundDocStore(doCFS); + IndexWriter writer = new IndexWriter(dir, conf); for(int i=0;i<35;i++) { addDoc(writer, i); @@ -483,9 +484,10 @@ writer.close(); // open fresh writer so we get no prx file in the added segment - writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(10)); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(doCFS); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(doCFS); + conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(10); + ((LogMergePolicy) conf.getMergePolicy()).setUseCompoundFile(doCFS); + ((LogMergePolicy) conf.getMergePolicy()).setUseCompoundDocStore(doCFS); + writer = new IndexWriter(dir, conf); addNoProxDoc(writer); writer.close(); Index: src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java =================================================================== --- src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java (revision 922776) +++ src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java (working copy) @@ -110,15 +110,14 @@ RAMDirectory directory = new MockRAMDirectory(); - IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(TEST_VERSION_CURRENT, new SimpleAnalyzer(TEST_VERSION_CURRENT))); - - LogDocMergePolicy mp = new LogDocMergePolicy(writer); - writer.setMergePolicy(mp); - + LogDocMergePolicy mp = new LogDocMergePolicy(); // Force degenerate merging so we can get a mix of // merging of segments with and without deletes at the // start: mp.setMinMergeDocs(1000); + IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig( + TEST_VERSION_CURRENT, new SimpleAnalyzer(TEST_VERSION_CURRENT)) + .setMergePolicy(mp)); Document doc = new Document(); Field idField = new Field("id", "", Field.Store.YES, Field.Index.NOT_ANALYZED); @@ -184,7 +183,7 @@ doc.add(idField); IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(TEST_VERSION_CURRENT, new SimpleAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(2)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(100); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(100); for(int iter=0;iter<10;iter++) { @@ -201,7 +200,7 @@ // Force a bunch of merge threads to kick off so we // stress out aborting them on close: - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(3); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(3); writer.addDocument(doc); writer.commit(); @@ -213,7 +212,7 @@ // Reopen writer = new IndexWriter(directory, new IndexWriterConfig(TEST_VERSION_CURRENT, new SimpleAnalyzer(TEST_VERSION_CURRENT)).setOpenMode(OpenMode.APPEND)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(100); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(100); } writer.close(); Index: src/test/org/apache/lucene/index/TestDeletionPolicy.java =================================================================== --- src/test/org/apache/lucene/index/TestDeletionPolicy.java (revision 922776) +++ src/test/org/apache/lucene/index/TestDeletionPolicy.java (working copy) @@ -202,10 +202,13 @@ Directory dir = new RAMDirectory(); ExpirationTimeDeletionPolicy policy = new ExpirationTimeDeletionPolicy(dir, SECONDS); - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setIndexDeletionPolicy(policy)); - LogMergePolicy lmp = (LogMergePolicy) writer.getMergePolicy(); + IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, + new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) + .setIndexDeletionPolicy(policy); + LogMergePolicy lmp = (LogMergePolicy) conf.getMergePolicy(); lmp.setUseCompoundFile(useCompoundFile); lmp.setUseCompoundDocStore(useCompoundFile); + IndexWriter writer = new IndexWriter(dir, conf); writer.close(); long lastDeleteTime = 0; @@ -213,11 +216,13 @@ // Record last time when writer performed deletes of // past commits lastDeleteTime = System.currentTimeMillis(); - writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) - .setOpenMode(OpenMode.APPEND).setIndexDeletionPolicy(policy)); - lmp = (LogMergePolicy) writer.getMergePolicy(); + conf = new IndexWriterConfig(TEST_VERSION_CURRENT, + new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode( + OpenMode.APPEND).setIndexDeletionPolicy(policy); + lmp = (LogMergePolicy) conf.getMergePolicy(); lmp.setUseCompoundFile(useCompoundFile); lmp.setUseCompoundDocStore(useCompoundFile); + writer = new IndexWriter(dir, conf); for(int j=0;j<17;j++) { addDoc(writer); } @@ -277,24 +282,26 @@ Directory dir = new RAMDirectory(); policy.dir = dir; - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( + IndexWriterConfig conf = new IndexWriterConfig( TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) .setIndexDeletionPolicy(policy).setMaxBufferedDocs(10) - .setMergeScheduler(new SerialMergeScheduler())); - LogMergePolicy lmp = (LogMergePolicy) writer.getMergePolicy(); + .setMergeScheduler(new SerialMergeScheduler()); + LogMergePolicy lmp = (LogMergePolicy) conf.getMergePolicy(); lmp.setUseCompoundFile(useCompoundFile); lmp.setUseCompoundDocStore(useCompoundFile); + IndexWriter writer = new IndexWriter(dir, conf); for(int i=0;i<107;i++) { addDoc(writer); } writer.close(); - writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, + conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode( - OpenMode.APPEND).setIndexDeletionPolicy(policy)); - lmp = (LogMergePolicy) writer.getMergePolicy(); + OpenMode.APPEND).setIndexDeletionPolicy(policy); + lmp = (LogMergePolicy) conf.getMergePolicy(); lmp.setUseCompoundFile(useCompoundFile); lmp.setUseCompoundDocStore(useCompoundFile); + writer = new IndexWriter(dir, conf); writer.optimize(); writer.close(); @@ -462,23 +469,25 @@ Directory dir = new RAMDirectory(); - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( + IndexWriterConfig conf = new IndexWriterConfig( TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) .setOpenMode(OpenMode.CREATE).setIndexDeletionPolicy(policy) - .setMaxBufferedDocs(10)); - LogMergePolicy lmp = (LogMergePolicy) writer.getMergePolicy(); + .setMaxBufferedDocs(10); + LogMergePolicy lmp = (LogMergePolicy) conf.getMergePolicy(); lmp.setUseCompoundFile(useCompoundFile); lmp.setUseCompoundDocStore(useCompoundFile); + IndexWriter writer = new IndexWriter(dir, conf); for(int i=0;i<107;i++) { addDoc(writer); } writer.close(); - writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) - .setOpenMode(OpenMode.APPEND).setIndexDeletionPolicy(policy)); - lmp = (LogMergePolicy) writer.getMergePolicy(); + conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) + .setOpenMode(OpenMode.APPEND).setIndexDeletionPolicy(policy); + lmp = (LogMergePolicy) conf.getMergePolicy(); lmp.setUseCompoundFile(useCompoundFile); lmp.setUseCompoundDocStore(useCompoundFile); + writer = new IndexWriter(dir, conf); writer.optimize(); writer.close(); @@ -512,13 +521,14 @@ KeepLastNDeletionPolicy policy = new KeepLastNDeletionPolicy(N); for(int j=0;j getters = new HashSet(); @@ -98,6 +99,7 @@ getters.add("getMaxBufferedDocs"); getters.add("getIndexingChain"); getters.add("getMergedSegmentWarmer"); + getters.add("getMergePolicy"); for (Method m : IndexWriterConfig.class.getDeclaredMethods()) { if (m.getDeclaringClass() == IndexWriterConfig.class && m.getName().startsWith("get")) { assertTrue("method " + m.getName() + " is not tested for defaults", getters.contains(m.getName())); @@ -224,7 +226,13 @@ } catch (IllegalArgumentException e) { // this is expected } - + + // Test MergePolicy + assertEquals(LogByteSizeMergePolicy.class, conf.getMergePolicy().getClass()); + conf.setMergePolicy(new LogDocMergePolicy()); + assertEquals(LogDocMergePolicy.class, conf.getMergePolicy().getClass()); + conf.setMergePolicy(null); + assertEquals(LogByteSizeMergePolicy.class, conf.getMergePolicy().getClass()); } /** @@ -267,5 +275,9 @@ writer.setMergedSegmentWarmer(new MyWarmer()); assertEquals(MyWarmer.class, writer.getConfig().getMergedSegmentWarmer().getClass()); + + writer.setMergePolicy(new LogDocMergePolicy()); + assertEquals(LogDocMergePolicy.class, writer.getConfig().getMergePolicy().getClass()); } + } Index: src/test/org/apache/lucene/index/TestIndexWriterDelete.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexWriterDelete.java (revision 922776) +++ src/test/org/apache/lucene/index/TestIndexWriterDelete.java (working copy) @@ -642,7 +642,7 @@ MockRAMDirectory dir = new MockRAMDirectory(); IndexWriter modifier = new IndexWriter(dir, new IndexWriterConfig( TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDeleteTerms(2)); - LogMergePolicy lmp = (LogMergePolicy) modifier.getMergePolicy(); + LogMergePolicy lmp = (LogMergePolicy) modifier.getConfig().getMergePolicy(); lmp.setUseCompoundFile(true); lmp.setUseCompoundDocStore(true); Index: src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java (revision 922776) +++ src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java (working copy) @@ -35,9 +35,9 @@ public void testNormalCase() throws IOException { Directory dir = new RAMDirectory(); - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(10)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(10); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( + TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) + .setMaxBufferedDocs(10).setMergePolicy(new LogDocMergePolicy())); for (int i = 0; i < 100; i++) { addDoc(writer); @@ -51,9 +51,9 @@ public void testNoOverMerge() throws IOException { Directory dir = new RAMDirectory(); - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(10)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(10); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( + TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) + .setMaxBufferedDocs(10).setMergePolicy(new LogDocMergePolicy())); boolean noOverMerge = false; for (int i = 0; i < 100; i++) { @@ -72,21 +72,23 @@ public void testForceFlush() throws IOException { Directory dir = new RAMDirectory(); - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(10)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(10); - LogDocMergePolicy mp = new LogDocMergePolicy(writer); + LogDocMergePolicy mp = new LogDocMergePolicy(); mp.setMinMergeDocs(100); - writer.setMergePolicy(mp); + mp.setMergeFactor(10); + IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( + TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) + .setMaxBufferedDocs(10).setMergePolicy(mp)); for (int i = 0; i < 100; i++) { addDoc(writer); writer.close(); - writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) - .setOpenMode(OpenMode.APPEND).setMaxBufferedDocs(10)); - writer.setMergePolicy(mp); + mp = new LogDocMergePolicy(); + mp.setMergeFactor(10); + writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, + new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode( + OpenMode.APPEND).setMaxBufferedDocs(10).setMergePolicy(mp)); mp.setMinMergeDocs(100); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(10); checkInvariants(writer); } @@ -97,16 +99,16 @@ public void testMergeFactorChange() throws IOException { Directory dir = new RAMDirectory(); - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(10)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(100); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( + TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) + .setMaxBufferedDocs(10).setMergePolicy(new LogDocMergePolicy())); for (int i = 0; i < 250; i++) { addDoc(writer); checkInvariants(writer); } - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(5); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(5); // merge policy only fixes segments on levels where merges // have been triggered, so check invariants after all adds @@ -122,9 +124,9 @@ public void testMaxBufferedDocsChange() throws IOException { Directory dir = new RAMDirectory(); - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(101)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(101); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( + TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) + .setMaxBufferedDocs(101).setMergePolicy(new LogDocMergePolicy())); // leftmost* segment has 1 doc // rightmost* segment has 100 docs @@ -135,17 +137,18 @@ } writer.close(); - writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) - .setOpenMode(OpenMode.APPEND).setMaxBufferedDocs(101)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(101); - writer.setMergePolicy(new LogDocMergePolicy(writer)); + writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, + new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode( + OpenMode.APPEND).setMaxBufferedDocs(101).setMergePolicy( + new LogDocMergePolicy())); } writer.close(); - writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) - .setOpenMode(OpenMode.APPEND).setMaxBufferedDocs(10)); - writer.setMergePolicy(new LogDocMergePolicy(writer)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(10); + LogDocMergePolicy ldmp = new LogDocMergePolicy(); + ldmp.setMergeFactor(10); + writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, + new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode( + OpenMode.APPEND).setMaxBufferedDocs(10).setMergePolicy(ldmp)); // merge policy only fixes segments on levels where merges // have been triggered, so check invariants after all adds @@ -169,9 +172,11 @@ public void testMergeDocCount0() throws IOException { Directory dir = new RAMDirectory(); - IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(10)); - writer.setMergePolicy(new LogDocMergePolicy(writer)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(100); + LogDocMergePolicy ldmp = new LogDocMergePolicy(); + ldmp.setMergeFactor(100); + IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( + TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) + .setMaxBufferedDocs(10).setMergePolicy(ldmp)); for (int i = 0; i < 250; i++) { addDoc(writer); @@ -183,10 +188,11 @@ reader.deleteDocuments(new Term("content", "aaa")); reader.close(); - writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) - .setOpenMode(OpenMode.APPEND).setMaxBufferedDocs(10)); - writer.setMergePolicy(new LogDocMergePolicy(writer)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(5); + ldmp = new LogDocMergePolicy(); + ldmp.setMergeFactor(5); + writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, + new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode( + OpenMode.APPEND).setMaxBufferedDocs(10).setMergePolicy(ldmp)); // merge factor is changed, so check invariants after all adds for (int i = 0; i < 10; i++) { @@ -210,8 +216,8 @@ private void checkInvariants(IndexWriter writer) throws IOException { _TestUtil.syncConcurrentMerges(writer); int maxBufferedDocs = writer.getConfig().getMaxBufferedDocs(); - int mergeFactor = ((LogMergePolicy) writer.getMergePolicy()).getMergeFactor(); - int maxMergeDocs = ((LogMergePolicy) writer.getMergePolicy()).getMaxMergeDocs(); + int mergeFactor = ((LogMergePolicy) writer.getConfig().getMergePolicy()).getMergeFactor(); + int maxMergeDocs = ((LogMergePolicy) writer.getConfig().getMergePolicy()).getMaxMergeDocs(); int ramSegmentCount = writer.getNumBufferedDocuments(); assertTrue(ramSegmentCount < maxBufferedDocs); Index: src/test/org/apache/lucene/index/TestIndexWriterMerging.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexWriterMerging.java (revision 922776) +++ src/test/org/apache/lucene/index/TestIndexWriterMerging.java (working copy) @@ -58,7 +58,7 @@ Directory merged = new MockRAMDirectory(); IndexWriter writer = new IndexWriter(merged, new IndexWriterConfig(TEST_VERSION_CURRENT, new StandardAnalyzer(TEST_VERSION_CURRENT))); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(2); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(2); writer.addIndexesNoOptimize(new Directory[]{indexA, indexB}); writer.optimize(); @@ -97,7 +97,7 @@ TEST_VERSION_CURRENT, new StandardAnalyzer(TEST_VERSION_CURRENT)) .setOpenMode(OpenMode.CREATE).setMaxBufferedDocs(2)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(2); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(2); for (int i = start; i < (start + numDocs); i++) { Index: src/test/org/apache/lucene/index/TestIndexWriterReader.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexWriterReader.java (revision 922776) +++ src/test/org/apache/lucene/index/TestIndexWriterReader.java (working copy) @@ -491,8 +491,9 @@ public static void createIndex(Directory dir1, String indexName, boolean multiSegment) throws IOException { - IndexWriter w = new IndexWriter(dir1, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT))); - w.setMergePolicy(new LogDocMergePolicy(w)); + IndexWriter w = new IndexWriter(dir1, new IndexWriterConfig( + TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)) + .setMergePolicy(new LogDocMergePolicy())); for (int i = 0; i < 100; i++) { w.addDocument(createDocument(i, indexName, 4)); if (multiSegment && (i % 10) == 0) { @@ -538,7 +539,7 @@ // get a reader to put writer into near real-time mode IndexReader r1 = writer.getReader(); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(2); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(2); for (int i = 0; i < 10; i++) { writer.addDocument(createDocument(i, "test", 4)); @@ -622,7 +623,7 @@ Directory dir1 = new MockRAMDirectory(); final IndexWriter writer = new IndexWriter(dir1, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT))); writer.setInfoStream(infoStream); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(2); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(2); // create the index createIndexNoClose(false, "test", writer); @@ -699,7 +700,7 @@ Directory dir1 = new MockRAMDirectory(); final IndexWriter writer = new IndexWriter(dir1, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT))); writer.setInfoStream(infoStream); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(2); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(2); // create the index createIndexNoClose(false, "test", writer); Index: src/test/org/apache/lucene/index/TestLazyBug.java =================================================================== --- src/test/org/apache/lucene/index/TestLazyBug.java (revision 922776) +++ src/test/org/apache/lucene/index/TestLazyBug.java (working copy) @@ -73,7 +73,7 @@ Random r = newRandom(); IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( TEST_VERSION_CURRENT, new SimpleAnalyzer(TEST_VERSION_CURRENT))); - LogMergePolicy lmp = (LogMergePolicy) writer.getMergePolicy(); + LogMergePolicy lmp = (LogMergePolicy) writer.getConfig().getMergePolicy(); lmp.setUseCompoundFile(false); lmp.setUseCompoundDocStore(false); Index: src/test/org/apache/lucene/index/TestLazyProxSkipping.java =================================================================== --- src/test/org/apache/lucene/index/TestLazyProxSkipping.java (revision 922776) +++ src/test/org/apache/lucene/index/TestLazyProxSkipping.java (working copy) @@ -61,8 +61,8 @@ Directory directory = new SeekCountingDirectory(); IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(10)); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(false); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(false); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(false); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundDocStore(false); for (int i = 0; i < numDocs; i++) { Document doc = new Document(); String content; Index: src/test/org/apache/lucene/index/TestNRTReaderWithThreads.java =================================================================== --- src/test/org/apache/lucene/index/TestNRTReaderWithThreads.java (revision 922776) +++ src/test/org/apache/lucene/index/TestNRTReaderWithThreads.java (working copy) @@ -33,9 +33,9 @@ public void testIndexing() throws Exception { Directory mainDir = new MockRAMDirectory(); IndexWriter writer = new IndexWriter(mainDir, new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setMaxBufferedDocs(10)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(2); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(false); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(false); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(2); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(false); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundDocStore(false); IndexReader reader = writer.getReader(); // start pooling readers reader.close(); RunThread[] indexThreads = new RunThread[4]; Index: src/test/org/apache/lucene/index/TestNorms.java =================================================================== --- src/test/org/apache/lucene/index/TestNorms.java (revision 922776) +++ src/test/org/apache/lucene/index/TestNorms.java (working copy) @@ -103,7 +103,7 @@ IndexWriter iw = new IndexWriter(dir3, new IndexWriterConfig( TEST_VERSION_CURRENT, anlzr).setOpenMode(OpenMode.APPEND) .setMaxBufferedDocs(5)); - ((LogMergePolicy) iw.getMergePolicy()).setMergeFactor(3); + ((LogMergePolicy) iw.getConfig().getMergePolicy()).setMergeFactor(3); iw.addIndexesNoOptimize(new Directory[]{dir1,dir2}); iw.optimize(); iw.close(); @@ -121,7 +121,7 @@ // now with optimize iw = new IndexWriter(dir3, new IndexWriterConfig(TEST_VERSION_CURRENT, anlzr).setOpenMode(OpenMode.APPEND).setMaxBufferedDocs(5)); - ((LogMergePolicy) iw.getMergePolicy()).setMergeFactor(3); + ((LogMergePolicy) iw.getConfig().getMergePolicy()).setMergeFactor(3); iw.optimize(); iw.close(); verifyIndex(dir3); @@ -148,7 +148,7 @@ IndexWriter iw = new IndexWriter(dir, new IndexWriterConfig( TEST_VERSION_CURRENT, anlzr).setOpenMode(OpenMode.CREATE) .setMaxBufferedDocs(5).setSimilarity(similarityOne)); - LogMergePolicy lmp = (LogMergePolicy) iw.getMergePolicy(); + LogMergePolicy lmp = (LogMergePolicy) iw.getConfig().getMergePolicy(); lmp.setMergeFactor(3); lmp.setUseCompoundFile(true); lmp.setUseCompoundDocStore(true); @@ -192,7 +192,7 @@ IndexWriter iw = new IndexWriter(dir, new IndexWriterConfig( TEST_VERSION_CURRENT, anlzr).setOpenMode(OpenMode.APPEND) .setMaxBufferedDocs(5).setSimilarity(similarityOne)); - LogMergePolicy lmp = (LogMergePolicy) iw.getMergePolicy(); + LogMergePolicy lmp = (LogMergePolicy) iw.getConfig().getMergePolicy(); lmp.setMergeFactor(3); lmp.setUseCompoundFile(compound); lmp.setUseCompoundDocStore(compound); Index: src/test/org/apache/lucene/index/TestOmitTf.java =================================================================== --- src/test/org/apache/lucene/index/TestOmitTf.java (revision 922776) +++ src/test/org/apache/lucene/index/TestOmitTf.java (working copy) @@ -115,7 +115,7 @@ Analyzer analyzer = new StandardAnalyzer(TEST_VERSION_CURRENT); IndexWriter writer = new IndexWriter(ram, new IndexWriterConfig( TEST_VERSION_CURRENT, analyzer).setMaxBufferedDocs(3)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(2); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(2); Document d = new Document(); // this field will have Tf @@ -168,7 +168,7 @@ Analyzer analyzer = new StandardAnalyzer(TEST_VERSION_CURRENT); IndexWriter writer = new IndexWriter(ram, new IndexWriterConfig( TEST_VERSION_CURRENT, analyzer).setMaxBufferedDocs(10)); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(2); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(2); Document d = new Document(); // this field will have Tf @@ -216,7 +216,7 @@ Analyzer analyzer = new StandardAnalyzer(TEST_VERSION_CURRENT); IndexWriter writer = new IndexWriter(ram, new IndexWriterConfig( TEST_VERSION_CURRENT, analyzer).setMaxBufferedDocs(3)); - LogMergePolicy lmp = (LogMergePolicy) writer.getMergePolicy(); + LogMergePolicy lmp = (LogMergePolicy) writer.getConfig().getMergePolicy(); lmp.setMergeFactor(2); lmp.setUseCompoundFile(false); lmp.setUseCompoundDocStore(false); @@ -250,9 +250,8 @@ IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig( TEST_VERSION_CURRENT, analyzer).setMaxBufferedDocs(2) .setSimilarity(new SimpleSimilarity())); - ((LogMergePolicy) writer.getMergePolicy()).setMergeFactor(2); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setMergeFactor(2); - StringBuilder sb = new StringBuilder(265); String term = "term"; for(int i = 0; i<30; i++){ Index: src/test/org/apache/lucene/index/TestStressIndexing2.java =================================================================== --- src/test/org/apache/lucene/index/TestStressIndexing2.java (revision 922776) +++ src/test/org/apache/lucene/index/TestStressIndexing2.java (working copy) @@ -137,7 +137,7 @@ IndexWriter w = new MockIndexWriter(dir, new IndexWriterConfig( TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode(OpenMode.CREATE).setRAMBufferSizeMB( 0.1).setMaxBufferedDocs(maxBufferedDocs)); - LogMergePolicy lmp = (LogMergePolicy) w.getMergePolicy(); + LogMergePolicy lmp = (LogMergePolicy) w.getConfig().getMergePolicy(); lmp.setUseCompoundFile(false); lmp.setUseCompoundDocStore(false); lmp.setMergeFactor(mergeFactor); @@ -188,7 +188,7 @@ IndexWriter w = new MockIndexWriter(dir, new IndexWriterConfig( TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT)).setOpenMode(OpenMode.CREATE) .setRAMBufferSizeMB(0.1).setMaxBufferedDocs(maxBufferedDocs)); - LogMergePolicy lmp = (LogMergePolicy) w.getMergePolicy(); + LogMergePolicy lmp = (LogMergePolicy) w.getConfig().getMergePolicy(); lmp.setUseCompoundFile(false); lmp.setUseCompoundDocStore(false); lmp.setMergeFactor(mergeFactor); Index: src/test/org/apache/lucene/index/TestTermVectorsReader.java =================================================================== --- src/test/org/apache/lucene/index/TestTermVectorsReader.java (revision 922776) +++ src/test/org/apache/lucene/index/TestTermVectorsReader.java (working copy) @@ -93,8 +93,8 @@ Arrays.sort(tokens); IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new MyAnalyzer())); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundFile(false); - ((LogMergePolicy) writer.getMergePolicy()).setUseCompoundDocStore(false); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundFile(false); + ((LogMergePolicy) writer.getConfig().getMergePolicy()).setUseCompoundDocStore(false); Document doc = new Document(); for(int i=0;i set; + boolean success = false; + + @Override + public void run() { + try { + sleep(RAND.nextInt(10)); // sleep for a short time + set.set(new Integer(Integer.parseInt(getName().substring(2)))); + success = true; + } catch (InterruptedException e) { + // ignore + } catch (RuntimeException e) { + // TODO: change exception type + // expected. + success = false; + } + } + } + + private static final Random RAND = new Random(); + + @Test + public void testEmptyCtor() throws Exception { + SetOnce set = new SetOnce(); + assertNull(set.get()); + } + + @Test(expected=AlreadySetException.class) + public void testSettingCtor() throws Exception { + SetOnce set = new SetOnce(new Integer(5)); + assertEquals(5, set.get().intValue()); + set.set(new Integer(7)); + } + + @Test(expected=AlreadySetException.class) + public void testSetOnce() throws Exception { + SetOnce set = new SetOnce(); + set.set(new Integer(5)); + assertEquals(5, set.get().intValue()); + set.set(new Integer(7)); + } + + @Test + public void testSetMultiThreaded() throws Exception { + long seed = RAND.nextLong(); + RAND.setSeed(seed); + if (VERBOSE) { + System.out.println("testSetMultiThreaded: seed=" + seed); + } + final SetOnce set = new SetOnce(); + SetOnceThread[] threads = new SetOnceThread[10]; + for (int i = 0; i < threads.length; i++) { + threads[i] = new SetOnceThread(); + threads[i].setName("t-" + (i+1)); + threads[i].set = set; + } + + for (Thread t : threads) { + t.start(); + } + + for (Thread t : threads) { + t.join(); + } + + for (SetOnceThread t : threads) { + if (t.success) { + int expectedVal = Integer.parseInt(t.getName().substring(2)); + assertEquals("thread " + t.getName(), expectedVal, t.set.get().intValue()); + } + } + } + +} Property changes on: src\test\org\apache\lucene\util\TestSetOnce.java ___________________________________________________________________ Added: svn:keywords + Date Author Id Revision HeadURL Added: svn:eol-style + native