blob: 0c50505b21ccfb6339a0548ea78be7ffb6041755 [file] [log] [blame]
Index: src/java/org/apache/lucene/index/IndexWriter.java
===================================================================
RCS file: /home/cvspublic/jakarta-lucene/src/java/org/apache/lucene/index/IndexWriter.java,v
retrieving revision 1.44
diff -u -r1.44 IndexWriter.java
--- src/java/org/apache/lucene/index/IndexWriter.java 12 Dec 2004 20:26:27 -0000 1.44
+++ src/java/org/apache/lucene/index/IndexWriter.java 18 Jan 2005 20:28:24 -0000
@@ -462,6 +462,28 @@
*/
public PrintStream infoStream = null;
+ /**
+ * Merges all segments together into a single segment, optimizing an index for search
+ * and naming the final segment with the supplied segment name.
+ *
+ * @param segmentName
+ * The name to use for the final segment if there is one.
+ * @throws IOException
+ */
+ public synchronized void optimize(String segmentName) throws IOException {
+ // it would be slightly more efficient to copy the optimize code here
+ // and conditionalize the merge when minSegment <= 0, but it seems more
+ // straightforward to not copy that code.
+ optimize();
+
+ // if there is a segment, rename it using the merge code so all the files
+ // representing the segment including the ones inside a compound index are
+ // properly renamed
+ if (segmentInfos.size() == 1) {
+ mergeSegments(0, segmentName);
+ }
+ }
+
/** Merges all segments together into a single segment, optimizing an index
for search. */
public synchronized void optimize() throws IOException {
@@ -598,11 +620,15 @@
}
}
+ private final void mergeSegments(int minSegment) throws IOException {
+ final String mergedName = newSegmentName();
+ mergeSegments(minSegment, mergedName);
+ }
+
/** Pops segments off of segmentInfos stack down to minSegment, merges them,
and pushes the merged index onto the top of the segmentInfos stack. */
- private final void mergeSegments(int minSegment)
+ private final void mergeSegments(int minSegment, final String mergedName)
throws IOException {
- final String mergedName = newSegmentName();
if (infoStream != null) infoStream.print("merging segments");
SegmentMerger merger =
new SegmentMerger(directory, mergedName);
Index: src/test/org/apache/lucene/index/TestIndexWriter.java
===================================================================
RCS file: /home/cvspublic/jakarta-lucene/src/test/org/apache/lucene/index/TestIndexWriter.java,v
retrieving revision 1.4
diff -u -r1.4 TestIndexWriter.java
--- src/test/org/apache/lucene/index/TestIndexWriter.java 10 Oct 2004 15:58:32 -0000 1.4
+++ src/test/org/apache/lucene/index/TestIndexWriter.java 18 Jan 2005 20:28:24 -0000
@@ -71,6 +71,34 @@
}
}
+ public void testOptimizeWithSegmentName()
+ {
+ Directory dir = new RAMDirectory();
+
+ IndexWriter writer = null;
+
+ try {
+ writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true);
+
+ // add 100 documents
+ for (int i = 0; i < 100; i++) {
+ addDoc(writer);
+ }
+ writer.optimize("mysegmentname");
+ writer.close();
+
+ // verify the segment is named properly
+ SegmentInfos infos = new SegmentInfos();
+ infos.read(dir);
+ assertTrue("Index does not contain a single segment.", (infos.size() == 1));
+ SegmentInfo info = infos.info(0);
+ assertEquals("mysegmentname",info.name);
+ }
+ catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
private void addDoc(IndexWriter writer)
{
Document doc = new Document();