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..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 @@ -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 inspector, Expr lambda, List args) { return false; } @@ -68,10 +68,14 @@ 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 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.InputBindingTypes 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.InputBindingTypes inputTypes, LambdaExpr expr, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, LambdaExpr expr, List args) { - return ExprType.asArrayType(expr.getOutputType(new LambdaInputBindingTypes(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.InputBindingTypes 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.InputBindingTypes 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.InputBindingTypes inputTypes, LambdaExpr expr, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, LambdaExpr expr, List args) { return ExprType.LONG; } @@ -917,20 +921,20 @@ 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 inspector; private final List args; - public LambdaInputBindingTypes(Expr.InputBindingTypes 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 LambdaInputBindingTypes(Expr.InputBindingTypes inputTypes, LambdaExpr exp 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 a230cd638609..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(InputBindingTypes 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(InputBindingTypes inputTypes) } @Override - public boolean canVectorize(InputBindingTypes 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(VectorInputBindingTypes 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(InputBindingTypes 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(InputBindingTypes inputTypes) } @Override - public boolean canVectorize(InputBindingTypes 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(VectorInputBindingTypes 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(InputBindingTypes 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(InputBindingTypes 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(VectorInputBindingTypes 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(InputBindingTypes 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(InputBindingTypes inputTypes) } @Override - public boolean canVectorize(InputBindingTypes 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(VectorInputBindingTypes 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(InputBindingTypes 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(InputBindingTypes inputTypes) } @Override - public boolean canVectorize(InputBindingTypes 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(VectorInputBindingTypes 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(InputBindingTypes 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(InputBindingTypes inputTypes) } @Override - public boolean canVectorize(InputBindingTypes 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(VectorInputBindingTypes 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 39b5e1360c36..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(InputBindingTypes 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(VectorInputBindingTypes 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(InputBindingTypes 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(VectorInputBindingTypes 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(InputBindingTypes 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(VectorInputBindingTypes 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(InputBindingTypes 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(VectorInputBindingTypes 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(InputBindingTypes 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(VectorInputBindingTypes 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(InputBindingTypes 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(VectorInputBindingTypes 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 20ecc5dbfb2d..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(InputBindingTypes 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 @@ -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..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(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return outputType; } @@ -135,15 +135,15 @@ public ExprEval eval(ObjectBinding bindings) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes 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(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes 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(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes 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(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes 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(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes 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 ff646feb6816..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 @@ -132,13 +132,14 @@ 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}. + * @param inspector */ @Nullable - default ExprType getOutputType(InputBindingTypes inputTypes) + default ExprType getOutputType(InputBindingInspector inspector) { return null; } @@ -147,8 +148,9 @@ default ExprType getOutputType(InputBindingTypes 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(InputBindingTypes inputTypes) + default boolean canVectorize(InputBindingInspector inspector) { return false; } @@ -156,8 +158,9 @@ default boolean canVectorize(InputBindingTypes 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(VectorInputBindingTypes inputTypes) + default ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { throw Exprs.cannotVectorize(this); } @@ -167,8 +170,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 +186,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 +208,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 +220,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 +229,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 +253,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..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 @@ -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 inspector, List args) { ExprType type = null; for (Expr arg : args) { @@ -39,32 +39,52 @@ static ExprType conditional(Expr.InputBindingTypes inputTypes, List args) continue; } if (type == null) { - type = arg.getOutputType(inputTypes); + type = arg.getOutputType(inspector); } else { - type = doubleMathFunction(type, arg.getOutputType(inputTypes)); + type = function(type, arg.getOutputType(inspector)); } } 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, 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 eval, ExprEval otherEval) + { + ExprType type = eval.type(); + ExprType otherType = otherEval.type(); + if (type == ExprType.STRING && otherType == ExprType.STRING) { + return ExprType.STRING; + } + + type = eval.value() != null ? type : otherType; + otherType = otherEval.value() != null ? otherType : type; + return numeric(type, otherType); + } + /** * Given 2 'input' types, choose the most appropriate combined type, if possible * * 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) { - 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; @@ -87,15 +107,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 +130,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 +141,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..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,17 +115,17 @@ default boolean hasArrayOutput() * @see Expr#getOutputType */ @Nullable - ExprType getOutputType(Expr.InputBindingTypes 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, * {@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 inspector, 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 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.InputBindingTypes 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.InputBindingTypes 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.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, 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,15 +284,18 @@ protected ExprEval eval(double x, double y) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - return ExprTypeConversion.doubleMathFunction(args.get(0).getOutputType(inputTypes), args.get(1).getOutputType(inputTypes)); + return ExprTypeConversion.function( + args.get(0).getOutputType(inspector), + args.get(1).getOutputType(inspector) + ); } @Override - public boolean canVectorize(Expr.InputBindingTypes 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); } } @@ -296,7 +306,7 @@ abstract class DoubleBivariateMathFunction extends BivariateMathFunction { @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, 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 inspector, List args) { ExprType outputType = ExprType.LONG; for (Expr expr : args) { - outputType = ExprTypeConversion.doubleMathFunction(outputType, expr.getOutputType(inputTypes)); + outputType = ExprTypeConversion.function(outputType, expr.getOutputType(inspector)); } 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 inspector, List args) { return ExprType.LONG; } @@ -561,18 +571,18 @@ public ExprEval apply(List args, Expr.ObjectBinding bindings) } @Override - public boolean canVectorize(Expr.InputBindingTypes 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.VectorInputBindingTypes 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 @@ -606,21 +616,21 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.DOUBLE; } @Override - public boolean canVectorize(Expr.InputBindingTypes inputTypes, List args) + public boolean canVectorize(Expr.InputBindingInspector inspector, List args) { return true; } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return VectorProcessors.constantDouble(PI, inputTypes.getMaxVectorSize()); + return VectorProcessors.constantDouble(PI, inspector.getMaxVectorSize()); } } @@ -645,9 +655,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -666,9 +676,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -687,9 +697,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -708,9 +718,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -729,9 +739,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -750,9 +760,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -771,9 +781,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -792,9 +802,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -813,9 +823,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -841,15 +851,16 @@ protected ExprEval eval(final double x, final double y) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes 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.VectorInputBindingTypes 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)); } } @@ -868,9 +879,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -889,9 +900,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -910,9 +921,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -932,15 +943,15 @@ protected ExprEval eval(double param) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -959,9 +970,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -980,9 +991,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1001,9 +1012,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1022,9 +1033,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1043,9 +1054,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1099,9 +1110,9 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes 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) @@ -1152,9 +1163,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1173,9 +1184,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1194,9 +1205,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1215,9 +1226,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1236,9 +1247,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1257,9 +1268,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1278,9 +1289,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1299,9 +1310,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1320,9 +1331,9 @@ protected ExprEval eval(double param) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1341,9 +1352,9 @@ protected ExprEval eval(double y, double x) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1362,9 +1373,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1383,9 +1394,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1404,9 +1415,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1431,9 +1442,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1458,9 +1469,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1479,9 +1490,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1500,9 +1511,9 @@ protected ExprEval eval(double x, double y) } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1516,7 +1527,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.DOUBLE; } @@ -1524,25 +1535,29 @@ 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 inspector, List args) { - return inputTypes.areNumeric(args) && inputTypes.canVectorize(args); + return inspector.areNumeric(args) && inspector.canVectorize(args); } @Override - public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingTypes 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)); } } @@ -1608,7 +1623,7 @@ public Set getArrayInputs(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes 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()) { @@ -1618,16 +1633,16 @@ public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args } @Override - public boolean canVectorize(Expr.InputBindingTypes 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.VectorInputBindingTypes inputTypes, List args) + public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { - return CastToTypeVectorProcessor.castToType( - args.get(0).buildVectorized(inputTypes), + return CastToTypeVectorProcessor.cast( + args.get(0).buildVectorized(inspector), ExprType.valueOf(StringUtils.toUpperCase(args.get(1).getLiteralValue().toString())) ); } @@ -1698,9 +1713,9 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes 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)); } } @@ -1741,7 +1756,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { List results = new ArrayList<>(); for (int i = 1; i < args.size(); i += 2) { @@ -1749,7 +1764,7 @@ public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args } // add else results.add(args.get(args.size() - 1)); - return ExprTypeConversion.conditional(inputTypes, results); + return ExprTypeConversion.conditional(inspector, results); } } @@ -1790,7 +1805,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { List results = new ArrayList<>(); for (int i = 2; i < args.size(); i += 2) { @@ -1798,7 +1813,7 @@ public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args } // add else results.add(args.get(args.size() - 1)); - return ExprTypeConversion.conditional(inputTypes, results); + return ExprTypeConversion.conditional(inspector, results); } } @@ -1827,9 +1842,9 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - return ExprTypeConversion.conditional(inputTypes, args); + return ExprTypeConversion.conditional(inspector, args); } } @@ -1858,7 +1873,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -1889,7 +1904,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -1939,7 +1954,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -1970,7 +1985,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2011,7 +2026,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2056,7 +2071,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2106,7 +2121,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2122,7 +2137,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2154,7 +2169,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2205,7 +2220,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2239,7 +2254,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2273,7 +2288,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2289,7 +2304,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2318,7 +2333,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2363,7 +2378,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2402,7 +2417,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2452,7 +2467,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2511,7 +2526,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2624,11 +2639,11 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { ExprType type = ExprType.LONG; for (Expr arg : args) { - type = ExprTypeConversion.doubleMathFunction(type, arg.getOutputType(inputTypes)); + type = ExprTypeConversion.function(type, arg.getOutputType(inspector)); } return ExprType.asArrayType(type); } @@ -2680,7 +2695,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2710,7 +2725,7 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING_ARRAY; } @@ -2751,7 +2766,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.STRING; } @@ -2780,9 +2795,9 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes 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 @@ -2808,9 +2823,9 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes 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 @@ -2836,7 +2851,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2874,7 +2889,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -2917,9 +2932,9 @@ public boolean hasArrayOutput() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes 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); } @@ -2981,9 +2996,9 @@ public boolean hasArrayOutput() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes 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); } @@ -3044,7 +3059,7 @@ public boolean hasArrayOutput() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -3068,7 +3083,7 @@ public String name() @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { return ExprType.LONG; } @@ -3104,9 +3119,9 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes inputTypes, List args) + public ExprType getOutputType(Expr.InputBindingInspector inspector, List args) { - return args.get(0).getOutputType(inputTypes); + return args.get(0).getOutputType(inspector); } @Override @@ -3190,9 +3205,9 @@ public void validateArguments(List args) @Nullable @Override - public ExprType getOutputType(Expr.InputBindingTypes 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 df4de19fa03b..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(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return expr.canVectorize(inputTypes); + return expr.canVectorize(inspector); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes 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(InputBindingTypes 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(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return function.canVectorize(inputTypes, args); + return function.canVectorize(inspector, args); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes 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(InputBindingTypes 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(InputBindingTypes 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(VectorInputBindingTypes 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(InputBindingTypes 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 da009326bb07..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(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { - return inputTypes.getType(binding); + return inspector.getType(binding); } @Override @@ -138,18 +138,26 @@ public Expr visit(Shuttle shuttle) } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.getType(binding) != null; + return true; } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { - ExprType inputType = inputTypes.getType(binding); + ExprType inputType = inspector.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..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(InputBindingTypes 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(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return inputTypes.areNumeric(expr) && expr.canVectorize(inputTypes); + return inspector.areNumeric(expr) && expr.canVectorize(inspector); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes 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(InputBindingTypes 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/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..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.VectorInputBindingTypes 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.VectorInputBindingTypes 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.VectorInputBindingTypes 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.VectorInputBindingTypes 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.VectorInputBindingTypes 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.VectorInputBindingTypes 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 bd33e8d2f25d..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,18 +35,18 @@ public class VectorMathProcessors * double -> double */ public static ExprVectorProcessor makeMathProcessor( - Expr.VectorInputBindingTypes 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 (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,18 +61,18 @@ public static ExprVectorProcessor makeMathProcessor( * double -> double */ public static ExprVectorProcessor makeDoubleMathProcessor( - Expr.VectorInputBindingTypes 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 (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,18 +87,18 @@ public static ExprVectorProcessor makeDoubleMathProcessor( * double -> long */ public static ExprVectorProcessor makeLongMathProcessor( - Expr.VectorInputBindingTypes 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 (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 inspector, Expr left, Expr right, Supplier longOutLongsInProcessor, @@ -124,21 +124,27 @@ 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 (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 inspector, Expr left, Expr right, Supplier doubleOutLongsInProcessor, @@ -163,19 +169,25 @@ 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 (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 inspector, Expr left, Expr right, Supplier longOutLongsInProcessor, @@ -202,19 +214,25 @@ 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 (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,16 +242,16 @@ public static ExprVectorProcessor makeLongMathProcessor( return (ExprVectorProcessor) processor; } - public static ExprVectorProcessor plus(Expr.VectorInputBindingTypes 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 @@ -243,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 @@ -255,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 @@ -267,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 @@ -281,16 +299,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor minus(Expr.VectorInputBindingTypes 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 @@ -300,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 @@ -312,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 @@ -324,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 @@ -338,16 +356,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor multiply(Expr.VectorInputBindingTypes 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 @@ -357,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 @@ -369,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 @@ -381,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 @@ -395,16 +413,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor divide(Expr.VectorInputBindingTypes 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 @@ -414,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 @@ -426,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 @@ -438,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 @@ -452,16 +470,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor longDivide(Expr.VectorInputBindingTypes 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 @@ -471,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 @@ -483,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 @@ -495,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 @@ -509,16 +527,16 @@ public long apply(double left, double right) ); } - public static ExprVectorProcessor modulo(Expr.VectorInputBindingTypes 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 @@ -528,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 @@ -540,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 @@ -552,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 @@ -566,14 +584,14 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor negate(Expr.VectorInputBindingTypes 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 @@ -583,8 +601,8 @@ public long apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -596,16 +614,16 @@ public double apply(double input) ); } - public static ExprVectorProcessor power(Expr.VectorInputBindingTypes 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 @@ -615,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 @@ -627,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 @@ -639,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 @@ -653,42 +671,47 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor doublePower(Expr.VectorInputBindingTypes inputTypes, Expr left, Expr right) + public static ExprVectorProcessor doublePower( + Expr.VectorInputBindingInspector inspector, + 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(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(inspector), + right.buildVectorized(inspector), + inspector.getMaxVectorSize() + ) + { + @Override + public double apply(long left, long right) + { + return Math.pow(left, right); + } + }; } if (processor != null) { return (ExprVectorProcessor) processor; } - return power(inputTypes, left, right); + return power(inspector, left, right); } - public static ExprVectorProcessor max(Expr.VectorInputBindingTypes 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 @@ -698,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 @@ -710,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 @@ -722,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 @@ -736,16 +759,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor min(Expr.VectorInputBindingTypes 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 @@ -755,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 @@ -767,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 @@ -779,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 @@ -793,16 +816,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor atan2(Expr.VectorInputBindingTypes 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 @@ -812,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 @@ -824,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 @@ -836,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 @@ -850,16 +873,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor copySign(Expr.VectorInputBindingTypes 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 @@ -869,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 @@ -881,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 @@ -893,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 @@ -907,16 +930,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor hypot(Expr.VectorInputBindingTypes 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 @@ -926,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 @@ -938,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 @@ -950,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 @@ -964,16 +987,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor remainder(Expr.VectorInputBindingTypes 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 @@ -983,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 @@ -995,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 @@ -1007,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 @@ -1021,16 +1044,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor nextAfter(Expr.VectorInputBindingTypes 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 @@ -1040,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 @@ -1052,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 @@ -1064,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 @@ -1078,16 +1101,16 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor scalb(Expr.VectorInputBindingTypes 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 @@ -1097,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 @@ -1109,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 @@ -1121,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 @@ -1135,14 +1158,14 @@ public double apply(double left, double right) ); } - public static ExprVectorProcessor acos(Expr.VectorInputBindingTypes 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 @@ -1152,8 +1175,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1165,14 +1188,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor asin(Expr.VectorInputBindingTypes 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 @@ -1182,8 +1205,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1195,14 +1218,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor atan(Expr.VectorInputBindingTypes 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 @@ -1212,8 +1235,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1225,14 +1248,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor cos(Expr.VectorInputBindingTypes 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 @@ -1242,8 +1265,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1255,14 +1278,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor cosh(Expr.VectorInputBindingTypes 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 @@ -1272,8 +1295,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1285,14 +1308,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor cot(Expr.VectorInputBindingTypes 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 @@ -1302,8 +1325,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1315,14 +1338,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor sin(Expr.VectorInputBindingTypes 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 @@ -1332,8 +1355,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1345,14 +1368,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor sinh(Expr.VectorInputBindingTypes 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 @@ -1362,8 +1385,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1375,14 +1398,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor tan(Expr.VectorInputBindingTypes 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 @@ -1392,8 +1415,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1405,14 +1428,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor tanh(Expr.VectorInputBindingTypes 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 @@ -1422,8 +1445,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1435,14 +1458,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor abs(Expr.VectorInputBindingTypes 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 @@ -1452,8 +1475,8 @@ public long apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1465,14 +1488,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor cbrt(Expr.VectorInputBindingTypes 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 @@ -1482,8 +1505,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1495,14 +1518,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor ceil(Expr.VectorInputBindingTypes 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 @@ -1512,8 +1535,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1525,14 +1548,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor floor(Expr.VectorInputBindingTypes 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 @@ -1542,8 +1565,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1555,14 +1578,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor exp(Expr.VectorInputBindingTypes 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 @@ -1572,8 +1595,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1585,14 +1608,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor expm1(Expr.VectorInputBindingTypes 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 @@ -1602,8 +1625,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1615,14 +1638,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor getExponent(Expr.VectorInputBindingTypes 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 @@ -1632,8 +1655,8 @@ public long apply(long input) } }, () -> new LongOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1645,14 +1668,14 @@ public long apply(double input) ); } - public static ExprVectorProcessor log(Expr.VectorInputBindingTypes 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 @@ -1662,8 +1685,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1675,14 +1698,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor log10(Expr.VectorInputBindingTypes 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 @@ -1692,8 +1715,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1705,14 +1728,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor log1p(Expr.VectorInputBindingTypes 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 @@ -1722,8 +1745,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1735,14 +1758,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor nextUp(Expr.VectorInputBindingTypes 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 @@ -1752,8 +1775,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1765,14 +1788,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor rint(Expr.VectorInputBindingTypes 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 @@ -1782,8 +1805,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1795,14 +1818,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor signum(Expr.VectorInputBindingTypes 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 @@ -1812,8 +1835,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1825,14 +1848,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor sqrt(Expr.VectorInputBindingTypes 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 @@ -1842,8 +1865,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1855,14 +1878,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor toDegrees(Expr.VectorInputBindingTypes 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 @@ -1872,8 +1895,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1885,14 +1908,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor toRadians(Expr.VectorInputBindingTypes 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 @@ -1902,8 +1925,8 @@ public double apply(long input) } }, () -> new DoubleOutDoubleInFunctionVectorProcessor( - arg.buildVectorized(inputTypes), - inputTypes.getMaxVectorSize() + arg.buildVectorized(inspector), + inspector.getMaxVectorSize() ) { @Override @@ -1915,14 +1938,14 @@ public double apply(double input) ); } - public static ExprVectorProcessor ulp(Expr.VectorInputBindingTypes 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 @@ -1932,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 9ae7ab7c8898..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.VectorInputBindingTypes inputTypes, Expr arg, int radix) + public static ExprVectorProcessor parseLong(Expr.VectorInputBindingInspector inspector, Expr arg, int radix) { final ExprVectorProcessor processor = new LongOutStringInFunctionVectorProcessor( - CastToTypeVectorProcessor.castToType(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 441a42162852..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 @@ -31,7 +31,7 @@ public class OutputTypeTest extends InitializedNullHandlingTest { - private final Expr.InputBindingTypes inputTypes = inputTypesFromMap( + private final Expr.InputBindingInspector inspector = inspectorFromMap( ImmutableMap.builder().put("x", ExprType.STRING) .put("x_", ExprType.STRING) .put("y", ExprType.LONG) @@ -53,352 +53,388 @@ 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); } + @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() { - // 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 @@ -426,47 +462,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 +530,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 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.InputBindingTypes inputTypesFromMap(Map types) + Expr.InputBindingInspector inspectorFromMap(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..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(InputBindingTypes 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 f36311229e79..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(InputBindingTypes 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 1aff62d199f6..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(InputBindingTypes 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 a75fa323fdb3..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(InputBindingTypes 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 17431a0e5923..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(InputBindingTypes 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 d5bbf02dad02..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(InputBindingTypes 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 6ff028778a40..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(InputBindingTypes 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 3964c1793d7e..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(InputBindingTypes 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 9279c84774dd..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(InputBindingTypes 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 6779bf6ddf74..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(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } @@ -165,7 +165,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes 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 278076901872..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(InputBindingTypes 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 7b1fc96779d8..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(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } @Override - public boolean canVectorize(InputBindingTypes inputTypes) + public boolean canVectorize(InputBindingInspector inspector) { - return args.get(0).canVectorize(inputTypes); + return args.get(0).canVectorize(inspector); } @Override - public ExprVectorProcessor buildVectorized(VectorInputBindingTypes inputTypes) + public ExprVectorProcessor buildVectorized(VectorInputBindingInspector inspector) { ExprVectorProcessor processor; processor = new LongOutLongInFunctionVectorProcessor( - CastToTypeVectorProcessor.castToType(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(InputBindingTypes 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 455d445fe980..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(InputBindingTypes 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 935a2b7cbae7..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(InputBindingTypes 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 259d054e411a..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(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.LONG; } @@ -139,7 +139,7 @@ public Expr visit(Shuttle shuttle) @Nullable @Override - public ExprType getOutputType(InputBindingTypes 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 48a007c7556f..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(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { return ExprType.STRING; } @@ -300,7 +300,7 @@ public BindingAnalysis analyzeInputs() @Nullable @Override - public ExprType getOutputType(InputBindingTypes inputTypes) + public ExprType getOutputType(InputBindingInspector inspector) { 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..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 @@ -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 shouldComputeOutput = ExpressionPlan.none( + traits, + ExpressionPlan.Trait.UNKNOWN_INPUTS, + ExpressionPlan.Trait.INCOMPLETE_INPUTS, + ExpressionPlan.Trait.NEEDS_APPLIED + ); + + if (shouldComputeOutput) { 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",