You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vxquery.apache.org by pr...@apache.org on 2014/02/17 19:05:43 UTC

[1/6] git commit: Comment on NodeTreePointable structure.

Repository: incubator-vxquery
Updated Branches:
  refs/heads/prestonc/parser [created] 8e304a701


Comment on NodeTreePointable structure.


Project: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/commit/d1a036dd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/tree/d1a036dd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/diff/d1a036dd

Branch: refs/heads/prestonc/parser
Commit: d1a036dd4f6373adabbe62591ccc92650a656b21
Parents: bc1ff5a
Author: Preston Carman <pr...@apache.org>
Authored: Fri Feb 14 23:23:11 2014 -0800
Committer: Preston Carman <pr...@apache.org>
Committed: Fri Feb 14 23:23:11 2014 -0800

----------------------------------------------------------------------
 .../accessors/nodes/NodeTreePointable.java        | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/d1a036dd/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/nodes/NodeTreePointable.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/nodes/NodeTreePointable.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/nodes/NodeTreePointable.java
index 4a6afaa..416b77b 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/nodes/NodeTreePointable.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/accessors/nodes/NodeTreePointable.java
@@ -29,6 +29,24 @@ import edu.uci.ics.hyracks.data.std.primitive.IntegerPointable;
 import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
 import edu.uci.ics.hyracks.data.std.primitive.VoidPointable;
 
