Repository: vxquery Updated Branches: refs/heads/master 6b85b579e -> db52ac260
VXQUERY-227 Refactor ObjectPointable.getKeys() Project: http://git-wip-us.apache.org/repos/asf/vxquery/repo Commit: http://git-wip-us.apache.org/repos/asf/vxquery/commit/db52ac26 Tree: http://git-wip-us.apache.org/repos/asf/vxquery/tree/db52ac26 Diff: http://git-wip-us.apache.org/repos/asf/vxquery/diff/db52ac26 Branch: refs/heads/master Commit: db52ac260dd7e8e4ae56a113420a238da34065f1 Parents: 6b85b57 Author: riyafa <[email protected]> Authored: Thu Aug 18 14:11:45 2016 +0530 Committer: riyafa <[email protected]> Committed: Thu Nov 10 19:27:43 2016 +0530 ---------------------------------------------------------------------- .../accessors/ArrayBackedValueStoragePool.java | 25 +++++++ .../accessors/jsonitem/ObjectPointable.java | 10 ++- ...tractTaggedValueArgumentScalarEvaluator.java | 2 + .../AbstractLibjnAccumulateScalarEvaluator.java | 33 ++++++---- .../AbstractLibjnDescendantScalarEvaluator.java | 11 +++- .../AbstractLibjnProjectScalarEvaluator.java | 68 +++++++++++--------- .../functions/json/JnKeysScalarEvaluator.java | 30 ++++++--- .../json/JnParseJsonScalarEvaluatorFactory.java | 14 ++-- .../json/KeysOrMembersScalarEvaluator.java | 12 ++-- .../json/LibjnValuesScalarEvaluator.java | 15 +++-- ...bstractObjectConstructorScalarEvaluator.java | 2 - .../ObjectConstructorScalarEvaluator.java | 19 +++--- .../SimpleObjectUnionScalarEvaluator.java | 23 +++++-- .../vxquery/serializer/XMLSerializer.java | 5 +- .../vxquery/datamodel/ObjectByteTest.java | 11 ++-- 15 files changed, 183 insertions(+), 97 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/ArrayBackedValueStoragePool.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/ArrayBackedValueStoragePool.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/ArrayBackedValueStoragePool.java new file mode 100644 index 0000000..4c432a9 --- /dev/null +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/ArrayBackedValueStoragePool.java @@ -0,0 +1,25 @@ +package org.apache.vxquery.datamodel.accessors; + +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; + +import java.util.ArrayList; +import java.util.List; + +public class ArrayBackedValueStoragePool { + private final List<ArrayBackedValueStorage> abvsList; + + public ArrayBackedValueStoragePool() { + abvsList = new ArrayList<>(); + } + + public ArrayBackedValueStorage takeOne() { + if (abvsList.isEmpty()) { + return new ArrayBackedValueStorage(); + } + return abvsList.remove(abvsList.size() - 1); + } + + public void giveBack(ArrayBackedValueStorage abvs) { + abvsList.add(abvs); + } +} http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/jsonitem/ObjectPointable.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/jsonitem/ObjectPointable.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/jsonitem/ObjectPointable.java index 720f438..ac96210 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/jsonitem/ObjectPointable.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/jsonitem/ObjectPointable.java @@ -16,20 +16,20 @@ */ package org.apache.vxquery.datamodel.accessors.jsonitem; -import java.io.IOException; - import org.apache.hyracks.api.dataflow.value.ITypeTraits; import org.apache.hyracks.data.std.api.AbstractPointable; +import org.apache.hyracks.data.std.api.IMutableValueStorage; 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.UTF8StringPointable; import org.apache.hyracks.data.std.primitive.VoidPointable; -import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; import org.apache.vxquery.datamodel.builders.sequence.SequenceBuilder; import org.apache.vxquery.datamodel.values.ValueTag; import org.apache.vxquery.runtime.functions.util.FunctionHelper; +import java.io.IOException; + /** * The datamodel of the JSON object is represented in this class: * Byte 1: Value tag of object (109) @@ -54,7 +54,6 @@ public class ObjectPointable extends AbstractPointable { }; private static final int ENTRY_COUNT_SIZE = IntegerPointable.TYPE_TRAITS.getFixedLength(); private static final int SLOT_SIZE = IntegerPointable.TYPE_TRAITS.getFixedLength(); - private final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage(); private final SequenceBuilder sb = new SequenceBuilder(); private final UTF8StringPointable key = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable(); @@ -78,7 +77,7 @@ public class ObjectPointable extends AbstractPointable { return getSlotArrayOffset(start) + getEntryCount(bytes, start) * SLOT_SIZE; } - public void getKeys(IPointable result) throws IOException { + public void getKeys(IMutableValueStorage abvs) throws IOException { abvs.reset(); sb.reset(abvs); int dataAreaOffset = getDataAreaOffset(bytes, start); @@ -90,7 +89,6 @@ public class ObjectPointable extends AbstractPointable { sb.addItem(ValueTag.XS_STRING_TAG, key); } sb.finish(); - result.set(abvs); } //here the UTF8StringPointable of key is without the tag http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentScalarEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentScalarEvaluator.java index d7770b0..20f24f6 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentScalarEvaluator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentScalarEvaluator.java @@ -16,6 +16,7 @@ */ package org.apache.vxquery.runtime.functions.base; +import org.apache.vxquery.datamodel.accessors.ArrayBackedValueStoragePool; import org.apache.vxquery.datamodel.accessors.PointablePool; import org.apache.vxquery.datamodel.accessors.PointablePoolFactory; import org.apache.vxquery.datamodel.accessors.TaggedValuePointable; @@ -32,6 +33,7 @@ public abstract class AbstractTaggedValueArgumentScalarEvaluator implements ISca private final TaggedValuePointable[] tvps; protected final PointablePool ppool = PointablePoolFactory.INSTANCE.createPointablePool(); + protected final ArrayBackedValueStoragePool abvsPool = new ArrayBackedValueStoragePool(); public AbstractTaggedValueArgumentScalarEvaluator(IScalarEvaluator[] args) { this.args = args; http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnAccumulateScalarEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnAccumulateScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnAccumulateScalarEvaluator.java index 90dc034..3d5a842 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnAccumulateScalarEvaluator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnAccumulateScalarEvaluator.java @@ -46,9 +46,10 @@ public abstract class AbstractLibjnAccumulateScalarEvaluator extends AbstractTag private final ArrayBuilder ab; protected TaggedValuePointable key, value; private final UTF8StringPointable stringKey; - private final ArrayBackedValueStorage abvs, abvs1; + private final List<ArrayBackedValueStorage> abvsList; private final Map<TaggedValuePointable, List<TaggedValuePointable>> tvps; protected List<TaggedValuePointable> values; + protected final ObjectPointable op; public AbstractLibjnAccumulateScalarEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) { super(args); @@ -56,12 +57,11 @@ public abstract class AbstractLibjnAccumulateScalarEvaluator extends AbstractTag sp = (SequencePointable) SequencePointable.FACTORY.createPointable(); sp1 = (SequencePointable) SequencePointable.FACTORY.createPointable(); stringKey = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable(); - abvs = new ArrayBackedValueStorage(); - abvs1 = new ArrayBackedValueStorage(); ob = new ObjectBuilder(); ab = new ArrayBuilder(); tvps = new LinkedHashMap<>(); - + op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); + abvsList = new ArrayList<>(); } @Override @@ -71,9 +71,13 @@ public abstract class AbstractLibjnAccumulateScalarEvaluator extends AbstractTag throw new SystemException(ErrorCode.FORG0006); } TaggedValuePointable tempTvp = ppool.takeOne(TaggedValuePointable.class); + ArrayBackedValueStorage abvsResult = abvsPool.takeOne(); + abvsList.add(abvsResult); + ArrayBackedValueStorage abvsItem = abvsPool.takeOne(); + abvsList.add(abvsItem); try { - abvs.reset(); - ob.reset(abvs); + abvsResult.reset(); + ob.reset(abvsResult); tvps.clear(); if (arg.getTag() == ValueTag.SEQUENCE_TAG) { arg.getValue(sp); @@ -92,13 +96,13 @@ public abstract class AbstractLibjnAccumulateScalarEvaluator extends AbstractTag if (values.size() > 1) { FunctionHelper.removeDuplicates(values); if (values.size() > 1) { - abvs1.reset(); - ab.reset(abvs1); + abvsItem.reset(); + ab.reset(abvsItem); for (TaggedValuePointable pointable : values) { ab.addItem(pointable); } ab.finish(); - ob.addItem(stringKey, abvs1); + ob.addItem(stringKey, abvsItem); } else { ob.addItem(stringKey, values.get(0)); } @@ -107,7 +111,7 @@ public abstract class AbstractLibjnAccumulateScalarEvaluator extends AbstractTag } } ob.finish(); - result.set(abvs); + result.set(abvsResult); } catch (IOException e) { throw new SystemException(ErrorCode.SYSE0001, e); } finally { @@ -118,6 +122,9 @@ public abstract class AbstractLibjnAccumulateScalarEvaluator extends AbstractTag } ppool.giveBack(key1); } + for (ArrayBackedValueStorage arrayBackedValueStorage : abvsList) { + abvsPool.giveBack(arrayBackedValueStorage); + } } } @@ -141,9 +148,11 @@ public abstract class AbstractLibjnAccumulateScalarEvaluator extends AbstractTag } private void addPairs(TaggedValuePointable tvp1) throws IOException, SystemException { - ObjectPointable op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); + ArrayBackedValueStorage mvs = abvsPool.takeOne(); + abvsList.add(mvs); tvp1.getValue(op); - op.getKeys(tvp1); + op.getKeys(mvs); + tvp1.set(mvs); if (tvp1.getTag() == ValueTag.XS_STRING_TAG) { addPair(tvp1, op); } else if (tvp1.getTag() == ValueTag.SEQUENCE_TAG) { http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnDescendantScalarEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnDescendantScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnDescendantScalarEvaluator.java index 7083291..a600865 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnDescendantScalarEvaluator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnDescendantScalarEvaluator.java @@ -38,7 +38,6 @@ public abstract class AbstractLibjnDescendantScalarEvaluator extends AbstractTag protected final UTF8StringPointable stringp; protected final SequencePointable sp, sp1; protected final SequenceBuilder sb; - protected final ArrayBackedValueStorage abvs; public AbstractLibjnDescendantScalarEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) { super(args); @@ -47,11 +46,12 @@ public abstract class AbstractLibjnDescendantScalarEvaluator extends AbstractTag sp = (SequencePointable) SequencePointable.FACTORY.createPointable(); sp1 = (SequencePointable) SequencePointable.FACTORY.createPointable(); sb = new SequenceBuilder(); - abvs = new ArrayBackedValueStorage(); } @Override protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException { + + ArrayBackedValueStorage abvs = abvsPool.takeOne(); try { abvs.reset(); sb.reset(abvs); @@ -72,14 +72,18 @@ public abstract class AbstractLibjnDescendantScalarEvaluator extends AbstractTag result.set(abvs); } catch (IOException e) { throw new SystemException(ErrorCode.SYSE0001, e); + } finally { + abvsPool.giveBack(abvs); } } protected void processObject(TaggedValuePointable tvp) throws IOException { TaggedValuePointable tempTvp = ppool.takeOne(TaggedValuePointable.class); ObjectPointable tempOp = ppool.takeOne(ObjectPointable.class); + ArrayBackedValueStorage abvs = abvsPool.takeOne(); tvp.getValue(tempOp); - tempOp.getKeys(tempTvp); + tempOp.getKeys(abvs); + tempTvp.set(abvs); if (tempTvp.getTag() == ValueTag.XS_STRING_TAG) { processPair(tempTvp, tempOp); process(tempTvp); @@ -94,6 +98,7 @@ public abstract class AbstractLibjnDescendantScalarEvaluator extends AbstractTag } ppool.giveBack(tempOp); ppool.giveBack(tempTvp); + abvsPool.giveBack(abvs); } protected abstract void processPair(TaggedValuePointable tempTvp, ObjectPointable tempOp) throws IOException; http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnProjectScalarEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnProjectScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnProjectScalarEvaluator.java index d81cc7d..a0b34a8 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnProjectScalarEvaluator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/AbstractLibjnProjectScalarEvaluator.java @@ -39,7 +39,6 @@ public abstract class AbstractLibjnProjectScalarEvaluator extends AbstractTagged protected final ObjectPointable op; protected final UTF8StringPointable stringKey; protected final ObjectBuilder ob; - protected final ArrayBackedValueStorage abvs, abvs1; protected final SequenceBuilder sb; protected final SequencePointable sp1; protected final TaggedValuePointable tvp1; @@ -49,8 +48,6 @@ public abstract class AbstractLibjnProjectScalarEvaluator extends AbstractTagged this.ctx = ctx; stringKey = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable(); ob = new ObjectBuilder(); - abvs = new ArrayBackedValueStorage(); - abvs1 = new ArrayBackedValueStorage(); sb = new SequenceBuilder(); op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); sp1 = (SequencePointable) SequencePointable.FACTORY.createPointable(); @@ -66,16 +63,19 @@ public abstract class AbstractLibjnProjectScalarEvaluator extends AbstractTagged } TaggedValuePointable tempTvp = ppool.takeOne(TaggedValuePointable.class); SequencePointable sp = ppool.takeOne(SequencePointable.class); + ArrayBackedValueStorage abvsKeys = abvsPool.takeOne(); + ArrayBackedValueStorage abvsResult = abvsPool.takeOne(); try { - abvs1.reset(); - sb.reset(abvs1); + abvsResult.reset(); + sb.reset(abvsResult); if (sequence.getTag() == ValueTag.SEQUENCE_TAG) { sequence.getValue(sp); for (int i = 0; i < sp.getEntryCount(); ++i) { sp.getEntry(i, tempTvp); if (tempTvp.getTag() == ValueTag.OBJECT_TAG) { tempTvp.getValue(op); - op.getKeys(tempTvp); + op.getKeys(abvsKeys); + tempTvp.set(abvsKeys); addPairs(tempTvp, keys); } else { sb.addItem(tempTvp); @@ -88,12 +88,14 @@ public abstract class AbstractLibjnProjectScalarEvaluator extends AbstractTagged sb.addItem(sequence); } sb.finish(); - result.set(abvs1); + result.set(abvsResult); } catch (IOException e) { throw new SystemException(ErrorCode.SYSE0001, e); } finally { ppool.giveBack(tempTvp); ppool.giveBack(sp); + abvsPool.giveBack(abvsResult); + abvsPool.giveBack(abvsKeys); } } @@ -105,33 +107,39 @@ public abstract class AbstractLibjnProjectScalarEvaluator extends AbstractTagged } private void addPairs(TaggedValuePointable tvp2, TaggedValuePointable keys) throws IOException, SystemException { - op.getKeys(tvp2); - if (tvp2.getTag() == ValueTag.XS_STRING_TAG) { - if (keyCheck(tvp2, keys)) { - abvs.reset(); - ob.reset(abvs); - addPair(tvp2, tvp1); - ob.finish(); - sb.addItem(abvs); - } - } else if (tvp2.getTag() == ValueTag.SEQUENCE_TAG) { - tvp2.getValue(sp1); - boolean found = false; - for (int j = 0; j < sp1.getEntryCount(); ++j) { - sp1.getEntry(j, tvp2); + ArrayBackedValueStorage abvs = abvsPool.takeOne(); + try { + op.getKeys(abvs); + tvp2.set(abvs); + if (tvp2.getTag() == ValueTag.XS_STRING_TAG) { if (keyCheck(tvp2, keys)) { - if (!found) { - abvs.reset(); - ob.reset(abvs); - found = true; - } + abvs.reset(); + ob.reset(abvs); addPair(tvp2, tvp1); + ob.finish(); + sb.addItem(abvs); + } + } else if (tvp2.getTag() == ValueTag.SEQUENCE_TAG) { + tvp2.getValue(sp1); + boolean found = false; + for (int j = 0; j < sp1.getEntryCount(); ++j) { + sp1.getEntry(j, tvp2); + if (keyCheck(tvp2, keys)) { + if (!found) { + abvs.reset(); + ob.reset(abvs); + found = true; + } + addPair(tvp2, tvp1); + } + } + if (found) { + ob.finish(); + sb.addItem(abvs); } } - if (found) { - ob.finish(); - sb.addItem(abvs); - } + } finally { + abvsPool.giveBack(abvs); } } http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/JnKeysScalarEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/JnKeysScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/JnKeysScalarEvaluator.java index c90472e..07283e6 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/JnKeysScalarEvaluator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/JnKeysScalarEvaluator.java @@ -39,8 +39,8 @@ public class JnKeysScalarEvaluator extends AbstractTaggedValueArgumentScalarEval protected final IHyracksTaskContext ctx; private final SequencePointable sp1, sp2; private final SequenceBuilder sb; - private final ArrayBackedValueStorage abvs; private List<TaggedValuePointable> pointables; + private final ObjectPointable op; public JnKeysScalarEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) { super(args); @@ -48,17 +48,19 @@ public class JnKeysScalarEvaluator extends AbstractTaggedValueArgumentScalarEval sp1 = (SequencePointable) SequencePointable.FACTORY.createPointable(); sp2 = (SequencePointable) SequencePointable.FACTORY.createPointable(); sb = new SequenceBuilder(); - abvs = new ArrayBackedValueStorage(); pointables = new ArrayList<>(); + op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); } @Override protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException { TaggedValuePointable tvp1 = args[0]; - ObjectPointable op; pointables.clear(); if (tvp1.getTag() == ValueTag.SEQUENCE_TAG) { + List<ArrayBackedValueStorage> abvsList = new ArrayList<>(); TaggedValuePointable temptvp = ppool.takeOne(TaggedValuePointable.class); + ArrayBackedValueStorage abvsResult = abvsPool.takeOne(); + abvsList.add(abvsResult); try { tvp1.getValue(sp1); int size1 = sp1.getEntryCount(); @@ -66,9 +68,11 @@ public class JnKeysScalarEvaluator extends AbstractTaggedValueArgumentScalarEval for (int i = 0; i < size1; i++) { sp1.getEntry(i, temptvp); if (temptvp.getTag() == ValueTag.OBJECT_TAG) { - op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); temptvp.getValue(op); - op.getKeys(temptvp); + ArrayBackedValueStorage abvsKeys = new ArrayBackedValueStorage(); + abvsList.add(abvsKeys); + op.getKeys(abvsKeys); + temptvp.set(abvsKeys); temptvp.getValue(sp2); size2 = sp2.getEntryCount(); for (int j = 0; j < size2; j++) { @@ -80,25 +84,31 @@ public class JnKeysScalarEvaluator extends AbstractTaggedValueArgumentScalarEval } } FunctionHelper.removeDuplicates(pointables); - abvs.reset(); - sb.reset(abvs); + abvsResult.reset(); + sb.reset(abvsResult); for (TaggedValuePointable tvp : pointables) { sb.addItem(tvp); } sb.finish(); - result.set(abvs); + result.set(abvsResult); } catch (IOException e) { throw new SystemException(ErrorCode.SYSE0001, e); } finally { + for (ArrayBackedValueStorage arrayBackedValueStorage : abvsList) { + abvsPool.giveBack(arrayBackedValueStorage); + } ppool.giveBack(temptvp); } } else if (tvp1.getTag() == ValueTag.OBJECT_TAG) { + ArrayBackedValueStorage abvsResult = abvsPool.takeOne(); try { - op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); tvp1.getValue(op); - op.getKeys(result); + op.getKeys(abvsResult); + result.set(abvsResult); } catch (IOException e) { throw new SystemException(ErrorCode.SYSE0001, e); + } finally { + abvsPool.giveBack(abvsResult); } } else { XDMConstants.setEmptySequence(result); http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/JnParseJsonScalarEvaluatorFactory.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/JnParseJsonScalarEvaluatorFactory.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/JnParseJsonScalarEvaluatorFactory.java index 8c7951c..772118e 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/JnParseJsonScalarEvaluatorFactory.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/JnParseJsonScalarEvaluatorFactory.java @@ -16,11 +16,6 @@ */ package org.apache.vxquery.runtime.functions.json; -import java.io.BufferedReader; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStreamReader; - import org.apache.commons.io.IOUtils; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; @@ -42,6 +37,11 @@ import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScal import org.apache.vxquery.runtime.functions.util.FunctionHelper; import org.apache.vxquery.xmlparser.IParser; +import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStreamReader; + public class JnParseJsonScalarEvaluatorFactory extends AbstractTaggedValueArgumentScalarEvaluatorFactory { private static final long serialVersionUID = 1L; @@ -60,6 +60,7 @@ public class JnParseJsonScalarEvaluatorFactory extends AbstractTaggedValueArgume final ByteBufferInputStream bbis = new ByteBufferInputStream(); final DataInputStream di = new DataInputStream(bbis); final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage(); + final ArrayBackedValueStorage abvs1 = new ArrayBackedValueStorage(); return new AbstractTaggedValueArgumentScalarEvaluator(args) { @@ -82,7 +83,8 @@ public class JnParseJsonScalarEvaluatorFactory extends AbstractTaggedValueArgume tvp1.getValue(op); TaggedValuePointable tempTvp = ppool.takeOne(TaggedValuePointable.class); try { - op.getKeys(tvp1); + op.getKeys(abvs1); + tvp1.set(abvs1); tvp1.getValue(stringp2); op.getValue(stringp2, tempTvp); } catch (IOException e1) { http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/KeysOrMembersScalarEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/KeysOrMembersScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/KeysOrMembersScalarEvaluator.java index b19985a..d255345 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/KeysOrMembersScalarEvaluator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/KeysOrMembersScalarEvaluator.java @@ -16,8 +16,6 @@ */ package org.apache.vxquery.runtime.functions.json; -import java.io.IOException; - import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; import org.apache.hyracks.api.context.IHyracksTaskContext; import org.apache.hyracks.data.std.api.IPointable; @@ -31,11 +29,12 @@ import org.apache.vxquery.exceptions.ErrorCode; import org.apache.vxquery.exceptions.SystemException; import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator; +import java.io.IOException; + public class KeysOrMembersScalarEvaluator extends AbstractTaggedValueArgumentScalarEvaluator { protected final IHyracksTaskContext ctx; private final ObjectPointable op; private final ArrayPointable ap; - private final ArrayBackedValueStorage abvs; private final SequenceBuilder sb; private final TaggedValuePointable tempTvp; @@ -44,7 +43,6 @@ public class KeysOrMembersScalarEvaluator extends AbstractTaggedValueArgumentSca this.ctx = ctx; op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); ap = (ArrayPointable) ArrayPointable.FACTORY.createPointable(); - abvs = new ArrayBackedValueStorage(); sb = new SequenceBuilder(); tempTvp = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); } @@ -52,11 +50,13 @@ public class KeysOrMembersScalarEvaluator extends AbstractTaggedValueArgumentSca @Override protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException { final TaggedValuePointable tvp = args[0]; + ArrayBackedValueStorage abvs = abvsPool.takeOne(); try { switch (tvp.getTag()) { case ValueTag.OBJECT_TAG: tvp.getValue(op); - op.getKeys(result); + op.getKeys(abvs); + result.set(abvs); break; case ValueTag.ARRAY_TAG: abvs.reset(); @@ -71,6 +71,8 @@ public class KeysOrMembersScalarEvaluator extends AbstractTaggedValueArgumentSca } } catch (IOException e) { throw new SystemException(ErrorCode.SYSE0001, e); + } finally { + abvsPool.giveBack(abvs); } } } http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluator.java index 70ffcd8..6809562 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/json/LibjnValuesScalarEvaluator.java @@ -36,14 +36,12 @@ public class LibjnValuesScalarEvaluator extends AbstractTaggedValueArgumentScala protected final IHyracksTaskContext ctx; private final ObjectPointable op; private final UTF8StringPointable stringKey; - private final ArrayBackedValueStorage abvs1; private final SequenceBuilder sb; public LibjnValuesScalarEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) { super(args); this.ctx = ctx; stringKey = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable(); - abvs1 = new ArrayBackedValueStorage(); sb = new SequenceBuilder(); op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); } @@ -54,9 +52,10 @@ public class LibjnValuesScalarEvaluator extends AbstractTaggedValueArgumentScala TaggedValuePointable tempTvp = ppool.takeOne(TaggedValuePointable.class); SequencePointable sp = ppool.takeOne(SequencePointable.class); + ArrayBackedValueStorage abvs = abvsPool.takeOne(); try { - abvs1.reset(); - sb.reset(abvs1); + abvs.reset(); + sb.reset(abvs); if (sequence.getTag() == ValueTag.SEQUENCE_TAG) { sequence.getValue(sp); for (int i = 0; i < sp.getEntryCount(); ++i) { @@ -71,20 +70,23 @@ public class LibjnValuesScalarEvaluator extends AbstractTaggedValueArgumentScala addValues(tempTvp); } sb.finish(); - result.set(abvs1); + result.set(abvs); } catch (IOException e) { throw new SystemException(ErrorCode.SYSE0001, e); } finally { ppool.giveBack(tempTvp); ppool.giveBack(sp); + abvsPool.giveBack(abvs); } } private void addValues(TaggedValuePointable tempTvp) throws IOException, SystemException { TaggedValuePointable tempValue = ppool.takeOne(TaggedValuePointable.class); SequencePointable sp1 = ppool.takeOne(SequencePointable.class); + ArrayBackedValueStorage abvsKeys = abvsPool.takeOne(); try { - op.getKeys(tempTvp); + op.getKeys(abvsKeys); + tempTvp.set(abvsKeys); if (tempTvp.getTag() == ValueTag.XS_STRING_TAG) { tempTvp.getValue(stringKey); op.getValue(stringKey, tempValue); @@ -101,6 +103,7 @@ public class LibjnValuesScalarEvaluator extends AbstractTaggedValueArgumentScala } finally { ppool.giveBack(tempValue); ppool.giveBack(sp1); + abvsPool.giveBack(abvsKeys); } } http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/AbstractObjectConstructorScalarEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/AbstractObjectConstructorScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/AbstractObjectConstructorScalarEvaluator.java index 810de40..77ffc7d 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/AbstractObjectConstructorScalarEvaluator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/AbstractObjectConstructorScalarEvaluator.java @@ -31,14 +31,12 @@ import java.util.List; public abstract class AbstractObjectConstructorScalarEvaluator extends AbstractTaggedValueArgumentScalarEvaluator { protected final IHyracksTaskContext ctx; protected final ObjectBuilder ob; - protected final ArrayBackedValueStorage abvs; protected final List<TaggedValuePointable> tvps; public AbstractObjectConstructorScalarEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) { super(args); this.ctx = ctx; ob = new ObjectBuilder(); - abvs = new ArrayBackedValueStorage(); tvps = new ArrayList<>(); } http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/ObjectConstructorScalarEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/ObjectConstructorScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/ObjectConstructorScalarEvaluator.java index 0d718a4..6cde2c7 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/ObjectConstructorScalarEvaluator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/ObjectConstructorScalarEvaluator.java @@ -37,13 +37,11 @@ public class ObjectConstructorScalarEvaluator extends AbstractObjectConstructorS private IPointable vp; private UTF8StringPointable sp; private SequencePointable seqp; - private final ArrayBackedValueStorage abvs1; private final BooleanPointable bp; private final ArrayBuilder ab; public ObjectConstructorScalarEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) { super(ctx, args); - abvs1 = new ArrayBackedValueStorage(); vp = VoidPointable.FACTORY.createPointable(); sp = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable(); seqp = (SequencePointable) SequencePointable.FACTORY.createPointable(); @@ -54,9 +52,11 @@ public class ObjectConstructorScalarEvaluator extends AbstractObjectConstructorS @Override protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException { TaggedValuePointable key, value, qmc, tvp; + ArrayBackedValueStorage abvsResult = abvsPool.takeOne(); + ArrayBackedValueStorage abvsItem = abvsPool.takeOne(); try { - abvs.reset(); - ob.reset(abvs); + abvsResult.reset(); + ob.reset(abvsResult); tvps.clear(); int len = args.length; for (int i = 0; i < len; i += 3) { @@ -76,15 +76,15 @@ public class ObjectConstructorScalarEvaluator extends AbstractObjectConstructorS XDMConstants.setJsNull(value); ob.addItem(sp, value); } else { - abvs1.reset(); - ab.reset(abvs1); + abvsItem.reset(); + ab.reset(abvsItem); int l = seqp.getEntryCount(); for (int j = 0; j < l; j++) { seqp.getEntry(j, value); ab.addItem(value); } ab.finish(); - vp.set(abvs1); + vp.set(abvsItem); ob.addItem(sp, vp); } } else { @@ -96,9 +96,12 @@ public class ObjectConstructorScalarEvaluator extends AbstractObjectConstructorS } ob.finish(); - result.set(abvs); + result.set(abvsResult); } catch (IOException e) { throw new SystemException(ErrorCode.SYSE0001, e); + } finally { + abvsPool.giveBack(abvsResult); + abvsPool.giveBack(abvsItem); } } } http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluator.java index 2b13a9f..a66fad1 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/jsonitem/SimpleObjectUnionScalarEvaluator.java @@ -20,6 +20,7 @@ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; import org.apache.hyracks.api.context.IHyracksTaskContext; import org.apache.hyracks.data.std.api.IPointable; import org.apache.hyracks.data.std.primitive.UTF8StringPointable; +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.accessors.jsonitem.ObjectPointable; @@ -28,19 +29,24 @@ import org.apache.vxquery.exceptions.ErrorCode; import org.apache.vxquery.exceptions.SystemException; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; public class SimpleObjectUnionScalarEvaluator extends AbstractObjectConstructorScalarEvaluator { private final SequencePointable sp, sp1; - private ObjectPointable op; + private final ObjectPointable op; private TaggedValuePointable key; private final UTF8StringPointable stringKey; + private final List<ArrayBackedValueStorage> abvsList; public SimpleObjectUnionScalarEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) { super(ctx, args); sp = (SequencePointable) SequencePointable.FACTORY.createPointable(); sp1 = (SequencePointable) SequencePointable.FACTORY.createPointable(); stringKey = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable(); + op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); + abvsList = new ArrayList<>(); } @Override @@ -51,6 +57,9 @@ public class SimpleObjectUnionScalarEvaluator extends AbstractObjectConstructorS } TaggedValuePointable tempTvp = ppool.takeOne(TaggedValuePointable.class); TaggedValuePointable tempValue = ppool.takeOne(TaggedValuePointable.class); + ArrayBackedValueStorage abvs = abvsPool.takeOne(); + abvsList.add(abvs); + try { abvs.reset(); ob.reset(abvs); @@ -58,13 +67,13 @@ public class SimpleObjectUnionScalarEvaluator extends AbstractObjectConstructorS if (arg.getTag() == ValueTag.SEQUENCE_TAG) { arg.getValue(sp); for (int i = 0; i < sp.getEntryCount(); ++i) { - op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); + sp.getEntry(i, tempTvp); tempTvp.getValue(op); addPairs(tempTvp, tempValue); } } else if (arg.getTag() == ValueTag.OBJECT_TAG) { - op = (ObjectPointable) ObjectPointable.FACTORY.createPointable(); + arg.getValue(op); addPairs(tempTvp, tempValue); } @@ -77,6 +86,9 @@ public class SimpleObjectUnionScalarEvaluator extends AbstractObjectConstructorS for (TaggedValuePointable pointable : tvps) { ppool.giveBack(pointable); } + for (ArrayBackedValueStorage arrayBackedValueStorage : abvsList) { + abvsPool.giveBack(arrayBackedValueStorage); + } } } @@ -96,7 +108,10 @@ public class SimpleObjectUnionScalarEvaluator extends AbstractObjectConstructorS private void addPairs(TaggedValuePointable tempTvp, TaggedValuePointable tempValue) throws IOException, SystemException { - op.getKeys(tempTvp); + ArrayBackedValueStorage abvs = abvsPool.takeOne(); + abvsList.add(abvs); + op.getKeys(abvs); + tempTvp.set(abvs); if (tempTvp.getTag() == ValueTag.XS_STRING_TAG) { addPair(tempTvp, tempValue); } else if (tempTvp.getTag() == ValueTag.SEQUENCE_TAG) { http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/main/java/org/apache/vxquery/serializer/XMLSerializer.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/serializer/XMLSerializer.java b/vxquery-core/src/main/java/org/apache/vxquery/serializer/XMLSerializer.java index ee08891..984ab81 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/serializer/XMLSerializer.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/serializer/XMLSerializer.java @@ -361,9 +361,12 @@ public class XMLSerializer implements IPrinter { private void printObject(PrintStream ps, TaggedValuePointable tvp) { ObjectPointable op = pp.takeOne(ObjectPointable.class); TaggedValuePointable keys = pp.takeOne(TaggedValuePointable.class); + ArrayBackedValueStorage mvs = new ArrayBackedValueStorage(); + tvp.getValue(op); try { - op.getKeys(keys); + op.getKeys(mvs); + keys.set(mvs); ps.append('{'); if (keys.getTag() == ValueTag.SEQUENCE_TAG) { printObjectPairs(ps, keys, op); http://git-wip-us.apache.org/repos/asf/vxquery/blob/db52ac26/vxquery-core/src/test/java/org/apache/vxquery/datamodel/ObjectByteTest.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/test/java/org/apache/vxquery/datamodel/ObjectByteTest.java b/vxquery-core/src/test/java/org/apache/vxquery/datamodel/ObjectByteTest.java index 265f316..56d689f 100644 --- a/vxquery-core/src/test/java/org/apache/vxquery/datamodel/ObjectByteTest.java +++ b/vxquery-core/src/test/java/org/apache/vxquery/datamodel/ObjectByteTest.java @@ -14,8 +14,6 @@ */ package org.apache.vxquery.datamodel; -import java.io.IOException; - import org.apache.hyracks.data.std.api.IPointable; import org.apache.hyracks.data.std.primitive.UTF8StringPointable; import org.apache.hyracks.data.std.primitive.VoidPointable; @@ -29,8 +27,11 @@ import org.apache.vxquery.runtime.functions.util.FunctionHelper; import org.junit.Assert; import org.junit.Test; +import java.io.IOException; + public class ObjectByteTest extends AbstractPointableTest { private ArrayBackedValueStorage abvsResult = new ArrayBackedValueStorage(); + private ArrayBackedValueStorage abvsKeys = new ArrayBackedValueStorage(); private ObjectBuilder ob = new ObjectBuilder(); private TaggedValuePointable tvp = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); private UTF8StringPointable tvpKey1 = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable(); @@ -90,7 +91,8 @@ public class ObjectByteTest extends AbstractPointableTest { Assert.fail("Object size is incorrect. Expected: 1 Got: " + op.getEntryCount()); } try { - op.getKeys(tvp); + op.getKeys(abvsKeys); + tvp.set(abvsKeys); } catch (IOException e) { Assert.fail("Test failed to write the object pointable."); } @@ -142,7 +144,8 @@ public class ObjectByteTest extends AbstractPointableTest { //Test keys try { - op.getKeys(tvp); + op.getKeys(abvsKeys); + tvp.set(abvsKeys); } catch (IOException e) { Assert.fail("Test failed to write the object pointable."); }
