VXQUERY-227 Refactor ObjectPointable.getKeys()
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);
+ }
+}
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 @@
};
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 @@
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 @@
sb.addItem(ValueTag.XS_STRING_TAG, key);
}
sb.finish();
- result.set(abvs);
}
//here the UTF8StringPointable of key is without the tag
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 @@
private final TaggedValuePointable[] tvps;
protected final PointablePool ppool = PointablePoolFactory.INSTANCE.createPointablePool();
+ protected final ArrayBackedValueStoragePool abvsPool = new ArrayBackedValueStoragePool();
public AbstractTaggedValueArgumentScalarEvaluator(IScalarEvaluator[] args) {
this.args = args;
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 @@
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 @@
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 @@
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 @@
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 @@
}
}
ob.finish();
- result.set(abvs);
+ result.set(abvsResult);
} catch (IOException e) {
throw new SystemException(ErrorCode.SYSE0001, e);
} finally {
@@ -118,6 +122,9 @@
}
ppool.giveBack(key1);
}
+ for (ArrayBackedValueStorage arrayBackedValueStorage : abvsList) {
+ abvsPool.giveBack(arrayBackedValueStorage);
+ }
}
}
@@ -141,9 +148,11 @@
}
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) {
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 @@
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 @@
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 @@
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 @@
}
ppool.giveBack(tempOp);
ppool.giveBack(tempTvp);
+ abvsPool.giveBack(abvs);
}
protected abstract void processPair(TaggedValuePointable tempTvp, ObjectPointable tempOp) throws IOException;
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 @@
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 @@
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 @@
}
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 @@
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 @@
}
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);
}
}
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 @@
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 @@
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 @@
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 @@
}
}
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);
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.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 @@
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 @@
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) {
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.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 @@
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 @@
@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 @@
}
} catch (IOException e) {
throw new SystemException(ErrorCode.SYSE0001, e);
+ } finally {
+ abvsPool.giveBack(abvs);
}
}
}
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 @@
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 @@
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 @@
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 @@
} finally {
ppool.giveBack(tempValue);
ppool.giveBack(sp1);
+ abvsPool.giveBack(abvsKeys);
}
}
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 @@
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<>();
}
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 @@
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 @@
@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 @@
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 @@
}
ob.finish();
- result.set(abvs);
+ result.set(abvsResult);
} catch (IOException e) {
throw new SystemException(ErrorCode.SYSE0001, e);
+ } finally {
+ abvsPool.giveBack(abvsResult);
+ abvsPool.giveBack(abvsItem);
}
}
}
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.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.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 @@
}
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 @@
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 @@
for (TaggedValuePointable pointable : tvps) {
ppool.giveBack(pointable);
}
+ for (ArrayBackedValueStorage arrayBackedValueStorage : abvsList) {
+ abvsPool.giveBack(arrayBackedValueStorage);
+ }
}
}
@@ -96,7 +108,10 @@
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) {
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 @@
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);
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.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 @@
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 @@
//Test keys
try {
- op.getKeys(tvp);
+ op.getKeys(abvsKeys);
+ tvp.set(abvsKeys);
} catch (IOException e) {
Assert.fail("Test failed to write the object pointable.");
}