public abstract FindForcedMerges ( |
||
segmentInfos | /// the total set of segments in the index | |
maxSegmentCount | int | /// requested maximum number of segments in the index (currently this /// is always 1) |
segmentsToMerge | bool?>.IDictionary | /// contains the specific SegmentInfo instances that must be merged /// away. this may be a subset of all /// SegmentInfos. If the value is True for a /// given SegmentInfo, that means this segment was /// an original segment present in the /// to-be-merged index; else, it was a segment /// produced by a cascaded merge. |
Результат | MergeSpecification |
public virtual void TestNoMergePolicy_Mem() { MergePolicy mp = NoMergePolicy.NO_COMPOUND_FILES; Assert.IsNull(mp.FindMerges(/*null*/ (MergeTrigger)int.MinValue, (SegmentInfos)null)); Assert.IsNull(mp.FindForcedMerges(null, 0, null)); Assert.IsNull(mp.FindForcedDeletesMerges(null)); Assert.IsFalse(mp.UseCompoundFile(null, null)); mp.Dispose(); }
public override MergeSpecification FindForcedMerges(SegmentInfos segmentInfos, int maxSegmentCount, IDictionary <SegmentCommitInfo, bool> segmentsToMerge) { // first find all old segments IDictionary <SegmentCommitInfo, bool> oldSegments = new Dictionary <SegmentCommitInfo, bool>(); foreach (SegmentCommitInfo si in segmentInfos.Segments) { if (segmentsToMerge.TryGetValue(si, out bool v) && ShouldUpgradeSegment(si)) { oldSegments[si] = v; } } if (Verbose()) { Message("findForcedMerges: segmentsToUpgrade=" + oldSegments); } if (oldSegments.Count == 0) { return(null); } MergeSpecification spec = m_base.FindForcedMerges(segmentInfos, maxSegmentCount, oldSegments); if (spec != null) { // remove all segments that are in merge specification from oldSegments, // the resulting set contains all segments that are left over // and will be merged to one additional segment: foreach (OneMerge om in spec.Merges) { foreach (SegmentCommitInfo sipc in om.Segments) { oldSegments.Remove(sipc); } } } if (oldSegments.Count > 0) { if (Verbose()) { Message("findForcedMerges: " + m_base.GetType().Name + " does not want to merge all old segments, merge remaining ones into new segment: " + oldSegments); } IList <SegmentCommitInfo> newInfos = new JCG.List <SegmentCommitInfo>(); foreach (SegmentCommitInfo si in segmentInfos.Segments) { if (oldSegments.ContainsKey(si)) { newInfos.Add(si); } } // add the final merge if (spec is null) { spec = new MergeSpecification(); } spec.Add(new OneMerge(newInfos)); } return(spec); }