io.deephaven.engine.table.impl.join.stamp.FloatNoExactReverseStampKernel 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 CharNoExactStampKernel and regenerate
* ---------------------------------------------------------------------------------------------------------------------
*/
package io.deephaven.engine.table.impl.join.stamp;
import io.deephaven.util.compare.FloatComparisons;
import io.deephaven.chunk.*;
import io.deephaven.engine.rowset.chunkattributes.RowKeys;
import io.deephaven.chunk.attributes.Values;
import io.deephaven.engine.rowset.RowSequence;
public class FloatNoExactReverseStampKernel implements StampKernel {
static final FloatNoExactReverseStampKernel INSTANCE = new FloatNoExactReverseStampKernel();
private FloatNoExactReverseStampKernel() {} // static use only
@Override
public void computeRedirections(Chunk leftStamps, Chunk rightStamps, LongChunk rightKeyIndices, WritableLongChunk leftRedirections) {
computeRedirections(leftStamps.asFloatChunk(), rightStamps.asFloatChunk(), rightKeyIndices, leftRedirections);
}
static private void computeRedirections(FloatChunk leftStamps, FloatChunk rightStamps, LongChunk rightKeyIndices, WritableLongChunk leftRedirections) {
final int leftSize = leftStamps.size();
final int rightSize = rightStamps.size();
if (rightSize == 0) {
leftRedirections.fillWithValue(0, leftSize, RowSequence.NULL_ROW_KEY);
leftRedirections.setSize(leftSize);
return;
}
int rightLowIdx = 0;
float rightLowValue = rightStamps.get(0);
final int maxRightIdx = rightSize - 1;
for (int li = 0; li < leftSize; ) {
final float leftValue = leftStamps.get(li);
if (leq(leftValue, rightLowValue)) {
leftRedirections.set(li++, RowSequence.NULL_ROW_KEY);
continue;
}
int rightHighIdx = rightSize;
while (rightLowIdx < rightHighIdx) {
final int rightMidIdx = ((rightHighIdx - rightLowIdx) / 2) + rightLowIdx;
final float rightMidValue = rightStamps.get(rightMidIdx);
if (lt(rightMidValue, leftValue)) {
rightLowIdx = rightMidIdx;
rightLowValue = rightMidValue;
if (rightLowIdx == rightHighIdx - 1) {
break;
}
} else {
rightHighIdx = rightMidIdx;
}
}
final long redirectionKey = rightKeyIndices.get(rightLowIdx);
if (rightLowIdx == maxRightIdx) {
leftRedirections.fillWithValue(li, leftSize - li, redirectionKey);
return;
} else {
leftRedirections.set(li++, redirectionKey);
final float nextRightValue = rightStamps.get(rightLowIdx + 1);
while (li < leftSize && lt(leftStamps.get(li), nextRightValue)) {
leftRedirections.set(li++, redirectionKey);
}
}
}
}
// region comparison functions
private static int doComparison(float lhs, float rhs) {
return -1 * FloatComparisons.compare(lhs, rhs);
}
// endregion comparison functions
private static boolean lt(float lhs, float rhs) {
return doComparison(lhs, rhs) < 0;
}
private static boolean leq(float lhs, float rhs) {
return doComparison(lhs, rhs) <= 0;
}
private static boolean eq(float lhs, float rhs) {
// region equality function
return FloatComparisons.eq(lhs, rhs);
// endregion equality function
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy