use of com.facebook.presto.spi.function.TypeParameter in project presto by prestodb.
the class ArrayGreaterThanOrEqualOperator method greaterThanOrEqual.
@TypeParameter("T")
@SqlType(StandardTypes.BOOLEAN)
public static boolean greaterThanOrEqual(@OperatorDependency(operator = GREATER_THAN, returnType = StandardTypes.BOOLEAN, argumentTypes = { "T", "T" }) MethodHandle greaterThanFunction, @TypeParameter("T") Type type, @SqlType("array(T)") Block leftArray, @SqlType("array(T)") Block rightArray) {
int len = Math.min(leftArray.getPositionCount(), rightArray.getPositionCount());
int index = 0;
while (index < len) {
checkElementNotNull(leftArray.isNull(index), ARRAY_NULL_ELEMENT_MSG);
checkElementNotNull(rightArray.isNull(index), ARRAY_NULL_ELEMENT_MSG);
Object leftElement = readNativeValue(type, leftArray, index);
Object rightElement = readNativeValue(type, rightArray, index);
try {
if ((boolean) greaterThanFunction.invoke(leftElement, rightElement)) {
return true;
}
if ((boolean) greaterThanFunction.invoke(rightElement, leftElement)) {
return false;
}
} catch (Throwable t) {
Throwables.propagateIfInstanceOf(t, Error.class);
Throwables.propagateIfInstanceOf(t, PrestoException.class);
throw new PrestoException(GENERIC_INTERNAL_ERROR, t);
}
index++;
}
return leftArray.getPositionCount() >= rightArray.getPositionCount();
}
use of com.facebook.presto.spi.function.TypeParameter in project presto by prestodb.
the class ArrayIntersectFunction method intersect.
@TypeParameter("E")
@SqlType("array(E)")
public Block intersect(@OperatorDependency(operator = LESS_THAN, returnType = StandardTypes.BOOLEAN, argumentTypes = { "E", "E" }) MethodHandle lessThanFunction, @TypeParameter("E") Type type, @SqlType("array(E)") Block leftArray, @SqlType("array(E)") Block rightArray) {
int leftPositionCount = leftArray.getPositionCount();
int rightPositionCount = rightArray.getPositionCount();
if (leftPositionCount == 0) {
return leftArray;
}
if (rightPositionCount == 0) {
return rightArray;
}
if (leftPositions.length < leftPositionCount) {
leftPositions = new int[leftPositionCount];
}
if (rightPositions.length < rightPositionCount) {
rightPositions = new int[rightPositionCount];
}
if (pageBuilder.isFull()) {
pageBuilder.reset();
}
for (int i = 0; i < leftPositionCount; i++) {
leftPositions[i] = i;
}
for (int i = 0; i < rightPositionCount; i++) {
rightPositions[i] = i;
}
IntArrays.quickSort(leftPositions, 0, leftPositionCount, intBlockCompare(type, leftArray));
IntArrays.quickSort(rightPositions, 0, rightPositionCount, intBlockCompare(type, rightArray));
BlockBuilder resultBlockBuilder = pageBuilder.getBlockBuilder(0);
int leftCurrentPosition = 0;
int rightCurrentPosition = 0;
int leftBasePosition;
int rightBasePosition;
int totalCount = 0;
while (leftCurrentPosition < leftPositionCount && rightCurrentPosition < rightPositionCount) {
leftBasePosition = leftCurrentPosition;
rightBasePosition = rightCurrentPosition;
int compareValue = type.compareTo(leftArray, leftPositions[leftCurrentPosition], rightArray, rightPositions[rightCurrentPosition]);
if (compareValue > 0) {
rightCurrentPosition++;
} else if (compareValue < 0) {
leftCurrentPosition++;
} else {
type.appendTo(leftArray, leftPositions[leftCurrentPosition], resultBlockBuilder);
leftCurrentPosition++;
rightCurrentPosition++;
totalCount++;
while (leftCurrentPosition < leftPositionCount && type.equalTo(leftArray, leftPositions[leftBasePosition], leftArray, leftPositions[leftCurrentPosition])) {
leftCurrentPosition++;
}
while (rightCurrentPosition < rightPositionCount && type.equalTo(rightArray, rightPositions[rightBasePosition], rightArray, rightPositions[rightCurrentPosition])) {
rightCurrentPosition++;
}
}
}
pageBuilder.declarePositions(totalCount);
return resultBlockBuilder.getRegion(resultBlockBuilder.getPositionCount() - totalCount, totalCount);
}
use of com.facebook.presto.spi.function.TypeParameter in project presto by prestodb.
the class ArrayLessThanOperator method lessThan.
@TypeParameter("E")
@SqlType(StandardTypes.BOOLEAN)
public static boolean lessThan(@OperatorDependency(operator = LESS_THAN, returnType = StandardTypes.BOOLEAN, argumentTypes = { "E", "E" }) MethodHandle lessThanFunction, @TypeParameter("E") Type type, @SqlType("array(E)") Block leftArray, @SqlType("array(E)") Block rightArray) {
int len = Math.min(leftArray.getPositionCount(), rightArray.getPositionCount());
int index = 0;
while (index < len) {
checkElementNotNull(leftArray.isNull(index), ARRAY_NULL_ELEMENT_MSG);
checkElementNotNull(rightArray.isNull(index), ARRAY_NULL_ELEMENT_MSG);
Object leftElement = readNativeValue(type, leftArray, index);
Object rightElement = readNativeValue(type, rightArray, index);
try {
if ((boolean) lessThanFunction.invoke(leftElement, rightElement)) {
return true;
}
if ((boolean) lessThanFunction.invoke(rightElement, leftElement)) {
return false;
}
} catch (Throwable t) {
Throwables.propagateIfInstanceOf(t, Error.class);
Throwables.propagateIfInstanceOf(t, PrestoException.class);
throw new PrestoException(GENERIC_INTERNAL_ERROR, t);
}
index++;
}
return leftArray.getPositionCount() < rightArray.getPositionCount();
}
use of com.facebook.presto.spi.function.TypeParameter in project presto by prestodb.
the class ArrayLessThanOperator method lessThanLong.
@TypeParameter("E")
@TypeParameterSpecialization(name = "E", nativeContainerType = long.class)
@SqlType(StandardTypes.BOOLEAN)
public static boolean lessThanLong(@OperatorDependency(operator = LESS_THAN, returnType = StandardTypes.BOOLEAN, argumentTypes = { "E", "E" }) MethodHandle lessThanFunction, @TypeParameter("E") Type type, @SqlType("array(E)") Block leftArray, @SqlType("array(E)") Block rightArray) {
int len = Math.min(leftArray.getPositionCount(), rightArray.getPositionCount());
int index = 0;
while (index < len) {
checkElementNotNull(leftArray.isNull(index), ARRAY_NULL_ELEMENT_MSG);
checkElementNotNull(rightArray.isNull(index), ARRAY_NULL_ELEMENT_MSG);
long leftElement = type.getLong(leftArray, index);
long rightElement = type.getLong(rightArray, index);
try {
if ((boolean) lessThanFunction.invokeExact(leftElement, rightElement)) {
return true;
}
if ((boolean) lessThanFunction.invokeExact(rightElement, leftElement)) {
return false;
}
} catch (Throwable t) {
Throwables.propagateIfInstanceOf(t, Error.class);
Throwables.propagateIfInstanceOf(t, PrestoException.class);
throw new PrestoException(GENERIC_INTERNAL_ERROR, t);
}
index++;
}
return leftArray.getPositionCount() < rightArray.getPositionCount();
}
use of com.facebook.presto.spi.function.TypeParameter in project presto by prestodb.
the class ArrayLessThanOrEqualOperator method lessThanOrEqual.
@TypeParameter("E")
@SqlType(StandardTypes.BOOLEAN)
public static boolean lessThanOrEqual(@OperatorDependency(operator = LESS_THAN, returnType = StandardTypes.BOOLEAN, argumentTypes = { "E", "E" }) MethodHandle lessThanFunction, @TypeParameter("E") Type type, @SqlType("array(E)") Block leftArray, @SqlType("array(E)") Block rightArray) {
int len = Math.min(leftArray.getPositionCount(), rightArray.getPositionCount());
int index = 0;
while (index < len) {
checkElementNotNull(leftArray.isNull(index), ARRAY_NULL_ELEMENT_MSG);
checkElementNotNull(rightArray.isNull(index), ARRAY_NULL_ELEMENT_MSG);
Object leftElement = readNativeValue(type, leftArray, index);
Object rightElement = readNativeValue(type, rightArray, index);
try {
if ((boolean) lessThanFunction.invoke(leftElement, rightElement)) {
return true;
}
if ((boolean) lessThanFunction.invoke(rightElement, leftElement)) {
return false;
}
} catch (Throwable t) {
Throwables.propagateIfInstanceOf(t, Error.class);
Throwables.propagateIfInstanceOf(t, PrestoException.class);
throw new PrestoException(GENERIC_INTERNAL_ERROR, t);
}
index++;
}
return leftArray.getPositionCount() <= rightArray.getPositionCount();
}
Aggregations