From eda8e4ff74bd86797f9ed5897a214984fbebabab Mon Sep 17 00:00:00 2001 From: Zoltan Haindrich Date: Thu, 14 Sep 2023 09:25:16 +0000 Subject: [PATCH 01/10] provide function name when unknown exceptions are encountered --- .../org/apache/druid/math/expr/Function.java | 183 ++++++++++-------- 1 file changed, 97 insertions(+), 86 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/math/expr/Function.java b/processing/src/main/java/org/apache/druid/math/expr/Function.java index 632425d1c751..84fc1a01dd35 100644 --- a/processing/src/main/java/org/apache/druid/math/expr/Function.java +++ b/processing/src/main/java/org/apache/druid/math/expr/Function.java @@ -21,10 +21,12 @@ import com.google.common.collect.ImmutableSet; import org.apache.druid.common.config.NullHandling; +import org.apache.druid.error.DruidException; import org.apache.druid.java.util.common.DateTimes; import org.apache.druid.java.util.common.HumanReadableBytes; import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.java.util.common.UOE; +import org.apache.druid.math.expr.Expr.ObjectBinding; import org.apache.druid.math.expr.vector.CastToTypeVectorProcessor; import org.apache.druid.math.expr.vector.ExprVectorProcessor; import org.apache.druid.math.expr.vector.VectorMathProcessors; @@ -59,17 +61,27 @@ * Do NOT remove "unused" members in this class. They are used by generated Antlr */ @SuppressWarnings("unused") -public interface Function extends NamedFunction +public abstract class Function implements NamedFunction { /** * Evaluate the function, given a list of arguments and a set of bindings to provide values for {@link IdentifierExpr}. */ - ExprEval apply(List args, Expr.ObjectBinding bindings); + final ExprEval apply(List args, Expr.ObjectBinding bindings) { + try { + return realApply(args,bindings); + } catch (DruidException de) { + throw de; + } catch (Exception e) { + throw DruidException.defensive().build(e, "Invocation of %s encountered exception.", getClass().getName()); + } + } + + protected abstract ExprEval realApply(List args, ObjectBinding bindings); /** * Given a list of arguments to this {@link Function}, get the set of arguments that must evaluate to a scalar value */ - default Set getScalarInputs(List args) + Set getScalarInputs(List args) { return ImmutableSet.copyOf(args); } @@ -78,7 +90,7 @@ default Set getScalarInputs(List args) * Given a list of arguments to this {@link Function}, get the set of arguments that must evaluate to an array * value */ - default Set getArrayInputs(List args) + Set getArrayInputs(List args) { return Collections.emptySet(); } @@ -86,7 +98,7 @@ default Set getArrayInputs(List args) /** * Returns true if a function expects any array arguments */ - default boolean hasArrayInputs() + boolean hasArrayInputs() { return false; } @@ -95,7 +107,7 @@ default boolean hasArrayInputs() * Returns true if function produces an array. All {@link Function} implementations are expected to * exclusively produce either scalar or array values. */ - default boolean hasArrayOutput() + boolean hasArrayOutput() { return false; } @@ -105,7 +117,7 @@ default boolean hasArrayOutput() * everything that is feasible up front. Note that input type information is typically unavailable at the time * {@link Expr} are parsed, and so this method is incapable of performing complete validation. */ - void validateArguments(List args); + abstract void validateArguments(List args); /** @@ -114,7 +126,7 @@ default boolean hasArrayOutput() * @see Expr#getOutputType */ @Nullable - ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args); +abstract ExpressionType 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, @@ -124,7 +136,7 @@ default boolean hasArrayOutput() * @see Expr#canVectorize(Expr.InputBindingInspector) * @see ApplyFunction#canVectorize(Expr.InputBindingInspector, Expr, List) */ - default boolean canVectorize(Expr.InputBindingInspector inspector, List args) + boolean canVectorize(Expr.InputBindingInspector inspector, List args) { return false; } @@ -136,7 +148,7 @@ default boolean canVectorize(Expr.InputBindingInspector inspector, List ar * @see Expr#asVectorProcessor(Expr.VectorInputBindingInspector) * @see ApplyFunction#asVectorProcessor(Expr.VectorInputBindingInspector, Expr, List) */ - default ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) + ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { throw new UOE("Function[%s] is not vectorized", name()); } @@ -144,7 +156,7 @@ default ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInsp /** * Base class for a single variable input {@link Function} implementation */ - abstract class UnivariateFunction implements Function + static abstract class UnivariateFunction extends Function { @Override public void validateArguments(List args) @@ -153,7 +165,7 @@ public void validateArguments(List args) } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public final ExprEval realApply(List args, Expr.ObjectBinding bindings) { Expr expr = args.get(0); return eval(expr.eval(bindings)); @@ -165,7 +177,7 @@ public ExprEval apply(List args, Expr.ObjectBinding bindings) /** * Base class for a 2 variable input {@link Function} implementation */ - abstract class BivariateFunction implements Function + static abstract class BivariateFunction extends Function { @Override public void validateArguments(List args) @@ -174,7 +186,7 @@ public void validateArguments(List args) } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { Expr expr1 = args.get(0); Expr expr2 = args.get(1); @@ -188,7 +200,7 @@ public ExprEval apply(List args, Expr.ObjectBinding bindings) * Base class for a single variable input mathematical {@link Function}, with specialized 'eval' implementations that * that operate on primitive number types */ - abstract class UnivariateMathFunction extends UnivariateFunction + static abstract class UnivariateMathFunction extends UnivariateFunction { @Override protected final ExprEval eval(ExprEval param) @@ -237,7 +249,7 @@ public boolean canVectorize(Expr.InputBindingInspector inspector, List arg /** * Many math functions always output a {@link Double} primitive, regardless of input type. */ - abstract class DoubleUnivariateMathFunction extends UnivariateMathFunction + static abstract class DoubleUnivariateMathFunction extends UnivariateMathFunction { @Nullable @Override @@ -251,7 +263,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args) @@ -395,7 +407,7 @@ public boolean hasArrayInputs() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final ExprEval arrayExpr = getArrayArgument(args).eval(bindings); final ExprEval scalarExpr = getScalarArgument(args).eval(bindings); @@ -421,7 +433,7 @@ Expr getArrayArgument(List args) /** * {@link Function} that takes 2 array operands */ - abstract class ArraysFunction implements Function + abstract class ArraysFunction extends Function { @Override public void validateArguments(List args) @@ -448,7 +460,7 @@ public boolean hasArrayInputs() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final ExprEval arrayExpr1 = args.get(0).eval(bindings); final ExprEval arrayExpr2 = args.get(1).eval(bindings); @@ -459,7 +471,6 @@ public ExprEval apply(List args, Expr.ObjectBinding bindings) if (arrayExpr2.asArray() == null) { return arrayExpr2; } - return doApply(arrayExpr1, arrayExpr2); } @@ -554,7 +565,7 @@ ExprEval doApply(ExprEval lhsExpr, ExprEval rhsExpr) abstract Object[] merge(TypeSignature elementType, T[] array1, T[] array2); } - abstract class ReduceFunction implements Function + static abstract class ReduceFunction extends Function { private final DoubleBinaryOperator doubleReducer; private final LongBinaryOperator longReducer; @@ -589,7 +600,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { if (args.isEmpty()) { return ExprEval.of(null); @@ -650,7 +661,7 @@ private boolean isValidType(ExpressionType exprType) // ------------------------------ implementations ------------------------------ - class ParseLong implements Function + class ParseLong extends Function { @Override public String name() @@ -672,7 +683,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final int radix = args.size() == 1 ? 10 : args.get(1).eval(bindings).asInt(); @@ -717,7 +728,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Pi implements Function + class Pi extends Function { private static final double PI = Math.PI; @@ -728,7 +739,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { return ExprEval.of(PI); } @@ -1151,7 +1162,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class SafeDivide extends BivariateMathFunction + public static class SafeDivide extends BivariateMathFunction { public static final String NAME = "safe_divide"; @@ -1366,7 +1377,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Log1p extends DoubleUnivariateMathFunction + static class Log1p extends DoubleUnivariateMathFunction { @Override public String name() @@ -1387,7 +1398,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class NextUp extends DoubleUnivariateMathFunction + static class NextUp extends DoubleUnivariateMathFunction { @Override public String name() @@ -1408,7 +1419,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Rint extends DoubleUnivariateMathFunction + static class Rint extends DoubleUnivariateMathFunction { @Override public String name() @@ -1429,7 +1440,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Round implements Function + static class Round extends Function { //CHECKSTYLE.OFF: Regexp private static final BigDecimal MAX_FINITE_VALUE = BigDecimal.valueOf(Double.MAX_VALUE); @@ -1443,7 +1454,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { ExprEval value1 = args.get(0).eval(bindings); @@ -2020,7 +2031,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class GreatestFunc extends ReduceFunction + public static class GreatestFunc extends ReduceFunction { public static final String NAME = "greatest"; @@ -2040,7 +2051,7 @@ public String name() } } - class LeastFunc extends ReduceFunction + public static class LeastFunc extends ReduceFunction { public static final String NAME = "least"; @@ -2060,7 +2071,7 @@ public String name() } } - class ConditionFunc implements Function + class ConditionFunc extends Function { @Override public String name() @@ -2069,7 +2080,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { ExprEval x = args.get(0).eval(bindings); return x.asBoolean() ? args.get(1).eval(bindings) : args.get(2).eval(bindings); @@ -2092,7 +2103,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, final Expr.ObjectBinding bindings) + public ExprEval realApply(final List args, final Expr.ObjectBinding bindings) { for (int i = 0; i < args.size(); i += 2) { if (i == args.size() - 1) { @@ -2139,7 +2150,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, final Expr.ObjectBinding bindings) + public ExprEval realApply(final List args, final Expr.ObjectBinding bindings) { for (int i = 1; i < args.size(); i += 2) { if (i == args.size() - 1) { @@ -2183,7 +2194,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final ExprEval eval = args.get(0).eval(bindings); return eval.value() == null ? args.get(1).eval(bindings) : eval; @@ -2224,7 +2235,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class IsNullFunc implements Function + class IsNullFunc extends Function { @Override public String name() @@ -2233,7 +2244,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final ExprEval expr = args.get(0).eval(bindings); return ExprEval.ofLongBoolean(expr.value() == null); @@ -2265,7 +2276,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class IsNotNullFunc implements Function + class IsNotNullFunc extends Function { @Override public String name() @@ -2274,7 +2285,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final ExprEval expr = args.get(0).eval(bindings); return ExprEval.ofLongBoolean(expr.value() != null); @@ -2307,7 +2318,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class ConcatFunc implements Function + class ConcatFunc extends Function { @Override public String name() @@ -2316,7 +2327,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { if (args.size() == 0) { return ExprEval.of(null); @@ -2372,7 +2383,7 @@ public ExprVectorProcessor asVectorProcessor( } } - class StrlenFunc implements Function + class StrlenFunc extends Function { @Override public String name() @@ -2381,7 +2392,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final String arg = args.get(0).eval(bindings).asString(); return arg == null ? ExprEval.ofLong(null) : ExprEval.of(arg.length()); @@ -2401,7 +2412,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final String formatString = NullHandling.nullToEmptyIfNeeded(args.get(0).eval(bindings).asString()); @@ -2440,7 +2451,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final String haystack = NullHandling.nullToEmptyIfNeeded(args.get(0).eval(bindings).asString()); final String needle = NullHandling.nullToEmptyIfNeeded(args.get(1).eval(bindings).asString()); @@ -2483,7 +2494,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final String arg = args.get(0).eval(bindings).asString(); @@ -2588,7 +2599,7 @@ protected ExprEval eval(@Nullable String x, int y) } } - class ReplaceFunc implements Function + class ReplaceFunc extends Function { @Override public String name() @@ -2597,7 +2608,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final String arg = args.get(0).eval(bindings).asString(); final String pattern = NullHandling.nullToEmptyIfNeeded(args.get(1).eval(bindings).asString()); @@ -2622,7 +2633,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final String arg = args.get(0).eval(bindings).asString(); if (arg == null) { @@ -2654,7 +2665,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final String arg = args.get(0).eval(bindings).asString(); if (arg == null) { @@ -2737,7 +2748,7 @@ protected ExprEval eval(String x, int y) } } - class LpadFunc implements Function + class LpadFunc extends Function { @Override public String name() @@ -2746,7 +2757,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { String base = args.get(0).eval(bindings).asString(); int len = args.get(1).eval(bindings).asInt(); @@ -2774,7 +2785,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { String base = args.get(0).eval(bindings).asString(); int len = args.get(1).eval(bindings).asInt(); @@ -2811,7 +2822,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { ExprEval value = args.get(0).eval(bindings); if (!value.type().is(ExprType.STRING)) { @@ -2885,7 +2896,7 @@ protected final ExprEval toValue(DateTime date) } } - class SubMonthFunc implements Function + class SubMonthFunc extends Function { @Override public String name() @@ -2894,7 +2905,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { Long left = args.get(0).eval(bindings).asLong(); Long right = args.get(1).eval(bindings).asLong(); @@ -2922,7 +2933,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { return args.get(0).eval(bindings).castTo(ExpressionType.STRING_ARRAY); } @@ -2982,7 +2993,7 @@ public Set getArrayInputs(List args) } } - class ArrayToMultiValueStringFunction implements Function + class ArrayToMultiValueStringFunction extends Function { @Override public String name() @@ -2991,7 +3002,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { return args.get(0).eval(bindings).castTo(ExpressionType.STRING_ARRAY); } @@ -3042,7 +3053,7 @@ public Set getArrayInputs(List args) } } - class ArrayConstructorFunction implements Function + static class ArrayConstructorFunction extends Function { @Override public String name() @@ -3051,7 +3062,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { // this is copied from 'BaseMapFunction.applyMap', need to find a better way to consolidate, or construct arrays, // or.. something... @@ -3126,7 +3137,7 @@ static ExpressionType setArrayOutput(@Nullable ExpressionType arrayType, Object[ } } - class ArrayLengthFunction implements Function + class ArrayLengthFunction extends Function { @Override public String name() @@ -3135,7 +3146,7 @@ public String name() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final ExprEval expr = args.get(0).eval(bindings); final Object[] array = expr.asArray(); @@ -3179,7 +3190,7 @@ public Set getScalarInputs(List args) } } - class StringToArrayFunction implements Function + class StringToArrayFunction extends Function { @Override public String name() @@ -3201,7 +3212,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final ExprEval expr = args.get(0).eval(bindings); final String arrayString = expr.asString(); @@ -3562,7 +3573,7 @@ ExprEval doApply(ExprEval lhsExpr, ExprEval rhsExpr) } } - class ArraySliceFunction implements Function + class ArraySliceFunction extends Function { @Override public String name() @@ -3613,7 +3624,7 @@ public boolean hasArrayOutput() } @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final ExprEval expr = args.get(0).eval(bindings); final Object[] array = expr.asArray(); @@ -3636,12 +3647,12 @@ public ExprEval apply(List args, Expr.ObjectBinding bindings) } } - abstract class SizeFormatFunc implements Function + abstract class SizeFormatFunc extends Function { protected abstract HumanReadableBytes.UnitSystem getUnitSystem(); @Override - public ExprEval apply(List args, Expr.ObjectBinding bindings) + public ExprEval realApply(List args, Expr.ObjectBinding bindings) { final ExprEval valueParam = args.get(0).eval(bindings); if (NullHandling.sqlCompatible() && valueParam.isNumericNull()) { From 9f590550182ef9da42d707a74c69f8a2f08bf729 Mon Sep 17 00:00:00 2001 From: Zoltan Haindrich Date: Thu, 14 Sep 2023 09:37:17 +0000 Subject: [PATCH 02/10] fix keywords/etc --- .../org/apache/druid/math/expr/Function.java | 201 +++++++++--------- 1 file changed, 101 insertions(+), 100 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/math/expr/Function.java b/processing/src/main/java/org/apache/druid/math/expr/Function.java index 84fc1a01dd35..f54c5405287b 100644 --- a/processing/src/main/java/org/apache/druid/math/expr/Function.java +++ b/processing/src/main/java/org/apache/druid/math/expr/Function.java @@ -38,6 +38,7 @@ import org.joda.time.format.DateTimeFormat; import javax.annotation.Nullable; + import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; @@ -69,7 +70,7 @@ public abstract class Function implements NamedFunction final ExprEval apply(List args, Expr.ObjectBinding bindings) { try { return realApply(args,bindings); - } catch (DruidException de) { + } catch (DruidException|ExpressionValidationException de) { throw de; } catch (Exception e) { throw DruidException.defensive().build(e, "Invocation of %s encountered exception.", getClass().getName()); @@ -315,7 +316,7 @@ public boolean canVectorize(Expr.InputBindingInspector inspector, List arg /** * Many math functions always output a {@link Double} primitive, regardless of input type. */ - abstract class DoubleBivariateMathFunction extends BivariateMathFunction + public static abstract class DoubleBivariateMathFunction extends BivariateMathFunction { @Nullable @Override @@ -325,7 +326,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List arg * Base class for a 2 variable input {@link Function} whose first argument is a {@link ExprType#STRING} and second * argument is {@link ExprType#LONG} */ - abstract class StringLongFunction extends BivariateFunction + public static abstract class StringLongFunction extends BivariateFunction { @Override protected final ExprEval eval(ExprEval x, ExprEval y) @@ -380,7 +381,7 @@ protected final ExprEval eval(ExprEval x, ExprEval y) /** * {@link Function} that takes 1 array operand and 1 scalar operand */ - abstract class ArrayScalarFunction extends Function + public static abstract class ArrayScalarFunction extends Function { @Override public void validateArguments(List args) @@ -433,7 +434,7 @@ Expr getArrayArgument(List args) /** * {@link Function} that takes 2 array operands */ - abstract class ArraysFunction extends Function + static abstract class ArraysFunction extends Function { @Override public void validateArguments(List args) @@ -481,7 +482,7 @@ public ExprEval realApply(List args, Expr.ObjectBinding bindings) * Scaffolding for a 2 argument {@link Function} which accepts one array and one scalar input and adds the scalar * input to the array in some way. */ - abstract class ArrayAddElementFunction extends ArrayScalarFunction + public static abstract class ArrayAddElementFunction extends ArrayScalarFunction { @Override public boolean hasArrayOutput() @@ -516,7 +517,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) /** * Base scaffolding for functions which accept 2 array arguments and combine them in some way */ - abstract class ArraysMergeFunction extends ArraysFunction + public static abstract class ArraysMergeFunction extends ArraysFunction { @Override public Set getArrayInputs(List args) @@ -565,7 +566,7 @@ ExprEval doApply(ExprEval lhsExpr, ExprEval rhsExpr) abstract Object[] merge(TypeSignature elementType, T[] array1, T[] array2); } - static abstract class ReduceFunction extends Function + public static abstract class ReduceFunction extends Function { private final DoubleBinaryOperator doubleReducer; private final LongBinaryOperator longReducer; @@ -661,7 +662,7 @@ private boolean isValidType(ExpressionType exprType) // ------------------------------ implementations ------------------------------ - class ParseLong extends Function + public static class ParseLong extends Function { @Override public String name() @@ -728,7 +729,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Pi extends Function + public static class Pi extends Function { private static final double PI = Math.PI; @@ -770,7 +771,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Abs extends UnivariateMathFunction + public static class Abs extends UnivariateMathFunction { @Override public String name() @@ -797,7 +798,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Acos extends DoubleUnivariateMathFunction + public static class Acos extends DoubleUnivariateMathFunction { @Override public String name() @@ -818,7 +819,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Asin extends DoubleUnivariateMathFunction + public static class Asin extends DoubleUnivariateMathFunction { @Override public String name() @@ -839,7 +840,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Atan extends DoubleUnivariateMathFunction + public static class Atan extends DoubleUnivariateMathFunction { @Override public String name() @@ -860,7 +861,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class BitwiseComplement extends UnivariateMathFunction + public static class BitwiseComplement extends UnivariateMathFunction { @Override public String name() @@ -888,7 +889,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class BitwiseConvertLongBitsToDouble extends UnivariateMathFunction + public static class BitwiseConvertLongBitsToDouble extends UnivariateMathFunction { @Override public String name() @@ -920,7 +921,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class BitwiseConvertDoubleToLongBits extends UnivariateMathFunction + public static class BitwiseConvertDoubleToLongBits extends UnivariateMathFunction { @Override public String name() @@ -952,7 +953,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class BitwiseAnd extends BivariateBitwiseMathFunction + public static class BitwiseAnd extends BivariateBitwiseMathFunction { @Override public String name() @@ -973,7 +974,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class BitwiseOr extends BivariateBitwiseMathFunction + public static class BitwiseOr extends BivariateBitwiseMathFunction { @Override public String name() @@ -994,7 +995,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class BitwiseShiftLeft extends BivariateBitwiseMathFunction + public static class BitwiseShiftLeft extends BivariateBitwiseMathFunction { @Override public String name() @@ -1015,7 +1016,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class BitwiseShiftRight extends BivariateBitwiseMathFunction + public static class BitwiseShiftRight extends BivariateBitwiseMathFunction { @Override public String name() @@ -1036,7 +1037,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class BitwiseXor extends BivariateBitwiseMathFunction + public static class BitwiseXor extends BivariateBitwiseMathFunction { @Override public String name() @@ -1057,7 +1058,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Cbrt extends DoubleUnivariateMathFunction + public static class Cbrt extends DoubleUnivariateMathFunction { @Override public String name() @@ -1078,7 +1079,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Ceil extends DoubleUnivariateMathFunction + public static class Ceil extends DoubleUnivariateMathFunction { @Override public String name() @@ -1099,7 +1100,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Cos extends DoubleUnivariateMathFunction + public static class Cos extends DoubleUnivariateMathFunction { @Override public String name() @@ -1120,7 +1121,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Cosh extends DoubleUnivariateMathFunction + public static class Cosh extends DoubleUnivariateMathFunction { @Override public String name() @@ -1141,7 +1142,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Cot extends DoubleUnivariateMathFunction + public static class Cot extends DoubleUnivariateMathFunction { @Override public String name() @@ -1207,7 +1208,7 @@ protected ExprEval eval(final double x, final double y) } } - class Div extends BivariateMathFunction + public static class Div extends BivariateMathFunction { @Override public String name() @@ -1244,7 +1245,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Exp extends DoubleUnivariateMathFunction + public static class Exp extends DoubleUnivariateMathFunction { @Override public String name() @@ -1265,7 +1266,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Expm1 extends DoubleUnivariateMathFunction + public static class Expm1 extends DoubleUnivariateMathFunction { @Override public String name() @@ -1286,7 +1287,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Floor extends DoubleUnivariateMathFunction + public static class Floor extends DoubleUnivariateMathFunction { @Override public String name() @@ -1307,7 +1308,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class GetExponent extends UnivariateMathFunction + public static class GetExponent extends UnivariateMathFunction { @Override public String name() @@ -1335,7 +1336,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Log extends DoubleUnivariateMathFunction + public static class Log extends DoubleUnivariateMathFunction { @Override public String name() @@ -1356,7 +1357,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Log10 extends DoubleUnivariateMathFunction + public static class Log10 extends DoubleUnivariateMathFunction { @Override public String name() @@ -1440,7 +1441,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - static class Round extends Function + public static class Round extends Function { //CHECKSTYLE.OFF: Regexp private static final BigDecimal MAX_FINITE_VALUE = BigDecimal.valueOf(Double.MAX_VALUE); @@ -1529,7 +1530,7 @@ private static BigDecimal safeGetFromDouble(double val) } } - class Signum extends DoubleUnivariateMathFunction + public static class Signum extends DoubleUnivariateMathFunction { @Override public String name() @@ -1550,7 +1551,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Sin extends DoubleUnivariateMathFunction + public static class Sin extends DoubleUnivariateMathFunction { @Override public String name() @@ -1571,7 +1572,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Sinh extends DoubleUnivariateMathFunction + public static class Sinh extends DoubleUnivariateMathFunction { @Override public String name() @@ -1592,7 +1593,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Sqrt extends DoubleUnivariateMathFunction + public static class Sqrt extends DoubleUnivariateMathFunction { @Override public String name() @@ -1613,7 +1614,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Tan extends DoubleUnivariateMathFunction + public static class Tan extends DoubleUnivariateMathFunction { @Override public String name() @@ -1634,7 +1635,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Tanh extends DoubleUnivariateMathFunction + public static class Tanh extends DoubleUnivariateMathFunction { @Override public String name() @@ -1655,7 +1656,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class ToDegrees extends DoubleUnivariateMathFunction + public static class ToDegrees extends DoubleUnivariateMathFunction { @Override public String name() @@ -1676,7 +1677,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class ToRadians extends DoubleUnivariateMathFunction + public static class ToRadians extends DoubleUnivariateMathFunction { @Override public String name() @@ -1697,7 +1698,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Ulp extends DoubleUnivariateMathFunction + public static class Ulp extends DoubleUnivariateMathFunction { @Override public String name() @@ -1718,7 +1719,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Atan2 extends DoubleBivariateMathFunction + public static class Atan2 extends DoubleBivariateMathFunction { @Override public String name() @@ -1739,7 +1740,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class CopySign extends DoubleBivariateMathFunction + public static class CopySign extends DoubleBivariateMathFunction { @Override public String name() @@ -1760,7 +1761,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Hypot extends DoubleBivariateMathFunction + public static class Hypot extends DoubleBivariateMathFunction { @Override public String name() @@ -1781,7 +1782,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Remainder extends DoubleBivariateMathFunction + public static class Remainder extends DoubleBivariateMathFunction { @Override public String name() @@ -1802,7 +1803,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Max extends BivariateMathFunction + public static class Max extends BivariateMathFunction { @Override public String name() @@ -1829,7 +1830,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Min extends BivariateMathFunction + public static class Min extends BivariateMathFunction { @Override public String name() @@ -1856,7 +1857,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class NextAfter extends DoubleBivariateMathFunction + public static class NextAfter extends DoubleBivariateMathFunction { @Override public String name() @@ -1877,7 +1878,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Pow extends DoubleBivariateMathFunction + public static class Pow extends DoubleBivariateMathFunction { @Override public String name() @@ -1898,7 +1899,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class Scalb extends BivariateFunction + public static class Scalb extends BivariateFunction { @Override public String name() @@ -1942,7 +1943,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class CastFunc extends BivariateFunction + public static class CastFunc extends BivariateFunction { @Override public String name() @@ -2071,7 +2072,7 @@ public String name() } } - class ConditionFunc extends Function + public static class ConditionFunc extends Function { @Override public String name() @@ -2103,7 +2104,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class IsNullFunc extends Function + public static class IsNullFunc extends Function { @Override public String name() @@ -2276,7 +2277,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class IsNotNullFunc extends Function + public static class IsNotNullFunc extends Function { @Override public String name() @@ -2318,7 +2319,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - class ConcatFunc extends Function + public static class ConcatFunc extends Function { @Override public String name() @@ -2383,7 +2384,7 @@ public ExprVectorProcessor asVectorProcessor( } } - class StrlenFunc extends Function + public static class StrlenFunc extends Function { @Override public String name() @@ -2412,7 +2413,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List getArrayInputs(List args) } } - class ArrayToMultiValueStringFunction extends Function + public static class ArrayToMultiValueStringFunction extends Function { @Override public String name() @@ -3053,7 +3054,7 @@ public Set getArrayInputs(List args) } } - static class ArrayConstructorFunction extends Function + public static class ArrayConstructorFunction extends Function { @Override public String name() @@ -3137,7 +3138,7 @@ static ExpressionType setArrayOutput(@Nullable ExpressionType arrayType, Object[ } } - class ArrayLengthFunction extends Function + public static class ArrayLengthFunction extends Function { @Override public String name() @@ -3190,7 +3191,7 @@ public Set getScalarInputs(List args) } } - class StringToArrayFunction extends Function + public static class StringToArrayFunction extends Function { @Override public String name() @@ -3237,7 +3238,7 @@ public boolean hasArrayOutput() } } - class ArrayToStringFunction extends ArrayScalarFunction + public static class ArrayToStringFunction extends ArrayScalarFunction { @Override public String name() @@ -3266,7 +3267,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) } } - class ArrayOffsetFunction extends ArrayScalarFunction + public static class ArrayOffsetFunction extends ArrayScalarFunction { @Override public String name() @@ -3294,7 +3295,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) } } - class ArrayOrdinalFunction extends ArrayScalarFunction + public static class ArrayOrdinalFunction extends ArrayScalarFunction { @Override public String name() @@ -3322,7 +3323,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) } } - class ArrayOffsetOfFunction extends ArrayScalarFunction + public static class ArrayOffsetOfFunction extends ArrayScalarFunction { @Override public String name() @@ -3363,7 +3364,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) } } - class ArrayOrdinalOfFunction extends ArrayScalarFunction + public static class ArrayOrdinalOfFunction extends ArrayScalarFunction { @Override public String name() @@ -3405,7 +3406,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) } } - class ArrayAppendFunction extends ArrayAddElementFunction + public static class ArrayAppendFunction extends ArrayAddElementFunction { @Override public String name() @@ -3425,7 +3426,7 @@ Object[] add(TypeSignature elementType, T[] array, @Nullable T val } } - class ArrayPrependFunction extends ArrayAddElementFunction + public static class ArrayPrependFunction extends ArrayAddElementFunction { @Override public String name() @@ -3457,7 +3458,7 @@ Object[] add(TypeSignature elementType, T[] array, @Nullable T val } } - class ArrayConcatFunction extends ArraysMergeFunction + public static class ArrayConcatFunction extends ArraysMergeFunction { @Override public String name() @@ -3479,7 +3480,7 @@ Object[] merge(TypeSignature elementType, T[] array1, T[] array2) } } - class ArraySetAddFunction extends ArrayAddElementFunction + public static class ArraySetAddFunction extends ArrayAddElementFunction { @Override public String name() @@ -3497,7 +3498,7 @@ Object[] add(TypeSignature elementType, T[] array, @Nullable T val } } - class ArraySetAddAllFunction extends ArraysMergeFunction + public static class ArraySetAddAllFunction extends ArraysMergeFunction { @Override public String name() @@ -3515,7 +3516,7 @@ Object[] merge(TypeSignature elementType, T[] array1, T[] array2) } } - class ArrayContainsFunction extends ArraysFunction + public static class ArrayContainsFunction extends ArraysFunction { @Override public String name() @@ -3545,7 +3546,7 @@ ExprEval doApply(ExprEval lhsExpr, ExprEval rhsExpr) } } - class ArrayOverlapFunction extends ArraysFunction + public static class ArrayOverlapFunction extends ArraysFunction { @Override public String name() @@ -3573,7 +3574,7 @@ ExprEval doApply(ExprEval lhsExpr, ExprEval rhsExpr) } } - class ArraySliceFunction extends Function + public static class ArraySliceFunction extends Function { @Override public String name() @@ -3647,7 +3648,7 @@ public ExprEval realApply(List args, Expr.ObjectBinding bindings) } } - abstract class SizeFormatFunc extends Function + public static abstract class SizeFormatFunc extends Function { protected abstract HumanReadableBytes.UnitSystem getUnitSystem(); @@ -3708,7 +3709,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inputTypes, List< } } - class HumanReadableDecimalByteFormatFunc extends SizeFormatFunc + public static class HumanReadableDecimalByteFormatFunc extends SizeFormatFunc { @Override public String name() @@ -3723,7 +3724,7 @@ protected HumanReadableBytes.UnitSystem getUnitSystem() } } - class HumanReadableBinaryByteFormatFunc extends SizeFormatFunc + public static class HumanReadableBinaryByteFormatFunc extends SizeFormatFunc { @Override public String name() @@ -3738,7 +3739,7 @@ protected HumanReadableBytes.UnitSystem getUnitSystem() } } - class HumanReadableDecimalFormatFunc extends SizeFormatFunc + public static class HumanReadableDecimalFormatFunc extends SizeFormatFunc { @Override public String name() From 017ff4a3af372419a93641cb780d3dde5fa495a9 Mon Sep 17 00:00:00 2001 From: Zoltan Haindrich Date: Thu, 14 Sep 2023 09:42:38 +0000 Subject: [PATCH 03/10] fix keywrod order - regex excercise --- .../org/apache/druid/math/expr/Function.java | 51 ++++++++++--------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/math/expr/Function.java b/processing/src/main/java/org/apache/druid/math/expr/Function.java index f54c5405287b..a73bd67dd0ca 100644 --- a/processing/src/main/java/org/apache/druid/math/expr/Function.java +++ b/processing/src/main/java/org/apache/druid/math/expr/Function.java @@ -67,15 +67,18 @@ public abstract class Function implements NamedFunction /** * Evaluate the function, given a list of arguments and a set of bindings to provide values for {@link IdentifierExpr}. */ - final ExprEval apply(List args, Expr.ObjectBinding bindings) { - try { - return realApply(args,bindings); - } catch (DruidException|ExpressionValidationException de) { - throw de; - } catch (Exception e) { - throw DruidException.defensive().build(e, "Invocation of %s encountered exception.", getClass().getName()); - } - } + final ExprEval apply(List args, Expr.ObjectBinding bindings) + { + try { + return realApply(args, bindings); + } + catch (DruidException | ExpressionValidationException de) { + throw de; + } + catch (Exception e) { + throw DruidException.defensive().build(e, "Invocation of %s encountered exception.", getClass().getName()); + } + } protected abstract ExprEval realApply(List args, ObjectBinding bindings); @@ -127,7 +130,7 @@ boolean hasArrayOutput() * @see Expr#getOutputType */ @Nullable -abstract ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args); + abstract ExpressionType 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, @@ -157,7 +160,7 @@ ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector in /** * Base class for a single variable input {@link Function} implementation */ - static abstract class UnivariateFunction extends Function + public abstract static class UnivariateFunction extends Function { @Override public void validateArguments(List args) @@ -178,7 +181,7 @@ public final ExprEval realApply(List args, Expr.ObjectBinding bindings) /** * Base class for a 2 variable input {@link Function} implementation */ - static abstract class BivariateFunction extends Function + public abstract static class BivariateFunction extends Function { @Override public void validateArguments(List args) @@ -201,7 +204,7 @@ public ExprEval realApply(List args, Expr.ObjectBinding bindings) * Base class for a single variable input mathematical {@link Function}, with specialized 'eval' implementations that * that operate on primitive number types */ - static abstract class UnivariateMathFunction extends UnivariateFunction + public abstract static class UnivariateMathFunction extends UnivariateFunction { @Override protected final ExprEval eval(ExprEval param) @@ -250,7 +253,7 @@ public boolean canVectorize(Expr.InputBindingInspector inspector, List arg /** * Many math functions always output a {@link Double} primitive, regardless of input type. */ - static abstract class DoubleUnivariateMathFunction extends UnivariateMathFunction + public abstract static class DoubleUnivariateMathFunction extends UnivariateMathFunction { @Nullable @Override @@ -264,7 +267,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List arg /** * Many math functions always output a {@link Double} primitive, regardless of input type. */ - public static abstract class DoubleBivariateMathFunction extends BivariateMathFunction + public abstract static class DoubleBivariateMathFunction extends BivariateMathFunction { @Nullable @Override @@ -326,7 +329,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List arg * Base class for a 2 variable input {@link Function} whose first argument is a {@link ExprType#STRING} and second * argument is {@link ExprType#LONG} */ - public static abstract class StringLongFunction extends BivariateFunction + public abstract static class StringLongFunction extends BivariateFunction { @Override protected final ExprEval eval(ExprEval x, ExprEval y) @@ -381,7 +384,7 @@ protected final ExprEval eval(ExprEval x, ExprEval y) /** * {@link Function} that takes 1 array operand and 1 scalar operand */ - public static abstract class ArrayScalarFunction extends Function + public abstract static class ArrayScalarFunction extends Function { @Override public void validateArguments(List args) @@ -434,7 +437,7 @@ Expr getArrayArgument(List args) /** * {@link Function} that takes 2 array operands */ - static abstract class ArraysFunction extends Function + public abstract static class ArraysFunction extends Function { @Override public void validateArguments(List args) @@ -482,7 +485,7 @@ public ExprEval realApply(List args, Expr.ObjectBinding bindings) * Scaffolding for a 2 argument {@link Function} which accepts one array and one scalar input and adds the scalar * input to the array in some way. */ - public static abstract class ArrayAddElementFunction extends ArrayScalarFunction + public abstract static class ArrayAddElementFunction extends ArrayScalarFunction { @Override public boolean hasArrayOutput() @@ -517,7 +520,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) /** * Base scaffolding for functions which accept 2 array arguments and combine them in some way */ - public static abstract class ArraysMergeFunction extends ArraysFunction + public abstract static class ArraysMergeFunction extends ArraysFunction { @Override public Set getArrayInputs(List args) @@ -566,7 +569,7 @@ ExprEval doApply(ExprEval lhsExpr, ExprEval rhsExpr) abstract Object[] merge(TypeSignature elementType, T[] array1, T[] array2); } - public static abstract class ReduceFunction extends Function + public abstract static class ReduceFunction extends Function { private final DoubleBinaryOperator doubleReducer; private final LongBinaryOperator longReducer; @@ -3648,7 +3651,7 @@ public ExprEval realApply(List args, Expr.ObjectBinding bindings) } } - public static abstract class SizeFormatFunc extends Function + public abstract static class SizeFormatFunc extends Function { protected abstract HumanReadableBytes.UnitSystem getUnitSystem(); From 08f1f5e118ac37509214f23c3f05942a8f9b4f3e Mon Sep 17 00:00:00 2001 From: Zoltan Haindrich Date: Thu, 14 Sep 2023 09:58:35 +0000 Subject: [PATCH 04/10] add test --- .../java/org/apache/druid/math/expr/Function.java | 2 +- .../org/apache/druid/math/expr/FunctionTest.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/processing/src/main/java/org/apache/druid/math/expr/Function.java b/processing/src/main/java/org/apache/druid/math/expr/Function.java index a73bd67dd0ca..89f172daaaa2 100644 --- a/processing/src/main/java/org/apache/druid/math/expr/Function.java +++ b/processing/src/main/java/org/apache/druid/math/expr/Function.java @@ -76,7 +76,7 @@ final ExprEval apply(List args, Expr.ObjectBinding bindings) throw de; } catch (Exception e) { - throw DruidException.defensive().build(e, "Invocation of %s encountered exception.", getClass().getName()); + throw DruidException.defensive().build(e, "Invocation of function '%s' encountered exception.", name()); } } diff --git a/processing/src/test/java/org/apache/druid/math/expr/FunctionTest.java b/processing/src/test/java/org/apache/druid/math/expr/FunctionTest.java index e3a7fa909c6c..c4faf3ab23c1 100644 --- a/processing/src/test/java/org/apache/druid/math/expr/FunctionTest.java +++ b/processing/src/test/java/org/apache/druid/math/expr/FunctionTest.java @@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import org.apache.druid.common.config.NullHandling; +import org.apache.druid.error.DruidException; import org.apache.druid.guice.NestedDataModule; import org.apache.druid.java.util.common.IAE; import org.apache.druid.java.util.common.Pair; @@ -43,6 +44,10 @@ import java.nio.ByteBuffer; import java.util.Set; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThrows; + public class FunctionTest extends InitializedNullHandlingTest { private Expr.ObjectBinding bestEffortBindings; @@ -119,6 +124,16 @@ public void setup() allBindings = new Expr.ObjectBinding[]{bestEffortBindings, typedBindings}; } + @Test + public void testUnknownErrorsAreWrappedAndReported() + { + Exception e = assertThrows(DruidException.class, () -> { + new Function.Abs().apply(null, null); + }); + assertEquals("Invocation of function 'abs' encountered exception.", e.getMessage()); + assertNotNull(e.getCause()); + } + @Test public void testCaseSimple() { From 43c72fdbef77f63df970698e13f0b9729d3f8f46 Mon Sep 17 00:00:00 2001 From: Zoltan Haindrich Date: Fri, 15 Sep 2023 14:23:38 +0000 Subject: [PATCH 05/10] add check&fix keywords --- .../java/org/apache/druid/math/expr/Function.java | 6 +++--- .../org/apache/druid/math/expr/FunctionTest.java | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/math/expr/Function.java b/processing/src/main/java/org/apache/druid/math/expr/Function.java index 89f172daaaa2..ee47413d686e 100644 --- a/processing/src/main/java/org/apache/druid/math/expr/Function.java +++ b/processing/src/main/java/org/apache/druid/math/expr/Function.java @@ -1381,7 +1381,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - static class Log1p extends DoubleUnivariateMathFunction + public static class Log1p extends DoubleUnivariateMathFunction { @Override public String name() @@ -1402,7 +1402,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - static class NextUp extends DoubleUnivariateMathFunction + public static class NextUp extends DoubleUnivariateMathFunction { @Override public String name() @@ -1423,7 +1423,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - static class Rint extends DoubleUnivariateMathFunction + public static class Rint extends DoubleUnivariateMathFunction { @Override public String name() diff --git a/processing/src/test/java/org/apache/druid/math/expr/FunctionTest.java b/processing/src/test/java/org/apache/druid/math/expr/FunctionTest.java index c4faf3ab23c1..03f5521c8a73 100644 --- a/processing/src/test/java/org/apache/druid/math/expr/FunctionTest.java +++ b/processing/src/test/java/org/apache/druid/math/expr/FunctionTest.java @@ -39,6 +39,8 @@ import org.junit.Test; import javax.annotation.Nullable; + +import java.lang.reflect.Modifier; import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.ByteBuffer; @@ -47,6 +49,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; public class FunctionTest extends InitializedNullHandlingTest { @@ -1219,4 +1222,13 @@ private void assertArrayExpr( Assert.assertArrayEquals(expr.getCacheKey(), roundTrip.getCacheKey()); Assert.assertArrayEquals(expr.getCacheKey(), roundTripFlatten.getCacheKey()); } + + @Test + public void checkAllSubClassesArePublic() + { + for (Class cl : Function.class.getDeclaredClasses()) { + assertTrue("non-public: " + cl.getName(), (cl.getModifiers() & Modifier.PUBLIC) > 0); + assertTrue("non-static: " + cl.getName(), (cl.getModifiers() & Modifier.STATIC) > 0); + } + } } From e922c820a7d563ca49c9c686644bed967c42cb4b Mon Sep 17 00:00:00 2001 From: Zoltan Haindrich Date: Mon, 18 Sep 2023 12:30:17 +0000 Subject: [PATCH 06/10] decoupledIgnore --- .../druid/sql/calcite/CalciteQueryTest.java | 21 +- .../druid/sql/calcite/DecoupledIgnore.java | 31 ++ .../DecoupledPlanningCalciteQueryTest.java | 363 ++---------------- 3 files changed, 84 insertions(+), 331 deletions(-) create mode 100644 sql/src/test/java/org/apache/druid/sql/calcite/DecoupledIgnore.java diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java index 499dd8faeb8e..7ee5664879d3 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java @@ -2651,6 +2651,7 @@ public void testGroupByWithSelectProjections() ); } + @DecoupledIgnore @Test public void testGroupByWithSelectAndOrderByProjections() { @@ -2702,6 +2703,7 @@ public void testGroupByWithSelectAndOrderByProjections() ); } + @DecoupledIgnore @Test public void testTopNWithSelectProjections() { @@ -2735,7 +2737,6 @@ public void testTopNWithSelectProjections() ); } - @Test public void testTopNWithSelectAndOrderByProjections() { @@ -2834,6 +2835,7 @@ public void testUnionAllQueriesWithLimit() ); } + @DecoupledIgnore @Test public void testUnionAllDifferentTablesWithMapping() { @@ -2877,6 +2879,7 @@ public void testUnionAllDifferentTablesWithMapping() ); } + @DecoupledIgnore @Test public void testJoinUnionAllDifferentTablesWithMapping() { @@ -2987,6 +2990,7 @@ public void testUnionAllTablesColumnTypeMismatchFloatLong() ); } + @DecoupledIgnore @Test public void testUnionAllTablesColumnTypeMismatchStringLong() { @@ -3030,6 +3034,7 @@ public void testUnionIsUnplannable() ); } + @DecoupledIgnore @Test public void testUnionAllTablesWhenCastAndMappingIsRequired() { @@ -3045,6 +3050,7 @@ public void testUnionAllTablesWhenCastAndMappingIsRequired() ); } + @DecoupledIgnore @Test public void testUnionAllSameTableTwice() { @@ -3144,7 +3150,7 @@ public void testUnionAllSameTableTwiceWithDifferentMapping() "SQL requires union between two tables and column names queried for each table are different Left: [dim1, dim2, m1], Right: [dim2, dim1, m1]." ); } - + @DecoupledIgnore @Test public void testUnionAllSameTableThreeTimes() { @@ -4969,7 +4975,7 @@ public void testSimpleAggregations() new Object[]{6L, 6L, 6L, 1L, 6L, 8L, 4L, 3L, ((1 + 1.7) / 3)} ) ); - } + }@DecoupledIgnore @Test public void testGroupByWithSortOnPostAggregationDefault() @@ -5044,7 +5050,7 @@ public void testGroupByWithSortOnPostAggregationNoTopNConfig() ) ); } - + @DecoupledIgnore @Test public void testGroupByWithSortOnPostAggregationNoTopNContext() { @@ -5702,7 +5708,7 @@ public void testCountStarWithBoundFilterSimplifyOr() ) ); } - + @DecoupledIgnore @Test public void testUnplannableTwoExactCountDistincts() { @@ -11744,6 +11750,7 @@ public void testTextcat() ); } + @DecoupledIgnore @Test public void testRequireTimeConditionPositive() { @@ -11946,7 +11953,7 @@ public void testRequireTimeConditionSubQueryNegative() ImmutableList.of() ); } - + @DecoupledIgnore @Test public void testRequireTimeConditionSemiJoinNegative() { @@ -14209,7 +14216,7 @@ public void testComplexDecodeAgg() ) ); } - + @DecoupledIgnore @Test public void testOrderByAlongWithInternalScanQuery() { diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledIgnore.java b/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledIgnore.java new file mode 100644 index 000000000000..703c1182de66 --- /dev/null +++ b/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledIgnore.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.druid.sql.calcite; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface DecoupledIgnore +{ + +} diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledPlanningCalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledPlanningCalciteQueryTest.java index 7d7559f85279..98f1f57ad1ad 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledPlanningCalciteQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledPlanningCalciteQueryTest.java @@ -24,15 +24,48 @@ import org.apache.druid.server.security.AuthConfig; import org.apache.druid.sql.calcite.planner.PlannerConfig; import org.apache.druid.sql.calcite.util.SqlTestFramework; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.AssumptionViolatedException; +import org.junit.Rule; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +import static org.junit.Assert.assertThrows; public class DecoupledPlanningCalciteQueryTest extends CalciteQueryTest { + + @Rule + public DecoupledIgnoreProcessor decoupledIgnoreProcessor = new DecoupledIgnoreProcessor(); + + public static class DecoupledIgnoreProcessor implements TestRule + { + + public Statement apply(Statement base, Description description) + { + DecoupledIgnore annotation = description.getAnnotation(DecoupledIgnore.class); + return new Statement() + { + @Override + public void evaluate() throws Throwable + { + if (annotation != null) { + Exception e = assertThrows("Expected that this testcase will fail - it might got fixed?", Exception.class, + () -> { + base.evaluate(); + }); + throw new AssumptionViolatedException("Test is not-yet supported in Decoupled mode"); + } else { + base.evaluate(); + } + } + }; + } + }; + private static final ImmutableMap CONTEXT_OVERRIDES = ImmutableMap.of( PlannerConfig.CTX_NATIVE_QUERY_SQL_PLANNING_MODE, PlannerConfig.NATIVE_QUERY_SQL_PLANNING_MODE_DECOUPLED, - QueryContexts.ENABLE_DEBUG, true - ); + QueryContexts.ENABLE_DEBUG, true); @Override protected QueryTestBuilder testBuilder() @@ -47,325 +80,7 @@ public SqlTestFramework.PlannerFixture plannerFixture(PlannerConfig plannerConfi return queryFramework().plannerFixture(DecoupledPlanningCalciteQueryTest.this, plannerConfig, authConfig); } }) - .cannotVectorize(cannotVectorize) - .skipVectorize(skipVectorize); - } - - - @Override - @Ignore - public void testGroupByWithSelectAndOrderByProjections() - { - - } - - @Override - @Ignore - public void testTopNWithSelectAndOrderByProjections() - { - - } - - @Override - @Ignore - public void testUnionAllQueries() - { - - } - - @Override - @Ignore - public void testUnionAllQueriesWithLimit() - { - - } - - @Override - @Ignore - public void testUnionAllDifferentTablesWithMapping() - { - - } - - @Override - @Ignore - public void testJoinUnionAllDifferentTablesWithMapping() - { - - } - - @Override - @Ignore - public void testUnionAllTablesColumnTypeMismatchFloatLong() - { - - } - - @Override - @Ignore - public void testUnionAllTablesColumnTypeMismatchStringLong() - { - - } - - @Override - @Ignore - public void testUnionAllTablesWhenMappingIsRequired() - { - - } - - @Override - @Ignore - public void testUnionIsUnplannable() - { - - } - - @Override - @Ignore - public void testUnionAllTablesWhenCastAndMappingIsRequired() - { - - } - - @Override - @Ignore - public void testUnionAllSameTableTwice() - { - - } - - @Override - @Ignore - public void testUnionAllSameTableTwiceWithSameMapping() - { - - } - - @Override - @Ignore - public void testUnionAllSameTableTwiceWithDifferentMapping() - { - - } - - @Override - @Ignore - public void testUnionAllSameTableThreeTimes() - { - - } - - @Override - @Ignore - public void testUnionAllSameTableThreeTimesWithSameMapping() - { - - } - - @Override - @Ignore - public void testGroupByWithSortOnPostAggregationDefault() - { - - } - - @Override - @Ignore - public void testGroupByWithSortOnPostAggregationNoTopNConfig() - { - - } - - @Override - @Ignore - public void testGroupByWithSortOnPostAggregationNoTopNContext() - { - - } - - @Override - @Ignore - public void testUnplannableQueries() - { - - } - - @Override - @Ignore - public void testUnplannableTwoExactCountDistincts() - { - - } - - @Override - @Ignore - public void testUnplannableExactCountDistinctOnSketch() - { - - } - - @Override - @Ignore - public void testExactCountDistinctUsingSubqueryOnUnionAllTables() - { - - } - - @Override - @Ignore - public void testExactCountDistinctUsingSubqueryWithWherePushDown() - { - - } - - @Override - @Ignore - public void testGroupByTimeFloorAndDimOnGroupByTimeFloorAndDim() - { - - } - - @Override - @Ignore - public void testPostAggWithTimeseries() - { - - } - - @Override - @Ignore - public void testPostAggWithTopN() - { - - } - - @Override - @Ignore - public void testRequireTimeConditionPositive() - { - - } - - @Override - public void testRequireTimeConditionSemiJoinNegative() - { - - } - - @Override - @Ignore - public void testSubqueryTypeMismatchWithLiterals() - { - - } - - @Override - @Ignore - public void testTimeseriesQueryWithEmptyInlineDatasourceAndGranularity() - { - - } - - @Override - @Ignore - public void testGroupBySortPushDown() - { - - } - - @Override - @Ignore - public void testGroupingWithNullInFilter() - { - - } - - @Override - @Ignore - @Test - public void testStringAggExpressionNonConstantSeparator() - { - - } - - @Override - @Ignore - public void testOrderByAlongWithInternalScanQuery() - { - - } - - @Override - @Ignore - public void testSortProjectAfterNestedGroupBy() - { - - } - - @Override - @Ignore - public void testOrderByAlongWithInternalScanQueryNoDistinct() - { - - } - - @Override - @Ignore - public void testNestedGroupBy() - { - - } - - @Override - @Ignore - public void testQueryWithSelectProjectAndIdentityProjectDoesNotRename() - { - - } - - @Override - @Ignore - public void testFilterOnCurrentTimestampWithIntervalArithmetic() - { - - } - - @Override - @Ignore - public void testFilterOnCurrentTimestampOnView() - { - - } - // When run through decoupled, it expects - // dimensions=[DefaultDimensionSpec{dimension='dim2', outputName='d0', outputType='STRING'}, - // DefaultDimensionSpec{dimension='dim1', outputName='d1', outputType='STRING'}] - // - // but gets - // dimensions=[DefaultDimensionSpec{dimension='dim1', outputName='d0', outputType='STRING'}, - // DefaultDimensionSpec{dimension='dim2', outputName='d1', outputType='STRING'}] - // - // The change in the ordering fails the query plan exact match. This needs to be revisited - // when we make more advancements into the decoupled planner - @Override - @Ignore - public void testExactCountDistinctWithGroupingAndOtherAggregators() - { - - } - - @Override - @Ignore - public void testTopNWithSelectProjections() - { - - } - - @Override - @Ignore - public void testPlanWithInFilterLessThanInSubQueryThreshold() - { - + .cannotVectorize(cannotVectorize) + .skipVectorize(skipVectorize); } } From 55ad208503569b5fc8a4f43192ec92ba276a5a15 Mon Sep 17 00:00:00 2001 From: Zoltan Haindrich Date: Mon, 18 Sep 2023 12:30:27 +0000 Subject: [PATCH 07/10] Revert "decoupledIgnore" This reverts commit e922c820a7d563ca49c9c686644bed967c42cb4b. --- .../druid/sql/calcite/CalciteQueryTest.java | 21 +- .../druid/sql/calcite/DecoupledIgnore.java | 31 -- .../DecoupledPlanningCalciteQueryTest.java | 363 ++++++++++++++++-- 3 files changed, 331 insertions(+), 84 deletions(-) delete mode 100644 sql/src/test/java/org/apache/druid/sql/calcite/DecoupledIgnore.java diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java index 7ee5664879d3..499dd8faeb8e 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java @@ -2651,7 +2651,6 @@ public void testGroupByWithSelectProjections() ); } - @DecoupledIgnore @Test public void testGroupByWithSelectAndOrderByProjections() { @@ -2703,7 +2702,6 @@ public void testGroupByWithSelectAndOrderByProjections() ); } - @DecoupledIgnore @Test public void testTopNWithSelectProjections() { @@ -2737,6 +2735,7 @@ public void testTopNWithSelectProjections() ); } + @Test public void testTopNWithSelectAndOrderByProjections() { @@ -2835,7 +2834,6 @@ public void testUnionAllQueriesWithLimit() ); } - @DecoupledIgnore @Test public void testUnionAllDifferentTablesWithMapping() { @@ -2879,7 +2877,6 @@ public void testUnionAllDifferentTablesWithMapping() ); } - @DecoupledIgnore @Test public void testJoinUnionAllDifferentTablesWithMapping() { @@ -2990,7 +2987,6 @@ public void testUnionAllTablesColumnTypeMismatchFloatLong() ); } - @DecoupledIgnore @Test public void testUnionAllTablesColumnTypeMismatchStringLong() { @@ -3034,7 +3030,6 @@ public void testUnionIsUnplannable() ); } - @DecoupledIgnore @Test public void testUnionAllTablesWhenCastAndMappingIsRequired() { @@ -3050,7 +3045,6 @@ public void testUnionAllTablesWhenCastAndMappingIsRequired() ); } - @DecoupledIgnore @Test public void testUnionAllSameTableTwice() { @@ -3150,7 +3144,7 @@ public void testUnionAllSameTableTwiceWithDifferentMapping() "SQL requires union between two tables and column names queried for each table are different Left: [dim1, dim2, m1], Right: [dim2, dim1, m1]." ); } - @DecoupledIgnore + @Test public void testUnionAllSameTableThreeTimes() { @@ -4975,7 +4969,7 @@ public void testSimpleAggregations() new Object[]{6L, 6L, 6L, 1L, 6L, 8L, 4L, 3L, ((1 + 1.7) / 3)} ) ); - }@DecoupledIgnore + } @Test public void testGroupByWithSortOnPostAggregationDefault() @@ -5050,7 +5044,7 @@ public void testGroupByWithSortOnPostAggregationNoTopNConfig() ) ); } - @DecoupledIgnore + @Test public void testGroupByWithSortOnPostAggregationNoTopNContext() { @@ -5708,7 +5702,7 @@ public void testCountStarWithBoundFilterSimplifyOr() ) ); } - @DecoupledIgnore + @Test public void testUnplannableTwoExactCountDistincts() { @@ -11750,7 +11744,6 @@ public void testTextcat() ); } - @DecoupledIgnore @Test public void testRequireTimeConditionPositive() { @@ -11953,7 +11946,7 @@ public void testRequireTimeConditionSubQueryNegative() ImmutableList.of() ); } - @DecoupledIgnore + @Test public void testRequireTimeConditionSemiJoinNegative() { @@ -14216,7 +14209,7 @@ public void testComplexDecodeAgg() ) ); } - @DecoupledIgnore + @Test public void testOrderByAlongWithInternalScanQuery() { diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledIgnore.java b/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledIgnore.java deleted file mode 100644 index 703c1182de66..000000000000 --- a/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledIgnore.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.druid.sql.calcite; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.METHOD}) -public @interface DecoupledIgnore -{ - -} diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledPlanningCalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledPlanningCalciteQueryTest.java index 98f1f57ad1ad..7d7559f85279 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledPlanningCalciteQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/DecoupledPlanningCalciteQueryTest.java @@ -24,48 +24,15 @@ import org.apache.druid.server.security.AuthConfig; import org.apache.druid.sql.calcite.planner.PlannerConfig; import org.apache.druid.sql.calcite.util.SqlTestFramework; -import org.junit.AssumptionViolatedException; -import org.junit.Rule; -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - -import static org.junit.Assert.assertThrows; +import org.junit.Ignore; +import org.junit.Test; public class DecoupledPlanningCalciteQueryTest extends CalciteQueryTest { - - @Rule - public DecoupledIgnoreProcessor decoupledIgnoreProcessor = new DecoupledIgnoreProcessor(); - - public static class DecoupledIgnoreProcessor implements TestRule - { - - public Statement apply(Statement base, Description description) - { - DecoupledIgnore annotation = description.getAnnotation(DecoupledIgnore.class); - return new Statement() - { - @Override - public void evaluate() throws Throwable - { - if (annotation != null) { - Exception e = assertThrows("Expected that this testcase will fail - it might got fixed?", Exception.class, - () -> { - base.evaluate(); - }); - throw new AssumptionViolatedException("Test is not-yet supported in Decoupled mode"); - } else { - base.evaluate(); - } - } - }; - } - }; - private static final ImmutableMap CONTEXT_OVERRIDES = ImmutableMap.of( PlannerConfig.CTX_NATIVE_QUERY_SQL_PLANNING_MODE, PlannerConfig.NATIVE_QUERY_SQL_PLANNING_MODE_DECOUPLED, - QueryContexts.ENABLE_DEBUG, true); + QueryContexts.ENABLE_DEBUG, true + ); @Override protected QueryTestBuilder testBuilder() @@ -80,7 +47,325 @@ public SqlTestFramework.PlannerFixture plannerFixture(PlannerConfig plannerConfi return queryFramework().plannerFixture(DecoupledPlanningCalciteQueryTest.this, plannerConfig, authConfig); } }) - .cannotVectorize(cannotVectorize) - .skipVectorize(skipVectorize); + .cannotVectorize(cannotVectorize) + .skipVectorize(skipVectorize); + } + + + @Override + @Ignore + public void testGroupByWithSelectAndOrderByProjections() + { + + } + + @Override + @Ignore + public void testTopNWithSelectAndOrderByProjections() + { + + } + + @Override + @Ignore + public void testUnionAllQueries() + { + + } + + @Override + @Ignore + public void testUnionAllQueriesWithLimit() + { + + } + + @Override + @Ignore + public void testUnionAllDifferentTablesWithMapping() + { + + } + + @Override + @Ignore + public void testJoinUnionAllDifferentTablesWithMapping() + { + + } + + @Override + @Ignore + public void testUnionAllTablesColumnTypeMismatchFloatLong() + { + + } + + @Override + @Ignore + public void testUnionAllTablesColumnTypeMismatchStringLong() + { + + } + + @Override + @Ignore + public void testUnionAllTablesWhenMappingIsRequired() + { + + } + + @Override + @Ignore + public void testUnionIsUnplannable() + { + + } + + @Override + @Ignore + public void testUnionAllTablesWhenCastAndMappingIsRequired() + { + + } + + @Override + @Ignore + public void testUnionAllSameTableTwice() + { + + } + + @Override + @Ignore + public void testUnionAllSameTableTwiceWithSameMapping() + { + + } + + @Override + @Ignore + public void testUnionAllSameTableTwiceWithDifferentMapping() + { + + } + + @Override + @Ignore + public void testUnionAllSameTableThreeTimes() + { + + } + + @Override + @Ignore + public void testUnionAllSameTableThreeTimesWithSameMapping() + { + + } + + @Override + @Ignore + public void testGroupByWithSortOnPostAggregationDefault() + { + + } + + @Override + @Ignore + public void testGroupByWithSortOnPostAggregationNoTopNConfig() + { + + } + + @Override + @Ignore + public void testGroupByWithSortOnPostAggregationNoTopNContext() + { + + } + + @Override + @Ignore + public void testUnplannableQueries() + { + + } + + @Override + @Ignore + public void testUnplannableTwoExactCountDistincts() + { + + } + + @Override + @Ignore + public void testUnplannableExactCountDistinctOnSketch() + { + + } + + @Override + @Ignore + public void testExactCountDistinctUsingSubqueryOnUnionAllTables() + { + + } + + @Override + @Ignore + public void testExactCountDistinctUsingSubqueryWithWherePushDown() + { + + } + + @Override + @Ignore + public void testGroupByTimeFloorAndDimOnGroupByTimeFloorAndDim() + { + + } + + @Override + @Ignore + public void testPostAggWithTimeseries() + { + + } + + @Override + @Ignore + public void testPostAggWithTopN() + { + + } + + @Override + @Ignore + public void testRequireTimeConditionPositive() + { + + } + + @Override + public void testRequireTimeConditionSemiJoinNegative() + { + + } + + @Override + @Ignore + public void testSubqueryTypeMismatchWithLiterals() + { + + } + + @Override + @Ignore + public void testTimeseriesQueryWithEmptyInlineDatasourceAndGranularity() + { + + } + + @Override + @Ignore + public void testGroupBySortPushDown() + { + + } + + @Override + @Ignore + public void testGroupingWithNullInFilter() + { + + } + + @Override + @Ignore + @Test + public void testStringAggExpressionNonConstantSeparator() + { + + } + + @Override + @Ignore + public void testOrderByAlongWithInternalScanQuery() + { + + } + + @Override + @Ignore + public void testSortProjectAfterNestedGroupBy() + { + + } + + @Override + @Ignore + public void testOrderByAlongWithInternalScanQueryNoDistinct() + { + + } + + @Override + @Ignore + public void testNestedGroupBy() + { + + } + + @Override + @Ignore + public void testQueryWithSelectProjectAndIdentityProjectDoesNotRename() + { + + } + + @Override + @Ignore + public void testFilterOnCurrentTimestampWithIntervalArithmetic() + { + + } + + @Override + @Ignore + public void testFilterOnCurrentTimestampOnView() + { + + } + // When run through decoupled, it expects + // dimensions=[DefaultDimensionSpec{dimension='dim2', outputName='d0', outputType='STRING'}, + // DefaultDimensionSpec{dimension='dim1', outputName='d1', outputType='STRING'}] + // + // but gets + // dimensions=[DefaultDimensionSpec{dimension='dim1', outputName='d0', outputType='STRING'}, + // DefaultDimensionSpec{dimension='dim2', outputName='d1', outputType='STRING'}] + // + // The change in the ordering fails the query plan exact match. This needs to be revisited + // when we make more advancements into the decoupled planner + @Override + @Ignore + public void testExactCountDistinctWithGroupingAndOtherAggregators() + { + + } + + @Override + @Ignore + public void testTopNWithSelectProjections() + { + + } + + @Override + @Ignore + public void testPlanWithInFilterLessThanInSubQueryThreshold() + { + } } From f71bdef729e14bae3fb764279bda309e45a726ca Mon Sep 17 00:00:00 2001 From: Zoltan Haindrich Date: Tue, 19 Sep 2023 11:39:09 +0000 Subject: [PATCH 08/10] unpatch Function --- .../org/apache/druid/math/expr/Function.java | 339 +++++++++--------- 1 file changed, 162 insertions(+), 177 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/math/expr/Function.java b/processing/src/main/java/org/apache/druid/math/expr/Function.java index 178b8dfa33ff..406ffac1ea7d 100644 --- a/processing/src/main/java/org/apache/druid/math/expr/Function.java +++ b/processing/src/main/java/org/apache/druid/math/expr/Function.java @@ -21,12 +21,10 @@ import com.google.common.collect.ImmutableSet; import org.apache.druid.common.config.NullHandling; -import org.apache.druid.error.DruidException; import org.apache.druid.java.util.common.DateTimes; import org.apache.druid.java.util.common.HumanReadableBytes; import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.java.util.common.UOE; -import org.apache.druid.math.expr.Expr.ObjectBinding; import org.apache.druid.math.expr.vector.CastToTypeVectorProcessor; import org.apache.druid.math.expr.vector.ExprVectorProcessor; import org.apache.druid.math.expr.vector.VectorComparisonProcessors; @@ -39,7 +37,6 @@ import org.joda.time.format.DateTimeFormat; import javax.annotation.Nullable; - import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; @@ -63,30 +60,17 @@ * Do NOT remove "unused" members in this class. They are used by generated Antlr */ @SuppressWarnings("unused") -public abstract class Function implements NamedFunction +public interface Function extends NamedFunction { /** * Evaluate the function, given a list of arguments and a set of bindings to provide values for {@link IdentifierExpr}. */ - final ExprEval apply(List args, Expr.ObjectBinding bindings) - { - try { - return realApply(args, bindings); - } - catch (DruidException | ExpressionValidationException de) { - throw de; - } - catch (Exception e) { - throw DruidException.defensive().build(e, "Invocation of function '%s' encountered exception.", name()); - } - } - - protected abstract ExprEval realApply(List args, ObjectBinding bindings); + ExprEval apply(List args, Expr.ObjectBinding bindings); /** * Given a list of arguments to this {@link Function}, get the set of arguments that must evaluate to a scalar value */ - Set getScalarInputs(List args) + default Set getScalarInputs(List args) { return ImmutableSet.copyOf(args); } @@ -95,7 +79,7 @@ Set getScalarInputs(List args) * Given a list of arguments to this {@link Function}, get the set of arguments that must evaluate to an array * value */ - Set getArrayInputs(List args) + default Set getArrayInputs(List args) { return Collections.emptySet(); } @@ -103,7 +87,7 @@ Set getArrayInputs(List args) /** * Returns true if a function expects any array arguments */ - boolean hasArrayInputs() + default boolean hasArrayInputs() { return false; } @@ -112,7 +96,7 @@ boolean hasArrayInputs() * Returns true if function produces an array. All {@link Function} implementations are expected to * exclusively produce either scalar or array values. */ - boolean hasArrayOutput() + default boolean hasArrayOutput() { return false; } @@ -122,7 +106,7 @@ boolean hasArrayOutput() * everything that is feasible up front. Note that input type information is typically unavailable at the time * {@link Expr} are parsed, and so this method is incapable of performing complete validation. */ - abstract void validateArguments(List args); + void validateArguments(List args); /** @@ -131,7 +115,7 @@ boolean hasArrayOutput() * @see Expr#getOutputType */ @Nullable - abstract ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args); + ExpressionType 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, @@ -141,7 +125,7 @@ boolean hasArrayOutput() * @see Expr#canVectorize(Expr.InputBindingInspector) * @see ApplyFunction#canVectorize(Expr.InputBindingInspector, Expr, List) */ - boolean canVectorize(Expr.InputBindingInspector inspector, List args) + default boolean canVectorize(Expr.InputBindingInspector inspector, List args) { return false; } @@ -153,7 +137,7 @@ boolean canVectorize(Expr.InputBindingInspector inspector, List args) * @see Expr#asVectorProcessor(Expr.VectorInputBindingInspector) * @see ApplyFunction#asVectorProcessor(Expr.VectorInputBindingInspector, Expr, List) */ - ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) + default ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector inspector, List args) { throw new UOE("Function[%s] is not vectorized", name()); } @@ -161,7 +145,7 @@ ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspector in /** * Base class for a single variable input {@link Function} implementation */ - public abstract static class UnivariateFunction extends Function + abstract class UnivariateFunction implements Function { @Override public void validateArguments(List args) @@ -170,7 +154,7 @@ public void validateArguments(List args) } @Override - public final ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { Expr expr = args.get(0); return eval(expr.eval(bindings)); @@ -182,7 +166,7 @@ public final ExprEval realApply(List args, Expr.ObjectBinding bindings) /** * Base class for a 2 variable input {@link Function} implementation */ - public abstract static class BivariateFunction extends Function + abstract class BivariateFunction implements Function { @Override public void validateArguments(List args) @@ -191,7 +175,7 @@ public void validateArguments(List args) } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { Expr expr1 = args.get(0); Expr expr2 = args.get(1); @@ -205,7 +189,7 @@ public ExprEval realApply(List args, Expr.ObjectBinding bindings) * Base class for a single variable input mathematical {@link Function}, with specialized 'eval' implementations that * that operate on primitive number types */ - public abstract static class UnivariateMathFunction extends UnivariateFunction + abstract class UnivariateMathFunction extends UnivariateFunction { @Override protected final ExprEval eval(ExprEval param) @@ -254,7 +238,7 @@ public boolean canVectorize(Expr.InputBindingInspector inspector, List arg /** * Many math functions always output a {@link Double} primitive, regardless of input type. */ - public abstract static class DoubleUnivariateMathFunction extends UnivariateMathFunction + abstract class DoubleUnivariateMathFunction extends UnivariateMathFunction { @Nullable @Override @@ -268,7 +252,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List arg /** * Many math functions always output a {@link Double} primitive, regardless of input type. */ - public abstract static class DoubleBivariateMathFunction extends BivariateMathFunction + abstract class DoubleBivariateMathFunction extends BivariateMathFunction { @Nullable @Override @@ -330,7 +314,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List arg * Base class for a 2 variable input {@link Function} whose first argument is a {@link ExprType#STRING} and second * argument is {@link ExprType#LONG} */ - public abstract static class StringLongFunction extends BivariateFunction + abstract class StringLongFunction extends BivariateFunction { @Override protected final ExprEval eval(ExprEval x, ExprEval y) @@ -385,7 +369,7 @@ protected final ExprEval eval(ExprEval x, ExprEval y) /** * {@link Function} that takes 1 array operand and 1 scalar operand */ - public abstract static class ArrayScalarFunction extends Function + abstract class ArrayScalarFunction implements Function { @Override public void validateArguments(List args) @@ -412,7 +396,7 @@ public boolean hasArrayInputs() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval arrayExpr = getArrayArgument(args).eval(bindings); final ExprEval scalarExpr = getScalarArgument(args).eval(bindings); @@ -438,7 +422,7 @@ Expr getArrayArgument(List args) /** * {@link Function} that takes 2 array operands */ - public abstract static class ArraysFunction extends Function + abstract class ArraysFunction implements Function { @Override public void validateArguments(List args) @@ -465,7 +449,7 @@ public boolean hasArrayInputs() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval arrayExpr1 = args.get(0).eval(bindings); final ExprEval arrayExpr2 = args.get(1).eval(bindings); @@ -476,6 +460,7 @@ public ExprEval realApply(List args, Expr.ObjectBinding bindings) if (arrayExpr2.asArray() == null) { return arrayExpr2; } + return doApply(arrayExpr1, arrayExpr2); } @@ -486,7 +471,7 @@ public ExprEval realApply(List args, Expr.ObjectBinding bindings) * Scaffolding for a 2 argument {@link Function} which accepts one array and one scalar input and adds the scalar * input to the array in some way. */ - public abstract static class ArrayAddElementFunction extends ArrayScalarFunction + abstract class ArrayAddElementFunction extends ArrayScalarFunction { @Override public boolean hasArrayOutput() @@ -521,7 +506,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) /** * Base scaffolding for functions which accept 2 array arguments and combine them in some way */ - public abstract static class ArraysMergeFunction extends ArraysFunction + abstract class ArraysMergeFunction extends ArraysFunction { @Override public Set getArrayInputs(List args) @@ -570,7 +555,7 @@ ExprEval doApply(ExprEval lhsExpr, ExprEval rhsExpr) abstract Object[] merge(TypeSignature elementType, T[] array1, T[] array2); } - public abstract static class ReduceFunction extends Function + abstract class ReduceFunction implements Function { private final DoubleBinaryOperator doubleReducer; private final LongBinaryOperator longReducer; @@ -605,7 +590,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { if (args.isEmpty()) { return ExprEval.of(null); @@ -666,7 +651,7 @@ private boolean isValidType(ExpressionType exprType) // ------------------------------ implementations ------------------------------ - public static class ParseLong extends Function + class ParseLong implements Function { @Override public String name() @@ -688,7 +673,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final int radix = args.size() == 1 ? 10 : args.get(1).eval(bindings).asInt(); @@ -733,7 +718,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Pi extends Function + class Pi implements Function { private static final double PI = Math.PI; @@ -744,7 +729,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { return ExprEval.of(PI); } @@ -775,7 +760,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Abs extends UnivariateMathFunction + class Abs extends UnivariateMathFunction { @Override public String name() @@ -802,7 +787,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Acos extends DoubleUnivariateMathFunction + class Acos extends DoubleUnivariateMathFunction { @Override public String name() @@ -823,7 +808,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Asin extends DoubleUnivariateMathFunction + class Asin extends DoubleUnivariateMathFunction { @Override public String name() @@ -844,7 +829,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Atan extends DoubleUnivariateMathFunction + class Atan extends DoubleUnivariateMathFunction { @Override public String name() @@ -865,7 +850,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class BitwiseComplement extends UnivariateMathFunction + class BitwiseComplement extends UnivariateMathFunction { @Override public String name() @@ -893,7 +878,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class BitwiseConvertLongBitsToDouble extends UnivariateMathFunction + class BitwiseConvertLongBitsToDouble extends UnivariateMathFunction { @Override public String name() @@ -925,7 +910,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class BitwiseConvertDoubleToLongBits extends UnivariateMathFunction + class BitwiseConvertDoubleToLongBits extends UnivariateMathFunction { @Override public String name() @@ -957,7 +942,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class BitwiseAnd extends BivariateBitwiseMathFunction + class BitwiseAnd extends BivariateBitwiseMathFunction { @Override public String name() @@ -978,7 +963,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class BitwiseOr extends BivariateBitwiseMathFunction + class BitwiseOr extends BivariateBitwiseMathFunction { @Override public String name() @@ -999,7 +984,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class BitwiseShiftLeft extends BivariateBitwiseMathFunction + class BitwiseShiftLeft extends BivariateBitwiseMathFunction { @Override public String name() @@ -1020,7 +1005,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class BitwiseShiftRight extends BivariateBitwiseMathFunction + class BitwiseShiftRight extends BivariateBitwiseMathFunction { @Override public String name() @@ -1041,7 +1026,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class BitwiseXor extends BivariateBitwiseMathFunction + class BitwiseXor extends BivariateBitwiseMathFunction { @Override public String name() @@ -1062,7 +1047,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Cbrt extends DoubleUnivariateMathFunction + class Cbrt extends DoubleUnivariateMathFunction { @Override public String name() @@ -1083,7 +1068,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Ceil extends DoubleUnivariateMathFunction + class Ceil extends DoubleUnivariateMathFunction { @Override public String name() @@ -1104,7 +1089,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Cos extends DoubleUnivariateMathFunction + class Cos extends DoubleUnivariateMathFunction { @Override public String name() @@ -1125,7 +1110,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Cosh extends DoubleUnivariateMathFunction + class Cosh extends DoubleUnivariateMathFunction { @Override public String name() @@ -1146,7 +1131,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Cot extends DoubleUnivariateMathFunction + class Cot extends DoubleUnivariateMathFunction { @Override public String name() @@ -1167,7 +1152,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class SafeDivide extends BivariateMathFunction + class SafeDivide extends BivariateMathFunction { public static final String NAME = "safe_divide"; @@ -1212,7 +1197,7 @@ protected ExprEval eval(final double x, final double y) } } - public static class Div extends BivariateMathFunction + class Div extends BivariateMathFunction { @Override public String name() @@ -1249,7 +1234,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Exp extends DoubleUnivariateMathFunction + class Exp extends DoubleUnivariateMathFunction { @Override public String name() @@ -1270,7 +1255,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Expm1 extends DoubleUnivariateMathFunction + class Expm1 extends DoubleUnivariateMathFunction { @Override public String name() @@ -1291,7 +1276,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Floor extends DoubleUnivariateMathFunction + class Floor extends DoubleUnivariateMathFunction { @Override public String name() @@ -1312,7 +1297,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class GetExponent extends UnivariateMathFunction + class GetExponent extends UnivariateMathFunction { @Override public String name() @@ -1340,7 +1325,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Log extends DoubleUnivariateMathFunction + class Log extends DoubleUnivariateMathFunction { @Override public String name() @@ -1361,7 +1346,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Log10 extends DoubleUnivariateMathFunction + class Log10 extends DoubleUnivariateMathFunction { @Override public String name() @@ -1382,7 +1367,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Log1p extends DoubleUnivariateMathFunction + class Log1p extends DoubleUnivariateMathFunction { @Override public String name() @@ -1403,7 +1388,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class NextUp extends DoubleUnivariateMathFunction + class NextUp extends DoubleUnivariateMathFunction { @Override public String name() @@ -1424,7 +1409,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Rint extends DoubleUnivariateMathFunction + class Rint extends DoubleUnivariateMathFunction { @Override public String name() @@ -1445,7 +1430,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Round extends Function + class Round implements Function { //CHECKSTYLE.OFF: Regexp private static final BigDecimal MAX_FINITE_VALUE = BigDecimal.valueOf(Double.MAX_VALUE); @@ -1459,7 +1444,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { ExprEval value1 = args.get(0).eval(bindings); @@ -1534,7 +1519,7 @@ private static BigDecimal safeGetFromDouble(double val) } } - public static class Signum extends DoubleUnivariateMathFunction + class Signum extends DoubleUnivariateMathFunction { @Override public String name() @@ -1555,7 +1540,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Sin extends DoubleUnivariateMathFunction + class Sin extends DoubleUnivariateMathFunction { @Override public String name() @@ -1576,7 +1561,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Sinh extends DoubleUnivariateMathFunction + class Sinh extends DoubleUnivariateMathFunction { @Override public String name() @@ -1597,7 +1582,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Sqrt extends DoubleUnivariateMathFunction + class Sqrt extends DoubleUnivariateMathFunction { @Override public String name() @@ -1618,7 +1603,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Tan extends DoubleUnivariateMathFunction + class Tan extends DoubleUnivariateMathFunction { @Override public String name() @@ -1639,7 +1624,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Tanh extends DoubleUnivariateMathFunction + class Tanh extends DoubleUnivariateMathFunction { @Override public String name() @@ -1660,7 +1645,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class ToDegrees extends DoubleUnivariateMathFunction + class ToDegrees extends DoubleUnivariateMathFunction { @Override public String name() @@ -1681,7 +1666,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class ToRadians extends DoubleUnivariateMathFunction + class ToRadians extends DoubleUnivariateMathFunction { @Override public String name() @@ -1702,7 +1687,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Ulp extends DoubleUnivariateMathFunction + class Ulp extends DoubleUnivariateMathFunction { @Override public String name() @@ -1723,7 +1708,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Atan2 extends DoubleBivariateMathFunction + class Atan2 extends DoubleBivariateMathFunction { @Override public String name() @@ -1744,7 +1729,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class CopySign extends DoubleBivariateMathFunction + class CopySign extends DoubleBivariateMathFunction { @Override public String name() @@ -1765,7 +1750,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Hypot extends DoubleBivariateMathFunction + class Hypot extends DoubleBivariateMathFunction { @Override public String name() @@ -1786,7 +1771,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Remainder extends DoubleBivariateMathFunction + class Remainder extends DoubleBivariateMathFunction { @Override public String name() @@ -1807,7 +1792,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Max extends BivariateMathFunction + class Max extends BivariateMathFunction { @Override public String name() @@ -1834,7 +1819,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Min extends BivariateMathFunction + class Min extends BivariateMathFunction { @Override public String name() @@ -1861,7 +1846,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class NextAfter extends DoubleBivariateMathFunction + class NextAfter extends DoubleBivariateMathFunction { @Override public String name() @@ -1882,7 +1867,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Pow extends DoubleBivariateMathFunction + class Pow extends DoubleBivariateMathFunction { @Override public String name() @@ -1903,7 +1888,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class Scalb extends BivariateFunction + class Scalb extends BivariateFunction { @Override public String name() @@ -1947,7 +1932,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class CastFunc extends BivariateFunction + class CastFunc extends BivariateFunction { @Override public String name() @@ -2036,7 +2021,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class GreatestFunc extends ReduceFunction + class GreatestFunc extends ReduceFunction { public static final String NAME = "greatest"; @@ -2056,7 +2041,7 @@ public String name() } } - public static class LeastFunc extends ReduceFunction + class LeastFunc extends ReduceFunction { public static final String NAME = "least"; @@ -2076,7 +2061,7 @@ public String name() } } - public static class ConditionFunc extends Function + class ConditionFunc implements Function { @Override public String name() @@ -2085,7 +2070,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { ExprEval x = args.get(0).eval(bindings); return x.asBoolean() ? args.get(1).eval(bindings) : args.get(2).eval(bindings); @@ -2108,7 +2093,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, final Expr.ObjectBinding bindings) + public ExprEval apply(final List args, final Expr.ObjectBinding bindings) { for (int i = 0; i < args.size(); i += 2) { if (i == args.size() - 1) { @@ -2155,7 +2140,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, final Expr.ObjectBinding bindings) + public ExprEval apply(final List args, final Expr.ObjectBinding bindings) { for (int i = 1; i < args.size(); i += 2) { if (i == args.size() - 1) { @@ -2199,7 +2184,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval eval = args.get(0).eval(bindings); return eval.value() == null ? args.get(1).eval(bindings) : eval; @@ -2243,7 +2228,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe /** * SQL function "IS NOT FALSE". Different from "IS TRUE" in that it returns true for NULL as well. */ - public static class IsNotFalseFunc extends Function + class IsNotFalseFunc implements Function { @Override public String name() @@ -2252,7 +2237,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval arg = args.get(0).eval(bindings); return ExprEval.ofLongBoolean(arg.value() == null || arg.asBoolean()); @@ -2275,7 +2260,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval arg = args.get(0).eval(bindings); return ExprEval.ofLongBoolean(arg.value() == null || !arg.asBoolean()); @@ -2307,7 +2292,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval arg = args.get(0).eval(bindings); return ExprEval.ofLongBoolean(arg.value() != null && !arg.asBoolean()); @@ -2352,7 +2337,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe /** * SQL function "IS TRUE". */ - public static class IsTrueFunc extends Function + class IsTrueFunc implements Function { @Override public String name() @@ -2361,7 +2346,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval arg = args.get(0).eval(bindings); return ExprEval.ofLongBoolean(arg.asBoolean()); @@ -2394,7 +2379,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class IsNullFunc extends Function + class IsNullFunc implements Function { @Override public String name() @@ -2403,7 +2388,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval expr = args.get(0).eval(bindings); return ExprEval.ofLongBoolean(expr.value() == null); @@ -2435,7 +2420,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class IsNotNullFunc extends Function + class IsNotNullFunc implements Function { @Override public String name() @@ -2444,7 +2429,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval expr = args.get(0).eval(bindings); return ExprEval.ofLongBoolean(expr.value() != null); @@ -2477,7 +2462,7 @@ public ExprVectorProcessor asVectorProcessor(Expr.VectorInputBindingInspe } } - public static class ConcatFunc extends Function + class ConcatFunc implements Function { @Override public String name() @@ -2486,7 +2471,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { if (args.size() == 0) { return ExprEval.of(null); @@ -2542,7 +2527,7 @@ public ExprVectorProcessor asVectorProcessor( } } - public static class StrlenFunc extends Function + class StrlenFunc implements Function { @Override public String name() @@ -2551,7 +2536,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final String arg = args.get(0).eval(bindings).asString(); return arg == null ? ExprEval.ofLong(null) : ExprEval.of(arg.length()); @@ -2571,7 +2556,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final String formatString = NullHandling.nullToEmptyIfNeeded(args.get(0).eval(bindings).asString()); @@ -2610,7 +2595,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final String haystack = NullHandling.nullToEmptyIfNeeded(args.get(0).eval(bindings).asString()); final String needle = NullHandling.nullToEmptyIfNeeded(args.get(1).eval(bindings).asString()); @@ -2653,7 +2638,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final String arg = args.get(0).eval(bindings).asString(); @@ -2701,7 +2686,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final String arg = args.get(0).eval(bindings).asString(); final String pattern = NullHandling.nullToEmptyIfNeeded(args.get(1).eval(bindings).asString()); @@ -2792,7 +2777,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final String arg = args.get(0).eval(bindings).asString(); if (arg == null) { @@ -2824,7 +2809,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final String arg = args.get(0).eval(bindings).asString(); if (arg == null) { @@ -2856,7 +2841,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { String base = args.get(0).eval(bindings).asString(); int len = args.get(1).eval(bindings).asInt(); @@ -2944,7 +2929,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { String base = args.get(0).eval(bindings).asString(); int len = args.get(1).eval(bindings).asInt(); @@ -2981,7 +2966,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { ExprEval value = args.get(0).eval(bindings); if (!value.type().is(ExprType.STRING)) { @@ -3040,7 +3025,7 @@ protected ExprEval toValue(DateTime date) } } - public static class UnixTimestampFunc extends TimestampFromEpochFunc + class UnixTimestampFunc extends TimestampFromEpochFunc { @Override public String name() @@ -3055,7 +3040,7 @@ protected final ExprEval toValue(DateTime date) } } - public static class SubMonthFunc extends Function + class SubMonthFunc implements Function { @Override public String name() @@ -3064,7 +3049,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { Long left = args.get(0).eval(bindings).asLong(); Long right = args.get(1).eval(bindings).asLong(); @@ -3092,7 +3077,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { return args.get(0).eval(bindings).castTo(ExpressionType.STRING_ARRAY); } @@ -3152,7 +3137,7 @@ public Set getArrayInputs(List args) } } - public static class ArrayToMultiValueStringFunction extends Function + class ArrayToMultiValueStringFunction implements Function { @Override public String name() @@ -3161,7 +3146,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { return args.get(0).eval(bindings).castTo(ExpressionType.STRING_ARRAY); } @@ -3212,7 +3197,7 @@ public Set getArrayInputs(List args) } } - public static class ArrayConstructorFunction extends Function + class ArrayConstructorFunction implements Function { @Override public String name() @@ -3221,7 +3206,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { // this is copied from 'BaseMapFunction.applyMap', need to find a better way to consolidate, or construct arrays, // or.. something... @@ -3296,7 +3281,7 @@ static ExpressionType setArrayOutput(@Nullable ExpressionType arrayType, Object[ } } - public static class ArrayLengthFunction extends Function + class ArrayLengthFunction implements Function { @Override public String name() @@ -3305,7 +3290,7 @@ public String name() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval expr = args.get(0).eval(bindings); final Object[] array = expr.asArray(); @@ -3349,7 +3334,7 @@ public Set getScalarInputs(List args) } } - public static class StringToArrayFunction extends Function + class StringToArrayFunction implements Function { @Override public String name() @@ -3371,7 +3356,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inspector, List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval expr = args.get(0).eval(bindings); final String arrayString = expr.asString(); @@ -3396,7 +3381,7 @@ public boolean hasArrayOutput() } } - public static class ArrayToStringFunction extends ArrayScalarFunction + class ArrayToStringFunction extends ArrayScalarFunction { @Override public String name() @@ -3425,7 +3410,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) } } - public static class ArrayOffsetFunction extends ArrayScalarFunction + class ArrayOffsetFunction extends ArrayScalarFunction { @Override public String name() @@ -3453,7 +3438,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) } } - public static class ArrayOrdinalFunction extends ArrayScalarFunction + class ArrayOrdinalFunction extends ArrayScalarFunction { @Override public String name() @@ -3481,7 +3466,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) } } - public static class ArrayOffsetOfFunction extends ArrayScalarFunction + class ArrayOffsetOfFunction extends ArrayScalarFunction { @Override public String name() @@ -3522,7 +3507,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) } } - public static class ArrayOrdinalOfFunction extends ArrayScalarFunction + class ArrayOrdinalOfFunction extends ArrayScalarFunction { @Override public String name() @@ -3564,7 +3549,7 @@ ExprEval doApply(ExprEval arrayExpr, ExprEval scalarExpr) } } - public static class ArrayAppendFunction extends ArrayAddElementFunction + class ArrayAppendFunction extends ArrayAddElementFunction { @Override public String name() @@ -3584,7 +3569,7 @@ Object[] add(TypeSignature elementType, T[] array, @Nullable T val } } - public static class ArrayPrependFunction extends ArrayAddElementFunction + class ArrayPrependFunction extends ArrayAddElementFunction { @Override public String name() @@ -3616,7 +3601,7 @@ Object[] add(TypeSignature elementType, T[] array, @Nullable T val } } - public static class ArrayConcatFunction extends ArraysMergeFunction + class ArrayConcatFunction extends ArraysMergeFunction { @Override public String name() @@ -3638,7 +3623,7 @@ Object[] merge(TypeSignature elementType, T[] array1, T[] array2) } } - public static class ArraySetAddFunction extends ArrayAddElementFunction + class ArraySetAddFunction extends ArrayAddElementFunction { @Override public String name() @@ -3656,7 +3641,7 @@ Object[] add(TypeSignature elementType, T[] array, @Nullable T val } } - public static class ArraySetAddAllFunction extends ArraysMergeFunction + class ArraySetAddAllFunction extends ArraysMergeFunction { @Override public String name() @@ -3674,7 +3659,7 @@ Object[] merge(TypeSignature elementType, T[] array1, T[] array2) } } - public static class ArrayContainsFunction extends ArraysFunction + class ArrayContainsFunction extends ArraysFunction { @Override public String name() @@ -3704,7 +3689,7 @@ ExprEval doApply(ExprEval lhsExpr, ExprEval rhsExpr) } } - public static class ArrayOverlapFunction extends ArraysFunction + class ArrayOverlapFunction extends ArraysFunction { @Override public String name() @@ -3732,7 +3717,7 @@ ExprEval doApply(ExprEval lhsExpr, ExprEval rhsExpr) } } - public static class ArraySliceFunction extends Function + class ArraySliceFunction implements Function { @Override public String name() @@ -3783,7 +3768,7 @@ public boolean hasArrayOutput() } @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval expr = args.get(0).eval(bindings); final Object[] array = expr.asArray(); @@ -3806,12 +3791,12 @@ public ExprEval realApply(List args, Expr.ObjectBinding bindings) } } - public abstract static class SizeFormatFunc extends Function + abstract class SizeFormatFunc implements Function { protected abstract HumanReadableBytes.UnitSystem getUnitSystem(); @Override - public ExprEval realApply(List args, Expr.ObjectBinding bindings) + public ExprEval apply(List args, Expr.ObjectBinding bindings) { final ExprEval valueParam = args.get(0).eval(bindings); if (NullHandling.sqlCompatible() && valueParam.isNumericNull()) { @@ -3867,7 +3852,7 @@ public ExpressionType getOutputType(Expr.InputBindingInspector inputTypes, List< } } - public static class HumanReadableDecimalByteFormatFunc extends SizeFormatFunc + class HumanReadableDecimalByteFormatFunc extends SizeFormatFunc { @Override public String name() @@ -3882,7 +3867,7 @@ protected HumanReadableBytes.UnitSystem getUnitSystem() } } - public static class HumanReadableBinaryByteFormatFunc extends SizeFormatFunc + class HumanReadableBinaryByteFormatFunc extends SizeFormatFunc { @Override public String name() @@ -3897,7 +3882,7 @@ protected HumanReadableBytes.UnitSystem getUnitSystem() } } - public static class HumanReadableDecimalFormatFunc extends SizeFormatFunc + class HumanReadableDecimalFormatFunc extends SizeFormatFunc { @Override public String name() From 3567584738ed57ab6c0f091d514f8fba0da178c6 Mon Sep 17 00:00:00 2001 From: Zoltan Haindrich Date: Tue, 19 Sep 2023 12:05:44 +0000 Subject: [PATCH 09/10] move to a different location --- .../druid/math/expr/FunctionalExpr.java | 9 ++++- .../apache/druid/math/expr/FunctionTest.java | 39 ++++++++++++------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java b/processing/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java index b83efb2b2bcc..0aad0584602b 100644 --- a/processing/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java +++ b/processing/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java @@ -21,6 +21,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import org.apache.druid.error.DruidException; import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.math.expr.vector.ExprVectorProcessor; @@ -186,7 +187,13 @@ public String toString() @Override public ExprEval eval(ObjectBinding bindings) { - return function.apply(args, bindings); + try { + return function.apply(args, bindings); + } catch (DruidException | ExpressionValidationException de) { + throw de; + } catch (Exception e) { + throw DruidException.defensive().build(e, "Invocation of function '%s' encountered exception.", name); + } } @Override diff --git a/processing/src/test/java/org/apache/druid/math/expr/FunctionTest.java b/processing/src/test/java/org/apache/druid/math/expr/FunctionTest.java index 03f5521c8a73..656c62cfe561 100644 --- a/processing/src/test/java/org/apache/druid/math/expr/FunctionTest.java +++ b/processing/src/test/java/org/apache/druid/math/expr/FunctionTest.java @@ -28,6 +28,7 @@ import org.apache.druid.java.util.common.IAE; import org.apache.druid.java.util.common.Pair; import org.apache.druid.java.util.common.StringUtils; +import org.apache.druid.math.expr.Expr.ObjectBinding; import org.apache.druid.segment.column.TypeStrategies; import org.apache.druid.segment.column.TypeStrategiesTest; import org.apache.druid.segment.column.TypeStrategy; @@ -40,7 +41,6 @@ import javax.annotation.Nullable; -import java.lang.reflect.Modifier; import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.ByteBuffer; @@ -48,8 +48,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThrows; -import static org.junit.Assert.assertTrue; public class FunctionTest extends InitializedNullHandlingTest { @@ -130,11 +128,31 @@ public void setup() @Test public void testUnknownErrorsAreWrappedAndReported() { - Exception e = assertThrows(DruidException.class, () -> { - new Function.Abs().apply(null, null); - }); + final Expr expr = Parser.parse("abs(x)", ExprMacroTable.nil()); + + ObjectBinding bind = new ObjectBinding() + { + + @Override + public ExpressionType getType(String name) + { + return ExpressionType.LONG_ARRAY; + } + + @Override + public Object get(String name) + { + throw new RuntimeException("nested-exception"); + } + }; + DruidException e = Assert.assertThrows(DruidException.class, + () -> { + expr.eval(bind); + }); + assertEquals("Invocation of function 'abs' encountered exception.", e.getMessage()); assertNotNull(e.getCause()); + assertEquals("nested-exception", e.getCause().getMessage()); } @Test @@ -1222,13 +1240,4 @@ private void assertArrayExpr( Assert.assertArrayEquals(expr.getCacheKey(), roundTrip.getCacheKey()); Assert.assertArrayEquals(expr.getCacheKey(), roundTripFlatten.getCacheKey()); } - - @Test - public void checkAllSubClassesArePublic() - { - for (Class cl : Function.class.getDeclaredClasses()) { - assertTrue("non-public: " + cl.getName(), (cl.getModifiers() & Modifier.PUBLIC) > 0); - assertTrue("non-static: " + cl.getName(), (cl.getModifiers() & Modifier.STATIC) > 0); - } - } } From e81fbe7758d070bc13b672060a372bc0ec859ad8 Mon Sep 17 00:00:00 2001 From: Zoltan Haindrich Date: Tue, 19 Sep 2023 12:08:04 +0000 Subject: [PATCH 10/10] checkstyle --- .../java/org/apache/druid/math/expr/FunctionalExpr.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java b/processing/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java index 0aad0584602b..3d5a7f511f9e 100644 --- a/processing/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java +++ b/processing/src/main/java/org/apache/druid/math/expr/FunctionalExpr.java @@ -189,9 +189,11 @@ public ExprEval eval(ObjectBinding bindings) { try { return function.apply(args, bindings); - } catch (DruidException | ExpressionValidationException de) { - throw de; - } catch (Exception e) { + } + catch (DruidException | ExpressionValidationException e) { + throw e; + } + catch (Exception e) { throw DruidException.defensive().build(e, "Invocation of function '%s' encountered exception.", name); } }