blob: 6701f4239dbe915cb615fb82ec0dd3df9bef981a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.lucene.util.bkd;
import org.apache.lucene.util.BytesRef;
/**
* Utility class to read buffered points from in-heap arrays.
*
* @lucene.internal
* */
public final class HeapPointReader implements PointReader {
private int curRead;
final byte[] block;
final BKDConfig config;
final int end;
private final HeapPointValue pointValue;
public HeapPointReader(BKDConfig config, byte[] block, int start, int end) {
this.block = block;
curRead = start-1;
this.end = end;
this.config = config;
if (start < end) {
this.pointValue = new HeapPointValue(config, block);
} else {
//no values
this.pointValue = null;
}
}
@Override
public boolean next() {
curRead++;
return curRead < end;
}
@Override
public PointValue pointValue() {
pointValue.setOffset(curRead * config.bytesPerDoc);
return pointValue;
}
@Override
public void close() {
}
/**
* Reusable implementation for a point value on-heap
*/
static class HeapPointValue implements PointValue {
final BytesRef packedValue;
final BytesRef packedValueDocID;
final int packedValueLength;
HeapPointValue(BKDConfig config, byte[] value) {
this.packedValueLength = config.packedBytesLength;
this.packedValue = new BytesRef(value, 0, packedValueLength);
this.packedValueDocID = new BytesRef(value, 0, config.bytesPerDoc);
}
/**
* Sets a new value by changing the offset.
*/
public void setOffset(int offset) {
packedValue.offset = offset;
packedValueDocID.offset = offset;
}
@Override
public BytesRef packedValue() {
return packedValue;
}
@Override
public int docID() {
int position = packedValueDocID.offset + packedValueLength;
return ((packedValueDocID.bytes[position] & 0xFF) << 24) | ((packedValueDocID.bytes[++position] & 0xFF) << 16)
| ((packedValueDocID.bytes[++position] & 0xFF) << 8) | (packedValueDocID.bytes[++position] & 0xFF);
}
@Override
public BytesRef packedValueDocIDBytes() {
return packedValueDocID;
}
}
}