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();
