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