gianugo 2003/05/05 09:18:23
Modified: java/src/org/apache/xindice/core/query
XPathQueryResolver.java
Log:
Fix union operator in XPath queries to avoi a full collection scan and work
on indexes instead where available. Patch submitted by Terry Rosenbaum
([EMAIL PROTECTED]).
Revision Changes Path
1.12 +27 -2
xml-xindice/java/src/org/apache/xindice/core/query/XPathQueryResolver.java
Index: XPathQueryResolver.java
===================================================================
RCS file:
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/query/XPathQueryResolver.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- XPathQueryResolver.java 11 Apr 2003 12:29:37 -0000 1.11
+++ XPathQueryResolver.java 5 May 2003 16:18:22 -0000 1.12
@@ -365,7 +365,7 @@
return evalUnaryOperation(op, owner, pos);
case OpCodes.OP_UNION:
- break;
+ return evalUnion(owner, pos);
case OpCodes.OP_VARIABLE:
break;
@@ -460,6 +460,31 @@
lp = cmp.getNextOpPos(lp);
}
return new NamedKeys(name, attr, andKeys(ks));
+ }
+
+ private Object evalUnion(String owner, int pos) throws Exception {
+ int l = Compiler.getFirstChildPos(pos);
+ int r = cmp.getNextOpPos(l);
+ Object left = evaluate(owner, l);
+
+ if ( left instanceof NamedKeys &&
+ ((NamedKeys)left).keys != null)
+ {
+ Object right = evaluate(owner, r);
+
+
+
+ if ( right instanceof NamedKeys &&
+ ((NamedKeys)right).keys != null)
+ {
+ Key[][] keys = new Key[][] { ((NamedKeys)left).keys,
((NamedKeys)right).keys };
+ return new NamedKeys(null, false,
QueryEngine.orKeySets(keys));
+ }
+ }
+ // no index query of left part of union
+ // or no index query of right part of union => must do
+ /// collection scan
+ return null;
}
private Object evalSetComparison(int op, String owner, int pos) throws
Exception {