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

Reply via email to