Fixed Max and Min when local aggregate does not return a result.

The min or max function now always returns a result. If no result is available, 
empty sequence is returned. The aggregate step function also now considers an 
empty sequence as valid input.


Project: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/commit/a40f41fd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/tree/a40f41fd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/diff/a40f41fd

Branch: refs/heads/prestonc/benchmarks_staging
Commit: a40f41fdbf277e78cfb91aebbcc60eee74f3a5f9
Parents: 8b354a9
Author: Preston Carman <[email protected]>
Authored: Tue Mar 4 17:23:57 2014 -0800
Committer: Preston Carman <[email protected]>
Committed: Tue Mar 4 17:23:57 2014 -0800

----------------------------------------------------------------------
 ...AbstractMaxMinAggregateEvaluatorFactory.java | 39 ++++++++++++++------
 .../AbstractMaxMinScalarEvaluatorFactory.java   | 25 ++++++++-----
 .../aggregate/FnSumScalarEvaluatorFactory.java  |  2 +-
 3 files changed, 44 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/a40f41fd/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AbstractMaxMinAggregateEvaluatorFactory.java
----------------------------------------------------------------------
diff --git 
a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AbstractMaxMinAggregateEvaluatorFactory.java
 
b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AbstractMaxMinAggregateEvaluatorFactory.java
index 4e0d440..b2f300f 100644
--- 
a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AbstractMaxMinAggregateEvaluatorFactory.java
+++ 
b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AbstractMaxMinAggregateEvaluatorFactory.java
@@ -19,7 +19,10 @@ package org.apache.vxquery.runtime.functions.aggregate;
 import java.io.DataOutput;
 import java.io.IOException;
 
+import org.apache.vxquery.datamodel.accessors.SequencePointable;
 import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.datamodel.values.XDMConstants;
 import org.apache.vxquery.exceptions.ErrorCode;
 import org.apache.vxquery.exceptions.SystemException;
 import 
org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentAggregateEvaluator;
@@ -45,6 +48,7 @@ public abstract class AbstractMaxMinAggregateEvaluatorFactory 
extends
     protected IAggregateEvaluator createEvaluator(IScalarEvaluator[] args) 
