|
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.
|