io.deephaven.engine.table.impl.by.DoubleChunkedAddOnlyMinMaxOperator 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.DoubleComparisons;
import io.deephaven.engine.table.impl.sources.DoubleArraySource;
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 DoubleChunkedAddOnlyMinMaxOperator implements IterativeChunkedAggregationOperator {
private final DoubleArraySource resultColumn;
// region actualResult
// endregion actualResult
private final boolean minimum;
private final String name;
DoubleChunkedAddOnlyMinMaxOperator(
// region extra constructor params
// endregion extra constructor params
boolean minimum, String name) {
this.minimum = minimum;
this.name = name;
// region resultColumn initialization
this.resultColumn = new DoubleArraySource();
// endregion resultColumn initialization
}
private double min(DoubleChunk> values, MutableInt chunkNonNull, int chunkStart, int chunkEnd) {
int nonNull = 0;
double value = QueryConstants.NULL_DOUBLE;
for (int ii = chunkStart; ii < chunkEnd; ++ii) {
final double candidate = values.get(ii);
if (candidate != QueryConstants.NULL_DOUBLE) {
if (nonNull++ == 0) {
value = candidate;
} else if (DoubleComparisons.lt(candidate, value)) {
value = candidate;
}
}
}
chunkNonNull.setValue(nonNull);
return value;
}
private double max(DoubleChunk> values, MutableInt chunkNonNull, int chunkStart, int chunkEnd) {
int nonNull =0;
double value = QueryConstants.NULL_DOUBLE;
for (int ii = chunkStart; ii < chunkEnd; ++ii) {
final double candidate = values.get(ii);
if (candidate != QueryConstants.NULL_DOUBLE) {
if (nonNull++ == 0) {
value = candidate;
} else if (DoubleComparisons.gt(candidate, value)) {
value = candidate;
}
}
}
chunkNonNull.setValue(nonNull);
return value;
}
private double min(double a, double b) {
return DoubleComparisons.lt(a, b) ? a : b;
}
private double max(double a, double b) {
return DoubleComparisons.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 DoubleChunk extends Values> asDoubleChunk = values.asDoubleChunk();
for (int ii = 0; ii < startPositions.size(); ++ii) {
final int startPosition = startPositions.get(ii);
final long destination = destinations.get(startPosition);
stateModified.set(ii, addChunk(asDoubleChunk, 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.asDoubleChunk(), 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(DoubleChunk 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 double chunkValue = minimum ? min(values, chunkNonNull, chunkStart, chunkEnd) : max(values, chunkNonNull, chunkStart, chunkEnd);
if (chunkNonNull.intValue() == 0) {
return false;
}
final double result;
final double oldValue = resultColumn.getUnsafe(destination);
if (oldValue == QueryConstants.NULL_DOUBLE) {
// 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 (!DoubleComparisons.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