Skip to content

Commit

Permalink
Push and pop OutputAccumulator as IntersectTermsEnumFrames are pushed…
Browse files Browse the repository at this point in the history
… and popped (#12900)
  • Loading branch information
gf2121 committed Dec 12, 2023
1 parent 3a64230 commit ae6e1de
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,6 @@
import org.apache.lucene.util.Version;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;

/*
Verify we can read previous versions' indexes, do searches
Expand Down Expand Up @@ -2273,7 +2272,6 @@ public void testFailOpenOldIndex() throws IOException {
// #12895: test on a carefully crafted 9.8.0 index (from a small contiguous subset
// of wikibigall unique terms) that shows the read-time exception of
// IntersectTermsEnum (used by WildcardQuery)
@Ignore("re-enable once we merge #12900")
public void testWildcardQueryExceptions990() throws IOException {
Path path = createTempDir("12895");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ public IntersectTermsEnum(
assert setSavedStartTerm(startTerm);

currentFrame = f;
outputAccumulator.push(currentFrame.arc.output());

if (startTerm != null) {
seekToStartTerm(startTerm);
}
Expand Down Expand Up @@ -184,8 +186,7 @@ private IntersectTermsEnumFrame pushFrame(int state) throws IOException {
int idx = currentFrame.prefix;
assert currentFrame.suffix > 0;

outputAccumulator.reset();
outputAccumulator.push(arc.output());
int initOutputCount = outputAccumulator.outputCount();
while (idx < f.prefix) {
final int target = term.bytes[idx] & 0xff;
// TODO: we could be more efficient for the next()
Expand All @@ -198,9 +199,11 @@ private IntersectTermsEnumFrame pushFrame(int state) throws IOException {
}

f.arc = arc;
f.outputNum = outputAccumulator.outputCount() - initOutputCount;
assert arc.isFinal();
outputAccumulator.push(arc.nextFinalOutput());
f.load(outputAccumulator);
outputAccumulator.pop(arc.nextFinalOutput());
return f;
}

Expand Down Expand Up @@ -343,6 +346,7 @@ private boolean popPushNext() throws IOException {
throw NoMoreTermsException.INSTANCE;
}
final long lastFP = currentFrame.fpOrig;
outputAccumulator.pop(currentFrame.outputNum);
currentFrame = stack[currentFrame.ord - 1];
currentTransition = currentFrame.transition;
assert currentFrame.lastSubFP == lastFP;
Expand Down Expand Up @@ -429,6 +433,7 @@ private BytesRef _next() throws IOException {
currentFrame = null;
return null;
}
outputAccumulator.pop(currentFrame.outputNum);
currentFrame = stack[currentFrame.ord - 1];
currentTransition = currentFrame.transition;
isSubBlock = popPushNext();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ final class IntersectTermsEnumFrame {

final ByteArrayDataInput bytesReader = new ByteArrayDataInput();

int outputNum;

int startBytePos;
int suffix;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,7 @@ public boolean seekExact(BytesRef target) throws IOException {
targetUpto = 0;
outputAccumulator.push(arc.nextFinalOutput());
currentFrame = pushFrame(arc, 0);
outputAccumulator.pop();
outputAccumulator.pop(arc.nextFinalOutput());
}

// if (DEBUG) {
Expand Down Expand Up @@ -569,7 +569,7 @@ public boolean seekExact(BytesRef target) throws IOException {
// if (DEBUG) System.out.println(" arc is final!");
outputAccumulator.push(arc.nextFinalOutput());
currentFrame = pushFrame(arc, targetUpto);
outputAccumulator.pop();
outputAccumulator.pop(arc.nextFinalOutput());
// if (DEBUG) System.out.println(" curFrame.ord=" + currentFrame.ord + " hasTerms=" +
// currentFrame.hasTerms);
}
Expand Down Expand Up @@ -767,7 +767,7 @@ public SeekStatus seekCeil(BytesRef target) throws IOException {
targetUpto = 0;
outputAccumulator.push(arc.nextFinalOutput());
currentFrame = pushFrame(arc, 0);
outputAccumulator.pop();
outputAccumulator.pop(arc.nextFinalOutput());
}

// if (DEBUG) {
Expand Down Expand Up @@ -841,7 +841,7 @@ public SeekStatus seekCeil(BytesRef target) throws IOException {
// if (DEBUG) System.out.println(" arc is final!");
outputAccumulator.push(arc.nextFinalOutput());
currentFrame = pushFrame(arc, targetUpto);
outputAccumulator.pop();
outputAccumulator.pop(arc.nextFinalOutput());
// if (DEBUG) System.out.println(" curFrame.ord=" + currentFrame.ord + " hasTerms=" +
// currentFrame.hasTerms);
}
Expand Down Expand Up @@ -1187,14 +1187,27 @@ static class OutputAccumulator extends DataInput {

void push(BytesRef output) {
if (output != Lucene90BlockTreeTermsReader.NO_OUTPUT) {
assert output.length > 0;
outputs = ArrayUtil.grow(outputs, num + 1);
outputs[num++] = output;
}
}

void pop() {
assert num > 0;
num--;
void pop(BytesRef output) {
if (output != Lucene90BlockTreeTermsReader.NO_OUTPUT) {
assert num > 0;
assert outputs[num - 1] == output;
num--;
}
}

void pop(int cnt) {
assert num >= cnt;
num -= cnt;
}

int outputCount() {
return num;
}

void reset() {
Expand Down

0 comments on commit ae6e1de

Please sign in to comment.