|
From: <pm_...@us...> - 2011-05-05 07:30:48
|
Revision: 4314
http://mxquery.svn.sourceforge.net/mxquery/?rev=4314&view=rev
Author: pm_fischer
Date: 2011-05-05 07:30:42 +0000 (Thu, 05 May 2011)
Log Message:
-----------
wrapped object token, split atomic item factory
Added Paths:
-----------
trunk/MXQuery/src/ch/ethz/mxquery/datamodel/xdm/WrappedObjectToken.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/SharedAtomicItemFactory.java
Added: trunk/MXQuery/src/ch/ethz/mxquery/datamodel/xdm/WrappedObjectToken.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/datamodel/xdm/WrappedObjectToken.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/datamodel/xdm/WrappedObjectToken.java 2011-05-05 07:30:42 UTC (rev 4314)
@@ -0,0 +1,18 @@
+package ch.ethz.mxquery.datamodel.xdm;
+
+import ch.ethz.mxquery.datamodel.types.Type;
+/**
+ * Generic Java Object wrapper to handle imported Java classes
+ * @author Peter Fischer
+ *
+ */
+public class WrappedObjectToken extends Token {
+ Object wrappedObject;
+ public WrappedObjectToken(Object objectToWrap) {
+ super(Type.ITEM,null,null);
+ wrappedObject = objectToWrap;
+ }
+ public Object getWrappedObject() {
+ return wrappedObject;
+ }
+}
Added: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/SharedAtomicItemFactory.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/SharedAtomicItemFactory.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/SharedAtomicItemFactory.java 2011-05-05 07:30:42 UTC (rev 4314)
@@ -0,0 +1,471 @@
+/* Copyright 2006 - 2009 ETH Zurich
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.mxquery.xdmio;
+
+
+import ch.ethz.mxquery.contextConfig.Context;
+import ch.ethz.mxquery.datamodel.MXQueryBigDecimal;
+import ch.ethz.mxquery.datamodel.MXQueryBinary;
+import ch.ethz.mxquery.datamodel.MXQueryDate;
+import ch.ethz.mxquery.datamodel.MXQueryDateTime;
+import ch.ethz.mxquery.datamodel.MXQueryDouble;
+import ch.ethz.mxquery.datamodel.MXQueryDuration;
+import ch.ethz.mxquery.datamodel.MXQueryFloat;
+import ch.ethz.mxquery.datamodel.MXQueryGregorian;
+import ch.ethz.mxquery.datamodel.MXQueryTime;
+import ch.ethz.mxquery.datamodel.QName;
+import ch.ethz.mxquery.datamodel.types.Type;
+import ch.ethz.mxquery.datamodel.xdm.AnyURIToken;
+import ch.ethz.mxquery.datamodel.xdm.BooleanToken;
+import ch.ethz.mxquery.datamodel.xdm.DateTimeToken;
+import ch.ethz.mxquery.datamodel.xdm.DateToken;
+import ch.ethz.mxquery.datamodel.xdm.DecimalToken;
+import ch.ethz.mxquery.datamodel.xdm.DoubleToken;
+import ch.ethz.mxquery.datamodel.xdm.DurationToken;
+import ch.ethz.mxquery.datamodel.xdm.FloatToken;
+import ch.ethz.mxquery.datamodel.xdm.GregorianToken;
+import ch.ethz.mxquery.datamodel.xdm.LongToken;
+import ch.ethz.mxquery.datamodel.xdm.QNameToken;
+import ch.ethz.mxquery.datamodel.xdm.TextToken;
+import ch.ethz.mxquery.datamodel.xdm.TimeToken;
+import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
+import ch.ethz.mxquery.datamodel.xdm.UntypedAtomicToken;
+import ch.ethz.mxquery.exceptions.ErrorCodes;
+import ch.ethz.mxquery.exceptions.MXQueryException;
+import ch.ethz.mxquery.exceptions.QueryLocation;
+import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.iterators.TokenIterator;
+import ch.ethz.mxquery.model.XDMIterator;
+
+/**
+ * Factory to create items of all atomic types in XDM
+ * @author Peter Fischer
+ *
+ */
+ class SharedAtomicItemFactory {
+ /**
+ * Creates an AnyURI Item
+ * @param uri the String to be represented as anyURI item
+ * @return an XDM Iterator representing the constructed AnyURI Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createAnyURI(final String uri) throws MXQueryException{
+ return createTextTypeItem(null, uri, Type.ANY_URI);
+ }
+ /**
+ * Creates a Base 64 Binary Item
+ * @param base64Val String representation of a Base 64 value
+ * @return an XDM Iterator representing the constructed Base 64 Binary Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createBase64Binary(String base64Val) throws MXQueryException {
+ MXQueryBinary bin = new MXQueryBinary(base64Val,Type.BASE64_BINARY);
+ return new TokenIterator(null,bin,QueryLocation.OUTSIDE_QUERY_LOC);
+ }
+ /**
+ * Creates a Base 64 Binary Item
+ * @param binValue binary values to be represented as Base 64
+ * @return an XDM Iterator representing the constructed Base 64 Binary Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createBase64Binary(byte [] binValue) throws MXQueryException {
+ MXQueryBinary bin = new MXQueryBinary(binValue,Type.BASE64_BINARY);
+ return new TokenIterator(null,bin,QueryLocation.OUTSIDE_QUERY_LOC);
+ }
+
+ /**
+ * Creates a Boolean Item
+ * @param val the boolean value for the item
+ * @return an XDM Iterator representing the constructed Boolean Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createBoolean(boolean val) throws MXQueryException{
+ BooleanToken myToken;
+ if (val)
+ myToken = BooleanToken.TRUE_TOKEN;
+ else
+ myToken = BooleanToken.FALSE_TOKEN;
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Byte Item
+ * @param bVal the byte value for the item
+ * @return an XDM Iterator representing the constructed Byte Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createByte(byte bVal) throws MXQueryException {
+ LongToken myToken = new LongToken(Type.BYTE,null,bVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Date Item
+ * @param dVal a String expressing the date for this item (XML Schema/XQuery format)
+ * @return an XDM Iterator representing the constructed Date Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createDate(String dVal) throws MXQueryException{
+ MXQueryDate date = new MXQueryDate(dVal);
+ return new TokenIterator(null,new DateToken(null,date),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a DateTime Item
+ * @param dTimeVal a String expressing the dateTime for this item (XML Schema/XQuery format)
+ * @return an XDM Iterator representing the constructed DateTim Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createDateTime(String dTimeVal) throws MXQueryException{
+ MXQueryDateTime dateTime = new MXQueryDateTime(dTimeVal);
+ return new TokenIterator(null,new DateTimeToken(null,dateTime),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Duration Item
+ * @param durVal a String expressing the duration for this item (XML Schema/XQuery format)
+ * @return an XDM Iterator representing the constructed Duration Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createDuration(String durVal) throws MXQueryException{
+ MXQueryDuration dur = new MXQueryDuration(durVal);
+ return new TokenIterator(null,new DurationToken(null,dur),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Decimal Item
+ * @param dVal a MXQueryBigDecimal expressing the decimal value for this item
+ * @return an XDM Iterator representing the constructed Decimal Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createDecimal(MXQueryBigDecimal dVal) throws MXQueryException{
+ return new TokenIterator(null, new DecimalToken(null,dVal),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Double Item
+ * @param dVal a MXQueryDouble expressing the double value for this item
+ * @return an XDM Iterator representing the constructed Double Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createDouble(MXQueryDouble dVal) throws MXQueryException{
+ return new TokenIterator(null,new DoubleToken(null,dVal),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Float Item
+ * @param fVal a MXQueryFloat expressing the float value for this item
+ * @return an XDM Iterator representing the constructed Float Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createFloat(MXQueryFloat fVal) throws MXQueryException{
+ return new TokenIterator(null,new FloatToken(null,fVal),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Gregorian Day Item
+ * @param gDayVal the day number (1-31) expressing the Gregorian Day for this item
+ * @return an XDM Iterator representing the constructed Gregorian Day Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createGDay(int gDayVal) throws MXQueryException{
+ MXQueryGregorian gDay = new MXQueryGregorian(0,0,gDayVal,0,Type.G_DAY);
+ return new TokenIterator(null,new GregorianToken(null,gDay),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Gregorian Month Item
+ * @param gMonthVal the month number (1-12) expressing the Gregorian Month for this item
+ * @return an XDM Iterator representing the constructed Gregorian Month Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createGMonth(int gMonthVal) throws MXQueryException{
+ MXQueryGregorian gMonth = new MXQueryGregorian(0,gMonthVal,0,0,Type.G_MONTH);
+ return new TokenIterator(null,new GregorianToken(null,gMonth),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Gregorian MonthDay Item
+ * @param gMonthVal gMonthVal the month number (1-12) expressing the Gregorian Month for this item
+ * @param gDayVal the day number (1-31) expressing the Gregorian Day for this item
+ * @return an XDM Iterator representing the constructed Gregorian MonthDay Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createGMonthDay(int gMonthVal, int gDayVal) throws MXQueryException {
+ MXQueryGregorian gMonthDay = new MXQueryGregorian(0,gMonthVal,gDayVal,0,Type.G_MONTH_DAY);
+ return new TokenIterator(null,new GregorianToken(null,gMonthDay),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Gregorian Year Item
+ * @param gYearVal the year number expressing the Gregorian Year for this item
+ * @return an XDM Iterator representing the constructed Gregorian Year Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createGYear(int gYearVal) throws MXQueryException {
+ MXQueryGregorian gYear = new MXQueryGregorian(gYearVal,0,0,0,Type.G_YEAR);
+ return new TokenIterator(null,new GregorianToken(null,gYear),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Gregorian YearMonth Item
+ * @param gYearVal gYearVal the year number expressing the Gregorian Year for this item
+ * @param gMonthVal gMonthVal the month number (1-12) expressing the Gregorian Month for this item
+ * @return an XDM Iterator representing the constructed Gregorian YearMonth Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createGYearMonth(int gYearVal,int gMonthVal) throws MXQueryException {
+ MXQueryGregorian gYearMonth = new MXQueryGregorian(gYearVal,gMonthVal,0,0,Type.G_YEAR_MONTH);
+ return new TokenIterator(null,new GregorianToken(null,gYearMonth),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Hex Binary Item from a string representation
+ * @param hexVal a string expressing the hex binary value for this item
+ * @return an XDM Iterator representing the constructed HexBinary Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createHexBinary(String hexVal) throws MXQueryException {
+ MXQueryBinary bin = new MXQueryBinary(hexVal,Type.HEX_BINARY);
+ return new TokenIterator(null,bin,QueryLocation.OUTSIDE_QUERY_LOC);
+ }
+ /**
+ * Creates a Hex Binary Item from a binary representation
+ * @param binValue a byte array expressing the hex binary value for this item
+ * @return an XDM Iterator representing the constructed HexBinary Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createHexBinary(byte [] binValue) throws MXQueryException {
+ MXQueryBinary bin = new MXQueryBinary(binValue,Type.HEX_BINARY);
+ return new TokenIterator(null,bin,QueryLocation.OUTSIDE_QUERY_LOC);
+ }
+ /**
+ * Creates an Int Item
+ * @param intVal an integer expressing the int value for this item
+ * @return an XDM Iterator representing the constructed Int Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createInt(int intVal) throws MXQueryException {
+ LongToken myToken = new LongToken(Type.INT,null,intVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates an Integer Item
+ * @param intVal an integer expressing the integer value for this item
+ * @return an XDM Iterator representing the constructed Integer Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createInteger(long intVal) throws MXQueryException {
+ LongToken myToken = new LongToken(Type.INTEGER,null,intVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Long Item
+ * @param longVal a long expressing the long value for this item
+ * @return an XDM Iterator representing the constructed Long Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createLong(long longVal) throws MXQueryException{
+ LongToken myToken = new LongToken(Type.LONG,null,longVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a NCName Item
+ * @param ncname a String expressing the NCNAME value for this item
+ * @return an XDM Iterator representing the constructed NCNAME Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createNCName(final String ncname) throws MXQueryException{
+ return createTextTypeItem(null, ncname, Type.NCNAME);
+ }
+ /**
+ * Creates a Negative Integer Item
+ * @param longVal a long expressing the negative integer value for this item
+ * @return an XDM Iterator representing the constructed Negative Integer Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createNegativeInteger(long longVal) throws MXQueryException{
+ LongToken myToken = new LongToken(Type.NEGATIVE_INTEGER,null,longVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Non-Negative Integer Item
+ * @param longVal a long expressing the non-negative integer value for this item
+ * @return an XDM Iterator representing the constructed Non-Negative Integer Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createNonNegativeInteger(long longVal) throws MXQueryException{
+ LongToken myToken = new LongToken(Type.NON_NEGATIVE_INTEGER,null,longVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Non-Positive Integer Item
+ * @param longVal a long expressing the non-positive integer value for this item
+ * @return an XDM Iterator representing the constructed Non-Positive Integer Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createNonPositiveInteger(long longVal) throws MXQueryException{
+ LongToken myToken = new LongToken(Type.NON_POSITIVE_INTEGER,null,longVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Positive Integer Item
+ * @param longVal a long expressing the positive integer value for this item
+ * @return an XDM Iterator representing the constructed Positive Integer Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createPositiveInteger(long longVal) throws MXQueryException{
+ LongToken myToken = new LongToken(Type.POSITIVE_INTEGER,null,longVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a QName Item
+ * @param prefix a string representing the namespace prefix
+ * @param localName a string representing the local name
+ * @return an XDM Iterator representing the constructed QName Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createQName(String prefix, String localName) throws MXQueryException{
+ QName qn = new QName(prefix,localName);
+ return new TokenIterator(null,new QNameToken(null,qn),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a qualified QName Item
+ * @param namespace a string representing the namespace URI
+ * @param prefix a string representing the namespace prefix
+ * @param localName a string representing the local name
+ * @return an XDM Iterator representing the constructed QName Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createQName(String namespace, String prefix, String localName) throws MXQueryException{
+ QName qn = new QName(namespace, prefix,localName);
+ return new TokenIterator(null,new QNameToken(null,qn),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a Short Item
+ * @param shortVal a short expressing the short value for this item
+ * @return an XDM Iterator representing the constructed Short Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createShort(short shortVal) throws MXQueryException{
+ LongToken myToken = new LongToken(Type.SHORT,null,shortVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates a String Item
+ * @param str a String expressing the string value for this item
+ * @return an XDM Iterator representing the constructed String Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createString(final String str) throws MXQueryException{
+ return createTextTypeItem(null, str, Type.STRING);
+ }
+ /**
+ * Creates a Time Item
+ * @param timeVal a string expressing the time value for this item (XML Schema/XQuery format)
+ * @return an XDM Iterator representing the constructed Time Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createTime(String timeVal) throws MXQueryException{
+ MXQueryTime time = new MXQueryTime(timeVal);
+ return new TokenIterator(null, new TimeToken(null,time),QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates an Unsigned Byte Item
+ * @param ubVal a short expressing the unsigned byte value for this item
+ * @return an XDM Iterator representing the constructed Unsigned Byte Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createUnsignedByte(short ubVal) throws MXQueryException{
+ LongToken myToken = new LongToken(Type.UNSIGNED_BYTE,null,ubVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates an Unsigned Int Item
+ * @param usVal a long expressing the unsigned int value for this item
+ * @return an XDM Iterator representing the constructed Unsigned Int Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createUnsignedInt(long usVal) throws MXQueryException{
+ LongToken myToken = new LongToken(Type.UNSIGNED_INT,null,usVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates an Unsigned Long Item. Note: Unsigned Long is limited to the signed long space in MXQuery
+ * @param ulVal a long expressing the unsigned long value for this item
+ * @return an XDM Iterator representing the constructed Unsigned Long Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createUnsignedLong(long ulVal) throws MXQueryException {
+ LongToken myToken = new LongToken(Type.UNSIGNED_LONG,null,ulVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Creates an Unsigned Short Item
+ * @param uiVal an integer expressing the unsigned short value for this item
+ * @return an XDM Iterator representing the constructed Unsigned Short Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createUnsignedShort(int uiVal) throws MXQueryException{
+ LongToken myToken = new LongToken(Type.UNSIGNED_SHORT,null,uiVal);
+ return new TokenIterator(null,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+
+ /**
+ * Creates a untyped atomic Item
+ * @param str a String expressing the string value for this item
+ * @return an XDM Iterator representing the constructed String Item
+ * @throws MXQueryException
+ */
+ public static XDMIterator createUntypedAtomic(final String str) throws MXQueryException{
+ return createTextTypeItem(null, str, Type.UNTYPED_ATOMIC);
+ }
+
+ private static XDMIterator createTextTypeItem (Context ctx, String value, int type) throws MXQueryException {
+
+ TokenInterface myToken;
+
+ int checkType = Type.getEventTypeSubstituted(type, Context.getDictionary());
+
+ switch (checkType) {
+ case Type.STRING:
+ case Type.UNTYPED:
+ myToken = new TextToken(type, null, value,null);
+ break;
+
+ case Type.UNTYPED_ATOMIC:
+ myToken = new UntypedAtomicToken(null, value);
+ break;
+
+ case Type.ANY_URI:
+ myToken = new AnyURIToken(null, value);
+ break;
+ default:
+ throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE,"Incorrect type passed: " + Type.getTypeQName(type, Context.getDictionary()),QueryLocation.OUTSIDE_QUERY_LOC );
+ }
+ return new TokenIterator(ctx,myToken,QueryLocation.OUTSIDE_QUERY_LOC, false);
+ }
+ /**
+ * Create an atomic type item from the given Java object
+ * An error is raised there is no matching atomic type or if values are incorrect
+ * @param val A Java object to be converted into a XDM atomic type
+ * @return an XDMIterator producing this atomic type
+ * @throws MXQueryException
+ */
+ public static XDMIterator createAtomicItemType(Object val) throws MXQueryException{
+ // use getName() as it available on all platforms
+ if(val.getClass().getName().equals("java.lang.Boolean"))
+ return createBoolean(((Boolean)val).booleanValue());
+ if(val.getClass().getName().equals("java.lang.Byte"))
+ return createByte(((Byte)val).byteValue());
+ if(val.getClass().getName().equals("java.lang.Integer"))
+ return createInt(((Integer)val).intValue());
+ if(val.getClass().getName().equals("java.lang.Long"))
+ return createLong(((Long)val).longValue());
+ if(val.getClass().getName().equals("java.lang.Short"))
+ return createShort(((Short)val).shortValue());
+ if(val.getClass().getName().equals("java.lang.String"))
+ return createString((String)val);
+ throw new MXQueryException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE, "Could not convert to atomic type", QueryLocation.OUTSIDE_QUERY_LOC);
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pm_...@us...> - 2011-05-16 14:27:17
|
Revision: 4342
http://mxquery.svn.sourceforge.net/mxquery/?rev=4342&view=rev
Author: pm_fischer
Date: 2011-05-16 14:27:10 +0000 (Mon, 16 May 2011)
Log Message:
-----------
added map(), filter(), map-pairs()
minor cleanup and bug fixes
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/bindings/WindowSequenceIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/functions/FG.xml
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Contains.java
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/EndsWith.java
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/StartsWith.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/FFLWORIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/SequenceTypeIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/UserdefFuncCallLateBinding.java
Added Paths:
-----------
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Filter.java
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Map.java
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/MapPairs.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/bindings/WindowSequenceIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/bindings/WindowSequenceIterator.java 2011-05-16 10:18:59 UTC (rev 4341)
+++ trunk/MXQuery/src/ch/ethz/mxquery/bindings/WindowSequenceIterator.java 2011-05-16 14:27:10 UTC (rev 4342)
@@ -127,6 +127,8 @@
this.endNode = endNode;
this.nodeId = startNode;
tokenIdOutdated = true;
+ if (mat.getSource()!=null)
+ context = mat.getSource().getContext();
}
public boolean hasItem(int position) throws MXQueryException {
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/FG.xml
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/FG.xml 2011-05-16 10:18:59 UTC (rev 4341)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/FG.xml 2011-05-16 14:27:10 UTC (rev 4342)
@@ -403,6 +403,12 @@
<className>False</className>
</functionDescription>
<functionDescription>
+ <functionName>filter</functionName>
+ <parameters><paramType>function(*)</paramType>
+ <paramType>item()*</paramType></parameters>
+ <className>Filter</className>
+ </functionDescription>
+ <functionDescription>
<functionName>floor</functionName>
<parameters>
<paramType>numeric?</paramType>
@@ -410,6 +416,20 @@
<className>Floor</className>
</functionDescription>
<functionDescription>
+ <functionName>fold-left</functionName>
+ <parameters><paramType>function(*)</paramType>
+ <paramType>item()*</paramType>
+ <paramType>item()*</paramType></parameters>
+ <className op="left">fold</className>
+ </functionDescription>
+ <functionDescription>
+ <functionName>fold-right</functionName>
+ <parameters><paramType>function(*)</paramType>
+ <paramType>item()*</paramType>
+ <paramType>item()*</paramType></parameters>
+ <className op="right">fold</className>
+ </functionDescription>
+ <functionDescription>
<functionName>function-name</functionName>
<parameters>
<paramType>function(*)</paramType>
@@ -585,6 +605,24 @@
<className>LowerCase</className>
</functionDescription>
<functionDescription>
+ <functionName>map</functionName>
+ <parameters>
+ <paramType>function(*)</paramType>
+ <paramType>item()*</paramType>
+ </parameters>
+ <className>Map</className>
+ </functionDescription>
+ <functionDescription>
+ <functionName>map-pairs</functionName>
+ <parameters>
+ <paramType>function(*)</paramType>
+ <paramType>item()*</paramType>
+ <paramType>item()*</paramType>
+ </parameters>
+ <className>MapPairs</className>
+ </functionDescription>
+
+ <functionDescription>
<functionName>matches</functionName>
<parameters>
<paramType>xs:string?</paramType>
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Contains.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Contains.java 2011-05-16 10:18:59 UTC (rev 4341)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Contains.java 2011-05-16 14:27:10 UTC (rev 4342)
@@ -20,12 +20,9 @@
import ch.ethz.mxquery.datamodel.types.Type;
import ch.ethz.mxquery.datamodel.types.TypeInfo;
import ch.ethz.mxquery.datamodel.xdm.BooleanToken;
-import ch.ethz.mxquery.datamodel.xdm.Token;
-import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
import ch.ethz.mxquery.exceptions.DynamicException;
import ch.ethz.mxquery.exceptions.ErrorCodes;
import ch.ethz.mxquery.exceptions.MXQueryException;
-import ch.ethz.mxquery.exceptions.TypeException;
import ch.ethz.mxquery.model.TokenBasedIterator;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.Set;
@@ -35,22 +32,12 @@
protected void init() throws MXQueryException {
//currentToken = new BooleanToken(null);
- XDMIterator iter0 = subIters[0];
- XDMIterator iter1 = subIters[1];
+ String res = getStringValueOrEmpty(subIters[0]);
+ String res2 = getStringValueOrEmpty(subIters[1]);
- TokenInterface inputToken1 = iter0.next();
- int type = inputToken1.getEventType();
- TokenInterface inputToken2 = iter1.next();
- int type2 = inputToken2.getEventType();
-
if (subIters.length > 2) {
// Minimum collation test - raise error on all collations that are not codepoint
- XDMIterator collIter = subIters[2];
- TokenInterface collToken = collIter.next();
- if (collToken == Token.END_SEQUENCE_TOKEN ||
- !Type.isTypeOrSubTypeOf(collToken.getEventType(),Type.STRING, Context.getDictionary()))
- throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE, "Wrong type for collation", loc);
- String collUri = collToken.getText();
+ String collUri = getStringValue(subIters[2]);
Set collations = context.getCollations();
if (!collations.contains(collUri))
throw new DynamicException(ErrorCodes.F0010_UNSUPPORTED_COLLATION, "Unsupported Collation", loc);
@@ -58,19 +45,12 @@
}
- String res2 = "";
- if (type2 != Type.END_SEQUENCE)
- res2 = inputToken2.getText();
-
- if (res2.equals("")) {
+ if (res2 == null ||res2.equals("")) {
currentToken = BooleanToken.TRUE_TOKEN;
return;
}
- String res = "";
- if (type != Type.END_SEQUENCE)
- res = inputToken1.getText();
if (res == null || res.equals(""))
currentToken = BooleanToken.FALSE_TOKEN;
else {
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/EndsWith.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/EndsWith.java 2011-05-16 10:18:59 UTC (rev 4341)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/EndsWith.java 2011-05-16 14:27:10 UTC (rev 4342)
@@ -20,12 +20,9 @@
import ch.ethz.mxquery.datamodel.types.Type;
import ch.ethz.mxquery.datamodel.types.TypeInfo;
import ch.ethz.mxquery.datamodel.xdm.BooleanToken;
-import ch.ethz.mxquery.datamodel.xdm.Token;
-import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
import ch.ethz.mxquery.exceptions.DynamicException;
import ch.ethz.mxquery.exceptions.ErrorCodes;
import ch.ethz.mxquery.exceptions.MXQueryException;
-import ch.ethz.mxquery.exceptions.TypeException;
import ch.ethz.mxquery.model.TokenBasedIterator;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.Set;
@@ -33,48 +30,23 @@
public class EndsWith extends TokenBasedIterator {
protected void init() throws MXQueryException {
- XDMIterator iter0 = subIters[0];
- XDMIterator iter1 = subIters[1];
- TokenInterface inputToken1 = iter0.next();
- int type = inputToken1.getEventType();
- TokenInterface inputToken2 = iter1.next();
- int type2 = inputToken2.getEventType();
+ String res = getStringValueOrEmpty(subIters[0]);
+ String res2 = getStringValueOrEmpty(subIters[1]);
if (subIters.length > 2) {
// Minimum collation test - raise error on all collations that are not codepoint
- XDMIterator collIter = subIters[2];
- TokenInterface collToken = collIter.next();
- if (collToken == Token.END_SEQUENCE_TOKEN ||
- !Type.isTypeOrSubTypeOf(collToken.getEventType(),Type.STRING, Context.getDictionary()))
- throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE, "Wrong type for collation", loc);
- String collUri = collToken.getText();
- Set collations = context.getCollations();
+ String collUri = getStringValue(subIters[2]);
+ Set collations = context.getCollations();
if (!collations.contains(collUri))
throw new DynamicException(ErrorCodes.F0010_UNSUPPORTED_COLLATION, "Unsupported Collation", loc);
}
- String res2 = "";
- if (type2 != Type.END_SEQUENCE)
- res2 = inputToken2.getText();
- else {
+ if (res2 == null || res2.equals("")) {
currentToken = BooleanToken.TRUE_TOKEN;
return;
- }
-
- if (res2.equals("")) {
- currentToken = BooleanToken.TRUE_TOKEN;
- return;
}
-
- String res = "";
- if (type != Type.END_SEQUENCE)
- res = inputToken1.getText();
- else {
- currentToken = BooleanToken.FALSE_TOKEN;
- return;
- }
if (res == null || res.equals(""))
currentToken = BooleanToken.FALSE_TOKEN;
else {
Added: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Filter.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Filter.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Filter.java 2011-05-16 14:27:10 UTC (rev 4342)
@@ -0,0 +1,68 @@
+package ch.ethz.mxquery.functions.fn;
+
+import java.util.Vector;
+
+import ch.ethz.mxquery.contextConfig.Context;
+import ch.ethz.mxquery.datamodel.types.Type;
+import ch.ethz.mxquery.datamodel.types.TypeInfo;
+import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
+import ch.ethz.mxquery.exceptions.MXQueryException;
+import ch.ethz.mxquery.iterators.FFLWORIterator;
+import ch.ethz.mxquery.iterators.ForIterator;
+import ch.ethz.mxquery.iterators.SequenceTypeIterator;
+import ch.ethz.mxquery.iterators.UserdefFuncCallLateBinding;
+import ch.ethz.mxquery.iterators.VariableIterator;
+import ch.ethz.mxquery.model.CurrentBasedIterator;
+import ch.ethz.mxquery.model.Iterator;
+import ch.ethz.mxquery.model.XDMIterator;
+
+public class Filter extends CurrentBasedIterator {
+
+ public TokenInterface next() throws MXQueryException {
+ if (called == 0) {
+// TokenInterface tok = subIters[0].next();
+// if (tok.getEventType()!= Type.FUNCTION_ITEM)
+// throw new DynamicException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE,"Function Item expected",loc);
+ // FLWOR
+ Context flworScope = new Context(context);
+ Context forScope = new Context(flworScope);
+
+ forScope.registerNewContextItem();
+ // if (!(predicate instanceof FFLWORIterator))
+ TypeInfo [] params = new TypeInfo[1];
+ params[0] = new TypeInfo(Type.ITEM,Type.OCCURRENCE_IND_EXACTLY_ONE);
+ TypeInfo tInfo = new TypeInfo(Type.FUNCTION_ITEM, Type.OCCURRENCE_IND_EXACTLY_ONE, params, new TypeInfo(Type.BOOLEAN,Type.OCCURRENCE_IND_EXACTLY_ONE));
+ SequenceTypeIterator st = new SequenceTypeIterator(tInfo, true, true, context, loc, true);
+ st.setSubIters(subIters[0]);
+ Iterator[] its = null;
+ ForIterator forIt = new ForIterator(forScope,
+ new XDMIterator[] { subIters[1] }, Context.CONTEXT_ITEM,
+ null, null, true, loc, false);
+ its = new Iterator[] { forIt };
+ VariableIterator varIt = new VariableIterator(forScope,
+ Context.CONTEXT_ITEM, false, loc);
+ VariableIterator varIt1 = new VariableIterator(forScope,
+ Context.CONTEXT_ITEM, false, loc);
+
+ UserdefFuncCallLateBinding funcInv = new UserdefFuncCallLateBinding(context);
+ funcInv.setSubIters(new XDMIterator[]{st,varIt1});
+ current = new FFLWORIterator(context, its, funcInv,
+ varIt, loc);
+ current.staticInit();
+ current.setResettable(resettable);
+ // For over subiter[1]
+ // return with function item invocation
+ called++;
+ }
+ return current.next();
+ }
+
+ protected XDMIterator copy(Context context, XDMIterator[] subIters,
+ Vector nestedPredCtxStack) throws MXQueryException {
+ XDMIterator copy = new Filter();
+ copy.setContext(context, true);
+ copy.setSubIters(subIters);
+ return copy;
+ }
+
+}
Added: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Map.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Map.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Map.java 2011-05-16 14:27:10 UTC (rev 4342)
@@ -0,0 +1,65 @@
+package ch.ethz.mxquery.functions.fn;
+
+import java.util.Vector;
+
+import ch.ethz.mxquery.contextConfig.Context;
+import ch.ethz.mxquery.datamodel.types.Type;
+import ch.ethz.mxquery.datamodel.types.TypeInfo;
+import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
+import ch.ethz.mxquery.exceptions.MXQueryException;
+import ch.ethz.mxquery.iterators.FFLWORIterator;
+import ch.ethz.mxquery.iterators.ForIterator;
+import ch.ethz.mxquery.iterators.SequenceTypeIterator;
+import ch.ethz.mxquery.iterators.UserdefFuncCallLateBinding;
+import ch.ethz.mxquery.iterators.VariableIterator;
+import ch.ethz.mxquery.model.CurrentBasedIterator;
+import ch.ethz.mxquery.model.Iterator;
+import ch.ethz.mxquery.model.XDMIterator;
+
+public class Map extends CurrentBasedIterator {
+
+ public TokenInterface next() throws MXQueryException {
+ if (called == 0) {
+// TokenInterface tok = subIters[0].next();
+// if (tok.getEventType()!= Type.FUNCTION_ITEM)
+// throw new DynamicException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE,"Function Item expected",loc);
+ // FLWOR
+ Context flworScope = new Context(context);
+ Context forScope = new Context(flworScope);
+
+ forScope.registerNewContextItem();
+ // if (!(predicate instanceof FFLWORIterator))
+ TypeInfo [] params = new TypeInfo[1];
+ params[0] = new TypeInfo(Type.ITEM,Type.OCCURRENCE_IND_ZERO_OR_MORE);
+ TypeInfo tInfo = new TypeInfo(Type.FUNCTION_ITEM, Type.OCCURRENCE_IND_EXACTLY_ONE, params, new TypeInfo(Type.ITEM,Type.OCCURRENCE_IND_ZERO_OR_MORE));
+ SequenceTypeIterator st = new SequenceTypeIterator(tInfo, true, true, context, loc, true);
+ st.setSubIters(subIters[0]);
+
+ Iterator[] its = null;
+ ForIterator forIt = new ForIterator(forScope,
+ new XDMIterator[] { subIters[1] }, Context.CONTEXT_ITEM,
+ null, null, true, loc, false);
+ its = new Iterator[] { forIt };
+ VariableIterator varIt = new VariableIterator(forScope,
+ Context.CONTEXT_ITEM, false, loc);
+ UserdefFuncCallLateBinding funcInv = new UserdefFuncCallLateBinding(context);
+ funcInv.setSubIters(new XDMIterator[]{st,varIt});
+ current = new FFLWORIterator(context, its, null,
+ funcInv, loc);
+ current.staticInit();
+ // For over subiter[1]
+ // return with function item invocation
+ called++;
+ }
+ return current.next();
+ }
+
+ protected XDMIterator copy(Context context, XDMIterator[] subIters,
+ Vector nestedPredCtxStack) throws MXQueryException {
+ XDMIterator copy = new Map();
+ copy.setContext(context, true);
+ copy.setSubIters(subIters);
+ return copy;
+ }
+
+}
Added: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/MapPairs.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/MapPairs.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/MapPairs.java 2011-05-16 14:27:10 UTC (rev 4342)
@@ -0,0 +1,88 @@
+package ch.ethz.mxquery.functions.fn;
+
+import java.util.Vector;
+
+import ch.ethz.mxquery.bindings.WindowFactory;
+import ch.ethz.mxquery.contextConfig.Context;
+import ch.ethz.mxquery.datamodel.QName;
+import ch.ethz.mxquery.datamodel.types.Type;
+import ch.ethz.mxquery.datamodel.types.TypeInfo;
+import ch.ethz.mxquery.datamodel.xdm.Token;
+import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
+import ch.ethz.mxquery.exceptions.MXQueryException;
+import ch.ethz.mxquery.iterators.SequenceTypeIterator;
+import ch.ethz.mxquery.iterators.UserdefFuncCallLateBinding;
+import ch.ethz.mxquery.iterators.VariableIterator;
+import ch.ethz.mxquery.model.CurrentBasedIterator;
+import ch.ethz.mxquery.model.EmptySequenceIterator;
+import ch.ethz.mxquery.model.VariableHolder;
+import ch.ethz.mxquery.model.Window;
+import ch.ethz.mxquery.model.XDMIterator;
+
+public class MapPairs extends CurrentBasedIterator {
+ Window wnd1, wnd2;
+ VariableHolder vh1 = null, vh2 = null;
+ SequenceTypeIterator st =null;
+ public TokenInterface next() throws MXQueryException {
+ if (called == 0) {
+ QName qn1 = context.registerAnonymousVariable();
+ vh1 = context.getVariable(qn1);
+ QName qn2 = context.registerAnonymousVariable();
+ vh2 = context.getVariable(qn2);
+ called++;
+ TypeInfo [] params = new TypeInfo[2];
+ params[0] = new TypeInfo(Type.ITEM,Type.OCCURRENCE_IND_EXACTLY_ONE);
+ params[1] = new TypeInfo(Type.ITEM,Type.OCCURRENCE_IND_EXACTLY_ONE);
+
+ TypeInfo tInfo = new TypeInfo(Type.FUNCTION_ITEM, Type.OCCURRENCE_IND_EXACTLY_ONE, params, new TypeInfo(Type.ITEM,Type.OCCURRENCE_IND_ZERO_OR_MORE));
+ st = new SequenceTypeIterator(tInfo, true, true, context, loc, true);
+ st.setSubIters(subIters[0]);
+ st.setResettable(true);
+ called++;
+ current = new UserdefFuncCallLateBinding(context);
+ current.setSubIters(new XDMIterator[]{st,new VariableIterator(context,qn1,true,loc),new VariableIterator(context,qn2,true,loc)});
+ current.staticInit();
+ current.setResettable(true);
+
+ // create Windows on each
+ wnd1 = WindowFactory.getNewWindow(context, subIters[1]);
+ wnd2 = WindowFactory.getNewWindow(context, subIters[2]);
+
+ bindPair(st);
+
+ }
+ if (endOfSeq)
+ return Token.END_SEQUENCE_TOKEN;
+ TokenInterface tk = current.next();
+ if (tk.getEventType() == Type.END_SEQUENCE) {
+ bindPair(st);
+ tk = current.next();
+ }
+ return tk;
+ }
+
+ void bindPair(SequenceTypeIterator st) throws MXQueryException {
+ if (wnd1.hasNextItem() && wnd2.hasNextItem()) {
+ if (vh1.getIter() != null)
+ ((Window)vh1.getIter()).destroyWindow();
+ vh1.setIter(wnd1.nextItem());
+ if (vh2.getIter() != null)
+ ((Window)vh2.getIter()).destroyWindow();
+ vh2.setIter(wnd2.nextItem());
+ current.reset();
+
+ } else {
+ current = new EmptySequenceIterator(context,loc);
+ endOfSeq = true;
+ }
+ }
+
+ protected XDMIterator copy(Context context, XDMIterator[] subIters,
+ Vector nestedPredCtxStack) throws MXQueryException {
+ XDMIterator copy = new MapPairs();
+ copy.setContext(context, true);
+ copy.setSubIters(subIters);
+ return copy;
+ }
+
+}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/StartsWith.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/StartsWith.java 2011-05-16 10:18:59 UTC (rev 4341)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/StartsWith.java 2011-05-16 14:27:10 UTC (rev 4342)
@@ -20,12 +20,9 @@
import ch.ethz.mxquery.datamodel.types.Type;
import ch.ethz.mxquery.datamodel.types.TypeInfo;
import ch.ethz.mxquery.datamodel.xdm.BooleanToken;
-import ch.ethz.mxquery.datamodel.xdm.Token;
-import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
import ch.ethz.mxquery.exceptions.DynamicException;
import ch.ethz.mxquery.exceptions.ErrorCodes;
import ch.ethz.mxquery.exceptions.MXQueryException;
-import ch.ethz.mxquery.exceptions.TypeException;
import ch.ethz.mxquery.model.TokenBasedIterator;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.Set;
@@ -33,22 +30,12 @@
public class StartsWith extends TokenBasedIterator {
protected void init() throws MXQueryException {
- XDMIterator iter0 = subIters[0];
- XDMIterator iter1 = subIters[1];
+ String res = getStringValueOrEmpty(subIters[0]);
+ String res2 = getStringValueOrEmpty(subIters[1]);
- TokenInterface inputToken1 = iter0.next();
- int type = inputToken1.getEventType();
- TokenInterface inputToken2 = iter1.next();
- int type2 = inputToken2.getEventType();
-
if (subIters.length > 2) {
// Minimum collation test - raise error on all collations that are not codepoint
- XDMIterator collIter = subIters[2];
- TokenInterface collToken = collIter.next();
- if (collToken == Token.END_SEQUENCE_TOKEN ||
- !Type.isTypeOrSubTypeOf(collToken.getEventType(),Type.STRING, Context.getDictionary()))
- throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE, "Wrong type for collation", loc);
- String collUri = collToken.getText();
+ String collUri = getStringValue(subIters[2]);
Set collations = context.getCollations();
if (!collations.contains(collUri))
throw new DynamicException(ErrorCodes.F0010_UNSUPPORTED_COLLATION, "Unsupported Collation", loc);
@@ -56,27 +43,12 @@
}
- String res2 = "";
- if (type2 != Type.END_SEQUENCE)
- res2 = inputToken2.getText();
- else {
+ if (res2 == null || res2.equals("")) {
currentToken = BooleanToken.TRUE_TOKEN;
return;
}
- if (res2.equals("")) {
- currentToken = BooleanToken.TRUE_TOKEN;
- return;
- }
-
-
- String res = "";
- if (type != Type.END_SEQUENCE)
- res = inputToken1.getText();
- else {
- currentToken = BooleanToken.FALSE_TOKEN;
- return;
- }
+
if (res == null || res.equals(""))
currentToken = BooleanToken.FALSE_TOKEN;
else {
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/FFLWORIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/FFLWORIterator.java 2011-05-16 10:18:59 UTC (rev 4341)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/FFLWORIterator.java 2011-05-16 14:27:10 UTC (rev 4342)
@@ -188,9 +188,10 @@
}
else throw te;
}
- if (tok.getEventType() == Type.BOOLEAN) {
+ if (tok.getEventType() == Type.BOOLEAN && whereExpr.next().getEventType() == Type.END_SEQUENCE) {
value = tok.getBoolean();
- }
+ } else
+ throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE,"xs:boolean expected",loc);
if (whereExpr.getExpressionCategoryType(isScripting) == EXPR_CATEGORY_UPDATING)
getPendingUpdateList().merge(whereExpr.getPendingUpdateList());
@@ -431,7 +432,7 @@
public XDMIterator staticInit() throws MXQueryException {
super.staticInit();
- setResettable(false);
+ setResettable(resettable);
return this;
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/SequenceTypeIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/SequenceTypeIterator.java 2011-05-16 10:18:59 UTC (rev 4341)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/SequenceTypeIterator.java 2011-05-16 14:27:10 UTC (rev 4342)
@@ -135,6 +135,8 @@
String name = node_name;
String[] tokens = QName.parseQName(node_name);
if (coerce && tInfo.getType() == Type.FUNCTION_ITEM) {
+ if (tok.getEventType() != Type.FUNCTION_ITEM)
+ throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE,"Function item expected",loc);
tok = coerceFunctionItem((FunctionItemToken)tok, tInfo);
return tok;
} else {
@@ -387,6 +389,8 @@
TokenInterface coerceFunctionItem(FunctionItemToken tok, TypeInfo targetType) throws MXQueryException {
FunctionSignature origSig = tok.getFunction().getFunctionSignature();
+ if (origSig.getArity() != targetType.getParameterTypes().length)
+ throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE,"Wrong arity for function item",loc);
FunctionSignature fs = new FunctionSignature(tok.getQNameTokenValue(), targetType.getParameterTypes(), FunctionSignature.USER_DEFINED_FUNCTION, origSig.getExpressionCategory(), origSig.isNonDeterministic(), origSig.isPrivateFunction());
Function fun = new Function(null,fs,tok.getFunction().getFunctionImplementation(getContext()),null,targetType.getReturnType());
return tok.coerce(fun);
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/UserdefFuncCallLateBinding.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/UserdefFuncCallLateBinding.java 2011-05-16 10:18:59 UTC (rev 4341)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/UserdefFuncCallLateBinding.java 2011-05-16 14:27:10 UTC (rev 4342)
@@ -101,7 +101,7 @@
if (funcName == null) {
// get function item from the first parameter
TokenInterface tok = subIters[0].next();
- if (tok.getEventType() != Type.FUNCTION_ITEM && subIters[0].next().getEventType() != Type.END_SEQUENCE)
+ if (tok.getEventType() != Type.FUNCTION_ITEM || subIters[0].next().getEventType() != Type.END_SEQUENCE)
throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE,"Single Function Item expected",loc);
ft = ((FunctionItemToken)tok);
f = ft.getFunction();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pm_...@us...> - 2011-05-16 14:28:55
|
Revision: 4343
http://mxquery.svn.sourceforge.net/mxquery/?rev=4343&view=rev
Author: pm_fischer
Date: 2011-05-16 14:28:49 +0000 (Mon, 16 May 2011)
Log Message:
-----------
fold-left(), fold-right()
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/functions/FG.xml
trunk/MXQuery/src/ch/ethz/mxquery/query/parser/Parser.java
Added Paths:
-----------
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Fold.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/FG.xml
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/FG.xml 2011-05-16 14:27:10 UTC (rev 4342)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/FG.xml 2011-05-16 14:28:49 UTC (rev 4343)
@@ -420,14 +420,14 @@
<parameters><paramType>function(*)</paramType>
<paramType>item()*</paramType>
<paramType>item()*</paramType></parameters>
- <className op="left">fold</className>
+ <className op="left">Fold</className>
</functionDescription>
<functionDescription>
<functionName>fold-right</functionName>
<parameters><paramType>function(*)</paramType>
<paramType>item()*</paramType>
<paramType>item()*</paramType></parameters>
- <className op="right">fold</className>
+ <className op="right">Fold</className>
</functionDescription>
<functionDescription>
<functionName>function-name</functionName>
@@ -620,8 +620,7 @@
<paramType>item()*</paramType>
</parameters>
<className>MapPairs</className>
- </functionDescription>
-
+ </functionDescription>
<functionDescription>
<functionName>matches</functionName>
<parameters>
Added: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Fold.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Fold.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Fold.java 2011-05-16 14:28:49 UTC (rev 4343)
@@ -0,0 +1,123 @@
+package ch.ethz.mxquery.functions.fn;
+
+import java.util.Vector;
+
+import ch.ethz.mxquery.bindings.WindowFactory;
+import ch.ethz.mxquery.contextConfig.Context;
+import ch.ethz.mxquery.datamodel.QName;
+import ch.ethz.mxquery.datamodel.types.Type;
+import ch.ethz.mxquery.datamodel.types.TypeInfo;
+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.functions.RequestTypeMulti;
+import ch.ethz.mxquery.iterators.SequenceTypeIterator;
+import ch.ethz.mxquery.iterators.UserdefFuncCallLateBinding;
+import ch.ethz.mxquery.iterators.VariableIterator;
+import ch.ethz.mxquery.model.CurrentBasedIterator;
+import ch.ethz.mxquery.model.TokenSequenceIterator;
+import ch.ethz.mxquery.model.VariableHolder;
+import ch.ethz.mxquery.model.Window;
+import ch.ethz.mxquery.model.XDMIterator;
+
+public class Fold extends CurrentBasedIterator implements RequestTypeMulti{
+
+ private int direction;
+ private int DIRECTION_LEFT = 0;
+ private int DIRECTION_RIGHT = 1;
+
+ public TokenInterface next() throws MXQueryException {
+ if (called == 0) {
+ QName qnSeq = context.registerAnonymousVariable();
+ VariableHolder vh1 = context.getVariable(qnSeq);
+ QName qnZero = context.registerAnonymousVariable();
+ VariableHolder vh2 = context.getVariable(qnZero);
+
+ called++;
+ TypeInfo [] params = new TypeInfo[2];
+ params[0] = new TypeInfo(Type.ITEM,Type.OCCURRENCE_IND_ZERO_OR_MORE);
+ params[1] = new TypeInfo(Type.ITEM,Type.OCCURRENCE_IND_ZERO_OR_MORE);
+ TypeInfo tInfo = new TypeInfo(Type.FUNCTION_ITEM, Type.OCCURRENCE_IND_EXACTLY_ONE, params, new TypeInfo(Type.ITEM,Type.OCCURRENCE_IND_ZERO_OR_MORE));
+ SequenceTypeIterator st = new SequenceTypeIterator(tInfo, true, true, context, loc, true);
+ st.setSubIters(subIters[0]);
+ st.setResettable(true);
+ called++;
+ XDMIterator reduceFunc = new UserdefFuncCallLateBinding(context);
+ if (direction == DIRECTION_LEFT)
+ reduceFunc.setSubIters(new XDMIterator[]{st,new VariableIterator(context,qnZero,true,loc),new VariableIterator(context,qnSeq,true,loc)});
+ else
+ reduceFunc.setSubIters(new XDMIterator[]{st,new VariableIterator(context,qnSeq,true,loc), new VariableIterator(context,qnZero,true,loc)});
+ reduceFunc.staticInit();
+ reduceFunc.setResettable(true);
+
+ // create Windows on each
+ Window wnd1 = WindowFactory.getNewWindow(context, subIters[2]);
+ current = WindowFactory.getNewWindow(context, subIters[1]);
+ if (direction == DIRECTION_LEFT)
+ while (wnd1.hasNextItem()) {
+ if (vh1.getIter() != null)
+ ((Window)vh1.getIter()).destroyWindow();
+ vh1.setIter(wnd1.nextItem());
+ vh2.setIter(current);
+ //current.reset();
+ collect(reduceFunc);
+ } else {
+ int numItems = 1;
+ while (wnd1.hasItem(numItems)) {
+ numItems++;
+ }
+ numItems--;
+ for (int i=numItems;i>0;i--) {
+ if (vh1.getIter() != null)
+ ((Window)vh1.getIter()).destroyWindow();
+ vh1.setIter(wnd1.getItem(i));
+ vh2.setIter(current);
+ collect(reduceFunc);
+ }
+ }
+
+ }
+ if (endOfSeq)
+ return Token.END_SEQUENCE_TOKEN;
+ TokenInterface tk = current.next();
+ return tk;
+ }
+
+
+
+ void collect(XDMIterator reduceFunc) throws MXQueryException {
+ Vector acc = new Vector();
+ TokenInterface tok = reduceFunc.next();
+ while (tok.getEventType()!=Type.END_SEQUENCE) {
+ acc.addElement(tok);
+ tok = reduceFunc.next();
+ }
+ current = WindowFactory.getNewWindow(context, new TokenSequenceIterator(acc));
+ reduceFunc.reset();
+ }
+
+
+
+ protected XDMIterator copy(Context context, XDMIterator[] subIters,
+ Vector nestedPredCtxStack) throws MXQueryException {
+ Fold copy = new Fold();
+ copy.setContext(context, true);
+ copy.setSubIters(subIters);
+ copy.direction = direction;
+ return copy;
+ }
+
+ public void setOperation(String type) throws MXQueryException {
+ if (type.equals("left"))
+ direction = DIRECTION_LEFT;
+ else if (type.equals("right"))
+ direction = DIRECTION_RIGHT;
+ else
+ throw new MXQueryException(ErrorCodes.E0009_STATIC_SCHEMA_IMPORTS_NOT_SUPPORTED, "invalid value for fold: "+type, loc);
+ }
+
+ public void setReturnType(int type) throws MXQueryException {
+ }
+
+}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/query/parser/Parser.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/query/parser/Parser.java 2011-05-16 14:27:10 UTC (rev 4342)
+++ trunk/MXQuery/src/ch/ethz/mxquery/query/parser/Parser.java 2011-05-16 14:28:49 UTC (rev 4343)
@@ -1920,7 +1920,7 @@
Object obj = subs.elementAt(i);
if (obj instanceof VariableIterator) {
VariableIterator vi = (VariableIterator)obj;
- if (!vi.isInContextOrNested(getCurrentContext())) {
+ if (!vi.isInContextOrNested(getCurrentContext()) && !getCurrentContext().checkVariableLocal(vi.getVarQName())) {
//establish closure by putting variable definition
closure.addElement(vi.getVarQName());
//context of function get new variable definition of closure variables
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pm_...@us...> - 2011-05-27 13:42:27
|
Revision: 4371
http://mxquery.svn.sourceforge.net/mxquery/?rev=4371&view=rev
Author: pm_fischer
Date: 2011-05-27 13:42:20 +0000 (Fri, 27 May 2011)
Log Message:
-----------
next step towards non-linear patterns:
- use a state stack
- all existing tests working again
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/iterators/pattern/PatternNaiveIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/query/parser/PatternDataHelper.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/pattern/PatternNaiveIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/pattern/PatternNaiveIterator.java 2011-05-26 08:04:15 UTC (rev 4370)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/pattern/PatternNaiveIterator.java 2011-05-27 13:42:20 UTC (rev 4371)
@@ -109,8 +109,17 @@
if(initanyPatternMatch){
anyPatternFirstMatch = 1;
initanyPatternMatch = false;
+ statesStack = new Vector();
+ PatternDataHelper.PatternVarHelper [] cands = patternDef.getInitialCandidates();
+ Vector curStates = new Vector(cands.length);
+ for (int v=0;v<cands.length;v++) {
+ curStates.addElement(new PatternState(cands[v],null,initialFirstPosition));
+ }
+ statesStack.addElement(curStates);
}
+
+
while(!endofSequence(startTumblingIncremental)) {
if(prevState != SLIDEPARTITIONMATCH)
@@ -194,8 +203,17 @@
if(initanyPatternMatch){
anyPatternFirstMatch = 1;
initanyPatternMatch = false;
+ statesStack = new Vector();
+ PatternDataHelper.PatternVarHelper [] cands = patternDef.getInitialCandidates();
+ Vector curStates = new Vector(cands.length);
+ for (int v=0;v<cands.length;v++) {
+ curStates.addElement(new PatternState(cands[v],null,initialFirstPosition));
+ }
+ statesStack.addElement(curStates);
}
+
+
while(!endofSequence(startTumblingIncremental)) {
if(!forceReset){
prevState = typeOfMatch(endTumblingIncremental, prevState);
@@ -323,111 +341,95 @@
protected int typeOfMatch(int end, int execState) throws MXQueryException {
- if(statesStack.size() == 1) {
- Vector curStates = (Vector)statesStack.elementAt(0);
- if (stateToContinue == -1) {
- for (int i=0;i<curStates.size();i++) {
- PatternState curState = (PatternState)curStates.elementAt(i);
- int occurID = curState.cur.getTypeOcc().getOccurID();
- if(occurID == Type.OCCURRENCE_IND_ONE_OR_MORE && plusOperatorFlag) {
- anyPatternFirstMatch = startTumblingIncremental;
- if(checkPatternExpr(end, 0, curState.cur)) {
- plusOperatorFlag = false;
- if(curState.cur.isAccepting()) {
- curState.achievedExecutionState = CONTINUOUSMATCH;
- } else
- curState.achievedExecutionState = PARTIALMATCH;
- } else {
- plusOperatorFlag = true;
- }
- }
- }
- if (curStates.size() > 0) {
- stateToContinue = 0;
- return ((PatternState)curStates.elementAt(0)).achievedExecutionState;
- }
- } else {
- if (stateToContinue > -1 && stateToContinue < curStates.size()) {
- stateToContinue++;
- return ((PatternState)curStates.elementAt(stateToContinue-1)).achievedExecutionState;
- }
- else {
- stateToContinue = -1;
- return NONMATCH;
- }
- }
-
- }
Vector curStates = (Vector)statesStack.elementAt(statesStack.size()-1);
+ Vector nextStates = new Vector();
+
+ int summaryState = NONMATCH;
- if (stateToContinue == -1) {
-
- Vector nextStates = new Vector();
for (int s=0;s<curStates.size();s++) {
+ PatternState nextState = null;
PatternState curState = (PatternState)curStates.elementAt(s);
- // Get list of clauses from ArrayList
- PatternVarHelper [] states = curState.cur.getListMatches();
- // decide prevState on the basis of
- for (int i=0;i<states.length;i++) {
- PatternVarHelper patternDefClause = states[i];
- int occurID = patternDefClause.getTypeOcc().getOccurID();
- if(checkPatternExpr(end, 0, patternDefClause)) {
- //Check here if pat is non-grouping variable
- if(patternDefClause.isAccepting()) {
- // case of OpenFullMatch
- if(occurID == Type.OCCURRENCE_IND_EXACTLY_ONE){
- PatternDataHelper.PatternVarHelper [] cands = patternDef.getInitialCandidates();
- for (int v=0;v<cands.length;v++) {
- nextStates.addElement(new PatternState(cands[v],curState,currentPosition));
+ int curOccurID = curState.cur.getTypeOcc().getOccurID();
+ if(curOccurID == Type.OCCURRENCE_IND_ONE_OR_MORE && !curState.alreadyMatchedOnce) {
+ anyPatternFirstMatch = startTumblingIncremental;
+ if(checkPatternExpr(end, 0, curState.cur)) {
+// plusOperatorFlag = false;
+ nextState = new PatternState(curState.cur,curState,currentPosition);
+ nextState.alreadyMatchedOnce = true;
+ nextStates.addElement(nextState);
+
+ if(curState.cur.isAccepting()) {
+ nextState.achievedExecutionState = CONTINUOUSMATCH; // it is matching according to rules
+ summaryState = CONTINUOUSMATCH;
+ } else
+ nextState.achievedExecutionState = PARTIALMATCH; // it is matching according to rules
+ if (summaryState != CONTINUOUSMATCH)
+ summaryState = PARTIALMATCH;
+ }
+ } else {
+ // Get reachable states
+ PatternVarHelper [] states = curState.cur.getListMatches();
+ for (int i=0;i<states.length;i++) {
+ PatternVarHelper patternDefClause = states[i];
+ int occurID = patternDefClause.getTypeOcc().getOccurID();
+ if(checkPatternExpr(end, 0, patternDefClause)) {
+ //Check here if pat is non-grouping variable
+ if(patternDefClause.isAccepting()) {
+ // case of OpenFullMatch
+ if(occurID == Type.OCCURRENCE_IND_EXACTLY_ONE){
+ PatternDataHelper.PatternVarHelper [] cands = patternDef.getInitialCandidates();
+ for (int v=0;v<cands.length;v++) {
+ nextState = new PatternState(cands[v],curState,currentPosition);
+ nextStates.addElement(nextState);
+ }
+ occurenceIndicatorOne = true;
+ }else {
+ nextState = new PatternState(patternDefClause,curState,currentPosition);
+ nextState.alreadyMatchedOnce = true;
+ nextStates.addElement(nextState);
}
- occurenceIndicatorOne = true;
- }else {
- nextStates.addElement(new PatternState(patternDefClause,curState,currentPosition));
+ nextState.achievedExecutionState = CONTINUOUSMATCH; // it is matching according to rules
+ summaryState = CONTINUOUSMATCH;
+ } else {
+ if(occurID == Type.OCCURRENCE_IND_EXACTLY_ONE) {
+ PatternDataHelper.PatternVarHelper [] cands = patternDefClause.getNextCandidates();
+ for (int v=0;v<cands.length;v++) {
+ nextState = new PatternState(cands[v],curState,currentPosition);
+ nextStates.addElement(nextState);
+ }
+ }else {
+ nextState = new PatternState(patternDefClause,curState,currentPosition);
+ nextState.alreadyMatchedOnce = true;
+ nextStates.addElement(nextState);
+ }
+ // check for the last satisfying clause
+
+ nextState.achievedExecutionState = PARTIALMATCH; // it is matching according to rules
+ if (summaryState != CONTINUOUSMATCH)
+ summaryState = PARTIALMATCH;
}
- return CONTINUOUSMATCH; // it is vaild match
+ break;
}
- if(occurID == Type.OCCURRENCE_IND_EXACTLY_ONE) {
- PatternDataHelper.PatternVarHelper [] cands = patternDef.getInitialCandidates();
- for (int v=0;v<cands.length;v++) {
- nextStates.addElement(new PatternState(cands[v],curState,currentPosition));
- }
- }else {
- nextStates.addElement(new PatternState(patternDefClause,curState,currentPosition));
- }
- // check for the last satisfying clause
+ anyPatternFirstMatch = endTumblingIncremental;
- curState.achievedExecutionState = PARTIALMATCH; // it is matching according to rules
}
- anyPatternFirstMatch = endTumblingIncremental;
-
}
// Does not match with any of the clauses
- if(selectionType == INCREMENTAL_SELECTION) {
+ if(selectionType == INCREMENTAL_SELECTION && summaryState == NONMATCH) {
if(prevState == CONTINUOUSMATCH)
- curState.achievedExecutionState =SLIDEPARTITIONMATCH;
+ summaryState =SLIDEPARTITIONMATCH;
else if(prevState == PARTIALMATCH)
- curState.achievedExecutionState = SLIDEPARTITIONMATCH; // purposely distinguished
+ summaryState = SLIDEPARTITIONMATCH; // purposely distinguished
else if(prevState == NONMATCH)
- curState.achievedExecutionState = NONMATCH;
+ summaryState = NONMATCH;
else if(prevState == SLIDEPARTITIONMATCH)
- curState.achievedExecutionState = NONMATCH;
+ summaryState = NONMATCH;
}
}
- statesStack.addElement(nextStates);
- if (curStates.size() > 0) {
- stateToContinue = 0;
- return ((PatternState)curStates.elementAt(0)).achievedExecutionState;
- }
- }else {
- if (stateToContinue < curStates.size()) {
- stateToContinue++;
- return ((PatternState)curStates.elementAt(stateToContinue-1)).achievedExecutionState;
- }
- else {
- return NONMATCH;
- }
- }
- return NONMATCH;
+ if (nextStates.size() > 0) {
+ statesStack.addElement(nextStates);
+ }
+ return summaryState;
}
@@ -758,6 +760,7 @@
cur = curState;
prev = prevState;
startPos = start;
+
}
@@ -765,7 +768,12 @@
PatternState prev;
int startPos;
int endPos;
+ boolean alreadyMatchedOnce = false;
int achievedExecutionState = NONMATCH;
+
+ PatternState copy(PatternState prev) {
+ return new PatternState(cur, this, startPos);
+ }
}
public XDMIterator staticInit() throws MXQueryException {
@@ -779,6 +787,5 @@
}
return this;
}
-
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/query/parser/PatternDataHelper.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/query/parser/PatternDataHelper.java 2011-05-26 08:04:15 UTC (rev 4370)
+++ trunk/MXQuery/src/ch/ethz/mxquery/query/parser/PatternDataHelper.java 2011-05-27 13:42:20 UTC (rev 4371)
@@ -303,7 +303,7 @@
if (!var.contains(v1))
var.add(v1);
else
- throw new StaticException(ErrorCodes.A0018_Missing_Pattern_Var_Decl, "Variable "+v1+" is used multiple times in the pattern", QueryLocation.OUTSIDE_QUERY_LOC);
+ throw new StaticException(ErrorCodes.A0017_Duplicate_Pattern_Var, "Variable "+v1+" is used multiple times in the pattern", QueryLocation.OUTSIDE_QUERY_LOC);
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tim...@us...> - 2011-06-01 16:59:49
|
Revision: 4381
http://mxquery.svn.sourceforge.net/mxquery/?rev=4381&view=rev
Author: timchurch
Date: 2011-06-01 16:59:42 +0000 (Wed, 01 Jun 2011)
Log Message:
-----------
- Allow java objects to be passed as params in native function calls from xquery
- Commented out println for void types on native function calls
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/functions/NativeFunctionImporter.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/NativeFuncCall.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/NativeFunctionImporter.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/NativeFunctionImporter.java 2011-06-01 15:44:14 UTC (rev 4380)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/NativeFunctionImporter.java 2011-06-01 16:59:42 UTC (rev 4381)
@@ -207,7 +207,7 @@
return new TypeInfo(Type.INT,Type.OCCURRENCE_IND_EXACTLY_ONE);
if (class1.getName().equals("boolean"))
return new TypeInfo(Type.BOOLEAN,Type.OCCURRENCE_IND_EXACTLY_ONE);
- System.out.println(class1.getPackage()+" "+class1.getName());
+ //System.out.println(class1.getPackage()+" "+class1.getName());
return new TypeInfo(Type.UNTYPED_ATOMIC,Type.OCCURRENCE_IND_EXACTLY_ONE);
}
if (class1.getName().equals("java.lang.String"))
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/NativeFuncCall.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/NativeFuncCall.java 2011-06-01 15:44:14 UTC (rev 4380)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/NativeFuncCall.java 2011-06-01 16:59:42 UTC (rev 4381)
@@ -97,9 +97,14 @@
invocationParamsTypes[i] = invocationParams[i].getClass();
break;
case Type.ITEM:
- if (i==0 && tok instanceof WrappedObjectToken) {
+ if (tok instanceof WrappedObjectToken) {
WrappedObjectToken wrap = (WrappedObjectToken) tok;
- instanceToCall = wrap.getWrappedObject();
+ if(i == 0) {
+ instanceToCall = wrap.getWrappedObject();
+ } else {
+ invocationParams[i] = wrap.getWrappedObject();
+ invocationParamsTypes[i] = invocationParams[i].getClass();
+ }
} else
throw new DynamicException(ErrorCodes.A0002_EC_NOT_SUPPORTED, "Type "+Type.getTypeQName(tok.getEventType(), Context.getDictionary())+" not implemented in Java calls", loc);
break;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pm_...@us...> - 2011-12-19 13:23:35
|
Revision: 4500
http://mxquery.svn.sourceforge.net/mxquery/?rev=4500&view=rev
Author: pm_fischer
Date: 2011-12-19 13:23:24 +0000 (Mon, 19 Dec 2011)
Log Message:
-----------
Foundations of projection path generator
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/iterators/CompareIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/IfThenElseIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/VariableIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/model/Iterator.java
trunk/MXQuery/src/ch/ethz/mxquery/model/TokenBasedIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/model/VariableHolder.java
trunk/MXQuery/src/ch/ethz/mxquery/model/XDMIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/model/updatePrimitives/PendingUpdateList.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/CompareIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/CompareIterator.java 2011-10-21 20:16:23 UTC (rev 4499)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/CompareIterator.java 2011-12-19 13:23:24 UTC (rev 4500)
@@ -33,6 +33,8 @@
import ch.ethz.mxquery.model.TokenBasedIterator;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.KXmlSerializer;
+import ch.ethz.mxquery.util.ObjectObjectPair;
+import ch.ethz.mxquery.util.Set;
/**
*
@@ -319,5 +321,17 @@
public TypeInfo getStaticType() {
return new TypeInfo(Type.BOOLEAN,Type.OCCURRENCE_IND_ZERO_OR_ONE);
}
+
+ public ObjectObjectPair getProjectionPaths() {
+ Set returned = new Set();
+ Set used = new Set();
+ for (int i=0;i<subIters.length;i++){
+ ObjectObjectPair cur = subIters[i].getProjectionPaths();
+ used.addAll((Set)cur.getFirst());
+ used.addAll((Set)cur.getSecond());
+ }
+ return new ObjectObjectPair(returned, used);
+ }
+
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/IfThenElseIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/IfThenElseIterator.java 2011-10-21 20:16:23 UTC (rev 4499)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/IfThenElseIterator.java 2011-12-19 13:23:24 UTC (rev 4500)
@@ -26,6 +26,8 @@
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.model.updatePrimitives.PendingUpdateList;
import ch.ethz.mxquery.util.KXmlSerializer;
+import ch.ethz.mxquery.util.ObjectObjectPair;
+import ch.ethz.mxquery.util.Set;
/**
*
@@ -123,6 +125,22 @@
}
}
+ public ObjectObjectPair getProjectionPaths() {
+ Set returned = new Set();
+ Set used = new Set();
+ ObjectObjectPair cur = subIters[0].getProjectionPaths();
+ // Conditionals used and returned go to to used
+ used.addAll((Set)cur.getFirst());
+ used.addAll((Set)cur.getSecond());
+ for (int i=1;i<subIters.length;i++){
+ cur = subIters[i].getProjectionPaths();
+ returned.addAll((Set)cur.getFirst());
+ used.addAll((Set)cur.getSecond());
+ }
+ return new ObjectObjectPair(returned, used);
+ }
+
+
// public TypeInfo getReturnType() {
// // TODO Auto-generated method stub
// return super.getReturnType();
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/VariableIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/VariableIterator.java 2011-10-21 20:16:23 UTC (rev 4499)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/VariableIterator.java 2011-12-19 13:23:24 UTC (rev 4500)
@@ -35,6 +35,7 @@
import ch.ethz.mxquery.model.Window;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.KXmlSerializer;
+import ch.ethz.mxquery.util.ObjectObjectPair;
/**
*
@@ -258,5 +259,7 @@
return false;
}
-
+ public ObjectObjectPair getProjectionPaths() {
+ return valueHolder.getProjectionPaths();
+ }
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/model/Iterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/model/Iterator.java 2011-10-21 20:16:23 UTC (rev 4499)
+++ trunk/MXQuery/src/ch/ethz/mxquery/model/Iterator.java 2011-12-19 13:23:24 UTC (rev 4500)
@@ -43,6 +43,8 @@
import ch.ethz.mxquery.sms.interfaces.MaterializingStore;
import ch.ethz.mxquery.util.ContextPair;
import ch.ethz.mxquery.util.KXmlSerializer;
+import ch.ethz.mxquery.util.ObjectObjectPair;
+import ch.ethz.mxquery.util.Set;
import ch.ethz.mxquery.util.Utils;
/**
@@ -875,5 +877,22 @@
if (source.next().getEventType() != Type.END_SEQUENCE)
throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE, "Single Item expected", loc);
return arg.getText();
+ }
+
+ public ObjectObjectPair getProjectionPaths() {
+ XDMIterator [] subs = getAllSubIters();
+ if (subs != null && subs.length == 1)
+ return subs[0].getProjectionPaths();
+ else {
+ Set returned = new Set();
+ Set used = new Set();
+ if (subs != null)
+ for (int i=0;i<subs.length;i++){
+ ObjectObjectPair cur = subs[i].getProjectionPaths();
+ returned.addAll((Set)cur.getFirst());
+ used.addAll((Set)cur.getSecond());
+ }
+ return new ObjectObjectPair(returned, used);
+ }
}
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/model/TokenBasedIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/model/TokenBasedIterator.java 2011-10-21 20:16:23 UTC (rev 4499)
+++ trunk/MXQuery/src/ch/ethz/mxquery/model/TokenBasedIterator.java 2011-12-19 13:23:24 UTC (rev 4500)
@@ -20,6 +20,8 @@
import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
import ch.ethz.mxquery.exceptions.MXQueryException;
import ch.ethz.mxquery.exceptions.QueryLocation;
+import ch.ethz.mxquery.util.ObjectObjectPair;
+import ch.ethz.mxquery.util.Set;
public abstract class TokenBasedIterator extends Iterator{
@@ -80,5 +82,5 @@
protected void resetImpl() throws MXQueryException {
super.resetImpl();
currentToken = Token.START_SEQUENCE_TOKEN;
- }
+ }
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/model/VariableHolder.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/model/VariableHolder.java 2011-10-21 20:16:23 UTC (rev 4499)
+++ trunk/MXQuery/src/ch/ethz/mxquery/model/VariableHolder.java 2011-12-19 13:23:24 UTC (rev 4500)
@@ -31,6 +31,7 @@
import ch.ethz.mxquery.exceptions.StaticException;
import ch.ethz.mxquery.iterators.VariableIterator;
import ch.ethz.mxquery.util.Hashtable;
+import ch.ethz.mxquery.util.ObjectObjectPair;
public class VariableHolder {
@@ -47,6 +48,7 @@
private int contextPos;
private Context ctx;
private XDMIterator seqTypeIt = null;
+ private ObjectObjectPair projectionPaths;
@@ -251,4 +253,13 @@
public Hashtable getAnnotations(){
return annotations;
}
+
+ public void setProjectionPaths(ObjectObjectPair paths) {
+ projectionPaths = paths;
+ }
+
+ public ObjectObjectPair getProjectionPaths() {
+ return projectionPaths;
+ }
+
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/model/XDMIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/model/XDMIterator.java 2011-10-21 20:16:23 UTC (rev 4499)
+++ trunk/MXQuery/src/ch/ethz/mxquery/model/XDMIterator.java 2011-12-19 13:23:24 UTC (rev 4500)
@@ -26,6 +26,7 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.model.updatePrimitives.PendingUpdateList;
import ch.ethz.mxquery.util.KXmlSerializer;
+import ch.ethz.mxquery.util.ObjectObjectPair;
import ch.ethz.mxquery.util.Traversable;
/**
@@ -205,5 +206,13 @@
public KXmlSerializer traverseIteratorTree(KXmlSerializer serializer) throws Exception;
public abstract boolean isScoring();
+ /**
+ * Get the projection path (=minimum requirement document fragments)
+ * There are two types of paths:
+ * - returned
+ * - used
+ * @return Pair of Path Sets, first is returned, second is used
+ */
+ public abstract ObjectObjectPair getProjectionPaths();
}
\ No newline at end of file
Modified: trunk/MXQuery/src/ch/ethz/mxquery/model/updatePrimitives/PendingUpdateList.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/model/updatePrimitives/PendingUpdateList.java 2011-10-21 20:16:23 UTC (rev 4499)
+++ trunk/MXQuery/src/ch/ethz/mxquery/model/updatePrimitives/PendingUpdateList.java 2011-12-19 13:23:24 UTC (rev 4500)
@@ -387,6 +387,9 @@
throw new DynamicException(ErrorCodes.U0021_UPDATE_DYNAMIC_INVALID_XDM,"Duplicate attribute names in updates",null);
else
seenAttrNames.add(attName);
+ } else {
+ if (seenAttrNames.size() > 0)
+ seenAttrNames = new Set();
}
else {
if (seenAttrNames.size() > 0)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pm_...@us...> - 2012-02-01 13:11:02
|
Revision: 4511
http://mxquery.svn.sourceforge.net/mxquery/?rev=4511&view=rev
Author: pm_fischer
Date: 2012-02-01 13:10:51 +0000 (Wed, 01 Feb 2012)
Log Message:
-----------
- within XSP, use global Context to store base URI
- root context base URI is only set to system base URI if not already set
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java
trunk/MXQuery/src/ch/ethz/mxquery/query/webservice/XSPMain.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java 2011-12-22 11:00:23 UTC (rev 4510)
+++ trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java 2012-02-01 13:10:51 UTC (rev 4511)
@@ -325,7 +325,8 @@
rootContext.storeSet = stores;
else
rootContext.storeSet = new LLStoreSet();
- rootContext.setBaseURI(IOLib.getSystemBaseUri());
+ if (rootContext.getBaseURI() == null)
+ rootContext.setBaseURI(IOLib.getSystemBaseUri());
} else {
this.parent = parent;
Modified: trunk/MXQuery/src/ch/ethz/mxquery/query/webservice/XSPMain.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/query/webservice/XSPMain.java 2011-12-22 11:00:23 UTC (rev 4510)
+++ trunk/MXQuery/src/ch/ethz/mxquery/query/webservice/XSPMain.java 2012-02-01 13:10:51 UTC (rev 4511)
@@ -181,7 +181,7 @@
// Initialize context
Context ctx = new Context();
File dir = new File(getServletContext().getRealPath("."));
- ctx.setBaseURI(dir.toURI().toString());
+ Context.getGlobalContext().setBaseURI(dir.toURI().toString());
CompilerOptions co = new CompilerOptions();
co.setSchemaAwareness(true);
co.setXquery11(true);
@@ -360,4 +360,4 @@
queryResult.append("</pre></div>");
queryResult.append("</body></html>");
}
-}
\ No newline at end of file
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pm_...@us...> - 2012-02-07 08:50:37
|
Revision: 4518
http://mxquery.svn.sourceforge.net/mxquery/?rev=4518&view=rev
Author: pm_fischer
Date: 2012-02-07 08:50:27 +0000 (Tue, 07 Feb 2012)
Log Message:
-----------
Some refactoring to generalize axis/node test
Represent projection paths as vectors of abstract node test instead of
strings
Introduce STAX projection adapter
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/AttributeIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/DescendantOrSelfIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/FullAxisIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/SelfAxisIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/scripting/WSFunction.java
trunk/MXQuery/src/ch/ethz/mxquery/query/optimizer/TermVisitor.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMInputFactory.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XMLSource.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/XDMImportAdapter.java
Added Paths:
-----------
trunk/MXQuery/src/ch/ethz/mxquery/model/AbstractStep.java
trunk/MXQuery/src/ch/ethz/mxquery/model/StepInformation.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java
Removed Paths:
-------------
trunk/MXQuery/src/ch/ethz/mxquery/iterators/AxisIterator.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -185,6 +185,8 @@
public static final int NONVALIDATED_INPUT_MODE_SAX = 2;
public static final int NONVALIDATED_INPUT_MODE_DOM = 3;
public static final int NONVALIDATED_INPUT_MODE_SAX_TIDY = 4;
+ public static final int NONVALIDATED_INPUT_MODE_STAX_PROJECTION = 5;
+
public static final int NO_VALIDATION = 0;
public static final int IGNORE_DTD = 1;
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/AttributeIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/AttributeIterator.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/AttributeIterator.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -30,6 +30,7 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.StaticException;
import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CheckNodeType;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.XDMIterator;
@@ -43,7 +44,7 @@
* @author Matthias Braun
*
*/
-public class AttributeIterator extends CurrentBasedIterator implements AxisIterator{
+public class AttributeIterator extends CurrentBasedIterator implements StepInformation{
private String local = null;
@@ -195,6 +196,10 @@
return new ObjectObjectPair(returned, paths.getSecond());
}
+ public TypeInfo getNodeTest() {
+ return stepData;
+ }
+
}
Deleted: trunk/MXQuery/src/ch/ethz/mxquery/iterators/AxisIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/AxisIterator.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/AxisIterator.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -1,21 +0,0 @@
-package ch.ethz.mxquery.iterators;
-
-public interface AxisIterator {
-
- public static final int AXIS_SELF = 1;
- public static final int AXIS_CHILD = 2;
- public static final int AXIS_DESCENDANT = 4;
- public static final int AXIS_SELF_DESCENDANT = 5;
- public static final int AXIS_PARENT = 18;
- public static final int AXIS_ANCESTOR = 20;
- public static final int AXIS_SELF_ANCESTOR = 21;
- public static final int AXIS_FOLLOWING = 6;
- public static final int AXIS_PRECEDING = 22;
- public static final int AXIS_FOLLOWING_SIBLING = 8;
- public static final int AXIS_PRECEDING_SIBLING = 24;
- public static final int BACKWARD_AXIS_MASK = 16;
- public static final int SELF_AXIS_MASK = 1;
- public static final int AXIS_ATTRIBUTE = 10;
- public abstract int getDirection();
-
-}
\ No newline at end of file
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -31,6 +31,8 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.StaticException;
import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.AbstractStep;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CheckNodeType;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.VariableHolder;
@@ -45,7 +47,7 @@
* @author Matthias Braun
*
*/
-public class ChildIterator extends CurrentBasedIterator implements AxisIterator {
+public class ChildIterator extends CurrentBasedIterator implements StepInformation {
protected String lastStep;
@@ -78,11 +80,6 @@
}
- public String getStepName() {
- return stepData.getXQName().toString();
- }
-
-
public XDMIterator staticInit() throws MXQueryException{
if (subIters != null) {
this.current = subIters[0];
@@ -274,19 +271,15 @@
Set returned = new Set();
Enumeration pathEnum = returnedBelow.elements();
while (pathEnum.hasMoreElements()) {
- String res = (String) pathEnum.nextElement();
- if (res.endsWith("/"))
- res = res.substring(0, res.length()-1);
- if (step_uri != null)
- res = res+"/{"+step_uri+"}:";
- if (step_local != null) {
- if (step_uri == null)
- res = res+"/";
- res = res+step_local;
- }
+ Vector res = (Vector) pathEnum.nextElement();
+ res.addElement(new AbstractStep(AXIS_CHILD, stepData));
returned.add(res);
}
return new ObjectObjectPair(returned, paths.getSecond());
+ }
+
+ public TypeInfo getNodeTest() {
+ return stepData;
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/DescendantOrSelfIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/DescendantOrSelfIterator.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/DescendantOrSelfIterator.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -33,6 +33,8 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.StaticException;
import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.AbstractStep;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CheckNodeType;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.VariableHolder;
@@ -49,7 +51,7 @@
* @author Matthias Braun
*
*/
-public class DescendantOrSelfIterator extends CurrentBasedIterator implements AxisIterator{
+public class DescendantOrSelfIterator extends CurrentBasedIterator implements StepInformation{
private boolean match = false;
@@ -460,20 +462,17 @@
Set returned = new Set();
Enumeration pathEnum = returnedBelow.elements();
while (pathEnum.hasMoreElements()) {
- String res = (String) pathEnum.nextElement();
- if (res.endsWith("/"))
- res = res.substring(0, res.length()-1);
- if (step_uri != null)
- res = res+"//{"+step_uri+"}:";
- if (step_local != null) {
- if (step_uri == null)
- res = res+"//";
- res = res+step_local;
- }
+ Vector res = (Vector) pathEnum.nextElement();
+ res.addElement(new AbstractStep(descAxis, stepData));
returned.add(res);
}
return new ObjectObjectPair(returned, paths.getSecond());
}
+
+
+ public TypeInfo getNodeTest() {
+ return stepData;
+ }
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/FullAxisIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/FullAxisIterator.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/FullAxisIterator.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -31,6 +31,7 @@
import ch.ethz.mxquery.exceptions.MXQueryException;
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CheckNodeType;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.DataflowAnalysis;
@@ -40,7 +41,7 @@
import ch.ethz.mxquery.model.updatePrimitives.ExtendedAxisStore;
import ch.ethz.mxquery.util.Set;
-public class FullAxisIterator extends CurrentBasedIterator implements AxisIterator {
+public class FullAxisIterator extends CurrentBasedIterator implements StepInformation {
private TypeInfo stepData = null;
private String step_local = null;
@@ -292,5 +293,9 @@
return super.staticInit();
}
+ public TypeInfo getNodeTest() {
+ return stepData;
+ }
+
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/SelfAxisIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/SelfAxisIterator.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/SelfAxisIterator.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -29,12 +29,13 @@
import ch.ethz.mxquery.exceptions.MXQueryException;
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CheckNodeType;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.Window;
import ch.ethz.mxquery.model.XDMIterator;
-public class SelfAxisIterator extends CurrentBasedIterator implements AxisIterator {
+public class SelfAxisIterator extends CurrentBasedIterator implements StepInformation {
private TypeInfo stepData = null;
private String step_local = null;
@@ -147,7 +148,7 @@
}
public int getDirection() {
- return AxisIterator.AXIS_SELF;
+ return StepInformation.AXIS_SELF;
}
protected void checkExpressionTypes() throws MXQueryException {
if (!isScripting || context.getScriptingQueryMode() == XQStaticContext.SCRIPTING_MODE_SIMPLE) {
@@ -170,5 +171,9 @@
return super.staticInit();
}
+ public TypeInfo getNodeTest() {
+ return stepData;
+ }
+
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/scripting/WSFunction.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/scripting/WSFunction.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/scripting/WSFunction.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -29,10 +29,10 @@
import ch.ethz.mxquery.exceptions.ErrorCodes;
import ch.ethz.mxquery.exceptions.MXQueryException;
import ch.ethz.mxquery.exceptions.QueryLocation;
-import ch.ethz.mxquery.iterators.AxisIterator;
import ch.ethz.mxquery.iterators.ChildIterator;
import ch.ethz.mxquery.iterators.DescendantOrSelfIterator;
import ch.ethz.mxquery.iterators.NodeIterator;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.Iterator;
import ch.ethz.mxquery.model.Wildcard;
@@ -242,7 +242,7 @@
if (this.returnType == null || this.returnType.equals("")){//the return 'part' is an element
TypeInfo stepInfo = new TypeInfo(Type.START_TAG,Type.OCCURRENCE_IND_EXACTLY_ONE,this.returnName);
- current = new DescendantOrSelfIterator(context, stepInfo, AxisIterator.AXIS_SELF_DESCENDANT, new XDMIterator[] {xmlIt},loc);
+ current = new DescendantOrSelfIterator(context, stepInfo, StepInformation.AXIS_SELF_DESCENDANT, new XDMIterator[] {xmlIt},loc);
// current = new NodeIterator(context, xmlIt,loc);
}else if (this.returnType.equals("multiple-result")){//the return message has more than one 'part'
//TODO: possible merging?
Added: trunk/MXQuery/src/ch/ethz/mxquery/model/AbstractStep.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/model/AbstractStep.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/model/AbstractStep.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -0,0 +1,58 @@
+package ch.ethz.mxquery.model;
+
+import ch.ethz.mxquery.datamodel.XQName;
+import ch.ethz.mxquery.datamodel.types.TypeInfo;
+
+public class AbstractStep implements StepInformation {
+
+ public static final AbstractStep ROOT_STEP = new AbstractStep(0,(TypeInfo)null);
+ public static final AbstractStep KEEP_SUBTREE = new AbstractStep(99,(TypeInfo)null);
+
+ public AbstractStep(int dir, TypeInfo ti) {
+ direction = dir;
+ nodeTestInfo = ti;
+ }
+
+ public AbstractStep(int dir, XQName qn) {
+ direction = dir;
+ nodeTestInfo = new TypeInfo();
+ nodeTestInfo.setXQName(qn);
+ }
+
+
+ private int direction = StepInformation.AXIS_SELF;
+ private TypeInfo nodeTestInfo = null;
+ public int getDirection() {
+ return direction;
+ }
+
+ public TypeInfo getNodeTest() {
+ return nodeTestInfo;
+ }
+
+ public String getDirectionString(boolean abbrv) {
+ switch (direction) {
+ case AXIS_CHILD:
+ if (abbrv)
+ return "";
+ else
+ return "child::";
+ case AXIS_PARENT:
+ if (abbrv)
+ return "..";
+ else
+ return "parent::";
+
+ case AXIS_ATTRIBUTE:
+ if (abbrv)
+ return "@";
+ else
+ return "attribute::";
+
+ default:
+ throw new RuntimeException();
+ }
+
+ }
+
+}
Copied: trunk/MXQuery/src/ch/ethz/mxquery/model/StepInformation.java (from rev 4517, trunk/MXQuery/src/ch/ethz/mxquery/iterators/AxisIterator.java)
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/model/StepInformation.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/model/StepInformation.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -0,0 +1,25 @@
+package ch.ethz.mxquery.model;
+
+import ch.ethz.mxquery.datamodel.types.TypeInfo;
+
+public interface StepInformation {
+
+ public static final int AXIS_SELF = 1;
+ public static final int AXIS_CHILD = 2;
+ public static final int AXIS_DESCENDANT = 4;
+ public static final int AXIS_SELF_DESCENDANT = 5;
+ public static final int AXIS_PARENT = 18;
+ public static final int AXIS_ANCESTOR = 20;
+ public static final int AXIS_SELF_ANCESTOR = 21;
+ public static final int AXIS_FOLLOWING = 6;
+ public static final int AXIS_PRECEDING = 22;
+ public static final int AXIS_FOLLOWING_SIBLING = 8;
+ public static final int AXIS_PRECEDING_SIBLING = 24;
+ public static final int BACKWARD_AXIS_MASK = 16;
+ public static final int SELF_AXIS_MASK = 1;
+ public static final int AXIS_ATTRIBUTE = 10;
+ public abstract int getDirection();
+
+ public abstract TypeInfo getNodeTest();
+
+}
\ No newline at end of file
Modified: trunk/MXQuery/src/ch/ethz/mxquery/query/optimizer/TermVisitor.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/query/optimizer/TermVisitor.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/query/optimizer/TermVisitor.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -16,10 +16,12 @@
import java.util.List;
+import ch.ethz.mxquery.datamodel.types.TypeInfo;
import ch.ethz.mxquery.functions.fn.DataValuesIterator;
import ch.ethz.mxquery.iterators.AttributeIterator;
import ch.ethz.mxquery.iterators.ChildIterator;
import ch.ethz.mxquery.iterators.VariableIterator;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.opt.expr.Literal;
import ch.ethz.mxquery.opt.expr.LogicalUnit;
@@ -100,20 +102,15 @@
*/
private String getColumnName(XDMIterator expr){
XDMIterator iter = removeDataValuesIterator(expr);
-
String stepName = null;
- ChildIterator childIter = getChildIterator(iter);
XDMIterator nextIter=null;
- if (childIter != null) {
- stepName = childIter.getStepName();
- nextIter = childIter.getAllSubIters()[0];
+
+ if (iter instanceof StepInformation) {
+ TypeInfo ti = ((StepInformation)iter).getNodeTest();
+ stepName = ti.getXQName().toString();
+ nextIter = iter.getAllSubIters()[0];
}
- AttributeIterator attrIter = getAttributeIterator(iter);
- if (attrIter != null) {
- stepName = attrIter.getAttrStep();
- nextIter = attrIter.getAllSubIters()[0];
- }
-
+
if (stepName != null) {
String nextStep = getColumnName(nextIter);
if (nextStep != null) {
Modified: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMInputFactory.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMInputFactory.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMInputFactory.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -46,6 +46,7 @@
import ch.ethz.mxquery.xdmio.xmlAdapters.NonSchemaValidatingSaxImportAdapter;
import ch.ethz.mxquery.xdmio.xmlAdapters.NonValidatingDOMAdapter;
import ch.ethz.mxquery.xdmio.xmlAdapters.NonValidatingStaxAdapter;
+import ch.ethz.mxquery.xdmio.xmlAdapters.NonValidatingStaxAdapterProjection;
import ch.ethz.mxquery.xdmio.xmlAdapters.ValidatedSaxImportAdapter;
import ch.ethz.mxquery.xdmio.xmlAdapters.XPPImportAdapter;
@@ -71,7 +72,7 @@
return new NonSchemaValidatingSaxImportAdapter(ctx,location,new InputSource(xml), valMode, false);
case Context.NONVALIDATED_INPUT_MODE_SAX_TIDY:
return new NonSchemaValidatingSaxImportAdapter(ctx,location,new InputSource(xml), Context.NO_VALIDATION, true);
- case Context.NONVALIDATED_INPUT_MODE_STAX:
+ case Context.NONVALIDATED_INPUT_MODE_STAX: {
XMLInputFactory factory = XMLInputFactory.newInstance();
if (valMode == Context.NO_VALIDATION || valMode == Context.IGNORE_DTD)
factory.setProperty("javax.xml.stream.supportDTD", Boolean.FALSE);
@@ -83,6 +84,20 @@
} catch (XMLStreamException e) {
throw new MXQueryException(ErrorCodes.A0007_EC_IO,"I/O Error while parsing",location);
}
+ }
+ case Context.NONVALIDATED_INPUT_MODE_STAX_PROJECTION: {
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+ if (valMode == Context.NO_VALIDATION || valMode == Context.IGNORE_DTD)
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.FALSE);
+ else
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.TRUE);
+ try {
+ XMLStreamReader reader = factory.createXMLStreamReader(xml);
+ return new NonValidatingStaxAdapterProjection(ctx,location,reader);
+ } catch (XMLStreamException e) {
+ throw new MXQueryException(ErrorCodes.A0007_EC_IO,"I/O Error while parsing",location);
+ }
+ }
case Context.NONVALIDATED_INPUT_MODE_DOM:
DocumentBuilder parser;
try {
@@ -158,18 +173,32 @@
return new NonSchemaValidatingSaxImportAdapter(ctx,location,new InputSource(uri), valMode, false);
case Context.NONVALIDATED_INPUT_MODE_SAX_TIDY:
return new NonSchemaValidatingSaxImportAdapter(ctx,location,new InputSource(uri), Context.NO_VALIDATION, true);
- case Context.NONVALIDATED_INPUT_MODE_STAX:
+ case Context.NONVALIDATED_INPUT_MODE_STAX: {
XMLInputFactory factory = XMLInputFactory.newInstance();
- if (valMode == Context.NO_VALIDATION)
- factory.setProperty("javax.xml.stream.supportDTD", "false");
+ if (valMode == Context.NO_VALIDATION || valMode == Context.IGNORE_DTD)
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.FALSE);
else
- factory.setProperty("javax.xml.stream.supportDTD", "true");
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.TRUE);
try {
XMLStreamReader reader = factory.createXMLStreamReader(new StreamSource(new File(uri)));
return new NonValidatingStaxAdapter(ctx,location,reader);
} catch (XMLStreamException e) {
throw new MXQueryException(ErrorCodes.A0007_EC_IO,"I/O Error while parsing",location);
}
+ }
+ case Context.NONVALIDATED_INPUT_MODE_STAX_PROJECTION: {
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+ if (valMode == Context.NO_VALIDATION || valMode == Context.IGNORE_DTD)
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.FALSE);
+ else
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.TRUE);
+ try {
+ XMLStreamReader reader = factory.createXMLStreamReader(new StreamSource(new File(uri)));
+ return new NonValidatingStaxAdapterProjection(ctx,location,reader);
+ } catch (XMLStreamException e) {
+ throw new MXQueryException(ErrorCodes.A0007_EC_IO,"I/O Error while parsing",location);
+ }
+ }
case Context.NONVALIDATED_INPUT_MODE_DOM:
DocumentBuilder parser;
try {
Modified: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XMLSource.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XMLSource.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XMLSource.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -15,6 +15,8 @@
package ch.ethz.mxquery.xdmio;
+import java.util.Vector;
+
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.datamodel.Source;
@@ -36,5 +38,10 @@
* @return the root element name if the source was validated against a DTD
*/
public abstract String getRootElemDTD();
+ /**
+ * Inform the source about the projection information
+ * @param paths
+ */
+ public void setProjectionPaths(Vector paths);
}
Added: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -0,0 +1,259 @@
+/* Copyright 2006 - 2009 ETH Zurich
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.mxquery.xdmio.xmlAdapters;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Vector;
+
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import ch.ethz.mxquery.contextConfig.Context;
+import ch.ethz.mxquery.datamodel.QName;
+import ch.ethz.mxquery.datamodel.XQName;
+import ch.ethz.mxquery.datamodel.types.Type;
+import ch.ethz.mxquery.datamodel.xdm.CommentToken;
+import ch.ethz.mxquery.datamodel.xdm.ElementToken;
+import ch.ethz.mxquery.datamodel.xdm.NamedToken;
+import ch.ethz.mxquery.datamodel.xdm.ProcessingInstrToken;
+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.MXQueryException;
+import ch.ethz.mxquery.exceptions.QueryLocation;
+import ch.ethz.mxquery.model.XDMIterator;
+import ch.ethz.mxquery.util.Utils;
+
+public class NonValidatingStaxAdapterProjection extends XDMImportAdapter {
+ private XMLStreamReader reader;
+
+ private LinkedList tokensList;
+
+ private ArrayList projectionPaths;
+
+ private int [] projPathPos;
+
+
+
+ private int PROJ_MODE_NORMAL = 0;
+ private int PROJ_MODE_SKIP = 1;
+ private int PROJ_MODE_KEEP_SUB = 2;
+ private int PROJ_MODE_KEEP = 3;
+ private int PROJ_MODE_MOVE = 4;
+
+ int curProjMode = PROJ_MODE_NORMAL;
+
+ public NonValidatingStaxAdapterProjection(Context ctx, QueryLocation loc, XMLStreamReader reader) {
+ super(ctx, loc);
+ this.reader = reader;
+ this.tokensList = new LinkedList();
+ }
+
+ private TokenInterface getNext() {
+ TokenInterface tok = Token.END_SEQUENCE_TOKEN;
+ if (endOfSeq)
+ return tok;
+ try {
+ int event = reader.getEventType();
+ switch (event) {
+ case XMLStreamConstants.ATTRIBUTE:
+ break;
+ case XMLStreamConstants.DTD:
+ break;
+ case XMLStreamConstants.CDATA:
+ case XMLStreamConstants.CHARACTERS:
+ case XMLStreamConstants.SPACE:
+ {
+ StringBuffer mergedText = new StringBuffer();
+ while (event == XMLStreamConstants.CDATA || event == XMLStreamConstants.SPACE || event == XMLStreamConstants.CHARACTERS) {
+ mergedText.append(reader.getText());
+ reader.next();
+ event = reader.getEventType();
+ }
+ return new TextToken(Type.TEXT_NODE_UNTYPED_ATOMIC, createNextTokenId(Type.TEXT_NODE_UNTYPED_ATOMIC, null), mergedText.toString(),curNsScope);
+ }
+ case XMLStreamConstants.COMMENT:
+ tok = new CommentToken(createNextTokenId(Type.COMMENT, null), reader.getText(),curNsScope);
+ break;
+ case XMLStreamConstants.END_DOCUMENT:
+ tok = new Token(Type.END_DOCUMENT,null,curNsScope);
+ break;
+ case XMLStreamConstants.END_ELEMENT:
+ String name = reader.getLocalName();
+ String ns_uri = reader.getNamespaceURI();
+ 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();
+ level--;
+ break;
+ case XMLStreamConstants.ENTITY_DECLARATION: // not used
+ break;
+ case XMLStreamConstants.ENTITY_REFERENCE:
+ break;
+ case XMLStreamConstants.NAMESPACE:
+ break;
+ case XMLStreamConstants.NOTATION_DECLARATION:
+ tok = new TextToken(createNextTokenId(Type.NOTATION, null), reader.getText());
+ break;
+ case XMLStreamConstants.PROCESSING_INSTRUCTION:
+ tok = new ProcessingInstrToken(createNextTokenId(Type.PROCESSING_INSTRUCTION, null), reader.getPIData(), reader.getPITarget(),curNsScope);
+ break;
+ case XMLStreamConstants.START_DOCUMENT:
+ tok = new Token(Type.START_DOCUMENT,createNextTokenId(Type.START_DOCUMENT, null),curNsScope);
+ break;
+ case XMLStreamConstants.START_ELEMENT:
+ level++;
+
+ boolean foundId = false;
+ boolean foundIdREFS = false;
+
+ String xmlId = null;
+ String [] xmlIdREFS = null;
+
+ boolean createdNSScope = false;
+ name = reader.getLocalName();
+ ns_uri = reader.getNamespaceURI();
+ prefix = reader.getPrefix();
+
+ // projection:
+
+ // check if node name fits with currently active paths
+
+
+ if (prefix != null && prefix.length() == 0)
+ prefix = null;
+ 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++) {
+ String namespacePrefix = reader.getNamespacePrefix(i);
+ String namespaceUri = reader.getNamespaceURI(i);
+ XQName q;
+ if (namespacePrefix == null)
+ q = new QName(null, "xmlns");
+ else
+ q = new QName("xmlns", namespacePrefix);
+ boolean newOpened = checkOpenNsScopeAddNs(createdNSScope, q, namespaceUri);
+ if (newOpened && !createdNSScope)
+ tok = new ElementToken(Type.START_TAG, tok.getNodeId(), tName, curNsScope);
+ }
+
+ for (int i = 0, n = reader.getAttributeCount(); i < n; ++i) {
+ javax.xml.namespace.QName qName = reader.getAttributeName(i);
+ name = qName.getLocalPart();
+ ns_uri = qName.getNamespaceURI();
+ prefix = qName.getPrefix();
+
+
+
+ if (prefix.length() == 0)
+ prefix = null;
+ XQName q = new QName(ns_uri, prefix, name);
+ String value = reader.getAttributeValue(i);
+
+ String attType = reader.getAttributeType(i);
+
+ if (!foundId && (attType.equals("ID") || isXMLId(tName,q))) {
+ foundId = true;
+ xmlId = value;
+ }
+ if (!foundIdREFS && (attType.equals("IDREF") || isIDREF(tName,q))) {
+ foundIdREFS = true;
+ xmlIdREFS = new String[]{value};
+ }
+
+ if (!foundIdREFS && (attType.equals("IDREFS") || isIDREFS(tName,q))) {
+ foundIdREFS = true;
+ xmlIdREFS = Utils.split(value," ", false);
+ }
+
+
+ boolean newOpened = checkOpenNsScopeAddNs(createdNSScope, q, value);
+ if (newOpened && !createdNSScope)
+ tok = new ElementToken(Type.START_TAG, tok.getNodeId(), tName, curNsScope);
+
+ if (q.getNamespacePrefix() == null || q.getNamespacePrefix().equals("")) {
+ if (q.getLocalPart().equals("xmlns"))
+ continue;
+ } else if (q.getNamespacePrefix().equals("xmlns"))
+ continue;
+ NamedToken attToken = createAttributeToken(Type.UNTYPED_ATOMIC, value, q, curNsScope);
+ tokensList.add(attToken);
+
+ if (foundId) {
+ NamedToken nmToken = (NamedToken) tok ;
+ nmToken.setID(xmlId);
+ }
+ if (foundIdREFS) {
+ NamedToken nmToken = (NamedToken) tok;
+ nmToken.setIDREFS(xmlIdREFS);
+ }
+
+
+ }
+ break;
+ default:
+ }
+ if (reader.hasNext())
+ reader.next()...
[truncated message content] |
|
From: <pm_...@us...> - 2012-02-07 08:53:57
|
Revision: 4520
http://mxquery.svn.sourceforge.net/mxquery/?rev=4520&view=rev
Author: pm_fischer
Date: 2012-02-07 08:53:50 +0000 (Tue, 07 Feb 2012)
Log Message:
-----------
- Use AbstractStep objects throughout the plan
- Properly implement projection for count() and data()
- Loading should work for a single, child-only path, local names
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/CountIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/DataValuesIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Doc.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/AttributeIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/DescendantOrSelfIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/XMLContent.java
trunk/MXQuery/src/ch/ethz/mxquery/model/AbstractStep.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/CountIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/CountIterator.java 2012-02-07 08:51:38 UTC (rev 4519)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/CountIterator.java 2012-02-07 08:53:50 UTC (rev 4520)
@@ -27,10 +27,13 @@
import ch.ethz.mxquery.datamodel.xdm.LongToken;
import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
import ch.ethz.mxquery.exceptions.MXQueryException;
+import ch.ethz.mxquery.exceptions.StaticException;
import ch.ethz.mxquery.iterators.VariableIterator;
import ch.ethz.mxquery.model.IndexIterator;
import ch.ethz.mxquery.model.TokenBasedIterator;
import ch.ethz.mxquery.model.XDMIterator;
+import ch.ethz.mxquery.util.ObjectObjectPair;
+import ch.ethz.mxquery.util.Set;
public class CountIterator extends TokenBasedIterator {
private IndexIterator indexIter;
@@ -107,4 +110,15 @@
copy.setSubIters(subIters);
return copy;
}
+
+ public ObjectObjectPair getProjectionPaths() throws StaticException {
+ Set returned = new Set();
+ Set used = new Set();
+ ObjectObjectPair cur = subIters[0].getProjectionPaths();
+ // Conditionals used and returned go to to used
+ used.addAll((Set)cur.getFirst());
+ used.addAll((Set)cur.getSecond());
+ return new ObjectObjectPair(returned, used);
+ }
+
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/DataValuesIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/DataValuesIterator.java 2012-02-07 08:51:38 UTC (rev 4519)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/DataValuesIterator.java 2012-02-07 08:53:50 UTC (rev 4520)
@@ -15,6 +15,7 @@
package ch.ethz.mxquery.functions.fn;
+import java.util.Enumeration;
import java.util.Vector;
import org.apache.xerces.xs.ShortList;
@@ -35,15 +36,19 @@
import ch.ethz.mxquery.exceptions.ErrorCodes;
import ch.ethz.mxquery.exceptions.MXQueryException;
import ch.ethz.mxquery.exceptions.QueryLocation;
+import ch.ethz.mxquery.exceptions.StaticException;
import ch.ethz.mxquery.exceptions.TypeException;
import ch.ethz.mxquery.functions.Function;
import ch.ethz.mxquery.functions.xs.XSConstructorIterator;
import ch.ethz.mxquery.functions.xs.XSQName;
import ch.ethz.mxquery.iterators.SequenceIterator;
import ch.ethz.mxquery.iterators.TokenIterator;
+import ch.ethz.mxquery.model.AbstractStep;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.EmptySequenceIterator;
import ch.ethz.mxquery.model.XDMIterator;
+import ch.ethz.mxquery.util.ObjectObjectPair;
+import ch.ethz.mxquery.util.Set;
import ch.ethz.mxquery.util.Utils;
public class DataValuesIterator extends CurrentBasedIterator {
@@ -743,4 +748,26 @@
copy.setContext(context, false);
return copy;
}
+
+ public ObjectObjectPair getProjectionPaths() throws StaticException {
+ Set returned = new Set();
+ Set used = new Set();
+
+ if (subIters != null)
+ for (int i=0;i<subIters.length;i++){
+ ObjectObjectPair cur = subIters[i].getProjectionPaths();
+ Enumeration returnedPaths = ((Set)cur.getFirst()).elements();
+ while (returnedPaths.hasMoreElements()) {
+ Vector curRetPath = (Vector)returnedPaths.nextElement();
+ Vector res = new Vector();
+ res.addAll(curRetPath);
+ res.addElement(AbstractStep.KEEP_SUBTREE);
+ used.add(res);
+ }
+ used.addAll((Set)cur.getSecond());
+ }
+ return new ObjectObjectPair(returned, used);
+
+ }
+
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Doc.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Doc.java 2012-02-07 08:51:38 UTC (rev 4519)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Doc.java 2012-02-07 08:53:50 UTC (rev 4520)
@@ -30,6 +30,7 @@
import ch.ethz.mxquery.exceptions.MXQueryException;
import ch.ethz.mxquery.functions.RequestTypeMulti;
import ch.ethz.mxquery.iterators.TokenIterator;
+import ch.ethz.mxquery.model.AbstractStep;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.EmptySequenceIterator;
import ch.ethz.mxquery.model.TokenSequenceIterator;
@@ -256,7 +257,9 @@
public ObjectObjectPair getProjectionPaths() {
Set returned = new Set();
- returned.add("/");
+ Vector rPath = new Vector();
+ rPath.addElement(AbstractStep.ROOT_STEP);
+ returned.add(rPath);
return new ObjectObjectPair(returned, new Set());
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/AttributeIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/AttributeIterator.java 2012-02-07 08:51:38 UTC (rev 4519)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/AttributeIterator.java 2012-02-07 08:53:50 UTC (rev 4520)
@@ -30,6 +30,7 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.StaticException;
import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.AbstractStep;
import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CheckNodeType;
import ch.ethz.mxquery.model.CurrentBasedIterator;
@@ -181,16 +182,10 @@
Set returned = new Set();
Enumeration pathEnum = returnedBelow.elements();
while (pathEnum.hasMoreElements()) {
- String res = (String) pathEnum.nextElement();
- if (res.endsWith("/"))
- res = res.substring(0, res.length()-1);
- if (namespace != null)
- res = res+"/@{"+namespace+"}:";
- if (local != null) {
- if (namespace == null)
- res = res+"/@";
- res = res+local;
- }
+ Vector prev = (Vector) pathEnum.nextElement();
+ Vector res = new Vector();
+ res.addAll(prev);
+ res.addElement(new AbstractStep(AXIS_ATTRIBUTE, stepData));
returned.add(res);
}
return new ObjectObjectPair(returned, paths.getSecond());
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java 2012-02-07 08:51:38 UTC (rev 4519)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java 2012-02-07 08:53:50 UTC (rev 4520)
@@ -39,6 +39,7 @@
import ch.ethz.mxquery.model.Window;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.KXmlSerializer;
+import ch.ethz.mxquery.util.LogLevel;
import ch.ethz.mxquery.util.ObjectObjectPair;
import ch.ethz.mxquery.util.Set;
@@ -271,8 +272,13 @@
Set returned = new Set();
Enumeration pathEnum = returnedBelow.elements();
while (pathEnum.hasMoreElements()) {
- Vector res = (Vector) pathEnum.nextElement();
- res.addElement(new AbstractStep(AXIS_CHILD, stepData));
+ Vector res = new Vector();
+ Vector prev = (Vector) pathEnum.nextElement();
+ res.addAll(prev);
+ if (stepData.getXQName() != null)
+ res.addElement(new AbstractStep(AXIS_CHILD, stepData));
+ else
+ logger.log(LogLevel.FINE, "Projection Paths for non-named nodetests currently not supported");
returned.add(res);
}
return new ObjectObjectPair(returned, paths.getSecond());
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/DescendantOrSelfIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/DescendantOrSelfIterator.java 2012-02-07 08:51:38 UTC (rev 4519)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/DescendantOrSelfIterator.java 2012-02-07 08:53:50 UTC (rev 4520)
@@ -462,7 +462,9 @@
Set returned = new Set();
Enumeration pathEnum = returnedBelow.elements();
while (pathEnum.hasMoreElements()) {
- Vector res = (Vector) pathEnum.nextElement();
+ Vector prev = (Vector) pathEnum.nextElement();
+ Vector res = new Vector();
+ res.addAll(prev);
res.addElement(new AbstractStep(descAxis, stepData));
returned.add(res);
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/XMLContent.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/XMLContent.java 2012-02-07 08:51:38 UTC (rev 4519)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/XMLContent.java 2012-02-07 08:53:50 UTC (rev 4520)
@@ -42,6 +42,7 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.StaticException;
import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.AbstractStep;
import ch.ethz.mxquery.model.Iterator;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.KXmlSerializer;
@@ -618,8 +619,11 @@
ObjectObjectPair cur = subIters[i].getProjectionPaths();
Enumeration returnedPaths = ((Set)cur.getFirst()).elements();
while (returnedPaths.hasMoreElements()) {
- String curRetPath = (String)returnedPaths.nextElement();
- used.add(curRetPath+" #");
+ Vector curRetPath = (Vector)returnedPaths.nextElement();
+ Vector res = new Vector();
+ res.addAll(curRetPath);
+ res.addElement(AbstractStep.KEEP_SUBTREE);
+ used.add(res);
}
used.addAll((Set)cur.getSecond());
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/model/AbstractStep.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/model/AbstractStep.java 2012-02-07 08:51:38 UTC (rev 4519)
+++ trunk/MXQuery/src/ch/ethz/mxquery/model/AbstractStep.java 2012-02-07 08:53:50 UTC (rev 4520)
@@ -49,6 +49,10 @@
else
return "attribute::";
+ case AXIS_DESCENDANT:
+ return "descendant::";
+ case 99:
+ return "#";
default:
throw new RuntimeException();
}
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:51:38 UTC (rev 4519)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java 2012-02-07 08:53:50 UTC (rev 4520)
@@ -13,11 +13,43 @@
* limitations under the License.
*/
+
+/*
+ * Contains the document projection logic outlined in the Marian/Simeon paper:
+ * Automaton to express what to do with the current event
+ * KEEP: this node (but not its descendants) should be kept
+ * KEEP_SUB: this node and its descendants should be kept
+ * SKIP: the current node/event should be discarded
+ * MOVE: the current node/event is on a projection path, but not at its end. It may have to be kept if we match a KEEP/KEEP_SUB node at the end of this path
+ *
+ * We keep track of the level on which we switched to SKIP/SUB_KEEP: top skip, top keep node => skipKeepLevel
+ *
+ * Transitions:
+ *
+ * Driven by opening tags
+ * MOVE->KEEP: We reach the end of a projection path, match the name and do not keep descendants => produce
+ * MOVE->KEEP_SUB: end of projection path with
+ * MOVE->SKIP: At some of the projection path, we do not match the name
+ * KEEP->SKIP: produced the kept node, go "deeper"
+ * MOVE->MOVE: on a projection path, match name
+ * SKIP->SKIP: any opening tag
+ * KEEP_SUB->KEEP_SUB: any opening tag
+ *
+ * Driven by closing tags
+ * SKIP->KEEP: reached skipKeepLevel, level above matched
+ * SKIP->MOVE: reached skipKeepLevel, level above did not match
+ * KEEP->MOVE: produced the closing tag of kept node
+ * KEEP_SUB->MOVE: reached skipKeepLevel
+ * MOVE->MOVE: on a projection path, match name close
+ * SKIP->SKIP: any closing tag greater than skipKeepLevel
+ * KEEP_SUB->KEEP_SUB: any closing tag greater than skipKeepLevel
+ */
package ch.ethz.mxquery.xdmio.xmlAdapters;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Vector;
+import java.util.Stack;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
@@ -39,8 +71,8 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.model.AbstractStep;
import ch.ethz.mxquery.model.XDMIterator;
-import ch.ethz.mxquery.util.Utils;
+
public class NonValidatingStaxAdapterProjection extends XDMImportAdapter {
private XMLStreamReader reader;
@@ -50,20 +82,27 @@
private int [] projPathPos;
+ private Stack bufferedPathName;
+ private Stack bufferedPathURI;
+ private Stack bufferedPathPrefix;
+ private Stack bufferedAttributes;
+
+ private int pathProducedLevel = 0;
+
int skipKeepLevel = -1;
- private int PROJ_MODE_NORMAL = 0;
- private int PROJ_MODE_SKIP = 1;
- private int PROJ_MODE_KEEP_SUB = 2;
- private int PROJ_MODE_KEEP = 3;
- private int PROJ_MODE_MOVE = 4;
+ private final int PROJ_MODE_SKIP = 1;
+ private final int PROJ_MODE_KEEP_SUB = 2;
+ private final int PROJ_MODE_KEEP = 3;
+ private final int PROJ_MODE_MOVE = 4;
- int curProjMode = PROJ_MODE_NORMAL;
+ int curProjMode = PROJ_MODE_MOVE;
public NonValidatingStaxAdapterProjection(Context ctx, QueryLocation loc, XMLStreamReader reader) {
super(ctx, loc);
this.reader = reader;
this.tokensList = new LinkedList();
+ this.bufferedPathName = new Stack();
}
private TokenInterface getNext() {
@@ -82,11 +121,10 @@
case XMLStreamConstants.CHARACTERS:
case XMLStreamConstants.SPACE:
{
- if (curProjMode == PROJ_MODE_SKIP) {
+ if (curProjMode == PROJ_MODE_SKIP || curProjMode == PROJ_MODE_MOVE) {
reader.next();
continue;
}
-
StringBuffer mergedText = new StringBuffer();
while (event == XMLStreamConstants.CDATA || event == XMLStreamConstants.SPACE || event == XMLStreamConstants.CHARACTERS) {
mergedText.append(reader.getText());
@@ -96,7 +134,7 @@
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)
+ if (curProjMode == PROJ_MODE_SKIP || curProjMode == PROJ_MODE_MOVE)
continue;
tok = new CommentToken(createNextTokenId(Type.COMMENT, null), reader.getText(),curNsScope);
@@ -104,54 +142,120 @@
case XMLStreamConstants.END_DOCUMENT:
tok = new Token(Type.END_DOCUMENT,null,curNsScope);
break;
- case XMLStreamConstants.END_ELEMENT:
- String name = reader.getLocalName();
- String ns_uri = reader.getNamespaceURI();
- String prefix = reader.getPrefix();
- if (prefix != null && prefix.length() == 0)
- prefix = null;
- //
- 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]--;
+ case XMLStreamConstants.END_ELEMENT: {
+ boolean emitTag = false;
+ String name_debug = reader.getLocalName();
+ switch (curProjMode) {
+ case PROJ_MODE_KEEP_SUB:
+ //KEEP_SUB->MOVE: reached skipKeepLevel
+ //KEEP_SUB->KEEP_SUB: any closing tag greater than skipKeepLevel
+ if (skipKeepLevel == level) {
+ curProjMode = PROJ_MODE_MOVE;
+ skipKeepLevel = -1;
+ pathProducedLevel--;
+ }
+ emitTag = true;
+ break;
+ case PROJ_MODE_SKIP:
+ // go to "KEEP", check later if we keep or move
+
+ if (skipKeepLevel == level+1) {
+ curProjMode = PROJ_MODE_MOVE;
+ if (pathProducedLevel >= level) {
+ emitTag = true;
+ pathProducedLevel--;
}
- if (projPathPos[0]+2 >= ((Vector)projectionPaths.get(0)).size())
- stillSkip = false;
- }
+ skipKeepLevel = -1;
+ }
+ else
+ if (skipKeepLevel == level) {
+ String name = reader.getLocalName();
+
+ Vector path = (Vector)projectionPaths.get(0);
- if (curProjMode == PROJ_MODE_MOVE && projPathPos[0] > 0) {
+ XQName curPathCheck = ((AbstractStep) (path).elementAt(projPathPos[0])).getNodeTest().getXQName();
+ if (curPathCheck.getLocalPart().equals(name) || level != projPathPos[0]) {
+ curProjMode = PROJ_MODE_KEEP;
+ } else {
+ curProjMode = PROJ_MODE_MOVE;
+ }
+ skipKeepLevel = -1;
+ }
+ else {
+ reader.next();
+ level--;
+ continue;
+ }
+ break;
+ case PROJ_MODE_MOVE: {
+ String name = reader.getLocalName();
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 (pathProducedLevel >= level) {
+ emitTag = true;
+ pathProducedLevel--;
+ }
+ projPathPos[0]--;
+ bufferedPathName.pop();
+ } break;
+ case PROJ_MODE_KEEP: {
+
+ //decide if keep or move directly, when we came from SKIP
+ //SKIP->KEEP: reached skipKeepLevel, level above matched
+ // SKIP->MOVE: reached skipKeepLevel, level above did not match
+ String name = reader.getLocalName();
+
+ Vector path = (Vector)projectionPaths.get(0);
+
+ if (path.size() == projPathPos[0]+1) {// last element in path, and not a "KEEP"
+ // really keep
+ emitTag = true;
+ } else {
+ curProjMode = PROJ_MODE_MOVE;
+ if (bufferedPathName.size() > level && bufferedPathName.get(level).equals(name)) {
+ emitTag = true;
+
+ }
+ bufferedPathName.pop();
+ projPathPos[0]--;
+ }
+ XQName curPathCheck = ((AbstractStep) (path).elementAt(projPathPos[0])).getNodeTest().getXQName();
+ if (!curPathCheck.getLocalPart().equals(name))
+ throw new MXQueryException(ErrorCodes.A0007_EC_IO, "Inconsistency in projecting, expected "+curPathCheck.getLocalPart()+" saw "+name, loc);
+ //projPathPos[0]--;
+ curProjMode = PROJ_MODE_MOVE;
+
+ pathProducedLevel--;
}
- if (curProjMode != PROJ_MODE_SKIP && !stillSkip) {
+
+ /*
+ * KEEP->MOVE: produced the closing tag of kept node
+ * MOVE->MOVE: on a projection path, match name close
+ * SKIP->SKIP: any closing tag greater than skipKeepLevel
+ */
+ }
+
+
+ //
+ if (emitTag) {
+ String name = reader.getLocalName();
+ String ns_uri = reader.getNamespaceURI();
+ 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();
- stillSkip = false;
- }
- level--;
- if (curProjMode == PROJ_MODE_SKIP || stillSkip) {
+ level--;
+ } else {
reader.next();
+ level--;
continue;
}
+
+ }
break;
case XMLStreamConstants.ENTITY_DECLARATION: // not used
break;
@@ -160,12 +264,12 @@
case XMLStreamConstants.NAMESPACE:
break;
case XMLStreamConstants.NOTATION_DECLARATION:
- if (curProjMode == PROJ_MODE_SKIP)
+ if (curProjMode == PROJ_MODE_SKIP || curProjMode == PROJ_MODE_MOVE)
continue;
tok = new TextToken(createNextTokenId(Type.NOTATION, null), reader.getText());
break;
case XMLStreamConstants.PROCESSING_INSTRUCTION:
- if (curProjMode == PROJ_MODE_SKIP)
+ if (curProjMode == PROJ_MODE_SKIP || curProjMode == PROJ_MODE_MOVE)
continue;
tok = new ProcessingInstrToken(createNextTokenId(Type.PROCESSING_INSTRUCTION, null), reader.getPIData(), reader.getPITarget(),curNsScope);
break;
@@ -180,7 +284,7 @@
break;
case XMLStreamConstants.START_ELEMENT:
level++;
-
+ // "shortcut": if we skip, we do not even have to retrieve names etc
if (curProjMode == PROJ_MODE_SKIP) {
reader.next();
continue;
@@ -193,112 +297,151 @@
String [] xmlIdREFS = null;
boolean createdNSScope = false;
- name = reader.getLocalName();
- ns_uri = reader.getNamespaceURI();
- prefix = reader.getPrefix();
-
+ String name = reader.getLocalName();
+ String ns_uri = reader.getNamespaceURI();
+ String prefix = reader.getPrefix();
+ if (prefix != null && prefix.length() == 0)
+ prefix = null;
+
// projection:
+ boolean emitTag = false;
+
// 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;
- }
+ switch (curProjMode) {
+ case PROJ_MODE_KEEP_SUB:
+ emitTag = true; // no check, just output
+ break;
- } else {
- curProjMode = PROJ_MODE_SKIP;
- skipKeepLevel = level;
+ case PROJ_MODE_MOVE:
+ as = ((AbstractStep) ((Vector)projectionPaths.get(0)).elementAt(projPathPos[0]));
+ if (as == AbstractStep.KEEP_SUBTREE) {
+ curProjMode = PROJ_MODE_KEEP_SUB;
+ skipKeepLevel = level;
+ emitTag = true;
+ } else {
+ XQName curPathCheck = as.getNodeTest().getXQName();
+ if (curPathCheck.getLocalPart().equals(name)) { //TODO: Handle namespaces
+ // check name: if true, then either keep or move
+ Vector path = ((Vector)projectionPaths.get(0));
+ if (path.size() <= projPathPos[0]+1) {
+ tok = extractPendingElements(
+ name,
+ ns_uri,
+ prefix);
+ curProjMode = PROJ_MODE_KEEP;
+ skipKeepLevel = level+1;
+ }
+ else if (path.elementAt(path.size()-1)==AbstractStep.KEEP_SUBTREE && path.size() <= projPathPos[0]+2) {
+ tok = extractPendingElements(
+ name,
+ ns_uri,
+ prefix);
+ curProjMode = PROJ_MODE_KEEP_SUB;
+ skipKeepLevel = level;
+ }
+ else {
+ projPathPos[0]++;
+ curProjMode = PROJ_MODE_MOVE;
+ bufferedPathName.push(name);
+ reader.next();
+ continue; //buffer contents until we find a projection result
+ }
+
+ } else { // otherwise go to skip
+ skipKeepLevel = level;
+ curProjMode = PROJ_MODE_SKIP;
+ }
+ }
+
+ break;
+ case PROJ_MODE_KEEP: {
+ //emitTag = true;
+ skipKeepLevel = level;
+ curProjMode = PROJ_MODE_SKIP;
+ }
+ break;
+ // we handled SKIP already above
}
- }
- if (curProjMode == PROJ_MODE_SKIP && !skipOnNext) {
+ if (curProjMode == PROJ_MODE_SKIP) {
reader.next();
continue;
}
- if (prefix != null && prefix.length() == 0)
+ if (emitTag) {
+ if (prefix != null && prefix.length() == 0)
prefix = null;
- 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++) {
- String namespacePrefix = reader.getNamespacePrefix(i);
- String namespaceUri = reader.getNamespaceURI(i);
- XQName q;
- if (namespacePrefix == null)
- q = new QName(null, "xmlns");
- else
- q = new QName("xmlns", namespacePrefix);
- boolean newOpened = checkOpenNsScopeAddNs(createdNSScope, q, namespaceUri);
- if (newOpened && !createdNSScope)
- tok = new ElementToken(Type.START_TAG, tok.getNodeId(), tName, curNsScope);
+ XQName tName = new QName(ns_uri, prefix, name);
+ tok = new ElementToken(Type.START_TAG, createNextTokenId(Type.START_TAG, tName.toString()), tName, curNsScope);
}
+ if (curProjMode == PROJ_MODE_KEEP)
+ curProjMode = PROJ_MODE_SKIP;
+// TODO: restore namespace and attribute processing
+// for (int i = 0; i < reader.getNamespaceCount(); i++) {
+// String namespacePrefix = reader.getNamespacePrefix(i);
+// String namespaceUri = reader.getNamespaceURI(i);
+// XQName q;
+// if (namespacePrefix == null)
+// q = new QName(null, "xmlns");
+// else
+// q = new QName("xmlns", namespacePrefix);
+// boolean newOpened = checkOpenNsScopeAddNs(createdNSScope, q, namespaceUri);
+// if (newOpened && !createdNSScope)
+// tok = new ElementToken(Type.START_TAG, tok.getNodeId(), tName, curNsScope);
+// }
- for (int i = 0, n = reader.getAttributeCount(); i < n; ++i) {
- javax.xml.namespace.QName qName = reader.getAttributeName(i);
- name = qName.getLocalPart();
- ns_uri = qName.getNamespaceURI();
- prefix = qName.getPrefix();
-
-
-
- if (prefix.length() == 0)
- prefix = null;
- XQName q = new QName(ns_uri, prefix, name);
- String value = reader.getAttributeValue(i);
-
- String attType = reader.getAttributeType(i);
-
- if (!foundId && (attType.equals("ID") || isXMLId(tName,q))) {
- foundId = true;
- xmlId = value;
- }
- if (!foundIdREFS && (attType.equals("IDREF") || isIDREF(tName,q))) {
- foundIdREFS = true;
- xmlIdREFS = new String[]{value};
- }
-
- if (!foundIdREFS && (attType.equals("IDREFS") || isIDREFS(tName,q))) {
- foundIdREFS = true;
- xmlIdREFS = Utils.split(value," ", false);
- }
-
-
- boolean newOpened = checkOpenNsScopeAddNs(createdNSScope, q, value);
- if (newOpened && !createdNSScope)
- tok = new ElementToken(Type.START_TAG, tok.getNodeId(), tName, curNsScope);
-
- if (q.getNamespacePrefix() == null || q.getNamespacePrefix().equals("")) {
- if (q.getLocalPart().equals("xmlns"))
- continue;
- } else if (q.getNamespacePrefix().equals("xmlns"))
- continue;
- NamedToken attToken = createAttributeToken(Type.UNTYPED_ATOMIC, value, q, curNsScope);
- tokensList.add(attToken);
-
- if (foundId) {
- NamedToken nmToken = (NamedToken) tok ;
- nmToken.setID(xmlId);
- }
- if (foundIdREFS) {
- NamedToken nmToken = (NamedToken) tok;
- nmToken.setIDREFS(xmlIdREFS);
- }
-
-
- }
+// for (int i = 0, n = reader.getAttributeCount(); i < n; ++i) {
+// javax.xml.namespace.QName qName = reader.getAttributeName(i);
+// name = qName.getLocalPart();
+// ns_uri = qName.getNamespaceURI();
+// prefix = qName.getPrefix();
+//
+//
+//
+// if (prefix.length() == 0)
+// prefix = null;
+// XQName q = new QName(ns_uri, prefix, name);
+// String value = reader.getAttributeValue(i);
+//
+// String attType = reader.getAttributeType(i);
+//
+// if (!foundId && (attType.equals("ID") || isXMLId(tName,q))) {
+// foundId = true;
+// xmlId = value;
+// }
+// if (!foundIdREFS && (attType.equals("IDREF") || isIDREF(tName,q))) {
+// foundIdREFS = true;
+// xmlIdREFS = new String[]{value};
+// }
+//
+// if (!foundIdREFS && (attType.equals("IDREFS") || isIDREFS(tName,q))) {
+// foundIdREFS = true;
+// xmlIdREFS = Utils.split(value," ", false);
+// }
+//
+//
+// boolean newOpened = checkOpenNsScopeAddNs(createdNSScope, q, value);
+// if (newOpened && !createdNSScope)
+// tok = new ElementToken(Type.START_TAG, tok.getNodeId(), tName, curNsScope);
+//
+// if (q.getNamespacePrefix() == null || q.getNamespacePrefix().equals("")) {
+// ...
[truncated message content] |
|
From: <pm_...@us...> - 2012-03-12 06:39:31
|
Revision: 4533
http://mxquery.svn.sourceforge.net/mxquery/?rev=4533&view=rev
Author: pm_fischer
Date: 2012-03-12 06:39:25 +0000 (Mon, 12 Mar 2012)
Log Message:
-----------
- data flow analysis for node id requirements
- small performance improvements for child
- suppress logging output in parser
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Put.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/CompareIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/DocOrderIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/ExceptIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/IntersectIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/UnionIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/model/CurrentBasedIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/query/parser/Parser.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Put.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Put.java 2012-03-02 10:01:31 UTC (rev 4532)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Put.java 2012-03-12 06:39:25 UTC (rev 4533)
@@ -91,7 +91,7 @@
File fn = new File(uri);
UpdateableStore putStore = null;
- if (!(targetID.getStore() instanceof UpdateableStore))
+ if (targetID == null || !(targetID.getStore() instanceof UpdateableStore))
{
putStore = nodeParam.getContext().getStores().createUpdateableStore(uri.toString(),nodeParam,true, true);
putStore.materialize();
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java 2012-03-02 10:01:31 UTC (rev 4532)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java 2012-03-12 06:39:25 UTC (rev 4533)
@@ -122,25 +122,25 @@
this.called++;
TokenInterface tok = Token.START_SEQUENCE_TOKEN;
- int type = tok.getEventType();
- while (type != Type.END_SEQUENCE) {
+ //int type = tok.getEventType();
+ curEventType = Type.START_SEQUENCE;
+ while (curEventType != Type.END_SEQUENCE) {
// next on child iterator
tok = getNext();
- type = tok.getEventType();
- if (type == Type.END_SEQUENCE)
+ if (curEventType == Type.END_SEQUENCE)
return tok;
- if (!Type.isNode(type))
+ if (!Type.isNode(curEventType))
throw new TypeException(ErrorCodes.E0019_TYPE_STEP_RESULT_IS_ATOMIC, "Child axis applied on non-node",loc );
- if (depth == 1 && tok.getEventType() == Type.START_TAG || tok.getEventType() == Type.START_DOCUMENT)
+ if (depth == 1 && curEventType == Type.START_TAG || curEventType == Type.START_DOCUMENT)
newParent = true;
int targetDepth = 1;
if (match) { // if current node is already matching the child
// condition
- if (type == Type.END_TAG && depth == targetDepth
+ if (curEventType == Type.END_TAG && depth == targetDepth
&& (tok.getName().equals(lastStep))) { // child
// if the current depth is equal to initial depth, it's the
// end of the matching sequence
@@ -163,19 +163,18 @@
continue;
break;
case Type.TYPE_NK_ANY_NODE_TEST:
- if (boundNode == null && (type == Type.START_DOCUMENT || type == Type.START_TAG)) {
+ if (boundNode == null && (curEventType == Type.START_DOCUMENT || curEventType == Type.START_TAG)) {
boundNode = tok;
tok = getNext();
- type = tok.getEventType();
}
if (depth == 0)
boundNode = null;
- if ((depth != targetDepth && depth != targetDepth+1) || Type.isAttribute(tok.getEventType()) || !CheckNodeType.checkNode(tok))
+ if ((depth != targetDepth && depth != targetDepth+1) || Type.isAttribute(curEventType) || !CheckNodeType.checkNode(tok))
continue;
- else if (type == Type.START_TAG)
+ else if (curEventType == Type.START_TAG)
match = true; // set match flag to true if there is nested content
// skip over the bound node's END token
- if (depth == 1 && type == Type.END_TAG && boundNode != null && boundNode.getName() != null && boundNode.getName().equals(tok.getName()))
+ if (depth == 1 && curEventType == Type.END_TAG && boundNode != null && boundNode.getName() != null && boundNode.getName().equals(tok.getName()))
continue;
break;
@@ -184,9 +183,8 @@
while (depth == 1) {
tok = getNext();
}
- type = tok.getEventType();
- if (depth != targetDepth || type != Type.START_TAG
+ if (depth != targetDepth || curEventType != Type.START_TAG
|| (!CheckNodeType.step_comparison(tok,step_uri,step_local)))
continue;
else {
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/CompareIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/CompareIterator.java 2012-03-02 10:01:31 UTC (rev 4532)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/CompareIterator.java 2012-03-12 06:39:25 UTC (rev 4533)
@@ -31,6 +31,7 @@
import ch.ethz.mxquery.exceptions.StaticException;
import ch.ethz.mxquery.exceptions.TypeException;
import ch.ethz.mxquery.model.Constants;
+import ch.ethz.mxquery.model.DataflowAnalysis;
import ch.ethz.mxquery.model.TokenBasedIterator;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.KXmlSerializer;
@@ -334,5 +335,11 @@
return new ObjectObjectPair(returned, used);
}
+ public XDMIterator require(int requiredOptions) throws MXQueryException {
+ if (compareType == Constants.COMP_NODE)
+ requiredOptions = requiredOptions | DataflowAnalysis.NODEID_ORDER;
+ return super.require(requiredOptions);
+ }
+
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/DocOrderIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/DocOrderIterator.java 2012-03-02 10:01:31 UTC (rev 4532)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/DocOrderIterator.java 2012-03-12 06:39:25 UTC (rev 4533)
@@ -29,7 +29,9 @@
import ch.ethz.mxquery.exceptions.ErrorCodes;
import ch.ethz.mxquery.exceptions.MXQueryException;
import ch.ethz.mxquery.exceptions.QueryLocation;
+import ch.ethz.mxquery.model.Constants;
import ch.ethz.mxquery.model.CurrentBasedIterator;
+import ch.ethz.mxquery.model.DataflowAnalysis;
import ch.ethz.mxquery.model.Window;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.QuickSort;
@@ -174,5 +176,8 @@
return new MXQueryDouble(0);
}
+ public XDMIterator require(int requiredOptions) throws MXQueryException {
+ return super.require(requiredOptions | DataflowAnalysis.NODEID_ORDER);
+ }
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/ExceptIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/ExceptIterator.java 2012-03-02 10:01:31 UTC (rev 4532)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/ExceptIterator.java 2012-03-12 06:39:25 UTC (rev 4533)
@@ -27,6 +27,7 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.TypeException;
import ch.ethz.mxquery.model.CurrentBasedIterator;
+import ch.ethz.mxquery.model.DataflowAnalysis;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.Set;
@@ -158,4 +159,10 @@
protected XDMIterator copy(Context context, XDMIterator[] subIters, Vector nestedPredCtxStack) throws MXQueryException {
return new ExceptIterator(context, subIters[0], subIters[1], loc);
}
+
+ public XDMIterator require(int requiredOptions) throws MXQueryException {
+ return super.require(requiredOptions | DataflowAnalysis.NODEID_ORDER);
+ }
+
+
}
\ No newline at end of file
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/IntersectIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/IntersectIterator.java 2012-03-02 10:01:31 UTC (rev 4532)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/IntersectIterator.java 2012-03-12 06:39:25 UTC (rev 4533)
@@ -26,6 +26,7 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.TypeException;
import ch.ethz.mxquery.model.CurrentBasedIterator;
+import ch.ethz.mxquery.model.DataflowAnalysis;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.Set;
@@ -136,4 +137,9 @@
protected XDMIterator copy(Context context, XDMIterator[] subIters, Vector nestedPredCtxStack) throws MXQueryException {
return new IntersectIterator(context, subIters[0], subIters[1],loc);
}
+
+ public XDMIterator require(int requiredOptions) throws MXQueryException {
+ return super.require(requiredOptions | DataflowAnalysis.NODEID_ORDER);
+ }
+
}
\ No newline at end of file
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/UnionIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/UnionIterator.java 2012-03-02 10:01:31 UTC (rev 4532)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/UnionIterator.java 2012-03-12 06:39:25 UTC (rev 4533)
@@ -26,6 +26,7 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.TypeException;
import ch.ethz.mxquery.model.CurrentBasedIterator;
+import ch.ethz.mxquery.model.DataflowAnalysis;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.Set;
@@ -167,4 +168,9 @@
Vector nestedPredCtxStack) throws MXQueryException {
return new UnionIterator(context, subIters[0], subIters[1], loc);
}
+
+ public XDMIterator require(int requiredOptions) throws MXQueryException {
+ return super.require(requiredOptions | DataflowAnalysis.NODEID_ORDER);
+ }
+
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/model/CurrentBasedIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/model/CurrentBasedIterator.java 2012-03-02 10:01:31 UTC (rev 4532)
+++ trunk/MXQuery/src/ch/ethz/mxquery/model/CurrentBasedIterator.java 2012-03-12 06:39:25 UTC (rev 4533)
@@ -25,7 +25,7 @@
public abstract class CurrentBasedIterator extends Iterator {
protected XDMIterator current = null;
-
+ protected int curEventType = Type.END_SEQUENCE;
public CurrentBasedIterator(){
this(null, null, null);
}
@@ -45,10 +45,10 @@
protected TokenInterface getNext() throws MXQueryException {
TokenInterface tok = current.next();
- int i = tok.getEventType();
- if (i == Type.START_TAG || i == Type.START_DOCUMENT) {
+ curEventType = tok.getEventType();
+ if (curEventType == Type.START_TAG || curEventType == Type.START_DOCUMENT) {
depth++;
- } else if (i == Type.END_TAG || i == Type.END_DOCUMENT) {
+ } else if (curEventType == Type.END_TAG || curEventType == Type.END_DOCUMENT) {
depth--;
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/query/parser/Parser.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/query/parser/Parser.java 2012-03-02 10:01:31 UTC (rev 4532)
+++ trunk/MXQuery/src/ch/ethz/mxquery/query/parser/Parser.java 2012-03-12 06:39:25 UTC (rev 4533)
@@ -371,8 +371,8 @@
CompilerOptions co, Hashtable options, String locationInfo,
Object queryVersion) throws MXQueryException {
long parseTime = 0;
- if (logger.isLoggable(LogLevel.INFO)) {
- logger.log(LogLevel.INFO,"Parsing started");
+ if (logger.isLoggable(LogLevel.FINE)) {
+ logger.log(LogLevel.FINE,"Parsing started");
parseTime = System.currentTimeMillis();
}
this.query = query;
@@ -392,9 +392,9 @@
}
Iterator result = Module();
- if (logger.isLoggable(LogLevel.INFO)) {
+ if (logger.isLoggable(LogLevel.FINE)) {
long parseDuration = System.currentTimeMillis() - parseTime;
- logger.log(LogLevel.INFO,"Parsing completed, took "+parseDuration+ " ms");
+ logger.log(LogLevel.FINE,"Parsing completed, took "+parseDuration+ " ms");
}
if (result != null) {
if (index < queryLen) {
@@ -1748,7 +1748,7 @@
}
getCurrentContext().addFunction(fn);
- logger.log(LogLevel.INFO, "Completed parsing function "+qname.toString()+ " took "+(System.currentTimeMillis()-startTime));
+ logger.log(LogLevel.FINE, "Completed parsing function "+qname.toString()+ " took "+(System.currentTimeMillis()-startTime));
return true;
} else
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pm_...@us...> - 2012-03-12 13:50:46
|
Revision: 4536
http://mxquery.svn.sourceforge.net/mxquery/?rev=4536&view=rev
Author: pm_fischer
Date: 2012-03-12 13:50:36 +0000 (Mon, 12 Mar 2012)
Log Message:
-----------
-Dataflow analysis - node IDs for collection, document-uri()
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Collection.java
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/DocumentUri.java
trunk/MXQuery/src/ch/ethz/mxquery/update/store/llImpl/LLStoreSet.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMInputFactory.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/XDMImportAdapter.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java 2012-03-12 08:47:44 UTC (rev 4535)
+++ trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java 2012-03-12 13:50:36 UTC (rev 4536)
@@ -186,7 +186,7 @@
public static final int NONVALIDATED_INPUT_MODE_DOM = 3;
public static final int NONVALIDATED_INPUT_MODE_SAX_TIDY = 4;
public static final int NONVALIDATED_INPUT_MODE_STAX_PROJECTION = 5;
- //public static final int NONVALIDATED_INPUT_MODE_STAX_DUMMY = 6;
+ public static final int NONVALIDATED_INPUT_MODE_STAX_DUMMY = 6;
public static final int NO_VALIDATION = 0;
public static final int IGNORE_DTD = 1;
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Collection.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Collection.java 2012-03-12 08:47:44 UTC (rev 4535)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Collection.java 2012-03-12 13:50:36 UTC (rev 4536)
@@ -26,15 +26,17 @@
import ch.ethz.mxquery.exceptions.ErrorCodes;
import ch.ethz.mxquery.exceptions.MXQueryException;
import ch.ethz.mxquery.model.CurrentBasedIterator;
+import ch.ethz.mxquery.model.DataflowAnalysis;
import ch.ethz.mxquery.model.XDMIterator;
public class Collection extends CurrentBasedIterator {
protected XDMIterator copy(Context context, XDMIterator[] subIters, Vector nestedPredCtxStack)
throws MXQueryException {
- XDMIterator copy = new Collection();
+ Collection copy = new Collection();
copy.setContext(context, true);
copy.setSubIters(subIters);
+ copy.requiredAccess = requiredAccess;
return copy;
}
private int index = -1;
@@ -50,6 +52,8 @@
defaultCollection = true;
else {
XDMIterator it = subIters[0];
+ if ((requiredAccess & DataflowAnalysis.NODEID_ORDER)!=0)
+ it = it.require(DataflowAnalysis.NODEID_ORDER);
tok = it.next();
}
if (defaultCollection || tok == Token.END_SEQUENCE_TOKEN ) {
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/DocumentUri.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/DocumentUri.java 2012-03-12 08:47:44 UTC (rev 4535)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/DocumentUri.java 2012-03-12 13:50:36 UTC (rev 4536)
@@ -25,6 +25,7 @@
import ch.ethz.mxquery.datamodel.xdm.Token;
import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
import ch.ethz.mxquery.exceptions.MXQueryException;
+import ch.ethz.mxquery.model.DataflowAnalysis;
import ch.ethz.mxquery.model.TokenBasedIterator;
import ch.ethz.mxquery.model.XDMIterator;
@@ -59,5 +60,9 @@
public TypeInfo getStaticType() {
return new TypeInfo(Type.ANY_URI,Type.OCCURRENCE_IND_ZERO_OR_ONE);
}
-
+
+ public XDMIterator require(int requiredOptions) throws MXQueryException {
+ // Could relax to any NODE_*
+ return super.require(requiredOptions | DataflowAnalysis.NODEID_ORDER);
+ }
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/update/store/llImpl/LLStoreSet.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/update/store/llImpl/LLStoreSet.java 2012-03-12 08:47:44 UTC (rev 4535)
+++ trunk/MXQuery/src/ch/ethz/mxquery/update/store/llImpl/LLStoreSet.java 2012-03-12 13:50:36 UTC (rev 4536)
@@ -144,6 +144,10 @@
this.stores.put(uri, ftBuf);
return ftBuf;
}
+
+ if ((requiredStorageOptions & DataflowAnalysis.NODEID_ORDER) != 0)
+ initialDataIterator = initialDataIterator.require(DataflowAnalysis.NODEID_ORDER);
+
// Streaming Store
WindowBuffer strBuf = new WindowBuffer(initialDataIterator,false, 0,10000,false);
this.stores.put(uri, strBuf);
Modified: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMInputFactory.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMInputFactory.java 2012-03-12 08:47:44 UTC (rev 4535)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMInputFactory.java 2012-03-12 13:50:36 UTC (rev 4536)
@@ -46,6 +46,7 @@
import ch.ethz.mxquery.xdmio.xmlAdapters.NonSchemaValidatingSaxImportAdapter;
import ch.ethz.mxquery.xdmio.xmlAdapters.NonValidatingDOMAdapter;
import ch.ethz.mxquery.xdmio.xmlAdapters.NonValidatingStaxAdapter;
+import ch.ethz.mxquery.xdmio.xmlAdapters.NonValidatingStaxAdapterDummy;
import ch.ethz.mxquery.xdmio.xmlAdapters.NonValidatingStaxAdapterProjection;
import ch.ethz.mxquery.xdmio.xmlAdapters.ValidatedSaxImportAdapter;
import ch.ethz.mxquery.xdmio.xmlAdapters.XPPImportAdapter;
@@ -183,9 +184,23 @@
XMLStreamReader reader = factory.createXMLStreamReader(new StreamSource(new File(uri)));
return new NonValidatingStaxAdapter(ctx,location,reader);
} catch (XMLStreamException e) {
- throw new MXQueryException(ErrorCodes.A0007_EC_IO,"I/O Error while parsing",location);
+ throw new MXQueryException(ErrorCodes.A0007_EC_IO,"I/O Error while parsing: "+e.toString(),location);
}
}
+ case Context.NONVALIDATED_INPUT_MODE_STAX_DUMMY: {
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+ if (valMode == Context.NO_VALIDATION || valMode == Context.IGNORE_DTD)
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.FALSE);
+ else
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.TRUE);
+ try {
+ XMLStreamReader reader = factory.createXMLStreamReader(new StreamSource(new File(uri)));
+ return new NonValidatingStaxAdapterDummy(ctx,location,reader);
+ } catch (XMLStreamException e) {
+ throw new MXQueryException(ErrorCodes.A0007_EC_IO,"I/O Error while parsing: "+e.toString(),location);
+ }
+ }
+
case Context.NONVALIDATED_INPUT_MODE_STAX_PROJECTION: {
XMLInputFactory factory = XMLInputFactory.newInstance();
if (valMode == Context.NO_VALIDATION || valMode == Context.IGNORE_DTD)
Modified: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/XDMImportAdapter.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/XDMImportAdapter.java 2012-03-12 08:47:44 UTC (rev 4535)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/XDMImportAdapter.java 2012-03-12 13:50:36 UTC (rev 4536)
@@ -312,7 +312,7 @@
public XDMIterator require(int requiredOptions) throws MXQueryException {
if ((requiredOptions & DataflowAnalysis.NODEID_ORDER) != 0)
generateNodeIds = true;
- return super.require(requiredOptions);
+ return this;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pm_...@us...> - 2012-03-12 15:50:10
|
Revision: 4539
http://mxquery.svn.sourceforge.net/mxquery/?rev=4539&view=rev
Author: pm_fischer
Date: 2012-03-12 15:50:03 +0000 (Mon, 12 Mar 2012)
Log Message:
-----------
- optimizations to avoid allocating buffers when not needed (e.g.,single
let without reuse)
- more aggressive window re-use
- fix on collection problems
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Collection.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/GFLWORIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/LetIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/VariableIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/model/VariableHolder.java
trunk/MXQuery/src/ch/ethz/mxquery/query/parser/Parser.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Collection.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Collection.java 2012-03-12 14:44:11 UTC (rev 4538)
+++ trunk/MXQuery/src/ch/ethz/mxquery/functions/fn/Collection.java 2012-03-12 15:50:03 UTC (rev 4539)
@@ -52,8 +52,8 @@
defaultCollection = true;
else {
XDMIterator it = subIters[0];
- if ((requiredAccess & DataflowAnalysis.NODEID_ORDER)!=0)
- it = it.require(DataflowAnalysis.NODEID_ORDER);
+// if ((requiredAccess & DataflowAnalysis.NODEID_ORDER)!=0)
+// it = it.require(DataflowAnalysis.NODEID_ORDER);
tok = it.next();
}
if (defaultCollection || tok == Token.END_SEQUENCE_TOKEN ) {
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/GFLWORIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/GFLWORIterator.java 2012-03-12 14:44:11 UTC (rev 4538)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/GFLWORIterator.java 2012-03-12 15:50:03 UTC (rev 4539)
@@ -116,7 +116,13 @@
TokenInterface tok;
if (!init) {
init = true;
- returnExpr.setResettable(true);
+ // If we have a for or a for window, the return clause may have to be executed more than once
+ boolean retneedsReset = false;
+ for (int i=0;i<subIters.length;i++)
+ if (subIters[i] instanceof ForIterator || subIters[i] instanceof ForseqIterator)
+ retneedsReset = true;
+ if (retneedsReset)
+ returnExpr.setResettable(true);
super.current = returnExpr;
setupBlockingIterators();
if (!doNextBinding(posOfFirstBlockingIter)) {
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/LetIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/LetIterator.java 2012-03-12 14:44:11 UTC (rev 4538)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/LetIterator.java 2012-03-12 15:50:03 UTC (rev 4539)
@@ -80,6 +80,7 @@
}
if(needMat){
this.current = WindowFactory.getNewWindow(context, subIters[0]);
+ current.setResettable(true);
}else{
this.current = subIters[0];
current.setResettable(true);
@@ -161,6 +162,7 @@
lt.exprCategory = this.exprCategory;
lt.isScoring = isScoring;
lt.resettable = resettable;
+ lt.needMat = needMat;
return lt;
}
@@ -171,6 +173,7 @@
varHolder = context.getVariable(variable);
int reqOptions = varHolder.getRequiredOptions()|requiredOptions;
subIters[0] = subIters[0].require(reqOptions);
+ needMat = varHolder.needsMaterialization();
}
return this;
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/VariableIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/VariableIterator.java 2012-03-12 14:44:11 UTC (rev 4538)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/VariableIterator.java 2012-03-12 15:50:03 UTC (rev 4539)
@@ -35,6 +35,7 @@
import ch.ethz.mxquery.model.Window;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.util.KXmlSerializer;
+import ch.ethz.mxquery.util.LogLevel;
import ch.ethz.mxquery.util.ObjectObjectPair;
/**
@@ -129,7 +130,10 @@
windowSchemaId = window.getWindowId();
Window wnd = window;
window = window.getNewWindow(1, Window.END_OF_STREAM_POSITION);
- window.setResettable(resettable);
+ if (valueHolder.needsMaterialization() && window.getWindowId() == windowSchemaId)
+ window.setResettable(true); // if may need to reuse the original window, we should reset it
+ else
+ window.setResettable(resettable);
window.setContext(wnd.getContext(), false);
current = window;
} else {
@@ -146,8 +150,11 @@
}
if (current instanceof Window)
return (Window)current;
- else
- throw new MXQueryException(ErrorCodes.A0009_EC_EVALUATION_NOT_POSSIBLE, "Window of a variable requested, got normal iterator", loc);
+ else {
+ logger.log(LogLevel.FINE, "Variable without underlying window requested");
+ return null;
+ }
+ //throw new MXQueryException(ErrorCodes.A0009_EC_EVALUATION_NOT_POSSIBLE, "Window of a variable requested, got normal iterator", loc);
}
protected final void resetImpl() throws MXQueryException {
@@ -161,18 +168,21 @@
super.freeResources(restartable);
// FIXME causes errors if the windows is used somewhere else
- try{
//currentToken = Token.START_SEQUENCE_TOKEN;
if (window != null ){
if(windowSchemaId != window.getWindowId()){
window.destroyWindow();
+ } else {
+ window.setWindowInUse(false);
+ if (window.isResettable())
+ window.reset();
}
window = null;
}
window = null;
- }catch(Exception err){
- throw new RuntimeException(err.toString());
- }
+// }catch(Exception err){
+// throw new RuntimeException(err.toString());
+// }
if (valueHolder != null && valueHolder.getIter() != null && !restartable && !valueHolder.isAssignable()) {
valueHolder.getIter().close(restartable);
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/model/VariableHolder.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/model/VariableHolder.java 2012-03-12 14:44:11 UTC (rev 4538)
+++ trunk/MXQuery/src/ch/ethz/mxquery/model/VariableHolder.java 2012-03-12 15:50:03 UTC (rev 4539)
@@ -193,7 +193,7 @@
* @return true if materialization is needed
*/
public boolean needsMaterialization(){
- if(useCounter > 0 || resetable){
+ if(useCounter > 1 || resetable){
return true;
}else{
return false;
Modified: trunk/MXQuery/src/ch/ethz/mxquery/query/parser/Parser.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/query/parser/Parser.java 2012-03-12 14:44:11 UTC (rev 4538)
+++ trunk/MXQuery/src/ch/ethz/mxquery/query/parser/Parser.java 2012-03-12 15:50:03 UTC (rev 4539)
@@ -5518,6 +5518,7 @@
((XDMIterator) o).setSubIters(new VariableIterator(predCtx,
letLast, false, predicate.getLoc()));
predCtx.incVariableUse(letLast);
+ predCtx.incVariableUse(var1);
}
}
// FIXME:For variables, additive and multiplicative iterators, a numeric
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|