Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ protected double evalDouble(double left, double right)
@Override
public boolean canVectorize(InputBindingInspector inspector)
{
return inspector.areNumeric(left, right) && inspector.canVectorize(left, right);
return inspector.areScalar(left, right) && inspector.canVectorize(left, right);
}

@Override
Expand Down Expand Up @@ -151,7 +151,7 @@ protected double evalDouble(double left, double right)
@Override
public boolean canVectorize(InputBindingInspector inspector)
{
return inspector.areNumeric(left, right) && inspector.canVectorize(left, right);
return inspector.areScalar(left, right) && inspector.canVectorize(left, right);
}

@Override
Expand Down Expand Up @@ -190,7 +190,7 @@ protected double evalDouble(double left, double right)
@Override
public boolean canVectorize(InputBindingInspector inspector)
{
return inspector.areNumeric(left, right) && inspector.canVectorize(left, right);
return inspector.areScalar(left, right) && inspector.canVectorize(left, right);
}

@Override
Expand Down Expand Up @@ -229,7 +229,7 @@ protected double evalDouble(double left, double right)
@Override
public boolean canVectorize(InputBindingInspector inspector)
{
return inspector.areNumeric(left, right) && inspector.canVectorize(left, right);
return inspector.areScalar(left, right) && inspector.canVectorize(left, right);
}

