Found an error in the aggregate functions where the argument was overwriting the saved value.
Project: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/commit/91e801d1 Tree: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/tree/91e801d1 Diff: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/diff/91e801d1 Branch: refs/heads/master Commit: 91e801d17cd09f4c5bdedebe60f6924816eff918 Parents: deabbf7 Author: Preston Carman <[email protected]> Authored: Tue Apr 1 17:10:34 2014 -0700 Committer: Preston Carman <[email protected]> Committed: Tue Apr 1 20:56:26 2014 -0700 ---------------------------------------------------------------------- .../AvgLocalAggregateEvaluatorFactory.java | 23 +++++++++++------- .../FnAvgAggregateEvaluatorFactory.java | 24 +++++++++++++------ .../FnSumAggregateEvaluatorFactory.java | 25 ++++++++++++++------ 3 files changed, 50 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/91e801d1/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AvgLocalAggregateEvaluatorFactory.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AvgLocalAggregateEvaluatorFactory.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AvgLocalAggregateEvaluatorFactory.java index 91657c6..45414dc 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AvgLocalAggregateEvaluatorFactory.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/AvgLocalAggregateEvaluatorFactory.java @@ -26,7 +26,6 @@ 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.arithmetic.AddOperation; -import org.apache.vxquery.runtime.functions.arithmetic.DivideOperation; import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentAggregateEvaluator; import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentAggregateEvaluatorFactory; import org.apache.vxquery.runtime.functions.util.FunctionHelper; @@ -48,10 +47,12 @@ public class AvgLocalAggregateEvaluatorFactory extends AbstractTaggedValueArgume @Override protected IAggregateEvaluator createEvaluator(IScalarEvaluator[] args) throws AlgebricksException { final TaggedValuePointable tvpCount = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); - final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage(); + final ArrayBackedValueStorage abvsCount = new ArrayBackedValueStorage(); + final DataOutput dOutCount = abvsCount.getDataOutput(); + final ArrayBackedValueStorage abvsSum = new ArrayBackedValueStorage(); + final DataOutput dOutSum = abvsSum.getDataOutput(); final ArrayBackedValueStorage abvsSeq = new ArrayBackedValueStorage(); final SequenceBuilder sb = new SequenceBuilder(); - final DataOutput dOut = abvs.getDataOutput(); final AddOperation aOp = new AddOperation(); return new AbstractTaggedValueArgumentAggregateEvaluator(args) { @@ -70,10 +71,10 @@ public class AvgLocalAggregateEvaluatorFactory extends AbstractTaggedValueArgume } else { // Set count as a TaggedValuePointable. try { - abvs.reset(); - dOut.write(ValueTag.XS_INTEGER_TAG); - dOut.writeLong(count); - tvpCount.set(abvs); + abvsCount.reset(); + dOutCount.write(ValueTag.XS_INTEGER_TAG); + dOutCount.writeLong(count); + tvpCount.set(abvsCount); // Save intermediate result. abvsSeq.reset(); @@ -93,7 +94,13 @@ public class AvgLocalAggregateEvaluatorFactory extends AbstractTaggedValueArgume TaggedValuePointable tvp = args[0]; if (count == 0) { // Init. - tvpSum.set(tvp); + try { + abvsSum.reset(); + dOutSum.write(tvp.getByteArray(), tvp.getStartOffset(), tvp.getLength()); + tvpSum.set(abvsSum); + } catch (IOException e) { + throw new SystemException(ErrorCode.SYSE0001, e.toString()); + } } else { FunctionHelper.arithmeticOperation(aOp, dCtx, tvp, tvpSum, tvpSum); } http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/91e801d1/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnAvgAggregateEvaluatorFactory.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnAvgAggregateEvaluatorFactory.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnAvgAggregateEvaluatorFactory.java index 9417ae2..ecde53b 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnAvgAggregateEvaluatorFactory.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnAvgAggregateEvaluatorFactory.java @@ -17,10 +17,12 @@ package org.apache.vxquery.runtime.functions.aggregate; import java.io.DataOutput; +import java.io.IOException; 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.arithmetic.AddOperation; import org.apache.vxquery.runtime.functions.arithmetic.DivideOperation; @@ -45,8 +47,10 @@ public class FnAvgAggregateEvaluatorFactory extends AbstractTaggedValueArgumentA @Override protected IAggregateEvaluator createEvaluator(IScalarEvaluator[] args) throws AlgebricksException { final TaggedValuePointable tvpCount = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); - final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage(); - final DataOutput dOut = abvs.getDataOutput(); + final ArrayBackedValueStorage abvsSum = new ArrayBackedValueStorage(); + final DataOutput dOutSum = abvsSum.getDataOutput(); + final ArrayBackedValueStorage abvsCount = new ArrayBackedValueStorage(); + final DataOutput dOutCount = abvsCount.getDataOutput(); final AddOperation aOp = new AddOperation(); final DivideOperation aOpDivide = new DivideOperation(); @@ -66,10 +70,10 @@ public class FnAvgAggregateEvaluatorFactory extends AbstractTaggedValueArgumentA } else { // Set count as a TaggedValuePointable. try { - abvs.reset(); - dOut.write(ValueTag.XS_INTEGER_TAG); - dOut.writeLong(count); - tvpCount.set(abvs); + abvsCount.reset(); + dOutCount.write(ValueTag.XS_INTEGER_TAG); + dOutCount.writeLong(count); + tvpCount.set(abvsCount); FunctionHelper.arithmeticOperation(aOpDivide, dCtx, tvpSum, tvpCount, tvpSum); result.set(tvpSum); @@ -84,7 +88,13 @@ public class FnAvgAggregateEvaluatorFactory extends AbstractTaggedValueArgumentA TaggedValuePointable tvp = args[0]; if (count == 0) { // Init. - tvpSum.set(tvp); + try { + abvsSum.reset(); + dOutSum.write(tvp.getByteArray(), tvp.getStartOffset(), tvp.getLength()); + tvpSum.set(abvsSum); + } catch (IOException e) { + throw new SystemException(ErrorCode.SYSE0001, e.toString()); + } } else { FunctionHelper.arithmeticOperation(aOp, dCtx, tvp, tvpSum, tvpSum); } http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/91e801d1/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnSumAggregateEvaluatorFactory.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnSumAggregateEvaluatorFactory.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnSumAggregateEvaluatorFactory.java index cbdf4d4..8572a11 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnSumAggregateEvaluatorFactory.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/aggregate/FnSumAggregateEvaluatorFactory.java @@ -17,9 +17,11 @@ package org.apache.vxquery.runtime.functions.aggregate; import java.io.DataOutput; +import java.io.IOException; import org.apache.vxquery.datamodel.accessors.TaggedValuePointable; import org.apache.vxquery.datamodel.values.ValueTag; +import org.apache.vxquery.exceptions.ErrorCode; import org.apache.vxquery.exceptions.SystemException; import org.apache.vxquery.runtime.functions.arithmetic.AddOperation; import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentAggregateEvaluator; @@ -42,8 +44,10 @@ public class FnSumAggregateEvaluatorFactory extends AbstractTaggedValueArgumentA @Override protected IAggregateEvaluator createEvaluator(IScalarEvaluator[] args) throws AlgebricksException { - final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage(); - final DataOutput dOut = abvs.getDataOutput(); + final ArrayBackedValueStorage abvsCount = new ArrayBackedValueStorage(); + final DataOutput dOutCount = abvsCount.getDataOutput(); + final ArrayBackedValueStorage abvsSum = new ArrayBackedValueStorage(); + final DataOutput dOutSum = abvsSum.getDataOutput(); final AddOperation aOp = new AddOperation(); return new AbstractTaggedValueArgumentAggregateEvaluator(args) { @@ -61,11 +65,12 @@ public class FnSumAggregateEvaluatorFactory extends AbstractTaggedValueArgumentA if (count == 0) { // No argument return an integer. try { - abvs.reset(); - dOut.write(ValueTag.XS_INTEGER_TAG); - dOut.writeLong(0); - result.set(abvs); + abvsCount.reset(); + dOutCount.write(ValueTag.XS_INTEGER_TAG); + dOutCount.writeLong(0); + result.set(abvsCount); } catch (Exception e) { + throw new AlgebricksException(e); } } else { @@ -78,7 +83,13 @@ public class FnSumAggregateEvaluatorFactory extends AbstractTaggedValueArgumentA TaggedValuePointable tvp = args[0]; if (count == 0) { // Init. - tvpSum.set(tvp); + try { + abvsSum.reset(); + dOutSum.write(tvp.getByteArray(), tvp.getStartOffset(), tvp.getLength()); + tvpSum.set(abvsSum); + } catch (IOException e) { + throw new SystemException(ErrorCode.SYSE0001, e.toString()); + } } else { FunctionHelper.arithmeticOperation(aOp, dCtx, tvp, tvpSum, tvpSum); }
