tighten up FixedIntBlockIndexInput

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/branches/pforcodec_3892@1357217 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael McCandless 2012-07-04 10:32:51 +00:00
parent 21a6450e83
commit 48d2049634
1 changed files with 20 additions and 27 deletions

View File

@ -77,19 +77,17 @@ public abstract class FixedIntBlockIndexInput extends IntIndexInput {
private static class Reader extends IntIndexInput.Reader { private static class Reader extends IntIndexInput.Reader {
private final IndexInput in; private final IndexInput in;
protected final int[] pending;
int upto;
private boolean seekPending;
private long pendingFP;
private int pendingUpto;
private long lastBlockFP;
private final BlockReader blockReader; private final BlockReader blockReader;
private final int blockSize; private final int blockSize;
private final int[] pending;
private int upto;
private boolean seekPending;
private long pendingFP;
private long lastBlockFP = -1;
public Reader(final IndexInput in, final int[] pending, final BlockReader blockReader) public Reader(final IndexInput in, final int[] pending, final BlockReader blockReader)
throws IOException { throws IOException {
this.in = in; this.in = in;
this.pending = pending; this.pending = pending;
this.blockSize = pending.length; this.blockSize = pending.length;
@ -98,33 +96,28 @@ public abstract class FixedIntBlockIndexInput extends IntIndexInput {
} }
void seek(final long fp, final int upto) { void seek(final long fp, final int upto) {
pendingFP = fp; assert upto < blockSize;
pendingUpto = upto; if (seekPending || fp != lastBlockFP) {
seekPending = true; pendingFP = fp;
} seekPending = true;
private void maybeSeek() throws IOException {
if (seekPending) {
if (pendingFP != lastBlockFP) {
// need new block
in.seek(pendingFP);
lastBlockFP = pendingFP;
blockReader.readBlock();
}
upto = pendingUpto;
seekPending = false;
} }
this.upto = upto;
} }
@Override @Override
public int next() throws IOException { public int next() throws IOException {
this.maybeSeek(); if (seekPending) {
if (upto == blockSize) { // Seek & load new block
in.seek(pendingFP);
lastBlockFP = pendingFP;
blockReader.readBlock();
seekPending = false;
} else if (upto == blockSize) {
// Load new block
lastBlockFP = in.getFilePointer(); lastBlockFP = in.getFilePointer();
blockReader.readBlock(); blockReader.readBlock();
upto = 0; upto = 0;
} }
return pending[upto++]; return pending[upto++];
} }
} }