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 {
  
  
  

Reply via email to