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 {