throws AlgebricksException {
         final AbstractValueComparisonOperation aOp = 
createValueComparisonOperation();
         final TaggedValuePointable tvp2 = (TaggedValuePointable) 
TaggedValuePointable.FACTORY.createPointable();
+        final SequencePointable seqp = (SequencePointable) 
SequencePointable.FACTORY.createPointable();
 
         final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage();
         final DataOutput dOut = abvs.getDataOutput();
@@ -59,24 +63,37 @@ public abstract class 
AbstractMaxMinAggregateEvaluatorFactory extends
 
             @Override
             public void finish(IPointable result) throws AlgebricksException {
-                result.set(abvs);
+                if (count == 0) {
+                    XDMConstants.setEmptySequence(result);
+                } else {
+                    result.set(abvs);
+                }
             }
 
             @Override
             protected void step(TaggedValuePointable[] args) throws 
SystemException {
                 TaggedValuePointable tvp1 = args[0];
-                if (count != 0) {
-                    tvp2.set(abvs.getByteArray(), abvs.getStartOffset(), 
abvs.getLength());
-                }
-                if (count == 0 || 
FunctionHelper.transformThenCompareMinMaxTaggedValues(aOp, tvp1, tvp2, dCtx)) {
-                    try {
-                        abvs.reset();
-                        dOut.write(tvp1.getByteArray(), tvp1.getStartOffset(), 
tvp1.getLength());
-                    } catch (IOException e) {
-                        throw new SystemException(ErrorCode.SYSE0001, e);
+                if (tvp1.getTag() == ValueTag.SEQUENCE_TAG) {
+                    // The local aggregate did not find a value so the global 
aggregate is receiving a empty sequence.
+                    tvp1.getValue(seqp);
+                    int seqLen = seqp.getEntryCount();
+                    if (seqLen != 0) {
+                        throw new SystemException(ErrorCode.FORG0006);
+                    }
+                } else {
+                    if (count != 0) {
+                        tvp2.set(abvs.getByteArray(), abvs.getStartOffset(), 
abvs.getLength());
+                    }
+                    if (count == 0 || 
FunctionHelper.transformThenCompareMinMaxTaggedValues(aOp, tvp1, tvp2, dCtx)) {
+                        try {
+                            abvs.reset();
+                            dOut.write(tvp1.getByteArray(), 
tvp1.getStartOffset(), tvp1.getLength());
+                        } catch (IOException e) {
+                            throw new SystemException(ErrorCode.SYSE0001, e);
+                        }
                     }
+                    count++;
                 }
-                count++;
             }
 
         };

http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/a40f41fd/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AbstractMaxMinScalarEvaluatorFactory.java
----------------------------------------------------------------------
diff --git 
a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AbstractMaxMinScalarEvaluatorFactory.java
 
b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AbstractMaxMinScalarEvaluatorFactory.java
index 66e345f..bf35f7e 100644
--- 
a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AbstractMaxMinScalarEvaluatorFactory.java
+++ 
b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AbstractMaxMinScalarEvaluatorFactory.java
@@ -20,6 +20,7 @@ import org.apache.vxquery.context.DynamicContext;
 import org.apache.vxquery.datamodel.accessors.SequencePointable;
 import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
 import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.datamodel.values.XDMConstants;
 import org.apache.vxquery.exceptions.SystemException;
 import 
org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator;
 import 
org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluatorFactory;
@@ -58,18 +59,22 @@ public abstract class AbstractMaxMinScalarEvaluatorFactory 
extends AbstractTagge
                 if (tvp.getTag() == ValueTag.SEQUENCE_TAG) {
                     tvp.getValue(seqp);
                     int seqLen = seqp.getEntryCount();
-                    for (int j = 0; j < seqLen; ++j) {
-                        seqp.getEntry(j, p);
-                        tvpNext.set(p.getByteArray(), p.getStartOffset(), 
p.getLength());
-                        if (j == 0) {
-                            // Init.
-                            tvpReturn.set(tvpNext);
-                        }
-                        if 
(FunctionHelper.transformThenCompareMinMaxTaggedValues(aOp, tvpNext, tvpReturn, 
dCtx)) {
-                            tvpReturn.set(tvpNext);
+                    if (seqLen == 0) {
+                        XDMConstants.setEmptySequence(result);
+                    } else {
+                        for (int j = 0; j < seqLen; ++j) {
+                            seqp.getEntry(j, p);
+                            tvpNext.set(p.getByteArray(), p.getStartOffset(), 
p.getLength());
+                            if (j == 0) {
+                                // Init.
+                                tvpReturn.set(tvpNext);
+                            }
+                            if 
(FunctionHelper.transformThenCompareMinMaxTaggedValues(aOp, tvpNext, tvpReturn, 
dCtx)) {
+                                tvpReturn.set(tvpNext);
+                            }
                         }
+                        result.set(tvpReturn);
                     }
-                    result.set(tvpReturn);
                 } else {
                     result.set(tvp);
                 }

http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/a40f41fd/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnSumScalarEvaluatorFactory.java
----------------------------------------------------------------------
diff --git 
a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnSumScalarEvaluatorFactory.java
 
b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnSumScalarEvaluatorFactory.java
index e5bfb4f..7ad1b0f 100644
--- 
a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnSumScalarEvaluatorFactory.java
+++ 
b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnSumScalarEvaluatorFactory.java
@@ -48,7 +48,7 @@ public class FnSumScalarEvaluatorFactory extends 
AbstractTaggedValueArgumentScal
     protected IScalarEvaluator createEvaluator(IHyracksTaskContext ctx, 
IScalarEvaluator[] args)
             throws AlgebricksException {
         final DynamicContext dCtx = (DynamicContext) 
ctx.getJobletContext().getGlobalJobData();
-        final SequencePointable seqp = new SequencePointable();
+        final SequencePointable seqp = (SequencePointable) 
SequencePointable.FACTORY.createPointable();
         final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage();
         final DataOutput dOut = abvs.getDataOutput();
         final TaggedValuePointable tvpNext = (TaggedValuePointable) 
TaggedValuePointable.FACTORY.createPointable();

Reply via email to