Update the atomize function to use a new utility class that reuses variables.
Project: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/commit/f9ec13bf Tree: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/tree/f9ec13bf Diff: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/diff/f9ec13bf Branch: refs/heads/master Commit: f9ec13bf682455d1faeeadeaf46909281b1a77b6 Parents: c74c986 Author: Preston Carman <[email protected]> Authored: Thu Feb 13 15:26:18 2014 -0800 Committer: Preston Carman <[email protected]> Committed: Thu Feb 13 15:26:18 2014 -0800 ---------------------------------------------------------------------- ...ctTaggedValueArgumentAggregateEvaluator.java | 6 +- ...tractTaggedValueArgumentScalarEvaluator.java | 4 + ...ctTaggedValueArgumentUnnestingEvaluator.java | 6 +- ...GeneralComparisonScalarEvaluatorFactory.java | 22 ++- .../misc/FnDataScalarEvaluatorFactory.java | 53 +++--- .../runtime/functions/util/AtomizeHelper.java | 167 +++++++++++++++++++ 6 files changed, 226 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/f9ec13bf/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentAggregateEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentAggregateEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentAggregateEvaluator.java index e39d493..78faf89 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentAggregateEvaluator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentAggregateEvaluator.java @@ -16,6 +16,8 @@ */ package org.apache.vxquery.runtime.functions.base; +import org.apache.vxquery.datamodel.accessors.PointablePool; +import org.apache.vxquery.datamodel.accessors.PointablePoolFactory; import org.apache.vxquery.datamodel.accessors.TaggedValuePointable; import org.apache.vxquery.exceptions.SystemException; @@ -29,11 +31,13 @@ public abstract class AbstractTaggedValueArgumentAggregateEvaluator implements I private final TaggedValuePointable[] tvps; + protected final PointablePool ppool = PointablePoolFactory.INSTANCE.createPointablePool(); + public AbstractTaggedValueArgumentAggregateEvaluator(IScalarEvaluator[] args) { this.args = args; tvps = new TaggedValuePointable[args.length]; for (int i = 0; i < tvps.length; ++i) { - tvps[i] = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + tvps[i] = new TaggedValuePointable(); } } http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/f9ec13bf/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 4371db8..e3ea702 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,8 @@ */ package org.apache.vxquery.runtime.functions.base; +import org.apache.vxquery.datamodel.accessors.PointablePool; +import org.apache.vxquery.datamodel.accessors.PointablePoolFactory; import org.apache.vxquery.datamodel.accessors.TaggedValuePointable; import org.apache.vxquery.exceptions.SystemException; @@ -28,6 +30,8 @@ public abstract class AbstractTaggedValueArgumentScalarEvaluator implements ISca private final IScalarEvaluator[] args; private final TaggedValuePointable[] tvps; + + protected final PointablePool ppool = PointablePoolFactory.INSTANCE.createPointablePool(); public AbstractTaggedValueArgumentScalarEvaluator(IScalarEvaluator[] args) { this.args = args; http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/f9ec13bf/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentUnnestingEvaluator.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentUnnestingEvaluator.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentUnnestingEvaluator.java index 3a1442f..aba2501 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentUnnestingEvaluator.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/base/AbstractTaggedValueArgumentUnnestingEvaluator.java @@ -16,6 +16,8 @@ */ package org.apache.vxquery.runtime.functions.base; +import org.apache.vxquery.datamodel.accessors.PointablePool; +import org.apache.vxquery.datamodel.accessors.PointablePoolFactory; import org.apache.vxquery.datamodel.accessors.TaggedValuePointable; import org.apache.vxquery.exceptions.SystemException; @@ -29,11 +31,13 @@ public abstract class AbstractTaggedValueArgumentUnnestingEvaluator implements I protected final TaggedValuePointable[] tvps; + protected final PointablePool ppool = PointablePoolFactory.INSTANCE.createPointablePool(); + public AbstractTaggedValueArgumentUnnestingEvaluator(IScalarEvaluator[] args) { this.args = args; tvps = new TaggedValuePointable[args.length]; for (int i = 0; i < tvps.length; ++i) { - tvps[i] = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + tvps[i] = new TaggedValuePointable(); } } http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/f9ec13bf/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/general/AbstractGeneralComparisonScalarEvaluatorFactory.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/general/AbstractGeneralComparisonScalarEvaluatorFactory.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/general/AbstractGeneralComparisonScalarEvaluatorFactory.java index d3b8c8c..70f2e4e 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/general/AbstractGeneralComparisonScalarEvaluatorFactory.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/general/AbstractGeneralComparisonScalarEvaluatorFactory.java @@ -62,6 +62,7 @@ import org.apache.vxquery.runtime.functions.cast.CastToUnsignedShortOperation; import org.apache.vxquery.runtime.functions.cast.CastToUntypedAtomicOperation; import org.apache.vxquery.runtime.functions.cast.CastToYMDurationOperation; import org.apache.vxquery.runtime.functions.comparison.AbstractValueComparisonOperation; +import org.apache.vxquery.runtime.functions.util.AtomizeHelper; import org.apache.vxquery.runtime.functions.util.FunctionHelper; import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException; @@ -90,6 +91,7 @@ public abstract class AbstractGeneralComparisonScalarEvaluatorFactory extends final ArrayBackedValueStorage abvsInner2 = new ArrayBackedValueStorage(); final DataOutput dOutInner2 = abvsInner2.getDataOutput(); + final AtomizeHelper ah = new AtomizeHelper(); final FunctionHelper.TypedPointables tp1 = new FunctionHelper.TypedPointables(); final FunctionHelper.TypedPointables tp2 = new FunctionHelper.TypedPointables(); final DynamicContext dCtx = (DynamicContext) ctx.getJobletContext().getGlobalJobData(); @@ -186,25 +188,29 @@ public abstract class AbstractGeneralComparisonScalarEvaluatorFactory extends boolean tagTransformed1 = false, tagTransformed2 = false; abvsInner1.reset(); abvsInner2.reset(); - TaggedValuePointable tvpTransform1 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); - TaggedValuePointable tvpTransform2 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + TaggedValuePointable tvpTransform1 = (TaggedValuePointable) TaggedValuePointable.FACTORY + .createPointable(); + TaggedValuePointable tvpTransform2 = (TaggedValuePointable) TaggedValuePointable.FACTORY + .createPointable(); tvpTransform1.set(tvpArg1); tvpTransform2.set(tvpArg2); int tid1 = FunctionHelper.getBaseTypeForGeneralComparisons(tvpTransform1.getTag()); int tid2 = FunctionHelper.getBaseTypeForGeneralComparisons(tvpTransform2.getTag()); - + // Converted tags - TaggedValuePointable tvpCompare1 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); - TaggedValuePointable tvpCompare2 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + TaggedValuePointable tvpCompare1 = (TaggedValuePointable) TaggedValuePointable.FACTORY + .createPointable(); + TaggedValuePointable tvpCompare2 = (TaggedValuePointable) TaggedValuePointable.FACTORY + .createPointable(); try { // Converts node tree's into untyped atomic values that can then be compared as atomic items. if (tid1 == ValueTag.NODE_TREE_TAG && tid2 == ValueTag.NODE_TREE_TAG) { - FunctionHelper.atomize(tvpArg1, tvpTransform1); - FunctionHelper.atomize(tvpArg2, tvpTransform2); + ah.atomize(tvpArg1, ppool, tvpTransform1); + ah.atomize(tvpArg2, ppool, tvpTransform2); tid1 = FunctionHelper.getBaseTypeForGeneralComparisons(tvpTransform1.getTag()); tid2 = FunctionHelper.getBaseTypeForGeneralComparisons(tvpTransform2.getTag()); } else if (tid1 == ValueTag.NODE_TREE_TAG) { - FunctionHelper.atomize(tvpArg1, tvpTransform1); + ah.atomize(tvpArg1, ppool, tvpTransform1); tid1 = FunctionHelper.getBaseTypeForGeneralComparisons(tvpTransform1.getTag()); } else if (tid2 == ValueTag.NODE_TREE_TAG) { FunctionHelper.atomize(tvpArg2, tvpTransform2); http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/f9ec13bf/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/misc/FnDataScalarEvaluatorFactory.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/misc/FnDataScalarEvaluatorFactory.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/misc/FnDataScalarEvaluatorFactory.java index b4f53ab..cd4dbb3 100644 --- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/misc/FnDataScalarEvaluatorFactory.java +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/misc/FnDataScalarEvaluatorFactory.java @@ -26,6 +26,7 @@ import org.apache.vxquery.exceptions.ErrorCode; import org.apache.vxquery.exceptions.SystemException; import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluator; import org.apache.vxquery.runtime.functions.base.AbstractTaggedValueArgumentScalarEvaluatorFactory; +import org.apache.vxquery.runtime.functions.util.AtomizeHelper; import org.apache.vxquery.runtime.functions.util.FunctionHelper; import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException; @@ -45,38 +46,46 @@ public class FnDataScalarEvaluatorFactory extends AbstractTaggedValueArgumentSca @Override protected IScalarEvaluator createEvaluator(IHyracksTaskContext ctx, IScalarEvaluator[] args) throws AlgebricksException { + return new FnDataScalarEvaluator(args); + } + + private class FnDataScalarEvaluator extends AbstractTaggedValueArgumentScalarEvaluator { + final AtomizeHelper ah = new AtomizeHelper(); final ArrayBackedValueStorage abvs = new ArrayBackedValueStorage(); final SequenceBuilder sb = new SequenceBuilder(); final SequencePointable seq = new SequencePointable(); final TaggedValuePointable p = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); final TaggedValuePointable tempTVP = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); - return new AbstractTaggedValueArgumentScalarEvaluator(args) { - @Override - protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException { - try { - abvs.reset(); - sb.reset(abvs); - TaggedValuePointable tvp = args[0]; - if (tvp.getTag() == ValueTag.SEQUENCE_TAG) { - tvp.getValue(seq); - int seqLen = seq.getEntryCount(); - for (int j = 0; j < seqLen; ++j) { - seq.getEntry(j, p); - FunctionHelper.atomize(p, tempTVP); - sb.addItem(tempTVP); - } - } else { - FunctionHelper.atomize(tvp, tempTVP); + + public FnDataScalarEvaluator(IScalarEvaluator[] args) { + super(args); + } + + @Override + protected void evaluate(TaggedValuePointable[] args, IPointable result) throws SystemException { + try { + abvs.reset(); + sb.reset(abvs); + TaggedValuePointable tvp = args[0]; + if (tvp.getTag() == ValueTag.SEQUENCE_TAG) { + tvp.getValue(seq); + int seqLen = seq.getEntryCount(); + for (int j = 0; j < seqLen; ++j) { + seq.getEntry(j, p); + ah.atomize(p, ppool, tempTVP); sb.addItem(tempTVP); } - sb.finish(); - result.set(abvs); - } catch (IOException e) { - throw new SystemException(ErrorCode.SYSE0001); + } else { + ah.atomize(tvp, ppool, tempTVP); + sb.addItem(tempTVP); } + sb.finish(); + result.set(abvs); + } catch (IOException e) { + throw new SystemException(ErrorCode.SYSE0001); } + } - }; } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/f9ec13bf/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/AtomizeHelper.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/AtomizeHelper.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/AtomizeHelper.java new file mode 100644 index 0000000..ed9cd72 --- /dev/null +++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/AtomizeHelper.java @@ -0,0 +1,167 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.vxquery.runtime.functions.util; + +import java.io.DataOutput; +import java.io.IOException; + +import org.apache.vxquery.datamodel.accessors.PointablePool; +import org.apache.vxquery.datamodel.accessors.SequencePointable; +import org.apache.vxquery.datamodel.accessors.TaggedValuePointable; +import org.apache.vxquery.datamodel.accessors.nodes.AttributeNodePointable; +import org.apache.vxquery.datamodel.accessors.nodes.DocumentNodePointable; +import org.apache.vxquery.datamodel.accessors.nodes.ElementNodePointable; +import org.apache.vxquery.datamodel.accessors.nodes.NodeTreePointable; +import org.apache.vxquery.datamodel.accessors.nodes.PINodePointable; +import org.apache.vxquery.datamodel.accessors.nodes.TextOrCommentNodePointable; +import org.apache.vxquery.datamodel.values.ValueTag; + +import edu.uci.ics.hyracks.data.std.api.IPointable; +import edu.uci.ics.hyracks.data.std.primitive.VoidPointable; +import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage; + +public class AtomizeHelper { + AttributeNodePointable anp = (AttributeNodePointable) AttributeNodePointable.FACTORY.createPointable(); + DocumentNodePointable dnp = (DocumentNodePointable) DocumentNodePointable.FACTORY.createPointable(); + ElementNodePointable enp = (ElementNodePointable) ElementNodePointable.FACTORY.createPointable(); + NodeTreePointable ntp = (NodeTreePointable) NodeTreePointable.FACTORY.createPointable(); + PINodePointable pnp = (PINodePointable) PINodePointable.FACTORY.createPointable(); + SequencePointable sp = (SequencePointable) SequencePointable.FACTORY.createPointable(); + TextOrCommentNodePointable tcnp = (TextOrCommentNodePointable) TextOrCommentNodePointable.FACTORY.createPointable(); + ArrayBackedValueStorage tempABVS = new ArrayBackedValueStorage(); + TaggedValuePointable tempTVP = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable(); + VoidPointable vp = (VoidPointable) VoidPointable.FACTORY.createPointable(); + + public void atomize(TaggedValuePointable tvp, PointablePool pp, IPointable result) throws IOException { + switch (tvp.getTag()) { + case ValueTag.NODE_TREE_TAG: + tvp.getValue(ntp); + atomizeNode(ntp, pp, result); + break; + + default: + result.set(tvp); + } + } + + public void atomizeNode(NodeTreePointable ntp, PointablePool pp, IPointable result) throws IOException { + ntp.getRootNode(tempTVP); + switch (tempTVP.getTag()) { + case ValueTag.ATTRIBUTE_NODE_TAG: { + tempTVP.getValue(anp); + anp.getValue(ntp, result); + break; + } + + case ValueTag.TEXT_NODE_TAG: + case ValueTag.COMMENT_NODE_TAG: { + tempTVP.getValue(tcnp); + tcnp.getValue(ntp, vp); + tempABVS.reset(); + tempABVS.getDataOutput().write(ValueTag.XS_UNTYPED_ATOMIC_TAG); + tempABVS.append(vp); + result.set(tempABVS.getByteArray(), tempABVS.getStartOffset(), tempABVS.getLength()); + break; + } + + case ValueTag.DOCUMENT_NODE_TAG: { + tempTVP.getValue(dnp); + dnp.getContent(ntp, sp); + buildStringConcatenation(sp, pp, tempABVS, ntp); + result.set(tempABVS.getByteArray(), tempABVS.getStartOffset(), tempABVS.getLength()); + break; + } + + case ValueTag.ELEMENT_NODE_TAG: { + tempTVP.getValue(enp); + if (enp.childrenChunkExists()) { + enp.getChildrenSequence(ntp, sp); + buildStringConcatenation(sp, pp, tempABVS, ntp); + result.set(tempABVS.getByteArray(), tempABVS.getStartOffset(), tempABVS.getLength()); + } + break; + } + + case ValueTag.PI_NODE_TAG: { + tempTVP.getValue(pnp); + pnp.getContent(ntp, vp); + tempABVS.reset(); + tempABVS.getDataOutput().write(ValueTag.XS_UNTYPED_ATOMIC_TAG); + tempABVS.append(vp); + result.set(tempABVS.getByteArray(), tempABVS.getStartOffset(), tempABVS.getLength()); + break; + } + + } + } + + public static void buildConcatenationRec(SequencePointable sp, PointablePool pp, DataOutput out, + NodeTreePointable ntp) throws IOException { + TaggedValuePointable tempTVP2 = pp.takeOne(TaggedValuePointable.class); + int nItems = sp.getEntryCount(); + for (int i = 0; i < nItems; ++i) { + sp.getEntry(i, tempTVP2); + switch (tempTVP2.getTag()) { + case ValueTag.TEXT_NODE_TAG: { + TextOrCommentNodePointable tcnp = pp.takeOne(TextOrCommentNodePointable.class); + VoidPointable vp = pp.takeOne(VoidPointable.class); + try { + tempTVP2.getValue(tcnp); + tcnp.getValue(ntp, vp); + out.write(vp.getByteArray(), vp.getStartOffset() + 2, vp.getLength() - 2); + } finally { + pp.giveBack(vp); + pp.giveBack(tcnp); + } + break; + } + case ValueTag.ELEMENT_NODE_TAG: { + ElementNodePointable enp = pp.takeOne(ElementNodePointable.class); + SequencePointable sp2 = pp.takeOne(SequencePointable.class); + try { + tempTVP2.getValue(enp); + if (enp.childrenChunkExists()) { + enp.getChildrenSequence(ntp, sp2); + buildConcatenationRec(sp2, pp, out, ntp); + } + } finally { + pp.giveBack(sp2); + pp.giveBack(enp); + } + } + } + } + pp.giveBack(tempTVP2); + } + + public static void buildStringConcatenation(SequencePointable sp, PointablePool pp, + ArrayBackedValueStorage tempABVS, NodeTreePointable ntp) throws IOException { + tempABVS.reset(); + DataOutput out = tempABVS.getDataOutput(); + out.write(ValueTag.XS_UNTYPED_ATOMIC_TAG); + // Leave room for the utf-8 length + out.write(0); + out.write(0); + buildConcatenationRec(sp, pp, out, ntp); + int utflen = tempABVS.getLength() - 3; + byte[] bytes = tempABVS.getByteArray(); + // Patch utf-8 length at bytes 1 and 2 + bytes[1] = (byte) ((utflen >>> 8) & 0xFF); + bytes[2] = (byte) ((utflen >>> 0) & 0xFF); + } + +}
