|
From: <pm_...@us...> - 2012-02-07 08:51:47
|
Revision: 4519
http://mxquery.svn.sourceforge.net/mxquery/?rev=4519&view=rev
Author: pm_fischer
Date: 2012-02-07 08:51:38 +0000 (Tue, 07 Feb 2012)
Log Message:
-----------
Single path works for keep/keep sub
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java 2012-02-07 08:50:27 UTC (rev 4518)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java 2012-02-07 08:51:38 UTC (rev 4519)
@@ -34,8 +34,10 @@
import ch.ethz.mxquery.datamodel.xdm.TextToken;
import ch.ethz.mxquery.datamodel.xdm.Token;
import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
+import ch.ethz.mxquery.exceptions.ErrorCodes;
import ch.ethz.mxquery.exceptions.MXQueryException;
import ch.ethz.mxquery.exceptions.QueryLocation;
+import ch.ethz.mxquery.model.AbstractStep;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.Utils;
@@ -48,8 +50,8 @@
private int [] projPathPos;
+ int skipKeepLevel = -1;
-
private int PROJ_MODE_NORMAL = 0;
private int PROJ_MODE_SKIP = 1;
private int PROJ_MODE_KEEP_SUB = 2;
@@ -69,6 +71,7 @@
if (endOfSeq)
return tok;
try {
+ while (reader.hasNext()) {
int event = reader.getEventType();
switch (event) {
case XMLStreamConstants.ATTRIBUTE:
@@ -79,6 +82,11 @@
case XMLStreamConstants.CHARACTERS:
case XMLStreamConstants.SPACE:
{
+ if (curProjMode == PROJ_MODE_SKIP) {
+ reader.next();
+ continue;
+ }
+
StringBuffer mergedText = new StringBuffer();
while (event == XMLStreamConstants.CDATA || event == XMLStreamConstants.SPACE || event == XMLStreamConstants.CHARACTERS) {
mergedText.append(reader.getText());
@@ -88,6 +96,9 @@
return new TextToken(Type.TEXT_NODE_UNTYPED_ATOMIC, createNextTokenId(Type.TEXT_NODE_UNTYPED_ATOMIC, null), mergedText.toString(),curNsScope);
}
case XMLStreamConstants.COMMENT:
+ if (curProjMode == PROJ_MODE_SKIP)
+ continue;
+
tok = new CommentToken(createNextTokenId(Type.COMMENT, null), reader.getText(),curNsScope);
break;
case XMLStreamConstants.END_DOCUMENT:
@@ -99,10 +110,48 @@
String prefix = reader.getPrefix();
if (prefix != null && prefix.length() == 0)
prefix = null;
- XQName tName = new QName(ns_uri, prefix, name);
- tok = new ElementToken(Type.END_TAG, null, tName, curNsScope);
- checkCloseNsScope();
+ //
+ boolean stillSkip = false;
+ if (curProjMode == PROJ_MODE_SKIP && level == skipKeepLevel) {
+ curProjMode = PROJ_MODE_KEEP;
+ skipKeepLevel = -1;
+ stillSkip = true;
+ }
+ if (curProjMode == PROJ_MODE_KEEP && projPathPos[0] > 0) {
+ XQName curPathCheck = ((AbstractStep) ((Vector)projectionPaths.get(0)).elementAt(projPathPos[0])).getNodeTest().getXQName();
+ if (curPathCheck.getLocalPart().equals(name)) { //TODO: Handle namespaces
+ projPathPos[0]--;
+ }
+ if (projPathPos[0]+2 >= ((Vector)projectionPaths.get(0)).size())
+ stillSkip = false;
+ }
+
+ if (curProjMode == PROJ_MODE_MOVE && projPathPos[0] > 0) {
+ XQName curPathCheck = ((AbstractStep) ((Vector)projectionPaths.get(0)).elementAt(projPathPos[0]-1)).getNodeTest().getXQName();
+ if (curPathCheck.getLocalPart().equals(name)) { //TODO: Handle namespaces
+ projPathPos[0]--;
+ }
+ }
+
+ if (curProjMode == PROJ_MODE_KEEP_SUB && level == skipKeepLevel-1) {
+ XQName curPathCheck = ((AbstractStep) ((Vector)projectionPaths.get(0)).elementAt(projPathPos[0]-1)).getNodeTest().getXQName();
+ if (!curPathCheck.getLocalPart().equals(name))
+ throw new MXQueryException(ErrorCodes.A0007_EC_IO, "Inconsistency in projecting, expected "+curPathCheck.getLocalPart()+" saw "+name, loc);
+ curProjMode = PROJ_MODE_MOVE;
+ skipKeepLevel = -1;
+ projPathPos[0]-=2; // go back from the "keep" pseudo node
+ }
+ if (curProjMode != PROJ_MODE_SKIP && !stillSkip) {
+ XQName tName = new QName(ns_uri, prefix, name);
+ tok = new ElementToken(Type.END_TAG, null, tName, curNsScope);
+ checkCloseNsScope();
+ stillSkip = false;
+ }
level--;
+ if (curProjMode == PROJ_MODE_SKIP || stillSkip) {
+ reader.next();
+ continue;
+ }
break;
case XMLStreamConstants.ENTITY_DECLARATION: // not used
break;
@@ -111,17 +160,32 @@
case XMLStreamConstants.NAMESPACE:
break;
case XMLStreamConstants.NOTATION_DECLARATION:
+ if (curProjMode == PROJ_MODE_SKIP)
+ continue;
tok = new TextToken(createNextTokenId(Type.NOTATION, null), reader.getText());
break;
case XMLStreamConstants.PROCESSING_INSTRUCTION:
+ if (curProjMode == PROJ_MODE_SKIP)
+ continue;
tok = new ProcessingInstrToken(createNextTokenId(Type.PROCESSING_INSTRUCTION, null), reader.getPIData(), reader.getPITarget(),curNsScope);
break;
case XMLStreamConstants.START_DOCUMENT:
+ AbstractStep as = ((AbstractStep) ((Vector)projectionPaths.get(0)).elementAt(projPathPos[0]));
+ if (as == AbstractStep.ROOT_STEP) {
+ projPathPos[0]++;
+ curProjMode = PROJ_MODE_MOVE;
+ }
+
tok = new Token(Type.START_DOCUMENT,createNextTokenId(Type.START_DOCUMENT, null),curNsScope);
break;
case XMLStreamConstants.START_ELEMENT:
level++;
+ if (curProjMode == PROJ_MODE_SKIP) {
+ reader.next();
+ continue;
+ }
+
boolean foundId = false;
boolean foundIdREFS = false;
@@ -136,11 +200,37 @@
// projection:
// check if node name fits with currently active paths
-
-
+ boolean skipOnNext = false;
+ as = ((AbstractStep) ((Vector)projectionPaths.get(0)).elementAt(projPathPos[0]));
+ if (as == AbstractStep.KEEP_SUBTREE) {
+ curProjMode = PROJ_MODE_KEEP_SUB;
+ skipKeepLevel = level;
+ }
+ else {
+ XQName curPathCheck = as.getNodeTest().getXQName();
+ if (curPathCheck.getLocalPart().equals(name)) { //TODO: Handle namespaces
+ if (((Vector)projectionPaths.get(0)).size() <= projPathPos[0]+1) {
+ curProjMode = PROJ_MODE_SKIP;
+ skipOnNext = true;
+ skipKeepLevel = level;
+ }
+ else {
+ projPathPos[0]++;
+ curProjMode = PROJ_MODE_MOVE;
+ }
+
+ } else {
+ curProjMode = PROJ_MODE_SKIP;
+ skipKeepLevel = level;
+ }
+ }
+ if (curProjMode == PROJ_MODE_SKIP && !skipOnNext) {
+ reader.next();
+ continue;
+ }
if (prefix != null && prefix.length() == 0)
prefix = null;
- tName = new QName(ns_uri, prefix, name);
+ XQName tName = new QName(ns_uri, prefix, name);
tok = new ElementToken(Type.START_TAG, createNextTokenId(Type.START_TAG, tName.toString()), tName, curNsScope);
for (int i = 0; i < reader.getNamespaceCount(); i++) {
@@ -212,6 +302,9 @@
break;
default:
}
+ if (tok != null)
+ break;
+ }
if (reader.hasNext())
reader.next();
else {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|