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>

Reply via email to