+/*
+ * NodeTree {
+ *  NodeTreeHeader header;
+ *  NodeId nodeId?;
+ *  Dictionary dictionary?;
+ *  ElementNode rootNode;
+ * }
+ * 
+ * ElementHeader (padded) {
+ *  bit NodeIdExists;
+ *  bit DictionaryExists;
+ *  bit HeaderTypeExists;
+ * }
+ * 
+ * NodeId {
+ *  int32 id;
+ * }
+ */
 public class NodeTreePointable extends AbstractPointable {
     public static final int HEADER_NODEID_EXISTS_MASK = (1 << 0);
     public static final int HEADER_DICTIONARY_EXISTS_MASK = (1 << 1);


[6/6] git commit: Converted a search method to a hashing method. Small improvement.

Posted by pr...@apache.org.
Converted a search method to a hashing method. Small improvement.


Project: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/commit/8e304a70
Tree: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/tree/8e304a70
Diff: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/diff/8e304a70

Branch: refs/heads/prestonc/parser
Commit: 8e304a7013ed9509fe1a22b48dd2f5d79edd42fb
Parents: 9ca8e18
Author: Preston Carman <pr...@apache.org>
Authored: Mon Feb 17 08:55:02 2014 -0800
Committer: Preston Carman <pr...@apache.org>
Committed: Mon Feb 17 08:55:02 2014 -0800

----------------------------------------------------------------------
 .../builders/nodes/DictionaryBuilder.java       | 50 +++++++++++++++-----
 1 file changed, 39 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/8e304a70/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DictionaryBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DictionaryBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DictionaryBuilder.java
index 20b7333..67a7ff8 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DictionaryBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DictionaryBuilder.java
@@ -19,6 +19,12 @@ package org.apache.vxquery.datamodel.builders.nodes;
 import java.io.DataOutput;
 import java.io.DataOutputStream;
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import javax.swing.text.html.HTMLDocument.Iterator;
 
 import org.apache.vxquery.util.GrowableIntArray;
 
@@ -44,6 +50,8 @@ public class DictionaryBuilder {
 
     private final UTF8StringPointable tempStringPointable;
 
+    private final TreeMap<String, Integer> hashSlotIndexes;
+
     private final IValueReferenceVector sortedStringsVector = new IValueReferenceVector() {
         @Override
         public int getStart(int index) {
@@ -77,13 +85,15 @@ public class DictionaryBuilder {
         tempStringData = new ByteArrayAccessibleOutputStream();
         tempOut = new DataOutputStream(tempStringData);
         tempStringPointable = (UTF8StringPointable) UTF8StringPointable.FACTORY.createPointable();
+        hashSlotIndexes = new TreeMap<String, Integer>();
     }
-    
+
     public void reset() {
         stringEndOffsets.clear();
         sortedSlotIndexes.clear();
         dataBuffer.reset();
         tempStringData.reset();
+        hashSlotIndexes.clear();
     }
 
     public void write(ArrayBackedValueStorage abvs) throws IOException {
@@ -96,23 +106,41 @@ public class DictionaryBuilder {
         for (int i = 0; i < entryCount; ++i) {
             out.writeInt(entryOffsets[i]);
         }
-        int[] sortedOffsets = sortedSlotIndexes.getArray();
-        for (int i = 0; i < entryCount; ++i) {
-            out.writeInt(sortedOffsets[i]);
+        if (hashSlotIndexes.isEmpty()) {
+            int[] sortedOffsets = sortedSlotIndexes.getArray();
+            for (int i = 0; i < entryCount; ++i) {
+                out.writeInt(sortedOffsets[i]);
+            }
+        } else {
+            // Get a set of the entries
+            Set set = hashSlotIndexes.entrySet();
+            // Get an iterator
+            java.util.Iterator it = set.iterator();
+            // Display elements
+            while (it.hasNext()) {
+                Map.Entry me = (Map.Entry) it.next();
+                out.writeInt((Integer) me.getValue());
+            }
+
         }
         out.write(dataBuffer.getByteArray(), 0, dataBuffer.size());
         IntegerPointable.setInteger(abvs.getByteArray(), sizeOffset, abvs.getLength() - sizeOffset);
     }
 
     public int lookup(String str) {
-        tempStringData.reset();
-        try {
-            tempOut.writeUTF(str);
-        } catch (IOException e) {
-            throw new IllegalStateException(e);
+        Integer slotIndex = hashSlotIndexes.get(str);
+        if (slotIndex == null) {
+            try {
+                dataBufferOut.writeUTF(str);
+                slotIndex = stringEndOffsets.getSize();
+                dataBufferOut.writeInt(slotIndex);
+            } catch (IOException e) {
+                throw new IllegalStateException(e);
+            }
+            stringEndOffsets.append(dataBuffer.size());
+            hashSlotIndexes.put(str, slotIndex);
         }
-        tempStringPointable.set(tempStringData.getByteArray(), 0, tempStringData.size());
-        return lookup(tempStringPointable);
+        return slotIndex;
     }
 
     public int lookup(UTF8StringPointable str) {


[5/6] git commit: Removed one more array of tracking data.

Posted by pr...@apache.org.
Removed one more array of tracking data.


Project: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/commit/9ca8e18a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/tree/9ca8e18a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/diff/9ca8e18a

Branch: refs/heads/prestonc/parser
Commit: 9ca8e18aaa81ebdff57533fe61fb4cc2e110df31
Parents: f4527b1
Author: Preston Carman <pr...@apache.org>
Authored: Sun Feb 16 21:45:40 2014 -0800
Committer: Preston Carman <pr...@apache.org>
Committed: Sun Feb 16 21:45:40 2014 -0800

----------------------------------------------------------------------
 .../vxquery/xmlparser/SAXContentHandler.java    | 39 ++++++++++----------
 1 file changed, 19 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/9ca8e18a/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java b/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
index 3ead13a..40a35b0 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
@@ -70,10 +70,10 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
 
     // Structure and data.
     private final GrowableIntArray leavesKind;
-    private final GrowableIntArray leavesStart;
+//    private final GrowableIntArray leavesStart;
     private final GrowableIntArray leavesEnd;
-//    private final GrowableIntArray leavesDepth;
-//    private final GrowableIntArray leavesParent;
+    //    private final GrowableIntArray leavesDepth;
+    //    private final GrowableIntArray leavesParent;
     private final GrowableIntArray leavesAttributeCount;
     private final GrowableIntArray leavesChildrenCount;
 
@@ -110,11 +110,11 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
         pendingText = false;
 
         leavesKind = new GrowableIntArray(600);
-        leavesStart = new GrowableIntArray(600);
+        //leavesStart = new GrowableIntArray(600);
         leavesABVS = new ArrayBackedValueStorage();
         leavesEnd = new GrowableIntArray(600);
-//        leavesDepth = new GrowableIntArray(600);
-//        leavesParent = new GrowableIntArray(600);
+        //        leavesDepth = new GrowableIntArray(600);
+        //        leavesParent = new GrowableIntArray(600);
         leavesAttributeCount = new GrowableIntArray(600);
         leavesChildrenCount = new GrowableIntArray(600);
         previousLeaf = new GrowableIntArray(600);
@@ -209,11 +209,11 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
     @Override
     public void startDocument() throws SAXException {
         leavesKind.clear();
-        leavesStart.clear();
+        //leavesStart.clear();
         leavesABVS.reset();
         leavesEnd.clear();
-//        leavesDepth.clear();
-//        leavesParent.clear();
+        //        leavesDepth.clear();
+        //        leavesParent.clear();
         leavesAttributeCount.clear();
         leavesChildrenCount.clear();
         previousLeaf.clear();
@@ -381,10 +381,11 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
         }
         db.write(abvs);
 
+        // leavesStart.getArray()[i]
+        int currentOffset = 0;
         for (int i = 0; i < leavesKind.getSize(); ++i) {
             if (leavesKind.getArray()[i] == LEAF_PRE_DOCUMENT) {
-                out.write(leavesABVS.getByteArray(), leavesStart.getArray()[i],
-                        leavesEnd.getArray()[i] - leavesStart.getArray()[i]);
+                out.write(leavesABVS.getByteArray(), currentOffset, leavesEnd.getArray()[i] - currentOffset);
 
                 int children = leavesChildrenCount.getArray()[i];
                 if (children > 0) {
@@ -400,15 +401,13 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
                 enb.setMvs(abvs);
                 enb.setTagHeader(nsCount, attrCount, childrenCount);
 
-                out.write(leavesABVS.getByteArray(), leavesStart.getArray()[i],
-                        leavesEnd.getArray()[i] - leavesStart.getArray()[i]);
+                out.write(leavesABVS.getByteArray(), currentOffset, leavesEnd.getArray()[i] - currentOffset);
 
                 if (attrCount > 0) {
                     sequenceSlotStub(abvs, attrCount);
                     for (int s = 0; s < attrCount; ++s) {
                         ++i;
-                        out.write(leavesABVS.getByteArray(), leavesStart.getArray()[i], leavesEnd.getArray()[i]
-                                - leavesStart.getArray()[i]);
+                        out.write(leavesABVS.getByteArray(), currentOffset, leavesEnd.getArray()[i] - currentOffset);
                         updateSequenceSlot(abvs);
                     }
                 }
@@ -423,10 +422,10 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
             } else if (leavesKind.getArray()[i] == LEAF_POST_NODE) {
                 updateSequenceSlot(abvs);
             } else {
-                out.write(leavesABVS.getByteArray(), leavesStart.getArray()[i],
-                        leavesEnd.getArray()[i] - leavesStart.getArray()[i]);
+                out.write(leavesABVS.getByteArray(), currentOffset, leavesEnd.getArray()[i] - currentOffset);
                 updateSequenceSlot(abvs);
             }
+            currentOffset = leavesEnd.getArray()[i];
         }
     }
 
@@ -462,13 +461,13 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
 
     private void leafNodeStart(int kind) {
         leavesKind.append(kind);
-        leavesStart.append(leavesABVS.getLength());
-//        leavesDepth.append(textCurrentDepth);
+        //leavesStart.append(leavesABVS.getLength());
+        //        leavesDepth.append(textCurrentDepth);
         leavesAttributeCount.append(0);
         leavesChildrenCount.append(0);
 
         int parent = previousLeaf.getArray()[textCurrentDepth - 1];
-//        leavesParent.append(parent);
+        //        leavesParent.append(parent);
         if (kind == LEAF_POST_NODE || kind == LEAF_POST_DOCUMENT) {
             // Skip Count
         } else if (kind == LEAF_ATTRIBUTE) {


[2/6] git commit: Added functions to help with simplifying the XMLParser calls. Only one array backed value store is needed.

Posted by pr...@apache.org.
Added functions to help with simplifying the XMLParser calls. Only one array backed value store is needed.


Project: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/commit/f0399ca5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/tree/f0399ca5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/diff/f0399ca5

Branch: refs/heads/prestonc/parser
Commit: f0399ca54cc5f24977edb7b110d377a03ed26c1f
Parents: d1a036d
Author: Preston Carman <pr...@apache.org>
Authored: Fri Feb 14 23:24:04 2014 -0800
Committer: Preston Carman <pr...@apache.org>
Committed: Fri Feb 14 23:24:04 2014 -0800

----------------------------------------------------------------------
 .../builders/nodes/AttributeNodeBuilder.java    |  5 +++++
 .../builders/nodes/CommentNodeBuilder.java      |  4 ++++
 .../builders/nodes/ElementNodeBuilder.java      | 20 ++++++++++++++++++++
 .../datamodel/builders/nodes/PINodeBuilder.java |  8 ++++++++
 .../builders/nodes/TextNodeBuilder.java         |  4 ++++
 5 files changed, 41 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/f0399ca5/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java
index cea7799..667001a 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java
@@ -56,4 +56,9 @@ public class AttributeNodeBuilder extends AbstractNodeBuilder {
     public void setValue(IValueReference value) throws IOException {
         out.write(value.getByteArray(), value.getStartOffset(), value.getLength());
     }
+
+    public void setValue(String string) throws IOException {
+        out.write(ValueTag.XS_UNTYPED_ATOMIC_TAG);
+        out.writeUTF(string);
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/f0399ca5/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java
index 104868f..dce961c 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java
@@ -44,4 +44,8 @@ public class CommentNodeBuilder extends AbstractNodeBuilder {
     public void setValue(IValueReference value) throws IOException {
         out.write(value.getByteArray(), value.getStartOffset(), value.getLength());
     }
+
+    public void setValue(String string) throws IOException {
+        out.writeUTF(string);
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/f0399ca5/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java
index d455fd5..4493bd1 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java
@@ -59,6 +59,11 @@ public class ElementNodeBuilder extends AbstractNodeBuilder {
         childrenDataArea = new ArrayBackedValueStorage();
     }
 
+    public void setMvs(IMutableValueStorage mvs) throws IOException {
+        this.mvs = mvs;
+        out = mvs.getDataOutput();
+    }
+
     @Override
     public void reset(IMutableValueStorage mvs) throws IOException {
         this.mvs = mvs;
@@ -83,6 +88,21 @@ public class ElementNodeBuilder extends AbstractNodeBuilder {
         BytePointable.setByte(mvs.getByteArray(), headerOffset, header);
     }
 
+    public void setTagHeader(int nsCount, int attrCount, int childrenCount) throws IOException {
+        byte header = 0;
+        if (nsCount > 0) {
+            header |= ElementNodePointable.NS_CHUNK_EXISTS_MASK;
+        }
+        if (attrCount > 0) {
+            header |= ElementNodePointable.ATTRIBUTES_CHUNK_EXISTS_MASK;
+        }
+        if (childrenCount > 0) {
+            header |= ElementNodePointable.CHILDREN_CHUNK_EXISTS_MASK;
+        }
+        out.write(ValueTag.ELEMENT_NODE_TAG);
+        out.writeByte(header);
+    }
+
     public void setName(int uriCode, int localNameCode, int prefixCode) throws IOException {
         out.writeInt(prefixCode);
         out.writeInt(uriCode);

http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/f0399ca5/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java
index a472143..344a8f4 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java
@@ -45,7 +45,15 @@ public class PINodeBuilder extends AbstractNodeBuilder {
         out.write(value.getByteArray(), value.getStartOffset(), value.getLength());
     }
 
+    public void setTarget(String string) throws IOException {
+        out.writeUTF(string);
+    }
+
     public void setContent(IValueReference value) throws IOException {
         out.write(value.getByteArray(), value.getStartOffset(), value.getLength());
     }
+
+    public void setContent(String string) throws IOException {
+        out.writeUTF(string);
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/f0399ca5/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java
index acddb8b..387b77e 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java
@@ -44,4 +44,8 @@ public class TextNodeBuilder extends AbstractNodeBuilder {
     public void setValue(IValueReference value) throws IOException {
         out.write(value.getByteArray(), value.getStartOffset(), value.getLength());
     }
+    
+    public void setValue(String string) throws IOException {
+        out.writeUTF(string);
+    }
 }
\ No newline at end of file


[4/6] git commit: Working version with only the new code.

Posted by pr...@apache.org.
Working version with only the new code.


Project: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/commit/f4527b1d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/tree/f4527b1d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/diff/f4527b1d

Branch: refs/heads/prestonc/parser
Commit: f4527b1df45e35e109f616049c13d29a10476cf1
Parents: 16f5921
Author: Preston Carman <pr...@apache.org>
Authored: Sat Feb 15 01:31:25 2014 -0800
Committer: Preston Carman <pr...@apache.org>
Committed: Sat Feb 15 01:31:25 2014 -0800

----------------------------------------------------------------------
 .../vxquery/xmlparser/SAXContentHandler.java    | 307 ++++++-------------
 1 file changed, 90 insertions(+), 217 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/f4527b1d/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java b/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
index 0ef2991..3ead13a 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
@@ -16,11 +16,8 @@ package org.apache.vxquery.xmlparser;
 
 import java.io.DataOutput;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 
 import org.apache.vxquery.datamodel.accessors.nodes.NodeTreePointable;
-import org.apache.vxquery.datamodel.builders.nodes.AbstractNodeBuilder;
 import org.apache.vxquery.datamodel.builders.nodes.AttributeNodeBuilder;
 import org.apache.vxquery.datamodel.builders.nodes.CommentNodeBuilder;
 import org.apache.vxquery.datamodel.builders.nodes.DictionaryBuilder;
@@ -38,12 +35,10 @@ import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
 import org.xml.sax.ext.LexicalHandler;
 
-import edu.uci.ics.hyracks.data.std.primitive.BytePointable;
 import edu.uci.ics.hyracks.data.std.primitive.IntegerPointable;
 import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
 
 public class SAXContentHandler implements ContentHandler, LexicalHandler {
-    private final ArrayBackedValueStorage docABVS;
 
     private final boolean createNodeIds;
 
@@ -51,8 +46,6 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
 
     private final ITreeNodeIdProvider nodeIdProvider;
 
-    private final ArrayBackedValueStorage tempABVS;
-
     private final DocumentNodeBuilder docb;
 
     private final TextNodeBuilder tnb;
@@ -67,22 +60,20 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
 
     private final StringBuilder buffer;
 
-    private final List<ElementNodeBuilder> enbStack;
-
-    private final List<ElementNodeBuilder> freeENBList;
-
     private int nodeIdCounter;
 
     private boolean pendingText;
 
     private final ArrayBackedValueStorage leavesABVS;
 
+    private final ElementNodeBuilder enb;
+
     // Structure and data.
     private final GrowableIntArray leavesKind;
     private final GrowableIntArray leavesStart;
     private final GrowableIntArray leavesEnd;
-    private final GrowableIntArray leavesDepth;
-    private final GrowableIntArray leavesParent;
+//    private final GrowableIntArray leavesDepth;
+//    private final GrowableIntArray leavesParent;
     private final GrowableIntArray leavesAttributeCount;
     private final GrowableIntArray leavesChildrenCount;
 
@@ -105,11 +96,10 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
     private final int LEAF_POST_NODE = 7;
 
     public SAXContentHandler(boolean attachTypes, ITreeNodeIdProvider nodeIdProvider) {
-        docABVS = new ArrayBackedValueStorage();
         this.createNodeIds = nodeIdProvider != null;
         this.attachTypes = attachTypes;
         this.nodeIdProvider = nodeIdProvider;
-        this.tempABVS = new ArrayBackedValueStorage();
+        enb = new ElementNodeBuilder();
         docb = new DocumentNodeBuilder();
         tnb = new TextNodeBuilder();
         cnb = new CommentNodeBuilder();
@@ -117,23 +107,22 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
         anb = new AttributeNodeBuilder();
         db = new DictionaryBuilder();
         buffer = new StringBuilder();
-        enbStack = new ArrayList<ElementNodeBuilder>();
-        freeENBList = new ArrayList<ElementNodeBuilder>();
         pendingText = false;
 
-        leavesKind = new GrowableIntArray();
-        leavesStart = new GrowableIntArray();
+        leavesKind = new GrowableIntArray(600);
+        leavesStart = new GrowableIntArray(600);
         leavesABVS = new ArrayBackedValueStorage();
-        leavesEnd = new GrowableIntArray();
-        leavesDepth = new GrowableIntArray();
-        leavesParent = new GrowableIntArray();
-        leavesAttributeCount = new GrowableIntArray();
-        leavesChildrenCount = new GrowableIntArray();
-        previousLeaf = new GrowableIntArray();
-        childStartOffset = new GrowableIntArray();
-        childSlotOffset = new GrowableIntArray();
+        leavesEnd = new GrowableIntArray(600);
+//        leavesDepth = new GrowableIntArray(600);
+//        leavesParent = new GrowableIntArray(600);
+        leavesAttributeCount = new GrowableIntArray(600);
+        leavesChildrenCount = new GrowableIntArray(600);
+        previousLeaf = new GrowableIntArray(600);
+        childStartOffset = new GrowableIntArray(600);
+        childSlotOffset = new GrowableIntArray(600);
         textCount = 0;
         textCurrentDepth = 0;
+        childSlotCounter = 0;
 
     }
 
@@ -147,28 +136,25 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
     public void endDocument() throws SAXException {
         try {
             flushText();
-            docb.endChildrenChunk();
-            docb.finish();
+            leafNodeStart(LEAF_POST_DOCUMENT);
+            leafNodeEnd();
+            textCurrentDepth--;
         } catch (IOException e) {
             e.printStackTrace();
             throw new SAXException(e);
         }
 
-        leafNodeStart(LEAF_POST_DOCUMENT);
-        leafNodeEnd();
-
-        textCurrentDepth--;
-        int[] k = leavesKind.getArray();
-        int[] s = leavesStart.getArray();
-        int[] e = leavesEnd.getArray();
-        int[] d = leavesDepth.getArray();
-        int[] p = leavesParent.getArray();
-        int[] c = leavesChildrenCount.getArray();
-        int[] a = leavesAttributeCount.getArray();
-        for (int i = 0; i < s.length; ++i) {
-            System.err.println(i + " " + k[i] + " - " + d[i] + ":" + s[i] + ":" + e[i] + " p=" + p[i] + " a=" + a[i]
-                    + " c=" + c[i]);
-        }
+        //        int[] k = leavesKind.getArray();
+        //        int[] s = leavesStart.getArray();
+        //        int[] e = leavesEnd.getArray();
+        //        int[] d = leavesDepth.getArray();
+        //        int[] p = leavesParent.getArray();
+        //        int[] c = leavesChildrenCount.getArray();
+        //        int[] a = leavesAttributeCount.getArray();
+        //        for (int i = 0; i < s.length; ++i) {
+        //            System.err.println(i + " " + k[i] + " - " + d[i] + ":" + s[i] + ":" + e[i] + " p=" + p[i] + " a=" + a[i]
+        //                    + " c=" + c[i]);
+        //        }
 
     }
 
@@ -176,20 +162,13 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
     public void endElement(String uri, String localName, String name) throws SAXException {
         try {
             flushText();
-            ElementNodeBuilder enb = enbStack.remove(enbStack.size() - 1);
-            enb.endChildrenChunk();
-            endChildInParent(enb);
-            freeENB(enb);
+            leafNodeStart(LEAF_POST_NODE);
+            leafNodeEnd();
+            textCurrentDepth--;
         } catch (IOException e) {
             e.printStackTrace();
             throw new SAXException(e);
         }
-
-        leafNodeStart(LEAF_POST_NODE);
-        leafNodeEnd();
-
-        textCurrentDepth--;
-
     }
 
     @Override
@@ -204,28 +183,15 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
     public void processingInstruction(String target, String data) throws SAXException {
         try {
             flushText();
-            startChildInParent(pinb);
-            tempABVS.reset();
-            tempABVS.getDataOutput().writeUTF(target);
-            if (createNodeIds) {
-                pinb.setLocalNodeId(nodeIdCounter++);
-            }
-            pinb.setTarget(tempABVS);
-            tempABVS.reset();
-            tempABVS.getDataOutput().writeUTF(data);
-            pinb.setContent(tempABVS);
-            endChildInParent(pinb);
-
             // Save to leavesABVS
             leafNodeStart(LEAF_PI);
             pinb.reset(leavesABVS);
             if (createNodeIds) {
-                pinb.setLocalNodeId(nodeIdCounter);
+                pinb.setLocalNodeId(nodeIdCounter++);
             }
             pinb.setTarget(target);
             pinb.setContent(data);
             leafNodeEnd();
-
         } catch (IOException e) {
             e.printStackTrace();
             throw new SAXException(e);
@@ -242,22 +208,30 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
 
     @Override
     public void startDocument() throws SAXException {
+        leavesKind.clear();
+        leavesStart.clear();
+        leavesABVS.reset();
+        leavesEnd.clear();
+//        leavesDepth.clear();
+//        leavesParent.clear();
+        leavesAttributeCount.clear();
+        leavesChildrenCount.clear();
+        previousLeaf.clear();
+        childStartOffset.clear();
+        childSlotOffset.clear();
+        textCount = 0;
+        textCurrentDepth = 0;
+        childSlotCounter = 0;
+
         textCurrentDepth++;
         try {
             nodeIdCounter = 0;
             db.reset();
-            docABVS.reset();
-            docb.reset(docABVS);
-            if (createNodeIds) {
-                docb.setLocalNodeId(nodeIdCounter++);
-            }
-            docb.startChildrenChunk();
 
             leafNodeStart(LEAF_PRE_DOCUMENT);
-            DocumentNodeBuilder docb2 = new DocumentNodeBuilder();
-            docb2.reset(leavesABVS);
+            docb.reset(leavesABVS);
             if (createNodeIds) {
-                docb2.setLocalNodeId(nodeIdCounter);
+                docb.setLocalNodeId(nodeIdCounter++);
             }
             leafNodeEnd();
 
@@ -275,40 +249,26 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
             flushText();
             int idx = name.indexOf(':');
             String prefix = idx < 0 ? "" : name.substring(0, idx);
-            ElementNodeBuilder enb = createENB();
-            startChildInParent(enb);
             int uriCode = db.lookup(uri);
             int localNameCode = db.lookup(localName);
             int prefixCode = db.lookup(prefix);
-            enb.setName(uriCode, localNameCode, prefixCode);
-            if (attachTypes) {
-                int typeUriCode = db.lookup(XQueryConstants.XS_NSURI);
-                int typeLocalNameCode = db.lookup(BuiltinTypeQNames.UNTYPED_STR);
-                int typePrefixCode = db.lookup(XQueryConstants.XS_PREFIX);
-                enb.setType(typeUriCode, typeLocalNameCode, typePrefixCode);
-            }
-            if (createNodeIds) {
-                enb.setLocalNodeId(nodeIdCounter++);
-            }
 
             // Save to leavesABVS
             leafNodeStart(LEAF_PRE_NODE);
-            ElementNodeBuilder enb2 = createENB();
-            enb2.setMvs(leavesABVS);
-            enb2.setName(uriCode, localNameCode, prefixCode);
+            enb.setMvs(leavesABVS);
+            enb.setName(uriCode, localNameCode, prefixCode);
             if (attachTypes) {
                 int typeUriCode = db.lookup(XQueryConstants.XS_NSURI);
                 int typeLocalNameCode = db.lookup(BuiltinTypeQNames.UNTYPED_STR);
                 int typePrefixCode = db.lookup(XQueryConstants.XS_PREFIX);
-                enb2.setType(typeUriCode, typeLocalNameCode, typePrefixCode);
+                enb.setType(typeUriCode, typeLocalNameCode, typePrefixCode);
             }
             if (createNodeIds) {
-                enb2.setLocalNodeId(nodeIdCounter);
+                enb.setLocalNodeId(nodeIdCounter++);
             }
             leafNodeEnd();
             textCurrentDepth++;
 
-            enb.startAttributeChunk();
             final int nAttrs = atts.getLength();
             for (int i = 0; i < nAttrs; ++i) {
                 String aName = atts.getQName(i);
@@ -316,24 +276,6 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
                 int aPrefixCode = db.lookup(aIdx < 0 ? "" : aName.substring(0, aIdx));
                 int aLocalNameCode = db.lookup(atts.getLocalName(i));
                 int aUriCode = db.lookup(atts.getURI(i));
-                String aValue = atts.getValue(i);
-                tempABVS.reset();
-                DataOutput tempOut = tempABVS.getDataOutput();
-                tempOut.write(ValueTag.XS_UNTYPED_ATOMIC_TAG);
-                tempOut.writeUTF(aValue);
-                enb.startAttribute(anb);
-                anb.setName(aUriCode, aLocalNameCode, aPrefixCode);
-                if (attachTypes) {
-                    int typeUriCode = db.lookup(XQueryConstants.XS_NSURI);
-                    int typeLocalNameCode = db.lookup(BuiltinTypeQNames.UNTYPED_ATOMIC_STR);
-                    int typePrefixCode = db.lookup(XQueryConstants.XS_PREFIX);
-                    anb.setType(typeUriCode, typeLocalNameCode, typePrefixCode);
-                }
-                if (createNodeIds) {
-                    anb.setLocalNodeId(nodeIdCounter++);
-                }
-                anb.setValue(tempABVS);
-                enb.endAttribute(anb);
 
                 // Save to leavesABVS
                 leafNodeStart(LEAF_ATTRIBUTE);
@@ -350,11 +292,7 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
                 }
                 anb.setValue(atts.getValue(i));
                 leafNodeEnd();
-
             }
-            enb.endAttributeChunk();
-            enb.startChildrenChunk();
-            enbStack.add(enb);
         } catch (IOException e) {
             e.printStackTrace();
             throw new SAXException(e);
@@ -369,21 +307,13 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
     public void comment(char[] ch, int start, int length) throws SAXException {
         try {
             flushText();
-            startChildInParent(cnb);
             buffer.append(ch, start, length);
-            tempABVS.reset();
-            tempABVS.getDataOutput().writeUTF(buffer.toString());
-            if (createNodeIds) {
-                cnb.setLocalNodeId(nodeIdCounter++);
-            }
-            cnb.setValue(tempABVS);
-            endChildInParent(cnb);
 
             // Save to leavesABVS
             leafNodeStart(LEAF_COMMENT);
             cnb.reset(leavesABVS);
             if (createNodeIds) {
-                cnb.setLocalNodeId(nodeIdCounter);
+                cnb.setLocalNodeId(nodeIdCounter++);
             }
             cnb.setValue(buffer.toString());
             leafNodeEnd();
@@ -397,20 +327,11 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
 
     private void flushText() throws IOException {
         if (pendingText) {
-            peekENBStackTop().startChild(tnb);
-            tempABVS.reset();
-            tempABVS.getDataOutput().writeUTF(buffer.toString());
-            if (createNodeIds) {
-                tnb.setLocalNodeId(nodeIdCounter++);
-            }
-            tnb.setValue(tempABVS);
-            peekENBStackTop().endChild(tnb);
-
             // Save to leavesABVS
             leafNodeStart(LEAF_TEXT);
             tnb.reset(leavesABVS);
             if (createNodeIds) {
-                tnb.setLocalNodeId(nodeIdCounter);
+                tnb.setLocalNodeId(nodeIdCounter++);
             }
             tnb.setValue(buffer.toString());
             leafNodeEnd();
@@ -459,24 +380,6 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
             out.writeInt(nodeIdProvider.getId());
         }
         db.write(abvs);
-        out.write(docABVS.getByteArray(), docABVS.getStartOffset(), docABVS.getLength());
-    }
-
-    public void writeOnce(ArrayBackedValueStorage abvs) throws IOException {
-        DataOutput out = abvs.getDataOutput();
-        out.write(ValueTag.NODE_TREE_TAG);
-        byte header = NodeTreePointable.HEADER_DICTIONARY_EXISTS_MASK;
-        if (attachTypes) {
-            header |= NodeTreePointable.HEADER_TYPE_EXISTS_MASK;
-        }
-        if (createNodeIds) {
-            header |= NodeTreePointable.HEADER_NODEID_EXISTS_MASK;
-        }
-        out.write(header);
-        if (createNodeIds) {
-            out.writeInt(nodeIdProvider.getId());
-        }
-        db.write(abvs);
 
         for (int i = 0; i < leavesKind.getSize(); ++i) {
             if (leavesKind.getArray()[i] == LEAF_PRE_DOCUMENT) {
@@ -485,12 +388,7 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
 
                 int children = leavesChildrenCount.getArray()[i];
                 if (children > 0) {
-                    out.writeInt(children);
-                    int offset = abvs.getLength();
-                    for (int s = 0; s < children; ++s) {
-                        out.writeInt(-1);
-                        addChildSlot(offset, s, children);
-                    }
+                    sequenceSlotStub(abvs, children);
                 }
                 // Continue with nodes.
 
@@ -499,103 +397,78 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
                 int attrCount = leavesAttributeCount.getArray()[i];
                 int childrenCount = leavesChildrenCount.getArray()[i];
 
-                ElementNodeBuilder enb2 = createENB();
-                enb2.setMvs(abvs);
-                enb2.setTagHeader(nsCount, attrCount, childrenCount);
+                enb.setMvs(abvs);
+                enb.setTagHeader(nsCount, attrCount, childrenCount);
 
                 out.write(leavesABVS.getByteArray(), leavesStart.getArray()[i],
                         leavesEnd.getArray()[i] - leavesStart.getArray()[i]);
 
                 if (attrCount > 0) {
-                    out.writeInt(attrCount);
-                    int offset = abvs.getLength();
-                    for (int s = 0; s < attrCount; ++s) {
-                        out.writeInt(-1);
-                        addChildSlot(offset, s, attrCount);
-                    }
+                    sequenceSlotStub(abvs, attrCount);
                     for (int s = 0; s < attrCount; ++s) {
                         ++i;
                         out.write(leavesABVS.getByteArray(), leavesStart.getArray()[i], leavesEnd.getArray()[i]
                                 - leavesStart.getArray()[i]);
+                        updateSequenceSlot(abvs);
                     }
                 }
 
                 if (childrenCount > 0) {
-                    out.writeInt(childrenCount);
-                    int offset = abvs.getLength();
-                    for (int s = 0; s < childrenCount; ++s) {
-                        out.writeInt(-1);
-                        addChildSlot(offset, s, childrenCount);
-                    }
+                    sequenceSlotStub(abvs, childrenCount);
                 }
                 // Continue with nodes.
 
+            } else if (leavesKind.getArray()[i] == LEAF_POST_DOCUMENT) {
+                // no action
+            } else if (leavesKind.getArray()[i] == LEAF_POST_NODE) {
+                updateSequenceSlot(abvs);
             } else {
-                if (leavesKind.getArray()[i] != LEAF_POST_DOCUMENT && leavesKind.getArray()[i] != LEAF_POST_NODE)
                 out.write(leavesABVS.getByteArray(), leavesStart.getArray()[i],
                         leavesEnd.getArray()[i] - leavesStart.getArray()[i]);
-                finishChildSlot(abvs);
+                updateSequenceSlot(abvs);
             }
         }
     }
 
-    private void addChildSlot(int offset, int count, int total) {
+    private void sequenceSlotStub(ArrayBackedValueStorage abvs, int count) throws IOException {
+        DataOutput out = abvs.getDataOutput();
+        out.writeInt(count);
+        int offset = abvs.getLength();
+        for (int s = 0; s < count; ++s) {
+            out.writeInt(-1);
+            addSequenceSlot(offset, s, count);
+        }
+        //
+        //        for (int i = 0; i < childSlotCounter; ++i) {
+        //            System.err.println("\t\t" + i + " " + childStartOffset.getArray()[i] + " - "
+        //                    + childSlotOffset.getArray()[i]);
+        //        }
+    }
+
+    private void addSequenceSlot(int offset, int count, int total) {
         childStartOffset.insert(childSlotCounter, offset + total * SLOT_SIZE);
         childSlotOffset.insert(childSlotCounter, offset + (total - count - 1) * SLOT_SIZE);
         childSlotCounter++;
-
-        for (int i = 0; i < childSlotCounter; ++i) {
-            System.err.println("\t\t" + i + " " + childStartOffset.getArray()[i] + " - "
-                    + childSlotOffset.getArray()[i]);
-        }
     }
 
-    private void finishChildSlot(ArrayBackedValueStorage abvs) {
+    private void updateSequenceSlot(ArrayBackedValueStorage abvs) {
+        //        for (int i = 0; i < childSlotCounter; ++i) {
+        //            System.err.println("\t" + i + " " + childStartOffset.getArray()[i] + " - " + childSlotOffset.getArray()[i]);
+        //        }
         childSlotCounter--;
         int length = abvs.getLength() - childStartOffset.getArray()[childSlotCounter];
         IntegerPointable.setInteger(abvs.getByteArray(), childSlotOffset.getArray()[childSlotCounter], length);
     }
 
-    private ElementNodeBuilder createENB() {
-        if (freeENBList.isEmpty()) {
-            return new ElementNodeBuilder();
-        }
-        return freeENBList.remove(freeENBList.size() - 1);
-    }
-
-    private void freeENB(ElementNodeBuilder enb) {
-        freeENBList.add(enb);
-    }
-
-    private ElementNodeBuilder peekENBStackTop() {
-        return enbStack.get(enbStack.size() - 1);
-    }
-
-    private void startChildInParent(AbstractNodeBuilder anb) throws IOException {
-        if (enbStack.isEmpty()) {
-            docb.startChild(anb);
-        } else {
-            peekENBStackTop().startChild(anb);
-        }
-    }
-
-    private void endChildInParent(AbstractNodeBuilder anb) throws IOException {
-        if (enbStack.isEmpty()) {
-            docb.endChild(anb);
-        } else {
-            peekENBStackTop().endChild(anb);
-        }
-    }
-
     private void leafNodeStart(int kind) {
         leavesKind.append(kind);
         leavesStart.append(leavesABVS.getLength());
-        leavesDepth.append(textCurrentDepth);
+//        leavesDepth.append(textCurrentDepth);
         leavesAttributeCount.append(0);
         leavesChildrenCount.append(0);
 
         int parent = previousLeaf.getArray()[textCurrentDepth - 1];
-        leavesParent.append(parent);
+//        leavesParent.append(parent);
         if (kind == LEAF_POST_NODE || kind == LEAF_POST_DOCUMENT) {
             // Skip Count
         } else if (kind == LEAF_ATTRIBUTE) {


[3/6] git commit: Test code for SAX Content Handler. The output byte array is correct. Still need to test and clean up code. Check point.

Posted by pr...@apache.org.
Test code for SAX Content Handler. The output byte array is correct. Still need to test and clean up code. Check point.


Project: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/commit/16f59218
Tree: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/tree/16f59218
Diff: http://git-wip-us.apache.org/repos/asf/incubator-vxquery/diff/16f59218

Branch: refs/heads/prestonc/parser
Commit: 16f59218df5a75782578884ac1aa238618639f53
Parents: f0399ca
Author: Preston Carman <pr...@apache.org>
Authored: Fri Feb 14 23:25:05 2014 -0800
Committer: Preston Carman <pr...@apache.org>
Committed: Fri Feb 14 23:25:05 2014 -0800

----------------------------------------------------------------------
 .../vxquery/xmlparser/SAXContentHandler.java    | 270 +++++++++++++++++++
 1 file changed, 270 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-vxquery/blob/16f59218/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java b/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
index a8ec0b9..0ef2991 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/xmlparser/SAXContentHandler.java
@@ -30,6 +30,7 @@ import org.apache.vxquery.datamodel.builders.nodes.PINodeBuilder;
 import org.apache.vxquery.datamodel.builders.nodes.TextNodeBuilder;
 import org.apache.vxquery.datamodel.values.ValueTag;
 import org.apache.vxquery.types.BuiltinTypeQNames;
+import org.apache.vxquery.util.GrowableIntArray;
 import org.apache.vxquery.xmlquery.query.XQueryConstants;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
@@ -37,6 +38,8 @@ import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
 import org.xml.sax.ext.LexicalHandler;
 
+import edu.uci.ics.hyracks.data.std.primitive.BytePointable;
+import edu.uci.ics.hyracks.data.std.primitive.IntegerPointable;
 import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
 
 public class SAXContentHandler implements ContentHandler, LexicalHandler {
@@ -72,6 +75,35 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
 
     private boolean pendingText;
 
+    private final ArrayBackedValueStorage leavesABVS;
+
+    // Structure and data.
+    private final GrowableIntArray leavesKind;
+    private final GrowableIntArray leavesStart;
+    private final GrowableIntArray leavesEnd;
+    private final GrowableIntArray leavesDepth;
+    private final GrowableIntArray leavesParent;
+    private final GrowableIntArray leavesAttributeCount;
+    private final GrowableIntArray leavesChildrenCount;
+
+    // Data keys for current progress through XML document.
+    private int textCount = 0;
+    private int textCurrentDepth = 0;
+    private int childSlotCounter = 0;
+    private final GrowableIntArray previousLeaf;
+    private final GrowableIntArray childStartOffset;
+    private final GrowableIntArray childSlotOffset;
+    private final int SLOT_SIZE = 4;
+
+    private final int LEAF_TEXT = 1;
+    private final int LEAF_PRE_NODE = 2;
+    private final int LEAF_COMMENT = 3;
+    private final int LEAF_ATTRIBUTE = 4;
+    private final int LEAF_PI = 5;
+    private final int LEAF_PRE_DOCUMENT = 5;
+    private final int LEAF_POST_DOCUMENT = 6;
+    private final int LEAF_POST_NODE = 7;
+
     public SAXContentHandler(boolean attachTypes, ITreeNodeIdProvider nodeIdProvider) {
         docABVS = new ArrayBackedValueStorage();
         this.createNodeIds = nodeIdProvider != null;
@@ -88,6 +120,21 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
         enbStack = new ArrayList<ElementNodeBuilder>();
         freeENBList = new ArrayList<ElementNodeBuilder>();
         pendingText = false;
+
+        leavesKind = new GrowableIntArray();
+        leavesStart = new GrowableIntArray();
+        leavesABVS = new ArrayBackedValueStorage();
+        leavesEnd = new GrowableIntArray();
+        leavesDepth = new GrowableIntArray();
+        leavesParent = new GrowableIntArray();
+        leavesAttributeCount = new GrowableIntArray();
+        leavesChildrenCount = new GrowableIntArray();
+        previousLeaf = new GrowableIntArray();
+        childStartOffset = new GrowableIntArray();
+        childSlotOffset = new GrowableIntArray();
+        textCount = 0;
+        textCurrentDepth = 0;
+
     }
 
     @Override
@@ -106,6 +153,23 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
             e.printStackTrace();
             throw new SAXException(e);
         }
+
+        leafNodeStart(LEAF_POST_DOCUMENT);
+        leafNodeEnd();
+
+        textCurrentDepth--;
+        int[] k = leavesKind.getArray();
+        int[] s = leavesStart.getArray();
+        int[] e = leavesEnd.getArray();
+        int[] d = leavesDepth.getArray();
+        int[] p = leavesParent.getArray();
+        int[] c = leavesChildrenCount.getArray();
+        int[] a = leavesAttributeCount.getArray();
+        for (int i = 0; i < s.length; ++i) {
+            System.err.println(i + " " + k[i] + " - " + d[i] + ":" + s[i] + ":" + e[i] + " p=" + p[i] + " a=" + a[i]
+                    + " c=" + c[i]);
+        }
+
     }
 
     @Override
@@ -120,6 +184,12 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
             e.printStackTrace();
             throw new SAXException(e);
         }
+
+        leafNodeStart(LEAF_POST_NODE);
+        leafNodeEnd();
+
+        textCurrentDepth--;
+
     }
 
     @Override
@@ -145,6 +215,17 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
             tempABVS.getDataOutput().writeUTF(data);
             pinb.setContent(tempABVS);
             endChildInParent(pinb);
+
+            // Save to leavesABVS
+            leafNodeStart(LEAF_PI);
+            pinb.reset(leavesABVS);
+            if (createNodeIds) {
+                pinb.setLocalNodeId(nodeIdCounter);
+            }
+            pinb.setTarget(target);
+            pinb.setContent(data);
+            leafNodeEnd();
+
         } catch (IOException e) {
             e.printStackTrace();
             throw new SAXException(e);
@@ -161,7 +242,9 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
 
     @Override
     public void startDocument() throws SAXException {
+        textCurrentDepth++;
         try {
+            nodeIdCounter = 0;
             db.reset();
             docABVS.reset();
             docb.reset(docABVS);
@@ -169,6 +252,15 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
                 docb.setLocalNodeId(nodeIdCounter++);
             }
             docb.startChildrenChunk();
+
+            leafNodeStart(LEAF_PRE_DOCUMENT);
+            DocumentNodeBuilder docb2 = new DocumentNodeBuilder();
+            docb2.reset(leavesABVS);
+            if (createNodeIds) {
+                docb2.setLocalNodeId(nodeIdCounter);
+            }
+            leafNodeEnd();
+
             flushText();
         } catch (IOException e) {
             e.printStackTrace();
@@ -178,6 +270,7 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
 
     @Override
     public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException {
+
         try {
             flushText();
             int idx = name.indexOf(':');
@@ -197,6 +290,24 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
             if (createNodeIds) {
                 enb.setLocalNodeId(nodeIdCounter++);
             }
+
+            // Save to leavesABVS
+            leafNodeStart(LEAF_PRE_NODE);
+            ElementNodeBuilder enb2 = createENB();
+            enb2.setMvs(leavesABVS);
+            enb2.setName(uriCode, localNameCode, prefixCode);
+            if (attachTypes) {
+                int typeUriCode = db.lookup(XQueryConstants.XS_NSURI);
+                int typeLocalNameCode = db.lookup(BuiltinTypeQNames.UNTYPED_STR);
+                int typePrefixCode = db.lookup(XQueryConstants.XS_PREFIX);
+                enb2.setType(typeUriCode, typeLocalNameCode, typePrefixCode);
+            }
+            if (createNodeIds) {
+                enb2.setLocalNodeId(nodeIdCounter);
+            }
+            leafNodeEnd();
+            textCurrentDepth++;
+
             enb.startAttributeChunk();
             final int nAttrs = atts.getLength();
             for (int i = 0; i < nAttrs; ++i) {
@@ -223,6 +334,23 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
                 }
                 anb.setValue(tempABVS);
                 enb.endAttribute(anb);
+
+                // Save to leavesABVS
+                leafNodeStart(LEAF_ATTRIBUTE);
+                anb.reset(leavesABVS);
+                anb.setName(aUriCode, aLocalNameCode, aPrefixCode);
+                if (attachTypes) {
+                    int typeUriCode = db.lookup(XQueryConstants.XS_NSURI);
+                    int typeLocalNameCode = db.lookup(BuiltinTypeQNames.UNTYPED_ATOMIC_STR);
+                    int typePrefixCode = db.lookup(XQueryConstants.XS_PREFIX);
+                    anb.setType(typeUriCode, typeLocalNameCode, typePrefixCode);
+                }
+                if (createNodeIds) {
+                    anb.setLocalNodeId(nodeIdCounter++);
+                }
+                anb.setValue(atts.getValue(i));
+                leafNodeEnd();
+
             }
             enb.endAttributeChunk();
             enb.startChildrenChunk();
@@ -250,6 +378,16 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
             }
             cnb.setValue(tempABVS);
             endChildInParent(cnb);
+
+            // Save to leavesABVS
+            leafNodeStart(LEAF_COMMENT);
+            cnb.reset(leavesABVS);
+            if (createNodeIds) {
+                cnb.setLocalNodeId(nodeIdCounter);
+            }
+            cnb.setValue(buffer.toString());
+            leafNodeEnd();
+
             buffer.delete(0, buffer.length());
         } catch (IOException e) {
             e.printStackTrace();
@@ -267,6 +405,16 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
             }
             tnb.setValue(tempABVS);
             peekENBStackTop().endChild(tnb);
+
+            // Save to leavesABVS
+            leafNodeStart(LEAF_TEXT);
+            tnb.reset(leavesABVS);
+            if (createNodeIds) {
+                tnb.setLocalNodeId(nodeIdCounter);
+            }
+            tnb.setValue(buffer.toString());
+            leafNodeEnd();
+
             buffer.delete(0, buffer.length());
             pendingText = false;
         }
@@ -314,6 +462,100 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
         out.write(docABVS.getByteArray(), docABVS.getStartOffset(), docABVS.getLength());
     }
 
+    public void writeOnce(ArrayBackedValueStorage abvs) throws IOException {
+        DataOutput out = abvs.getDataOutput();
+        out.write(ValueTag.NODE_TREE_TAG);
+        byte header = NodeTreePointable.HEADER_DICTIONARY_EXISTS_MASK;
+        if (attachTypes) {
+            header |= NodeTreePointable.HEADER_TYPE_EXISTS_MASK;
+        }
+        if (createNodeIds) {
+            header |= NodeTreePointable.HEADER_NODEID_EXISTS_MASK;
+        }
+        out.write(header);
+        if (createNodeIds) {
+            out.writeInt(nodeIdProvider.getId());
+        }
+        db.write(abvs);
+
+        for (int i = 0; i < leavesKind.getSize(); ++i) {
+            if (leavesKind.getArray()[i] == LEAF_PRE_DOCUMENT) {
+                out.write(leavesABVS.getByteArray(), leavesStart.getArray()[i],
+                        leavesEnd.getArray()[i] - leavesStart.getArray()[i]);
+
+                int children = leavesChildrenCount.getArray()[i];
+                if (children > 0) {
+                    out.writeInt(children);
+                    int offset = abvs.getLength();
+                    for (int s = 0; s < children; ++s) {
+                        out.writeInt(-1);
+                        addChildSlot(offset, s, children);
+                    }
+                }
+                // Continue with nodes.
+
+            } else if (leavesKind.getArray()[i] == LEAF_PRE_NODE) {
+                int nsCount = 0;
+                int attrCount = leavesAttributeCount.getArray()[i];
+                int childrenCount = leavesChildrenCount.getArray()[i];
+
+                ElementNodeBuilder enb2 = createENB();
+                enb2.setMvs(abvs);
+                enb2.setTagHeader(nsCount, attrCount, childrenCount);
+
+                out.write(leavesABVS.getByteArray(), leavesStart.getArray()[i],
+                        leavesEnd.getArray()[i] - leavesStart.getArray()[i]);
+
+                if (attrCount > 0) {
+                    out.writeInt(attrCount);
+                    int offset = abvs.getLength();
+                    for (int s = 0; s < attrCount; ++s) {
+                        out.writeInt(-1);
+                        addChildSlot(offset, s, attrCount);
+                    }
+                    for (int s = 0; s < attrCount; ++s) {
+                        ++i;
+                        out.write(leavesABVS.getByteArray(), leavesStart.getArray()[i], leavesEnd.getArray()[i]
+                                - leavesStart.getArray()[i]);
+                    }
+                }
+
+                if (childrenCount > 0) {
+                    out.writeInt(childrenCount);
+                    int offset = abvs.getLength();
+                    for (int s = 0; s < childrenCount; ++s) {
+                        out.writeInt(-1);
+                        addChildSlot(offset, s, childrenCount);
+                    }
+                }
+                // Continue with nodes.
+
+            } else {
+                if (leavesKind.getArray()[i] != LEAF_POST_DOCUMENT && leavesKind.getArray()[i] != LEAF_POST_NODE)
+                out.write(leavesABVS.getByteArray(), leavesStart.getArray()[i],
+                        leavesEnd.getArray()[i] - leavesStart.getArray()[i]);
+                finishChildSlot(abvs);
+            }
+        }
+    }
+
+    private void addChildSlot(int offset, int count, int total) {
+        childStartOffset.insert(childSlotCounter, offset + total * SLOT_SIZE);
+        childSlotOffset.insert(childSlotCounter, offset + (total - count - 1) * SLOT_SIZE);
+        childSlotCounter++;
+
+        for (int i = 0; i < childSlotCounter; ++i) {
+            System.err.println("\t\t" + i + " " + childStartOffset.getArray()[i] + " - "
+                    + childSlotOffset.getArray()[i]);
+        }
+    }
+
+    private void finishChildSlot(ArrayBackedValueStorage abvs) {
+        childSlotCounter--;
+        int length = abvs.getLength() - childStartOffset.getArray()[childSlotCounter];
+        IntegerPointable.setInteger(abvs.getByteArray(), childSlotOffset.getArray()[childSlotCounter], length);
+    }
+
     private ElementNodeBuilder createENB() {
         if (freeENBList.isEmpty()) {
             return new ElementNodeBuilder();
@@ -344,4 +586,32 @@ public class SAXContentHandler implements ContentHandler, LexicalHandler {
             peekENBStackTop().endChild(anb);
         }
     }
+
+    private void leafNodeStart(int kind) {
+        leavesKind.append(kind);
+        leavesStart.append(leavesABVS.getLength());
+        leavesDepth.append(textCurrentDepth);
+        leavesAttributeCount.append(0);
+        leavesChildrenCount.append(0);
+
+        int parent = previousLeaf.getArray()[textCurrentDepth - 1];
+        leavesParent.append(parent);
+        if (kind == LEAF_POST_NODE || kind == LEAF_POST_DOCUMENT) {
+            // Skip Count
+        } else if (kind == LEAF_ATTRIBUTE) {
+            leavesAttributeCount.getArray()[parent] += 1;
+        } else if (textCount != parent) {
+            leavesChildrenCount.getArray()[parent] += 1;
+        }
+        // If it can have children.
+        if (kind == LEAF_PRE_NODE || kind == LEAF_PRE_DOCUMENT) {
+            previousLeaf.getArray()[textCurrentDepth] = textCount;
+        }
+    }
+
+    private void leafNodeEnd() {
+        leavesEnd.append(leavesABVS.getLength());
+        textCount++;
+    }
+
 }
\ No newline at end of file