You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vxquery.apache.org by pr...@apache.org on 2014/03/13 20:21:39 UTC

[08/18] git commit: Fixed Max and Min when local aggregate does not return a result.

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/hash_join
Commit: a40f41fdbf277e78cfb91aebbcc60eee74f3a5f9
Parents: 8b354a9
Author: Preston Carman <pr...@apache.org>
Authored: Tue Mar 4 17:23:57 2014 -0800
Committer: Preston Carman <pr...@apache.org>
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();