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/05 02:27:50 UTC
[7/9] 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/benchmarks_staging
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();