internal IntersectTermsEnum(FSTTermsReader.TermsReader outerInstance, CompiledAutomaton compiled, BytesRef startTerm) : base(outerInstance) { this.outerInstance = outerInstance; //if (TEST) System.out.println("Enum init, startTerm=" + startTerm); this.fst = outerInstance.dict; this.fstReader = fst.BytesReader; this.fstOutputs = outerInstance.dict.Outputs; this.fsa = compiled.RunAutomaton; this.level = -1; this.stack = new Frame[16]; for (int i = 0; i < stack.Length; i++) { this.stack[i] = new Frame(this); } Frame frame; frame = LoadVirtualFrame(NewFrame()); this.level++; frame = LoadFirstFrame(NewFrame()); PushFrame(frame); this.meta = null; this.metaUpto = 1; this.decoded = false; this.pending = false; if (startTerm == null) { pending = IsAccept(TopFrame()); } else { DoSeekCeil(startTerm); pending = !startTerm.Equals(term_Renamed) && IsValid(TopFrame()) && IsAccept(TopFrame()); } }
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET: //ORIGINAL LINE: @Override public index.TermsEnum intersect(util.automaton.CompiledAutomaton compiled, final util.BytesRef startTerm) public override TermsEnum intersect(CompiledAutomaton compiled, BytesRef startTerm) { return new DirectIntersectTermsEnum(this, compiled, startTerm); }
public override TermsEnum Intersect(CompiledAutomaton compiled, BytesRef startTerm) { return(new IntersectTermsEnum(this, compiled, startTerm)); }
public DirectIntersectTermsEnum(DirectPostingsFormat.DirectField outerInstance, CompiledAutomaton compiled, BytesRef startTerm) { this.outerInstance = outerInstance; runAutomaton = compiled.runAutomaton; compiledAutomaton = compiled; termOrd = -1; states = new State[1]; states[0] = new State(this); states[0].changeOrd = outerInstance.terms.Length; states[0].state = runAutomaton.InitialState; states[0].transitions = compiledAutomaton.sortedTransitions[states[0].state]; states[0].transitionUpto = -1; states[0].transitionMax = -1; //System.out.println("IE.init startTerm=" + startTerm); if (startTerm != null) { int skipUpto = 0; if (startTerm.length == 0) { if (outerInstance.terms.Length > 0 && outerInstance.termOffsets[1] == 0) { termOrd = 0; } } else { termOrd++; for (int i = 0; i < startTerm.length; i++) { //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final int label = startTerm.bytes[startTerm.offset+i] & 0xFF; int label = startTerm.bytes[startTerm.offset + i] & 0xFF; while (label > states[i].transitionMax) { states[i].transitionUpto++; Debug.Assert(states[i].transitionUpto < states[i].transitions.Length); states[i].transitionMin = states[i].transitions[states[i].transitionUpto].Min; states[i].transitionMax = states[i].transitions[states[i].transitionUpto].Max; Debug.Assert(states[i].transitionMin >= 0); Debug.Assert(states[i].transitionMin <= 255); Debug.Assert(states[i].transitionMax >= 0); Debug.Assert(states[i].transitionMax <= 255); } // Skip forwards until we find a term matching // the label at this position: while (termOrd < outerInstance.terms.Length) { //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final int skipOffset = skipOffsets[termOrd]; int skipOffset = outerInstance.skipOffsets[termOrd]; //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final int numSkips = skipOffsets[termOrd+1] - skipOffset; int numSkips = outerInstance.skipOffsets[termOrd + 1] - skipOffset; //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final int termOffset = termOffsets[termOrd]; int termOffset = outerInstance.termOffsets[termOrd]; //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final int termLength = termOffsets[1+termOrd] - termOffset; int termLength = outerInstance.termOffsets[1 + termOrd] - termOffset; // if (DEBUG) { // System.out.println(" check termOrd=" + termOrd + " term=" + new BytesRef(termBytes, termOffset, termLength).utf8ToString() + " skips=" + Arrays.toString(skips) + " i=" + i); // } if (termOrd == states[stateUpto].changeOrd) { // if (DEBUG) { // System.out.println(" end push return"); // } stateUpto--; termOrd--; return; } if (termLength == i) { termOrd++; skipUpto = 0; // if (DEBUG) { // System.out.println(" term too short; next term"); // } } else if (label < (outerInstance.termBytes[termOffset + i] & 0xFF)) { termOrd--; // if (DEBUG) { // System.out.println(" no match; already beyond; return termOrd=" + termOrd); // } stateUpto -= skipUpto; Debug.Assert(stateUpto >= 0); return; } else if (label == (outerInstance.termBytes[termOffset + i] & 0xFF)) { // if (DEBUG) { // System.out.println(" label[" + i + "] matches"); // } if (skipUpto < numSkips) { grow(); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final int nextState = runAutomaton.step(states[stateUpto].state, label); int nextState = runAutomaton.step(states[stateUpto].state, label); // Automaton is required to accept startTerm: Debug.Assert(nextState != -1); stateUpto++; states[stateUpto].changeOrd = outerInstance.skips[skipOffset + skipUpto++]; states[stateUpto].state = nextState; states[stateUpto].transitions = compiledAutomaton.sortedTransitions[nextState]; states[stateUpto].transitionUpto = -1; states[stateUpto].transitionMax = -1; //System.out.println(" push " + states[stateUpto].transitions.length + " trans"); // if (DEBUG) { // System.out.println(" push skip; changeOrd=" + states[stateUpto].changeOrd); // } // Match next label at this same term: goto nextLabelContinue; } else { // if (DEBUG) { // System.out.println(" linear scan"); // } // Index exhausted: just scan now (the // number of scans required will be less // than the minSkipCount): //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final int startTermOrd = termOrd; int startTermOrd = termOrd; while (termOrd < outerInstance.terms.Length && outerInstance.compare(termOrd, startTerm) <= 0) { Debug.Assert(termOrd == startTermOrd || outerInstance.skipOffsets[termOrd] == outerInstance.skipOffsets[termOrd + 1]); termOrd++; } Debug.Assert(termOrd - startTermOrd < outerInstance.minSkipCount); termOrd--; stateUpto -= skipUpto; // if (DEBUG) { // System.out.println(" end termOrd=" + termOrd); // } return; } } else { if (skipUpto < numSkips) { termOrd = outerInstance.skips[skipOffset + skipUpto]; // if (DEBUG) { // System.out.println(" no match; skip to termOrd=" + termOrd); // } } else { // if (DEBUG) { // System.out.println(" no match; next term"); // } termOrd++; } skipUpto = 0; } } // startTerm is >= last term so enum will not // return any terms: termOrd--; // if (DEBUG) { // System.out.println(" beyond end; no terms will match"); // } return; nextLabelContinue: ; } nextLabelBreak: ; } //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final int termOffset = termOffsets[termOrd]; int termOffset = outerInstance.termOffsets[termOrd]; //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final int termLen = termOffsets[1+termOrd] - termOffset; int termLen = outerInstance.termOffsets[1 + termOrd] - termOffset; if (termOrd >= 0 && !startTerm.Equals(new BytesRef(outerInstance.termBytes, termOffset, termLen))) { stateUpto -= skipUpto; termOrd--; } // if (DEBUG) { // System.out.println(" loop end; return termOrd=" + termOrd + " stateUpto=" + stateUpto); // } } }