public override bool MoveNext() { return(Adjust(spans.MoveNext())); }
/// <summary> /// The <see cref="SubSpans"/> are ordered in the same doc, so there is a possible match. /// Compute the slop while making the match as short as possible by advancing /// all <see cref="SubSpans"/> except the last one in reverse order. /// </summary> private bool ShrinkToAfterShortestMatch() { matchStart = subSpans[subSpans.Length - 1].Start; matchEnd = subSpans[subSpans.Length - 1].End; var possibleMatchPayloads = new JCG.HashSet <byte[]>(); if (subSpans[subSpans.Length - 1].IsPayloadAvailable) { possibleMatchPayloads.UnionWith(subSpans[subSpans.Length - 1].GetPayload()); } IList <byte[]> possiblePayload = null; int matchSlop = 0; int lastStart = matchStart; int lastEnd = matchEnd; for (int i = subSpans.Length - 2; i >= 0; i--) { Spans prevSpans = subSpans[i]; if (collectPayloads && prevSpans.IsPayloadAvailable) { possiblePayload = new List <byte[]>(prevSpans.GetPayload()); // LUCENENET specific - using copy constructor instead of AddRange() } int prevStart = prevSpans.Start; int prevEnd = prevSpans.End; while (true) // Advance prevSpans until after (lastStart, lastEnd) { if (!prevSpans.MoveNext()) { inSameDoc = false; more = false; break; // Check remaining subSpans for final match. } else if (matchDoc != prevSpans.Doc) { inSameDoc = false; // The last subSpans is not advanced here. break; // Check remaining subSpans for last match in this document. } else { int ppStart = prevSpans.Start; int ppEnd = prevSpans.End; // Cannot avoid invoking .end() if (!DocSpansOrdered(ppStart, ppEnd, lastStart, lastEnd)) { break; // Check remaining subSpans. } // prevSpans still before (lastStart, lastEnd) else { prevStart = ppStart; prevEnd = ppEnd; if (collectPayloads && prevSpans.IsPayloadAvailable) { possiblePayload = new List <byte[]>(prevSpans.GetPayload()); // LUCENENET specific - using copy constructor instead of AddRange() } } } } if (collectPayloads && possiblePayload != null) { possibleMatchPayloads.UnionWith(possiblePayload); } if (Debugging.AssertsEnabled) { Debugging.Assert(prevStart <= matchStart); } if (matchStart > prevEnd) // Only non overlapping spans add to slop. { matchSlop += (matchStart - prevEnd); } /* Do not break on (matchSlop > allowedSlop) here to make sure * that subSpans[0] is advanced after the match, if any. */ matchStart = prevStart; lastStart = prevStart; lastEnd = prevEnd; } bool match = matchSlop <= allowedSlop; if (collectPayloads && match && possibleMatchPayloads.Count > 0) { matchPayload.AddRange(possibleMatchPayloads); } return(match); // ordered and allowed slop }