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

Reply via email to