mirror of https://github.com/apache/lucene.git
LUCENE-7489: Remove one layer of abstraction in binary doc values and single-valued numerics.
This commit is contained in:
parent
71c6518456
commit
643429de6e
|
@ -340,20 +340,13 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
|
|||
return getNumeric(entry);
|
||||
}
|
||||
|
||||
private NumericDocValues getNumeric(NumericEntry entry) throws IOException {
|
||||
if (entry.docsWithFieldOffset == -2) {
|
||||
// empty
|
||||
return DocValues.emptyNumeric();
|
||||
} else if (entry.docsWithFieldOffset == -1) {
|
||||
// dense
|
||||
final LongValues normValues = getNumericValues(entry);
|
||||
return new NumericDocValues() {
|
||||
private static abstract class DenseNumericDocValues extends NumericDocValues {
|
||||
|
||||
final int maxDoc;
|
||||
int doc = -1;
|
||||
|
||||
@Override
|
||||
public long longValue() throws IOException {
|
||||
return normValues.get(doc);
|
||||
DenseNumericDocValues(int maxDoc) {
|
||||
this.maxDoc = maxDoc;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -385,12 +378,15 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
|
|||
return maxDoc;
|
||||
}
|
||||
|
||||
};
|
||||
} else {
|
||||
// sparse
|
||||
final LongValues values = getNumericValues(entry);
|
||||
final IndexedDISI disi = new IndexedDISI(data, entry.docsWithFieldOffset, entry.docsWithFieldLength, entry.numValues);
|
||||
return new NumericDocValues() {
|
||||
}
|
||||
|
||||
private static abstract class SparseNumericDocValues extends NumericDocValues {
|
||||
|
||||
final IndexedDISI disi;
|
||||
|
||||
SparseNumericDocValues(IndexedDISI disi) {
|
||||
this.disi = disi;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int advance(int target) throws IOException {
|
||||
|
@ -416,12 +412,75 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
|
|||
public long cost() {
|
||||
return disi.cost();
|
||||
}
|
||||
}
|
||||
|
||||
private NumericDocValues getNumeric(NumericEntry entry) throws IOException {
|
||||
if (entry.docsWithFieldOffset == -2) {
|
||||
// empty
|
||||
return DocValues.emptyNumeric();
|
||||
} else if (entry.docsWithFieldOffset == -1) {
|
||||
// dense
|
||||
if (entry.bitsPerValue == 0) {
|
||||
return new DenseNumericDocValues(maxDoc) {
|
||||
@Override
|
||||
public long longValue() throws IOException {
|
||||
return values.get(disi.index());
|
||||
return entry.minValue;
|
||||
}
|
||||
};
|
||||
} else {
|
||||
final RandomAccessInput slice = data.randomAccessSlice(entry.valuesOffset, entry.valuesLength);
|
||||
final LongValues values = DirectReader.getInstance(slice, entry.bitsPerValue);
|
||||
if (entry.table != null) {
|
||||
final long[] table = entry.table;
|
||||
return new DenseNumericDocValues(maxDoc) {
|
||||
@Override
|
||||
public long longValue() throws IOException {
|
||||
return table[(int) values.get(doc)];
|
||||
}
|
||||
};
|
||||
} else {
|
||||
final long mul = entry.gcd;
|
||||
final long delta = entry.minValue;
|
||||
return new DenseNumericDocValues(maxDoc) {
|
||||
@Override
|
||||
public long longValue() throws IOException {
|
||||
return mul * values.get(doc) + delta;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// sparse
|
||||
final IndexedDISI disi = new IndexedDISI(data, entry.docsWithFieldOffset, entry.docsWithFieldLength, entry.numValues);
|
||||
if (entry.bitsPerValue == 0) {
|
||||
return new SparseNumericDocValues(disi) {
|
||||
@Override
|
||||
public long longValue() throws IOException {
|
||||
return entry.minValue;
|
||||
}
|
||||
};
|
||||
} else {
|
||||
final RandomAccessInput slice = data.randomAccessSlice(entry.valuesOffset, entry.valuesLength);
|
||||
final LongValues values = DirectReader.getInstance(slice, entry.bitsPerValue);
|
||||
if (entry.table != null) {
|
||||
final long[] table = entry.table;
|
||||
return new SparseNumericDocValues(disi) {
|
||||
@Override
|
||||
public long longValue() throws IOException {
|
||||
return table[(int) values.get(disi.index())];
|
||||
}
|
||||
};
|
||||
} else {
|
||||
final long mul = entry.gcd;
|
||||
final long delta = entry.minValue;
|
||||
return new SparseNumericDocValues(disi) {
|
||||
@Override
|
||||
public long longValue() throws IOException {
|
||||
return mul * values.get(disi.index()) + delta;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -467,47 +526,15 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BinaryDocValues getBinary(FieldInfo field) throws IOException {
|
||||
BinaryEntry entry = binaries.get(field.name);
|
||||
if (entry.docsWithFieldOffset == -2) {
|
||||
return DocValues.emptyBinary();
|
||||
}
|
||||
|
||||
IndexInput bytesSlice = data.slice("fixed-binary", entry.dataOffset, entry.dataLength);
|
||||
BytesRefs bytesRefs;
|
||||
if (entry.minLength == entry.maxLength) {
|
||||
bytesRefs = new BytesRefs() {
|
||||
BytesRef bytes = new BytesRef(new byte[entry.maxLength], 0, entry.maxLength);
|
||||
@Override
|
||||
public BytesRef get(int index) throws IOException {
|
||||
bytesSlice.seek((long) index * bytes.length);
|
||||
bytesSlice.readBytes(bytes.bytes, 0, bytes.length);
|
||||
return bytes;
|
||||
}
|
||||
};
|
||||
} else {
|
||||
final RandomAccessInput addressesData = this.data.randomAccessSlice(entry.addressesOffset, entry.addressesLength);
|
||||
final LongValues addresses = DirectMonotonicReader.getInstance(entry.addressesMeta, addressesData);
|
||||
bytesRefs = new BytesRefs() {
|
||||
BytesRef bytes = new BytesRef(entry.maxLength);
|
||||
@Override
|
||||
BytesRef get(int index) throws IOException {
|
||||
long startOffset = addresses.get(index);
|
||||
bytes.length = (int) (addresses.get(index + 1L) - startOffset);
|
||||
bytesSlice.seek(startOffset);
|
||||
bytesSlice.readBytes(bytes.bytes, 0, bytes.length);
|
||||
return bytes;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if (entry.docsWithFieldOffset == -1) {
|
||||
// dense
|
||||
return new BinaryDocValues() {
|
||||
private static abstract class DenseBinaryDocValues extends BinaryDocValues {
|
||||
|
||||
final int maxDoc;
|
||||
int doc = -1;
|
||||
|
||||
DenseBinaryDocValues(int maxDoc) {
|
||||
this.maxDoc = maxDoc;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextDoc() throws IOException {
|
||||
return advance(doc + 1);
|
||||
|
@ -536,16 +563,15 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
|
|||
doc = target;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BytesRef binaryValue() throws IOException {
|
||||
return bytesRefs.get(doc);
|
||||
}
|
||||
};
|
||||
} else {
|
||||
// sparse
|
||||
final IndexedDISI disi = new IndexedDISI(data, entry.docsWithFieldOffset, entry.docsWithFieldLength, entry.numDocsWithField);
|
||||
return new BinaryDocValues() {
|
||||
|
||||
private static abstract class SparseBinaryDocValues extends BinaryDocValues {
|
||||
|
||||
final IndexedDISI disi;
|
||||
|
||||
SparseBinaryDocValues(IndexedDISI disi) {
|
||||
this.disi = disi;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextDoc() throws IOException {
|
||||
|
@ -571,17 +597,84 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
|
|||
public boolean advanceExact(int target) throws IOException {
|
||||
return disi.advanceExact(target);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BinaryDocValues getBinary(FieldInfo field) throws IOException {
|
||||
BinaryEntry entry = binaries.get(field.name);
|
||||
if (entry.docsWithFieldOffset == -2) {
|
||||
return DocValues.emptyBinary();
|
||||
}
|
||||
|
||||
final IndexInput bytesSlice = data.slice("fixed-binary", entry.dataOffset, entry.dataLength);
|
||||
|
||||
if (entry.docsWithFieldOffset == -1) {
|
||||
// dense
|
||||
if (entry.minLength == entry.maxLength) {
|
||||
// fixed length
|
||||
final int length = entry.maxLength;
|
||||
return new DenseBinaryDocValues(maxDoc) {
|
||||
final BytesRef bytes = new BytesRef(new byte[length], 0, length);
|
||||
|
||||
@Override
|
||||
public BytesRef binaryValue() throws IOException {
|
||||
return bytesRefs.get(disi.index());
|
||||
bytesSlice.seek((long) doc * length);
|
||||
bytesSlice.readBytes(bytes.bytes, 0, length);
|
||||
return bytes;
|
||||
}
|
||||
};
|
||||
} else {
|
||||
// variable length
|
||||
final RandomAccessInput addressesData = this.data.randomAccessSlice(entry.addressesOffset, entry.addressesLength);
|
||||
final LongValues addresses = DirectMonotonicReader.getInstance(entry.addressesMeta, addressesData);
|
||||
return new DenseBinaryDocValues(maxDoc) {
|
||||
final BytesRef bytes = new BytesRef(new byte[entry.maxLength], 0, entry.maxLength);
|
||||
|
||||
@Override
|
||||
public BytesRef binaryValue() throws IOException {
|
||||
long startOffset = addresses.get(doc);
|
||||
bytes.length = (int) (addresses.get(doc + 1L) - startOffset);
|
||||
bytesSlice.seek(startOffset);
|
||||
bytesSlice.readBytes(bytes.bytes, 0, bytes.length);
|
||||
return bytes;
|
||||
}
|
||||
};
|
||||
}
|
||||
} else {
|
||||
// sparse
|
||||
final IndexedDISI disi = new IndexedDISI(data, entry.docsWithFieldOffset, entry.docsWithFieldLength, entry.numDocsWithField);
|
||||
if (entry.minLength == entry.maxLength) {
|
||||
// fixed length
|
||||
final int length = entry.maxLength;
|
||||
return new SparseBinaryDocValues(disi) {
|
||||
final BytesRef bytes = new BytesRef(new byte[length], 0, length);
|
||||
|
||||
@Override
|
||||
public BytesRef binaryValue() throws IOException {
|
||||
bytesSlice.seek((long) disi.index() * length);
|
||||
bytesSlice.readBytes(bytes.bytes, 0, length);
|
||||
return bytes;
|
||||
}
|
||||
};
|
||||
} else {
|
||||
// variable length
|
||||
final RandomAccessInput addressesData = this.data.randomAccessSlice(entry.addressesOffset, entry.addressesLength);
|
||||
final LongValues addresses = DirectMonotonicReader.getInstance(entry.addressesMeta, addressesData);
|
||||
return new SparseBinaryDocValues(disi) {
|
||||
final BytesRef bytes = new BytesRef(new byte[entry.maxLength], 0, entry.maxLength);
|
||||
|
||||
@Override
|
||||
public BytesRef binaryValue() throws IOException {
|
||||
final int index = disi.index();
|
||||
long startOffset = addresses.get(index);
|
||||
bytes.length = (int) (addresses.get(index + 1L) - startOffset);
|
||||
bytesSlice.seek(startOffset);
|
||||
bytesSlice.readBytes(bytes.bytes, 0, bytes.length);
|
||||
return bytes;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private static abstract class BytesRefs {
|
||||
abstract BytesRef get(int index) throws IOException;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Reference in New Issue