Unit tests for the sequence data model: pointable and builder classes. * Includes changes for IBuilder interface to improve the code reuse and standardization.
Project: http://git-wip-us.apache.org/repos/asf/vxquery/repo Commit: http://git-wip-us.apache.org/repos/asf/vxquery/commit/7d7ab007 Tree: http://git-wip-us.apache.org/repos/asf/vxquery/tree/7d7ab007 Diff: http://git-wip-us.apache.org/repos/asf/vxquery/diff/7d7ab007 Branch: refs/heads/steven/hdfs Commit: 7d7ab007efc874f2612f976c88fb09387efb0155 Parents: 0891910 Author: Preston Carman <[email protected]> Authored: Mon May 16 17:32:50 2016 -0700 Committer: Preston Carman <[email protected]> Committed: Mon May 16 17:32:50 2016 -0700 ---------------------------------------------------------------------- .../builders/atomic/UTF8StringBuilder.java | 9 +- .../builders/base/AbstractBuilder.java | 14 +- .../datamodel/builders/base/IBuilder.java | 27 ++++ .../builders/nodes/AbstractNodeBuilder.java | 8 +- .../builders/nodes/AttributeNodeBuilder.java | 12 +- .../builders/nodes/CommentNodeBuilder.java | 11 +- .../builders/nodes/DocumentNodeBuilder.java | 12 +- .../builders/nodes/ElementNodeBuilder.java | 17 ++- .../builders/nodes/NodeSubTreeBuilder.java | 17 +-- .../datamodel/builders/nodes/PINodeBuilder.java | 11 +- .../builders/nodes/TextNodeBuilder.java | 11 +- .../builders/sequence/SequenceBuilder.java | 11 +- .../comparison/ValueEqComparisonOperation.java | 128 ++++++++-------- .../runtime/functions/util/FunctionHelper.java | 20 ++- .../datamodel/AbstractPointableTest.java | 56 +++++++ .../vxquery/datamodel/SequenceByteTest.java | 147 +++++++++++++++++++ 16 files changed, 358 insertions(+), 153 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/atomic/UTF8StringBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/atomic/UTF8StringBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/atomic/UTF8StringBuilder.java index 51c026b..a4d301d 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/atomic/UTF8StringBuilder.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/atomic/UTF8StringBuilder.java @@ -20,17 +20,15 @@ import java.io.DataOutput; import java.io.IOException; import java.io.UTFDataFormatException; -import org.apache.vxquery.datamodel.builders.base.AbstractBuilder; -import org.apache.vxquery.runtime.functions.util.FunctionHelper; - import org.apache.hyracks.data.std.api.IMutableValueStorage; import org.apache.hyracks.data.std.primitive.BytePointable; +import org.apache.vxquery.datamodel.builders.base.IBuilder; +import org.apache.vxquery.runtime.functions.util.FunctionHelper; -public class UTF8StringBuilder extends AbstractBuilder { +public class UTF8StringBuilder implements IBuilder { private IMutableValueStorage mvs; private DataOutput out; - @Override public void reset(IMutableValueStorage mvs) throws IOException { this.mvs = mvs; out = mvs.getDataOutput(); @@ -38,7 +36,6 @@ public class UTF8StringBuilder extends AbstractBuilder { out.write(0); } - @Override public void finish() throws IOException { int utflen = mvs.getLength() - 2; BytePointable.setByte(mvs.getByteArray(), 0, (byte) ((utflen >>> 8) & 0xFF)); http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/AbstractBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/AbstractBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/AbstractBuilder.java index bacad26..c360eed 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/AbstractBuilder.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/AbstractBuilder.java @@ -16,12 +16,20 @@ */ package org.apache.vxquery.datamodel.builders.base; +import java.io.DataOutput; import java.io.IOException; import org.apache.hyracks.data.std.api.IMutableValueStorage; -public abstract class AbstractBuilder { - public abstract void reset(IMutableValueStorage mvs) throws IOException; +public abstract class AbstractBuilder implements IBuilder { + + protected DataOutput out; + + public void reset(IMutableValueStorage mvs) throws IOException { + out = mvs.getDataOutput(); + out.write(getValueTag()); + } + + public abstract int getValueTag(); - public abstract void finish() throws IOException; } http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/IBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/IBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/IBuilder.java new file mode 100644 index 0000000..49df178 --- /dev/null +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/IBuilder.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.vxquery.datamodel.builders.base; + +import java.io.IOException; + +import org.apache.hyracks.data.std.api.IMutableValueStorage; + +public interface IBuilder { + public abstract void reset(IMutableValueStorage mvs) throws IOException; + + public abstract void finish() throws IOException; +} http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AbstractNodeBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AbstractNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AbstractNodeBuilder.java index 955668f..eefa834 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AbstractNodeBuilder.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AbstractNodeBuilder.java @@ -16,12 +16,8 @@ */ package org.apache.vxquery.datamodel.builders.nodes; -import java.io.IOException; +import org.apache.vxquery.datamodel.builders.base.AbstractBuilder; -import org.apache.hyracks.data.std.api.IMutableValueStorage; +public abstract class AbstractNodeBuilder extends AbstractBuilder { -public abstract class AbstractNodeBuilder { - public abstract void reset(IMutableValueStorage mvs) throws IOException; - - public abstract void finish() throws IOException; } http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java index 7743cd8..6d7e0f5 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java @@ -16,21 +16,16 @@ */ package org.apache.vxquery.datamodel.builders.nodes; -import java.io.DataOutput; import java.io.IOException; -import org.apache.vxquery.datamodel.values.ValueTag; - -import org.apache.hyracks.data.std.api.IMutableValueStorage; import org.apache.hyracks.data.std.api.IValueReference; +import org.apache.vxquery.datamodel.values.ValueTag; public class AttributeNodeBuilder extends AbstractNodeBuilder { - private DataOutput out; @Override - public void reset(IMutableValueStorage mvs) throws IOException { - out = mvs.getDataOutput(); - out.write(ValueTag.ATTRIBUTE_NODE_TAG); + public int getValueTag() { + return ValueTag.ATTRIBUTE_NODE_TAG; } @Override @@ -56,4 +51,5 @@ public class AttributeNodeBuilder extends AbstractNodeBuilder { public void setValue(IValueReference value) throws IOException { out.write(value.getByteArray(), value.getStartOffset(), value.getLength()); } + } http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java index d79bb88..d596c3d 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java @@ -16,21 +16,16 @@ */ package org.apache.vxquery.datamodel.builders.nodes; -import java.io.DataOutput; import java.io.IOException; -import org.apache.vxquery.datamodel.values.ValueTag; - -import org.apache.hyracks.data.std.api.IMutableValueStorage; import org.apache.hyracks.data.std.api.IValueReference; +import org.apache.vxquery.datamodel.values.ValueTag; public class CommentNodeBuilder extends AbstractNodeBuilder { - private DataOutput out; @Override - public void reset(IMutableValueStorage mvs) throws IOException { - out = mvs.getDataOutput(); - out.write(ValueTag.COMMENT_NODE_TAG); + public int getValueTag() { + return ValueTag.COMMENT_NODE_TAG; } @Override http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DocumentNodeBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DocumentNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DocumentNodeBuilder.java index 47c811c..be2cb93 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DocumentNodeBuilder.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DocumentNodeBuilder.java @@ -16,22 +16,17 @@ */ package org.apache.vxquery.datamodel.builders.nodes; -import java.io.DataOutput; import java.io.IOException; +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; import org.apache.vxquery.datamodel.values.ValueTag; import org.apache.vxquery.util.GrowableIntArray; -import org.apache.hyracks.data.std.api.IMutableValueStorage; -import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; - public class DocumentNodeBuilder extends AbstractNodeBuilder { private final GrowableIntArray childrenSlots; private final ArrayBackedValueStorage childrenDataArea; - private DataOutput out; - private int childrenCount; public DocumentNodeBuilder() { @@ -40,9 +35,8 @@ public class DocumentNodeBuilder extends AbstractNodeBuilder { } @Override - public void reset(IMutableValueStorage mvs) throws IOException { - out = mvs.getDataOutput(); - out.write(ValueTag.DOCUMENT_NODE_TAG); + public int getValueTag() { + return ValueTag.DOCUMENT_NODE_TAG; } @Override http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java index 89aaddc..dcb4b79 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java @@ -16,18 +16,16 @@ */ package org.apache.vxquery.datamodel.builders.nodes; -import java.io.DataOutput; import java.io.IOException; -import org.apache.vxquery.datamodel.accessors.nodes.ElementNodePointable; -import org.apache.vxquery.datamodel.values.ValueTag; -import org.apache.vxquery.util.GrowableIntArray; - import org.apache.hyracks.data.std.api.IMutableValueStorage; import org.apache.hyracks.data.std.api.IValueReference; import org.apache.hyracks.data.std.primitive.BytePointable; import org.apache.hyracks.data.std.primitive.IntegerPointable; import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; +import org.apache.vxquery.datamodel.accessors.nodes.ElementNodePointable; +import org.apache.vxquery.datamodel.values.ValueTag; +import org.apache.vxquery.util.GrowableIntArray; public class ElementNodeBuilder extends AbstractNodeBuilder { private final GrowableIntArray attrSlots; @@ -40,8 +38,6 @@ public class ElementNodeBuilder extends AbstractNodeBuilder { private IMutableValueStorage mvs; - private DataOutput out; - private int headerOffset; private int nsChunkStart; @@ -60,10 +56,15 @@ public class ElementNodeBuilder extends AbstractNodeBuilder { } @Override + public int getValueTag() { + return ValueTag.ELEMENT_NODE_TAG; + } + + @Override public void reset(IMutableValueStorage mvs) throws IOException { this.mvs = mvs; out = mvs.getDataOutput(); - out.write(ValueTag.ELEMENT_NODE_TAG); + out.write(getValueTag()); headerOffset = mvs.getLength(); out.write(0); } http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/NodeSubTreeBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/NodeSubTreeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/NodeSubTreeBuilder.java index 5eb08df..a746492 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/NodeSubTreeBuilder.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/NodeSubTreeBuilder.java @@ -16,22 +16,17 @@ */ package org.apache.vxquery.datamodel.builders.nodes; -import java.io.DataOutput; import java.io.IOException; import org.apache.vxquery.datamodel.accessors.TaggedValuePointable; import org.apache.vxquery.datamodel.accessors.nodes.NodeTreePointable; import org.apache.vxquery.datamodel.values.ValueTag; -import org.apache.hyracks.data.std.api.IMutableValueStorage; - public class NodeSubTreeBuilder extends AbstractNodeBuilder { - private DataOutput mainOut; @Override - public void reset(IMutableValueStorage mvs) throws IOException { - mainOut = mvs.getDataOutput(); - mainOut.write(ValueTag.NODE_TREE_TAG); + public int getValueTag() { + return ValueTag.NODE_TREE_TAG; } @Override @@ -46,14 +41,14 @@ public class NodeSubTreeBuilder extends AbstractNodeBuilder { if (hasNodeIds) { header |= NodeTreePointable.HEADER_NODEID_EXISTS_MASK; } - mainOut.write(header); + out.write(header); if (hasNodeIds) { - mainOut.writeInt(ntp.getRootNodeId()); + out.writeInt(ntp.getRootNodeId()); } if (hasDictionary) { - mainOut.write(ntp.getByteArray(), ntp.getDictionaryOffset(), ntp.getDictionarySize()); + out.write(ntp.getByteArray(), ntp.getDictionaryOffset(), ntp.getDictionarySize()); } - mainOut.write(itemTvp.getByteArray(), itemTvp.getStartOffset(), itemTvp.getLength()); + out.write(itemTvp.getByteArray(), itemTvp.getStartOffset(), itemTvp.getLength()); } private boolean hasDictionary(byte tag) { http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java index ee37511..0e62762 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java @@ -16,21 +16,16 @@ */ package org.apache.vxquery.datamodel.builders.nodes; -import java.io.DataOutput; import java.io.IOException; -import org.apache.vxquery.datamodel.values.ValueTag; - -import org.apache.hyracks.data.std.api.IMutableValueStorage; import org.apache.hyracks.data.std.api.IValueReference; +import org.apache.vxquery.datamodel.values.ValueTag; public class PINodeBuilder extends AbstractNodeBuilder { - private DataOutput out; @Override - public void reset(IMutableValueStorage mvs) throws IOException { - out = mvs.getDataOutput(); - out.write(ValueTag.PI_NODE_TAG); + public int getValueTag() { + return ValueTag.PI_NODE_TAG; } @Override http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java index 84ee20e..67aa487 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java @@ -16,21 +16,16 @@ */ package org.apache.vxquery.datamodel.builders.nodes; -import java.io.DataOutput; import java.io.IOException; -import org.apache.vxquery.datamodel.values.ValueTag; - -import org.apache.hyracks.data.std.api.IMutableValueStorage; import org.apache.hyracks.data.std.api.IValueReference; +import org.apache.vxquery.datamodel.values.ValueTag; public class TextNodeBuilder extends AbstractNodeBuilder { - private DataOutput out; @Override - public void reset(IMutableValueStorage mvs) throws IOException { - out = mvs.getDataOutput(); - out.write(ValueTag.TEXT_NODE_TAG); + public int getValueTag() { + return ValueTag.TEXT_NODE_TAG; } @Override http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/sequence/SequenceBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/sequence/SequenceBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/sequence/SequenceBuilder.java index 12f4ad7..fbea148 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/sequence/SequenceBuilder.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/sequence/SequenceBuilder.java @@ -19,21 +19,18 @@ package org.apache.vxquery.datamodel.builders.sequence; import java.io.DataOutput; import java.io.IOException; -import org.apache.vxquery.datamodel.values.ValueTag; -import org.apache.vxquery.util.GrowableIntArray; - import org.apache.hyracks.data.std.api.IMutableValueStorage; import org.apache.hyracks.data.std.api.IValueReference; import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; +import org.apache.vxquery.datamodel.builders.base.IBuilder; +import org.apache.vxquery.datamodel.values.ValueTag; +import org.apache.vxquery.util.GrowableIntArray; -public class SequenceBuilder { +public class SequenceBuilder implements IBuilder { private final GrowableIntArray slots = new GrowableIntArray(); private final ArrayBackedValueStorage dataArea = new ArrayBackedValueStorage(); private IMutableValueStorage mvs; - public SequenceBuilder() { - } - public void reset(IMutableValueStorage mvs) { this.mvs = mvs; slots.clear(); http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java index f4eb340..fd7bc31 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java @@ -29,7 +29,7 @@ import org.apache.vxquery.datamodel.accessors.atomic.XSQNamePointable; import org.apache.vxquery.datamodel.accessors.atomic.XSTimePointable; import org.apache.vxquery.datamodel.util.DateTime; import org.apache.vxquery.exceptions.SystemException; - +import org.apache.vxquery.runtime.functions.util.FunctionHelper; import org.apache.hyracks.data.std.primitive.BooleanPointable; import org.apache.hyracks.data.std.primitive.DoublePointable; import org.apache.hyracks.data.std.primitive.FloatPointable; @@ -52,13 +52,12 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation @Override public boolean operateBase64BinaryBase64Binary(XSBinaryPointable binaryp1, XSBinaryPointable binaryp2) throws SystemException, IOException { - return arraysEqual(binaryp1.getByteArray(), binaryp1.getStartOffset(), binaryp1.getLength(), - binaryp2.getByteArray(), binaryp2.getStartOffset(), binaryp2.getLength()); + return FunctionHelper.arraysEqual(binaryp1, binaryp2); } @Override - public boolean operateBooleanBoolean(BooleanPointable boolp1, BooleanPointable boolp2) throws SystemException, - IOException { + public boolean operateBooleanBoolean(BooleanPointable boolp1, BooleanPointable boolp2) + throws SystemException, IOException { return (boolp1.compareTo(boolp2) == 0); } @@ -73,8 +72,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength(); if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable .getYearMonth(abvsInner.getByteArray(), startOffset2) - && XSDateTimePointable.getDay(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable.getDay( - abvsInner.getByteArray(), startOffset2)) { + && XSDateTimePointable.getDay(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable + .getDay(abvsInner.getByteArray(), startOffset2)) { return true; } return false; @@ -99,14 +98,14 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateDecimalDecimal(XSDecimalPointable decp1, XSDecimalPointable decp2) throws SystemException, - IOException { + public boolean operateDecimalDecimal(XSDecimalPointable decp1, XSDecimalPointable decp2) + throws SystemException, IOException { return (decp1.compareTo(decp2) == 0); } @Override - public boolean operateDecimalDouble(XSDecimalPointable decp1, DoublePointable doublep2) throws SystemException, - IOException { + public boolean operateDecimalDouble(XSDecimalPointable decp1, DoublePointable doublep2) + throws SystemException, IOException { double double1 = decp1.doubleValue(); double double2 = doublep2.doubleValue(); if (Double.isNaN(doublep2.getDouble())) { @@ -116,8 +115,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateDecimalFloat(XSDecimalPointable decp1, FloatPointable floatp2) throws SystemException, - IOException { + public boolean operateDecimalFloat(XSDecimalPointable decp1, FloatPointable floatp2) + throws SystemException, IOException { float float1 = decp1.floatValue(); float float2 = floatp2.floatValue(); if (Float.isNaN(floatp2.getFloat())) { @@ -127,18 +126,19 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2) throws SystemException, - IOException { + public boolean operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2) + throws SystemException, IOException { abvsInner.reset(); XSDecimalPointable decp2 = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable(); - decp2.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength()); + decp2.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), + XSDecimalPointable.TYPE_TRAITS.getFixedLength()); decp2.setDecimal(longp2.getLong(), (byte) 0); return (decp1.compareTo(decp2) == 0); } @Override - public boolean operateDoubleDecimal(DoublePointable doublep1, XSDecimalPointable decp2) throws SystemException, - IOException { + public boolean operateDoubleDecimal(DoublePointable doublep1, XSDecimalPointable decp2) + throws SystemException, IOException { double double1 = doublep1.doubleValue(); double double2 = decp2.doubleValue(); if (Double.isNaN(doublep1.getDouble())) { @@ -148,8 +148,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateDoubleDouble(DoublePointable doublep1, DoublePointable doublep2) throws SystemException, - IOException { + public boolean operateDoubleDouble(DoublePointable doublep1, DoublePointable doublep2) + throws SystemException, IOException { if (Double.isNaN(doublep1.getDouble()) || Double.isNaN(doublep2.getDouble())) { return false; } @@ -157,8 +157,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateDoubleFloat(DoublePointable doublep1, FloatPointable floatp2) throws SystemException, - IOException { + public boolean operateDoubleFloat(DoublePointable doublep1, FloatPointable floatp2) + throws SystemException, IOException { double double1 = doublep1.doubleValue(); double double2 = floatp2.doubleValue(); if (Double.isNaN(doublep1.getDouble()) || Float.isNaN(floatp2.getFloat())) { @@ -168,8 +168,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateDoubleInteger(DoublePointable doublep1, LongPointable longp2) throws SystemException, - IOException { + public boolean operateDoubleInteger(DoublePointable doublep1, LongPointable longp2) + throws SystemException, IOException { double double1 = doublep1.doubleValue(); double double2 = longp2.doubleValue(); if (Double.isNaN(doublep1.getDouble())) { @@ -179,8 +179,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateDTDurationDTDuration(LongPointable longp1, LongPointable longp2) throws SystemException, - IOException { + public boolean operateDTDurationDTDuration(LongPointable longp1, LongPointable longp2) + throws SystemException, IOException { return (longp1.compareTo(longp2) == 0); } @@ -194,8 +194,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateDTDurationYMDuration(LongPointable longp1, IntegerPointable intp2) throws SystemException, - IOException { + public boolean operateDTDurationYMDuration(LongPointable longp1, IntegerPointable intp2) + throws SystemException, IOException { if (longp1.getLong() == 0 && intp2.getInteger() == 0) { return true; } @@ -214,8 +214,7 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation @Override public boolean operateDurationDuration(XSDurationPointable durationp1, XSDurationPointable durationp2) throws SystemException, IOException { - return arraysEqual(durationp1.getByteArray(), durationp1.getStartOffset(), durationp1.getLength(), - durationp2.getByteArray(), durationp2.getStartOffset(), durationp2.getLength()); + return FunctionHelper.arraysEqual(durationp1, durationp2); } @Override @@ -228,8 +227,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateFloatDecimal(FloatPointable floatp1, XSDecimalPointable decp2) throws SystemException, - IOException { + public boolean operateFloatDecimal(FloatPointable floatp1, XSDecimalPointable decp2) + throws SystemException, IOException { float float1 = floatp1.floatValue(); float float2 = decp2.floatValue(); if (Float.isNaN(floatp1.getFloat())) { @@ -239,8 +238,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateFloatDouble(FloatPointable floatp1, DoublePointable doublep2) throws SystemException, - IOException { + public boolean operateFloatDouble(FloatPointable floatp1, DoublePointable doublep2) + throws SystemException, IOException { double double1 = floatp1.doubleValue(); double double2 = doublep2.doubleValue(); if (Float.isNaN(floatp1.getFloat()) || Double.isNaN(double2)) { @@ -250,8 +249,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateFloatFloat(FloatPointable floatp1, FloatPointable floatp2) throws SystemException, - IOException { + public boolean operateFloatFloat(FloatPointable floatp1, FloatPointable floatp2) + throws SystemException, IOException { if (Float.isNaN(floatp1.getFloat()) || Float.isNaN(floatp2.getFloat())) { return false; } @@ -259,8 +258,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateFloatInteger(FloatPointable floatp1, LongPointable longp2) throws SystemException, - IOException { + public boolean operateFloatInteger(FloatPointable floatp1, LongPointable longp2) + throws SystemException, IOException { float float1 = floatp1.floatValue(); float float2 = longp2.floatValue(); if (Float.isNaN(floatp1.getFloat())) { @@ -302,23 +301,23 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation @Override public boolean operateHexBinaryHexBinary(XSBinaryPointable binaryp1, XSBinaryPointable binaryp2) throws SystemException, IOException { - return arraysEqual(binaryp1.getByteArray(), binaryp1.getStartOffset(), binaryp1.getLength(), - binaryp2.getByteArray(), binaryp2.getStartOffset(), binaryp2.getLength()); + return FunctionHelper.arraysEqual(binaryp1, binaryp2); } @Override - public boolean operateIntegerDecimal(LongPointable longp1, XSDecimalPointable decp2) throws SystemException, - IOException { + public boolean operateIntegerDecimal(LongPointable longp1, XSDecimalPointable decp2) + throws SystemException, IOException { abvsInner.reset(); XSDecimalPointable decp1 = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable(); - decp1.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength()); + decp1.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), + XSDecimalPointable.TYPE_TRAITS.getFixedLength()); decp1.setDecimal(longp1.getLong(), (byte) 0); return (decp1.compareTo(decp2) == 0); } @Override - public boolean operateIntegerDouble(LongPointable longp1, DoublePointable doublep2) throws SystemException, - IOException { + public boolean operateIntegerDouble(LongPointable longp1, DoublePointable doublep2) + throws SystemException, IOException { double double1 = longp1.doubleValue(); double double2 = doublep2.doubleValue(); if (Double.isNaN(double2)) { @@ -328,8 +327,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateIntegerFloat(LongPointable longp1, FloatPointable floatp2) throws SystemException, - IOException { + public boolean operateIntegerFloat(LongPointable longp1, FloatPointable floatp2) + throws SystemException, IOException { float float1 = longp1.floatValue(); float float2 = floatp2.floatValue(); if (Float.isNaN(float2)) { @@ -339,8 +338,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateIntegerInteger(LongPointable longp1, LongPointable longp2) throws SystemException, - IOException { + public boolean operateIntegerInteger(LongPointable longp1, LongPointable longp2) + throws SystemException, IOException { return (longp1.compareTo(longp2) == 0); } @@ -351,15 +350,16 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateQNameQName(XSQNamePointable qnamep1, XSQNamePointable qnamep2) throws SystemException, - IOException { + public boolean operateQNameQName(XSQNamePointable qnamep1, XSQNamePointable qnamep2) + throws SystemException, IOException { int startOffsetLocalName1 = qnamep1.getStartOffset() + qnamep1.getUriLength() + qnamep1.getPrefixLength(); int startOffsetLocalName2 = qnamep2.getStartOffset() + qnamep2.getUriLength() + qnamep2.getPrefixLength(); // Only compare URI and LocalName. - return arraysEqual(qnamep1.getByteArray(), qnamep1.getStartOffset(), qnamep1.getUriLength(), + return FunctionHelper.arraysEqual(qnamep1.getByteArray(), qnamep1.getStartOffset(), qnamep1.getUriLength(), qnamep2.getByteArray(), qnamep2.getStartOffset(), qnamep2.getUriLength()) - && arraysEqual(qnamep1.getByteArray(), startOffsetLocalName1, qnamep1.getLocalNameLength(), - qnamep2.getByteArray(), startOffsetLocalName2, qnamep2.getLocalNameLength()); + && FunctionHelper.arraysEqual(qnamep1.getByteArray(), startOffsetLocalName1, + qnamep1.getLocalNameLength(), qnamep2.getByteArray(), startOffsetLocalName2, + qnamep2.getLocalNameLength()); } @Override @@ -387,8 +387,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateYMDurationDTDuration(IntegerPointable intp1, LongPointable longp2) throws SystemException, - IOException { + public boolean operateYMDurationDTDuration(IntegerPointable intp1, LongPointable longp2) + throws SystemException, IOException { if (intp1.getInteger() == 0 && longp2.getLong() == 0) { return true; } @@ -405,21 +405,9 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation } @Override - public boolean operateYMDurationYMDuration(IntegerPointable intp1, IntegerPointable intp2) throws SystemException, - IOException { + public boolean operateYMDurationYMDuration(IntegerPointable intp1, IntegerPointable intp2) + throws SystemException, IOException { return (intp1.compareTo(intp2) == 0); } - private boolean arraysEqual(byte[] bytes1, int offset1, int length1, byte[] bytes2, int offset2, int length2) { - if (length1 != length2) { - return false; - } - for (int i = 0; i < length1; ++i) { - if (bytes1[offset1 + i] != bytes2[offset2 + i]) { - return false; - } - } - return true; - } - } http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java index a57bf72..d8c4e68 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java @@ -456,9 +456,27 @@ public class FunctionHelper { throw new SystemException(ErrorCode.XPTY0004); } + public static boolean arraysEqual(IPointable p1, IPointable p2) { + return arraysEqual(p1.getByteArray(), p1.getStartOffset(), p1.getLength(), p2.getByteArray(), + p2.getStartOffset(), p2.getLength()); + } + + public static boolean arraysEqual(byte[] bytes1, int offset1, int length1, byte[] bytes2, int offset2, + int length2) { + if (length1 != length2) { + return false; + } + for (int i = 0; i < length1; ++i) { + if (bytes1[offset1 + i] != bytes2[offset2 + i]) { + return false; + } + } + return true; + } + public static boolean compareTaggedValues(AbstractValueComparisonOperation aOp, TaggedValuePointable tvp1, TaggedValuePointable tvp2, DynamicContext dCtx, TypedPointables tp1, TypedPointables tp2) - throws SystemException { + throws SystemException { int tid1 = getBaseTypeForComparisons(tvp1.getTag()); int tid2 = getBaseTypeForComparisons(tvp2.getTag()); http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/test/java/org/apache/vxquery/datamodel/AbstractPointableTest.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/test/java/org/apache/vxquery/datamodel/AbstractPointableTest.java b/vxquery-core/src/test/java/org/apache/vxquery/datamodel/AbstractPointableTest.java new file mode 100644 index 0000000..9343465 --- /dev/null +++ b/vxquery-core/src/test/java/org/apache/vxquery/datamodel/AbstractPointableTest.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.vxquery.datamodel; + +import java.io.DataOutput; +import java.io.IOException; + +import org.apache.hyracks.data.std.api.IPointable; +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; +import org.apache.vxquery.datamodel.builders.atomic.StringValueBuilder; +import org.apache.vxquery.datamodel.values.ValueTag; + +public class AbstractPointableTest { + private final ArrayBackedValueStorage abvsInput = new ArrayBackedValueStorage(); + private final StringValueBuilder svb = new StringValueBuilder(); + + protected void getTaggedValuePointable(Object value, IPointable result) throws IOException { + int start = abvsInput.getLength(); + if (value instanceof java.lang.Long) { + writeLong((Long) value, abvsInput.getDataOutput()); + } else if (value instanceof java.lang.Double) { + writeDouble((Double) value, abvsInput.getDataOutput()); + } else if (value instanceof java.lang.String) { + writeString((String) value, abvsInput.getDataOutput()); + } + result.set(abvsInput.getByteArray(), start, abvsInput.getLength() - start); + } + + protected void writeLong(Long value, DataOutput dOut) throws IOException { + dOut.write(ValueTag.XS_LONG_TAG); + dOut.writeLong(value); + } + + protected void writeDouble(Double value, DataOutput dOut) throws IOException { + dOut.write(ValueTag.XS_DOUBLE_TAG); + dOut.writeDouble(value); + } + + protected void writeString(String value, DataOutput dOut) throws IOException { + dOut.write(ValueTag.XS_STRING_TAG); + svb.write(value, dOut); + } + +} http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/test/java/org/apache/vxquery/datamodel/SequenceByteTest.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/test/java/org/apache/vxquery/datamodel/SequenceByteTest.java b/vxquery-core/src/test/java/org/apache/vxquery/datamodel/SequenceByteTest.java new file mode 100644 index 0000000..776b97a --- /dev/null +++ b/vxquery-core/src/test/java/org/apache/vxquery/datamodel/SequenceByteTest.java @@ -0,0 +1,147 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.vxquery.datamodel; + +import java.io.IOException; + +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; +import org.apache.vxquery.datamodel.accessors.SequencePointable; +import org.apache.vxquery.datamodel.accessors.TaggedValuePointable; +import org.apache.vxquery.datamodel.builders.sequence.SequenceBuilder; +import org.apache.vxquery.datamodel.values.ValueTag; +import org.apache.vxquery.datamodel.values.XDMConstants; +import org.apache.vxquery.runtime.functions.util.FunctionHelper; +import org.junit.Test; + +import junit.framework.Assert; + +/** + * The sequence byte test covers empty sequences, single items and multi-item sequences. + * + * 1. Empty sequence constant + * 2. Empty sequence - {} + * 3. Single item - "one" (XQuery single item sequences are just the item.) + * 4. Many items - {1, 2.0, "three"} + */ +public class SequenceByteTest extends AbstractPointableTest { + private final ArrayBackedValueStorage abvsResult = new ArrayBackedValueStorage(); + private final SequenceBuilder sb = new SequenceBuilder(); + private final TaggedValuePointable tvp = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + private final TaggedValuePointable tvp1 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + private final TaggedValuePointable tvp2 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + private final TaggedValuePointable tvp3 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + private final SequencePointable sp = (SequencePointable) SequencePointable.FACTORY.createPointable(); + + @Test + public void testEmptySequenceConstant() { + // Build test sequence + XDMConstants.setEmptySequence(tvp); + + // Check results. + if (tvp.getTag() != ValueTag.SEQUENCE_TAG) { + Assert.fail("Type tag is incorrect. Expected: " + ValueTag.SEQUENCE_TAG + " Got: " + tvp.getTag()); + } + tvp.getValue(sp); + if (sp.getEntryCount() != 0) { + Assert.fail("Sequence size is incorrect. Expected: 0 Got: " + sp.getEntryCount()); + } + } + + @Test + public void testEmptySequence() { + // Build test sequence + try { + sb.reset(abvsResult); + sb.finish(); + } catch (IOException e) { + Assert.fail("Test failed to write the sequence pointable."); + } + tvp.set(abvsResult); + + // Check results. + if (tvp.getTag() != ValueTag.SEQUENCE_TAG) { + Assert.fail("Type tag is incorrect. Expected: " + ValueTag.SEQUENCE_TAG + " Got: " + tvp.getTag()); + } + tvp.getValue(sp); + if (sp.getEntryCount() != 0) { + Assert.fail("Sequence size is incorrect. Expected: 0 Got: " + sp.getEntryCount()); + } + } + + @Test + public void testSingleItemSequence() { + // Build test sequence + try { + sb.reset(abvsResult); + getTaggedValuePointable("one", tvp1); + sb.addItem(tvp1); + sb.finish(); + } catch (IOException e) { + Assert.fail("Test failed to write the sequence pointable."); + } + tvp.set(abvsResult); + + // Check results. + if (tvp.getTag() != ValueTag.XS_STRING_TAG) { + Assert.fail("Type tag is incorrect. Expected: " + ValueTag.XS_STRING_TAG + " Got: " + tvp.getTag()); + } + if (!FunctionHelper.arraysEqual(tvp, tvp1)) { + Assert.fail("Item value is incorrect."); + } + } + + @Test + public void testManyItemSequence() { + // Build test sequence + try { + // Add three items + sb.reset(abvsResult); + getTaggedValuePointable(1, tvp1); + sb.addItem(tvp1); + getTaggedValuePointable(2.0, tvp2); + sb.addItem(tvp2); + getTaggedValuePointable("three", tvp3); + sb.addItem(tvp3); + sb.finish(); + } catch (IOException e) { + Assert.fail("Test failed to write the sequence pointable."); + } + tvp.set(abvsResult); + + // Check results. + if (tvp.getTag() != ValueTag.SEQUENCE_TAG) { + Assert.fail("Sequence tag is incorrect. Expected: " + ValueTag.SEQUENCE_TAG + " Got: " + tvp.getTag()); + } + tvp.getValue(sp); + if (sp.getEntryCount() != 3) { + Assert.fail("Sequence size is incorrect. Expected: 3 Got: " + sp.getEntryCount()); + } + sp.getEntry(0, tvp); + if (!FunctionHelper.arraysEqual(tvp, tvp1)) { + Assert.fail("Sequence item one is incorrect. Expected: " + ValueTag.XS_LONG_TAG + " Got: " + tvp.getTag()); + } + sp.getEntry(1, tvp); + if (!FunctionHelper.arraysEqual(tvp, tvp2)) { + Assert.fail( + "Sequence item two is incorrect. Expected: " + ValueTag.XS_DOUBLE_TAG + " Got: " + tvp.getTag()); + } + sp.getEntry(2, tvp); + if (!FunctionHelper.arraysEqual(tvp, tvp3)) { + Assert.fail( + "Sequence item three is incorrect. Expected: " + ValueTag.XS_STRING_TAG + " Got: " + tvp.getTag()); + } + } + +}
