Index: CHANGES.txt =================================================================== --- CHANGES.txt (revision 581627) +++ CHANGES.txt (working copy) @@ -381,6 +381,12 @@ 23. LUCENE-913: Two consecutive score() calls return different scores for Boolean Queries. (Michael Busch, Doron Cohen) +24. LUCENE-1013: Fix IndexWriter.setMaxMergeDocs to work "out of the + box", again, by moving set/getMaxMergeDocs up from + LogDocMergePolicy into LogMergePolicy. This fixes the API + breakage (non backwards compatible change) caused by LUCENE-994. + (Yonik Seely via Mike McCandless) + New features 1. LUCENE-759: Added two n-gram-producing TokenFilters. Index: src/test/org/apache/lucene/index/TestIndexWriter.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexWriter.java (revision 581627) +++ src/test/org/apache/lucene/index/TestIndexWriter.java (working copy) @@ -1583,4 +1583,39 @@ iw.close(); dir.close(); } + + // Just intercepts all merges & verifies that we are never + // merging a segment with >= 20 (maxMergeDocs) docs + private class MyMergeScheduler implements MergeScheduler { + synchronized public void merge(IndexWriter writer) + throws CorruptIndexException, IOException { + + while(true) { + MergePolicy.OneMerge merge = writer.getNextMerge(); + if (merge == null) + break; + for(int i=0;i maxMergeDocs && info.dir != directory) + throw new IllegalArgumentException("Segment is too large (" + info.docCount + " docs vs max docs " + maxMergeDocs + ")"); + if (size >= maxMergeSize && info.dir != directory) throw new IllegalArgumentException("Segment is too large (" + size + " vs max size " + maxMergeSize + ")"); @@ -281,8 +289,10 @@ int end = start + mergeFactor; while(end <= 1+upto) { boolean anyTooLarge = false; - for(int i=start;i= maxMergeSize; + for(int i=start;i= maxMergeSize || info.docCount >= maxMergeDocs); + } if (!anyTooLarge) { if (spec == null) @@ -298,4 +308,18 @@ return spec; } + + /** Sets the maximum docs for a segment to be merged. + * When a segment has this many docs or more it will never be + * merged. */ + public void setMaxMergeDocs(int maxMergeDocs) { + this.maxMergeDocs = maxMergeDocs; + } + + /** Get the maximum docs for a segment to be merged. + * @see #setMaxMergeDocs */ + public int getMaxMergeDocs() { + return maxMergeDocs; + } + } Index: src/java/org/apache/lucene/index/IndexWriter.java =================================================================== --- src/java/org/apache/lucene/index/IndexWriter.java (revision 581627) +++ src/java/org/apache/lucene/index/IndexWriter.java (working copy) @@ -327,13 +327,6 @@ throw new IllegalArgumentException("this method can only be called when the merge policy is the default LogMergePolicy"); } - private LogDocMergePolicy getLogDocMergePolicy() { - if (mergePolicy instanceof LogDocMergePolicy) - return (LogDocMergePolicy) mergePolicy; - else - throw new IllegalArgumentException("this method can only be called when the merge policy is LogDocMergePolicy"); - } - /**

Get the current setting of whether newly flushed * segments will use the compound file format. Note that * this just returns the value previously set with @@ -793,7 +786,7 @@ * Otherwise an IllegalArgumentException is thrown.

*/ public void setMaxMergeDocs(int maxMergeDocs) { - getLogDocMergePolicy().setMaxMergeDocs(maxMergeDocs); + getLogMergePolicy().setMaxMergeDocs(maxMergeDocs); } /** @@ -808,7 +801,7 @@ * @see #setMaxMergeDocs */ public int getMaxMergeDocs() { - return getLogDocMergePolicy().getMaxMergeDocs(); + return getLogMergePolicy().getMaxMergeDocs(); } /**