Esempio n. 1
0
        /// <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);
                }
            }
        }