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>

Reply via email to