mirror of https://github.com/apache/lucene.git
LUCENE-3061: Open IndexWriter API to allow custom MergeScheduler implementation
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1098576 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a75e5282c7
commit
fda913a790
|
@ -280,6 +280,10 @@ API Changes
|
|||
* LUCENE-2953: In addition to changes in 3.x, PriorityQueue#initialize(int)
|
||||
function was moved into the ctor. (Uwe Schindler, Yonik Seeley)
|
||||
|
||||
* LUCENE-3061: IndexWriter's getNextMerge() and merge(OneMerge) are now public
|
||||
(though @lucene.experimental), allowing for custom MergeScheduler
|
||||
implementations. (Shai Erera)
|
||||
|
||||
New features
|
||||
|
||||
* LUCENE-2604: Added RegexpQuery support to QueryParser. Regular expressions
|
||||
|
|
|
@ -1813,10 +1813,13 @@ public class IndexWriter implements Closeable {
|
|||
return mergingSegments;
|
||||
}
|
||||
|
||||
/** Expert: the {@link MergeScheduler} calls this method
|
||||
* to retrieve the next merge requested by the
|
||||
* MergePolicy */
|
||||
synchronized MergePolicy.OneMerge getNextMerge() {
|
||||
/**
|
||||
* Expert: the {@link MergeScheduler} calls this method to retrieve the next
|
||||
* merge requested by the MergePolicy
|
||||
*
|
||||
* @lucene.experimental
|
||||
*/
|
||||
public synchronized MergePolicy.OneMerge getNextMerge() {
|
||||
if (pendingMerges.size() == 0)
|
||||
return null;
|
||||
else {
|
||||
|
@ -2936,9 +2939,10 @@ public class IndexWriter implements Closeable {
|
|||
/**
|
||||
* Merges the indicated segments, replacing them in the stack with a
|
||||
* single segment.
|
||||
*
|
||||
* @lucene.experimental
|
||||
*/
|
||||
|
||||
final void merge(MergePolicy.OneMerge merge)
|
||||
public final void merge(MergePolicy.OneMerge merge)
|
||||
throws CorruptIndexException, IOException {
|
||||
|
||||
boolean success = false;
|
||||
|
|
|
@ -19,17 +19,21 @@ package org.apache.lucene;
|
|||
import java.io.IOException;
|
||||
|
||||
import org.apache.lucene.util.LuceneTestCase;
|
||||
import org.apache.lucene.store.Directory;
|
||||
import org.apache.lucene.store.MockDirectoryWrapper;
|
||||
import org.apache.lucene.store.RAMDirectory;
|
||||
import org.apache.lucene.index.CorruptIndexException;
|
||||
import org.apache.lucene.index.IndexWriter;
|
||||
import org.apache.lucene.index.IndexWriterConfig;
|
||||
import org.apache.lucene.index.LogMergePolicy;
|
||||
import org.apache.lucene.index.MergePolicy;
|
||||
import org.apache.lucene.index.ConcurrentMergeScheduler;
|
||||
import org.apache.lucene.index.MergeScheduler;
|
||||
import org.apache.lucene.index.MergePolicy.OneMerge;
|
||||
import org.apache.lucene.analysis.MockAnalyzer;
|
||||
import org.apache.lucene.document.Document;
|
||||
import org.apache.lucene.document.Field;
|
||||
|
||||
|
||||
/**
|
||||
* Holds tests cases to verify external APIs are accessible
|
||||
* while not being in org.apache.lucene.index package.
|
||||
|
@ -106,4 +110,40 @@ public class TestMergeSchedulerExternal extends LuceneTestCase {
|
|||
assertTrue(excCalled);
|
||||
dir.close();
|
||||
}
|
||||
|
||||
private static class ReportingMergeScheduler extends MergeScheduler {
|
||||
|
||||
@Override
|
||||
public void merge(IndexWriter writer) throws CorruptIndexException, IOException {
|
||||
OneMerge merge = null;
|
||||
while ((merge = writer.getNextMerge()) != null) {
|
||||
if (VERBOSE) {
|
||||
System.out.println("executing merge " + merge.segString(writer.getDirectory()));
|
||||
}
|
||||
writer.merge(merge);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws CorruptIndexException, IOException {}
|
||||
|
||||
}
|
||||
|
||||
public void testCustomMergeScheduler() throws Exception {
|
||||
// we don't really need to execute anything, just to make sure the custom MS
|
||||
// compiles. But ensure that it can be used as well, e.g., no other hidden
|
||||
// dependencies or something. Therefore, don't use any random API !
|
||||
Directory dir = new RAMDirectory();
|
||||
IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, null);
|
||||
conf.setMergeScheduler(new ReportingMergeScheduler());
|
||||
IndexWriter writer = new IndexWriter(dir, conf);
|
||||
writer.addDocument(new Document());
|
||||
writer.commit(); // trigger flush
|
||||
writer.addDocument(new Document());
|
||||
writer.commit(); // trigger flush
|
||||
writer.optimize();
|
||||
writer.close();
|
||||
dir.close();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue