Repository: vxquery Updated Branches: refs/heads/master 26e95121e -> d9e8dc254
Some changes to array builder, pointable and unit test Project: http://git-wip-us.apache.org/repos/asf/vxquery/repo Commit: http://git-wip-us.apache.org/repos/asf/vxquery/commit/ed79cb02 Tree: http://git-wip-us.apache.org/repos/asf/vxquery/tree/ed79cb02 Diff: http://git-wip-us.apache.org/repos/asf/vxquery/diff/ed79cb02 Branch: refs/heads/master Commit: ed79cb0241786c4e202835eb84475268c343c56d Parents: fb0328d Author: Christina Pavlopoulou <[email protected]> Authored: Mon May 23 18:28:50 2016 -0700 Committer: Christina Pavlopoulou <[email protected]> Committed: Mon May 23 18:28:50 2016 -0700 ---------------------------------------------------------------------- .../accessors/jsonitem/ArrayPointable.java | 59 ++++++++++ .../builders/jsonitem/ArrayBuilder.java | 22 ++++ .../builders/jsonitem/JsonAbstractBuilder.java | 35 ++++++ .../vxquery/datamodel/values/ValueTag.java | 1 + .../apache/vxquery/datamodel/ArrayByteTest.java | 112 +++++++++++++++++++ 5 files changed, 229 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/vxquery/blob/ed79cb02/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/jsonitem/ArrayPointable.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/jsonitem/ArrayPointable.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/jsonitem/ArrayPointable.java new file mode 100644 index 0000000..0b15604 --- /dev/null +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/jsonitem/ArrayPointable.java @@ -0,0 +1,59 @@ +package org.apache.vxquery.datamodel.accessors.jsonitem; + +import org.apache.hyracks.api.dataflow.value.ITypeTraits; +import org.apache.hyracks.data.std.api.AbstractPointable; +import org.apache.hyracks.data.std.api.IPointable; +import org.apache.hyracks.data.std.api.IPointableFactory; +import org.apache.hyracks.data.std.primitive.IntegerPointable; +import org.apache.hyracks.data.std.primitive.VoidPointable; + +public class ArrayPointable extends AbstractPointable { + private static final int ENTRY_COUNT_SIZE = IntegerPointable.TYPE_TRAITS.getFixedLength(); + private static final int SLOT_SIZE = IntegerPointable.TYPE_TRAITS.getFixedLength(); + public static final IPointableFactory FACTORY = new IPointableFactory() { + private static final long serialVersionUID = 1L; + + @Override + public ITypeTraits getTypeTraits() { + return VoidPointable.TYPE_TRAITS; + } + + @Override + public IPointable createPointable() { + return new ArrayPointable(); + } + }; + + public int getEntryCount() { + return getEntryCount(bytes, start); + } + + private static int getEntryCount(byte[] bytes, int start) { + return IntegerPointable.getInteger(bytes, start); + } + + public void getEntry(int idx, IPointable pointer) { + int dataStart = getDataStart(bytes, start); + pointer.set(bytes, dataStart + getRelativeEntryStartOffset(idx), getEntryLength(idx)); + } + + private static int getEntryOffsetValue(byte[] bytes, int start, int idx) { + return IntegerPointable.getInteger(bytes, getOffsetsStart(start) + idx * SLOT_SIZE); + } + + private int getRelativeEntryStartOffset(int idx) { + return idx == 0 ? 0 : getEntryOffsetValue(bytes, start, idx - 1); + } + + private int getEntryLength(int idx) { + return getEntryOffsetValue(bytes, start, idx) - getRelativeEntryStartOffset(idx); + } + + private static int getOffsetsStart(int start) { + return start + ENTRY_COUNT_SIZE; + } + + private static int getDataStart(byte[] bytes, int start) { + return getOffsetsStart(start) + getEntryCount(bytes, start) * SLOT_SIZE; + } +} http://git-wip-us.apache.org/repos/asf/vxquery/blob/ed79cb02/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/jsonitem/ArrayBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/jsonitem/ArrayBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/jsonitem/ArrayBuilder.java new file mode 100644 index 0000000..3897cce --- /dev/null +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/jsonitem/ArrayBuilder.java @@ -0,0 +1,22 @@ +package org.apache.vxquery.datamodel.builders.jsonitem; + +import java.io.IOException; +import org.apache.hyracks.data.std.api.IValueReference; +import org.apache.vxquery.datamodel.values.ValueTag; + +public class ArrayBuilder extends JsonAbstractBuilder { + + public ArrayBuilder() { + } + + public void addItem(IValueReference p) throws IOException { + dataArea.getDataOutput().write(p.getByteArray(), p.getStartOffset(), p.getLength()); + slots.append(dataArea.getLength()); + } + + @Override + public int getValueTag() { + return ValueTag.ARRAY_TAG; + } + +} http://git-wip-us.apache.org/repos/asf/vxquery/blob/ed79cb02/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/jsonitem/JsonAbstractBuilder.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/jsonitem/JsonAbstractBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/jsonitem/JsonAbstractBuilder.java new file mode 100644 index 0000000..eb53da9 --- /dev/null +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/jsonitem/JsonAbstractBuilder.java @@ -0,0 +1,35 @@ +package org.apache.vxquery.datamodel.builders.jsonitem; + +import java.io.DataOutput; +import java.io.IOException; + +import org.apache.hyracks.data.std.api.IMutableValueStorage; +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; +import org.apache.vxquery.datamodel.builders.base.AbstractBuilder; +import org.apache.vxquery.datamodel.builders.base.IBuilder; +import org.apache.vxquery.util.GrowableIntArray; + +public abstract class JsonAbstractBuilder extends AbstractBuilder implements IBuilder { + final GrowableIntArray slots = new GrowableIntArray(); + final ArrayBackedValueStorage dataArea = new ArrayBackedValueStorage(); + protected DataOutput out; + + public void reset(IMutableValueStorage mvs) throws IOException { + out = mvs.getDataOutput(); + out.write(getValueTag()); + slots.clear(); + dataArea.reset(); + } + + public void finish() throws IOException { + int size = slots.getSize(); + out.writeInt(size); + if (size > 0) { + int[] slotArray = slots.getArray(); + for (int i = 0; i < size; ++i) { + out.writeInt(slotArray[i]); + } + out.write(dataArea.getByteArray(), dataArea.getStartOffset(), dataArea.getLength()); + } + } +} http://git-wip-us.apache.org/repos/asf/vxquery/blob/ed79cb02/vxquery-core/src/main/java/org/apache/vxquery/datamodel/values/ValueTag.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/values/ValueTag.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/values/ValueTag.java index e2c89e9..d2c8a9b 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/values/ValueTag.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/values/ValueTag.java @@ -82,6 +82,7 @@ public class ValueTag { public static final int COMMENT_NODE_TAG = 105; public static final int PI_NODE_TAG = 106; public static final int NODE_TREE_TAG = 107; + public static final int ARRAY_TAG = 108; public static boolean isAtomic(int tag) { return tag < 100; http://git-wip-us.apache.org/repos/asf/vxquery/blob/ed79cb02/vxquery-core/src/test/java/org/apache/vxquery/datamodel/ArrayByteTest.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/test/java/org/apache/vxquery/datamodel/ArrayByteTest.java b/vxquery-core/src/test/java/org/apache/vxquery/datamodel/ArrayByteTest.java new file mode 100644 index 0000000..68af1d5 --- /dev/null +++ b/vxquery-core/src/test/java/org/apache/vxquery/datamodel/ArrayByteTest.java @@ -0,0 +1,112 @@ +package org.apache.vxquery.datamodel; + +import java.io.IOException; + +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; +import org.apache.vxquery.datamodel.accessors.TaggedValuePointable; +import org.apache.vxquery.datamodel.accessors.jsonitem.ArrayPointable; +import org.apache.vxquery.datamodel.builders.jsonitem.ArrayBuilder; +import org.apache.vxquery.datamodel.values.ValueTag; +import org.apache.vxquery.runtime.functions.util.FunctionHelper; +import org.junit.Test; + +import junit.framework.Assert; + +public class ArrayByteTest extends AbstractPointableTest { + ArrayBackedValueStorage abvsResult = new ArrayBackedValueStorage(); + ArrayBuilder ab = new ArrayBuilder(); + TaggedValuePointable tvp = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + TaggedValuePointable tvp1 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + TaggedValuePointable tvp2 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + TaggedValuePointable tvp3 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + ArrayPointable ap = (ArrayPointable) ArrayPointable.FACTORY.createPointable(); + + @Test + public void testEmptyArray() { + // Build array sequence + try { + ab.reset(abvsResult); + ab.finish(); + } catch (IOException e) { + Assert.fail("Test failed to write the array pointable."); + } + tvp.set(abvsResult); + + // Check results. + if (tvp.getTag() != ValueTag.ARRAY_TAG) { + Assert.fail("Type tag is incorrect. Expected: " + ValueTag.ARRAY_TAG + " Got: " + tvp.getTag()); + } + tvp.getValue(ap); + if (ap.getEntryCount() != 0) { + Assert.fail("Array size is incorrect. Expected: 0 Got: " + ap.getEntryCount()); + } + } + + @Test + public void testSingleItemArray() { + // Build array sequence + try { + ab.reset(abvsResult); + getTaggedValuePointable(1, tvp1); + ab.addItem(tvp1); + ab.finish(); + } catch (IOException e) { + Assert.fail("Test failed to write the array pointable."); + } + tvp.set(abvsResult); + + // Check results. + if (tvp.getTag() != ValueTag.ARRAY_TAG) { + Assert.fail("Type tag is incorrect. Expected: " + ValueTag.ARRAY_TAG + " Got: " + tvp.getTag()); + } + tvp.getValue(ap); + if (ap.getEntryCount() != 1) { + Assert.fail("Array size is incorrect. Expected: 1 Got: " + ap.getEntryCount()); + } + ap.getEntry(0, tvp); + if (!FunctionHelper.arraysEqual(tvp, tvp1)) { + Assert.fail("Array item is incorrect. Expected: " + ValueTag.XS_INT_TAG + " Got: " + tvp.getTag()); + } + + } + + @Test + public void testManyItemsArray() { + // Build test array + try { + // Add three items + ab.reset(abvsResult); + getTaggedValuePointable(1, tvp1); + ab.addItem(tvp1); + getTaggedValuePointable(2.0, tvp2); + ab.addItem(tvp2); + getTaggedValuePointable("three", tvp3); + ab.addItem(tvp3); + ab.finish(); + } catch (IOException e) { + Assert.fail("Test failed to write the array pointable."); + } + tvp.set(abvsResult); + + // Check results. + if (tvp.getTag() != ValueTag.ARRAY_TAG) { + Assert.fail("Array tag is incorrect. Expected: " + ValueTag.ARRAY_TAG + " Got: " + tvp.getTag()); + } + tvp.getValue(ap); + if (ap.getEntryCount() != 3) { + Assert.fail("Array size is incorrect. Expected: 3 Got: " + ap.getEntryCount()); + } + ap.getEntry(0, tvp); + if (!FunctionHelper.arraysEqual(tvp, tvp1)) { + Assert.fail("Array item one is incorrect. Expected: " + ValueTag.XS_INT_TAG + " Got: " + tvp.getTag()); + } + ap.getEntry(1, tvp); + if (!FunctionHelper.arraysEqual(tvp, tvp2)) { + Assert.fail("Array item two is incorrect. Expected: " + ValueTag.XS_DOUBLE_TAG + " Got: " + tvp.getTag()); + } + ap.getEntry(2, tvp); + if (!FunctionHelper.arraysEqual(tvp, tvp3)) { + Assert.fail("Array item three is incorrect. Expected: " + ValueTag.XS_STRING_TAG + " Got: " + tvp.getTag()); + } + } +}
