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