io.deephaven.engine.table.impl.by.ByteChunkedAddOnlyMinMaxOperator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of deephaven-engine-table Show documentation
Show all versions of deephaven-engine-table Show documentation
Engine Table: Implementation and closely-coupled utilities
/**
* Copyright (c) 2016-2022 Deephaven Data Labs and Patent Pending
*/
/*
* ---------------------------------------------------------------------------------------------------------------------
* AUTO-GENERATED CLASS - DO NOT EDIT MANUALLY - for any changes edit CharChunkedAddOnlyMinMaxOperator and regenerate
* ---------------------------------------------------------------------------------------------------------------------
*/
package io.deephaven.engine.table.impl.by;
import io.deephaven.chunk.attributes.ChunkLengths;
import io.deephaven.chunk.attributes.ChunkPositions;
import io.deephaven.chunk.attributes.Values;
import io.deephaven.engine.rowset.chunkattributes.RowKeys;
import io.deephaven.util.QueryConstants;
import io.deephaven.util.compare.ByteComparisons;
import io.deephaven.engine.table.impl.sources.ByteArraySource;
import io.deephaven.engine.table.ColumnSource;
import io.deephaven.chunk.*;
import org.apache.commons.lang3.mutable.MutableInt;
import java.util.Collections;
import java.util.Map;
/**
* Iterative average operator.
*/
class ByteChunkedAddOnlyMinMaxOperator implements IterativeChunkedAggregationOperator {
private final ByteArraySource resultColumn;
// region actualResult
// endregion actualResult
private final boolean minimum;
private final String name;
ByteChunkedAddOnlyMinMaxOperator(
// region extra constructor params
// endregion extra constructor params
boolean minimum, String name) {
this.minimum = minimum;
this.name = name;
// region resultColumn initialization
this.resultColumn = new ByteArraySource();
// endregion resultColumn initialization
}
private byte min(ByteChunk> values, MutableInt chunkNonNull, int chunkStart, int chunkEnd) {
int nonNull = 0;
byte value = QueryConstants.NULL_BYTE;
for (int ii = chunkStart; ii < chunkEnd; ++ii) {
final byte candidate = values.get(ii);
if (candidate != QueryConstants.NULL_BYTE) {
if (nonNull++ == 0) {
value = candidate;
} else if (ByteComparisons.lt(candidate, value)) {
value = candidate;
}
}
}
chunkNonNull.setValue(nonNull);
return value;
}
private byte max(ByteChunk> values, MutableInt chunkNonNull, int chunkStart, int chunkEnd) {
int nonNull =0;
byte value = QueryConstants.NULL_BYTE;
for (int ii = chunkStart; ii < chunkEnd; ++ii) {
final byte candidate = values.get(ii);
if (candidate != QueryConstants.NULL_BYTE) {
if (nonNull++ == 0) {
value = candidate;
} else if (ByteComparisons.gt(candidate, value)) {
value = candidate;
}
}
}
chunkNonNull.setValue(nonNull);
return value;
}
private byte min(byte a, byte b) {
return ByteComparisons.lt(a, b) ? a : b;
}
private byte max(byte a, byte b) {
return ByteComparisons.gt(a, b) ? a : b;
}
@Override
public void addChunk(BucketedContext bucketedContext, Chunk extends Values> values, LongChunk extends RowKeys> inputRowKeys, IntChunk destinations, IntChunk startPositions, IntChunk length, WritableBooleanChunk stateModified) {
final ByteChunk extends Values> asByteChunk = values.asByteChunk();
for (int ii = 0; ii < startPositions.size(); ++ii) {
final int startPosition = startPositions.get(ii);
final long destination = destinations.get(startPosition);
stateModified.set(ii, addChunk(asByteChunk, destination, startPosition, length.get(ii)));
}
}
@Override
public void removeChunk(BucketedContext context, Chunk extends Values> values, LongChunk extends RowKeys> inputRowKeys, IntChunk destinations, IntChunk startPositions, IntChunk length, WritableBooleanChunk stateModified) {
throw new UnsupportedOperationException();
}
@Override
public void modifyChunk(BucketedContext context, Chunk extends Values> previousValues, Chunk extends Values> newValues, LongChunk extends RowKeys> postShiftRowKeys, IntChunk destinations, IntChunk startPositions, IntChunk length, WritableBooleanChunk stateModified) {
throw new UnsupportedOperationException();
}
@Override
public boolean addChunk(SingletonContext context, int chunkSize, Chunk extends Values> values, LongChunk extends RowKeys> inputRowKeys, long destination) {
return addChunk(values.asByteChunk(), destination, 0, values.size());
}
@Override
public boolean removeChunk(SingletonContext context, int chunkSize, Chunk extends Values> values, LongChunk extends RowKeys> inputRowKeys, long destination) {
throw new UnsupportedOperationException();
}
@Override
public boolean modifyChunk(SingletonContext context, int chunkSize, Chunk extends Values> previousValues, Chunk extends Values> newValues, LongChunk extends RowKeys> postShiftRowKeys, long destination) {
throw new UnsupportedOperationException();
}
private boolean addChunk(ByteChunk extends Values> values, long destination, int chunkStart, int chunkSize) {
if (chunkSize == 0) {
return false;
}
final MutableInt chunkNonNull = new MutableInt(0);
final int chunkEnd = chunkStart + chunkSize;
final byte chunkValue = minimum ? min(values, chunkNonNull, chunkStart, chunkEnd) : max(values, chunkNonNull, chunkStart, chunkEnd);
if (chunkNonNull.intValue() == 0) {
return false;
}
final byte result;
final byte oldValue = resultColumn.getUnsafe(destination);
if (oldValue == QueryConstants.NULL_BYTE) {
// we exclude nulls from the min/max calculation, therefore if the value in our min/max is null we know
// that it is in fact empty and we should use the value from the chunk
result = chunkValue;
} else {
result = minimum ? min(chunkValue, oldValue) : max(chunkValue, oldValue);
}
if (!ByteComparisons.eq(result, oldValue)) {
resultColumn.set(destination, result);
return true;
} else {
return false;
}
}
@Override
public void ensureCapacity(long tableSize) {
resultColumn.ensureCapacity(tableSize);
}
@Override
public Map> getResultColumns() {
// region getResultColumns
return Collections.>singletonMap(name, resultColumn);
// endregion getResultColumns
}
@Override
public void startTrackingPrevValues() {
resultColumn.startTrackingPrevValues();
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy