use of com.facebook.presto.common.array.AdaptiveLongBigArray in project presto by prestodb.
the class SimplePagesIndexComparator method compareTo.
@Override
public int compareTo(PagesIndex pagesIndex, int leftPosition, int rightPosition) {
AdaptiveLongBigArray valueAddresses = pagesIndex.getValueAddresses();
long leftPageAddress = valueAddresses.get(leftPosition);
long rightPageAddress = valueAddresses.get(rightPosition);
int leftBlockIndex = decodeSliceIndex(leftPageAddress);
int leftBlockPosition = decodePosition(leftPageAddress);
int rightBlockIndex = decodeSliceIndex(rightPageAddress);
int rightBlockPosition = decodePosition(rightPageAddress);
for (int i = 0; i < sortChannels.length; i++) {
int sortChannel = sortChannels[i];
SortOrder sortOrder = sortOrders[i];
Type sortType = sortTypes[i];
List<Block> indexChannel = pagesIndex.getChannel(sortChannel);
Block leftBlock = indexChannel.get(leftBlockIndex);
Block rightBlock = indexChannel.get(rightBlockIndex);
try {
int compare = sortOrder.compareBlockValue(sortType, leftBlock, leftBlockPosition, rightBlock, rightBlockPosition);
if (compare != 0) {
return compare;
}
} catch (NotSupportedException e) {
throw new PrestoException(NOT_SUPPORTED, e.getMessage(), e);
}
}
return 0;
}
use of com.facebook.presto.common.array.AdaptiveLongBigArray in project presto by prestodb.
the class PagesSpatialIndexSupplier method buildRTree.
private static Flatbush<GeometryWithPosition> buildRTree(AdaptiveLongBigArray addresses, int positionCount, List<List<Block>> channels, int geometryChannel, Optional<Integer> radiusChannel, Optional<Integer> partitionChannel, LocalMemoryContext localUserMemoryContext) {
Operator relateOperator = OperatorFactoryLocal.getInstance().getOperator(Operator.Type.Relate);
ObjectArrayList<GeometryWithPosition> geometries = new ObjectArrayList<>();
long recordedSizeInBytes = localUserMemoryContext.getBytes();
long addedSizeInBytes = 0;
for (int position = 0; position < positionCount; position++) {
long pageAddress = addresses.get(position);
int blockIndex = decodeSliceIndex(pageAddress);
int blockPosition = decodePosition(pageAddress);
Block block = channels.get(geometryChannel).get(blockIndex);
// TODO Consider pushing is-null and is-empty checks into a filter below the join
if (block.isNull(blockPosition)) {
continue;
}
Slice slice = block.getSlice(blockPosition, 0, block.getSliceLength(blockPosition));
OGCGeometry ogcGeometry = deserialize(slice);
verify(ogcGeometry != null);
if (ogcGeometry.isEmpty()) {
continue;
}
double radius = radiusChannel.map(channel -> DOUBLE.getDouble(channels.get(channel).get(blockIndex), blockPosition)).orElse(0.0);
if (radius < 0) {
continue;
}
if (!radiusChannel.isPresent()) {
// If radiusChannel is supplied, this is a distance query, for which our acceleration won't help.
accelerateGeometry(ogcGeometry, relateOperator);
}
int partition = -1;
if (partitionChannel.isPresent()) {
Block partitionBlock = channels.get(partitionChannel.get()).get(blockIndex);
partition = toIntExact(INTEGER.getLong(partitionBlock, blockPosition));
}
GeometryWithPosition geometryWithPosition = new GeometryWithPosition(ogcGeometry, partition, position, radius);
geometries.add(geometryWithPosition);
addedSizeInBytes += geometryWithPosition.getEstimatedSizeInBytes();
if (addedSizeInBytes >= MEMORY_USAGE_UPDATE_INCREMENT_BYTES) {
localUserMemoryContext.setBytes(recordedSizeInBytes + addedSizeInBytes);
recordedSizeInBytes += addedSizeInBytes;
addedSizeInBytes = 0;
}
}
return new Flatbush<>(geometries.toArray(new GeometryWithPosition[] {}));
}
use of com.facebook.presto.common.array.AdaptiveLongBigArray in project presto by prestodb.
the class TestPositionLinks method addresses.
private static AdaptiveLongBigArray addresses() {
AdaptiveLongBigArray addresses = new AdaptiveLongBigArray();
addresses.ensureCapacity(TEST_PAGE.getPositionCount());
for (int i = 0; i < TEST_PAGE.getPositionCount(); ++i) {
addresses.set(i, encodeSyntheticAddress(0, i));
}
return addresses;
}
use of com.facebook.presto.common.array.AdaptiveLongBigArray in project presto by prestodb.
the class PagesIndexPageSorter method sort.
@Override
public long[] sort(List<Type> types, List<Page> pages, List<Integer> sortChannels, List<SortOrder> sortOrders, int expectedPositions) {
PagesIndex pagesIndex = pagesIndexFactory.newPagesIndex(types, expectedPositions);
pages.forEach(pagesIndex::addPage);
pagesIndex.sort(sortChannels, sortOrders);
int positionCount = pagesIndex.getPositionCount();
AdaptiveLongBigArray valueAddresses = pagesIndex.getValueAddresses();
long[] result = new long[positionCount];
for (int i = 0; i < positionCount; i++) {
result[i] = valueAddresses.get(i);
}
return result;
}
Aggregations