Index: lucene/core/src/java/org/apache/lucene/index/MergePolicy.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/index/MergePolicy.java	(révision 1457322)
+++ lucene/core/src/java/org/apache/lucene/index/MergePolicy.java	(copie de travail)
@@ -377,6 +377,13 @@
   public abstract MergeSpecification findForcedDeletesMerges(
       SegmentInfos segmentInfos) throws IOException;
 
+  /** <b>Expert</b>: How to view the readers to merge. Override this method to
+   *  reorder doc IDs. By default, this method returns the readers as-is which
+   *  allows for using codec-specific bulk-merge methods. */
+  public List<AtomicReader> reorder(List<AtomicReader> readers) throws IOException {
+    return readers;
+  }
+
   /**
    * Release all resources for the policy.
    */
Index: lucene/core/src/java/org/apache/lucene/index/SegmentMerger.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/index/SegmentMerger.java	(révision 1457322)
+++ lucene/core/src/java/org/apache/lucene/index/SegmentMerger.java	(copie de travail)
@@ -66,17 +66,7 @@
     this.fieldInfosBuilder = new FieldInfos.Builder(fieldNumbers);
   }
 
-  /**
-   * Add an IndexReader to the collection of readers that are to be merged
-   */
-  void add(IndexReader reader) {
-    for (final AtomicReaderContext ctx : reader.leaves()) {
-      final AtomicReader r = ctx.reader();
-      mergeState.readers.add(r);
-    }
-  }
-
-  void add(SegmentReader reader) {
+  void add(AtomicReader reader) {
     mergeState.readers.add(reader);
   }
 
Index: lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/index/IndexWriter.java	(révision 1457322)
+++ lucene/core/src/java/org/apache/lucene/index/IndexWriter.java	(copie de travail)
@@ -2395,9 +2395,15 @@
       flush(false, true);
 
       String mergedName = newSegmentName();
+      List<AtomicReader> readersToMerge = new ArrayList<AtomicReader>();
       for (IndexReader indexReader : readers) {
         numDocs += indexReader.numDocs();
+        for (AtomicReaderContext leave : indexReader.leaves()) {
+          readersToMerge.add(leave.reader());
+        }
       }
+      readersToMerge = mergePolicy.reorder(readersToMerge);
+
       final IOContext context = new IOContext(new MergeInfo(numDocs, -1, true, -1));
 
       // TODO: somehow we should fix this merge so it's
@@ -2410,7 +2416,7 @@
       SegmentMerger merger = new SegmentMerger(info, infoStream, trackingDir, config.getTermIndexInterval(),
                                                MergeState.CheckAbort.NONE, globalFieldNumberMap, context);
 
-      for (IndexReader reader : readers) {    // add new indexes
+      for (AtomicReader reader : readersToMerge) {    // add new indexes
         merger.add(reader);
       }
 
@@ -3575,6 +3581,7 @@
     boolean success = false;
     try {
       int segUpto = 0;
+      List<AtomicReader> readersToMerge = new ArrayList<AtomicReader>();
       while(segUpto < sourceSegments.size()) {
 
         final SegmentInfoPerCommit info = sourceSegments.get(segUpto);
@@ -3634,10 +3641,14 @@
         merge.readers.add(reader);
         assert delCount <= info.info.getDocCount(): "delCount=" + delCount + " info.docCount=" + info.info.getDocCount() + " rld.pendingDeleteCount=" + rld.getPendingDeleteCount() + " info.getDelCount()=" + info.getDelCount();
         if (delCount < info.info.getDocCount()) {
-          merger.add(reader);
+          readersToMerge.add(reader);
         }
         segUpto++;
       }
+      readersToMerge = mergePolicy.reorder(readersToMerge);
+      for (AtomicReader reader : readersToMerge) {
+        merger.add(reader);
+      }
 
       merge.checkAborted(directory);
 
Index: lucene/misc/src/java/org/apache/lucene/index/sorter/SortingMergePolicy.java
===================================================================
--- lucene/misc/src/java/org/apache/lucene/index/sorter/SortingMergePolicy.java	(révision 0)
+++ lucene/misc/src/java/org/apache/lucene/index/sorter/SortingMergePolicy.java	(copie de travail)
@@ -0,0 +1,94 @@
+package org.apache.lucene.index.sorter;
+
+/*
+ * 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 java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.lucene.index.AtomicReader;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.MergePolicy;
+import org.apache.lucene.index.MultiReader;
+import org.apache.lucene.index.SegmentInfoPerCommit;
+import org.apache.lucene.index.SegmentInfos;
+import org.apache.lucene.index.SlowCompositeReaderWrapper;
+
+/** A {@link MergePolicy} that reorders documents according to a {@link Sorter}. */
+public final class SortingMergePolicy extends MergePolicy {
+
+  private final MergePolicy in;
+  private final Sorter sorter;
+
+  /** Create a new {@link MergePolicy} that sorts with <code>sorter</code>. */
+  public SortingMergePolicy(MergePolicy in, Sorter sorter) {
+    this.in = in;
+    this.sorter = sorter;
+  }
+
+  @Override
+  public MergeSpecification findMerges(MergeTrigger mergeTrigger,
+      SegmentInfos segmentInfos) throws IOException {
+    return in.findMerges(mergeTrigger, segmentInfos);
+  }
+  
+  @Override
+  public MergeSpecification findForcedMerges(SegmentInfos segmentInfos,
+      int maxSegmentCount, Map<SegmentInfoPerCommit,Boolean> segmentsToMerge)
+      throws IOException {
+    return in.findForcedMerges(segmentInfos, maxSegmentCount, segmentsToMerge);
+  }
+  
+  @Override
+  public MergeSpecification findForcedDeletesMerges(SegmentInfos segmentInfos)
+      throws IOException {
+    return in.findForcedDeletesMerges(segmentInfos);
+  }
+  
+  @Override
+  public void close() {
+    in.close();
+  }
+
+  @Override
+  public boolean useCompoundFile(SegmentInfos segments,
+      SegmentInfoPerCommit newSegment) throws IOException {
+    return in.useCompoundFile(segments, newSegment);
+  }
+
+  @Override
+  public List<AtomicReader> reorder(List<AtomicReader> readers) throws IOException {
+    switch (readers.size()) {
+      case 0:
+        return readers;
+      case 1:
+        return Collections.singletonList(SortingAtomicReader.sort(readers.get(0), sorter));
+      default:
+        final IndexReader multiReader = new MultiReader(readers.toArray(new AtomicReader[readers.size()]));
+        final AtomicReader atomicReader = SlowCompositeReaderWrapper.wrap(multiReader);
+        final AtomicReader sortingReader = SortingAtomicReader.sort(atomicReader, sorter);
+        if (sortingReader == atomicReader) {
+          // already sorted
+          return readers;
+        }
+        return Collections.singletonList(sortingReader);
+    }
+  }
+
+}

Modification de propriétés sur lucene/misc/src/java/org/apache/lucene/index/sorter/SortingMergePolicy.java
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
