/// <summary>Merges the provided indexes into this index. /// <p>After this completes, the index is optimized. </p> /// <p>The provided IndexReaders are not closed.</p> /// </summary> public virtual void AddIndexes(IndexReader[] readers) { lock (this) { Optimize(); // start with zero or 1 seg System.String mergedName = NewSegmentName(); SegmentMerger merger = new SegmentMerger(this, mergedName); System.Collections.ArrayList segmentsToDelete = System.Collections.ArrayList.Synchronized(new System.Collections.ArrayList(10)); IndexReader sReader = null; if (segmentInfos.Count == 1) { // add existing index, if any sReader = SegmentReader.Get(segmentInfos.Info(0)); merger.Add(sReader); segmentsToDelete.Add(sReader); // queue segment for deletion } for (int i = 0; i < readers.Length; i++) { // add new indexes merger.Add(readers[i]); } int docCount = merger.Merge(); // merge 'em segmentInfos.RemoveRange(0, segmentInfos.Count); // pop old infos & add new segmentInfos.Add(new SegmentInfo(mergedName, docCount, directory)); if (sReader != null) { sReader.Close(); } lock (directory) { // in- & inter-process sync new AnonymousClassWith1(this, directory.MakeLock(COMMIT_LOCK_NAME), commitLockTimeout).Run(); } DeleteSegments(segmentsToDelete); // delete now-unused segments if (useCompoundFile) { System.Collections.ArrayList filesToDelete = merger.CreateCompoundFile(mergedName + ".tmp"); lock (directory) { // in- & inter-process sync new AnonymousClassWith2(mergedName, this, directory.MakeLock(COMMIT_LOCK_NAME), commitLockTimeout).Run(); } // delete now unused files of segment DeleteFiles(filesToDelete); } } }