/// <summary>Merges all segments together into a single segment, optimizing an index
 /// for search.
 /// </summary>
 public virtual void  Optimize()
 {
     lock (this)
     {
         FlushRamSegments();
         while (segmentInfos.Count > 1 || (segmentInfos.Count == 1 && (SegmentReader.HasDeletions(segmentInfos.Info(0)) || segmentInfos.Info(0).dir != directory || (useCompoundFile && (!SegmentReader.UsesCompoundFile(segmentInfos.Info(0)) || SegmentReader.HasSeparateNorms(segmentInfos.Info(0)))))))
         {
             int minSegment = segmentInfos.Count - mergeFactor;
             MergeSegments(minSegment < 0?0:minSegment);
         }
     }
 }