@Override
Expand Down Expand Up @@ -268,7 +268,7 @@ protected double evalDouble(double left, double right)
@Override
public boolean canVectorize(InputBindingInspector inspector)
{
return inspector.areNumeric(left, right) && inspector.canVectorize(left, right);
return inspector.areScalar(left, right) && inspector.canVectorize(left, right);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

package org.apache.druid.math.expr.vector;

import org.apache.druid.math.expr.Expr;

/**
* common machinery for processing two input operators and functions, which should always treat null inputs as null
* output, and are backed by a primitive values instead of an object values (and need to use the null vectors instead of
* checking the vector themselves for nulls)
*
* this one is specialized for producing double[], see {@link BivariateLongFunctionVectorValueProcessor} for
* long[] primitives.
*/
public abstract class BivariateDoubleFunctionVectorValueProcessor<TLeftInput, TRightInput>
implements ExprVectorProcessor<double[]>
{
final ExprVectorProcessor<TLeftInput> left;
final ExprVectorProcessor<TRightInput> right;
final int maxVectorSize;
final boolean[] outNulls;
final double[] outValues;

protected BivariateDoubleFunctionVectorValueProcessor(
ExprVectorProcessor<TLeftInput> left,
ExprVectorProcessor<TRightInput> right,
int maxVectorSize
)
{
this.left = left;
this.right = right;
this.maxVectorSize = maxVectorSize;
this.outValues = new double[maxVectorSize];
this.outNulls = new boolean[maxVectorSize];
}

@Override
public final ExprEvalVector<double[]> evalVector(Expr.VectorInputBinding bindings)
{
final ExprEvalVector<TLeftInput> lhs = left.evalVector(bindings);
final ExprEvalVector<TRightInput> rhs = right.evalVector(bindings);

final int currentSize = bindings.getCurrentVectorSize();
final boolean[] leftNulls = lhs.getNullVector();
final boolean[] rightNulls = rhs.getNullVector();
final boolean hasLeftNulls = leftNulls != null;
final boolean hasRightNulls = rightNulls != null;
final boolean hasNulls = hasLeftNulls || hasRightNulls;

final TLeftInput leftInput = lhs.values();
final TRightInput rightInput = rhs.values();

if (hasNulls) {
for (int i = 0; i < currentSize; i++) {
outNulls[i] = (hasLeftNulls && leftNulls[i]) || (hasRightNulls && rightNulls[i]);
if (!outNulls[i]) {
processIndex(leftInput, rightInput, i);
} else {
outValues[i] = 0.0;
}
}
} else {
for (int i = 0; i < currentSize; i++) {
processIndex(leftInput, rightInput, i);
outNulls[i] = false;
}
}
return asEval();
}

abstract void processIndex(TLeftInput leftInput, TRightInput rightInput, int i);

final ExprEvalVector<double[]> asEval()
{
return new ExprEvalDoubleVector(outValues, outNulls);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@

/**
* Basic vector processor that processes 2 inputs and works for both primitive value vectors and object vectors.
* Different from {@link BivariateFunctionVectorValueProcessor} and {@link BivariateFunctionVectorObjectProcessor} in
* that subclasses of this class must check for and directly decide how to handle null values.
* Different from {@link BivariateLongFunctionVectorValueProcessor}, {@link BivariateDoubleFunctionVectorValueProcessor}
* and {@link BivariateFunctionVectorObjectProcessor} in that subclasses of this class must check for and directly
* decide how to handle null values.
*/
public abstract class BivariateFunctionVectorProcessor<TLeftInput, TRightInput, TOutput>
implements ExprVectorProcessor<TOutput>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,32 +25,34 @@
* common machinery for processing two input operators and functions, which should always treat null inputs as null
* output, and are backed by a primitive values instead of an object values (and need to use the null vectors instead of
* checking the vector themselves for nulls)
*
* this one is specialized for producing long[], see {@link BivariateDoubleFunctionVectorValueProcessor} for
* double[] primitives.
*/
public abstract class BivariateFunctionVectorValueProcessor<TLeftInput, TRightInput, TOutput>
implements ExprVectorProcessor<TOutput>
public abstract class BivariateLongFunctionVectorValueProcessor<TLeftInput, TRightInput>
implements ExprVectorProcessor<long[]>
{
final ExprVectorProcessor<TLeftInput> left;
final ExprVectorProcessor<TRightInput> right;
final int maxVectorSize;
final boolean[] outNulls;
final TOutput outValues;
final long[] outValues;

protected BivariateFunctionVectorValueProcessor(
protected BivariateLongFunctionVectorValueProcessor(
ExprVectorProcessor<TLeftInput> left,
ExprVectorProcessor<TRightInput> right,
int maxVectorSize,
TOutput outValues
int maxVectorSize
)
{
this.left = left;
this.right = right;
this.maxVectorSize = maxVectorSize;
this.outValues = new long[maxVectorSize];
this.outNulls = new boolean[maxVectorSize];
this.outValues = outValues;
}

@Override
public final ExprEvalVector<TOutput> evalVector(Expr.VectorInputBinding bindings)
public final ExprEvalVector<long[]> evalVector(Expr.VectorInputBinding bindings)
{
final ExprEvalVector<TLeftInput> lhs = left.evalVector(bindings);
final ExprEvalVector<TRightInput> rhs = right.evalVector(bindings);
Expand All @@ -70,6 +72,8 @@ public final ExprEvalVector<TOutput> evalVector(Expr.VectorInputBinding bindings
outNulls[i] = (hasLeftNulls && leftNulls[i]) || (hasRightNulls && rightNulls[i]);
if (!outNulls[i]) {
processIndex(leftInput, rightInput, i);
} else {
outValues[i] = 0L;
}
}
} else {
Expand All @@ -83,5 +87,8 @@ public final ExprEvalVector<TOutput> evalVector(Expr.VectorInputBinding bindings

abstract void processIndex(TLeftInput leftInput, TRightInput rightInput, int i);

abstract ExprEvalVector<TOutput> asEval();
final ExprEvalVector<long[]> asEval()
{
return new ExprEvalLongVector(outValues, outNulls);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@
import org.apache.druid.math.expr.ExpressionType;

/**
* specialized {@link UnivariateFunctionVectorValueProcessor} for processing (double[]) -> double[]
* specialized {@link UnivariateDoubleFunctionVectorValueProcessor} for processing (double[]) -> double[]
*/
public abstract class DoubleOutDoubleInFunctionVectorValueProcessor
extends UnivariateFunctionVectorValueProcessor<double[], double[]>
extends UnivariateDoubleFunctionVectorValueProcessor<double[]>
{
public DoubleOutDoubleInFunctionVectorValueProcessor(ExprVectorProcessor<double[]> processor, int maxVectorSize)
{
super(CastToTypeVectorProcessor.cast(processor, ExpressionType.DOUBLE), maxVectorSize, new double[maxVectorSize]);
super(CastToTypeVectorProcessor.cast(processor, ExpressionType.DOUBLE), maxVectorSize);
}

public abstract double apply(double input);
Expand All @@ -45,10 +45,4 @@ final void processIndex(double[] input, int i)
{
outValues[i] = apply(input[i]);
}

@Override
final ExprEvalVector<double[]> asEval()
{
return new ExprEvalDoubleVector(outValues, outNulls);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@
import org.apache.druid.math.expr.ExpressionType;

/**
* specialized {@link BivariateFunctionVectorValueProcessor} for processing (double[], long[]) -> double[]
* specialized {@link BivariateDoubleFunctionVectorValueProcessor} for processing (double[], long[]) -> double[]
*/
public abstract class DoubleOutDoubleLongInFunctionVectorValueProcessor
extends BivariateFunctionVectorValueProcessor<double[], long[], double[]>
extends BivariateDoubleFunctionVectorValueProcessor<double[], long[]>
{
public DoubleOutDoubleLongInFunctionVectorValueProcessor(
ExprVectorProcessor<double[]> left,
Expand All @@ -36,8 +36,7 @@ public DoubleOutDoubleLongInFunctionVectorValueProcessor(
super(
CastToTypeVectorProcessor.cast(left, ExpressionType.DOUBLE),
CastToTypeVectorProcessor.cast(right, ExpressionType.LONG),
maxVectorSize,
new double[maxVectorSize]
maxVectorSize
);
}

Expand All @@ -54,10 +53,4 @@ final void processIndex(double[] leftInput, long[] rightInput, int i)
{
outValues[i] = apply(leftInput[i], rightInput[i]);
}

@Override
final ExprEvalVector<double[]> asEval()
{
return new ExprEvalDoubleVector(outValues, outNulls);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@
import org.apache.druid.math.expr.ExpressionType;

/**
* specialized {@link BivariateFunctionVectorValueProcessor} for processing (double[], double[]) -> double[]
* specialized {@link BivariateDoubleFunctionVectorValueProcessor} for processing (double[], double[]) -> double[]
*/
public abstract class DoubleOutDoublesInFunctionVectorValueProcessor
extends BivariateFunctionVectorValueProcessor<double[], double[], double[]>
extends BivariateDoubleFunctionVectorValueProcessor<double[], double[]>
{
public DoubleOutDoublesInFunctionVectorValueProcessor(
ExprVectorProcessor<double[]> left,
Expand All @@ -36,8 +36,7 @@ public DoubleOutDoublesInFunctionVectorValueProcessor(
super(
CastToTypeVectorProcessor.cast(left, ExpressionType.DOUBLE),
CastToTypeVectorProcessor.cast(right, ExpressionType.DOUBLE),
maxVectorSize,
new double[maxVectorSize]
maxVectorSize
);
}

Expand All @@ -54,10 +53,4 @@ final void processIndex(double[] leftInput, double[] rightInput, int i)
{
outValues[i] = apply(leftInput[i], rightInput[i]);
}

@Override
final ExprEvalVector<double[]> asEval()
{
return new ExprEvalDoubleVector(outValues, outNulls);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@
import org.apache.druid.math.expr.ExpressionType;

/**
* specialized {@link BivariateFunctionVectorValueProcessor} for processing (long[], double[]) -> double[]
* specialized {@link BivariateDoubleFunctionVectorValueProcessor} for processing (long[], double[]) -> double[]
*/
public abstract class DoubleOutLongDoubleInFunctionVectorValueProcessor
extends BivariateFunctionVectorValueProcessor<long[], double[], double[]>
extends BivariateDoubleFunctionVectorValueProcessor<long[], double[]>
{
public DoubleOutLongDoubleInFunctionVectorValueProcessor(
ExprVectorProcessor<long[]> left,
Expand All @@ -36,8 +36,7 @@ public DoubleOutLongDoubleInFunctionVectorValueProcessor(
super(
CastToTypeVectorProcessor.cast(left, ExpressionType.LONG),
CastToTypeVectorProcessor.cast(right, ExpressionType.DOUBLE),
maxVectorSize,
new double[maxVectorSize]
maxVectorSize
);
}

Expand All @@ -54,10 +53,4 @@ final void processIndex(long[] leftInput, double[] rightInput, int i)
{
outValues[i] = apply(leftInput[i], rightInput[i]);
}

@Override
final ExprEvalVector<double[]> asEval()
{
return new ExprEvalDoubleVector(outValues, outNulls);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@
import org.apache.druid.math.expr.ExpressionType;

/**
* specialized {@link UnivariateFunctionVectorValueProcessor} for processing (long[]) -> double[]
* specialized {@link UnivariateDoubleFunctionVectorValueProcessor} for processing (long[]) -> double[]
*/
public abstract class DoubleOutLongInFunctionVectorValueProcessor
extends UnivariateFunctionVectorValueProcessor<long[], double[]>
extends UnivariateDoubleFunctionVectorValueProcessor<long[]>
{
public DoubleOutLongInFunctionVectorValueProcessor(ExprVectorProcessor<long[]> processor, int maxVectorSize)
{
super(CastToTypeVectorProcessor.cast(processor, ExpressionType.LONG), maxVectorSize, new double[maxVectorSize]);
super(CastToTypeVectorProcessor.cast(processor, ExpressionType.LONG), maxVectorSize);
}

public abstract double apply(long input);
Expand All @@ -45,10 +45,4 @@ final void processIndex(long[] input, int i)
{
outValues[i] = apply(input[i]);
}

@Override
final ExprEvalVector<double[]> asEval()
{
return new ExprEvalDoubleVector(outValues, outNulls);
}
}
Loading