This is an automated email from the ASF dual-hosted git repository. nightowl888 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/lucenenet.git
commit e9758a9b1a15a7deec32dd44534d2a5425e86970 Author: Shad Storhaug <[email protected]> AuthorDate: Thu Aug 27 13:04:07 2020 +0700 Cascade calls from Next() to MoveNext() in TermsEnum implementations (see #279, #212) --- .../BlockTerms/BlockTermsReader.cs | 33 +-- .../Memory/DirectPostingsFormat.cs | 307 +-------------------- src/Lucene.Net.Codecs/Memory/FSTOrdTermsReader.cs | 52 +--- src/Lucene.Net.Codecs/Memory/FSTTermsReader.cs | 52 +--- .../Memory/MemoryDocValuesProducer.cs | 3 +- .../Memory/MemoryPostingsFormat.cs | 15 +- .../SimpleText/SimpleTextFieldsReader.cs | 18 +- .../SimpleText/SimpleTextTermVectorsReader.cs | 10 +- .../MemoryIndex.MemoryIndexReader.cs | 11 +- src/Lucene.Net.Queries/TermsFilter.cs | 29 +- .../Codecs/RAMOnly/RAMOnlyPostingsFormat.cs | 11 +- .../Index/AssertingAtomicReader.cs | 14 +- .../Index/TestFilterAtomicReader.cs | 10 +- src/Lucene.Net/Codecs/BlockTreeTermsReader.cs | 275 +----------------- .../Compressing/CompressingTermVectorsReader.cs | 23 +- src/Lucene.Net/Codecs/Lucene3x/Lucene3xFields.cs | 78 +----- .../Codecs/Lucene3x/Lucene3xTermVectorsReader.cs | 8 +- .../Codecs/Lucene40/Lucene40TermVectorsReader.cs | 67 +---- .../Codecs/Lucene42/Lucene42DocValuesProducer.cs | 12 +- .../Codecs/Lucene45/Lucene45DocValuesProducer.cs | 31 +-- src/Lucene.Net/Index/DocTermOrds.cs | 13 +- src/Lucene.Net/Index/FilterAtomicReader.cs | 4 +- src/Lucene.Net/Index/FilteredTermsEnum.cs | 63 +---- src/Lucene.Net/Index/MultiTermsEnum.cs | 31 +-- src/Lucene.Net/Index/SortedDocValuesTermsEnum.cs | 10 +- .../Index/SortedSetDocValuesTermsEnum.cs | 10 +- src/Lucene.Net/Index/TermsEnum.cs | 2 +- src/Lucene.Net/Search/FuzzyTermsEnum.cs | 31 +-- src/Lucene.Net/Util/Fst/BytesRefFSTEnum.cs | 5 +- 29 files changed, 116 insertions(+), 1112 deletions(-) diff --git a/src/Lucene.Net.Codecs/BlockTerms/BlockTermsReader.cs b/src/Lucene.Net.Codecs/BlockTerms/BlockTermsReader.cs index 269b0e3..e2758e6 100644 --- a/src/Lucene.Net.Codecs/BlockTerms/BlockTermsReader.cs +++ b/src/Lucene.Net.Codecs/BlockTerms/BlockTermsReader.cs @@ -714,36 +714,9 @@ namespace Lucene.Net.Codecs.BlockTerms public override BytesRef Next() { - //System.out.println("BTR.next() seekPending=" + seekPending + " pendingSeekCount=" + state.termBlockOrd); - - // If seek was previously called and the term was cached, - // usually caller is just going to pull a D/&PEnum or get - // docFreq, etc. But, if they then call next(), - // this method catches up all internal state so next() - // works properly: - if (seekPending) - { - if (Debugging.AssertsEnabled) Debugging.Assert(!indexIsCurrent); - input.Seek(state.BlockFilePointer); - int pendingSeekCount = state.TermBlockOrd; - bool result = NextBlock(); - - long savOrd = state.Ord; - - // Block must exist since seek(TermState) was called w/ a - // TermState previously returned by this enum when positioned - // on a real term: - if (Debugging.AssertsEnabled) Debugging.Assert(result); - - while (state.TermBlockOrd < pendingSeekCount) - { - BytesRef nextResult = _next(); - if (Debugging.AssertsEnabled) Debugging.Assert(nextResult != null); - } - seekPending = false; - state.Ord = savOrd; - } - return _next(); + if (MoveNext()) + return term; + return null; } /// <summary> diff --git a/src/Lucene.Net.Codecs/Memory/DirectPostingsFormat.cs b/src/Lucene.Net.Codecs/Memory/DirectPostingsFormat.cs index 114d77d..fa41e68 100644 --- a/src/Lucene.Net.Codecs/Memory/DirectPostingsFormat.cs +++ b/src/Lucene.Net.Codecs/Memory/DirectPostingsFormat.cs @@ -182,7 +182,7 @@ namespace Lucene.Net.Codecs.Memory long sizeInBytes = 0; foreach (KeyValuePair<string, DirectField> entry in fields) { - sizeInBytes += entry.Key.Length*RamUsageEstimator.NUM_BYTES_CHAR; + sizeInBytes += entry.Key.Length* RamUsageEstimator.NUM_BYTES_CHAR; sizeInBytes += entry.Value.RamBytesUsed(); } return sizeInBytes; @@ -881,15 +881,9 @@ namespace Lucene.Net.Codecs.Memory public override BytesRef Next() { - termOrd++; - if (termOrd < outerInstance.terms.Length) - { - return SetTerm(); - } - else - { - return null; - } + if (MoveNext()) + return scratch; + return null; } public override TermState GetTermState() @@ -1689,296 +1683,9 @@ namespace Lucene.Net.Codecs.Memory public override BytesRef Next() { - // if (DEBUG) { - // System.out.println("\nIE.next"); - // } - - termOrd++; - int skipUpto = 0; - - if (termOrd == 0 && outerInstance.termOffsets[1] == 0) - { - // Special-case empty string: - if (Debugging.AssertsEnabled) Debugging.Assert(stateUpto == 0); - // if (DEBUG) { - // System.out.println(" visit empty string"); - // } - if (runAutomaton.IsAccept(states[0].state)) - { - scratch.Bytes = outerInstance.termBytes; - scratch.Offset = 0; - scratch.Length = 0; - return scratch; - } - termOrd++; - } - - - while (true) - { - // if (DEBUG) { - // System.out.println(" cycle termOrd=" + termOrd + " stateUpto=" + stateUpto + " skipUpto=" + skipUpto); - // } - if (termOrd == outerInstance.terms.Length) - { - // if (DEBUG) { - // System.out.println(" return END"); - // } - return null; - } - - State state = states[stateUpto]; - if (termOrd == state.changeOrd) - { - // Pop: - // if (DEBUG) { - // System.out.println(" pop stateUpto=" + stateUpto); - // } - stateUpto--; - - continue; - } - - int termOffset = outerInstance.termOffsets[termOrd]; - int termLength = outerInstance.termOffsets[termOrd + 1] - termOffset; - int skipOffset = outerInstance.skipOffsets[termOrd]; - int numSkips = outerInstance.skipOffsets[termOrd + 1] - skipOffset; - - // if (DEBUG) { - // System.out.println(" term=" + new BytesRef(termBytes, termOffset, termLength).utf8ToString() + " skips=" + Arrays.toString(skips)); - // } - - if (Debugging.AssertsEnabled) Debugging.Assert(termOrd < state.changeOrd); - - if (Debugging.AssertsEnabled) Debugging.Assert(stateUpto <= termLength, () => "term.length=" + termLength + "; stateUpto=" + stateUpto); - int label = outerInstance.termBytes[termOffset + stateUpto] & 0xFF; - - while (label > state.transitionMax) - { - //System.out.println(" label=" + label + " vs max=" + state.transitionMax + " transUpto=" + state.transitionUpto + " vs " + state.transitions.length); - state.transitionUpto++; - if (state.transitionUpto == state.transitions.Length) - { - // We've exhausted transitions leaving this - // state; force pop+next/skip now: - //System.out.println("forcepop: stateUpto=" + stateUpto); - if (stateUpto == 0) - { - termOrd = outerInstance.terms.Length; - return null; - } - else - { - if (Debugging.AssertsEnabled) Debugging.Assert(state.changeOrd > termOrd); - // if (DEBUG) { - // System.out.println(" jumpend " + (state.changeOrd - termOrd)); - // } - //System.out.println(" jump to termOrd=" + states[stateUpto].changeOrd + " vs " + termOrd); - termOrd = states[stateUpto].changeOrd; - skipUpto = 0; - stateUpto--; - } - goto nextTermContinue; - } - if (Debugging.AssertsEnabled) Debugging.Assert(state.transitionUpto < state.transitions.Length, - () => " state.transitionUpto=" + state.transitionUpto + " vs " + state.transitions.Length); - state.transitionMin = state.transitions[state.transitionUpto].Min; - state.transitionMax = state.transitions[state.transitionUpto].Max; - if (Debugging.AssertsEnabled) - { - Debugging.Assert(state.transitionMin >= 0); - Debugging.Assert(state.transitionMin <= 255); - Debugging.Assert(state.transitionMax >= 0); - Debugging.Assert(state.transitionMax <= 255); - } - } - - int targetLabel = state.transitionMin; - - if ((outerInstance.termBytes[termOffset + stateUpto] & 0xFF) < targetLabel) - { - // if (DEBUG) { - // System.out.println(" do bin search"); - // } - //int startTermOrd = termOrd; - int low = termOrd + 1; - int high = state.changeOrd - 1; - while (true) - { - if (low > high) - { - // Label not found - termOrd = low; - // if (DEBUG) { - // System.out.println(" advanced by " + (termOrd - startTermOrd)); - // } - //System.out.println(" jump " + (termOrd - startTermOrd)); - skipUpto = 0; - goto nextTermContinue; - } - int mid = (int) ((uint) (low + high) >> 1); - int cmp = (outerInstance.termBytes[outerInstance.termOffsets[mid] + stateUpto] & 0xFF) - - targetLabel; - // if (DEBUG) { - // System.out.println(" bin: check label=" + (char) (termBytes[termOffsets[low] + stateUpto] & 0xFF) + " ord=" + mid); - // } - if (cmp < 0) - { - low = mid + 1; - } - else if (cmp > 0) - { - high = mid - 1; - } - else - { - // Label found; walk backwards to first - // occurrence: - while (mid > termOrd && - (outerInstance.termBytes[outerInstance.termOffsets[mid - 1] + stateUpto] & - 0xFF) == targetLabel) - { - mid--; - } - termOrd = mid; - // if (DEBUG) { - // System.out.println(" advanced by " + (termOrd - startTermOrd)); - // } - //System.out.println(" jump " + (termOrd - startTermOrd)); - skipUpto = 0; - goto nextTermContinue; - } - } - } - - int nextState = runAutomaton.Step(states[stateUpto].state, label); - - if (nextState == -1) - { - // Skip - // if (DEBUG) { - // System.out.println(" automaton doesn't accept; skip"); - // } - if (skipUpto < numSkips) - { - // if (DEBUG) { - // System.out.println(" jump " + (skips[skipOffset+skipUpto]-1 - termOrd)); - // } - termOrd = outerInstance.skips[skipOffset + skipUpto]; - } - else - { - termOrd++; - } - skipUpto = 0; - } - else if (skipUpto < numSkips) - { - Grow(); - stateUpto++; - states[stateUpto].state = nextState; - states[stateUpto].changeOrd = outerInstance.skips[skipOffset + skipUpto++]; - states[stateUpto].transitions = compiledAutomaton.SortedTransitions[nextState]; - states[stateUpto].transitionUpto = -1; - states[stateUpto].transitionMax = -1; - - if (stateUpto == termLength) - { - // if (DEBUG) { - // System.out.println(" term ends after push"); - // } - if (runAutomaton.IsAccept(nextState)) - { - // if (DEBUG) { - // System.out.println(" automaton accepts: return"); - // } - scratch.Bytes = outerInstance.termBytes; - scratch.Offset = outerInstance.termOffsets[termOrd]; - scratch.Length = outerInstance.termOffsets[1 + termOrd] - scratch.Offset; - // if (DEBUG) { - // System.out.println(" ret " + scratch.utf8ToString()); - // } - return scratch; - } - else - { - // if (DEBUG) { - // System.out.println(" automaton rejects: nextTerm"); - // } - termOrd++; - skipUpto = 0; - } - } - } - else - { - // Run the non-indexed tail of this term: - - // TODO: add assert that we don't inc too many times - - if (compiledAutomaton.CommonSuffixRef != null) - { - //System.out.println("suffix " + compiledAutomaton.commonSuffixRef.utf8ToString()); - if (Debugging.AssertsEnabled) Debugging.Assert(compiledAutomaton.CommonSuffixRef.Offset == 0); - if (termLength < compiledAutomaton.CommonSuffixRef.Length) - { - termOrd++; - skipUpto = 0; - goto nextTermContinue; - } - int offset = termOffset + termLength - compiledAutomaton.CommonSuffixRef.Length; - for (int suffix = 0; suffix < compiledAutomaton.CommonSuffixRef.Length; suffix++) - { - if (outerInstance.termBytes[offset + suffix] != - compiledAutomaton.CommonSuffixRef.Bytes[suffix]) - { - termOrd++; - skipUpto = 0; - goto nextTermContinue; - } - } - } - - int upto = stateUpto + 1; - while (upto < termLength) - { - nextState = runAutomaton.Step(nextState, outerInstance.termBytes[termOffset + upto] & 0xFF); - if (nextState == -1) - { - termOrd++; - skipUpto = 0; - // if (DEBUG) { - // System.out.println(" nomatch tail; next term"); - // } - goto nextTermContinue; - } - upto++; - } - - if (runAutomaton.IsAccept(nextState)) - { - scratch.Bytes = outerInstance.termBytes; - scratch.Offset = outerInstance.termOffsets[termOrd]; - scratch.Length = outerInstance.termOffsets[1 + termOrd] - scratch.Offset; - // if (DEBUG) { - // System.out.println(" match tail; return " + scratch.utf8ToString()); - // System.out.println(" ret2 " + scratch.utf8ToString()); - // } - return scratch; - } - else - { - termOrd++; - skipUpto = 0; - // if (DEBUG) { - // System.out.println(" nomatch tail; next term"); - // } - } - } - nextTermContinue: ; - } - - //nextTermBreak: ; // LUCENENET NOTE: Not used + if (MoveNext()) + return scratch; + return null; } public override TermState GetTermState() diff --git a/src/Lucene.Net.Codecs/Memory/FSTOrdTermsReader.cs b/src/Lucene.Net.Codecs/Memory/FSTOrdTermsReader.cs index 56ed2fc..770ba1f 100644 --- a/src/Lucene.Net.Codecs/Memory/FSTOrdTermsReader.cs +++ b/src/Lucene.Net.Codecs/Memory/FSTOrdTermsReader.cs @@ -520,14 +520,9 @@ namespace Lucene.Net.Codecs.Memory public override BytesRef Next() { - if (seekPending) // previously positioned, but termOutputs not fetched - { - seekPending = false; - var status = SeekCeil(term); - if (Debugging.AssertsEnabled) Debugging.Assert(status == SeekStatus.FOUND); // must positioned on valid term - } - UpdateEnum(fstEnum.Next()); - return term; + if (MoveNext()) + return term; + return null; } public override bool SeekExact(BytesRef target) @@ -712,46 +707,9 @@ namespace Lucene.Net.Codecs.Memory public override BytesRef Next() { - //if (TEST) System.out.println("Enum next()"); - if (pending) - { - pending = false; - DecodeStats(); + if (MoveNext()) return term; - } - decoded = false; - while (level > 0) - { - Frame frame = NewFrame(); - if (LoadExpandFrame(TopFrame(), frame) != null) // has valid target - { - PushFrame(frame); - if (IsAccept(frame)) // gotcha - { - break; - } - continue; // check next target - } - frame = PopFrame(); - while (level > 0) - { - if (LoadNextFrame(TopFrame(), frame) != null) // has valid sibling - { - PushFrame(frame); - if (IsAccept(frame)) // gotcha - { - goto DFSBreak; - } - goto DFSContinue; // check next target - } - frame = PopFrame(); - } - return null; - DFSContinue:; - } - DFSBreak: - DecodeStats(); - return term; + return null; } private BytesRef DoSeekCeil(BytesRef target) diff --git a/src/Lucene.Net.Codecs/Memory/FSTTermsReader.cs b/src/Lucene.Net.Codecs/Memory/FSTTermsReader.cs index cb00f18..30ea1bc 100644 --- a/src/Lucene.Net.Codecs/Memory/FSTTermsReader.cs +++ b/src/Lucene.Net.Codecs/Memory/FSTTermsReader.cs @@ -393,14 +393,9 @@ namespace Lucene.Net.Codecs.Memory public override BytesRef Next() { - if (seekPending) // previously positioned, but termOutputs not fetched - { - seekPending = false; - SeekStatus status = SeekCeil(term); - if (Debugging.AssertsEnabled) Debugging.Assert(status == SeekStatus.FOUND); // must positioned on valid term - } - UpdateEnum(fstEnum.Next()); - return term; + if (MoveNext()) + return term; + return null; } public override bool SeekExact(BytesRef target) @@ -628,46 +623,9 @@ namespace Lucene.Net.Codecs.Memory public override BytesRef Next() { - //if (TEST) System.out.println("Enum next()"); - if (pending) - { - pending = false; - LoadMetaData(); + if (MoveNext()) return term; - } - decoded = false; - while (level > 0) - { - Frame frame = NewFrame(); - if (LoadExpandFrame(TopFrame(), frame) != null) // has valid target - { - PushFrame(frame); - if (IsAccept(frame)) // gotcha - { - break; - } - continue; // check next target - } - frame = PopFrame(); - while (level > 0) - { - if (LoadNextFrame(TopFrame(), frame) != null) // has valid sibling - { - PushFrame(frame); - if (IsAccept(frame)) // gotcha - { - goto DFSBreak; - } - goto DFSContinue; // check next target - } - frame = PopFrame(); - } - return null; - DFSContinue:; - } - DFSBreak: - LoadMetaData(); - return term; + return null; } private BytesRef DoSeekCeil(BytesRef target) diff --git a/src/Lucene.Net.Codecs/Memory/MemoryDocValuesProducer.cs b/src/Lucene.Net.Codecs/Memory/MemoryDocValuesProducer.cs index d7cf759..8d1834d 100644 --- a/src/Lucene.Net.Codecs/Memory/MemoryDocValuesProducer.cs +++ b/src/Lucene.Net.Codecs/Memory/MemoryDocValuesProducer.cs @@ -771,8 +771,7 @@ namespace Lucene.Net.Codecs.Memory public override BytesRef Next() { - var io = input.Next(); - return io == null ? null : io.Input; + return !MoveNext() ? null : input.Current.Input; } public override IComparer<BytesRef> Comparer => BytesRef.UTF8SortedAsUnicodeComparer; diff --git a/src/Lucene.Net.Codecs/Memory/MemoryPostingsFormat.cs b/src/Lucene.Net.Codecs/Memory/MemoryPostingsFormat.cs index ba87d4e..a7ff34a 100644 --- a/src/Lucene.Net.Codecs/Memory/MemoryPostingsFormat.cs +++ b/src/Lucene.Net.Codecs/Memory/MemoryPostingsFormat.cs @@ -856,26 +856,21 @@ namespace Lucene.Net.Codecs.Memory //System.out.println("te.next"); if (fstEnum.MoveNext()) { + current = fstEnum.Current; didDecode = false; //System.out.println(" term=" + field.name + ":" + current.input.utf8ToString()); return true; } + current = null; //System.out.println(" END"); return false; } public override BytesRef Next() { - //System.out.println("te.next"); - current = fstEnum.Next(); - if (current == null) - { - //System.out.println(" END"); - return null; - } - didDecode = false; - //System.out.println(" term=" + field.name + ":" + current.input.utf8ToString()); - return current.Input; + if (MoveNext()) + return current.Input; + return null; } public override int DocFreq diff --git a/src/Lucene.Net.Codecs/SimpleText/SimpleTextFieldsReader.cs b/src/Lucene.Net.Codecs/SimpleText/SimpleTextFieldsReader.cs index 8550bf0..346bdea 100644 --- a/src/Lucene.Net.Codecs/SimpleText/SimpleTextFieldsReader.cs +++ b/src/Lucene.Net.Codecs/SimpleText/SimpleTextFieldsReader.cs @@ -161,9 +161,7 @@ namespace Lucene.Net.Codecs.SimpleText public override bool MoveNext() { //if (Debugging.AssertsEnabled) Debugging.Assert(!ended); // LUCENENET: Ended field is never set, so this can never fail - var result = _fstEnum.MoveNext(); - - if (!result) return false; + if (!_fstEnum.MoveNext()) return false; var pair1 = _fstEnum.Current.Output; var pair2 = pair1.Output2; @@ -175,17 +173,9 @@ namespace Lucene.Net.Codecs.SimpleText public override BytesRef Next() { - //if (Debugging.AssertsEnabled) Debugging.Assert(!ended); // LUCENENET: Ended field is never set, so this can never fail - var result = _fstEnum.Next(); - - if (result == null) return null; - - var pair1 = result.Output; - var pair2 = pair1.Output2; - _docsStart = pair1.Output1.Value; - _docFreq = (int)pair2.Output1; - _totalTermFreq = pair2.Output2.Value; - return result.Input; + if (MoveNext()) + return _fstEnum.Current.Input; + return null; } public override BytesRef Term => _fstEnum.Current.Input; diff --git a/src/Lucene.Net.Codecs/SimpleText/SimpleTextTermVectorsReader.cs b/src/Lucene.Net.Codecs/SimpleText/SimpleTextTermVectorsReader.cs index 0b23bd6..05d5c0a 100644 --- a/src/Lucene.Net.Codecs/SimpleText/SimpleTextTermVectorsReader.cs +++ b/src/Lucene.Net.Codecs/SimpleText/SimpleTextTermVectorsReader.cs @@ -403,15 +403,9 @@ namespace Lucene.Net.Codecs.SimpleText public override BytesRef Next() { - if (_iterator.MoveNext()) - { - _current = _iterator.Current; + if (MoveNext()) return _current.Key; - } - else - { - return null; - } + return null; } public override BytesRef Term => _current.Key; diff --git a/src/Lucene.Net.Memory/MemoryIndex.MemoryIndexReader.cs b/src/Lucene.Net.Memory/MemoryIndex.MemoryIndexReader.cs index df0161f..2102858 100644 --- a/src/Lucene.Net.Memory/MemoryIndex.MemoryIndexReader.cs +++ b/src/Lucene.Net.Memory/MemoryIndex.MemoryIndexReader.cs @@ -306,16 +306,9 @@ namespace Lucene.Net.Index.Memory public override BytesRef Next() { - termUpto++; - if (termUpto >= info.terms.Count) - { - return null; - } - else - { - info.terms.Get(info.sortedTerms[termUpto], br); + if (MoveNext()) return br; - } + return null; } public override BytesRef Term => br; diff --git a/src/Lucene.Net.Queries/TermsFilter.cs b/src/Lucene.Net.Queries/TermsFilter.cs index eb13386..d546f06 100644 --- a/src/Lucene.Net.Queries/TermsFilter.cs +++ b/src/Lucene.Net.Queries/TermsFilter.cs @@ -61,8 +61,6 @@ namespace Lucene.Net.Queries private class FieldAndTermEnumAnonymousInnerClassHelper : FieldAndTermEnum { - private IList<Term> terms; - public FieldAndTermEnumAnonymousInnerClassHelper(IList<Term> terms) { if (terms.Count == 0) @@ -70,22 +68,23 @@ namespace Lucene.Net.Queries throw new ArgumentException("no terms provided"); } - this.terms = terms; terms.Sort(); iter = terms.GetEnumerator(); } // we need to sort for deduplication and to have a common cache key readonly IEnumerator<Term> iter; - public override BytesRef Next() + public override bool MoveNext() { if (iter.MoveNext()) { var next = iter.Current; Field = next.Field; - return next.Bytes; + m_current = next.Bytes; + return true; } - return null; + m_current = null; + return false; } } @@ -100,8 +99,6 @@ namespace Lucene.Net.Queries private class FieldAndTermEnumAnonymousInnerClassHelper2 : FieldAndTermEnum { - private IList<BytesRef> terms; - public FieldAndTermEnumAnonymousInnerClassHelper2(string field, IList<BytesRef> terms) : base(field) { @@ -110,20 +107,21 @@ namespace Lucene.Net.Queries throw new ArgumentException("no terms provided"); } - this.terms = terms; terms.Sort(); iter = terms.GetEnumerator(); } // we need to sort for deduplication and to have a common cache key readonly IEnumerator<BytesRef> iter; - public override BytesRef Next() + public override bool MoveNext() { if (iter.MoveNext()) { - return iter.Current; + m_current = iter.Current; + return true; } - return null; + m_current = null; + return false; } } @@ -170,8 +168,9 @@ namespace Lucene.Net.Queries string previousField = null; BytesRef currentTerm; string currentField; - while ((currentTerm = iter.Next()) != null) + while (iter.MoveNext()) { + currentTerm = iter.Current; currentField = iter.Field; if (currentField == null) { @@ -384,8 +383,10 @@ namespace Lucene.Net.Queries private abstract class FieldAndTermEnum { // LUCENENET specific - removed field and changed Field property to protected set + protected BytesRef m_current; + public BytesRef Current => m_current; - public abstract BytesRef Next(); + public abstract bool MoveNext(); public FieldAndTermEnum() { diff --git a/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs b/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs index f66e9a3..7b78fec 100644 --- a/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs +++ b/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs @@ -376,16 +376,9 @@ namespace Lucene.Net.Codecs.RAMOnly public override BytesRef Next() { - EnsureEnumeratorInitialized(); - if (it.MoveNext()) - { - current = it.Current; + if (MoveNext()) return new BytesRef(current); - } - else - { - return null; - } + return null; } private void EnsureEnumeratorInitialized() // LUCENENET specific - factored out initialization step diff --git a/src/Lucene.Net.TestFramework/Index/AssertingAtomicReader.cs b/src/Lucene.Net.TestFramework/Index/AssertingAtomicReader.cs index 0219f86..7b75bcd 100644 --- a/src/Lucene.Net.TestFramework/Index/AssertingAtomicReader.cs +++ b/src/Lucene.Net.TestFramework/Index/AssertingAtomicReader.cs @@ -457,17 +457,9 @@ namespace Lucene.Net.Index public override BytesRef Next() { if (Debugging.AssertsEnabled) Debugging.Assert(state == State.INITIAL || state == State.POSITIONED, "Next() called on unpositioned TermsEnum"); - BytesRef result = base.Next(); - if (result == null) - { - state = State.UNPOSITIONED; - } - else - { - if (Debugging.AssertsEnabled) Debugging.Assert(result.IsValid()); - state = State.POSITIONED; - } - return result; + if (MoveNext()) + return base.Term; + return null; } public override long Ord diff --git a/src/Lucene.Net.Tests/Index/TestFilterAtomicReader.cs b/src/Lucene.Net.Tests/Index/TestFilterAtomicReader.cs index a5d50d7..e3f37a2 100644 --- a/src/Lucene.Net.Tests/Index/TestFilterAtomicReader.cs +++ b/src/Lucene.Net.Tests/Index/TestFilterAtomicReader.cs @@ -91,14 +91,8 @@ namespace Lucene.Net.Index /// Scan for terms containing the letter 'e'. </summary> public override BytesRef Next() { - BytesRef text; - while ((text = m_input.Next()) != null) - { - if (text.Utf8ToString().IndexOf('e') != -1) - { - return text; - } - } + if (MoveNext()) + return m_input.Term; return null; } diff --git a/src/Lucene.Net/Codecs/BlockTreeTermsReader.cs b/src/Lucene.Net/Codecs/BlockTreeTermsReader.cs index b9c94b1..f47fa68 100644 --- a/src/Lucene.Net/Codecs/BlockTreeTermsReader.cs +++ b/src/Lucene.Net/Codecs/BlockTreeTermsReader.cs @@ -1445,174 +1445,9 @@ namespace Lucene.Net.Codecs public override BytesRef Next() { - // if (DEBUG) { - // System.out.println("\nintEnum.next seg=" + segment); - // System.out.println(" frame ord=" + currentFrame.ord + " prefix=" + brToString(new BytesRef(term.bytes, term.offset, currentFrame.prefix)) + " state=" + currentFrame.state + " lastInFloor?=" + currentFrame.isLastInFloor + " fp=" + currentFrame.fp + " trans=" + (currentFrame.transitions.length == 0 ? "n/a" : currentFrame.transitions[currentFrame.transitionIndex]) + " outputPrefix=" + currentFrame.outputPrefix); - // } - - while (true) - { - // Pop finished frames - while (currentFrame.nextEnt == currentFrame.entCount) - { - if (!currentFrame.isLastInFloor) - { - //if (DEBUG) System.out.println(" next-floor-block"); - currentFrame.LoadNextFloorBlock(); - //if (DEBUG) System.out.println("\n frame ord=" + currentFrame.ord + " prefix=" + brToString(new BytesRef(term.bytes, term.offset, currentFrame.prefix)) + " state=" + currentFrame.state + " lastInFloor?=" + currentFrame.isLastInFloor + " fp=" + currentFrame.fp + " trans=" + (currentFrame.transitions.length == 0 ? "n/a" : currentFrame.transitions[currentFrame.transitionIndex]) + " outputPrefix=" + currentFrame.outputPrefix); - } - else - { - //if (DEBUG) System.out.println(" pop frame"); - if (currentFrame.ord == 0) - { - return null; - } - long lastFP = currentFrame.fpOrig; - currentFrame = stack[currentFrame.ord - 1]; - if (Debugging.AssertsEnabled) Debugging.Assert(currentFrame.lastSubFP == lastFP); - //if (DEBUG) System.out.println("\n frame ord=" + currentFrame.ord + " prefix=" + brToString(new BytesRef(term.bytes, term.offset, currentFrame.prefix)) + " state=" + currentFrame.state + " lastInFloor?=" + currentFrame.isLastInFloor + " fp=" + currentFrame.fp + " trans=" + (currentFrame.transitions.length == 0 ? "n/a" : currentFrame.transitions[currentFrame.transitionIndex]) + " outputPrefix=" + currentFrame.outputPrefix); - } - } - - bool isSubBlock = currentFrame.Next(); - // if (DEBUG) { - // final BytesRef suffixRef = new BytesRef(); - // suffixRef.bytes = currentFrame.suffixBytes; - // suffixRef.offset = currentFrame.startBytePos; - // suffixRef.length = currentFrame.suffix; - // System.out.println(" " + (isSubBlock ? "sub-block" : "term") + " " + currentFrame.nextEnt + " (of " + currentFrame.entCount + ") suffix=" + brToString(suffixRef)); - // } - - if (currentFrame.suffix != 0) - { - int label = currentFrame.suffixBytes[currentFrame.startBytePos] & 0xff; - while (label > currentFrame.curTransitionMax) - { - if (currentFrame.transitionIndex >= currentFrame.transitions.Length - 1) - { - // Stop processing this frame -- no further - // matches are possible because we've moved - // beyond what the max transition will allow - //if (DEBUG) System.out.println(" break: trans=" + (currentFrame.transitions.length == 0 ? "n/a" : currentFrame.transitions[currentFrame.transitionIndex])); - - // sneaky! forces a pop above - currentFrame.isLastInFloor = true; - currentFrame.nextEnt = currentFrame.entCount; - goto nextTermContinue; - } - currentFrame.transitionIndex++; - currentFrame.curTransitionMax = currentFrame.transitions[currentFrame.transitionIndex].Max; - //if (DEBUG) System.out.println(" next trans=" + currentFrame.transitions[currentFrame.transitionIndex]); - } - } - - // First test the common suffix, if set: - if (compiledAutomaton.CommonSuffixRef != null && !isSubBlock) - { - int termLen = currentFrame.prefix + currentFrame.suffix; - if (termLen < compiledAutomaton.CommonSuffixRef.Length) - { - // No match - // if (DEBUG) { - // System.out.println(" skip: common suffix length"); - // } - goto nextTermContinue; - } - - byte[] suffixBytes = currentFrame.suffixBytes; - byte[] commonSuffixBytes = compiledAutomaton.CommonSuffixRef.Bytes; - - int lenInPrefix = compiledAutomaton.CommonSuffixRef.Length - currentFrame.suffix; - if (Debugging.AssertsEnabled) Debugging.Assert(compiledAutomaton.CommonSuffixRef.Offset == 0); - int suffixBytesPos; - int commonSuffixBytesPos = 0; - - if (lenInPrefix > 0) - { - // A prefix of the common suffix overlaps with - // the suffix of the block prefix so we first - // test whether the prefix part matches: - byte[] termBytes = term.Bytes; - int termBytesPos = currentFrame.prefix - lenInPrefix; - if (Debugging.AssertsEnabled) Debugging.Assert(termBytesPos >= 0); - int termBytesPosEnd = currentFrame.prefix; - while (termBytesPos < termBytesPosEnd) - { - if (termBytes[termBytesPos++] != commonSuffixBytes[commonSuffixBytesPos++]) - { - // if (DEBUG) { - // System.out.println(" skip: common suffix mismatch (in prefix)"); - // } - goto nextTermContinue; - } - } - suffixBytesPos = currentFrame.startBytePos; - } - else - { - suffixBytesPos = currentFrame.startBytePos + currentFrame.suffix - compiledAutomaton.CommonSuffixRef.Length; - } - - // Test overlapping suffix part: - int commonSuffixBytesPosEnd = compiledAutomaton.CommonSuffixRef.Length; - while (commonSuffixBytesPos < commonSuffixBytesPosEnd) - { - if (suffixBytes[suffixBytesPos++] != commonSuffixBytes[commonSuffixBytesPos++]) - { - // if (DEBUG) { - // System.out.println(" skip: common suffix mismatch"); - // } - goto nextTermContinue; - } - } - } - - // TODO: maybe we should do the same linear test - // that AutomatonTermsEnum does, so that if we - // reach a part of the automaton where .* is - // "temporarily" accepted, we just blindly .next() - // until the limit - - // See if the term prefix matches the automaton: - int state = currentFrame.state; - for (int idx = 0; idx < currentFrame.suffix; idx++) - { - state = runAutomaton.Step(state, currentFrame.suffixBytes[currentFrame.startBytePos + idx] & 0xff); - if (state == -1) - { - // No match - //System.out.println(" no s=" + state); - goto nextTermContinue; - } - else - { - //System.out.println(" c s=" + state); - } - } - - if (isSubBlock) - { - // Match! Recurse: - //if (DEBUG) System.out.println(" sub-block match to state=" + state + "; recurse fp=" + currentFrame.lastSubFP); - CopyTerm(); - currentFrame = PushFrame(state); - //if (DEBUG) System.out.println("\n frame ord=" + currentFrame.ord + " prefix=" + brToString(new BytesRef(term.bytes, term.offset, currentFrame.prefix)) + " state=" + currentFrame.state + " lastInFloor?=" + currentFrame.isLastInFloor + " fp=" + currentFrame.fp + " trans=" + (currentFrame.transitions.length == 0 ? "n/a" : currentFrame.transitions[currentFrame.transitionIndex]) + " outputPrefix=" + currentFrame.outputPrefix); - } - else if (runAutomaton.IsAccept(state)) - { - CopyTerm(); - //if (DEBUG) System.out.println(" term match to state=" + state + "; return term=" + brToString(term)); - if (Debugging.AssertsEnabled) Debugging.Assert(savedStartTerm == null || term.CompareTo(savedStartTerm) > 0, () => "saveStartTerm=" + savedStartTerm.Utf8ToString() + " term=" + term.Utf8ToString()); - return term; - } - else - { - //System.out.println(" no s=" + state); - } - nextTermContinue: ; - } - //nextTermBreak:; + if (MoveNext()) + return term; + return null; } internal void CopyTerm() @@ -2703,109 +2538,11 @@ namespace Lucene.Net.Codecs /* Decodes only the term bytes of the next term. If caller then asks for metadata, ie docFreq, totalTermFreq or pulls a D/&PEnum, we then (lazily) decode all metadata up to the current term. */ - public override BytesRef Next() { - if (@in == null) - { - // Fresh TermsEnum; seek to first term: - FST.Arc<BytesRef> arc; - if (outerInstance.index != null) - { - arc = outerInstance.index.GetFirstArc(arcs[0]); - // Empty string prefix must have an output in the index! - if (Debugging.AssertsEnabled) Debugging.Assert(arc.IsFinal); - } - else - { - arc = null; - } - currentFrame = PushFrame(arc, outerInstance.rootCode, 0); - currentFrame.LoadBlock(); - } - - targetBeforeCurrentLength = currentFrame.ord; - - if (Debugging.AssertsEnabled) Debugging.Assert(!eof); - //if (DEBUG) { - //System.out.println("\nBTTR.next seg=" + segment + " term=" + brToString(term) + " termExists?=" + termExists + " field=" + fieldInfo.name + " termBlockOrd=" + currentFrame.state.termBlockOrd + " validIndexPrefix=" + validIndexPrefix); - //printSeekState(); - //} - - if (currentFrame == staticFrame) - { - // If seek was previously called and the term was - // cached, or seek(TermState) was called, usually - // caller is just going to pull a D/&PEnum or get - // docFreq, etc. But, if they then call next(), - // this method catches up all internal state so next() - // works properly: - //if (DEBUG) System.out.println(" re-seek to pending term=" + term.utf8ToString() + " " + term); - bool result = SeekExact(term); - if (Debugging.AssertsEnabled) Debugging.Assert(result); - } - - // Pop finished blocks - while (currentFrame.nextEnt == currentFrame.entCount) - { - if (!currentFrame.isLastInFloor) - { - currentFrame.LoadNextFloorBlock(); - } - else - { - //if (DEBUG) System.out.println(" pop frame"); - if (currentFrame.ord == 0) - { - //if (DEBUG) System.out.println(" return null"); - if (Debugging.AssertsEnabled) Debugging.Assert(SetEOF()); - term.Length = 0; - validIndexPrefix = 0; - currentFrame.Rewind(); - termExists = false; - return null; - } - long lastFP = currentFrame.fpOrig; - currentFrame = stack[currentFrame.ord - 1]; - - if (currentFrame.nextEnt == -1 || currentFrame.lastSubFP != lastFP) - { - // We popped into a frame that's not loaded - // yet or not scan'd to the right entry - currentFrame.ScanToFloorFrame(term); - currentFrame.LoadBlock(); - currentFrame.ScanToSubBlock(lastFP); - } - - // Note that the seek state (last seek) has been - // invalidated beyond this depth - validIndexPrefix = Math.Min(validIndexPrefix, currentFrame.prefix); - //if (DEBUG) { - //System.out.println(" reset validIndexPrefix=" + validIndexPrefix); - //} - } - } - - while (true) - { - if (currentFrame.Next()) - { - // Push to new block: - //if (DEBUG) System.out.println(" push frame"); - currentFrame = PushFrame(null, currentFrame.lastSubFP, term.Length); - // this is a "next" frame -- even if it's - // floor'd we must pretend it isn't so we don't - // try to scan to the right floor frame: - currentFrame.isFloor = false; - //currentFrame.hasTerms = true; - currentFrame.LoadBlock(); - } - else - { - //if (DEBUG) System.out.println(" return term=" + term.utf8ToString() + " " + term + " currentFrame.ord=" + currentFrame.ord); - return term; - } - } + if (MoveNext()) + return term; + return null; } public override BytesRef Term diff --git a/src/Lucene.Net/Codecs/Compressing/CompressingTermVectorsReader.cs b/src/Lucene.Net/Codecs/Compressing/CompressingTermVectorsReader.cs index de4df91..55e638f 100644 --- a/src/Lucene.Net/Codecs/Compressing/CompressingTermVectorsReader.cs +++ b/src/Lucene.Net/Codecs/Compressing/CompressingTermVectorsReader.cs @@ -862,26 +862,9 @@ namespace Lucene.Net.Codecs.Compressing public override BytesRef Next() { - if (ord == numTerms - 1) - { - return null; - } - else - { - if (Debugging.AssertsEnabled) Debugging.Assert(ord < numTerms); - ++ord; - } - - // read term - term.Offset = 0; - term.Length = prefixLengths[ord] + suffixLengths[ord]; - if (term.Length > term.Bytes.Length) - { - term.Bytes = ArrayUtil.Grow(term.Bytes, term.Length); - } - @in.ReadBytes(term.Bytes, prefixLengths[ord], suffixLengths[ord]); - - return term; + if (MoveNext()) + return term; + return null; } public override IComparer<BytesRef> Comparer => BytesRef.UTF8SortedAsUnicodeComparer; diff --git a/src/Lucene.Net/Codecs/Lucene3x/Lucene3xFields.cs b/src/Lucene.Net/Codecs/Lucene3x/Lucene3xFields.cs index 8c05305..313bf61 100644 --- a/src/Lucene.Net/Codecs/Lucene3x/Lucene3xFields.cs +++ b/src/Lucene.Net/Codecs/Lucene3x/Lucene3xFields.cs @@ -964,7 +964,7 @@ namespace Lucene.Net.Codecs.Lucene3x { if (DEBUG_SURROGATES) { - Console.WriteLine("TE.next()"); + Console.WriteLine("TE.MoveNext()"); } if (skipNext) { @@ -1043,81 +1043,9 @@ namespace Lucene.Net.Codecs.Lucene3x public override BytesRef Next() { - if (DEBUG_SURROGATES) - { - Console.WriteLine("TE.next()"); - } - if (skipNext) - { - if (DEBUG_SURROGATES) - { - Console.WriteLine(" skipNext=true"); - } - skipNext = false; - if (termEnum.Term() == null) - { - return null; - // PreFlex codec interns field names: - } - else if (termEnum.Term().Field != internedFieldName) - { - return null; - } - else - { - return current = termEnum.Term().Bytes; - } - } - - // TODO: can we use STE's prevBuffer here? - prevTerm.CopyBytes(termEnum.Term().Bytes); - - if (termEnum.Next() && termEnum.Term().Field == internedFieldName) - { - newSuffixStart = termEnum.newSuffixStart; - if (DEBUG_SURROGATES) - { - Console.WriteLine(" newSuffixStart=" + newSuffixStart); - } - SurrogateDance(); - Term t = termEnum.Term(); - if (t == null || t.Field != internedFieldName) - { - // PreFlex codec interns field names; verify: - if (Debugging.AssertsEnabled) Debugging.Assert(t == null || !t.Field.Equals(internedFieldName, StringComparison.Ordinal)); - current = null; - } - else - { - current = t.Bytes; - } + if (MoveNext()) return current; - } - else - { - // this field is exhausted, but we have to give - // surrogateDance a chance to seek back: - if (DEBUG_SURROGATES) - { - Console.WriteLine(" force cont"); - } - //newSuffixStart = prevTerm.length; - newSuffixStart = 0; - SurrogateDance(); - - Term t = termEnum.Term(); - if (t == null || t.Field != internedFieldName) - { - // PreFlex codec interns field names; verify: - if (Debugging.AssertsEnabled) Debugging.Assert(t == null || !t.Field.Equals(internedFieldName, StringComparison.Ordinal)); - return null; - } - else - { - current = t.Bytes; - return current; - } - } + return null; } public override BytesRef Term => current; diff --git a/src/Lucene.Net/Codecs/Lucene3x/Lucene3xTermVectorsReader.cs b/src/Lucene.Net/Codecs/Lucene3x/Lucene3xTermVectorsReader.cs index f3e0b8a..b946629 100644 --- a/src/Lucene.Net/Codecs/Lucene3x/Lucene3xTermVectorsReader.cs +++ b/src/Lucene.Net/Codecs/Lucene3x/Lucene3xTermVectorsReader.cs @@ -558,11 +558,9 @@ namespace Lucene.Net.Codecs.Lucene3x public override BytesRef Next() { - if (++currentTerm >= numTerms) - { - return null; - } - return Term; + if (MoveNext()) + return Term; + return null; } public override BytesRef Term => termAndPostings[currentTerm].Term; diff --git a/src/Lucene.Net/Codecs/Lucene40/Lucene40TermVectorsReader.cs b/src/Lucene.Net/Codecs/Lucene40/Lucene40TermVectorsReader.cs index 474bc8e..69afcb5 100644 --- a/src/Lucene.Net/Codecs/Lucene40/Lucene40TermVectorsReader.cs +++ b/src/Lucene.Net/Codecs/Lucene40/Lucene40TermVectorsReader.cs @@ -557,70 +557,9 @@ namespace Lucene.Net.Codecs.Lucene40 public override BytesRef Next() { - if (nextTerm >= numTerms) - { - return null; - } - term.CopyBytes(lastTerm); - int start = tvf.ReadVInt32(); - int deltaLen = tvf.ReadVInt32(); - term.Length = start + deltaLen; - term.Grow(term.Length); - tvf.ReadBytes(term.Bytes, start, deltaLen); - freq = tvf.ReadVInt32(); - - if (storePayloads) - { - positions = new int[freq]; - payloadOffsets = new int[freq]; - int totalPayloadLength = 0; - int pos = 0; - for (int posUpto = 0; posUpto < freq; posUpto++) - { - int code = tvf.ReadVInt32(); - pos += (int)((uint)code >> 1); - positions[posUpto] = pos; - if ((code & 1) != 0) - { - // length change - lastPayloadLength = tvf.ReadVInt32(); - } - payloadOffsets[posUpto] = totalPayloadLength; - totalPayloadLength += lastPayloadLength; - if (Debugging.AssertsEnabled) Debugging.Assert(totalPayloadLength >= 0); - } - payloadData = new byte[totalPayloadLength]; - tvf.ReadBytes(payloadData, 0, payloadData.Length); - } // no payloads - else if (storePositions) - { - // TODO: we could maybe reuse last array, if we can - // somehow be careful about consumer never using two - // D&PEnums at once... - positions = new int[freq]; - int pos = 0; - for (int posUpto = 0; posUpto < freq; posUpto++) - { - pos += tvf.ReadVInt32(); - positions[posUpto] = pos; - } - } - - if (storeOffsets) - { - startOffsets = new int[freq]; - endOffsets = new int[freq]; - int offset = 0; - for (int posUpto = 0; posUpto < freq; posUpto++) - { - startOffsets[posUpto] = offset + tvf.ReadVInt32(); - offset = endOffsets[posUpto] = startOffsets[posUpto] + tvf.ReadVInt32(); - } - } - - lastTerm.CopyBytes(term); - nextTerm++; - return term; + if (MoveNext()) + return term; + return null; } public override BytesRef Term => term; diff --git a/src/Lucene.Net/Codecs/Lucene42/Lucene42DocValuesProducer.cs b/src/Lucene.Net/Codecs/Lucene42/Lucene42DocValuesProducer.cs index b675f1f..fdb0f6b 100644 --- a/src/Lucene.Net/Codecs/Lucene42/Lucene42DocValuesProducer.cs +++ b/src/Lucene.Net/Codecs/Lucene42/Lucene42DocValuesProducer.cs @@ -727,15 +727,9 @@ namespace Lucene.Net.Codecs.Lucene42 public override BytesRef Next() { - var io = @in.Next(); - if (io == null) - { - return null; - } - else - { - return io.Input; - } + if (MoveNext()) + return @in.Current.Input; + return null; } public override IComparer<BytesRef> Comparer => BytesRef.UTF8SortedAsUnicodeComparer; diff --git a/src/Lucene.Net/Codecs/Lucene45/Lucene45DocValuesProducer.cs b/src/Lucene.Net/Codecs/Lucene45/Lucene45DocValuesProducer.cs index 9957b2c..787efa8 100644 --- a/src/Lucene.Net/Codecs/Lucene45/Lucene45DocValuesProducer.cs +++ b/src/Lucene.Net/Codecs/Lucene45/Lucene45DocValuesProducer.cs @@ -1093,6 +1093,7 @@ namespace Lucene.Net.Codecs.Lucene45 private readonly BytesRef term; // LUCENENET specific - duplicate logic for better enumerator optimization + // LUCENENET specific - factored out DoNext() and made into MoveNext() public override bool MoveNext() { if (++currentOrd >= outerInstance.numValues) @@ -1112,31 +1113,9 @@ namespace Lucene.Net.Codecs.Lucene45 public override BytesRef Next() { - if (DoNext() == null) - { - return null; - } - else - { - SetTerm(); + if (MoveNext()) return term; - } - } - - private BytesRef DoNext() - { - if (++currentOrd >= outerInstance.numValues) - { - return null; - } - else - { - int start = input.ReadVInt32(); - int suffix = input.ReadVInt32(); - input.ReadBytes(termBuffer.Bytes, start, suffix); - termBuffer.Length = start + suffix; - return termBuffer; - } + return null; } public override TermsEnum.SeekStatus SeekCeil(BytesRef text) @@ -1177,7 +1156,7 @@ namespace Lucene.Net.Codecs.Lucene45 long block = low - 1; DoSeek(block < 0 ? -1 : block * outerInstance.interval); - while (DoNext() != null) + while (MoveNext()) { int cmp = termBuffer.CompareTo(text); if (cmp == 0) @@ -1218,7 +1197,7 @@ namespace Lucene.Net.Codecs.Lucene45 while (currentOrd < ord) { - DoNext(); + MoveNext(); } } diff --git a/src/Lucene.Net/Index/DocTermOrds.cs b/src/Lucene.Net/Index/DocTermOrds.cs index 1c4fe77..54c7352 100644 --- a/src/Lucene.Net/Index/DocTermOrds.cs +++ b/src/Lucene.Net/Index/DocTermOrds.cs @@ -788,16 +788,9 @@ namespace Lucene.Net.Index public override BytesRef Next() { - if (++ord < 0) - { - ord = 0; - } - if (termsEnum.Next() == null) - { - term = null; - return null; - } - return SetTerm(); // this is extra work if we know we are in bounds... + if (MoveNext()) + return term; + return null; } public override int DocFreq => termsEnum.DocFreq; diff --git a/src/Lucene.Net/Index/FilterAtomicReader.cs b/src/Lucene.Net/Index/FilterAtomicReader.cs index 8f5bdca..0d183a5 100644 --- a/src/Lucene.Net/Index/FilterAtomicReader.cs +++ b/src/Lucene.Net/Index/FilterAtomicReader.cs @@ -169,7 +169,9 @@ namespace Lucene.Net.Index public override BytesRef Next() { - return m_input.Next(); + if (MoveNext()) + return m_input.Term; + return null; } public override BytesRef Term => m_input.Term; diff --git a/src/Lucene.Net/Index/FilteredTermsEnum.cs b/src/Lucene.Net/Index/FilteredTermsEnum.cs index e885588..4e8a584 100644 --- a/src/Lucene.Net/Index/FilteredTermsEnum.cs +++ b/src/Lucene.Net/Index/FilteredTermsEnum.cs @@ -237,10 +237,14 @@ namespace Lucene.Net.Index } else { - actualTerm = tenum.Next(); - if (actualTerm == null) + if (tenum.MoveNext()) + { + actualTerm = tenum.Term; + } + else { // enum exhausted + actualTerm = null; return false; } } @@ -270,58 +274,9 @@ namespace Lucene.Net.Index public override BytesRef Next() { - //System.out.println("FTE.next doSeek=" + doSeek); - //new Throwable().printStackTrace(System.out); - for (; ; ) - { - // Seek or forward the iterator - if (doSeek) - { - doSeek = false; - BytesRef t = NextSeekTerm(actualTerm); - //System.out.println(" seek to t=" + (t == null ? "null" : t.utf8ToString()) + " tenum=" + tenum); - // Make sure we always seek forward: - if (Debugging.AssertsEnabled) Debugging.Assert(actualTerm == null || t == null || Comparer.Compare(t, actualTerm) > 0, () => "curTerm=" + actualTerm + " seekTerm=" + t); - if (t == null || tenum.SeekCeil(t) == SeekStatus.END) - { - // no more terms to seek to or enum exhausted - //System.out.println(" return null"); - return null; - } - actualTerm = tenum.Term; - //System.out.println(" got term=" + actualTerm.utf8ToString()); - } - else - { - actualTerm = tenum.Next(); - if (actualTerm == null) - { - // enum exhausted - return null; - } - } - - // check if term is accepted - switch (Accept(actualTerm)) - { - case FilteredTermsEnum.AcceptStatus.YES_AND_SEEK: - doSeek = true; - // term accepted, but we need to seek so fall-through - goto case FilteredTermsEnum.AcceptStatus.YES; - case FilteredTermsEnum.AcceptStatus.YES: - // term accepted - return actualTerm; - - case FilteredTermsEnum.AcceptStatus.NO_AND_SEEK: - // invalid term, seek next time - doSeek = true; - break; - - case FilteredTermsEnum.AcceptStatus.END: - // we are supposed to end the enum - return null; - } - } + if (MoveNext()) + return actualTerm; + return null; } } } \ No newline at end of file diff --git a/src/Lucene.Net/Index/MultiTermsEnum.cs b/src/Lucene.Net/Index/MultiTermsEnum.cs index 2981360..4f7db8f 100644 --- a/src/Lucene.Net/Index/MultiTermsEnum.cs +++ b/src/Lucene.Net/Index/MultiTermsEnum.cs @@ -391,34 +391,9 @@ namespace Lucene.Net.Index public override BytesRef Next() { - if (lastSeekExact) - { - // Must SeekCeil at this point, so those subs that - // didn't have the term can find the following term. - // NOTE: we could save some CPU by only SeekCeil the - // subs that didn't match the last exact seek... but - // most impls short-circuit if you SeekCeil to term - // they are already on. - SeekStatus status = SeekCeil(current); - if (Debugging.AssertsEnabled) Debugging.Assert(status == SeekStatus.FOUND); - lastSeekExact = false; - } - lastSeek = null; - - // restore queue - PushTop(); - - // gather equal top fields - if (queue.Count > 0) - { - PullTop(); - } - else - { - current = null; - } - - return current; + if (MoveNext()) + return current; + return null; } public override int DocFreq diff --git a/src/Lucene.Net/Index/SortedDocValuesTermsEnum.cs b/src/Lucene.Net/Index/SortedDocValuesTermsEnum.cs index 16919be..e784a20 100644 --- a/src/Lucene.Net/Index/SortedDocValuesTermsEnum.cs +++ b/src/Lucene.Net/Index/SortedDocValuesTermsEnum.cs @@ -113,13 +113,9 @@ namespace Lucene.Net.Index public override BytesRef Next() { - currentOrd++; - if (currentOrd >= values.ValueCount) - { - return null; - } - values.LookupOrd(currentOrd, term); - return term; + if (MoveNext()) + return term; + return null; } public override BytesRef Term => term; diff --git a/src/Lucene.Net/Index/SortedSetDocValuesTermsEnum.cs b/src/Lucene.Net/Index/SortedSetDocValuesTermsEnum.cs index 337f055..17580c0 100644 --- a/src/Lucene.Net/Index/SortedSetDocValuesTermsEnum.cs +++ b/src/Lucene.Net/Index/SortedSetDocValuesTermsEnum.cs @@ -113,13 +113,9 @@ namespace Lucene.Net.Index public override BytesRef Next() { - currentOrd++; - if (currentOrd >= values.ValueCount) - { - return null; - } - values.LookupOrd(currentOrd, term); - return term; + if (MoveNext()) + return term; + return null; } public override BytesRef Term => term; diff --git a/src/Lucene.Net/Index/TermsEnum.cs b/src/Lucene.Net/Index/TermsEnum.cs index fa42619..1b7f76d 100644 --- a/src/Lucene.Net/Index/TermsEnum.cs +++ b/src/Lucene.Net/Index/TermsEnum.cs @@ -62,7 +62,7 @@ namespace Lucene.Net.Index /// </summary> /// <returns><c>true</c> if the enumerator was successfully advanced to the next element; /// <c>false</c> if the enumerator has passed the end of the collection.</returns> - public abstract bool MoveNext(); // LUCENENET specific - made into enumerator for foreach + public abstract bool MoveNext(); // LUCENENET specific - must supply implementation for the interface private AttributeSource atts = null; diff --git a/src/Lucene.Net/Search/FuzzyTermsEnum.cs b/src/Lucene.Net/Search/FuzzyTermsEnum.cs index 77e1fd2..96fd368 100644 --- a/src/Lucene.Net/Search/FuzzyTermsEnum.cs +++ b/src/Lucene.Net/Search/FuzzyTermsEnum.cs @@ -282,47 +282,28 @@ namespace Lucene.Net.Search queuedBottom = null; } - BytesRef term = actualEnum.Next(); + bool moved = actualEnum.MoveNext(); boostAtt.Boost = actualBoostAtt.Boost; float bottom = maxBoostAtt.MaxNonCompetitiveBoost; BytesRef bottomTerm = maxBoostAtt.CompetitiveTerm; - if (actualEnum.MoveNext() && (bottom != this.bottom || bottomTerm != this.bottomTerm)) + if (moved && (bottom != this.bottom || bottomTerm != this.bottomTerm)) { this.bottom = bottom; this.bottomTerm = bottomTerm; // clone the term before potentially doing something with it // this is a rare but wonderful occurrence anyway queuedBottom = BytesRef.DeepCopyOf(actualEnum.Term); - return true; } - return false; + return moved; } public override BytesRef Next() { - if (queuedBottom != null) - { - BottomChanged(queuedBottom, false); - queuedBottom = null; - } - - BytesRef term = actualEnum.Next(); - boostAtt.Boost = actualBoostAtt.Boost; - - float bottom = maxBoostAtt.MaxNonCompetitiveBoost; - BytesRef bottomTerm = maxBoostAtt.CompetitiveTerm; - if (term != null && (bottom != this.bottom || bottomTerm != this.bottomTerm)) - { - this.bottom = bottom; - this.bottomTerm = bottomTerm; - // clone the term before potentially doing something with it - // this is a rare but wonderful occurrence anyway - queuedBottom = BytesRef.DeepCopyOf(term); - } - - return term; + if (MoveNext()) + return actualEnum.Term; + return null; } // proxy all other enum calls to the actual enum diff --git a/src/Lucene.Net/Util/Fst/BytesRefFSTEnum.cs b/src/Lucene.Net/Util/Fst/BytesRefFSTEnum.cs index 6dc30d5..09d0b92 100644 --- a/src/Lucene.Net/Util/Fst/BytesRefFSTEnum.cs +++ b/src/Lucene.Net/Util/Fst/BytesRefFSTEnum.cs @@ -68,8 +68,9 @@ namespace Lucene.Net.Util.Fst public BytesRefFSTEnum.InputOutput<T> Next() { //System.out.println(" enum.next"); - DoNext(); - return SetResult(); + if (MoveNext()) + return result; + return null; } /// <summary>
