org.elasticsearch.compute.data.LongLookup Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of x-pack-esql-compute Show documentation
Show all versions of x-pack-esql-compute Show documentation
Elasticsearch subproject :x-pack:plugin:esql:compute
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
package org.elasticsearch.compute.data;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.compute.operator.Operator;
import org.elasticsearch.core.ReleasableIterator;
import org.elasticsearch.core.Releasables;
/**
* Generic {@link Block#lookup} implementation {@link LongBlock}s.
* This class is generated. Do not edit it.
*/
final class LongLookup implements ReleasableIterator {
private final LongBlock values;
private final IntBlock positions;
private final long targetByteSize;
private int position;
private long first;
private int valuesInPosition;
LongLookup(LongBlock values, IntBlock positions, ByteSizeValue targetBlockSize) {
values.incRef();
positions.incRef();
this.values = values;
this.positions = positions;
this.targetByteSize = targetBlockSize.getBytes();
}
@Override
public boolean hasNext() {
return position < positions.getPositionCount();
}
@Override
public LongBlock next() {
try (LongBlock.Builder builder = positions.blockFactory().newLongBlockBuilder(positions.getTotalValueCount())) {
int count = 0;
while (position < positions.getPositionCount()) {
int start = positions.getFirstValueIndex(position);
int end = start + positions.getValueCount(position);
valuesInPosition = 0;
for (int i = start; i < end; i++) {
copy(builder, positions.getInt(i));
}
switch (valuesInPosition) {
case 0 -> builder.appendNull();
case 1 -> builder.appendLong(first);
default -> builder.endPositionEntry();
}
position++;
// TOOD what if the estimate is super huge? should we break even with less than MIN_TARGET?
if (++count > Operator.MIN_TARGET_PAGE_SIZE && builder.estimatedBytes() < targetByteSize) {
break;
}
}
return builder.build();
}
}
private void copy(LongBlock.Builder builder, int valuePosition) {
if (valuePosition >= values.getPositionCount()) {
return;
}
int start = values.getFirstValueIndex(valuePosition);
int end = start + values.getValueCount(valuePosition);
for (int i = start; i < end; i++) {
if (valuesInPosition == 0) {
first = values.getLong(i);
valuesInPosition++;
continue;
}
if (valuesInPosition == 1) {
builder.beginPositionEntry();
builder.appendLong(first);
}
if (valuesInPosition > Block.MAX_LOOKUP) {
// TODO replace this with a warning and break
throw new IllegalArgumentException("Found a single entry with " + valuesInPosition + " entries");
}
builder.appendLong(values.getLong(i));
valuesInPosition++;
}
}
@Override
public void close() {
Releasables.close(values, positions);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy