From d3c3347b3cf2c9e3c48b2011f6b6da2ade11179c Mon Sep 17 00:00:00 2001 From: Clint Wylie Date: Fri, 9 Oct 2020 11:11:37 -0700 Subject: [PATCH 1/5] support for vectorizing expressions with non-existent inputs, more consistent type handling for non-vectorized expressions --- .../apache/druid/math/expr/ApplyFunction.java | 34 +-- .../math/expr/BinaryLogicalOperatorExpr.java | 36 +-- .../math/expr/BinaryMathOperatorExpr.java | 24 +- .../druid/math/expr/BinaryOperatorExpr.java | 26 +- .../apache/druid/math/expr/ConstantExpr.java | 22 +- .../java/org/apache/druid/math/expr/Expr.java | 29 ++- .../org/apache/druid/math/expr/ExprType.java | 2 +- .../druid/math/expr/ExprTypeConversion.java | 78 +++--- .../org/apache/druid/math/expr/Function.java | 244 +++++++++--------- .../druid/math/expr/FunctionalExpr.java | 18 +- .../druid/math/expr/IdentifierExpr.java | 18 +- .../druid/math/expr/UnaryOperatorExpr.java | 8 +- .../vector/CastToTypeVectorProcessor.java | 2 +- ...bleOutDoubleInFunctionVectorProcessor.java | 2 +- ...utDoubleLongInFunctionVectorProcessor.java | 7 +- ...leOutDoublesInFunctionVectorProcessor.java | 7 +- ...utLongDoubleInFunctionVectorProcessor.java | 7 +- ...oubleOutLongInFunctionVectorProcessor.java | 2 +- ...ubleOutLongsInFunctionVectorProcessor.java | 7 +- ...ongOutDoubleInFunctionVectorProcessor.java | 2 +- ...utDoubleLongInFunctionVectorProcessor.java | 7 +- ...ngOutDoublesInFunctionVectorProcessor.java | 7 +- ...utLongDoubleInFunctionVectorProcessor.java | 7 +- .../LongOutLongInFunctionVectorProcessor.java | 2 +- ...LongOutLongsInFunctionVectorProcessor.java | 7 +- ...ongOutStringInFunctionVectorProcessor.java | 2 +- .../vector/VectorComparisonProcessors.java | 12 +- .../expr/vector/VectorMathProcessors.java | 197 +++++++------- .../math/expr/vector/VectorProcessors.java | 4 +- .../druid/math/expr/OutputTypeTest.java | 82 +++--- .../druid/math/expr/VectorExprSanityTest.java | 30 ++- .../expressions/BloomFilterExprMacro.java | 2 +- .../druid/query/expression/ContainsExpr.java | 2 +- .../expression/IPv4AddressMatchExprMacro.java | 2 +- .../expression/IPv4AddressParseExprMacro.java | 2 +- .../IPv4AddressStringifyExprMacro.java | 2 +- .../druid/query/expression/LikeExprMacro.java | 2 +- .../query/expression/LookupExprMacro.java | 2 +- .../expression/RegexpExtractExprMacro.java | 2 +- .../query/expression/RegexpLikeExprMacro.java | 2 +- .../expression/TimestampCeilExprMacro.java | 4 +- .../expression/TimestampExtractExprMacro.java | 2 +- .../expression/TimestampFloorExprMacro.java | 10 +- .../expression/TimestampFormatExprMacro.java | 2 +- .../expression/TimestampParseExprMacro.java | 2 +- .../expression/TimestampShiftExprMacro.java | 4 +- .../druid/query/expression/TrimExprMacro.java | 4 +- .../apache/druid/segment/ColumnInspector.java | 2 +- .../segment/vector/NilVectorSelector.java | 2 +- .../druid/segment/virtual/ExpressionPlan.java | 6 +- .../segment/virtual/ExpressionPlanner.java | 33 ++- .../segment/virtual/ExpressionSelectors.java | 5 +- .../ExpressionVectorSelectorsTest.java | 3 + .../virtual/ExpressionVirtualColumnTest.java | 6 +- .../ReductionOperatorConversionHelper.java | 2 +- .../SqlVectorizedExpressionSanityTest.java | 14 +- 56 files changed, 588 insertions(+), 463 deletions(-) diff --git a/core/src/main/java/org/apache/druid/math/expr/ApplyFunction.java b/core/src/main/java/org/apache/druid/math/expr/ApplyFunction.java index 891216c9c6b8..48af3ab71e14 100644 --- a/core/src/main/java/org/apache/druid/math/expr/ApplyFunction.java +++ b/core/src/main/java/org/apache/druid/math/expr/ApplyFunction.java @@ -56,10 +56,10 @@ public interface ApplyFunction * If this method returns true, {@link #asVectorProcessor} is expected to produce a {@link ExprVectorProcessor} which * can evaluate values in batches to use with vectorized query engines. * - * @see Expr#canVectorize(Expr.InputBindingTypes) - * @see Function#canVectorize(Expr.InputBindingTypes, List) + * @see Expr#canVectorize(Expr.InputBindingInspector) + * @see Function#canVectorize(Expr.InputBindingInspector, List) */ - default boolean canVectorize(Expr.InputBindingTypes inputTypes, Expr lambda, List args) + default boolean canVectorize(Expr.InputBindingInspector inputTypes, Expr lambda, List args) { return false; } @@ -68,10 +68,10 @@ default boolean canVectorize(Expr.InputBindingTypes inputTypes, Expr lambda, Lis * Builds a 'vectorized' function expression processor, that can build vectorized processors for its input values * using {@link Expr#buildVectorized}, for use in vectorized query engines. * - * @see Expr#buildVectorized(Expr.VectorInputBindingTypes) - * @see Function#asVectorProcessor(Expr.VectorInputBindingTypes, List) + * @see Expr#buildVectorized(Expr.VectorInputBindingInspector) + * @see Function#asVectorProcessor(Expr.VectorInputBindingInspector, List) */ - default ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, Expr lambda, List args) + default ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, Expr lambda, List args) { throw new UOE("%s is not vectorized", name()); } @@ -109,7 +109,7 @@ default boolean hasArrayOutput(LambdaExpr lambdaExpr) * @see Expr#getOutputType */ @Nullable - ExprType getOutputType(Expr.InputBindingTypes inputTypes, LambdaExpr expr, List args); + ExprType getOutputType(Expr.InputBindingInspector inputTypes, LambdaExpr expr, List args); /** * Base class for "map" functions, which are a class of {@link ApplyFunction} which take a lambda function that is @@ -126,9 +126,9 @@ public boolean hasArrayOutput(LambdaExpr lambdaExpr) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, LambdaExpr expr, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, LambdaExpr expr, List args) { - return ExprType.asArrayType(expr.getOutputType(new LambdaInputBindingTypes(inputTypes, expr, args))); + return ExprType.asArrayType(expr.getOutputType(new LambdaInputBindingInspector(inputTypes, expr, args))); } /** @@ -332,7 +332,7 @@ public boolean hasArrayOutput(LambdaExpr lambdaExpr) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, LambdaExpr expr, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, LambdaExpr expr, List args) { // output type is accumulator type, which is last argument return args.get(args.size() - 1).getOutputType(inputTypes); @@ -535,7 +535,7 @@ public void validateArguments(LambdaExpr lambdaExpr, List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, LambdaExpr expr, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, LambdaExpr expr, List args) { // output type is input array type return args.get(0).getOutputType(inputTypes); @@ -590,7 +590,7 @@ public void validateArguments(LambdaExpr lambdaExpr, List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, LambdaExpr expr, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, LambdaExpr expr, List args) { return ExprType.LONG; } @@ -917,18 +917,18 @@ public CartesianFoldLambdaBinding accumulateWithIndex(int index, Object acc) } /** - * Helper that can wrap another {@link Expr.InputBindingTypes} to use to supply the type information of a + * Helper that can wrap another {@link Expr.InputBindingInspector} to use to supply the type information of a * {@link LambdaExpr} when evaluating {@link ApplyFunctionExpr#getOutputType}. Lambda identifiers do not exist - * in the underlying {@link Expr.InputBindingTypes}, but can be created by mapping the lambda identifiers to the + * in the underlying {@link Expr.InputBindingInspector}, but can be created by mapping the lambda identifiers to the * arguments that will be applied to them, to map the type information. */ - class LambdaInputBindingTypes implements Expr.InputBindingTypes + class LambdaInputBindingInspector implements Expr.InputBindingInspector { private final Object2IntMap lambdaIdentifiers; - private final Expr.InputBindingTypes inputTypes; + private final Expr.InputBindingInspector inputTypes; private final List args; - public LambdaInputBindingTypes(Expr.InputBindingTypes inputTypes, LambdaExpr expr, List args) + public LambdaInputBindingInspector(Expr.InputBindingInspector inputTypes, LambdaExpr expr, List args) { this.inputTypes = inputTypes; this.args = args; diff --git a/core/src/main/java/org/apache/druid/math/expr/BinaryLogicalOperatorExpr.java b/core/src/main/java/org/apache/druid/math/expr/BinaryLogicalOperatorExpr.java index a230cd638609..3f79c71ea1e5 100644 --- a/core/src/main/java/org/apache/druid/math/expr/BinaryLogicalOperatorExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/BinaryLogicalOperatorExpr.java @@ -62,7 +62,7 @@ protected final double evalDouble(double left, double right) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { ExprType implicitCast = super.getOutputType(inputTypes); if (ExprType.STRING.equals(implicitCast)) { @@ -72,13 +72,13 @@ public ExprType getOutputType(InputBindingTypes inputTypes) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorComparisonProcessors.lessThan(inputTypes, left, right); } @@ -118,7 +118,7 @@ protected final double evalDouble(double left, double right) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { ExprType implicitCast = super.getOutputType(inputTypes); if (ExprType.STRING.equals(implicitCast)) { @@ -128,13 +128,13 @@ public ExprType getOutputType(InputBindingTypes inputTypes) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorComparisonProcessors.lessThanOrEqual(inputTypes, left, right); } @@ -174,7 +174,7 @@ protected final double evalDouble(double left, double right) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { ExprType implicitCast = super.getOutputType(inputTypes); if (ExprType.STRING.equals(implicitCast)) { @@ -183,13 +183,13 @@ public ExprType getOutputType(InputBindingTypes inputTypes) return implicitCast; } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorComparisonProcessors.greaterThan(inputTypes, left, right); } @@ -229,7 +229,7 @@ protected final double evalDouble(double left, double right) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { ExprType implicitCast = super.getOutputType(inputTypes); if (ExprType.STRING.equals(implicitCast)) { @@ -239,13 +239,13 @@ public ExprType getOutputType(InputBindingTypes inputTypes) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorComparisonProcessors.greaterThanOrEqual(inputTypes, left, right); } @@ -284,7 +284,7 @@ protected final double evalDouble(double left, double right) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { ExprType implicitCast = super.getOutputType(inputTypes); if (ExprType.STRING.equals(implicitCast)) { @@ -294,13 +294,13 @@ public ExprType getOutputType(InputBindingTypes inputTypes) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorComparisonProcessors.equal(inputTypes, left, right); } @@ -339,7 +339,7 @@ protected final double evalDouble(double left, double right) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { ExprType implicitCast = super.getOutputType(inputTypes); if (ExprType.STRING.equals(implicitCast)) { @@ -349,13 +349,13 @@ public ExprType getOutputType(InputBindingTypes inputTypes) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorComparisonProcessors.notEqual(inputTypes, left, right); } diff --git a/core/src/main/java/org/apache/druid/math/expr/BinaryMathOperatorExpr.java b/core/src/main/java/org/apache/druid/math/expr/BinaryMathOperatorExpr.java index 39b5e1360c36..d31bf4f60f6f 100644 --- a/core/src/main/java/org/apache/druid/math/expr/BinaryMathOperatorExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/BinaryMathOperatorExpr.java @@ -61,13 +61,13 @@ protected double evalDouble(double left, double right) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorMathProcessors.plus(inputTypes, left, right); } @@ -99,13 +99,13 @@ protected double evalDouble(double left, double right) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorMathProcessors.minus(inputTypes, left, right); } @@ -137,13 +137,13 @@ protected double evalDouble(double left, double right) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorMathProcessors.multiply(inputTypes, left, right); } @@ -175,13 +175,13 @@ protected double evalDouble(double left, double right) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorMathProcessors.divide(inputTypes, left, right); } @@ -213,13 +213,13 @@ protected double evalDouble(double left, double right) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorMathProcessors.power(inputTypes, left, right); } @@ -251,13 +251,13 @@ protected double evalDouble(double left, double right) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorMathProcessors.modulo(inputTypes, left, right); } diff --git a/core/src/main/java/org/apache/druid/math/expr/BinaryOperatorExpr.java b/core/src/main/java/org/apache/druid/math/expr/BinaryOperatorExpr.java index 20ecc5dbfb2d..79c85d48d0e3 100644 --- a/core/src/main/java/org/apache/druid/math/expr/BinaryOperatorExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/BinaryOperatorExpr.java @@ -81,7 +81,7 @@ public BindingAnalysis analyzeInputs() @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { if (left.isNullLiteral()) { return right.getOutputType(inputTypes); @@ -137,18 +137,18 @@ public ExprEval eval(ObjectBinding bindings) return ExprEval.of(null); } - if (leftVal.type() == ExprType.STRING && rightVal.type() == ExprType.STRING) { - return evalString(leftVal.asString(), rightVal.asString()); - } else if (leftVal.type() == ExprType.LONG && rightVal.type() == ExprType.LONG) { - if (NullHandling.sqlCompatible() && (leftVal.isNumericNull() || rightVal.isNumericNull())) { - return ExprEval.of(null); - } - return ExprEval.of(evalLong(leftVal.asLong(), rightVal.asLong())); - } else { - if (NullHandling.sqlCompatible() && (leftVal.isNumericNull() || rightVal.isNumericNull())) { - return ExprEval.of(null); - } - return ExprEval.of(evalDouble(leftVal.asDouble(), rightVal.asDouble())); + ExprType type = ExprTypeConversion.autoDetect(leftVal, rightVal); + switch (type) { + case STRING: + return evalString(leftVal.asString(), rightVal.asString()); + case LONG: + return ExprEval.of(evalLong(leftVal.asLong(), rightVal.asLong())); + case DOUBLE: + default: + if (NullHandling.sqlCompatible() && (leftVal.isNumericNull() || rightVal.isNumericNull())) { + return ExprEval.of(null); + } + return ExprEval.of(evalDouble(leftVal.asDouble(), rightVal.asDouble())); } } diff --git a/core/src/main/java/org/apache/druid/math/expr/ConstantExpr.java b/core/src/main/java/org/apache/druid/math/expr/ConstantExpr.java index 57ae9001ae5d..75c327651a23 100644 --- a/core/src/main/java/org/apache/druid/math/expr/ConstantExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/ConstantExpr.java @@ -46,7 +46,7 @@ protected ConstantExpr(ExprType outputType) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return outputType; } @@ -135,13 +135,13 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorProcessors.constantLong(value, inputTypes.getMaxVectorSize()); } @@ -180,13 +180,13 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorProcessors.constantLong(null, inputTypes.getMaxVectorSize()); } @@ -290,13 +290,13 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorProcessors.constantDouble(value, inputTypes.getMaxVectorSize()); } @@ -334,13 +334,13 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorProcessors.constantDouble(null, inputTypes.getMaxVectorSize()); } @@ -452,13 +452,13 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorProcessors.constantString(value, inputTypes.getMaxVectorSize()); } diff --git a/core/src/main/java/org/apache/druid/math/expr/Expr.java b/core/src/main/java/org/apache/druid/math/expr/Expr.java index ff646feb6816..2767edec65e6 100644 --- a/core/src/main/java/org/apache/druid/math/expr/Expr.java +++ b/core/src/main/java/org/apache/druid/math/expr/Expr.java @@ -132,13 +132,13 @@ default String getBindingIfIdentifier() BindingAnalysis analyzeInputs(); /** - * Given an {@link InputBindingTypes}, compute what the output {@link ExprType} will be for this expression. A return + * Given an {@link InputBindingInspector}, compute what the output {@link ExprType} will be for this expression. A return * value of null indicates that the given type information was not enough to resolve the output type, so the * expression must be evaluated using default {@link #eval} handling where types are only known after evaluation, * through {@link ExprEval#type}. */ @Nullable - default ExprType getOutputType(InputBindingTypes inputTypes) + default ExprType getOutputType(InputBindingInspector inputTypes) { return null; } @@ -148,7 +148,7 @@ default ExprType getOutputType(InputBindingTypes inputTypes) * {@link #buildVectorized} is expected to produce a {@link ExprVectorProcessor} which can evaluate values in batches * to use with vectorized query engines. */ - default boolean canVectorize(InputBindingTypes inputTypes) + default boolean canVectorize(InputBindingInspector inputTypes) { return false; } @@ -157,7 +157,7 @@ default boolean canVectorize(InputBindingTypes inputTypes) * Builds a 'vectorized' expression processor, that can operate on batches of input values for use in vectorized * query engines. */ - default ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + default ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { throw Exprs.cannotVectorize(this); } @@ -167,8 +167,12 @@ default ExprVectorProcessor buildVectorized(VectorInputBindingTypes input * inferring the output type of an expression with {@link #getOutputType}. A null value means that either the binding * doesn't exist, or, that the type information is unavailable. */ - interface InputBindingTypes + interface InputBindingInspector { + /** + * Get the {@link ExprType} from the backing store for a given identifier (this is likely a column, but could be other + * things depending on the backing adapter) + */ @Nullable ExprType getType(String name); @@ -179,12 +183,11 @@ interface InputBindingTypes */ default boolean areNumeric(List args) { - boolean numeric = args.size() > 0; + boolean numeric = true; for (Expr arg : args) { ExprType argType = arg.getOutputType(this); if (argType == null) { - numeric = false; - break; + continue; } numeric &= argType.isNumeric(); } @@ -202,7 +205,7 @@ default boolean areNumeric(Expr... args) } /** - * Check if every provided {@link Expr} computes {@link Expr#canVectorize(InputBindingTypes)} to a value of true + * Check if every provided {@link Expr} computes {@link Expr#canVectorize(InputBindingInspector)} to a value of true */ default boolean canVectorize(List args) { @@ -214,7 +217,7 @@ default boolean canVectorize(List args) } /** - * Check if every provided {@link Expr} computes {@link Expr#canVectorize(InputBindingTypes)} to a value of true + * Check if every provided {@link Expr} computes {@link Expr#canVectorize(InputBindingInspector)} to a value of true */ default boolean canVectorize(Expr... args) { @@ -223,9 +226,9 @@ default boolean canVectorize(Expr... args) } /** - * {@link InputBindingTypes} + vectorizations stuff for {@link #buildVectorized} + * {@link InputBindingInspector} + vectorizations stuff for {@link #buildVectorized} */ - interface VectorInputBindingTypes extends InputBindingTypes + interface VectorInputBindingInspector extends InputBindingInspector { int getMaxVectorSize(); } @@ -247,7 +250,7 @@ interface ObjectBinding * the vectorized column selector interfaces, and includes {@link ExprType} information about all input bindings * which exist */ - interface VectorInputBinding extends VectorInputBindingTypes + interface VectorInputBinding extends VectorInputBindingInspector { T[] getObjectVector(String name); diff --git a/core/src/main/java/org/apache/druid/math/expr/ExprType.java b/core/src/main/java/org/apache/druid/math/expr/ExprType.java index ebdf64af1c93..4c9949d824e3 100644 --- a/core/src/main/java/org/apache/druid/math/expr/ExprType.java +++ b/core/src/main/java/org/apache/druid/math/expr/ExprType.java @@ -126,7 +126,7 @@ public static ValueType toValueType(ExprType exprType) } } - public static boolean isNumeric(ExprType type) + public static boolean isNumeric(@Nullable ExprType type) { return LONG.equals(type) || DOUBLE.equals(type); } diff --git a/core/src/main/java/org/apache/druid/math/expr/ExprTypeConversion.java b/core/src/main/java/org/apache/druid/math/expr/ExprTypeConversion.java index 2fc4577f0b19..8863d3963d21 100644 --- a/core/src/main/java/org/apache/druid/math/expr/ExprTypeConversion.java +++ b/core/src/main/java/org/apache/druid/math/expr/ExprTypeConversion.java @@ -31,7 +31,7 @@ public class ExprTypeConversion * Infer the output type of a list of possible 'conditional' expression outputs (where any of these could be the * output expression if the corresponding case matching expression evaluates to true) */ - static ExprType conditional(Expr.InputBindingTypes inputTypes, List args) + static ExprType conditional(Expr.InputBindingInspector inputTypes, List args) { ExprType type = null; for (Expr arg : args) { @@ -41,12 +41,30 @@ static ExprType conditional(Expr.InputBindingTypes inputTypes, List args) if (type == null) { type = arg.getOutputType(inputTypes); } else { - type = doubleMathFunction(type, arg.getOutputType(inputTypes)); + type = function(type, arg.getOutputType(inputTypes)); } } return type; } + /** + * Given 2 'input' types, which might not be fully trustable, choose the most appropriate combined type for + * non-vectorized, per-row type detection. In this mode, null values are {@link ExprType#STRING} typed, despite + * potentially coming from an underlying numeric column. This method is not well suited for array handling + */ + public static ExprType autoDetect(ExprEval result, ExprEval other) + { + ExprType type = result.type(); + ExprType otherType = other.type(); + if (type == ExprType.STRING && otherType == ExprType.STRING) { + return ExprType.STRING; + } + + type = result.value() != null ? type : otherType; + otherType = other.value() != null ? otherType : type; + return numeric(type, otherType); + } + /** * Given 2 'input' types, choose the most appropriate combined type, if possible * @@ -58,13 +76,14 @@ static ExprType conditional(Expr.InputBindingTypes inputTypes, List args) @Nullable public static ExprType operator(@Nullable ExprType type, @Nullable ExprType other) { - if (type == null || other == null) { - // cannot auto conversion unknown types - return null; + if (type == null) { + return other; + } + if (other == null) { + return type; } - // arrays cannot be auto converted if (ExprType.isArray(type) || ExprType.isArray(other)) { - if (!type.equals(other)) { + if (type != other) { throw new IAE("Cannot implicitly cast %s to %s", type, other); } return type; @@ -74,6 +93,15 @@ public static ExprType operator(@Nullable ExprType type, @Nullable ExprType othe return ExprType.STRING; } + // non-vectorized expressions + if (type == ExprType.STRING) { + return other; + } + + if (other == ExprType.STRING) { + return type; + } + // otherwise a decimal or integer number return numeric(type, other); } @@ -87,15 +115,17 @@ public static ExprType operator(@Nullable ExprType type, @Nullable ExprType othe * {@link ExprType#DOUBLE} */ @Nullable - public static ExprType doubleMathFunction(@Nullable ExprType type, @Nullable ExprType other) + public static ExprType function(@Nullable ExprType type, @Nullable ExprType other) { - if (type == null || other == null) { - // cannot auto conversion unknown types - return null; + if (type == null) { + type = other; + } + if (other == null) { + other = type; } // arrays cannot be auto converted if (ExprType.isArray(type) || ExprType.isArray(other)) { - if (!type.equals(other)) { + if (type != other) { throw new IAE("Cannot implicitly cast %s to %s", type, other); } return type; @@ -108,6 +138,7 @@ public static ExprType doubleMathFunction(@Nullable ExprType type, @Nullable Exp return numeric(type, other); } + /** * Given 2 'input' types, choose the most appropriate combined type, if possible * @@ -118,37 +149,22 @@ public static ExprType doubleMathFunction(@Nullable ExprType type, @Nullable Exp @Nullable public static ExprType integerMathFunction(@Nullable ExprType type, @Nullable ExprType other) { - if (type == null || other == null) { - // cannot auto conversion unknown types - return null; - } - // arrays cannot be auto converted - if (ExprType.isArray(type) || ExprType.isArray(other)) { - if (!type.equals(other)) { - throw new IAE("Cannot implicitly cast %s to %s", type, other); - } - return type; - } - // if either argument is a string, type becomes a string - if (ExprType.STRING.equals(type) || ExprType.STRING.equals(other)) { - return ExprType.STRING; - } - + final ExprType functionType = ExprTypeConversion.function(type, other); // any number is long - return ExprType.LONG; + return ExprType.isNumeric(functionType) ? ExprType.LONG : functionType; } /** * Default best effort numeric type conversion. If both types are {@link ExprType#LONG}, returns * {@link ExprType#LONG}, else {@link ExprType#DOUBLE} */ - public static ExprType numeric(ExprType type, ExprType other) + public static ExprType numeric(@Nullable ExprType type, @Nullable ExprType other) { // all numbers win over longs + // floats vs doubles would be handled here, but we currently only support doubles... if (ExprType.LONG.equals(type) && ExprType.LONG.equals(other)) { return ExprType.LONG; } - // floats vs doubles would be handled here, but we currently only support doubles... return ExprType.DOUBLE; } diff --git a/core/src/main/java/org/apache/druid/math/expr/Function.java b/core/src/main/java/org/apache/druid/math/expr/Function.java index 488a35cd7784..8ac1097a656a 100644 --- a/core/src/main/java/org/apache/druid/math/expr/Function.java +++ b/core/src/main/java/org/apache/druid/math/expr/Function.java @@ -115,17 +115,17 @@ default boolean hasArrayOutput() * @see Expr#getOutputType */ @Nullable - ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args); + ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args); /** * Check if a function can be 'vectorized', for a given set of {@link Expr} inputs. If this method returns true, * {@link #asVectorProcessor} is expected to produce a {@link ExprVectorProcessor} which can evaluate values in * batches to use with vectorized query engines. * - * @see Expr#canVectorize(Expr.InputBindingTypes) - * @see ApplyFunction#canVectorize(Expr.InputBindingTypes, Expr, List) + * @see Expr#canVectorize(Expr.InputBindingInspector) + * @see ApplyFunction#canVectorize(Expr.InputBindingInspector, Expr, List) */ - default boolean canVectorize(Expr.InputBindingTypes inputTypes, List args) + default boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) { return false; } @@ -134,10 +134,10 @@ default boolean canVectorize(Expr.InputBindingTypes inputTypes, List args) * Builds a 'vectorized' function expression processor, that can build vectorized processors for its input values * using {@link Expr#buildVectorized}, for use in vectorized query engines. * - * @see Expr#buildVectorized(Expr.VectorInputBindingTypes) - * @see ApplyFunction#asVectorProcessor(Expr.VectorInputBindingTypes, Expr, List) + * @see Expr#buildVectorized(Expr.VectorInputBindingInspector) + * @see ApplyFunction#asVectorProcessor(Expr.VectorInputBindingInspector, Expr, List) */ - default ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + default ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { throw new UOE("%s is not vectorized", name()); } @@ -221,13 +221,13 @@ protected ExprEval eval(double param) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return args.get(0).getOutputType(inputTypes); } @Override - public boolean canVectorize(Expr.InputBindingTypes inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) { return inputTypes.areNumeric(args) && inputTypes.canVectorize(args); } @@ -240,7 +240,7 @@ abstract class DoubleUnivariateMathFunction extends UnivariateMathFunction { @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.DOUBLE; } @@ -255,13 +255,20 @@ abstract class BivariateMathFunction extends BivariateFunction @Override protected final ExprEval eval(ExprEval x, ExprEval y) { - if (x.type() == ExprType.STRING || y.type() == ExprType.STRING) { + // match the logic of BinaryEvalOpExprBase.eval, except there is no string handling so both strings is also null + if (NullHandling.sqlCompatible() && (x.value() == null || y.value() == null)) { return ExprEval.of(null); } - if (x.type() == ExprType.LONG && y.type() == ExprType.LONG) { - return eval(x.asLong(), y.asLong()); - } else { - return eval(x.asDouble(), y.asDouble()); + + ExprType type = ExprTypeConversion.autoDetect(x, y); + switch (type) { + case STRING: + return ExprEval.of(null); + case LONG: + return eval(x.asLong(), y.asLong()); + case DOUBLE: + default: + return eval(x.asDouble(), y.asDouble()); } } @@ -277,13 +284,16 @@ protected ExprEval eval(double x, double y) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { - return ExprTypeConversion.doubleMathFunction(args.get(0).getOutputType(inputTypes), args.get(1).getOutputType(inputTypes)); + return ExprTypeConversion.function( + args.get(0).getOutputType(inputTypes), + args.get(1).getOutputType(inputTypes) + ); } @Override - public boolean canVectorize(Expr.InputBindingTypes inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) { return inputTypes.areNumeric(args) && inputTypes.canVectorize(args); } @@ -296,7 +306,7 @@ abstract class DoubleBivariateMathFunction extends BivariateMathFunction { @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.DOUBLE; } @@ -440,11 +450,11 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { ExprType outputType = ExprType.LONG; for (Expr expr : args) { - outputType = ExprTypeConversion.doubleMathFunction(outputType, expr.getOutputType(inputTypes)); + outputType = ExprTypeConversion.function(outputType, expr.getOutputType(inputTypes)); } return outputType; } @@ -465,7 +475,7 @@ public ExprEval apply(List args, Expr.ObjectBinding bindings) ExprType exprType = exprEval.type(); if (isValidType(exprType)) { - outputType = ExprTypeConversion.doubleMathFunction(outputType, exprType); + outputType = ExprTypeConversion.function(outputType, exprType); } if (exprEval.value() != null) { @@ -529,7 +539,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @@ -561,14 +571,14 @@ public ExprEval apply(List args, Expr.ObjectBinding bindings) } @Override - public boolean canVectorize(Expr.InputBindingTypes inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) { return (args.size() == 1 || (args.get(1).isLiteral() && args.get(1).getLiteralValue() instanceof Number)) && inputTypes.canVectorize(args); } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { if (args.size() == 1 || args.get(1).isLiteral()) { final int radix = args.size() == 1 ? 10 : ((Number) args.get(1).getLiteralValue()).intValue(); @@ -606,19 +616,19 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.DOUBLE; } @Override - public boolean canVectorize(Expr.InputBindingTypes inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) { return true; } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorProcessors.constantDouble(PI, inputTypes.getMaxVectorSize()); } @@ -645,7 +655,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.abs(inputTypes, args.get(0)); } @@ -666,7 +676,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.acos(inputTypes, args.get(0)); } @@ -687,7 +697,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.asin(inputTypes, args.get(0)); } @@ -708,7 +718,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.atan(inputTypes, args.get(0)); } @@ -729,7 +739,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.cbrt(inputTypes, args.get(0)); } @@ -750,7 +760,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.ceil(inputTypes, args.get(0)); } @@ -771,7 +781,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.cos(inputTypes, args.get(0)); } @@ -792,7 +802,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.cosh(inputTypes, args.get(0)); } @@ -813,7 +823,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.cot(inputTypes, args.get(0)); } @@ -841,13 +851,13 @@ protected ExprEval eval(final double x, final double y) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprTypeConversion.integerMathFunction(args.get(0).getOutputType(inputTypes), args.get(1).getOutputType(inputTypes)); } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.longDivide(inputTypes, args.get(0), args.get(1)); } @@ -868,7 +878,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.exp(inputTypes, args.get(0)); } @@ -889,7 +899,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.expm1(inputTypes, args.get(0)); } @@ -910,7 +920,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.floor(inputTypes, args.get(0)); } @@ -932,13 +942,13 @@ protected ExprEval eval(double param) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.getExponent(inputTypes, args.get(0)); } @@ -959,7 +969,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.log(inputTypes, args.get(0)); } @@ -980,7 +990,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.log10(inputTypes, args.get(0)); } @@ -1001,7 +1011,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.log1p(inputTypes, args.get(0)); } @@ -1022,7 +1032,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.nextUp(inputTypes, args.get(0)); } @@ -1043,7 +1053,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.rint(inputTypes, args.get(0)); } @@ -1099,7 +1109,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return args.get(0).getOutputType(inputTypes); } @@ -1152,7 +1162,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.signum(inputTypes, args.get(0)); } @@ -1173,7 +1183,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.sin(inputTypes, args.get(0)); } @@ -1194,7 +1204,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.sinh(inputTypes, args.get(0)); } @@ -1215,7 +1225,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.sqrt(inputTypes, args.get(0)); } @@ -1236,7 +1246,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.tan(inputTypes, args.get(0)); } @@ -1257,7 +1267,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.tanh(inputTypes, args.get(0)); } @@ -1278,7 +1288,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.toDegrees(inputTypes, args.get(0)); } @@ -1299,7 +1309,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.toRadians(inputTypes, args.get(0)); } @@ -1320,7 +1330,7 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.ulp(inputTypes, args.get(0)); } @@ -1341,7 +1351,7 @@ protected ExprEval eval(double y, double x) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.atan2(inputTypes, args.get(0), args.get(1)); } @@ -1362,7 +1372,7 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.copySign(inputTypes, args.get(0), args.get(1)); } @@ -1383,7 +1393,7 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.hypot(inputTypes, args.get(0), args.get(1)); } @@ -1404,7 +1414,7 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.remainder(inputTypes, args.get(0), args.get(1)); } @@ -1431,7 +1441,7 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.max(inputTypes, args.get(0), args.get(1)); } @@ -1458,7 +1468,7 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.min(inputTypes, args.get(0), args.get(1)); } @@ -1479,7 +1489,7 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.nextAfter(inputTypes, args.get(0), args.get(1)); } @@ -1500,7 +1510,7 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.doublePower(inputTypes, args.get(0), args.get(1)); } @@ -1516,7 +1526,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.DOUBLE; } @@ -1524,23 +1534,27 @@ public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args @Override protected ExprEval eval(ExprEval x, ExprEval y) { - if (x.type() == ExprType.STRING || y.type() == ExprType.STRING) { + if (NullHandling.sqlCompatible() && (x.value() == null || y.value() == null)) { return ExprEval.of(null); } - if (NullHandling.sqlCompatible() && x.isNumericNull() || y.isNumericNull()) { - return ExprEval.of(null); + + ExprType type = ExprTypeConversion.autoDetect(x, y); + switch (type) { + case STRING: + return ExprEval.of(null); + default: + return ExprEval.of(Math.scalb(x.asDouble(), y.asInt())); } - return ExprEval.of(Math.scalb(x.asDouble(), y.asInt())); } @Override - public boolean canVectorize(Expr.InputBindingTypes inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) { return inputTypes.areNumeric(args) && inputTypes.canVectorize(args); } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { return VectorMathProcessors.scalb(inputTypes, args.get(0), args.get(1)); } @@ -1608,7 +1622,7 @@ public Set getArrayInputs(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { // can only know cast output type if cast to argument is constant if (args.get(1).isLiteral()) { @@ -1618,15 +1632,15 @@ public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args } @Override - public boolean canVectorize(Expr.InputBindingTypes inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) { return args.get(0).canVectorize(inputTypes) && args.get(1).isLiteral(); } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) { - return CastToTypeVectorProcessor.castToType( + return CastToTypeVectorProcessor.cast( args.get(0).buildVectorized(inputTypes), ExprType.valueOf(StringUtils.toUpperCase(args.get(1).getLiteralValue().toString())) ); @@ -1698,7 +1712,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprTypeConversion.conditional(inputTypes, args.subList(1, 3)); } @@ -1741,7 +1755,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { List results = new ArrayList<>(); for (int i = 1; i < args.size(); i += 2) { @@ -1790,7 +1804,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { List results = new ArrayList<>(); for (int i = 2; i < args.size(); i += 2) { @@ -1827,7 +1841,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprTypeConversion.conditional(inputTypes, args); } @@ -1858,7 +1872,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @@ -1889,7 +1903,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @@ -1939,7 +1953,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -1970,7 +1984,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @@ -2011,7 +2025,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -2056,7 +2070,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @@ -2106,7 +2120,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -2122,7 +2136,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -2154,7 +2168,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -2205,7 +2219,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -2239,7 +2253,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -2273,7 +2287,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -2289,7 +2303,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -2318,7 +2332,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -2363,7 +2377,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -2402,7 +2416,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -2452,7 +2466,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @@ -2511,7 +2525,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @@ -2624,11 +2638,11 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { ExprType type = ExprType.LONG; for (Expr arg : args) { - type = ExprTypeConversion.doubleMathFunction(type, arg.getOutputType(inputTypes)); + type = ExprTypeConversion.function(type, arg.getOutputType(inputTypes)); } return ExprType.asArrayType(type); } @@ -2680,7 +2694,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @@ -2710,7 +2724,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING_ARRAY; } @@ -2751,7 +2765,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.STRING; } @@ -2780,7 +2794,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.elementType(args.get(0).getOutputType(inputTypes)); } @@ -2808,7 +2822,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.elementType(args.get(0).getOutputType(inputTypes)); } @@ -2836,7 +2850,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @@ -2874,7 +2888,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @@ -2917,7 +2931,7 @@ public boolean hasArrayOutput() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { ExprType arrayType = args.get(0).getOutputType(inputTypes); return Optional.ofNullable(ExprType.asArrayType(arrayType)).orElse(arrayType); @@ -2981,7 +2995,7 @@ public boolean hasArrayOutput() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { ExprType arrayType = args.get(0).getOutputType(inputTypes); return Optional.ofNullable(ExprType.asArrayType(arrayType)).orElse(arrayType); @@ -3044,7 +3058,7 @@ public boolean hasArrayOutput() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @@ -3068,7 +3082,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return ExprType.LONG; } @@ -3104,7 +3118,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { return args.get(0).getOutputType(inputTypes); } @@ -3190,7 +3204,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) { ExprType arrayType = args.get(1).getOutputType(inputTypes); return Optional.ofNullable(ExprType.asArrayType(arrayType)).orElse(arrayType); diff --git a/core/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java b/core/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java index df4de19fa03b..dc396e0a6ae2 100644 --- a/core/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java @@ -78,13 +78,13 @@ public Expr getExpr() } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return expr.canVectorize(inputTypes); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return expr.buildVectorized(inputTypes); } @@ -119,7 +119,7 @@ public BindingAnalysis analyzeInputs() } @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return expr.getOutputType(inputTypes); } @@ -177,13 +177,13 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return function.canVectorize(inputTypes, args); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return function.asVectorProcessor(inputTypes, args); } @@ -216,7 +216,7 @@ public BindingAnalysis analyzeInputs() } @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return function.getOutputType(inputTypes, args); } @@ -298,7 +298,7 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return function.canVectorize(inputTypes, lambdaExpr, argsExpr) && lambdaExpr.canVectorize(inputTypes) && @@ -306,7 +306,7 @@ public boolean canVectorize(InputBindingTypes inputTypes) } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return function.asVectorProcessor(inputTypes, lambdaExpr, argsExpr); } @@ -338,7 +338,7 @@ public BindingAnalysis analyzeInputs() @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return function.getOutputType(inputTypes, lambdaExpr, argsExpr); } diff --git a/core/src/main/java/org/apache/druid/math/expr/IdentifierExpr.java b/core/src/main/java/org/apache/druid/math/expr/IdentifierExpr.java index da009326bb07..a080b9a9a540 100644 --- a/core/src/main/java/org/apache/druid/math/expr/IdentifierExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/IdentifierExpr.java @@ -113,7 +113,7 @@ public BindingAnalysis analyzeInputs() } @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return inputTypes.getType(binding); } @@ -138,18 +138,26 @@ public Expr visit(Shuttle shuttle) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { - return inputTypes.getType(binding) != null; + return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { ExprType inputType = inputTypes.getType(binding); if (inputType == null) { - throw Exprs.cannotVectorize(this); + // nil column, we can be anything, why not be a double + return new IdentifierVectorProcessor(ExprType.DOUBLE) + { + @Override + public ExprEvalVector evalVector(VectorInputBinding bindings) + { + return new ExprEvalDoubleVector(bindings.getDoubleVector(binding), bindings.getNullVector(binding)); + } + }; } switch (inputType) { case LONG: diff --git a/core/src/main/java/org/apache/druid/math/expr/UnaryOperatorExpr.java b/core/src/main/java/org/apache/druid/math/expr/UnaryOperatorExpr.java index 97a033e484e0..11a1fd947544 100644 --- a/core/src/main/java/org/apache/druid/math/expr/UnaryOperatorExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/UnaryOperatorExpr.java @@ -65,7 +65,7 @@ public BindingAnalysis analyzeInputs() @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return expr.getOutputType(inputTypes); } @@ -132,13 +132,13 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return inputTypes.areNumeric(expr) && expr.canVectorize(inputTypes); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { return VectorMathProcessors.negate(inputTypes, expr); } @@ -171,7 +171,7 @@ public ExprEval eval(ObjectBinding bindings) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { ExprType implicitCast = super.getOutputType(inputTypes); if (ExprType.STRING.equals(implicitCast)) { diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/CastToTypeVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/CastToTypeVectorProcessor.java index b15b370a2f42..6c9e507b09c2 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/CastToTypeVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/CastToTypeVectorProcessor.java @@ -31,7 +31,7 @@ protected CastToTypeVectorProcessor(ExprVectorProcessor delegate) this.delegate = delegate; } - public static ExprVectorProcessor castToType(ExprVectorProcessor delegate, ExprType type) + public static ExprVectorProcessor cast(ExprVectorProcessor delegate, ExprType type) { final ExprVectorProcessor caster; if (delegate.getOutputType() == type) { diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutDoubleInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutDoubleInFunctionVectorProcessor.java index e78f5bd99396..2e0309271052 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutDoubleInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutDoubleInFunctionVectorProcessor.java @@ -29,7 +29,7 @@ public abstract class DoubleOutDoubleInFunctionVectorProcessor { public DoubleOutDoubleInFunctionVectorProcessor(ExprVectorProcessor processor, int maxVectorSize) { - super(processor, maxVectorSize, new double[maxVectorSize]); + super(CastToTypeVectorProcessor.cast(processor, ExprType.DOUBLE), maxVectorSize, new double[maxVectorSize]); } public abstract double apply(double input); diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutDoubleLongInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutDoubleLongInFunctionVectorProcessor.java index 9cd0cc3fdf34..a3ff299f370d 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutDoubleLongInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutDoubleLongInFunctionVectorProcessor.java @@ -33,7 +33,12 @@ public DoubleOutDoubleLongInFunctionVectorProcessor( int maxVectorSize ) { - super(left, right, maxVectorSize, new double[maxVectorSize]); + super( + CastToTypeVectorProcessor.cast(left, ExprType.DOUBLE), + CastToTypeVectorProcessor.cast(right, ExprType.LONG), + maxVectorSize, + new double[maxVectorSize] + ); } public abstract double apply(double left, long right); diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutDoublesInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutDoublesInFunctionVectorProcessor.java index fb98716bdd17..f1d7741fdeb4 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutDoublesInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutDoublesInFunctionVectorProcessor.java @@ -33,7 +33,12 @@ public DoubleOutDoublesInFunctionVectorProcessor( int maxVectorSize ) { - super(left, right, maxVectorSize, new double[maxVectorSize]); + super( + CastToTypeVectorProcessor.cast(left, ExprType.DOUBLE), + CastToTypeVectorProcessor.cast(right, ExprType.DOUBLE), + maxVectorSize, + new double[maxVectorSize] + ); } public abstract double apply(double left, double right); diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutLongDoubleInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutLongDoubleInFunctionVectorProcessor.java index 32ef0b3d197c..6270cdaebc73 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutLongDoubleInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutLongDoubleInFunctionVectorProcessor.java @@ -33,7 +33,12 @@ public DoubleOutLongDoubleInFunctionVectorProcessor( int maxVectorSize ) { - super(left, right, maxVectorSize, new double[maxVectorSize]); + super( + CastToTypeVectorProcessor.cast(left, ExprType.LONG), + CastToTypeVectorProcessor.cast(right, ExprType.DOUBLE), + maxVectorSize, + new double[maxVectorSize] + ); } public abstract double apply(long left, double right); diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutLongInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutLongInFunctionVectorProcessor.java index b85995d38438..06e7e757fd5d 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutLongInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutLongInFunctionVectorProcessor.java @@ -29,7 +29,7 @@ public abstract class DoubleOutLongInFunctionVectorProcessor { public DoubleOutLongInFunctionVectorProcessor(ExprVectorProcessor processor, int maxVectorSize) { - super(processor, maxVectorSize, new double[maxVectorSize]); + super(CastToTypeVectorProcessor.cast(processor, ExprType.LONG), maxVectorSize, new double[maxVectorSize]); } public abstract double apply(long input); diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutLongsInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutLongsInFunctionVectorProcessor.java index 2af72bc86f0e..b86fd9906c68 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutLongsInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/DoubleOutLongsInFunctionVectorProcessor.java @@ -33,7 +33,12 @@ public DoubleOutLongsInFunctionVectorProcessor( int maxVectorSize ) { - super(left, right, maxVectorSize, new double[maxVectorSize]); + super( + CastToTypeVectorProcessor.cast(left, ExprType.LONG), + CastToTypeVectorProcessor.cast(right, ExprType.LONG), + maxVectorSize, + new double[maxVectorSize] + ); } public abstract double apply(long left, long right); diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutDoubleInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutDoubleInFunctionVectorProcessor.java index 318e2dff9cf2..3fedb9dba924 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutDoubleInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutDoubleInFunctionVectorProcessor.java @@ -28,7 +28,7 @@ public abstract class LongOutDoubleInFunctionVectorProcessor extends UnivariateF { public LongOutDoubleInFunctionVectorProcessor(ExprVectorProcessor processor, int maxVectorSize) { - super(processor, maxVectorSize, new long[maxVectorSize]); + super(CastToTypeVectorProcessor.cast(processor, ExprType.DOUBLE), maxVectorSize, new long[maxVectorSize]); } public abstract long apply(double input); diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutDoubleLongInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutDoubleLongInFunctionVectorProcessor.java index 0e38d7c81a47..4f66b35acfbe 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutDoubleLongInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutDoubleLongInFunctionVectorProcessor.java @@ -33,7 +33,12 @@ public LongOutDoubleLongInFunctionVectorProcessor( int maxVectorSize ) { - super(left, right, maxVectorSize, new long[maxVectorSize]); + super( + CastToTypeVectorProcessor.cast(left, ExprType.DOUBLE), + CastToTypeVectorProcessor.cast(right, ExprType.LONG), + maxVectorSize, + new long[maxVectorSize] + ); } public abstract long apply(double left, long right); diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutDoublesInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutDoublesInFunctionVectorProcessor.java index 6cbbe9d6e2c5..f1aa5af9a070 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutDoublesInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutDoublesInFunctionVectorProcessor.java @@ -33,7 +33,12 @@ public LongOutDoublesInFunctionVectorProcessor( int maxVectorSize ) { - super(left, right, maxVectorSize, new long[maxVectorSize]); + super( + CastToTypeVectorProcessor.cast(left, ExprType.DOUBLE), + CastToTypeVectorProcessor.cast(right, ExprType.DOUBLE), + maxVectorSize, + new long[maxVectorSize] + ); } public abstract long apply(double left, double right); diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutLongDoubleInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutLongDoubleInFunctionVectorProcessor.java index dce8033da2f5..8476619f02d6 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutLongDoubleInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutLongDoubleInFunctionVectorProcessor.java @@ -33,7 +33,12 @@ public LongOutLongDoubleInFunctionVectorProcessor( int maxVectorSize ) { - super(left, right, maxVectorSize, new long[maxVectorSize]); + super( + CastToTypeVectorProcessor.cast(left, ExprType.LONG), + CastToTypeVectorProcessor.cast(right, ExprType.DOUBLE), + maxVectorSize, + new long[maxVectorSize] + ); } public abstract long apply(long left, double right); diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutLongInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutLongInFunctionVectorProcessor.java index 92a136c3b245..c3cc20e62678 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutLongInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutLongInFunctionVectorProcessor.java @@ -28,7 +28,7 @@ public abstract class LongOutLongInFunctionVectorProcessor extends UnivariateFun { public LongOutLongInFunctionVectorProcessor(ExprVectorProcessor processor, int maxVectorSize) { - super(processor, maxVectorSize, new long[maxVectorSize]); + super(CastToTypeVectorProcessor.cast(processor, ExprType.LONG), maxVectorSize, new long[maxVectorSize]); } public abstract long apply(long input); diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutLongsInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutLongsInFunctionVectorProcessor.java index 7d85e881f2d4..5fa3735a8347 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutLongsInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutLongsInFunctionVectorProcessor.java @@ -33,7 +33,12 @@ public LongOutLongsInFunctionVectorProcessor( int maxVectorSize ) { - super(left, right, maxVectorSize, new long[maxVectorSize]); + super( + CastToTypeVectorProcessor.cast(left, ExprType.LONG), + CastToTypeVectorProcessor.cast(right, ExprType.LONG), + maxVectorSize, + new long[maxVectorSize] + ); } public abstract long apply(long left, long right); diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutStringInFunctionVectorProcessor.java b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutStringInFunctionVectorProcessor.java index 22de162bf2e6..496ed987e655 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/LongOutStringInFunctionVectorProcessor.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/LongOutStringInFunctionVectorProcessor.java @@ -29,7 +29,7 @@ public abstract class LongOutStringInFunctionVectorProcessor { public LongOutStringInFunctionVectorProcessor(ExprVectorProcessor processor, int maxVectorSize) { - super(processor, maxVectorSize, new long[maxVectorSize]); + super(CastToTypeVectorProcessor.cast(processor, ExprType.STRING), maxVectorSize, new long[maxVectorSize]); } @Override diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/VectorComparisonProcessors.java b/core/src/main/java/org/apache/druid/math/expr/vector/VectorComparisonProcessors.java index 972d1d62e07c..2467cffc162c 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/VectorComparisonProcessors.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/VectorComparisonProcessors.java @@ -25,7 +25,7 @@ public class VectorComparisonProcessors { public static ExprVectorProcessor equal( - Expr.VectorInputBindingTypes inputTypes, + Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right ) @@ -86,7 +86,7 @@ public double apply(double left, double right) } public static ExprVectorProcessor notEqual( - Expr.VectorInputBindingTypes inputTypes, + Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right ) @@ -147,7 +147,7 @@ public double apply(double left, double right) } public static ExprVectorProcessor greaterThanOrEqual( - Expr.VectorInputBindingTypes inputTypes, + Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right ) @@ -208,7 +208,7 @@ public double apply(double left, double right) } public static ExprVectorProcessor greaterThan( - Expr.VectorInputBindingTypes inputTypes, + Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right ) @@ -269,7 +269,7 @@ public double apply(double left, double right) } public static ExprVectorProcessor lessThanOrEqual( - Expr.VectorInputBindingTypes inputTypes, + Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right ) @@ -330,7 +330,7 @@ public double apply(double left, double right) } public static ExprVectorProcessor lessThan( - Expr.VectorInputBindingTypes inputTypes, + Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right ) diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/VectorMathProcessors.java b/core/src/main/java/org/apache/druid/math/expr/vector/VectorMathProcessors.java index bd33e8d2f25d..6b06ecbb4f54 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/VectorMathProcessors.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/VectorMathProcessors.java @@ -35,7 +35,7 @@ public class VectorMathProcessors * double -> double */ public static ExprVectorProcessor makeMathProcessor( - Expr.VectorInputBindingTypes inputTypes, + Expr.VectorInputBindingInspector inputTypes, Expr arg, Supplier longOutLongInSupplier, Supplier doubleOutDoubleInSupplier @@ -44,9 +44,9 @@ public static ExprVectorProcessor makeMathProcessor( final ExprType inputType = arg.getOutputType(inputTypes); ExprVectorProcessor processor = null; - if (ExprType.LONG.equals(inputType)) { + if (inputType == ExprType.LONG) { processor = longOutLongInSupplier.get(); - } else if (ExprType.DOUBLE.equals(inputType)) { + } else if (inputType == ExprType.DOUBLE) { processor = doubleOutDoubleInSupplier.get(); } if (processor == null) { @@ -61,7 +61,7 @@ public static ExprVectorProcessor makeMathProcessor( * double -> double */ public static ExprVectorProcessor makeDoubleMathProcessor( - Expr.VectorInputBindingTypes inputTypes, + Expr.VectorInputBindingInspector inputTypes, Expr arg, Supplier doubleOutLongInSupplier, Supplier doubleOutDoubleInSupplier @@ -70,9 +70,9 @@ public static ExprVectorProcessor makeDoubleMathProcessor( final ExprType inputType = arg.getOutputType(inputTypes); ExprVectorProcessor processor = null; - if (ExprType.LONG.equals(inputType)) { + if (inputType == ExprType.LONG) { processor = doubleOutLongInSupplier.get(); - } else if (ExprType.DOUBLE.equals(inputType)) { + } else if (inputType == ExprType.DOUBLE) { processor = doubleOutDoubleInSupplier.get(); } if (processor == null) { @@ -87,7 +87,7 @@ public static ExprVectorProcessor makeDoubleMathProcessor( * double -> long */ public static ExprVectorProcessor makeLongMathProcessor( - Expr.VectorInputBindingTypes inputTypes, + Expr.VectorInputBindingInspector inputTypes, Expr arg, Supplier longOutLongInSupplier, Supplier longOutDoubleInSupplier @@ -96,9 +96,9 @@ public static ExprVectorProcessor makeLongMathProcessor( final ExprType inputType = arg.getOutputType(inputTypes); ExprVectorProcessor processor = null; - if (ExprType.LONG.equals(inputType)) { + if (inputType == ExprType.LONG) { processor = longOutLongInSupplier.get(); - } else if (ExprType.DOUBLE.equals(inputType)) { + } else if (inputType == ExprType.DOUBLE) { processor = longOutDoubleInSupplier.get(); } if (processor == null) { @@ -115,7 +115,7 @@ public static ExprVectorProcessor makeLongMathProcessor( * double, double -> double */ public static ExprVectorProcessor makeMathProcessor( - Expr.VectorInputBindingTypes inputTypes, + Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right, Supplier longOutLongsInProcessor, @@ -127,18 +127,24 @@ public static ExprVectorProcessor makeMathProcessor( final ExprType leftType = left.getOutputType(inputTypes); final ExprType rightType = right.getOutputType(inputTypes); ExprVectorProcessor processor = null; - if (ExprType.LONG.equals(leftType)) { - if (ExprType.LONG.equals(rightType)) { + if (leftType == ExprType.LONG) { + if (rightType == null || rightType == ExprType.LONG) { processor = longOutLongsInProcessor.get(); - } else if (ExprType.DOUBLE.equals(rightType)) { + } else if (rightType == ExprType.DOUBLE) { processor = doubleOutLongDoubleInProcessor.get(); } - } else if (ExprType.DOUBLE.equals(leftType)) { - if (ExprType.LONG.equals(rightType)) { + } else if (leftType == ExprType.DOUBLE) { + if (rightType == ExprType.LONG) { processor = doubleOutDoubleLongInProcessor.get(); - } else if (ExprType.DOUBLE.equals(rightType)) { + } else if (rightType == null || rightType == ExprType.DOUBLE) { processor = doubleOutDoublesInProcessor.get(); } + } else if (leftType == null) { + if (rightType == ExprType.LONG) { + processor = longOutLongsInProcessor.get(); + } else if (rightType == ExprType.DOUBLE) { + processor = doubleOutLongDoubleInProcessor.get(); + } } if (processor == null) { throw Exprs.cannotVectorize(); @@ -154,7 +160,7 @@ public static ExprVectorProcessor makeMathProcessor( * double, double -> double */ public static ExprVectorProcessor makeDoubleMathProcessor( - Expr.VectorInputBindingTypes inputTypes, + Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right, Supplier doubleOutLongsInProcessor, @@ -166,16 +172,22 @@ public static ExprVectorProcessor makeDoubleMathProcessor( final ExprType leftType = left.getOutputType(inputTypes); final ExprType rightType = right.getOutputType(inputTypes); ExprVectorProcessor processor = null; - if (ExprType.LONG.equals(leftType)) { - if (ExprType.LONG.equals(rightType)) { + if (leftType == ExprType.LONG) { + if (rightType == ExprType.LONG) { processor = doubleOutLongsInProcessor.get(); - } else if (ExprType.DOUBLE.equals(rightType)) { + } else if (rightType == null || rightType == ExprType.DOUBLE) { processor = doubleOutLongDoubleInProcessor.get(); } - } else if (ExprType.DOUBLE.equals(leftType)) { - if (ExprType.LONG.equals(rightType)) { + } else if (leftType == ExprType.DOUBLE) { + if (rightType == ExprType.LONG) { + processor = doubleOutDoubleLongInProcessor.get(); + } else if (rightType == null || rightType == ExprType.DOUBLE) { + processor = doubleOutDoublesInProcessor.get(); + } + } else if (leftType == null) { + if (rightType == ExprType.LONG) { processor = doubleOutDoubleLongInProcessor.get(); - } else if (ExprType.DOUBLE.equals(rightType)) { + } else if (rightType == ExprType.DOUBLE) { processor = doubleOutDoublesInProcessor.get(); } } @@ -193,7 +205,7 @@ public static ExprVectorProcessor makeDoubleMathProcessor( * double, double -> long */ public static ExprVectorProcessor makeLongMathProcessor( - Expr.VectorInputBindingTypes inputTypes, + Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right, Supplier longOutLongsInProcessor, @@ -205,16 +217,22 @@ public static ExprVectorProcessor makeLongMathProcessor( final ExprType leftType = left.getOutputType(inputTypes); final ExprType rightType = right.getOutputType(inputTypes); ExprVectorProcessor processor = null; - if (ExprType.LONG.equals(leftType)) { - if (ExprType.LONG.equals(rightType)) { + if (leftType == ExprType.LONG) { + if (rightType == null || rightType == ExprType.LONG) { processor = longOutLongsInProcessor.get(); - } else if (ExprType.DOUBLE.equals(rightType)) { + } else if (rightType == ExprType.DOUBLE) { processor = longOutLongDoubleInProcessor.get(); } - } else if (ExprType.DOUBLE.equals(leftType)) { - if (ExprType.LONG.equals(rightType)) { + } else if (leftType == ExprType.DOUBLE) { + if (rightType == ExprType.LONG) { processor = longOutDoubleLongInProcessor.get(); - } else if (ExprType.DOUBLE.equals(rightType)) { + } else if (rightType == null || rightType == ExprType.DOUBLE) { + processor = longOutDoublesInProcessor.get(); + } + } else if (leftType == null) { + if (rightType == ExprType.LONG) { + processor = longOutLongsInProcessor.get(); + } else if (rightType == ExprType.DOUBLE) { processor = longOutDoublesInProcessor.get(); } } @@ -224,7 +242,7 @@ public static ExprVectorProcessor makeLongMathProcessor( return (ExprVectorProcessor) processor; } - public static ExprVectorProcessor plus(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor plus(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeMathProcessor( inputTypes, @@ -281,7 +299,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor minus(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor minus(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeMathProcessor( inputTypes, @@ -338,7 +356,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor multiply(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor multiply(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeMathProcessor( inputTypes, @@ -395,7 +413,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor divide(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor divide(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeMathProcessor( inputTypes, @@ -452,7 +470,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor longDivide(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor longDivide(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeLongMathProcessor( inputTypes, @@ -509,7 +527,7 @@ public long apply(double left, double right) ); } - public static ExprVectorProcessor modulo(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor modulo(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeMathProcessor( inputTypes, @@ -566,7 +584,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor negate(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor negate(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeMathProcessor( inputTypes, @@ -596,7 +614,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor power(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor power(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeMathProcessor( inputTypes, @@ -653,24 +671,25 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor doublePower(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor doublePower(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { BivariateFunctionVectorProcessor processor = null; - if (ExprType.LONG.equals(left.getOutputType(inputTypes))) { - if (ExprType.LONG.equals(right.getOutputType(inputTypes))) { - processor = new DoubleOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() - ) - { - @Override - public double apply(long left, long right) - { - return Math.pow(left, right); - } - }; - } + ExprType leftType = left.getOutputType(inputTypes); + ExprType rightType = right.getOutputType(inputTypes); + if ((leftType == ExprType.LONG && (rightType == null || rightType == ExprType.LONG)) || + (leftType == null && rightType == ExprType.LONG)) { + processor = new DoubleOutLongsInFunctionVectorProcessor( + left.buildVectorized(inputTypes), + right.buildVectorized(inputTypes), + inputTypes.getMaxVectorSize() + ) + { + @Override + public double apply(long left, long right) + { + return Math.pow(left, right); + } + }; } if (processor != null) { @@ -679,7 +698,7 @@ public double apply(long left, long right) return power(inputTypes, left, right); } - public static ExprVectorProcessor max(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor max(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeMathProcessor( inputTypes, @@ -736,7 +755,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor min(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor min(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeMathProcessor( inputTypes, @@ -793,7 +812,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor atan2(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor atan2(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeDoubleMathProcessor( inputTypes, @@ -850,7 +869,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor copySign(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor copySign(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeDoubleMathProcessor( inputTypes, @@ -907,7 +926,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor hypot(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor hypot(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeDoubleMathProcessor( inputTypes, @@ -964,7 +983,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor remainder(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor remainder(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeDoubleMathProcessor( inputTypes, @@ -1021,7 +1040,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor nextAfter(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor nextAfter(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeDoubleMathProcessor( inputTypes, @@ -1078,7 +1097,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor scalb(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor scalb(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) { return makeDoubleMathProcessor( inputTypes, @@ -1135,7 +1154,7 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor acos(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor acos(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1165,7 +1184,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor asin(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor asin(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1195,7 +1214,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor atan(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor atan(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1225,7 +1244,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor cos(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor cos(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1255,7 +1274,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor cosh(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor cosh(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1285,7 +1304,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor cot(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor cot(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1315,7 +1334,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor sin(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor sin(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1345,7 +1364,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor sinh(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor sinh(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1375,7 +1394,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor tan(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor tan(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1405,7 +1424,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor tanh(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor tanh(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1435,7 +1454,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor abs(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor abs(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeMathProcessor( inputTypes, @@ -1465,7 +1484,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor cbrt(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor cbrt(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1495,7 +1514,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor ceil(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor ceil(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1525,7 +1544,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor floor(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor floor(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1555,7 +1574,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor exp(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor exp(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1585,7 +1604,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor expm1(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor expm1(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1615,7 +1634,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor getExponent(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor getExponent(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeLongMathProcessor( inputTypes, @@ -1645,7 +1664,7 @@ public long apply(double input) ); } - public static ExprVectorProcessor log(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor log(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1675,7 +1694,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor log10(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor log10(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1705,7 +1724,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor log1p(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor log1p(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1735,7 +1754,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor nextUp(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor nextUp(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1765,7 +1784,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor rint(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor rint(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1795,7 +1814,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor signum(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor signum(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1825,7 +1844,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor sqrt(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor sqrt(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1855,7 +1874,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor toDegrees(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor toDegrees(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1885,7 +1904,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor toRadians(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor toRadians(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, @@ -1915,7 +1934,7 @@ public double apply(double input) ); } - public static ExprVectorProcessor ulp(Expr.VectorInputBindingTypes inputTypes, Expr arg) + public static ExprVectorProcessor ulp(Expr.VectorInputBindingInspector inputTypes, Expr arg) { return makeDoubleMathProcessor( inputTypes, diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/VectorProcessors.java b/core/src/main/java/org/apache/druid/math/expr/vector/VectorProcessors.java index 9ae7ab7c8898..6098dedbd8c4 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/VectorProcessors.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/VectorProcessors.java @@ -105,10 +105,10 @@ public ExprType getOutputType() }; } - public static ExprVectorProcessor parseLong(Expr.VectorInputBindingTypes inputTypes, Expr arg, int radix) + public static ExprVectorProcessor parseLong(Expr.VectorInputBindingInspector inputTypes, Expr arg, int radix) { final ExprVectorProcessor processor = new LongOutStringInFunctionVectorProcessor( - CastToTypeVectorProcessor.castToType(arg.buildVectorized(inputTypes), ExprType.STRING), + CastToTypeVectorProcessor.cast(arg.buildVectorized(inputTypes), ExprType.STRING), inputTypes.getMaxVectorSize() ) { diff --git a/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java b/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java index 441a42162852..57a0dc56aa7c 100644 --- a/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java +++ b/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java @@ -31,7 +31,7 @@ public class OutputTypeTest extends InitializedNullHandlingTest { - private final Expr.InputBindingTypes inputTypes = inputTypesFromMap( + private final Expr.InputBindingInspector inputTypes = inputTypesFromMap( ImmutableMap.builder().put("x", ExprType.STRING) .put("x_", ExprType.STRING) .put("y", ExprType.LONG) @@ -392,13 +392,13 @@ public void testApplyFunctions() @Test public void testOperatorAutoConversion() { - // nulls output nulls - Assert.assertNull(ExprTypeConversion.operator(ExprType.LONG, null)); - Assert.assertNull(ExprTypeConversion.operator(null, ExprType.LONG)); - Assert.assertNull(ExprTypeConversion.operator(ExprType.DOUBLE, null)); - Assert.assertNull(ExprTypeConversion.operator(null, ExprType.DOUBLE)); - Assert.assertNull(ExprTypeConversion.operator(ExprType.STRING, null)); - Assert.assertNull(ExprTypeConversion.operator(null, ExprType.STRING)); + // nulls output other + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.operator(ExprType.LONG, null)); + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.operator(null, ExprType.LONG)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.operator(ExprType.DOUBLE, null)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.operator(null, ExprType.DOUBLE)); + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.operator(ExprType.STRING, null)); + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.operator(null, ExprType.STRING)); // only long stays long Assert.assertEquals(ExprType.LONG, ExprTypeConversion.operator(ExprType.LONG, ExprType.LONG)); // only string stays string @@ -409,8 +409,8 @@ public void testOperatorAutoConversion() Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.operator(ExprType.DOUBLE, ExprType.DOUBLE)); Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.operator(ExprType.DOUBLE, ExprType.STRING)); Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.operator(ExprType.STRING, ExprType.DOUBLE)); - Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.operator(ExprType.STRING, ExprType.LONG)); - Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.operator(ExprType.LONG, ExprType.STRING)); + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.operator(ExprType.STRING, ExprType.LONG)); + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.operator(ExprType.LONG, ExprType.STRING)); // unless it is an array, and those have to be the same Assert.assertEquals(ExprType.LONG_ARRAY, ExprTypeConversion.operator(ExprType.LONG_ARRAY, ExprType.LONG_ARRAY)); Assert.assertEquals( @@ -426,47 +426,47 @@ public void testOperatorAutoConversion() @Test public void testFunctionAutoConversion() { - // nulls output nulls - Assert.assertNull(ExprTypeConversion.doubleMathFunction(ExprType.LONG, null)); - Assert.assertNull(ExprTypeConversion.doubleMathFunction(null, ExprType.LONG)); - Assert.assertNull(ExprTypeConversion.doubleMathFunction(ExprType.DOUBLE, null)); - Assert.assertNull(ExprTypeConversion.doubleMathFunction(null, ExprType.DOUBLE)); - Assert.assertNull(ExprTypeConversion.doubleMathFunction(ExprType.STRING, null)); - Assert.assertNull(ExprTypeConversion.doubleMathFunction(null, ExprType.STRING)); + // nulls output other + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.function(ExprType.LONG, null)); + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.function(null, ExprType.LONG)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.function(ExprType.DOUBLE, null)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.function(null, ExprType.DOUBLE)); + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.function(ExprType.STRING, null)); + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.function(null, ExprType.STRING)); // only long stays long - Assert.assertEquals(ExprType.LONG, ExprTypeConversion.doubleMathFunction(ExprType.LONG, ExprType.LONG)); + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.function(ExprType.LONG, ExprType.LONG)); // any double makes all doubles - Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.doubleMathFunction(ExprType.LONG, ExprType.DOUBLE)); - Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.doubleMathFunction(ExprType.DOUBLE, ExprType.LONG)); - Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.doubleMathFunction(ExprType.DOUBLE, ExprType.DOUBLE)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.function(ExprType.LONG, ExprType.DOUBLE)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.function(ExprType.DOUBLE, ExprType.LONG)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.function(ExprType.DOUBLE, ExprType.DOUBLE)); // any string makes become string - Assert.assertEquals(ExprType.STRING, ExprTypeConversion.doubleMathFunction(ExprType.LONG, ExprType.STRING)); - Assert.assertEquals(ExprType.STRING, ExprTypeConversion.doubleMathFunction(ExprType.STRING, ExprType.LONG)); - Assert.assertEquals(ExprType.STRING, ExprTypeConversion.doubleMathFunction(ExprType.DOUBLE, ExprType.STRING)); - Assert.assertEquals(ExprType.STRING, ExprTypeConversion.doubleMathFunction(ExprType.STRING, ExprType.DOUBLE)); - Assert.assertEquals(ExprType.STRING, ExprTypeConversion.doubleMathFunction(ExprType.STRING, ExprType.STRING)); + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.function(ExprType.LONG, ExprType.STRING)); + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.function(ExprType.STRING, ExprType.LONG)); + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.function(ExprType.DOUBLE, ExprType.STRING)); + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.function(ExprType.STRING, ExprType.DOUBLE)); + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.function(ExprType.STRING, ExprType.STRING)); // unless it is an array, and those have to be the same - Assert.assertEquals(ExprType.LONG_ARRAY, ExprTypeConversion.doubleMathFunction(ExprType.LONG_ARRAY, ExprType.LONG_ARRAY)); + Assert.assertEquals(ExprType.LONG_ARRAY, ExprTypeConversion.function(ExprType.LONG_ARRAY, ExprType.LONG_ARRAY)); Assert.assertEquals( ExprType.DOUBLE_ARRAY, - ExprTypeConversion.doubleMathFunction(ExprType.DOUBLE_ARRAY, ExprType.DOUBLE_ARRAY) + ExprTypeConversion.function(ExprType.DOUBLE_ARRAY, ExprType.DOUBLE_ARRAY) ); Assert.assertEquals( ExprType.STRING_ARRAY, - ExprTypeConversion.doubleMathFunction(ExprType.STRING_ARRAY, ExprType.STRING_ARRAY) + ExprTypeConversion.function(ExprType.STRING_ARRAY, ExprType.STRING_ARRAY) ); } @Test public void testIntegerFunctionAutoConversion() { - // nulls output nulls - Assert.assertNull(ExprTypeConversion.integerMathFunction(ExprType.LONG, null)); - Assert.assertNull(ExprTypeConversion.integerMathFunction(null, ExprType.LONG)); - Assert.assertNull(ExprTypeConversion.integerMathFunction(ExprType.DOUBLE, null)); - Assert.assertNull(ExprTypeConversion.integerMathFunction(null, ExprType.DOUBLE)); - Assert.assertNull(ExprTypeConversion.integerMathFunction(ExprType.STRING, null)); - Assert.assertNull(ExprTypeConversion.integerMathFunction(null, ExprType.STRING)); + // nulls output other + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.integerMathFunction(ExprType.LONG, null)); + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.integerMathFunction(null, ExprType.LONG)); + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.integerMathFunction(ExprType.DOUBLE, null)); + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.integerMathFunction(null, ExprType.DOUBLE)); + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.integerMathFunction(ExprType.STRING, null)); + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.integerMathFunction(null, ExprType.STRING)); // all numbers are longs Assert.assertEquals(ExprType.LONG, ExprTypeConversion.integerMathFunction(ExprType.LONG, ExprType.LONG)); Assert.assertEquals(ExprType.LONG, ExprTypeConversion.integerMathFunction(ExprType.LONG, ExprType.DOUBLE)); @@ -494,30 +494,30 @@ public void testIntegerFunctionAutoConversion() public void testAutoConversionArrayMismatchArrays() { expectedException.expect(IAE.class); - ExprTypeConversion.doubleMathFunction(ExprType.DOUBLE_ARRAY, ExprType.LONG_ARRAY); + ExprTypeConversion.function(ExprType.DOUBLE_ARRAY, ExprType.LONG_ARRAY); } @Test public void testAutoConversionArrayMismatchArrayScalar() { expectedException.expect(IAE.class); - ExprTypeConversion.doubleMathFunction(ExprType.DOUBLE_ARRAY, ExprType.LONG); + ExprTypeConversion.function(ExprType.DOUBLE_ARRAY, ExprType.LONG); } @Test public void testAutoConversionArrayMismatchScalarArray() { expectedException.expect(IAE.class); - ExprTypeConversion.doubleMathFunction(ExprType.STRING, ExprType.LONG_ARRAY); + ExprTypeConversion.function(ExprType.DOUBLE, ExprType.LONG_ARRAY); } - private void assertOutputType(String expression, Expr.InputBindingTypes inputTypes, ExprType outputType) + private void assertOutputType(String expression, Expr.InputBindingInspector inputTypes, ExprType outputType) { final Expr expr = Parser.parse(expression, ExprMacroTable.nil(), false); Assert.assertEquals(outputType, expr.getOutputType(inputTypes)); } - Expr.InputBindingTypes inputTypesFromMap(Map types) + Expr.InputBindingInspector inputTypesFromMap(Map types) { return types::get; } diff --git a/core/src/test/java/org/apache/druid/math/expr/VectorExprSanityTest.java b/core/src/test/java/org/apache/druid/math/expr/VectorExprSanityTest.java index 09740e1d64a7..72bc0c89d821 100644 --- a/core/src/test/java/org/apache/druid/math/expr/VectorExprSanityTest.java +++ b/core/src/test/java/org/apache/druid/math/expr/VectorExprSanityTest.java @@ -72,8 +72,9 @@ public void testUnaryOperators() @Test public void testBinaryOperators() { - final String[] columns = new String[]{"d1", "d2", "l1", "l2", "1", "1.0"}; - final String[][] templateInputs = makeTemplateArgs(columns, columns); + final String[] columns = new String[]{"d1", "d2", "l1", "l2", "1", "1.0", "nonexistent"}; + final String[] columns2 = new String[]{"d1", "d2", "l1", "l2", "1", "1.0"}; + final String[][] templateInputs = makeTemplateArgs(columns, columns2); final String[] templates = Arrays.stream(templateInputs) .map(i -> StringUtils.format("%s %s %s", i[0], "%s", i[1])) @@ -86,9 +87,9 @@ public void testBinaryOperators() @Test public void testBinaryOperatorTrees() { - final String[] columns = new String[]{"d1", "l1", "1", "1.0"}; + final String[] columns = new String[]{"d1", "l1", "1", "1.0", "nonexistent"}; final String[] columns2 = new String[]{"d2", "l2", "2", "2.0"}; - final String[][] templateInputs = makeTemplateArgs(columns, columns2, columns); + final String[][] templateInputs = makeTemplateArgs(columns, columns2, columns2); final String[] templates = Arrays.stream(templateInputs) .map(i -> StringUtils.format("(%s %s %s) %s %s", i[0], "%s", i[1], "%s", i[2])) @@ -157,7 +158,14 @@ public void testBivariateMathFunctions() "scalb", "pow" }; - final String[] templates = new String[]{"%s(d1, d2)", "%s(d1, l1)", "%s(l1, d1)", "%s(l1, l2)"}; + final String[] templates = new String[]{ + "%s(d1, d2)", + "%s(d1, l1)", + "%s(l1, d1)", + "%s(l1, l2)", + "%s(nonexistent, l1)", + "%s(nonexistent, d1)" + }; testFunctions(types, templates, functions); } @@ -218,7 +226,7 @@ private static void testExpressionWithBindings( for (int i = 0; i < VECTOR_SIZE; i++) { ExprEval eval = parsed.eval(bindings.lhs[i]); if (!eval.isNumericNull()) { - Assert.assertEquals(outputType, eval.type()); + Assert.assertEquals(eval.type(), outputType); } Assert.assertEquals( StringUtils.format("Values do not match for row %s for expression %s", i, expr), @@ -455,7 +463,7 @@ public SettableVectorInputBinding addString(String name, String[] strings) @Override public T[] getObjectVector(String name) { - return (T[]) objects.get(name); + return (T[]) objects.getOrDefault(name, new Object[getCurrentVectorSize()]); } @Override @@ -467,20 +475,22 @@ public ExprType getType(String name) @Override public long[] getLongVector(String name) { - return longs.get(name); + return longs.getOrDefault(name, new long[getCurrentVectorSize()]); } @Override public double[] getDoubleVector(String name) { - return doubles.get(name); + return doubles.getOrDefault(name, new double[getCurrentVectorSize()]); } @Nullable @Override public boolean[] getNullVector(String name) { - return nulls.get(name); + final boolean[] defaultVector = new boolean[getCurrentVectorSize()]; + Arrays.fill(defaultVector, NullHandling.sqlCompatible()); + return nulls.getOrDefault(name, defaultVector); } @Override diff --git a/extensions-core/druid-bloom-filter/src/main/java/org/apache/druid/query/expressions/BloomFilterExprMacro.java b/extensions-core/druid-bloom-filter/src/main/java/org/apache/druid/query/expressions/BloomFilterExprMacro.java index 8e7d04ccb7d1..cd8aa22c4925 100644 --- a/extensions-core/druid-bloom-filter/src/main/java/org/apache/druid/query/expressions/BloomFilterExprMacro.java +++ b/extensions-core/druid-bloom-filter/src/main/java/org/apache/druid/query/expressions/BloomFilterExprMacro.java @@ -127,7 +127,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/ContainsExpr.java b/processing/src/main/java/org/apache/druid/query/expression/ContainsExpr.java index f36311229e79..da8d9f021b00 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/ContainsExpr.java +++ b/processing/src/main/java/org/apache/druid/query/expression/ContainsExpr.java @@ -72,7 +72,7 @@ public ExprEval eval(final Expr.ObjectBinding bindings) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressMatchExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressMatchExprMacro.java index 1aff62d199f6..22158a7a0e84 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressMatchExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressMatchExprMacro.java @@ -121,7 +121,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressParseExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressParseExprMacro.java index a75fa323fdb3..3f218bdd2ec4 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressParseExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressParseExprMacro.java @@ -97,7 +97,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressStringifyExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressStringifyExprMacro.java index 17431a0e5923..10a5ff907272 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressStringifyExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressStringifyExprMacro.java @@ -96,7 +96,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.STRING; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/LikeExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/LikeExprMacro.java index d5bbf02dad02..35ee0434b271 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/LikeExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/LikeExprMacro.java @@ -94,7 +94,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/LookupExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/LookupExprMacro.java index 6ff028778a40..c771b31fe94f 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/LookupExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/LookupExprMacro.java @@ -98,7 +98,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.STRING; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/RegexpExtractExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/RegexpExtractExprMacro.java index 3964c1793d7e..7c6611f83ac1 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/RegexpExtractExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/RegexpExtractExprMacro.java @@ -101,7 +101,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.STRING; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/RegexpLikeExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/RegexpLikeExprMacro.java index 9279c84774dd..5dca175c5464 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/RegexpLikeExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/RegexpLikeExprMacro.java @@ -93,7 +93,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/TimestampCeilExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TimestampCeilExprMacro.java index 6779bf6ddf74..0726dfe3771a 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TimestampCeilExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TimestampCeilExprMacro.java @@ -97,7 +97,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } @@ -165,7 +165,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/TimestampExtractExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TimestampExtractExprMacro.java index 278076901872..c5b1056dd890 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TimestampExtractExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TimestampExtractExprMacro.java @@ -166,7 +166,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { switch (unit) { case CENTURY: diff --git a/processing/src/main/java/org/apache/druid/query/expression/TimestampFloorExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TimestampFloorExprMacro.java index 7b1fc96779d8..73bd95069d2e 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TimestampFloorExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TimestampFloorExprMacro.java @@ -118,23 +118,23 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inputTypes) { return args.get(0).canVectorize(inputTypes); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) { ExprVectorProcessor processor; processor = new LongOutLongInFunctionVectorProcessor( - CastToTypeVectorProcessor.castToType(args.get(0).buildVectorized(inputTypes), ExprType.LONG), + CastToTypeVectorProcessor.cast(args.get(0).buildVectorized(inputTypes), ExprType.LONG), inputTypes.getMaxVectorSize() ) { @@ -195,7 +195,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/TimestampFormatExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TimestampFormatExprMacro.java index 455d445fe980..378e4f27ea5e 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TimestampFormatExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TimestampFormatExprMacro.java @@ -101,7 +101,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.STRING; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/TimestampParseExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TimestampParseExprMacro.java index 935a2b7cbae7..531676563e18 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TimestampParseExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TimestampParseExprMacro.java @@ -104,7 +104,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/TimestampShiftExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TimestampShiftExprMacro.java index 259d054e411a..9efbfaabd9af 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TimestampShiftExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TimestampShiftExprMacro.java @@ -106,7 +106,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } @@ -139,7 +139,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/TrimExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TrimExprMacro.java index 48a007c7556f..9ca8d73429aa 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TrimExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TrimExprMacro.java @@ -172,7 +172,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.STRING; } @@ -300,7 +300,7 @@ public BindingAnalysis analyzeInputs() @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inputTypes) { return ExprType.STRING; } diff --git a/processing/src/main/java/org/apache/druid/segment/ColumnInspector.java b/processing/src/main/java/org/apache/druid/segment/ColumnInspector.java index 16c7460eb47f..bf74455a2b62 100644 --- a/processing/src/main/java/org/apache/druid/segment/ColumnInspector.java +++ b/processing/src/main/java/org/apache/druid/segment/ColumnInspector.java @@ -25,7 +25,7 @@ import javax.annotation.Nullable; -public interface ColumnInspector extends Expr.InputBindingTypes +public interface ColumnInspector extends Expr.InputBindingInspector { /** * Returns capabilities of a particular column. diff --git a/processing/src/main/java/org/apache/druid/segment/vector/NilVectorSelector.java b/processing/src/main/java/org/apache/druid/segment/vector/NilVectorSelector.java index 9cc6dea06760..3e1bed6076cf 100644 --- a/processing/src/main/java/org/apache/druid/segment/vector/NilVectorSelector.java +++ b/processing/src/main/java/org/apache/druid/segment/vector/NilVectorSelector.java @@ -37,7 +37,7 @@ public class NilVectorSelector static { for (int i = 0; i < DEFAULT_NULLS_VECTOR.length; i++) { - DEFAULT_NULLS_VECTOR[i] = true; + DEFAULT_NULLS_VECTOR[i] = NullHandling.sqlCompatible(); } } diff --git a/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionPlan.java b/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionPlan.java index 7dd0d5d5f048..38a3fc3812c4 100644 --- a/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionPlan.java +++ b/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionPlan.java @@ -53,9 +53,13 @@ public enum Trait */ NEEDS_APPLIED, /** - * expression has inputs whose type was unresolveable, or was incomplete, such as unknown multi-valuedness + * expression has inputs whose type was unresolveable */ UNKNOWN_INPUTS, + /** + * expression has inputs whose type was incomplete, such as unknown multi-valuedness + */ + INCOMPLETE_INPUTS, /** * expression explicitly using multi-valued inputs as array inputs */ diff --git a/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionPlanner.java b/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionPlanner.java index 45122f0684c1..8dca3b564aa6 100644 --- a/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionPlanner.java +++ b/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionPlanner.java @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; import org.apache.druid.math.expr.Expr; import org.apache.druid.math.expr.ExprType; import org.apache.druid.math.expr.Parser; @@ -56,6 +57,7 @@ public static ExpressionPlan plan(ColumnInspector inspector, Expr expression) Parser.validateExpr(expression, analysis); EnumSet traits = EnumSet.noneOf(ExpressionPlan.Trait.class); + Set noCapabilities = new HashSet<>(); Set maybeMultiValued = new HashSet<>(); List needsApplied = ImmutableList.of(); ValueType singleInputType = null; @@ -120,7 +122,7 @@ public static ExpressionPlan plan(ColumnInspector inspector, Expr expression) maybeMultiValued.add(column); } } else { - maybeMultiValued.add(column); + noCapabilities.add(column); } } @@ -135,18 +137,29 @@ public static ExpressionPlan plan(ColumnInspector inspector, Expr expression) traits.add(ExpressionPlan.Trait.NON_SCALAR_INPUTS); } - if (!maybeMultiValued.isEmpty()) { + if (!noCapabilities.isEmpty()) { traits.add(ExpressionPlan.Trait.UNKNOWN_INPUTS); } + if (!maybeMultiValued.isEmpty()) { + traits.add(ExpressionPlan.Trait.INCOMPLETE_INPUTS); + } + // if expression needs transformed, lets do it if (!needsApplied.isEmpty()) { traits.add(ExpressionPlan.Trait.NEEDS_APPLIED); } } - // only set output type - if (ExpressionPlan.none(traits, ExpressionPlan.Trait.UNKNOWN_INPUTS, ExpressionPlan.Trait.NEEDS_APPLIED)) { + // only set output type if we are pretty confident about input types + final boolean shoulComputeOutput = ExpressionPlan.none( + traits, + ExpressionPlan.Trait.UNKNOWN_INPUTS, + ExpressionPlan.Trait.INCOMPLETE_INPUTS, + ExpressionPlan.Trait.NEEDS_APPLIED + ); + + if (shoulComputeOutput) { outputType = expression.getOutputType(inspector); } @@ -163,16 +176,22 @@ public static ExpressionPlan plan(ColumnInspector inspector, Expr expression) traits.add(ExpressionPlan.Trait.NON_SCALAR_OUTPUT); } - // vectorized expressions do not currently support unknown inputs, multi-valued inputs or outputs, implicit mapping + // vectorized expressions do not support incomplete, multi-valued inputs or outputs, or implicit mapping + // they also do support unknown inputs, but they also do not currently have to deal with them, as missing + // capabilites is indicative of a non-existent column instead of an unknown schema. If this ever changes, + // this check should also change boolean supportsVector = ExpressionPlan.none( traits, - ExpressionPlan.Trait.UNKNOWN_INPUTS, + ExpressionPlan.Trait.INCOMPLETE_INPUTS, ExpressionPlan.Trait.NEEDS_APPLIED, ExpressionPlan.Trait.NON_SCALAR_INPUTS, ExpressionPlan.Trait.NON_SCALAR_OUTPUT ); if (supportsVector && expression.canVectorize(inspector)) { + // make sure to compute the output type for a vector expression though, because we might have skipped it earlier + // due to unknown inputs, but that's ok here since it just means it doesnt exist + outputType = expression.getOutputType(inspector); traits.add(ExpressionPlan.Trait.VECTORIZABLE); } return new ExpressionPlan( @@ -181,7 +200,7 @@ public static ExpressionPlan plan(ColumnInspector inspector, Expr expression) traits, outputType, singleInputType, - maybeMultiValued, + Sets.union(noCapabilities, maybeMultiValued), needsApplied ); } diff --git a/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionSelectors.java b/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionSelectors.java index 741fc0684a86..0ff00b68c052 100644 --- a/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionSelectors.java +++ b/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionSelectors.java @@ -165,7 +165,7 @@ public static ColumnValueSelector makeExprEvalSelector( // if any unknown column input types, fall back to an expression selector that examines input bindings on a // per row basis - if (plan.is(ExpressionPlan.Trait.UNKNOWN_INPUTS)) { + if (plan.any(ExpressionPlan.Trait.UNKNOWN_INPUTS, ExpressionPlan.Trait.INCOMPLETE_INPUTS)) { return new RowBasedExpressionColumnValueSelector(plan, bindings); } @@ -207,7 +207,8 @@ public static DimensionSelector makeDimensionSelector( if (plan.any( ExpressionPlan.Trait.NON_SCALAR_OUTPUT, ExpressionPlan.Trait.NEEDS_APPLIED, - ExpressionPlan.Trait.UNKNOWN_INPUTS + ExpressionPlan.Trait.UNKNOWN_INPUTS, + ExpressionPlan.Trait.INCOMPLETE_INPUTS )) { return ExpressionMultiValueDimensionSelector.fromValueSelector(baseSelector, extractionFn); } else { diff --git a/processing/src/test/java/org/apache/druid/segment/virtual/ExpressionVectorSelectorsTest.java b/processing/src/test/java/org/apache/druid/segment/virtual/ExpressionVectorSelectorsTest.java index 9e0a7b6cb31d..deca2a41e2c8 100644 --- a/processing/src/test/java/org/apache/druid/segment/virtual/ExpressionVectorSelectorsTest.java +++ b/processing/src/test/java/org/apache/druid/segment/virtual/ExpressionVectorSelectorsTest.java @@ -65,16 +65,19 @@ public class ExpressionVectorSelectorsTest { private static List EXPRESSIONS = ImmutableList.of( "long1 * long2", + "long1 * nonexistent", "double1 * double3", "float1 + float3", "(long1 - long4) / double3", "long5 * float3 * long1 * long4 * double1", "long5 * double3 * long1 * long4 * double1", "max(double3, double5)", + "max(nonexistent, double5)", "min(double4, double1)", "cos(float3)", "sin(long4)", "parse_long(string1)", + "parse_long(nonexistent)", "parse_long(string1) * double3", "parse_long(string5) * parse_long(string1)", "parse_long(string5) * parse_long(string1) * double3", diff --git a/processing/src/test/java/org/apache/druid/segment/virtual/ExpressionVirtualColumnTest.java b/processing/src/test/java/org/apache/druid/segment/virtual/ExpressionVirtualColumnTest.java index b6f7733fc4b0..aefb99364ed8 100644 --- a/processing/src/test/java/org/apache/druid/segment/virtual/ExpressionVirtualColumnTest.java +++ b/processing/src/test/java/org/apache/druid/segment/virtual/ExpressionVirtualColumnTest.java @@ -216,7 +216,7 @@ public void testObjectSelector() CURRENT_ROW.set(ROW1); if (NullHandling.replaceWithDefault()) { - Assert.assertEquals(4.0d, selector.getObject()); + Assert.assertEquals(4L, selector.getObject()); } else { // y is null for row1 Assert.assertEquals(null, selector.getObject()); @@ -481,7 +481,7 @@ public void testDimensionSelector() Assert.assertEquals(false, nullMatcher.matches()); Assert.assertEquals(false, fiveMatcher.matches()); Assert.assertEquals(true, nonNullMatcher.matches()); - Assert.assertEquals("4.0", selector.lookupName(selector.getRow().get(0))); + Assert.assertEquals("4", selector.lookupName(selector.getRow().get(0))); } else { // y is null in row1 Assert.assertEquals(true, nullMatcher.matches()); @@ -605,7 +605,7 @@ public void testDimensionSelectorWithExtraction() Assert.assertEquals(false, nullMatcher.matches()); Assert.assertEquals(false, fiveMatcher.matches()); Assert.assertEquals(true, nonNullMatcher.matches()); - Assert.assertEquals("4.0", selector.lookupName(selector.getRow().get(0))); + Assert.assertEquals("4", selector.lookupName(selector.getRow().get(0))); } else { // y is null in row1 Assert.assertEquals(true, nullMatcher.matches()); diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/ReductionOperatorConversionHelper.java b/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/ReductionOperatorConversionHelper.java index 3fa5f363223c..edfaa6bb3787 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/ReductionOperatorConversionHelper.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/ReductionOperatorConversionHelper.java @@ -39,7 +39,7 @@ private ReductionOperatorConversionHelper() * https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#function_least * * @see org.apache.druid.math.expr.Function.ReduceFunction#apply - * @see ExprTypeConversion#doubleMathFunction + * @see ExprTypeConversion#function */ static final SqlReturnTypeInference TYPE_INFERENCE = opBinding -> { diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/SqlVectorizedExpressionSanityTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/SqlVectorizedExpressionSanityTest.java index 47179371792f..b14cec7028d2 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/SqlVectorizedExpressionSanityTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/SqlVectorizedExpressionSanityTest.java @@ -25,7 +25,6 @@ import org.apache.calcite.sql.parser.SqlParseException; import org.apache.calcite.tools.RelConversionException; import org.apache.calcite.tools.ValidationException; -import org.apache.druid.common.config.NullHandling; import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.java.util.common.granularity.Granularities; import org.apache.druid.java.util.common.guava.Sequence; @@ -71,18 +70,7 @@ public class SqlVectorizedExpressionSanityTest extends InitializedNullHandlingTe { private static final Logger log = new Logger(SqlVectorizedExpressionSanityTest.class); - // cannot vectorize grouping on numeric expressions in group by v2 in sql compatible null handling mode - private static final List QUERIES = NullHandling.sqlCompatible() ? ImmutableList.of( - "SELECT SUM(long1 * long2) FROM foo", - "SELECT SUM((long1 * long2) / double1) FROM foo", - "SELECT SUM(float3 + ((long1 * long4)/double1)) FROM foo", - "SELECT SUM(long5 - (float3 + ((long1 * long4)/double1))) FROM foo", - "SELECT cos(double2) FROM foo", - "SELECT SUM(-long4) FROM foo", - "SELECT SUM(PARSE_LONG(string1)) FROM foo", - "SELECT SUM(PARSE_LONG(string3)) FROM foo", - "SELECT string2, SUM(long1 * long4) FROM foo GROUP BY 1 ORDER BY 2" - ) : ImmutableList.of( + private static final List QUERIES = ImmutableList.of( "SELECT SUM(long1 * long2) FROM foo", "SELECT SUM((long1 * long2) / double1) FROM foo", "SELECT SUM(float3 + ((long1 * long4)/double1)) FROM foo", From 24a0bebcdf7ab346dc8930e058eb7a552312297c Mon Sep 17 00:00:00 2001 From: Clint Wylie Date: Fri, 9 Oct 2020 12:23:30 -0700 Subject: [PATCH 2/5] inspector --- .../apache/druid/math/expr/ApplyFunction.java | 34 +- .../math/expr/BinaryLogicalOperatorExpr.java | 72 +- .../math/expr/BinaryMathOperatorExpr.java | 48 +- .../druid/math/expr/BinaryOperatorExpr.java | 8 +- .../apache/druid/math/expr/ConstantExpr.java | 32 +- .../java/org/apache/druid/math/expr/Expr.java | 9 +- .../druid/math/expr/ExprTypeConversion.java | 6 +- .../org/apache/druid/math/expr/Function.java | 319 +++---- .../druid/math/expr/FunctionalExpr.java | 40 +- .../druid/math/expr/IdentifierExpr.java | 10 +- .../druid/math/expr/UnaryOperatorExpr.java | 16 +- .../vector/VectorComparisonProcessors.java | 168 ++-- .../expr/vector/VectorMathProcessors.java | 804 +++++++++--------- .../math/expr/vector/VectorProcessors.java | 6 +- .../druid/math/expr/OutputTypeTest.java | 474 +++++------ .../expressions/BloomFilterExprMacro.java | 2 +- .../druid/query/expression/ContainsExpr.java | 2 +- .../expression/IPv4AddressMatchExprMacro.java | 2 +- .../expression/IPv4AddressParseExprMacro.java | 2 +- .../IPv4AddressStringifyExprMacro.java | 2 +- .../druid/query/expression/LikeExprMacro.java | 2 +- .../query/expression/LookupExprMacro.java | 2 +- .../expression/RegexpExtractExprMacro.java | 2 +- .../query/expression/RegexpLikeExprMacro.java | 2 +- .../expression/TimestampCeilExprMacro.java | 4 +- .../expression/TimestampExtractExprMacro.java | 2 +- .../expression/TimestampFloorExprMacro.java | 14 +- .../expression/TimestampFormatExprMacro.java | 2 +- .../expression/TimestampParseExprMacro.java | 2 +- .../expression/TimestampShiftExprMacro.java | 4 +- .../druid/query/expression/TrimExprMacro.java | 4 +- 31 files changed, 1054 insertions(+), 1042 deletions(-) diff --git a/core/src/main/java/org/apache/druid/math/expr/ApplyFunction.java b/core/src/main/java/org/apache/druid/math/expr/ApplyFunction.java index 48af3ab71e14..7286c4455e06 100644 --- a/core/src/main/java/org/apache/druid/math/expr/ApplyFunction.java +++ b/core/src/main/java/org/apache/druid/math/expr/ApplyFunction.java @@ -59,7 +59,7 @@ public interface ApplyFunction * @see Expr#canVectorize(Expr.InputBindingInspector) * @see Function#canVectorize(Expr.InputBindingInspector, List) */ - default boolean canVectorize(Expr.InputBindingInspector inputTypes, Expr lambda, List args) + default boolean canVectorize(Expr.InputBindingInspector inspector, Expr lambda, List args) { return false; } @@ -71,7 +71,11 @@ default boolean canVectorize(Expr.InputBindingInspector inputTypes, Expr lambda, * @see Expr#buildVectorized(Expr.VectorInputBindingInspector) * @see Function#asVectorProcessor(Expr.VectorInputBindingInspector, List) */ - default ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, Expr lambda, List args) + default ExprVectorProcessor asVectorProcessor( + Expr.VectorInputBindingInspector inspector, + Expr lambda, + List args + ) { throw new UOE("%s is not vectorized", name()); } @@ -109,7 +113,7 @@ default boolean hasArrayOutput(LambdaExpr lambdaExpr) * @see Expr#getOutputType */ @Nullable - ExprType getOutputType(Expr.InputBindingInspector inputTypes, LambdaExpr expr, List args); + ExprType getOutputType(Expr.InputBindingInspector inspector, LambdaExpr expr, List args); /** * Base class for "map" functions, which are a class of {@link ApplyFunction} which take a lambda function that is @@ -126,9 +130,9 @@ public boolean hasArrayOutput(LambdaExpr lambdaExpr) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, LambdaExpr expr, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, LambdaExpr expr, List args) { - return ExprType.asArrayType(expr.getOutputType(new LambdaInputBindingInspector(inputTypes, expr, args))); + return ExprType.asArrayType(expr.getOutputType(new LambdaInputBindingInspector(inspector, expr, args))); } /** @@ -332,10 +336,10 @@ public boolean hasArrayOutput(LambdaExpr lambdaExpr) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, LambdaExpr expr, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, LambdaExpr expr, List args) { // output type is accumulator type, which is last argument - return args.get(args.size() - 1).getOutputType(inputTypes); + return args.get(args.size() - 1).getOutputType(inspector); } } @@ -535,10 +539,10 @@ public void validateArguments(LambdaExpr lambdaExpr, List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, LambdaExpr expr, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, LambdaExpr expr, List args) { // output type is input array type - return args.get(0).getOutputType(inputTypes); + return args.get(0).getOutputType(inspector); } private Stream filter(T[] array, LambdaExpr expr, SettableLambdaBinding binding) @@ -590,7 +594,7 @@ public void validateArguments(LambdaExpr lambdaExpr, List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, LambdaExpr expr, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, LambdaExpr expr, List args) { return ExprType.LONG; } @@ -925,12 +929,12 @@ public CartesianFoldLambdaBinding accumulateWithIndex(int index, Object acc) class LambdaInputBindingInspector implements Expr.InputBindingInspector { private final Object2IntMap lambdaIdentifiers; - private final Expr.InputBindingInspector inputTypes; + private final Expr.InputBindingInspector inspector; private final List args; - public LambdaInputBindingInspector(Expr.InputBindingInspector inputTypes, LambdaExpr expr, List args) + public LambdaInputBindingInspector(Expr.InputBindingInspector inspector, LambdaExpr expr, List args) { - this.inputTypes = inputTypes; + this.inspector = inspector; this.args = args; List identifiers = expr.getIdentifiers(); this.lambdaIdentifiers = new Object2IntOpenHashMap<>(args.size()); @@ -944,9 +948,9 @@ public LambdaInputBindingInspector(Expr.InputBindingInspector inputTypes, Lambda public ExprType getType(String name) { if (lambdaIdentifiers.containsKey(name)) { - return ExprType.elementType(args.get(lambdaIdentifiers.getInt(name)).getOutputType(inputTypes)); + return ExprType.elementType(args.get(lambdaIdentifiers.getInt(name)).getOutputType(inspector)); } - return inputTypes.getType(name); + return inspector.getType(name); } } } diff --git a/core/src/main/java/org/apache/druid/math/expr/BinaryLogicalOperatorExpr.java b/core/src/main/java/org/apache/druid/math/expr/BinaryLogicalOperatorExpr.java index 3f79c71ea1e5..f5960bc7c122 100644 --- a/core/src/main/java/org/apache/druid/math/expr/BinaryLogicalOperatorExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/BinaryLogicalOperatorExpr.java @@ -62,9 +62,9 @@ protected final double evalDouble(double left, double right) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - ExprType implicitCast = super.getOutputType(inputTypes); + ExprType implicitCast = super.getOutputType(inspector); if (ExprType.STRING.equals(implicitCast)) { return ExprType.LONG; } @@ -72,15 +72,15 @@ public ExprType getOutputType(InputBindingInspector inputTypes) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); + return inspector.areNumeric(left, right) && inspector.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorComparisonProcessors.lessThan(inputTypes, left, right); + return VectorComparisonProcessors.lessThan(inspector, left, right); } } @@ -118,9 +118,9 @@ protected final double evalDouble(double left, double right) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - ExprType implicitCast = super.getOutputType(inputTypes); + ExprType implicitCast = super.getOutputType(inspector); if (ExprType.STRING.equals(implicitCast)) { return ExprType.LONG; } @@ -128,15 +128,15 @@ public ExprType getOutputType(InputBindingInspector inputTypes) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); + return inspector.areNumeric(left, right) && inspector.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorComparisonProcessors.lessThanOrEqual(inputTypes, left, right); + return VectorComparisonProcessors.lessThanOrEqual(inspector, left, right); } } @@ -174,24 +174,24 @@ protected final double evalDouble(double left, double right) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - ExprType implicitCast = super.getOutputType(inputTypes); + ExprType implicitCast = super.getOutputType(inspector); if (ExprType.STRING.equals(implicitCast)) { return ExprType.LONG; } return implicitCast; } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); + return inspector.areNumeric(left, right) && inspector.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorComparisonProcessors.greaterThan(inputTypes, left, right); + return VectorComparisonProcessors.greaterThan(inspector, left, right); } } @@ -229,9 +229,9 @@ protected final double evalDouble(double left, double right) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - ExprType implicitCast = super.getOutputType(inputTypes); + ExprType implicitCast = super.getOutputType(inspector); if (ExprType.STRING.equals(implicitCast)) { return ExprType.LONG; } @@ -239,15 +239,15 @@ public ExprType getOutputType(InputBindingInspector inputTypes) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); + return inspector.areNumeric(left, right) && inspector.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorComparisonProcessors.greaterThanOrEqual(inputTypes, left, right); + return VectorComparisonProcessors.greaterThanOrEqual(inspector, left, right); } } @@ -284,9 +284,9 @@ protected final double evalDouble(double left, double right) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - ExprType implicitCast = super.getOutputType(inputTypes); + ExprType implicitCast = super.getOutputType(inspector); if (ExprType.STRING.equals(implicitCast)) { return ExprType.LONG; } @@ -294,15 +294,15 @@ public ExprType getOutputType(InputBindingInspector inputTypes) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); + return inspector.areNumeric(left, right) && inspector.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorComparisonProcessors.equal(inputTypes, left, right); + return VectorComparisonProcessors.equal(inspector, left, right); } } @@ -339,9 +339,9 @@ protected final double evalDouble(double left, double right) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - ExprType implicitCast = super.getOutputType(inputTypes); + ExprType implicitCast = super.getOutputType(inspector); if (ExprType.STRING.equals(implicitCast)) { return ExprType.LONG; } @@ -349,15 +349,15 @@ public ExprType getOutputType(InputBindingInspector inputTypes) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); + return inspector.areNumeric(left, right) && inspector.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorComparisonProcessors.notEqual(inputTypes, left, right); + return VectorComparisonProcessors.notEqual(inspector, left, right); } } diff --git a/core/src/main/java/org/apache/druid/math/expr/BinaryMathOperatorExpr.java b/core/src/main/java/org/apache/druid/math/expr/BinaryMathOperatorExpr.java index d31bf4f60f6f..d7daac98c25b 100644 --- a/core/src/main/java/org/apache/druid/math/expr/BinaryMathOperatorExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/BinaryMathOperatorExpr.java @@ -61,15 +61,15 @@ protected double evalDouble(double left, double right) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); + return inspector.areNumeric(left, right) && inspector.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorMathProcessors.plus(inputTypes, left, right); + return VectorMathProcessors.plus(inspector, left, right); } } @@ -99,15 +99,15 @@ protected double evalDouble(double left, double right) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); + return inspector.areNumeric(left, right) && inspector.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorMathProcessors.minus(inputTypes, left, right); + return VectorMathProcessors.minus(inspector, left, right); } } @@ -137,15 +137,15 @@ protected double evalDouble(double left, double right) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); + return inspector.areNumeric(left, right) && inspector.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorMathProcessors.multiply(inputTypes, left, right); + return VectorMathProcessors.multiply(inspector, left, right); } } @@ -175,15 +175,15 @@ protected double evalDouble(double left, double right) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); + return inspector.areNumeric(left, right) && inspector.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorMathProcessors.divide(inputTypes, left, right); + return VectorMathProcessors.divide(inspector, left, right); } } @@ -213,15 +213,15 @@ protected double evalDouble(double left, double right) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); + return inspector.areNumeric(left, right) && inspector.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorMathProcessors.power(inputTypes, left, right); + return VectorMathProcessors.power(inspector, left, right); } } @@ -251,14 +251,14 @@ protected double evalDouble(double left, double right) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(left, right) && inputTypes.canVectorize(left, right); + return inspector.areNumeric(left, right) && inspector.canVectorize(left, right); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorMathProcessors.modulo(inputTypes, left, right); + return VectorMathProcessors.modulo(inspector, left, right); } } diff --git a/core/src/main/java/org/apache/druid/math/expr/BinaryOperatorExpr.java b/core/src/main/java/org/apache/druid/math/expr/BinaryOperatorExpr.java index 79c85d48d0e3..be347e3b7427 100644 --- a/core/src/main/java/org/apache/druid/math/expr/BinaryOperatorExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/BinaryOperatorExpr.java @@ -81,15 +81,15 @@ public BindingAnalysis analyzeInputs() @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { if (left.isNullLiteral()) { - return right.getOutputType(inputTypes); + return right.getOutputType(inspector); } if (right.isNullLiteral()) { - return left.getOutputType(inputTypes); + return left.getOutputType(inspector); } - return ExprTypeConversion.operator(left.getOutputType(inputTypes), right.getOutputType(inputTypes)); + return ExprTypeConversion.operator(left.getOutputType(inspector), right.getOutputType(inspector)); } @Override diff --git a/core/src/main/java/org/apache/druid/math/expr/ConstantExpr.java b/core/src/main/java/org/apache/druid/math/expr/ConstantExpr.java index 75c327651a23..035823ed6bcc 100644 --- a/core/src/main/java/org/apache/druid/math/expr/ConstantExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/ConstantExpr.java @@ -46,7 +46,7 @@ protected ConstantExpr(ExprType outputType) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return outputType; } @@ -135,15 +135,15 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorProcessors.constantLong(value, inputTypes.getMaxVectorSize()); + return VectorProcessors.constantLong(value, inspector.getMaxVectorSize()); } @Override @@ -180,15 +180,15 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorProcessors.constantLong(null, inputTypes.getMaxVectorSize()); + return VectorProcessors.constantLong(null, inspector.getMaxVectorSize()); } @Override @@ -290,15 +290,15 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorProcessors.constantDouble(value, inputTypes.getMaxVectorSize()); + return VectorProcessors.constantDouble(value, inspector.getMaxVectorSize()); } @Override public boolean equals(Object o) @@ -334,15 +334,15 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorProcessors.constantDouble(null, inputTypes.getMaxVectorSize()); + return VectorProcessors.constantDouble(null, inspector.getMaxVectorSize()); } @Override @@ -452,15 +452,15 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorProcessors.constantString(value, inputTypes.getMaxVectorSize()); + return VectorProcessors.constantString(value, inspector.getMaxVectorSize()); } @Override diff --git a/core/src/main/java/org/apache/druid/math/expr/Expr.java b/core/src/main/java/org/apache/druid/math/expr/Expr.java index 2767edec65e6..2db7ef776ece 100644 --- a/core/src/main/java/org/apache/druid/math/expr/Expr.java +++ b/core/src/main/java/org/apache/druid/math/expr/Expr.java @@ -136,9 +136,10 @@ default String getBindingIfIdentifier() * value of null indicates that the given type information was not enough to resolve the output type, so the * expression must be evaluated using default {@link #eval} handling where types are only known after evaluation, * through {@link ExprEval#type}. + * @param inspector */ @Nullable - default ExprType getOutputType(InputBindingInspector inputTypes) + default ExprType getOutputType(InputBindingInspector inspector) { return null; } @@ -147,8 +148,9 @@ default ExprType getOutputType(InputBindingInspector inputTypes) * Check if an expression can be 'vectorized', for a given set of inputs. If this method returns true, * {@link #buildVectorized} is expected to produce a {@link ExprVectorProcessor} which can evaluate values in batches * to use with vectorized query engines. + * @param inspector */ - default boolean canVectorize(InputBindingInspector inputTypes) + default boolean canVectorize(InputBindingInspector inspector) { return false; } @@ -156,8 +158,9 @@ default boolean canVectorize(InputBindingInspector inputTypes) /** * Builds a 'vectorized' expression processor, that can operate on batches of input values for use in vectorized * query engines. + * @param inspector */ - default ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + default ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { throw Exprs.cannotVectorize(this); } diff --git a/core/src/main/java/org/apache/druid/math/expr/ExprTypeConversion.java b/core/src/main/java/org/apache/druid/math/expr/ExprTypeConversion.java index 8863d3963d21..92fc57343558 100644 --- a/core/src/main/java/org/apache/druid/math/expr/ExprTypeConversion.java +++ b/core/src/main/java/org/apache/druid/math/expr/ExprTypeConversion.java @@ -31,7 +31,7 @@ public class ExprTypeConversion * Infer the output type of a list of possible 'conditional' expression outputs (where any of these could be the * output expression if the corresponding case matching expression evaluates to true) */ - static ExprType conditional(Expr.InputBindingInspector inputTypes, List args) + static ExprType conditional(Expr.InputBindingInspector inspector, List args) { ExprType type = null; for (Expr arg : args) { @@ -39,9 +39,9 @@ static ExprType conditional(Expr.InputBindingInspector inputTypes, List ar continue; } if (type == null) { - type = arg.getOutputType(inputTypes); + type = arg.getOutputType(inspector); } else { - type = function(type, arg.getOutputType(inputTypes)); + type = function(type, arg.getOutputType(inspector)); } } return type; diff --git a/core/src/main/java/org/apache/druid/math/expr/Function.java b/core/src/main/java/org/apache/druid/math/expr/Function.java index 8ac1097a656a..2c4ff6853749 100644 --- a/core/src/main/java/org/apache/druid/math/expr/Function.java +++ b/core/src/main/java/org/apache/druid/math/expr/Function.java @@ -115,7 +115,7 @@ default boolean hasArrayOutput() * @see Expr#getOutputType */ @Nullable - ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args); + ExprType getOutputType(Expr.InputBindingInspector inspector, List args); /** * Check if a function can be 'vectorized', for a given set of {@link Expr} inputs. If this method returns true, @@ -125,7 +125,7 @@ default boolean hasArrayOutput() * @see Expr#canVectorize(Expr.InputBindingInspector) * @see ApplyFunction#canVectorize(Expr.InputBindingInspector, Expr, List) */ - default boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) + default boolean canVectorize(Expr.InputBindingInspector inspector, List args) { return false; } @@ -137,7 +137,7 @@ default boolean canVectorize(Expr.InputBindingInspector inputTypes, List a * @see Expr#buildVectorized(Expr.VectorInputBindingInspector) * @see ApplyFunction#asVectorProcessor(Expr.VectorInputBindingInspector, Expr, List) */ - default ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + default ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { throw new UOE("%s is not vectorized", name()); } @@ -221,15 +221,15 @@ protected ExprEval eval(double param) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - return args.get(0).getOutputType(inputTypes); + return args.get(0).getOutputType(inspector); } @Override - public boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inspector, List args) { - return inputTypes.areNumeric(args) && inputTypes.canVectorize(args); + return inspector.areNumeric(args) && inspector.canVectorize(args); } } @@ -240,7 +240,7 @@ abstract class DoubleUnivariateMathFunction extends UnivariateMathFunction { @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.DOUBLE; } @@ -284,18 +284,18 @@ protected ExprEval eval(double x, double y) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprTypeConversion.function( - args.get(0).getOutputType(inputTypes), - args.get(1).getOutputType(inputTypes) + args.get(0).getOutputType(inspector), + args.get(1).getOutputType(inspector) ); } @Override - public boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inspector, List args) { - return inputTypes.areNumeric(args) && inputTypes.canVectorize(args); + return inspector.areNumeric(args) && inspector.canVectorize(args); } } @@ -306,7 +306,7 @@ abstract class DoubleBivariateMathFunction extends BivariateMathFunction { @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.DOUBLE; } @@ -450,11 +450,11 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { ExprType outputType = ExprType.LONG; for (Expr expr : args) { - outputType = ExprTypeConversion.function(outputType, expr.getOutputType(inputTypes)); + outputType = ExprTypeConversion.function(outputType, expr.getOutputType(inspector)); } return outputType; } @@ -539,7 +539,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -571,18 +571,18 @@ public ExprEval apply(List args, Expr.ObjectBinding bindings) } @Override - public boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inspector, List args) { return (args.size() == 1 || (args.get(1).isLiteral() && args.get(1).getLiteralValue() instanceof Number)) && - inputTypes.canVectorize(args); + inspector.canVectorize(args); } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { if (args.size() == 1 || args.get(1).isLiteral()) { final int radix = args.size() == 1 ? 10 : ((Number) args.get(1).getLiteralValue()).intValue(); - return VectorProcessors.parseLong(inputTypes, args.get(0), radix); + return VectorProcessors.parseLong(inspector, args.get(0), radix); } // only single argument and 2 argument where the radix is constant is currently implemented // the canVectorize check should prevent this from happening, but explode just in case @@ -616,21 +616,21 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.DOUBLE; } @Override - public boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inspector, List args) { return true; } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorProcessors.constantDouble(PI, inputTypes.getMaxVectorSize()); + return VectorProcessors.constantDouble(PI, inspector.getMaxVectorSize()); } } @@ -655,9 +655,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.abs(inputTypes, args.get(0)); + return VectorMathProcessors.abs(inspector, args.get(0)); } } @@ -676,9 +676,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.acos(inputTypes, args.get(0)); + return VectorMathProcessors.acos(inspector, args.get(0)); } } @@ -697,9 +697,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.asin(inputTypes, args.get(0)); + return VectorMathProcessors.asin(inspector, args.get(0)); } } @@ -718,9 +718,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.atan(inputTypes, args.get(0)); + return VectorMathProcessors.atan(inspector, args.get(0)); } } @@ -739,9 +739,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.cbrt(inputTypes, args.get(0)); + return VectorMathProcessors.cbrt(inspector, args.get(0)); } } @@ -760,9 +760,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.ceil(inputTypes, args.get(0)); + return VectorMathProcessors.ceil(inspector, args.get(0)); } } @@ -781,9 +781,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.cos(inputTypes, args.get(0)); + return VectorMathProcessors.cos(inspector, args.get(0)); } } @@ -802,9 +802,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.cosh(inputTypes, args.get(0)); + return VectorMathProcessors.cosh(inspector, args.get(0)); } } @@ -823,9 +823,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.cot(inputTypes, args.get(0)); + return VectorMathProcessors.cot(inspector, args.get(0)); } } @@ -851,15 +851,16 @@ protected ExprEval eval(final double x, final double y) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - return ExprTypeConversion.integerMathFunction(args.get(0).getOutputType(inputTypes), args.get(1).getOutputType(inputTypes)); + return ExprTypeConversion.integerMathFunction(args.get(0).getOutputType(inspector), args.get(1).getOutputType( + inspector)); } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.longDivide(inputTypes, args.get(0), args.get(1)); + return VectorMathProcessors.longDivide(inspector, args.get(0), args.get(1)); } } @@ -878,9 +879,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.exp(inputTypes, args.get(0)); + return VectorMathProcessors.exp(inspector, args.get(0)); } } @@ -899,9 +900,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.expm1(inputTypes, args.get(0)); + return VectorMathProcessors.expm1(inspector, args.get(0)); } } @@ -920,9 +921,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.floor(inputTypes, args.get(0)); + return VectorMathProcessors.floor(inspector, args.get(0)); } } @@ -942,15 +943,15 @@ protected ExprEval eval(double param) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.getExponent(inputTypes, args.get(0)); + return VectorMathProcessors.getExponent(inspector, args.get(0)); } } @@ -969,9 +970,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.log(inputTypes, args.get(0)); + return VectorMathProcessors.log(inspector, args.get(0)); } } @@ -990,9 +991,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.log10(inputTypes, args.get(0)); + return VectorMathProcessors.log10(inspector, args.get(0)); } } @@ -1011,9 +1012,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.log1p(inputTypes, args.get(0)); + return VectorMathProcessors.log1p(inspector, args.get(0)); } } @@ -1032,9 +1033,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.nextUp(inputTypes, args.get(0)); + return VectorMathProcessors.nextUp(inspector, args.get(0)); } } @@ -1053,9 +1054,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.rint(inputTypes, args.get(0)); + return VectorMathProcessors.rint(inspector, args.get(0)); } } @@ -1109,9 +1110,9 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - return args.get(0).getOutputType(inputTypes); + return args.get(0).getOutputType(inspector); } private ExprEval eval(ExprEval param) @@ -1162,9 +1163,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.signum(inputTypes, args.get(0)); + return VectorMathProcessors.signum(inspector, args.get(0)); } } @@ -1183,9 +1184,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.sin(inputTypes, args.get(0)); + return VectorMathProcessors.sin(inspector, args.get(0)); } } @@ -1204,9 +1205,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.sinh(inputTypes, args.get(0)); + return VectorMathProcessors.sinh(inspector, args.get(0)); } } @@ -1225,9 +1226,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.sqrt(inputTypes, args.get(0)); + return VectorMathProcessors.sqrt(inspector, args.get(0)); } } @@ -1246,9 +1247,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.tan(inputTypes, args.get(0)); + return VectorMathProcessors.tan(inspector, args.get(0)); } } @@ -1267,9 +1268,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.tanh(inputTypes, args.get(0)); + return VectorMathProcessors.tanh(inspector, args.get(0)); } } @@ -1288,9 +1289,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.toDegrees(inputTypes, args.get(0)); + return VectorMathProcessors.toDegrees(inspector, args.get(0)); } } @@ -1309,9 +1310,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.toRadians(inputTypes, args.get(0)); + return VectorMathProcessors.toRadians(inspector, args.get(0)); } } @@ -1330,9 +1331,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.ulp(inputTypes, args.get(0)); + return VectorMathProcessors.ulp(inspector, args.get(0)); } } @@ -1351,9 +1352,9 @@ protected ExprEval eval(double y, double x) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.atan2(inputTypes, args.get(0), args.get(1)); + return VectorMathProcessors.atan2(inspector, args.get(0), args.get(1)); } } @@ -1372,9 +1373,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.copySign(inputTypes, args.get(0), args.get(1)); + return VectorMathProcessors.copySign(inspector, args.get(0), args.get(1)); } } @@ -1393,9 +1394,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.hypot(inputTypes, args.get(0), args.get(1)); + return VectorMathProcessors.hypot(inspector, args.get(0), args.get(1)); } } @@ -1414,9 +1415,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.remainder(inputTypes, args.get(0), args.get(1)); + return VectorMathProcessors.remainder(inspector, args.get(0), args.get(1)); } } @@ -1441,9 +1442,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.max(inputTypes, args.get(0), args.get(1)); + return VectorMathProcessors.max(inspector, args.get(0), args.get(1)); } } @@ -1468,9 +1469,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.min(inputTypes, args.get(0), args.get(1)); + return VectorMathProcessors.min(inspector, args.get(0), args.get(1)); } } @@ -1489,9 +1490,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.nextAfter(inputTypes, args.get(0), args.get(1)); + return VectorMathProcessors.nextAfter(inspector, args.get(0), args.get(1)); } } @@ -1510,9 +1511,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.doublePower(inputTypes, args.get(0), args.get(1)); + return VectorMathProcessors.doublePower(inspector, args.get(0), args.get(1)); } } @@ -1526,7 +1527,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.DOUBLE; } @@ -1548,15 +1549,15 @@ protected ExprEval eval(ExprEval x, ExprEval y) } @Override - public boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inspector, List args) { - return inputTypes.areNumeric(args) && inputTypes.canVectorize(args); + return inspector.areNumeric(args) && inspector.canVectorize(args); } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorMathProcessors.scalb(inputTypes, args.get(0), args.get(1)); + return VectorMathProcessors.scalb(inspector, args.get(0), args.get(1)); } } @@ -1622,7 +1623,7 @@ public Set getArrayInputs(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { // can only know cast output type if cast to argument is constant if (args.get(1).isLiteral()) { @@ -1632,16 +1633,16 @@ public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List } @Override - public boolean canVectorize(Expr.InputBindingInspector inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inspector, List args) { - return args.get(0).canVectorize(inputTypes) && args.get(1).isLiteral(); + return args.get(0).canVectorize(inspector) && args.get(1).isLiteral(); } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { return CastToTypeVectorProcessor.cast( - args.get(0).buildVectorized(inputTypes), + args.get(0).buildVectorized(inspector), ExprType.valueOf(StringUtils.toUpperCase(args.get(1).getLiteralValue().toString())) ); } @@ -1712,9 +1713,9 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - return ExprTypeConversion.conditional(inputTypes, args.subList(1, 3)); + return ExprTypeConversion.conditional(inspector, args.subList(1, 3)); } } @@ -1755,7 +1756,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { List results = new ArrayList<>(); for (int i = 1; i < args.size(); i += 2) { @@ -1763,7 +1764,7 @@ public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List } // add else results.add(args.get(args.size() - 1)); - return ExprTypeConversion.conditional(inputTypes, results); + return ExprTypeConversion.conditional(inspector, results); } } @@ -1804,7 +1805,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { List results = new ArrayList<>(); for (int i = 2; i < args.size(); i += 2) { @@ -1812,7 +1813,7 @@ public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List } // add else results.add(args.get(args.size() - 1)); - return ExprTypeConversion.conditional(inputTypes, results); + return ExprTypeConversion.conditional(inspector, results); } } @@ -1841,9 +1842,9 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - return ExprTypeConversion.conditional(inputTypes, args); + return ExprTypeConversion.conditional(inspector, args); } } @@ -1872,7 +1873,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -1903,7 +1904,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -1953,7 +1954,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -1984,7 +1985,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2025,7 +2026,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2070,7 +2071,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2120,7 +2121,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2136,7 +2137,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2168,7 +2169,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2219,7 +2220,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2253,7 +2254,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2287,7 +2288,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2303,7 +2304,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2332,7 +2333,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2377,7 +2378,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2416,7 +2417,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2466,7 +2467,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2525,7 +2526,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2638,11 +2639,11 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { ExprType type = ExprType.LONG; for (Expr arg : args) { - type = ExprTypeConversion.function(type, arg.getOutputType(inputTypes)); + type = ExprTypeConversion.function(type, arg.getOutputType(inspector)); } return ExprType.asArrayType(type); } @@ -2694,7 +2695,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2724,7 +2725,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING_ARRAY; } @@ -2765,7 +2766,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2794,9 +2795,9 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - return ExprType.elementType(args.get(0).getOutputType(inputTypes)); + return ExprType.elementType(args.get(0).getOutputType(inspector)); } @Override @@ -2822,9 +2823,9 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - return ExprType.elementType(args.get(0).getOutputType(inputTypes)); + return ExprType.elementType(args.get(0).getOutputType(inspector)); } @Override @@ -2850,7 +2851,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2888,7 +2889,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2931,9 +2932,9 @@ public boolean hasArrayOutput() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - ExprType arrayType = args.get(0).getOutputType(inputTypes); + ExprType arrayType = args.get(0).getOutputType(inspector); return Optional.ofNullable(ExprType.asArrayType(arrayType)).orElse(arrayType); } @@ -2995,9 +2996,9 @@ public boolean hasArrayOutput() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - ExprType arrayType = args.get(0).getOutputType(inputTypes); + ExprType arrayType = args.get(0).getOutputType(inspector); return Optional.ofNullable(ExprType.asArrayType(arrayType)).orElse(arrayType); } @@ -3058,7 +3059,7 @@ public boolean hasArrayOutput() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -3082,7 +3083,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -3118,9 +3119,9 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - return args.get(0).getOutputType(inputTypes); + return args.get(0).getOutputType(inspector); } @Override @@ -3204,9 +3205,9 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingInspector inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - ExprType arrayType = args.get(1).getOutputType(inputTypes); + ExprType arrayType = args.get(1).getOutputType(inspector); return Optional.ofNullable(ExprType.asArrayType(arrayType)).orElse(arrayType); } diff --git a/core/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java b/core/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java index dc396e0a6ae2..00f381b64566 100644 --- a/core/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java @@ -78,15 +78,15 @@ public Expr getExpr() } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return expr.canVectorize(inputTypes); + return expr.canVectorize(inspector); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return expr.buildVectorized(inputTypes); + return expr.buildVectorized(inspector); } @Override @@ -119,9 +119,9 @@ public BindingAnalysis analyzeInputs() } @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - return expr.getOutputType(inputTypes); + return expr.getOutputType(inspector); } @Override @@ -177,15 +177,15 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return function.canVectorize(inputTypes, args); + return function.canVectorize(inspector, args); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return function.asVectorProcessor(inputTypes, args); + return function.asVectorProcessor(inspector, args); } @Override @@ -216,9 +216,9 @@ public BindingAnalysis analyzeInputs() } @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - return function.getOutputType(inputTypes, args); + return function.getOutputType(inspector, args); } @Override @@ -298,17 +298,17 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return function.canVectorize(inputTypes, lambdaExpr, argsExpr) && - lambdaExpr.canVectorize(inputTypes) && - argsExpr.stream().allMatch(expr -> expr.canVectorize(inputTypes)); + return function.canVectorize(inspector, lambdaExpr, argsExpr) && + lambdaExpr.canVectorize(inspector) && + argsExpr.stream().allMatch(expr -> expr.canVectorize(inspector)); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return function.asVectorProcessor(inputTypes, lambdaExpr, argsExpr); + return function.asVectorProcessor(inspector, lambdaExpr, argsExpr); } @Override @@ -338,9 +338,9 @@ public BindingAnalysis analyzeInputs() @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - return function.getOutputType(inputTypes, lambdaExpr, argsExpr); + return function.getOutputType(inspector, lambdaExpr, argsExpr); } @Override diff --git a/core/src/main/java/org/apache/druid/math/expr/IdentifierExpr.java b/core/src/main/java/org/apache/druid/math/expr/IdentifierExpr.java index a080b9a9a540..9b9027fe1ea0 100644 --- a/core/src/main/java/org/apache/druid/math/expr/IdentifierExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/IdentifierExpr.java @@ -113,9 +113,9 @@ public BindingAnalysis analyzeInputs() } @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - return inputTypes.getType(binding); + return inspector.getType(binding); } @Override @@ -138,15 +138,15 @@ public Expr visit(Shuttle shuttle) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - ExprType inputType = inputTypes.getType(binding); + ExprType inputType = inspector.getType(binding); if (inputType == null) { // nil column, we can be anything, why not be a double diff --git a/core/src/main/java/org/apache/druid/math/expr/UnaryOperatorExpr.java b/core/src/main/java/org/apache/druid/math/expr/UnaryOperatorExpr.java index 11a1fd947544..e05cc08f6559 100644 --- a/core/src/main/java/org/apache/druid/math/expr/UnaryOperatorExpr.java +++ b/core/src/main/java/org/apache/druid/math/expr/UnaryOperatorExpr.java @@ -65,9 +65,9 @@ public BindingAnalysis analyzeInputs() @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - return expr.getOutputType(inputTypes); + return expr.getOutputType(inspector); } @Override @@ -132,15 +132,15 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(expr) && expr.canVectorize(inputTypes); + return inspector.areNumeric(expr) && expr.canVectorize(inspector); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - return VectorMathProcessors.negate(inputTypes, expr); + return VectorMathProcessors.negate(inspector, expr); } } @@ -171,9 +171,9 @@ public ExprEval eval(ObjectBinding bindings) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - ExprType implicitCast = super.getOutputType(inputTypes); + ExprType implicitCast = super.getOutputType(inspector); if (ExprType.STRING.equals(implicitCast)) { return ExprType.LONG; } diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/VectorComparisonProcessors.java b/core/src/main/java/org/apache/druid/math/expr/vector/VectorComparisonProcessors.java index 2467cffc162c..cdcf2bf73358 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/VectorComparisonProcessors.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/VectorComparisonProcessors.java @@ -25,19 +25,19 @@ public class VectorComparisonProcessors { public static ExprVectorProcessor equal( - Expr.VectorInputBindingInspector inputTypes, + Expr.VectorInputBindingInspector inspector, Expr left, Expr right ) { return VectorMathProcessors.makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -47,9 +47,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -59,9 +59,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -71,9 +71,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -86,19 +86,19 @@ public double apply(double left, double right) } public static ExprVectorProcessor notEqual( - Expr.VectorInputBindingInspector inputTypes, + Expr.VectorInputBindingInspector inspector, Expr left, Expr right ) { return VectorMathProcessors.makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -108,9 +108,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -120,9 +120,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -132,9 +132,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -147,19 +147,19 @@ public double apply(double left, double right) } public static ExprVectorProcessor greaterThanOrEqual( - Expr.VectorInputBindingInspector inputTypes, + Expr.VectorInputBindingInspector inspector, Expr left, Expr right ) { return VectorMathProcessors.makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -169,9 +169,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -181,9 +181,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -193,9 +193,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -208,19 +208,19 @@ public double apply(double left, double right) } public static ExprVectorProcessor greaterThan( - Expr.VectorInputBindingInspector inputTypes, + Expr.VectorInputBindingInspector inspector, Expr left, Expr right ) { return VectorMathProcessors.makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -230,9 +230,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -242,9 +242,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -254,9 +254,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -269,19 +269,19 @@ public double apply(double left, double right) } public static ExprVectorProcessor lessThanOrEqual( - Expr.VectorInputBindingInspector inputTypes, + Expr.VectorInputBindingInspector inspector, Expr left, Expr right ) { return VectorMathProcessors.makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -291,9 +291,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -303,9 +303,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -315,9 +315,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -330,19 +330,19 @@ public double apply(double left, double right) } public static ExprVectorProcessor lessThan( - Expr.VectorInputBindingInspector inputTypes, + Expr.VectorInputBindingInspector inspector, Expr left, Expr right ) { return VectorMathProcessors.makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -352,9 +352,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -364,9 +364,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -376,9 +376,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/VectorMathProcessors.java b/core/src/main/java/org/apache/druid/math/expr/vector/VectorMathProcessors.java index 6b06ecbb4f54..c1a9888466a0 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/VectorMathProcessors.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/VectorMathProcessors.java @@ -35,13 +35,13 @@ public class VectorMathProcessors * double -> double */ public static ExprVectorProcessor makeMathProcessor( - Expr.VectorInputBindingInspector inputTypes, + Expr.VectorInputBindingInspector inspector, Expr arg, Supplier longOutLongInSupplier, Supplier doubleOutDoubleInSupplier ) { - final ExprType inputType = arg.getOutputType(inputTypes); + final ExprType inputType = arg.getOutputType(inspector); ExprVectorProcessor processor = null; if (inputType == ExprType.LONG) { @@ -61,13 +61,13 @@ public static ExprVectorProcessor makeMathProcessor( * double -> double */ public static ExprVectorProcessor makeDoubleMathProcessor( - Expr.VectorInputBindingInspector inputTypes, + Expr.VectorInputBindingInspector inspector, Expr arg, Supplier doubleOutLongInSupplier, Supplier doubleOutDoubleInSupplier ) { - final ExprType inputType = arg.getOutputType(inputTypes); + final ExprType inputType = arg.getOutputType(inspector); ExprVectorProcessor processor = null; if (inputType == ExprType.LONG) { @@ -87,13 +87,13 @@ public static ExprVectorProcessor makeDoubleMathProcessor( * double -> long */ public static ExprVectorProcessor makeLongMathProcessor( - Expr.VectorInputBindingInspector inputTypes, + Expr.VectorInputBindingInspector inspector, Expr arg, Supplier longOutLongInSupplier, Supplier longOutDoubleInSupplier ) { - final ExprType inputType = arg.getOutputType(inputTypes); + final ExprType inputType = arg.getOutputType(inspector); ExprVectorProcessor processor = null; if (inputType == ExprType.LONG) { @@ -115,7 +115,7 @@ public static ExprVectorProcessor makeLongMathProcessor( * double, double -> double */ public static ExprVectorProcessor makeMathProcessor( - Expr.VectorInputBindingInspector inputTypes, + Expr.VectorInputBindingInspector inspector, Expr left, Expr right, Supplier longOutLongsInProcessor, @@ -124,8 +124,8 @@ public static ExprVectorProcessor makeMathProcessor( Supplier doubleOutDoublesInProcessor ) { - final ExprType leftType = left.getOutputType(inputTypes); - final ExprType rightType = right.getOutputType(inputTypes); + final ExprType leftType = left.getOutputType(inspector); + final ExprType rightType = right.getOutputType(inspector); ExprVectorProcessor processor = null; if (leftType == ExprType.LONG) { if (rightType == null || rightType == ExprType.LONG) { @@ -160,7 +160,7 @@ public static ExprVectorProcessor makeMathProcessor( * double, double -> double */ public static ExprVectorProcessor makeDoubleMathProcessor( - Expr.VectorInputBindingInspector inputTypes, + Expr.VectorInputBindingInspector inspector, Expr left, Expr right, Supplier doubleOutLongsInProcessor, @@ -169,8 +169,8 @@ public static ExprVectorProcessor makeDoubleMathProcessor( Supplier doubleOutDoublesInProcessor ) { - final ExprType leftType = left.getOutputType(inputTypes); - final ExprType rightType = right.getOutputType(inputTypes); + final ExprType leftType = left.getOutputType(inspector); + final ExprType rightType = right.getOutputType(inspector); ExprVectorProcessor processor = null; if (leftType == ExprType.LONG) { if (rightType == ExprType.LONG) { @@ -205,7 +205,7 @@ public static ExprVectorProcessor makeDoubleMathProcessor( * double, double -> long */ public static ExprVectorProcessor makeLongMathProcessor( - Expr.VectorInputBindingInspector inputTypes, + Expr.VectorInputBindingInspector inspector, Expr left, Expr right, Supplier longOutLongsInProcessor, @@ -214,8 +214,8 @@ public static ExprVectorProcessor makeLongMathProcessor( Supplier longOutDoublesInProcessor ) { - final ExprType leftType = left.getOutputType(inputTypes); - final ExprType rightType = right.getOutputType(inputTypes); + final ExprType leftType = left.getOutputType(inspector); + final ExprType rightType = right.getOutputType(inspector); ExprVectorProcessor processor = null; if (leftType == ExprType.LONG) { if (rightType == null || rightType == ExprType.LONG) { @@ -242,16 +242,16 @@ public static ExprVectorProcessor makeLongMathProcessor( return (ExprVectorProcessor) processor; } - public static ExprVectorProcessor plus(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor plus(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -261,9 +261,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -273,9 +273,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -285,9 +285,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -299,16 +299,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor minus(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor minus(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -318,9 +318,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -330,9 +330,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -342,9 +342,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -356,16 +356,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor multiply(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor multiply(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -375,9 +375,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -387,9 +387,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -399,9 +399,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -413,16 +413,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor divide(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor divide(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -432,9 +432,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -444,9 +444,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -456,9 +456,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -470,16 +470,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor longDivide(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor longDivide(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeLongMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -489,9 +489,9 @@ public long apply(long left, long right) } }, () -> new LongOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -501,9 +501,9 @@ public long apply(long left, double right) } }, () -> new LongOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -513,9 +513,9 @@ public long apply(double left, long right) } }, () -> new LongOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -527,16 +527,16 @@ public long apply(double left, double right) ); } - public static ExprVectorProcessor modulo(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor modulo(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -546,9 +546,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -558,9 +558,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -570,9 +570,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -584,14 +584,14 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor negate(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor negate(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeMathProcessor( - inputTypes, + inspector, arg, () -> new LongOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -601,8 +601,8 @@ public long apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -614,16 +614,16 @@ public double apply(double input) ); } - public static ExprVectorProcessor power(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor power(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -633,9 +633,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -645,9 +645,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -657,9 +657,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -671,17 +671,21 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor doublePower(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor doublePower( + Expr.VectorInputBindingInspector inspector, + Expr left, + Expr right + ) { BivariateFunctionVectorProcessor processor = null; - ExprType leftType = left.getOutputType(inputTypes); - ExprType rightType = right.getOutputType(inputTypes); + ExprType leftType = left.getOutputType(inspector); + ExprType rightType = right.getOutputType(inspector); if ((leftType == ExprType.LONG && (rightType == null || rightType == ExprType.LONG)) || (leftType == null && rightType == ExprType.LONG)) { processor = new DoubleOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -695,19 +699,19 @@ public double apply(long left, long right) if (processor != null) { return (ExprVectorProcessor) processor; } - return power(inputTypes, left, right); + return power(inspector, left, right); } - public static ExprVectorProcessor max(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor max(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -717,9 +721,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -729,9 +733,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -741,9 +745,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -755,16 +759,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor min(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor min(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeMathProcessor( - inputTypes, + inspector, left, right, () -> new LongOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -774,9 +778,9 @@ public long apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -786,9 +790,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -798,9 +802,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -812,16 +816,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor atan2(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor atan2(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeDoubleMathProcessor( - inputTypes, + inspector, left, right, () -> new DoubleOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -831,9 +835,9 @@ public double apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -843,9 +847,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -855,9 +859,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -869,16 +873,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor copySign(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor copySign(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeDoubleMathProcessor( - inputTypes, + inspector, left, right, () -> new DoubleOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -888,9 +892,9 @@ public double apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -900,9 +904,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -912,9 +916,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -926,16 +930,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor hypot(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor hypot(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeDoubleMathProcessor( - inputTypes, + inspector, left, right, () -> new DoubleOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -945,9 +949,9 @@ public double apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -957,9 +961,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -969,9 +973,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -983,16 +987,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor remainder(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor remainder(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeDoubleMathProcessor( - inputTypes, + inspector, left, right, () -> new DoubleOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1002,9 +1006,9 @@ public double apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1014,9 +1018,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1026,9 +1030,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1040,16 +1044,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor nextAfter(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor nextAfter(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeDoubleMathProcessor( - inputTypes, + inspector, left, right, () -> new DoubleOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1059,9 +1063,9 @@ public double apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1071,9 +1075,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1083,9 +1087,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1097,16 +1101,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor scalb(Expr.VectorInputBindingInspector inputTypes, Expr left, Expr right) + public static ExprVectorProcessor scalb(Expr.VectorInputBindingInspector inspector, Expr left, Expr right) { return makeDoubleMathProcessor( - inputTypes, + inspector, left, right, () -> new DoubleOutLongsInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1116,9 +1120,9 @@ public double apply(long left, long right) } }, () -> new DoubleOutLongDoubleInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1128,9 +1132,9 @@ public double apply(long left, double right) } }, () -> new DoubleOutDoubleLongInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1140,9 +1144,9 @@ public double apply(double left, long right) } }, () -> new DoubleOutDoublesInFunctionVectorProcessor( - left.buildVectorized(inputTypes), - right.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + left.buildVectorized(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1154,14 +1158,14 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor acos(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor acos(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1171,8 +1175,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1184,14 +1188,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor asin(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor asin(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1201,8 +1205,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1214,14 +1218,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor atan(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor atan(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1231,8 +1235,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1244,14 +1248,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor cos(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor cos(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1261,8 +1265,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1274,14 +1278,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor cosh(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor cosh(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1291,8 +1295,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1304,14 +1308,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor cot(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor cot(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1321,8 +1325,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1334,14 +1338,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor sin(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor sin(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1351,8 +1355,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1364,14 +1368,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor sinh(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor sinh(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1381,8 +1385,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1394,14 +1398,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor tan(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor tan(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1411,8 +1415,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1424,14 +1428,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor tanh(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor tanh(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1441,8 +1445,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1454,14 +1458,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor abs(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor abs(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeMathProcessor( - inputTypes, + inspector, arg, () -> new LongOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1471,8 +1475,8 @@ public long apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1484,14 +1488,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor cbrt(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor cbrt(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1501,8 +1505,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1514,14 +1518,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor ceil(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor ceil(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1531,8 +1535,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1544,14 +1548,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor floor(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor floor(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1561,8 +1565,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1574,14 +1578,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor exp(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor exp(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1591,8 +1595,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1604,14 +1608,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor expm1(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor expm1(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1621,8 +1625,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1634,14 +1638,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor getExponent(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor getExponent(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeLongMathProcessor( - inputTypes, + inspector, arg, () -> new LongOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1651,8 +1655,8 @@ public long apply(long input) } }, () -> new LongOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1664,14 +1668,14 @@ public long apply(double input) ); } - public static ExprVectorProcessor log(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor log(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1681,8 +1685,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1694,14 +1698,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor log10(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor log10(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1711,8 +1715,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1724,14 +1728,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor log1p(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor log1p(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1741,8 +1745,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1754,14 +1758,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor nextUp(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor nextUp(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1771,8 +1775,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1784,14 +1788,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor rint(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor rint(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1801,8 +1805,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1814,14 +1818,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor signum(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor signum(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1831,8 +1835,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1844,14 +1848,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor sqrt(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor sqrt(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1861,8 +1865,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1874,14 +1878,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor toDegrees(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor toDegrees(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1891,8 +1895,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1904,14 +1908,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor toRadians(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor toRadians(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1921,8 +1925,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1934,14 +1938,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor ulp(Expr.VectorInputBindingInspector inputTypes, Expr arg) + public static ExprVectorProcessor ulp(Expr.VectorInputBindingInspector inspector, Expr arg) { return makeDoubleMathProcessor( - inputTypes, + inspector, arg, () -> new DoubleOutLongInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1951,8 +1955,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override diff --git a/core/src/main/java/org/apache/druid/math/expr/vector/VectorProcessors.java b/core/src/main/java/org/apache/druid/math/expr/vector/VectorProcessors.java index 6098dedbd8c4..60edbdb44ed4 100644 --- a/core/src/main/java/org/apache/druid/math/expr/vector/VectorProcessors.java +++ b/core/src/main/java/org/apache/druid/math/expr/vector/VectorProcessors.java @@ -105,11 +105,11 @@ public ExprType getOutputType() }; } - public static ExprVectorProcessor parseLong(Expr.VectorInputBindingInspector inputTypes, Expr arg, int radix) + public static ExprVectorProcessor parseLong(Expr.VectorInputBindingInspector inspector, Expr arg, int radix) { final ExprVectorProcessor processor = new LongOutStringInFunctionVectorProcessor( - CastToTypeVectorProcessor.cast(arg.buildVectorized(inputTypes), ExprType.STRING), - inputTypes.getMaxVectorSize() + CastToTypeVectorProcessor.cast(arg.buildVectorized(inspector), ExprType.STRING), + inspector.getMaxVectorSize() ) { @Override diff --git a/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java b/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java index 57a0dc56aa7c..bb1055236e39 100644 --- a/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java +++ b/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java @@ -31,7 +31,7 @@ public class OutputTypeTest extends InitializedNullHandlingTest { - private final Expr.InputBindingInspector inputTypes = inputTypesFromMap( + private final Expr.InputBindingInspector inspector = inspectorFromMap( ImmutableMap.builder().put("x", ExprType.STRING) .put("x_", ExprType.STRING) .put("y", ExprType.LONG) @@ -53,339 +53,339 @@ public class OutputTypeTest extends InitializedNullHandlingTest @Test public void testConstantsAndIdentifiers() { - assertOutputType("'hello'", inputTypes, ExprType.STRING); - assertOutputType("23", inputTypes, ExprType.LONG); - assertOutputType("3.2", inputTypes, ExprType.DOUBLE); - assertOutputType("['a', 'b']", inputTypes, ExprType.STRING_ARRAY); - assertOutputType("[1,2,3]", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("[1.0]", inputTypes, ExprType.DOUBLE_ARRAY); - assertOutputType("x", inputTypes, ExprType.STRING); - assertOutputType("y", inputTypes, ExprType.LONG); - assertOutputType("z", inputTypes, ExprType.DOUBLE); - assertOutputType("a", inputTypes, ExprType.STRING_ARRAY); - assertOutputType("b", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("c", inputTypes, ExprType.DOUBLE_ARRAY); + assertOutputType("'hello'", inspector, ExprType.STRING); + assertOutputType("23", inspector, ExprType.LONG); + assertOutputType("3.2", inspector, ExprType.DOUBLE); + assertOutputType("['a', 'b']", inspector, ExprType.STRING_ARRAY); + assertOutputType("[1,2,3]", inspector, ExprType.LONG_ARRAY); + assertOutputType("[1.0]", inspector, ExprType.DOUBLE_ARRAY); + assertOutputType("x", inspector, ExprType.STRING); + assertOutputType("y", inspector, ExprType.LONG); + assertOutputType("z", inspector, ExprType.DOUBLE); + assertOutputType("a", inspector, ExprType.STRING_ARRAY); + assertOutputType("b", inspector, ExprType.LONG_ARRAY); + assertOutputType("c", inspector, ExprType.DOUBLE_ARRAY); } @Test public void testUnaryOperators() { - assertOutputType("-1", inputTypes, ExprType.LONG); - assertOutputType("-1.1", inputTypes, ExprType.DOUBLE); - assertOutputType("-y", inputTypes, ExprType.LONG); - assertOutputType("-z", inputTypes, ExprType.DOUBLE); - - assertOutputType("!'true'", inputTypes, ExprType.LONG); - assertOutputType("!1", inputTypes, ExprType.LONG); - assertOutputType("!1.1", inputTypes, ExprType.DOUBLE); - assertOutputType("!x", inputTypes, ExprType.LONG); - assertOutputType("!y", inputTypes, ExprType.LONG); - assertOutputType("!z", inputTypes, ExprType.DOUBLE); + assertOutputType("-1", inspector, ExprType.LONG); + assertOutputType("-1.1", inspector, ExprType.DOUBLE); + assertOutputType("-y", inspector, ExprType.LONG); + assertOutputType("-z", inspector, ExprType.DOUBLE); + + assertOutputType("!'true'", inspector, ExprType.LONG); + assertOutputType("!1", inspector, ExprType.LONG); + assertOutputType("!1.1", inspector, ExprType.DOUBLE); + assertOutputType("!x", inspector, ExprType.LONG); + assertOutputType("!y", inspector, ExprType.LONG); + assertOutputType("!z", inspector, ExprType.DOUBLE); } @Test public void testBinaryMathOperators() { - assertOutputType("1+1", inputTypes, ExprType.LONG); - assertOutputType("1-1", inputTypes, ExprType.LONG); - assertOutputType("1*1", inputTypes, ExprType.LONG); - assertOutputType("1/1", inputTypes, ExprType.LONG); - assertOutputType("1^1", inputTypes, ExprType.LONG); - assertOutputType("1%1", inputTypes, ExprType.LONG); - - assertOutputType("y+y_", inputTypes, ExprType.LONG); - assertOutputType("y-y_", inputTypes, ExprType.LONG); - assertOutputType("y*y_", inputTypes, ExprType.LONG); - assertOutputType("y/y_", inputTypes, ExprType.LONG); - assertOutputType("y^y_", inputTypes, ExprType.LONG); - assertOutputType("y%y_", inputTypes, ExprType.LONG); - - assertOutputType("y+z", inputTypes, ExprType.DOUBLE); - assertOutputType("y-z", inputTypes, ExprType.DOUBLE); - assertOutputType("y*z", inputTypes, ExprType.DOUBLE); - assertOutputType("y/z", inputTypes, ExprType.DOUBLE); - assertOutputType("y^z", inputTypes, ExprType.DOUBLE); - assertOutputType("y%z", inputTypes, ExprType.DOUBLE); - - assertOutputType("z+z_", inputTypes, ExprType.DOUBLE); - assertOutputType("z-z_", inputTypes, ExprType.DOUBLE); - assertOutputType("z*z_", inputTypes, ExprType.DOUBLE); - assertOutputType("z/z_", inputTypes, ExprType.DOUBLE); - assertOutputType("z^z_", inputTypes, ExprType.DOUBLE); - assertOutputType("z%z_", inputTypes, ExprType.DOUBLE); - - assertOutputType("y>y_", inputTypes, ExprType.LONG); - assertOutputType("y_=y", inputTypes, ExprType.LONG); - assertOutputType("y_==y", inputTypes, ExprType.LONG); - assertOutputType("y_!=y", inputTypes, ExprType.LONG); - assertOutputType("y_ && y", inputTypes, ExprType.LONG); - assertOutputType("y_ || y", inputTypes, ExprType.LONG); - - assertOutputType("z>y_", inputTypes, ExprType.DOUBLE); - assertOutputType("z=z", inputTypes, ExprType.DOUBLE); - assertOutputType("z==y", inputTypes, ExprType.DOUBLE); - assertOutputType("z!=y", inputTypes, ExprType.DOUBLE); - assertOutputType("z && y", inputTypes, ExprType.DOUBLE); - assertOutputType("y || z", inputTypes, ExprType.DOUBLE); - - assertOutputType("z>z_", inputTypes, ExprType.DOUBLE); - assertOutputType("z=z", inputTypes, ExprType.DOUBLE); - assertOutputType("z==z_", inputTypes, ExprType.DOUBLE); - assertOutputType("z!=z_", inputTypes, ExprType.DOUBLE); - assertOutputType("z && z_", inputTypes, ExprType.DOUBLE); - assertOutputType("z_ || z", inputTypes, ExprType.DOUBLE); - - assertOutputType("1*(2 + 3.0)", inputTypes, ExprType.DOUBLE); + assertOutputType("1+1", inspector, ExprType.LONG); + assertOutputType("1-1", inspector, ExprType.LONG); + assertOutputType("1*1", inspector, ExprType.LONG); + assertOutputType("1/1", inspector, ExprType.LONG); + assertOutputType("1^1", inspector, ExprType.LONG); + assertOutputType("1%1", inspector, ExprType.LONG); + + assertOutputType("y+y_", inspector, ExprType.LONG); + assertOutputType("y-y_", inspector, ExprType.LONG); + assertOutputType("y*y_", inspector, ExprType.LONG); + assertOutputType("y/y_", inspector, ExprType.LONG); + assertOutputType("y^y_", inspector, ExprType.LONG); + assertOutputType("y%y_", inspector, ExprType.LONG); + + assertOutputType("y+z", inspector, ExprType.DOUBLE); + assertOutputType("y-z", inspector, ExprType.DOUBLE); + assertOutputType("y*z", inspector, ExprType.DOUBLE); + assertOutputType("y/z", inspector, ExprType.DOUBLE); + assertOutputType("y^z", inspector, ExprType.DOUBLE); + assertOutputType("y%z", inspector, ExprType.DOUBLE); + + assertOutputType("z+z_", inspector, ExprType.DOUBLE); + assertOutputType("z-z_", inspector, ExprType.DOUBLE); + assertOutputType("z*z_", inspector, ExprType.DOUBLE); + assertOutputType("z/z_", inspector, ExprType.DOUBLE); + assertOutputType("z^z_", inspector, ExprType.DOUBLE); + assertOutputType("z%z_", inspector, ExprType.DOUBLE); + + assertOutputType("y>y_", inspector, ExprType.LONG); + assertOutputType("y_=y", inspector, ExprType.LONG); + assertOutputType("y_==y", inspector, ExprType.LONG); + assertOutputType("y_!=y", inspector, ExprType.LONG); + assertOutputType("y_ && y", inspector, ExprType.LONG); + assertOutputType("y_ || y", inspector, ExprType.LONG); + + assertOutputType("z>y_", inspector, ExprType.DOUBLE); + assertOutputType("z=z", inspector, ExprType.DOUBLE); + assertOutputType("z==y", inspector, ExprType.DOUBLE); + assertOutputType("z!=y", inspector, ExprType.DOUBLE); + assertOutputType("z && y", inspector, ExprType.DOUBLE); + assertOutputType("y || z", inspector, ExprType.DOUBLE); + + assertOutputType("z>z_", inspector, ExprType.DOUBLE); + assertOutputType("z=z", inspector, ExprType.DOUBLE); + assertOutputType("z==z_", inspector, ExprType.DOUBLE); + assertOutputType("z!=z_", inspector, ExprType.DOUBLE); + assertOutputType("z && z_", inspector, ExprType.DOUBLE); + assertOutputType("z_ || z", inspector, ExprType.DOUBLE); + + assertOutputType("1*(2 + 3.0)", inspector, ExprType.DOUBLE); } @Test public void testUnivariateMathFunctions() { - assertOutputType("pi()", inputTypes, ExprType.DOUBLE); - assertOutputType("abs(x)", inputTypes, ExprType.STRING); - assertOutputType("abs(y)", inputTypes, ExprType.LONG); - assertOutputType("abs(z)", inputTypes, ExprType.DOUBLE); - assertOutputType("cos(y)", inputTypes, ExprType.DOUBLE); - assertOutputType("cos(z)", inputTypes, ExprType.DOUBLE); + assertOutputType("pi()", inspector, ExprType.DOUBLE); + assertOutputType("abs(x)", inspector, ExprType.STRING); + assertOutputType("abs(y)", inspector, ExprType.LONG); + assertOutputType("abs(z)", inspector, ExprType.DOUBLE); + assertOutputType("cos(y)", inspector, ExprType.DOUBLE); + assertOutputType("cos(z)", inspector, ExprType.DOUBLE); } @Test public void testBivariateMathFunctions() { - assertOutputType("div(y,y_)", inputTypes, ExprType.LONG); - assertOutputType("div(y,z_)", inputTypes, ExprType.LONG); - assertOutputType("div(z,z_)", inputTypes, ExprType.LONG); + assertOutputType("div(y,y_)", inspector, ExprType.LONG); + assertOutputType("div(y,z_)", inspector, ExprType.LONG); + assertOutputType("div(z,z_)", inspector, ExprType.LONG); - assertOutputType("max(y,y_)", inputTypes, ExprType.LONG); - assertOutputType("max(y,z_)", inputTypes, ExprType.DOUBLE); - assertOutputType("max(z,z_)", inputTypes, ExprType.DOUBLE); + assertOutputType("max(y,y_)", inspector, ExprType.LONG); + assertOutputType("max(y,z_)", inspector, ExprType.DOUBLE); + assertOutputType("max(z,z_)", inspector, ExprType.DOUBLE); - assertOutputType("hypot(y,y_)", inputTypes, ExprType.DOUBLE); - assertOutputType("hypot(y,z_)", inputTypes, ExprType.DOUBLE); - assertOutputType("hypot(z,z_)", inputTypes, ExprType.DOUBLE); + assertOutputType("hypot(y,y_)", inspector, ExprType.DOUBLE); + assertOutputType("hypot(y,z_)", inspector, ExprType.DOUBLE); + assertOutputType("hypot(z,z_)", inspector, ExprType.DOUBLE); } @Test public void testConditionalFunctions() { - assertOutputType("if(y, 'foo', 'bar')", inputTypes, ExprType.STRING); - assertOutputType("if(y,2,3)", inputTypes, ExprType.LONG); - assertOutputType("if(y,2,3.0)", inputTypes, ExprType.DOUBLE); + assertOutputType("if(y, 'foo', 'bar')", inspector, ExprType.STRING); + assertOutputType("if(y,2,3)", inspector, ExprType.LONG); + assertOutputType("if(y,2,3.0)", inspector, ExprType.DOUBLE); assertOutputType( "case_simple(x,'baz','is baz','foo','is foo','is other')", - inputTypes, + inspector, ExprType.STRING ); assertOutputType( "case_simple(y,2,2,3,3,4)", - inputTypes, + inspector, ExprType.LONG ); assertOutputType( "case_simple(z,2.0,2.0,3.0,3.0,4.0)", - inputTypes, + inspector, ExprType.DOUBLE ); assertOutputType( "case_simple(y,2,2,3,3.0,4)", - inputTypes, + inspector, ExprType.DOUBLE ); assertOutputType( "case_simple(z,2.0,2.0,3.0,3.0,null)", - inputTypes, + inspector, ExprType.DOUBLE ); assertOutputType( "case_searched(x=='baz','is baz',x=='foo','is foo','is other')", - inputTypes, + inspector, ExprType.STRING ); assertOutputType( "case_searched(y==1,1,y==2,2,0)", - inputTypes, + inspector, ExprType.LONG ); assertOutputType( "case_searched(z==1.0,1.0,z==2.0,2.0,0.0)", - inputTypes, + inspector, ExprType.DOUBLE ); assertOutputType( "case_searched(y==1,1,y==2,2.0,0)", - inputTypes, + inspector, ExprType.DOUBLE ); assertOutputType( "case_searched(z==1.0,1,z==2.0,2,null)", - inputTypes, + inspector, ExprType.LONG ); assertOutputType( "case_searched(z==1.0,1.0,z==2.0,2.0,null)", - inputTypes, + inspector, ExprType.DOUBLE ); - assertOutputType("nvl(x, 'foo')", inputTypes, ExprType.STRING); - assertOutputType("nvl(y, 1)", inputTypes, ExprType.LONG); - assertOutputType("nvl(y, 1.1)", inputTypes, ExprType.DOUBLE); - assertOutputType("nvl(z, 2.0)", inputTypes, ExprType.DOUBLE); - assertOutputType("nvl(y, 2.0)", inputTypes, ExprType.DOUBLE); - assertOutputType("isnull(x)", inputTypes, ExprType.LONG); - assertOutputType("isnull(y)", inputTypes, ExprType.LONG); - assertOutputType("isnull(z)", inputTypes, ExprType.LONG); - assertOutputType("notnull(x)", inputTypes, ExprType.LONG); - assertOutputType("notnull(y)", inputTypes, ExprType.LONG); - assertOutputType("notnull(z)", inputTypes, ExprType.LONG); + assertOutputType("nvl(x, 'foo')", inspector, ExprType.STRING); + assertOutputType("nvl(y, 1)", inspector, ExprType.LONG); + assertOutputType("nvl(y, 1.1)", inspector, ExprType.DOUBLE); + assertOutputType("nvl(z, 2.0)", inspector, ExprType.DOUBLE); + assertOutputType("nvl(y, 2.0)", inspector, ExprType.DOUBLE); + assertOutputType("isnull(x)", inspector, ExprType.LONG); + assertOutputType("isnull(y)", inspector, ExprType.LONG); + assertOutputType("isnull(z)", inspector, ExprType.LONG); + assertOutputType("notnull(x)", inspector, ExprType.LONG); + assertOutputType("notnull(y)", inspector, ExprType.LONG); + assertOutputType("notnull(z)", inspector, ExprType.LONG); } @Test public void testStringFunctions() { - assertOutputType("concat(x, 'foo')", inputTypes, ExprType.STRING); - assertOutputType("concat(y, 'foo')", inputTypes, ExprType.STRING); - assertOutputType("concat(z, 'foo')", inputTypes, ExprType.STRING); - - assertOutputType("strlen(x)", inputTypes, ExprType.LONG); - assertOutputType("format('%s', x)", inputTypes, ExprType.STRING); - assertOutputType("format('%s', y)", inputTypes, ExprType.STRING); - assertOutputType("format('%s', z)", inputTypes, ExprType.STRING); - assertOutputType("strpos(x, x_)", inputTypes, ExprType.LONG); - assertOutputType("strpos(x, y)", inputTypes, ExprType.LONG); - assertOutputType("strpos(x, z)", inputTypes, ExprType.LONG); - assertOutputType("substring(x, 1, 2)", inputTypes, ExprType.STRING); - assertOutputType("left(x, 1)", inputTypes, ExprType.STRING); - assertOutputType("right(x, 1)", inputTypes, ExprType.STRING); - assertOutputType("replace(x, 'foo', '')", inputTypes, ExprType.STRING); - assertOutputType("lower(x)", inputTypes, ExprType.STRING); - assertOutputType("upper(x)", inputTypes, ExprType.STRING); - assertOutputType("reverse(x)", inputTypes, ExprType.STRING); - assertOutputType("repeat(x, 4)", inputTypes, ExprType.STRING); + assertOutputType("concat(x, 'foo')", inspector, ExprType.STRING); + assertOutputType("concat(y, 'foo')", inspector, ExprType.STRING); + assertOutputType("concat(z, 'foo')", inspector, ExprType.STRING); + + assertOutputType("strlen(x)", inspector, ExprType.LONG); + assertOutputType("format('%s', x)", inspector, ExprType.STRING); + assertOutputType("format('%s', y)", inspector, ExprType.STRING); + assertOutputType("format('%s', z)", inspector, ExprType.STRING); + assertOutputType("strpos(x, x_)", inspector, ExprType.LONG); + assertOutputType("strpos(x, y)", inspector, ExprType.LONG); + assertOutputType("strpos(x, z)", inspector, ExprType.LONG); + assertOutputType("substring(x, 1, 2)", inspector, ExprType.STRING); + assertOutputType("left(x, 1)", inspector, ExprType.STRING); + assertOutputType("right(x, 1)", inspector, ExprType.STRING); + assertOutputType("replace(x, 'foo', '')", inspector, ExprType.STRING); + assertOutputType("lower(x)", inspector, ExprType.STRING); + assertOutputType("upper(x)", inspector, ExprType.STRING); + assertOutputType("reverse(x)", inspector, ExprType.STRING); + assertOutputType("repeat(x, 4)", inspector, ExprType.STRING); } @Test public void testArrayFunctions() { - assertOutputType("array(1, 2, 3)", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("array(1, 2, 3.0)", inputTypes, ExprType.DOUBLE_ARRAY); - - assertOutputType("array_length(a)", inputTypes, ExprType.LONG); - assertOutputType("array_length(b)", inputTypes, ExprType.LONG); - assertOutputType("array_length(c)", inputTypes, ExprType.LONG); - - assertOutputType("string_to_array(x, ',')", inputTypes, ExprType.STRING_ARRAY); - - assertOutputType("array_to_string(a, ',')", inputTypes, ExprType.STRING); - assertOutputType("array_to_string(b, ',')", inputTypes, ExprType.STRING); - assertOutputType("array_to_string(c, ',')", inputTypes, ExprType.STRING); - - assertOutputType("array_offset(a, 1)", inputTypes, ExprType.STRING); - assertOutputType("array_offset(b, 1)", inputTypes, ExprType.LONG); - assertOutputType("array_offset(c, 1)", inputTypes, ExprType.DOUBLE); - - assertOutputType("array_ordinal(a, 1)", inputTypes, ExprType.STRING); - assertOutputType("array_ordinal(b, 1)", inputTypes, ExprType.LONG); - assertOutputType("array_ordinal(c, 1)", inputTypes, ExprType.DOUBLE); - - assertOutputType("array_offset_of(a, 'a')", inputTypes, ExprType.LONG); - assertOutputType("array_offset_of(b, 1)", inputTypes, ExprType.LONG); - assertOutputType("array_offset_of(c, 1.0)", inputTypes, ExprType.LONG); - - assertOutputType("array_ordinal_of(a, 'a')", inputTypes, ExprType.LONG); - assertOutputType("array_ordinal_of(b, 1)", inputTypes, ExprType.LONG); - assertOutputType("array_ordinal_of(c, 1.0)", inputTypes, ExprType.LONG); - - assertOutputType("array_append(x, x_)", inputTypes, ExprType.STRING_ARRAY); - assertOutputType("array_append(a, x_)", inputTypes, ExprType.STRING_ARRAY); - assertOutputType("array_append(y, y_)", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("array_append(b, y_)", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("array_append(z, z_)", inputTypes, ExprType.DOUBLE_ARRAY); - assertOutputType("array_append(c, z_)", inputTypes, ExprType.DOUBLE_ARRAY); - - assertOutputType("array_concat(x, a)", inputTypes, ExprType.STRING_ARRAY); - assertOutputType("array_concat(a, a)", inputTypes, ExprType.STRING_ARRAY); - assertOutputType("array_concat(y, b)", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("array_concat(b, b)", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("array_concat(z, c)", inputTypes, ExprType.DOUBLE_ARRAY); - assertOutputType("array_concat(c, c)", inputTypes, ExprType.DOUBLE_ARRAY); - - assertOutputType("array_contains(a, 'a')", inputTypes, ExprType.LONG); - assertOutputType("array_contains(b, 1)", inputTypes, ExprType.LONG); - assertOutputType("array_contains(c, 2.0)", inputTypes, ExprType.LONG); - - assertOutputType("array_overlap(a, a)", inputTypes, ExprType.LONG); - assertOutputType("array_overlap(b, b)", inputTypes, ExprType.LONG); - assertOutputType("array_overlap(c, c)", inputTypes, ExprType.LONG); - - assertOutputType("array_slice(a, 1, 2)", inputTypes, ExprType.STRING_ARRAY); - assertOutputType("array_slice(b, 1, 2)", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("array_slice(c, 1, 2)", inputTypes, ExprType.DOUBLE_ARRAY); - - assertOutputType("array_prepend(x, a)", inputTypes, ExprType.STRING_ARRAY); - assertOutputType("array_prepend(x, x_)", inputTypes, ExprType.STRING_ARRAY); - assertOutputType("array_prepend(y, b)", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("array_prepend(y, y_)", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("array_prepend(z, c)", inputTypes, ExprType.DOUBLE_ARRAY); - assertOutputType("array_prepend(z, z_)", inputTypes, ExprType.DOUBLE_ARRAY); + assertOutputType("array(1, 2, 3)", inspector, ExprType.LONG_ARRAY); + assertOutputType("array(1, 2, 3.0)", inspector, ExprType.DOUBLE_ARRAY); + + assertOutputType("array_length(a)", inspector, ExprType.LONG); + assertOutputType("array_length(b)", inspector, ExprType.LONG); + assertOutputType("array_length(c)", inspector, ExprType.LONG); + + assertOutputType("string_to_array(x, ',')", inspector, ExprType.STRING_ARRAY); + + assertOutputType("array_to_string(a, ',')", inspector, ExprType.STRING); + assertOutputType("array_to_string(b, ',')", inspector, ExprType.STRING); + assertOutputType("array_to_string(c, ',')", inspector, ExprType.STRING); + + assertOutputType("array_offset(a, 1)", inspector, ExprType.STRING); + assertOutputType("array_offset(b, 1)", inspector, ExprType.LONG); + assertOutputType("array_offset(c, 1)", inspector, ExprType.DOUBLE); + + assertOutputType("array_ordinal(a, 1)", inspector, ExprType.STRING); + assertOutputType("array_ordinal(b, 1)", inspector, ExprType.LONG); + assertOutputType("array_ordinal(c, 1)", inspector, ExprType.DOUBLE); + + assertOutputType("array_offset_of(a, 'a')", inspector, ExprType.LONG); + assertOutputType("array_offset_of(b, 1)", inspector, ExprType.LONG); + assertOutputType("array_offset_of(c, 1.0)", inspector, ExprType.LONG); + + assertOutputType("array_ordinal_of(a, 'a')", inspector, ExprType.LONG); + assertOutputType("array_ordinal_of(b, 1)", inspector, ExprType.LONG); + assertOutputType("array_ordinal_of(c, 1.0)", inspector, ExprType.LONG); + + assertOutputType("array_append(x, x_)", inspector, ExprType.STRING_ARRAY); + assertOutputType("array_append(a, x_)", inspector, ExprType.STRING_ARRAY); + assertOutputType("array_append(y, y_)", inspector, ExprType.LONG_ARRAY); + assertOutputType("array_append(b, y_)", inspector, ExprType.LONG_ARRAY); + assertOutputType("array_append(z, z_)", inspector, ExprType.DOUBLE_ARRAY); + assertOutputType("array_append(c, z_)", inspector, ExprType.DOUBLE_ARRAY); + + assertOutputType("array_concat(x, a)", inspector, ExprType.STRING_ARRAY); + assertOutputType("array_concat(a, a)", inspector, ExprType.STRING_ARRAY); + assertOutputType("array_concat(y, b)", inspector, ExprType.LONG_ARRAY); + assertOutputType("array_concat(b, b)", inspector, ExprType.LONG_ARRAY); + assertOutputType("array_concat(z, c)", inspector, ExprType.DOUBLE_ARRAY); + assertOutputType("array_concat(c, c)", inspector, ExprType.DOUBLE_ARRAY); + + assertOutputType("array_contains(a, 'a')", inspector, ExprType.LONG); + assertOutputType("array_contains(b, 1)", inspector, ExprType.LONG); + assertOutputType("array_contains(c, 2.0)", inspector, ExprType.LONG); + + assertOutputType("array_overlap(a, a)", inspector, ExprType.LONG); + assertOutputType("array_overlap(b, b)", inspector, ExprType.LONG); + assertOutputType("array_overlap(c, c)", inspector, ExprType.LONG); + + assertOutputType("array_slice(a, 1, 2)", inspector, ExprType.STRING_ARRAY); + assertOutputType("array_slice(b, 1, 2)", inspector, ExprType.LONG_ARRAY); + assertOutputType("array_slice(c, 1, 2)", inspector, ExprType.DOUBLE_ARRAY); + + assertOutputType("array_prepend(x, a)", inspector, ExprType.STRING_ARRAY); + assertOutputType("array_prepend(x, x_)", inspector, ExprType.STRING_ARRAY); + assertOutputType("array_prepend(y, b)", inspector, ExprType.LONG_ARRAY); + assertOutputType("array_prepend(y, y_)", inspector, ExprType.LONG_ARRAY); + assertOutputType("array_prepend(z, c)", inspector, ExprType.DOUBLE_ARRAY); + assertOutputType("array_prepend(z, z_)", inspector, ExprType.DOUBLE_ARRAY); } @Test public void testReduceFunctions() { - assertOutputType("greatest('B', x, 'A')", inputTypes, ExprType.STRING); - assertOutputType("greatest(y, 0)", inputTypes, ExprType.LONG); - assertOutputType("greatest(34.0, z, 5.0, 767.0)", inputTypes, ExprType.DOUBLE); + assertOutputType("greatest('B', x, 'A')", inspector, ExprType.STRING); + assertOutputType("greatest(y, 0)", inspector, ExprType.LONG); + assertOutputType("greatest(34.0, z, 5.0, 767.0)", inspector, ExprType.DOUBLE); - assertOutputType("least('B', x, 'A')", inputTypes, ExprType.STRING); - assertOutputType("least(y, 0)", inputTypes, ExprType.LONG); - assertOutputType("least(34.0, z, 5.0, 767.0)", inputTypes, ExprType.DOUBLE); + assertOutputType("least('B', x, 'A')", inspector, ExprType.STRING); + assertOutputType("least(y, 0)", inspector, ExprType.LONG); + assertOutputType("least(34.0, z, 5.0, 767.0)", inspector, ExprType.DOUBLE); } @Test public void testApplyFunctions() { - assertOutputType("map((x) -> concat(x, 'foo'), x)", inputTypes, ExprType.STRING_ARRAY); - assertOutputType("map((x) -> x + x, y)", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("map((x) -> x + x, z)", inputTypes, ExprType.DOUBLE_ARRAY); - assertOutputType("map((x) -> concat(x, 'foo'), a)", inputTypes, ExprType.STRING_ARRAY); - assertOutputType("map((x) -> x + x, b)", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("map((x) -> x + x, c)", inputTypes, ExprType.DOUBLE_ARRAY); + assertOutputType("map((x) -> concat(x, 'foo'), x)", inspector, ExprType.STRING_ARRAY); + assertOutputType("map((x) -> x + x, y)", inspector, ExprType.LONG_ARRAY); + assertOutputType("map((x) -> x + x, z)", inspector, ExprType.DOUBLE_ARRAY); + assertOutputType("map((x) -> concat(x, 'foo'), a)", inspector, ExprType.STRING_ARRAY); + assertOutputType("map((x) -> x + x, b)", inspector, ExprType.LONG_ARRAY); + assertOutputType("map((x) -> x + x, c)", inspector, ExprType.DOUBLE_ARRAY); assertOutputType( "cartesian_map((x, y) -> concat(x, y), ['foo', 'bar', 'baz', 'foobar'], ['bar', 'baz'])", - inputTypes, + inspector, ExprType.STRING_ARRAY ); - assertOutputType("fold((x, acc) -> x + acc, y, 0)", inputTypes, ExprType.LONG); - assertOutputType("fold((x, acc) -> x + acc, y, y)", inputTypes, ExprType.LONG); - assertOutputType("fold((x, acc) -> x + acc, y, 1.0)", inputTypes, ExprType.DOUBLE); - assertOutputType("fold((x, acc) -> x + acc, y, z)", inputTypes, ExprType.DOUBLE); - - assertOutputType("cartesian_fold((x, y, acc) -> x + y + acc, y, z, 0)", inputTypes, ExprType.LONG); - assertOutputType("cartesian_fold((x, y, acc) -> x + y + acc, y, z, y)", inputTypes, ExprType.LONG); - assertOutputType("cartesian_fold((x, y, acc) -> x + y + acc, y, z, 1.0)", inputTypes, ExprType.DOUBLE); - assertOutputType("cartesian_fold((x, y, acc) -> x + y + acc, y, z, z)", inputTypes, ExprType.DOUBLE); - - assertOutputType("filter((x) -> x == 'foo', a)", inputTypes, ExprType.STRING_ARRAY); - assertOutputType("filter((x) -> x > 1, b)", inputTypes, ExprType.LONG_ARRAY); - assertOutputType("filter((x) -> x > 1, c)", inputTypes, ExprType.DOUBLE_ARRAY); - - assertOutputType("any((x) -> x == 'foo', a)", inputTypes, ExprType.LONG); - assertOutputType("any((x) -> x > 1, b)", inputTypes, ExprType.LONG); - assertOutputType("any((x) -> x > 1.2, c)", inputTypes, ExprType.LONG); - - assertOutputType("all((x) -> x == 'foo', a)", inputTypes, ExprType.LONG); - assertOutputType("all((x) -> x > 1, b)", inputTypes, ExprType.LONG); - assertOutputType("all((x) -> x > 1.2, c)", inputTypes, ExprType.LONG); + assertOutputType("fold((x, acc) -> x + acc, y, 0)", inspector, ExprType.LONG); + assertOutputType("fold((x, acc) -> x + acc, y, y)", inspector, ExprType.LONG); + assertOutputType("fold((x, acc) -> x + acc, y, 1.0)", inspector, ExprType.DOUBLE); + assertOutputType("fold((x, acc) -> x + acc, y, z)", inspector, ExprType.DOUBLE); + + assertOutputType("cartesian_fold((x, y, acc) -> x + y + acc, y, z, 0)", inspector, ExprType.LONG); + assertOutputType("cartesian_fold((x, y, acc) -> x + y + acc, y, z, y)", inspector, ExprType.LONG); + assertOutputType("cartesian_fold((x, y, acc) -> x + y + acc, y, z, 1.0)", inspector, ExprType.DOUBLE); + assertOutputType("cartesian_fold((x, y, acc) -> x + y + acc, y, z, z)", inspector, ExprType.DOUBLE); + + assertOutputType("filter((x) -> x == 'foo', a)", inspector, ExprType.STRING_ARRAY); + assertOutputType("filter((x) -> x > 1, b)", inspector, ExprType.LONG_ARRAY); + assertOutputType("filter((x) -> x > 1, c)", inspector, ExprType.DOUBLE_ARRAY); + + assertOutputType("any((x) -> x == 'foo', a)", inspector, ExprType.LONG); + assertOutputType("any((x) -> x > 1, b)", inspector, ExprType.LONG); + assertOutputType("any((x) -> x > 1.2, c)", inspector, ExprType.LONG); + + assertOutputType("all((x) -> x == 'foo', a)", inspector, ExprType.LONG); + assertOutputType("all((x) -> x > 1, b)", inspector, ExprType.LONG); + assertOutputType("all((x) -> x > 1.2, c)", inspector, ExprType.LONG); } @@ -511,13 +511,13 @@ public void testAutoConversionArrayMismatchScalarArray() ExprTypeConversion.function(ExprType.DOUBLE, ExprType.LONG_ARRAY); } - private void assertOutputType(String expression, Expr.InputBindingInspector inputTypes, ExprType outputType) + private void assertOutputType(String expression, Expr.InputBindingInspector inspector, ExprType outputType) { final Expr expr = Parser.parse(expression, ExprMacroTable.nil(), false); - Assert.assertEquals(outputType, expr.getOutputType(inputTypes)); + Assert.assertEquals(outputType, expr.getOutputType(inspector)); } - Expr.InputBindingInspector inputTypesFromMap(Map types) + Expr.InputBindingInspector inspectorFromMap(Map types) { return types::get; } diff --git a/extensions-core/druid-bloom-filter/src/main/java/org/apache/druid/query/expressions/BloomFilterExprMacro.java b/extensions-core/druid-bloom-filter/src/main/java/org/apache/druid/query/expressions/BloomFilterExprMacro.java index cd8aa22c4925..ca28cc0fecad 100644 --- a/extensions-core/druid-bloom-filter/src/main/java/org/apache/druid/query/expressions/BloomFilterExprMacro.java +++ b/extensions-core/druid-bloom-filter/src/main/java/org/apache/druid/query/expressions/BloomFilterExprMacro.java @@ -127,7 +127,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/ContainsExpr.java b/processing/src/main/java/org/apache/druid/query/expression/ContainsExpr.java index da8d9f021b00..240f3b7b6d4c 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/ContainsExpr.java +++ b/processing/src/main/java/org/apache/druid/query/expression/ContainsExpr.java @@ -72,7 +72,7 @@ public ExprEval eval(final Expr.ObjectBinding bindings) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressMatchExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressMatchExprMacro.java index 22158a7a0e84..2b948d5e6986 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressMatchExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressMatchExprMacro.java @@ -121,7 +121,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressParseExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressParseExprMacro.java index 3f218bdd2ec4..3cade2f463c8 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressParseExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressParseExprMacro.java @@ -97,7 +97,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressStringifyExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressStringifyExprMacro.java index 10a5ff907272..8d2a661ee6ad 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressStringifyExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/IPv4AddressStringifyExprMacro.java @@ -96,7 +96,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.STRING; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/LikeExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/LikeExprMacro.java index 35ee0434b271..6d7246229e12 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/LikeExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/LikeExprMacro.java @@ -94,7 +94,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/LookupExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/LookupExprMacro.java index c771b31fe94f..9b2f96e88559 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/LookupExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/LookupExprMacro.java @@ -98,7 +98,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.STRING; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/RegexpExtractExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/RegexpExtractExprMacro.java index 7c6611f83ac1..ab76612ee345 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/RegexpExtractExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/RegexpExtractExprMacro.java @@ -101,7 +101,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.STRING; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/RegexpLikeExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/RegexpLikeExprMacro.java index 5dca175c5464..7701341046f6 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/RegexpLikeExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/RegexpLikeExprMacro.java @@ -93,7 +93,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/TimestampCeilExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TimestampCeilExprMacro.java index 0726dfe3771a..f8bb44d76f01 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TimestampCeilExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TimestampCeilExprMacro.java @@ -97,7 +97,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } @@ -165,7 +165,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/TimestampExtractExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TimestampExtractExprMacro.java index c5b1056dd890..be2856e17e5d 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TimestampExtractExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TimestampExtractExprMacro.java @@ -166,7 +166,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { switch (unit) { case CENTURY: diff --git a/processing/src/main/java/org/apache/druid/query/expression/TimestampFloorExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TimestampFloorExprMacro.java index 73bd95069d2e..fefeba551893 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TimestampFloorExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TimestampFloorExprMacro.java @@ -118,24 +118,24 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } @Override - public boolean canVectorize(InputBindingInspector inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return args.get(0).canVectorize(inputTypes); + return args.get(0).canVectorize(inspector); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { ExprVectorProcessor processor; processor = new LongOutLongInFunctionVectorProcessor( - CastToTypeVectorProcessor.cast(args.get(0).buildVectorized(inputTypes), ExprType.LONG), - inputTypes.getMaxVectorSize() + CastToTypeVectorProcessor.cast(args.get(0).buildVectorized(inspector), ExprType.LONG), + inspector.getMaxVectorSize() ) { @Override @@ -195,7 +195,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/TimestampFormatExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TimestampFormatExprMacro.java index 378e4f27ea5e..58dad99f20c8 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TimestampFormatExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TimestampFormatExprMacro.java @@ -101,7 +101,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.STRING; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/TimestampParseExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TimestampParseExprMacro.java index 531676563e18..fff0739f5118 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TimestampParseExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TimestampParseExprMacro.java @@ -104,7 +104,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/TimestampShiftExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TimestampShiftExprMacro.java index 9efbfaabd9af..7826736027c9 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TimestampShiftExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TimestampShiftExprMacro.java @@ -106,7 +106,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } @@ -139,7 +139,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } diff --git a/processing/src/main/java/org/apache/druid/query/expression/TrimExprMacro.java b/processing/src/main/java/org/apache/druid/query/expression/TrimExprMacro.java index 9ca8d73429aa..a6e5e779fa42 100644 --- a/processing/src/main/java/org/apache/druid/query/expression/TrimExprMacro.java +++ b/processing/src/main/java/org/apache/druid/query/expression/TrimExprMacro.java @@ -172,7 +172,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.STRING; } @@ -300,7 +300,7 @@ public BindingAnalysis analyzeInputs() @Nullable @Override - public ExprType getOutputType(InputBindingInspector inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.STRING; } From 5acd0f03ddd51326edb1d0c54608e242067bd3aa Mon Sep 17 00:00:00 2001 From: Clint Wylie Date: Thu, 22 Oct 2020 21:12:55 -0700 Subject: [PATCH 3/5] changes --- .../druid/math/expr/ExprTypeConversion.java | 24 +++++++------------ .../druid/math/expr/OutputTypeTest.java | 4 ++-- .../segment/virtual/ExpressionPlanner.java | 4 ++-- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/org/apache/druid/math/expr/ExprTypeConversion.java b/core/src/main/java/org/apache/druid/math/expr/ExprTypeConversion.java index 92fc57343558..e5f6388f1735 100644 --- a/core/src/main/java/org/apache/druid/math/expr/ExprTypeConversion.java +++ b/core/src/main/java/org/apache/druid/math/expr/ExprTypeConversion.java @@ -50,18 +50,19 @@ static ExprType conditional(Expr.InputBindingInspector inspector, List arg /** * Given 2 'input' types, which might not be fully trustable, choose the most appropriate combined type for * non-vectorized, per-row type detection. In this mode, null values are {@link ExprType#STRING} typed, despite - * potentially coming from an underlying numeric column. This method is not well suited for array handling + * potentially coming from an underlying numeric column, or when an underlying column was completely missing and so + * all values are null. This method is not well suited for array handling. */ - public static ExprType autoDetect(ExprEval result, ExprEval other) + public static ExprType autoDetect(ExprEval eval, ExprEval otherEval) { - ExprType type = result.type(); - ExprType otherType = other.type(); + ExprType type = eval.type(); + ExprType otherType = otherEval.type(); if (type == ExprType.STRING && otherType == ExprType.STRING) { return ExprType.STRING; } - type = result.value() != null ? type : otherType; - otherType = other.value() != null ? otherType : type; + type = eval.value() != null ? type : otherType; + otherType = otherEval.value() != null ? otherType : type; return numeric(type, otherType); } @@ -71,7 +72,7 @@ public static ExprType autoDetect(ExprEval result, ExprEval other) * arrays must be the same type * if both types are {@link ExprType#STRING}, the output type will be preserved as string * if both types are {@link ExprType#LONG}, the output type will be preserved as long - * + * otherwise, output is {@link ExprType#DOUBLE} */ @Nullable public static ExprType operator(@Nullable ExprType type, @Nullable ExprType other) @@ -93,15 +94,6 @@ public static ExprType operator(@Nullable ExprType type, @Nullable ExprType othe return ExprType.STRING; } - // non-vectorized expressions - if (type == ExprType.STRING) { - return other; - } - - if (other == ExprType.STRING) { - return type; - } - // otherwise a decimal or integer number return numeric(type, other); } diff --git a/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java b/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java index bb1055236e39..98f29e931be6 100644 --- a/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java +++ b/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java @@ -409,8 +409,8 @@ public void testOperatorAutoConversion() Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.operator(ExprType.DOUBLE, ExprType.DOUBLE)); Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.operator(ExprType.DOUBLE, ExprType.STRING)); Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.operator(ExprType.STRING, ExprType.DOUBLE)); - Assert.assertEquals(ExprType.LONG, ExprTypeConversion.operator(ExprType.STRING, ExprType.LONG)); - Assert.assertEquals(ExprType.LONG, ExprTypeConversion.operator(ExprType.LONG, ExprType.STRING)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.operator(ExprType.STRING, ExprType.LONG)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.operator(ExprType.LONG, ExprType.STRING)); // unless it is an array, and those have to be the same Assert.assertEquals(ExprType.LONG_ARRAY, ExprTypeConversion.operator(ExprType.LONG_ARRAY, ExprType.LONG_ARRAY)); Assert.assertEquals( diff --git a/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionPlanner.java b/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionPlanner.java index 8dca3b564aa6..71fb9fac9ff8 100644 --- a/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionPlanner.java +++ b/processing/src/main/java/org/apache/druid/segment/virtual/ExpressionPlanner.java @@ -152,14 +152,14 @@ public static ExpressionPlan plan(ColumnInspector inspector, Expr expression) } // only set output type if we are pretty confident about input types - final boolean shoulComputeOutput = ExpressionPlan.none( + final boolean shouldComputeOutput = ExpressionPlan.none( traits, ExpressionPlan.Trait.UNKNOWN_INPUTS, ExpressionPlan.Trait.INCOMPLETE_INPUTS, ExpressionPlan.Trait.NEEDS_APPLIED ); - if (shoulComputeOutput) { + if (shouldComputeOutput) { outputType = expression.getOutputType(inspector); } From 06b233c99269f3f19194dbbcaad6d888ac53c91e Mon Sep 17 00:00:00 2001 From: Clint Wylie Date: Thu, 22 Oct 2020 21:21:04 -0700 Subject: [PATCH 4/5] more test --- .../druid/math/expr/OutputTypeTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java b/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java index 98f29e931be6..a4bc03115d23 100644 --- a/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java +++ b/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java @@ -389,6 +389,42 @@ public void testApplyFunctions() } + @Test + public void testEvalAutoConversion() + { + final ExprEval nullStringEval = ExprEval.of(null); + final ExprEval stringEval = ExprEval.of("wat"); + final ExprEval longEval = ExprEval.of(1L); + final ExprEval doubleEval = ExprEval.of(1.0); + final ExprEval arrayEval = ExprEval.ofLongArray(new Long[]{1L, 2L, 3L}); + + // only long stays long + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.autoDetect(longEval, longEval)); + // only string stays string + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.autoDetect(nullStringEval, nullStringEval)); + Assert.assertEquals(ExprType.STRING, ExprTypeConversion.autoDetect(stringEval, stringEval)); + // if only 1 argument is a string, preserve the other type + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.autoDetect(nullStringEval, longEval)); + Assert.assertEquals(ExprType.LONG, ExprTypeConversion.autoDetect(longEval, nullStringEval)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(doubleEval, nullStringEval)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(nullStringEval, doubleEval)); + // for operators, doubles is the catch all + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(longEval, doubleEval)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(doubleEval, longEval)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(doubleEval, doubleEval)); + // ... even when non-null strings are used with non-double types + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(longEval, stringEval)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(doubleEval, stringEval)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(stringEval, doubleEval)); + // arrays are not a good idea to use with this method + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(arrayEval, nullStringEval)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(arrayEval, doubleEval)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(arrayEval, longEval)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(nullStringEval, arrayEval)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(doubleEval, arrayEval)); + Assert.assertEquals(ExprType.DOUBLE, ExprTypeConversion.autoDetect(longEval, arrayEval)); + } + @Test public void testOperatorAutoConversion() { From 6a58eb31d7fe76f7f66844ab2f9c47b284652eb8 Mon Sep 17 00:00:00 2001 From: Clint Wylie Date: Thu, 22 Oct 2020 21:22:14 -0700 Subject: [PATCH 5/5] clean --- .../org/apache/druid/math/expr/OutputTypeTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java b/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java index a4bc03115d23..0c8ea1b71fab 100644 --- a/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java +++ b/core/src/test/java/org/apache/druid/math/expr/OutputTypeTest.java @@ -392,11 +392,11 @@ public void testApplyFunctions() @Test public void testEvalAutoConversion() { - final ExprEval nullStringEval = ExprEval.of(null); - final ExprEval stringEval = ExprEval.of("wat"); - final ExprEval longEval = ExprEval.of(1L); - final ExprEval doubleEval = ExprEval.of(1.0); - final ExprEval arrayEval = ExprEval.ofLongArray(new Long[]{1L, 2L, 3L}); + final ExprEval nullStringEval = ExprEval.of(null); + final ExprEval stringEval = ExprEval.of("wat"); + final ExprEval longEval = ExprEval.of(1L); + final ExprEval doubleEval = ExprEval.of(1.0); + final ExprEval arrayEval = ExprEval.ofLongArray(new Long[]{1L, 2L, 3L}); // only long stays long Assert.assertEquals(ExprType.LONG, ExprTypeConversion.autoDetect(longEval, longEval));