You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mh...@apache.org on 2025/04/15 07:27:39 UTC
(asterixdb) 09/31: [ASTERIXDB-3585][FUN] NULLIF(V1, V2) return V1 when V1=V2 is false/null/missing
This is an automated email from the ASF dual-hosted git repository.
mhubail pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit 7e0c63dc755f73aa9741e08991f09763a487c059
Author: Ali Alsuliman <al...@gmail.com>
AuthorDate: Wed Mar 26 16:33:33 2025 -0700
[ASTERIXDB-3585][FUN] NULLIF(V1, V2) return V1 when V1=V2 is false/null/missing
- user model changes: yes
- storage format changes: no
- interface changes: no
Details:
NULLIF(V1, V2) should return V1 when V1 = V2 evaluates to false, null, or missing.
- if_inf(): skip MISSING arg values.
Ext-ref: MB-37298
Change-Id: I7ab2f4f5edb5c3afbcc7d1aff972b03b25b5e4ad
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19557
Reviewed-by: Ali Alsuliman <al...@gmail.com>
Reviewed-by: Murtadha Hubail <mh...@apache.org>
Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
Tested-by: Ali Alsuliman <al...@gmail.com>
---
.../asterix/test/runtime/NullMissingTest.java | 5 ---
.../results/comparison/missingif/missingif.1.adm | 2 +-
.../runtimets/results/comparison/nanif/nanif.1.adm | 2 +-
.../results/comparison/neginfif/neginfif.1.adm | 2 +-
.../results/comparison/nullif/nullif.1.adm | 2 +-
.../results/comparison/posinfif/posinfif.1.adm | 2 +-
.../runtimets/results/numeric/ifinf/ifinf.1.adm | 6 ++--
.../asterix/om/functions/BuiltinFunctions.java | 2 +-
.../om/typecomputer/impl/DoubleIfTypeComputer.java | 38 +++++++++++++++++++---
.../typecomputer/impl/IfNanOrInfTypeComputer.java | 14 +++-----
.../typecomputer/impl/MissingIfTypeComputer.java | 5 +++
.../om/typecomputer/impl/NullIfTypeComputer.java | 5 +++
.../test/om/typecomputer/TypeComputerTest.java | 13 ++++++--
.../comparisons/AbstractComparisonEvaluator.java | 6 ++--
.../comparisons/AbstractIfEqualsEvaluator.java | 24 +++++---------
.../AbstractValueComparisonEvaluator.java | 2 +-
.../comparisons/MissingIfEqualsDescriptor.java | 2 --
.../comparisons/NanIfEqualsDescriptor.java | 2 --
.../comparisons/NegInfIfEqualsDescriptor.java | 2 --
.../comparisons/NullIfEqualsDescriptor.java | 2 --
.../comparisons/PosInfIfEqualsDescriptor.java | 2 --
.../evaluators/functions/IfInfDescriptor.java | 7 ++--
.../evaluators/functions/IfNanDescriptor.java | 2 +-
.../evaluators/functions/IfNanOrInfDescriptor.java | 11 ++-----
24 files changed, 86 insertions(+), 74 deletions(-)
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/NullMissingTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/NullMissingTest.java
index cf30c4d517..3a52aa717c 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/NullMissingTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/NullMissingTest.java
@@ -210,10 +210,5 @@ public class NullMissingTest {
functionsRequiringTypes.add(BuiltinFunctions.GE);
functionsRequiringTypes.add(BuiltinFunctions.LE);
functionsRequiringTypes.add(BuiltinFunctions.NEQ);
- functionsRequiringTypes.add(BuiltinFunctions.MISSING_IF);
- functionsRequiringTypes.add(BuiltinFunctions.NAN_IF);
- functionsRequiringTypes.add(BuiltinFunctions.NEGINF_IF);
- functionsRequiringTypes.add(BuiltinFunctions.NULL_IF);
- functionsRequiringTypes.add(BuiltinFunctions.POSINF_IF);
}
}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/missingif/missingif.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/missingif/missingif.1.adm
index b0a2b5a19b..107771475a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/missingif/missingif.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/missingif/missingif.1.adm
@@ -1 +1 @@
-{ "t1": true, "t2": true, "t3": true, "t4": true, "t5": true, "t6": true, "t7": true, "t8": true }
\ No newline at end of file
+{ "t1": true, "t2": true, "t3": false, "t4": true, "t5": false, "t6": true, "t7": true, "t8": false }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/nanif/nanif.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/nanif/nanif.1.adm
index b0a2b5a19b..107771475a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/nanif/nanif.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/nanif/nanif.1.adm
@@ -1 +1 @@
-{ "t1": true, "t2": true, "t3": true, "t4": true, "t5": true, "t6": true, "t7": true, "t8": true }
\ No newline at end of file
+{ "t1": true, "t2": true, "t3": false, "t4": true, "t5": false, "t6": true, "t7": true, "t8": false }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/neginfif/neginfif.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/neginfif/neginfif.1.adm
index b0a2b5a19b..107771475a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/neginfif/neginfif.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/neginfif/neginfif.1.adm
@@ -1 +1 @@
-{ "t1": true, "t2": true, "t3": true, "t4": true, "t5": true, "t6": true, "t7": true, "t8": true }
\ No newline at end of file
+{ "t1": true, "t2": true, "t3": false, "t4": true, "t5": false, "t6": true, "t7": true, "t8": false }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/nullif/nullif.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/nullif/nullif.1.adm
index b0a2b5a19b..107771475a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/nullif/nullif.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/nullif/nullif.1.adm
@@ -1 +1 @@
-{ "t1": true, "t2": true, "t3": true, "t4": true, "t5": true, "t6": true, "t7": true, "t8": true }
\ No newline at end of file
+{ "t1": true, "t2": true, "t3": false, "t4": true, "t5": false, "t6": true, "t7": true, "t8": false }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/posinfif/posinfif.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/posinfif/posinfif.1.adm
index b0a2b5a19b..107771475a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/posinfif/posinfif.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/comparison/posinfif/posinfif.1.adm
@@ -1 +1 @@
-{ "t1": true, "t2": true, "t3": true, "t4": true, "t5": true, "t6": true, "t7": true, "t8": true }
\ No newline at end of file
+{ "t1": true, "t2": true, "t3": false, "t4": true, "t5": false, "t6": true, "t7": true, "t8": false }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifinf/ifinf.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifinf/ifinf.1.adm
index 8b239c2052..4593ec2493 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifinf/ifinf.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifinf/ifinf.1.adm
@@ -1,5 +1,5 @@
[ 1, true ]
-[ 2, true ]
+[ 2, false ]
[ 3, true ]
[ 4, true ]
[ 5, true ]
@@ -12,11 +12,11 @@
[ 12, 2.5 ]
[ 13, 2 ]
[ 14, true ]
-[ 15, true ]
+[ 15, false ]
[ 16, 2 ]
[ 17, 2 ]
[ 18, true ]
-[ 19, true ]
+[ 19, false ]
[ 20, "NaN" ]
[ 21, 2 ]
[ 22, null ]
\ 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 27f21604f5..2bf5adcf01 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
@@ -1554,10 +1554,10 @@ public class BuiltinFunctions {
addPrivateFunction(TREAT_AS_INTEGER, TreatAsTypeComputer.INSTANCE_INTEGER, true);
addPrivateFunction(IS_NUMERIC_ADD_COMPATIBLE, BooleanOnlyTypeComputer.INSTANCE, true);
- addFunction(IF_INF, IfNanOrInfTypeComputer.INSTANCE, true);
addFunction(IF_MISSING, IfMissingTypeComputer.INSTANCE, true);
addFunction(IF_MISSING_OR_NULL, IfMissingOrNullTypeComputer.INSTANCE, true);
addFunction(IF_NULL, IfNullTypeComputer.INSTANCE, true);
+ addFunction(IF_INF, IfNanOrInfTypeComputer.INSTANCE_SKIP_MISSING, true);
addFunction(IF_NAN, IfNanOrInfTypeComputer.INSTANCE_SKIP_MISSING, true);
addFunction(IF_NAN_OR_INF, IfNanOrInfTypeComputer.INSTANCE_SKIP_MISSING, true);
addPrivateFunction(IF_SYSTEM_NULL, IfNullTypeComputer.INSTANCE, true);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/DoubleIfTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/DoubleIfTypeComputer.java
index 105ea52ccf..83c560f58d 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/DoubleIfTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/DoubleIfTypeComputer.java
@@ -19,20 +19,48 @@
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
+import java.util.List;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.AUnionType;
import org.apache.asterix.om.types.BuiltinType;
import org.apache.asterix.om.types.IAType;
+import org.apache.commons.lang3.mutable.Mutable;
import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
+import org.apache.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
-public class DoubleIfTypeComputer extends AbstractResultTypeComputer {
+public class DoubleIfTypeComputer implements IResultTypeComputer {
public static final DoubleIfTypeComputer INSTANCE = new DoubleIfTypeComputer();
@Override
- public IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- IAType inputType = strippedInputTypes[0];
- return inputType.getTypeTag() == ATypeTag.DOUBLE ? inputType : BuiltinType.ANY;
+ public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
+ IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
+ AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expression;
+ List<Mutable<ILogicalExpression>> arguments = fce.getArguments();
+ if (arguments.size() != 2) {
+ String functionName = fce.getFunctionIdentifier().getName();
+ throw new CompilationException(ErrorCode.COMPILATION_INVALID_NUM_OF_ARGS, fce.getSourceLocation(),
+ functionName);
+ }
+ Mutable<ILogicalExpression> firstArg = arguments.get(0);
+ IAType firstArgType = (IAType) env.getType(firstArg.getValue());
+ if (firstArgType.getTypeTag() == ATypeTag.DOUBLE) {
+ return firstArgType;
+ } else if (firstArgType.getTypeTag() == ATypeTag.UNION) {
+ AUnionType unionType = (AUnionType) firstArgType;
+ IAType actualType = unionType.getActualType();
+ if (actualType.getTypeTag() == ATypeTag.DOUBLE && unionType.isUnknownableType()) {
+ return unionType;
+ }
+ }
+
+ return BuiltinType.ANY;
}
}
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 a0423cd2a9..061e691380 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
@@ -31,13 +31,9 @@ import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCa
public class IfNanOrInfTypeComputer extends AbstractResultTypeComputer {
- public static final IfNanOrInfTypeComputer INSTANCE = new IfNanOrInfTypeComputer(false);
- public static final IfNanOrInfTypeComputer INSTANCE_SKIP_MISSING = new IfNanOrInfTypeComputer(true);
+ public static final IfNanOrInfTypeComputer INSTANCE_SKIP_MISSING = new IfNanOrInfTypeComputer();
- private final boolean skipMissing;
-
- private IfNanOrInfTypeComputer(boolean skipMissing) {
- this.skipMissing = skipMissing;
+ private IfNanOrInfTypeComputer() {
}
@Override
@@ -63,10 +59,8 @@ public class IfNanOrInfTypeComputer extends AbstractResultTypeComputer {
switch (currentType.getTypeTag()) {
case MISSING:
- if (skipMissing) {
- // i.e. all args have been inspected and couldn't find a candidate value, so return null
- return BuiltinType.ANULL;
- }
+ // 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:
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/MissingIfTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/MissingIfTypeComputer.java
index bb5203ebf4..3dc7e5710c 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/MissingIfTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/MissingIfTypeComputer.java
@@ -35,4 +35,9 @@ public class MissingIfTypeComputer extends AbstractResultTypeComputer {
IAType inputType = strippedInputTypes[0];
return inputType.getTypeTag() == ATypeTag.ANY ? inputType : AUnionType.createMissableType(inputType);
}
+
+ @Override
+ protected boolean propagateNullAndMissing() {
+ return false;
+ }
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NullIfTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NullIfTypeComputer.java
index 590d8f6b02..27473e3818 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NullIfTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NullIfTypeComputer.java
@@ -35,4 +35,9 @@ public class NullIfTypeComputer extends AbstractResultTypeComputer {
IAType inputType = strippedInputTypes[0];
return inputType.getTypeTag() == ATypeTag.ANY ? inputType : AUnionType.createNullableType(inputType);
}
+
+ @Override
+ protected boolean propagateNullAndMissing() {
+ return false;
+ }
}
diff --git a/asterixdb/asterix-om/src/test/java/org/apache/asterix/test/om/typecomputer/TypeComputerTest.java b/asterixdb/asterix-om/src/test/java/org/apache/asterix/test/om/typecomputer/TypeComputerTest.java
index cbcb8b38fb..820c956bd3 100644
--- a/asterixdb/asterix-om/src/test/java/org/apache/asterix/test/om/typecomputer/TypeComputerTest.java
+++ b/asterixdb/asterix-om/src/test/java/org/apache/asterix/test/om/typecomputer/TypeComputerTest.java
@@ -34,6 +34,7 @@ import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
import org.apache.asterix.om.typecomputer.impl.BooleanOnlyTypeComputer;
import org.apache.asterix.om.typecomputer.impl.BooleanOrMissingTypeComputer;
import org.apache.asterix.om.typecomputer.impl.ClosedRecordConstructorResultType;
+import org.apache.asterix.om.typecomputer.impl.DoubleIfTypeComputer;
import org.apache.asterix.om.typecomputer.impl.InjectFailureTypeComputer;
import org.apache.asterix.om.typecomputer.impl.LocalAvgTypeComputer;
import org.apache.asterix.om.typecomputer.impl.LocalMedianTypeComputer;
@@ -162,10 +163,8 @@ public class TypeComputerTest {
// Ensure the field is one of the instances of the class
if (field.getType().equals(clazz)) {
LOGGER.log(Level.INFO, "Testing " + clazz.getSimpleName() + ": " + field.getName());
-
- when(functionCallExpression.getArguments()).thenReturn(sixArgs);
-
instance = (IResultTypeComputer) field.get(null);
+ when(functionCallExpression.getArguments()).thenReturn(argsFor(instance, sixArgs));
resultType = instance.computeType(functionCallExpression, typeEnv, metadataProvider);
ATypeTag typeTag = resultType.getTypeTag();
@@ -176,6 +175,14 @@ public class TypeComputerTest {
}
}
+ private static List<Mutable<ILogicalExpression>> argsFor(IResultTypeComputer typeComputer,
+ List<Mutable<ILogicalExpression>> sixArgs) {
+ if (typeComputer.getClass() == DoubleIfTypeComputer.class) {
+ return sixArgs.subList(0, 2);
+ }
+ return sixArgs;
+ }
+
public static void prepare() {
// Add to exception list for computers having a different behavior for "any" type
addComputersBehavingDifferently();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
index 47474750d3..6c6c760064 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
@@ -80,11 +80,13 @@ public abstract class AbstractComparisonEvaluator implements IScalarEvaluator {
private final ILogicalBinaryComparator logicalComparator;
private final IAObject leftConstant;
private final IAObject rightConstant;
+ private final boolean checkUnknown;
AbstractComparisonEvaluator(IScalarEvaluatorFactory evalLeftFactory, IAType leftType,
IScalarEvaluatorFactory evalRightFactory, IAType rightType, IEvaluatorContext ctx, SourceLocation sourceLoc,
- boolean isEquality) throws HyracksDataException {
+ boolean isEquality, boolean checkUnknown) throws HyracksDataException {
this.ctx = ctx;
+ this.checkUnknown = checkUnknown;
this.evalLeft = evalLeftFactory.createScalarEvaluator(ctx);
this.evalRight = evalRightFactory.createScalarEvaluator(ctx);
this.sourceLoc = sourceLoc;
@@ -103,7 +105,7 @@ public abstract class AbstractComparisonEvaluator implements IScalarEvaluator {
evalLeft.evaluate(tuple, argLeft);
evalRight.evaluate(tuple, argRight);
- if (PointableHelper.checkAndSetMissingOrNull(result, argLeft, argRight)) {
+ if (checkUnknown && PointableHelper.checkAndSetMissingOrNull(result, argLeft, argRight)) {
return;
}
leftVal.set(argLeft.getByteArray(), argLeft.getStartOffset() + 1, argLeft.getLength() - 1,
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractIfEqualsEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractIfEqualsEvaluator.java
index c3a7dbc873..a23598fcd2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractIfEqualsEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractIfEqualsEvaluator.java
@@ -19,6 +19,7 @@
package org.apache.asterix.runtime.evaluators.comparisons;
+import org.apache.asterix.dataflow.data.common.ILogicalBinaryComparator;
import org.apache.asterix.om.types.IAType;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
import org.apache.hyracks.api.context.IEvaluatorContext;
@@ -31,26 +32,17 @@ public abstract class AbstractIfEqualsEvaluator extends AbstractComparisonEvalua
AbstractIfEqualsEvaluator(IScalarEvaluatorFactory evalLeftFactory, IAType leftType,
IScalarEvaluatorFactory evalRightFactory, IAType rightType, IEvaluatorContext ctx, SourceLocation sourceLoc)
throws HyracksDataException {
- super(evalLeftFactory, leftType, evalRightFactory, rightType, ctx, sourceLoc, true);
+ super(evalLeftFactory, leftType, evalRightFactory, rightType, ctx, sourceLoc, true, false);
}
@Override
protected void evaluateImpl(IPointable result) throws HyracksDataException {
- // TODO(ali): revisit this for the cases of MISSING/NULL/INCOMPARABLE
- switch (compare()) {
- case MISSING:
- writeMissing(result);
- break;
- case NULL:
- writeNull(result);
- break;
- case EQ:
- resultStorage.reset();
- writeEqualsResult();
- result.set(resultStorage);
- break;
- default:
- result.set(argLeft);
+ if (compare() == ILogicalBinaryComparator.Result.EQ) {
+ resultStorage.reset();
+ writeEqualsResult();
+ result.set(resultStorage);
+ } else {
+ result.set(argLeft);
}
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractValueComparisonEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractValueComparisonEvaluator.java
index 27f117fcd4..bb6a3fe87c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractValueComparisonEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractValueComparisonEvaluator.java
@@ -42,7 +42,7 @@ public abstract class AbstractValueComparisonEvaluator extends AbstractCompariso
public AbstractValueComparisonEvaluator(IScalarEvaluatorFactory evalLeftFactory, IAType leftType,
IScalarEvaluatorFactory evalRightFactory, IAType rightType, IEvaluatorContext ctx, SourceLocation sourceLoc,
boolean isEquality) throws HyracksDataException {
- super(evalLeftFactory, leftType, evalRightFactory, rightType, ctx, sourceLoc, isEquality);
+ super(evalLeftFactory, leftType, evalRightFactory, rightType, ctx, sourceLoc, isEquality, true);
}
@Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/MissingIfEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/MissingIfEqualsDescriptor.java
index 529cd0d85d..6554c745c6 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/MissingIfEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/MissingIfEqualsDescriptor.java
@@ -19,7 +19,6 @@
package org.apache.asterix.runtime.evaluators.comparisons;
-import org.apache.asterix.common.annotations.MissingNullInOutFunction;
import org.apache.asterix.om.base.AMissing;
import org.apache.asterix.om.functions.BuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
@@ -32,7 +31,6 @@ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
import org.apache.hyracks.api.context.IEvaluatorContext;
import org.apache.hyracks.api.exceptions.HyracksDataException;
-@MissingNullInOutFunction
public class MissingIfEqualsDescriptor extends AbstractComparisonDescriptor {
private static final long serialVersionUID = 1L;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NanIfEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NanIfEqualsDescriptor.java
index 26e76cd7f4..632e602604 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NanIfEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NanIfEqualsDescriptor.java
@@ -19,7 +19,6 @@
package org.apache.asterix.runtime.evaluators.comparisons;
-import org.apache.asterix.common.annotations.MissingNullInOutFunction;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.ADouble;
import org.apache.asterix.om.base.AMutableDouble;
@@ -36,7 +35,6 @@ import org.apache.hyracks.api.context.IEvaluatorContext;
import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
import org.apache.hyracks.api.exceptions.HyracksDataException;
-@MissingNullInOutFunction
public class NanIfEqualsDescriptor extends AbstractComparisonDescriptor {
private static final long serialVersionUID = 1L;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NegInfIfEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NegInfIfEqualsDescriptor.java
index e403a1e06d..3c9571a822 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NegInfIfEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NegInfIfEqualsDescriptor.java
@@ -19,7 +19,6 @@
package org.apache.asterix.runtime.evaluators.comparisons;
-import org.apache.asterix.common.annotations.MissingNullInOutFunction;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.ADouble;
import org.apache.asterix.om.base.AMutableDouble;
@@ -36,7 +35,6 @@ import org.apache.hyracks.api.context.IEvaluatorContext;
import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
import org.apache.hyracks.api.exceptions.HyracksDataException;
-@MissingNullInOutFunction
public class NegInfIfEqualsDescriptor extends AbstractComparisonDescriptor {
private static final long serialVersionUID = 1L;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NullIfEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NullIfEqualsDescriptor.java
index 1b1d08fe94..0d6083fbf5 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NullIfEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/NullIfEqualsDescriptor.java
@@ -19,7 +19,6 @@
package org.apache.asterix.runtime.evaluators.comparisons;
-import org.apache.asterix.common.annotations.MissingNullInOutFunction;
import org.apache.asterix.om.base.ANull;
import org.apache.asterix.om.functions.BuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
@@ -32,7 +31,6 @@ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
import org.apache.hyracks.api.context.IEvaluatorContext;
import org.apache.hyracks.api.exceptions.HyracksDataException;
-@MissingNullInOutFunction
public class NullIfEqualsDescriptor extends AbstractComparisonDescriptor {
private static final long serialVersionUID = 1L;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/PosInfIfEqualsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/PosInfIfEqualsDescriptor.java
index 5273d527c9..3876d2428b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/PosInfIfEqualsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/PosInfIfEqualsDescriptor.java
@@ -19,7 +19,6 @@
package org.apache.asterix.runtime.evaluators.comparisons;
-import org.apache.asterix.common.annotations.MissingNullInOutFunction;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.ADouble;
import org.apache.asterix.om.base.AMutableDouble;
@@ -36,7 +35,6 @@ import org.apache.hyracks.api.context.IEvaluatorContext;
import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
import org.apache.hyracks.api.exceptions.HyracksDataException;
-@MissingNullInOutFunction
public class PosInfIfEqualsDescriptor extends AbstractComparisonDescriptor {
private static final long serialVersionUID = 1L;
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 1a6c7c1e95..0cceaa39f1 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
@@ -30,9 +30,8 @@ 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 definition 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:
+ * If the argument being inspected is missing or infinity as determined by the mathematical definition 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.
*
@@ -50,7 +49,7 @@ public class IfInfDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@Override
public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
- return new IfNanOrInfDescriptor.AbstractIfInfOrNanEval(ctx, args, false) {
+ return new IfNanOrInfDescriptor.AbstractIfInfOrNanEval(ctx, args) {
@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 6872c6af32..c35cabb515 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
@@ -49,7 +49,7 @@ public class IfNanDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@Override
public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
- return new IfNanOrInfDescriptor.AbstractIfInfOrNanEval(ctx, args, true) {
+ return new IfNanOrInfDescriptor.AbstractIfInfOrNanEval(ctx, args) {
@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 17c4e46bb8..321882246b 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
@@ -58,7 +58,7 @@ public class IfNanOrInfDescriptor extends AbstractScalarFunctionDynamicDescripto
@Override
public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
- return new AbstractIfInfOrNanEval(ctx, args, true) {
+ return new AbstractIfInfOrNanEval(ctx, args) {
@Override
protected boolean skipDouble(double d) {
return Double.isInfinite(d) || Double.isNaN(d);
@@ -88,16 +88,13 @@ public class IfNanOrInfDescriptor extends AbstractScalarFunctionDynamicDescripto
private final IScalarEvaluator[] argEvals;
private final IPointable argPtr;
- private final boolean skipMissing;
- AbstractIfInfOrNanEval(IEvaluatorContext ctx, IScalarEvaluatorFactory[] args, boolean skipMissing)
- throws HyracksDataException {
+ AbstractIfInfOrNanEval(IEvaluatorContext ctx, IScalarEvaluatorFactory[] args) 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
@@ -124,9 +121,7 @@ public class IfNanOrInfDescriptor extends AbstractScalarFunctionDynamicDescripto
result.set(argPtr);
return;
case MISSING:
- if (skipMissing) {
- continue;
- }
+ continue;
case BIGINT:
case INTEGER:
case SMALLINT: