in lucene/core/src/java/org/apache/lucene/index/SlowCompositeCodecReaderWrapper.java [596:798]
public PointValues getValues(String field) throws IOException {
List<PointValuesSub> values = new ArrayList<>();
for (int i = 0; i < readers.length; ++i) {
FieldInfo fi = codecReaders[i].getFieldInfos().fieldInfo(field);
if (fi != null && fi.getPointDimensionCount() > 0) {
PointValues v = readers[i].getValues(field);
if (v != null) {
// Apparently FieldInfo can claim a field has points, yet the returned
// PointValues is null
values.add(new PointValuesSub(v, docStarts[i]));
}
}
}
if (values.isEmpty()) {
return null;
}
return new PointValues() {
@Override
public PointTree getPointTree() throws IOException {
return new PointTree() {
@Override
public PointTree clone() {
return this;
}
@Override
public void visitDocValues(IntersectVisitor visitor) throws IOException {
for (PointValuesSub sub : values) {
sub.sub.getPointTree().visitDocValues(wrapIntersectVisitor(visitor, sub.docBase));
}
}
@Override
public void visitDocIDs(IntersectVisitor visitor) throws IOException {
for (PointValuesSub sub : values) {
sub.sub.getPointTree().visitDocIDs(wrapIntersectVisitor(visitor, sub.docBase));
}
}
private IntersectVisitor wrapIntersectVisitor(IntersectVisitor visitor, int docStart) {
return new IntersectVisitor() {
@Override
public void visit(int docID, byte[] packedValue) throws IOException {
visitor.visit(docStart + docID, packedValue);
}
@Override
public void visit(int docID) throws IOException {
visitor.visit(docStart + docID);
}
@Override
public Relation compare(byte[] minPackedValue, byte[] maxPackedValue) {
return visitor.compare(minPackedValue, maxPackedValue);
}
};
}
@Override
public long size() {
long size = 0;
for (PointValuesSub sub : values) {
size += sub.sub.size();
}
return size;
}
@Override
public boolean moveToSibling() throws IOException {
return false;
}
@Override
public boolean moveToParent() throws IOException {
return false;
}
@Override
public boolean moveToChild() throws IOException {
return false;
}
@Override
public byte[] getMinPackedValue() {
try {
byte[] minPackedValue = null;
for (PointValuesSub sub : values) {
if (minPackedValue == null) {
minPackedValue = sub.sub.getMinPackedValue().clone();
} else {
byte[] leafMinPackedValue = sub.sub.getMinPackedValue();
int numIndexDimensions = sub.sub.getNumIndexDimensions();
int numBytesPerDimension = sub.sub.getBytesPerDimension();
ArrayUtil.ByteArrayComparator comparator =
ArrayUtil.getUnsignedComparator(numBytesPerDimension);
for (int i = 0; i < numIndexDimensions; ++i) {
if (comparator.compare(
leafMinPackedValue,
i * numBytesPerDimension,
minPackedValue,
i * numBytesPerDimension)
< 0) {
System.arraycopy(
leafMinPackedValue,
i * numBytesPerDimension,
minPackedValue,
i * numBytesPerDimension,
numBytesPerDimension);
}
}
}
}
return minPackedValue;
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
@Override
public byte[] getMaxPackedValue() {
try {
byte[] maxPackedValue = null;
for (PointValuesSub sub : values) {
if (maxPackedValue == null) {
maxPackedValue = sub.sub.getMaxPackedValue().clone();
} else {
byte[] leafMinPackedValue = sub.sub.getMaxPackedValue();
int numIndexDimensions = sub.sub.getNumIndexDimensions();
int numBytesPerDimension = sub.sub.getBytesPerDimension();
ArrayUtil.ByteArrayComparator comparator =
ArrayUtil.getUnsignedComparator(numBytesPerDimension);
for (int i = 0; i < numIndexDimensions; ++i) {
if (comparator.compare(
leafMinPackedValue,
i * numBytesPerDimension,
maxPackedValue,
i * numBytesPerDimension)
> 0) {
System.arraycopy(
leafMinPackedValue,
i * numBytesPerDimension,
maxPackedValue,
i * numBytesPerDimension,
numBytesPerDimension);
}
}
}
}
return maxPackedValue;
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
};
}
@Override
public byte[] getMinPackedValue() throws IOException {
return getPointTree().getMinPackedValue();
}
@Override
public byte[] getMaxPackedValue() throws IOException {
return getPointTree().getMaxPackedValue();
}
@Override
public int getNumDimensions() throws IOException {
return values.get(0).sub.getNumDimensions();
}
@Override
public int getNumIndexDimensions() throws IOException {
return values.get(0).sub.getNumIndexDimensions();
}
@Override
public int getBytesPerDimension() throws IOException {
return values.get(0).sub.getBytesPerDimension();
}
@Override
public long size() {
try {
return getPointTree().size();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
@Override
public int getDocCount() {
int docCount = 0;
for (PointValuesSub sub : values) {
docCount += sub.sub.getDocCount();
}
return docCount;
}
};
}