Ali Alsuliman has uploaded a new change for review. https://asterix-gerrit.ics.uci.edu/2981
Change subject: [NO ISSUE][FUN][COMP] fix ifnan(), ifnanorinf(), ifinf() ...................................................................... [NO ISSUE][FUN][COMP] fix ifnan(), ifnanorinf(), ifinf() - user model changes: no - storage format changes: no - interface changes: no Details: This patch is to fix the mentioned functions. The fix is to make ifnan() & ifnanorinf() skip the argument being inspected if it's a missing value and check the next one. For ifinf(), it should return missing if the argument being inspected is a missing value. Change-Id: Ib7cc3d18ca0443857ae271b6e14f2c9e920f1c1f --- M asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnan/ifnan.1.adm M asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnanorinf/ifnanorinf.1.adm M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/IfNanOrInfTypeComputer.java M asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfInfDescriptor.java M asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanDescriptor.java M asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanOrInfDescriptor.java 7 files changed, 55 insertions(+), 15 deletions(-) git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb refs/changes/81/2981/1 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnan/ifnan.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnan/ifnan.1.adm index ec02746..95e84e9 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnan/ifnan.1.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnan/ifnan.1.adm @@ -1,6 +1,6 @@ [ 0, true ] [ 1, true ] -[ 2, true ] +[ 2, false ] [ 3, true ] [ 5, true ] [ 7, 1 ] @@ -11,10 +11,10 @@ [ 12, 2.5 ] [ 13, 2 ] [ 14, true ] -[ 15, true ] +[ 15, false ] [ 16, 2 ] [ 17, 2 ] [ 18, true ] -[ 19, true ] +[ 19, false ] [ 20, "INF" ] [ 21, "-INF" ] \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnanorinf/ifnanorinf.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnanorinf/ifnanorinf.1.adm index 34476cc..f78178d 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnanorinf/ifnanorinf.1.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnanorinf/ifnanorinf.1.adm @@ -1,6 +1,6 @@ [ 0, true ] [ 1, true ] -[ 2, true ] +[ 2, false ] [ 3, true ] [ 5, true ] [ 7, 1 ] @@ -11,10 +11,10 @@ [ 12, 2.5 ] [ 13, 2 ] [ 14, true ] -[ 15, true ] +[ 15, false ] [ 16, 2 ] [ 17, 2 ] [ 18, true ] -[ 19, true ] +[ 19, false ] [ 20, 2 ] [ 21, 2 ] \ No newline at end of file diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java index 49db062..f2be330 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java @@ -1309,8 +1309,8 @@ addFunction(IF_MISSING, IfMissingTypeComputer.INSTANCE, true); addFunction(IF_MISSING_OR_NULL, IfMissingOrNullTypeComputer.INSTANCE, true); addFunction(IF_NULL, IfNullTypeComputer.INSTANCE, true); - addFunction(IF_NAN, IfNanOrInfTypeComputer.INSTANCE, true); - addFunction(IF_NAN_OR_INF, IfNanOrInfTypeComputer.INSTANCE, true); + addFunction(IF_NAN, IfNanOrInfTypeComputer.INSTANCE_SKIP_MISSING, true); + addFunction(IF_NAN_OR_INF, IfNanOrInfTypeComputer.INSTANCE_SKIP_MISSING, true); addFunction(MISSING_IF, MissingIfTypeComputer.INSTANCE, true); addFunction(NULL_IF, NullIfTypeComputer.INSTANCE, true); diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/IfNanOrInfTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/IfNanOrInfTypeComputer.java index bb9fa38..d635fdd 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/IfNanOrInfTypeComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/IfNanOrInfTypeComputer.java @@ -28,7 +28,14 @@ public class IfNanOrInfTypeComputer extends AbstractResultTypeComputer { - public static final IfNanOrInfTypeComputer INSTANCE = new IfNanOrInfTypeComputer(); + public static final IfNanOrInfTypeComputer INSTANCE = new IfNanOrInfTypeComputer(false); + public static final IfNanOrInfTypeComputer INSTANCE_SKIP_MISSING = new IfNanOrInfTypeComputer(true); + + private final boolean skipMissing; + + private IfNanOrInfTypeComputer(boolean skipMissing) { + this.skipMissing = skipMissing; + } @Override protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException { @@ -50,8 +57,12 @@ } switch (currentType.getTypeTag()) { - case ANY: case MISSING: + if (skipMissing) { + // i.e. all args have been inspected and couldn't find a candidate value, so return null + return BuiltinType.ANULL; + } + case ANY: case BIGINT: case INTEGER: case SMALLINT: diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfInfDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfInfDescriptor.java index 0ff08a4..281e5a5 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfInfDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfInfDescriptor.java @@ -28,6 +28,14 @@ import org.apache.hyracks.api.context.IHyracksTaskContext; import org.apache.hyracks.api.exceptions.HyracksDataException; +/** + * ifinf(arg1, arg2, ...) scans the list of arguments in order and returns the first numeric argument it encounters. + * If the argument being inspected is infinity as determined by the mathematical definiion of floating-points, then + * it skips the argument and inspects the next one. It returns missing if the argument being inspected is missing. + * It returns null if: + * 1. the argument being inspected is not numeric. + * 2. all the arguments have been inspected and no candidate value has been found. + */ public class IfInfDescriptor extends AbstractScalarFunctionDynamicDescriptor { private static final long serialVersionUID = 1L; @@ -40,7 +48,7 @@ @Override public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException { - return new IfNanOrInfDescriptor.AbstractIfInfOrNanEval(ctx, args) { + return new IfNanOrInfDescriptor.AbstractIfInfOrNanEval(ctx, args, false) { @Override protected boolean skipDouble(double d) { return Double.isInfinite(d); diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanDescriptor.java index 9c1f024..05af7b7 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanDescriptor.java @@ -28,6 +28,13 @@ import org.apache.hyracks.api.context.IHyracksTaskContext; import org.apache.hyracks.api.exceptions.HyracksDataException; +/** + * ifnan(arg1, arg2, ...) scans the list of arguments in order and returns the first numeric argument it encounters. + * If the argument being inspected is missing or NaN as determined by the mathematical definiion of floating-points, + * then it skips the argument and inspects the next one. It returns null if: + * 1. the argument being inspected is not numeric. + * 2. all the arguments have been inspected and no candidate value has been found. + */ public class IfNanDescriptor extends AbstractScalarFunctionDynamicDescriptor { private static final long serialVersionUID = 1L; @@ -40,7 +47,7 @@ @Override public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException { - return new IfNanOrInfDescriptor.AbstractIfInfOrNanEval(ctx, args) { + return new IfNanOrInfDescriptor.AbstractIfInfOrNanEval(ctx, args, true) { @Override protected boolean skipDouble(double d) { return Double.isNaN(d); diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanOrInfDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanOrInfDescriptor.java index bf61922..ff4b2f7 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanOrInfDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanOrInfDescriptor.java @@ -36,6 +36,14 @@ import org.apache.hyracks.data.std.primitive.VoidPointable; import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference; +/** + * ifnanorinf(arg1, arg2, ...) scans the list of arguments in order and returns the first numeric argument it + * encounters. + * If the argument being inspected is missing or NaN/Infinity as determined by the mathematical definiion of + * floating-points, then it skips the argument and inspects the next one. It returns null if: + * 1. the argument being inspected is not numeric. + * 2. all the arguments have been inspected and no candidate value has been found. + */ public class IfNanOrInfDescriptor extends AbstractScalarFunctionDynamicDescriptor { private static final long serialVersionUID = 1L; @@ -48,7 +56,7 @@ @Override public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException { - return new AbstractIfInfOrNanEval(ctx, args) { + return new AbstractIfInfOrNanEval(ctx, args, true) { @Override protected boolean skipDouble(double d) { return Double.isInfinite(d) || Double.isNaN(d); @@ -78,13 +86,16 @@ private final IScalarEvaluator[] argEvals; private final IPointable argPtr; + private final boolean skipMissing; - AbstractIfInfOrNanEval(IHyracksTaskContext ctx, IScalarEvaluatorFactory[] args) throws HyracksDataException { + AbstractIfInfOrNanEval(IHyracksTaskContext ctx, IScalarEvaluatorFactory[] args, boolean skipMissing) + throws HyracksDataException { argEvals = new IScalarEvaluator[args.length]; for (int i = 0; i < argEvals.length; i++) { argEvals[i] = args[i].createScalarEvaluator(ctx); } argPtr = new VoidPointable(); + this.skipMissing = skipMissing; } @Override @@ -110,11 +121,14 @@ } result.set(argPtr); return; + case MISSING: + if (skipMissing) { + continue; + } case BIGINT: case INTEGER: case SMALLINT: case TINYINT: - case MISSING: result.set(argPtr); return; default: -- To view, visit https://asterix-gerrit.ics.uci.edu/2981 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib7cc3d18ca0443857ae271b6e14f2c9e920f1c1f Gerrit-PatchSet: 1 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Ali Alsuliman <ali.al.solai...@gmail.com>