luetzkendorf    2004/11/29 10:39:38

  Modified:    src/stores/org/apache/slide/index/lucene
                        LuceneExpressionFactory.java
               src/stores/org/apache/slide/index/lucene/expressions
                        MergeExpression.java
  Added:       src/stores/org/apache/slide/index/lucene/expressions
                        MergeExpressionMixed.java
  Log:
  better support for AND expressions that contain fast lucene expressions
  and slow basic expressions
  
  Revision  Changes    Path
  1.6       +19 -25    
jakarta-slide/src/stores/org/apache/slide/index/lucene/LuceneExpressionFactory.java
  
  Index: LuceneExpressionFactory.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/src/stores/org/apache/slide/index/lucene/LuceneExpressionFactory.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- LuceneExpressionFactory.java      8 Nov 2004 09:45:57 -0000       1.5
  +++ LuceneExpressionFactory.java      29 Nov 2004 18:39:37 -0000      1.6
  @@ -28,7 +28,7 @@
   import java.util.List;
   
   import org.apache.slide.content.NodeProperty;
  -import org.apache.slide.index.lucene.expressions.AbstractExpression;
  +import org.apache.slide.index.lucene.expressions.AbstractLuceneExpression;
   import org.apache.slide.index.lucene.expressions.BetweenExpression;
   import org.apache.slide.index.lucene.expressions.ContainsExpression;
   import org.apache.slide.index.lucene.expressions.EqExpression;
  @@ -39,12 +39,12 @@
   import org.apache.slide.index.lucene.expressions.LikeExpression;
   import org.apache.slide.index.lucene.expressions.LtExpression;
   import org.apache.slide.index.lucene.expressions.MergeExpression;
  +import org.apache.slide.index.lucene.expressions.MergeExpressionMixed;
   import org.apache.slide.index.lucene.expressions.PropcontainsExpression;
   import org.apache.slide.index.lucene.expressions.PropertyContainsExpression;
   import org.apache.slide.search.BadQueryException;
   import org.apache.slide.search.PropertyProvider;
   import org.apache.slide.search.basic.BasicExpressionFactory;
  -import org.apache.slide.search.basic.ComparableResourcesPool;
   import org.apache.slide.search.basic.IBasicExpression;
   import org.apache.slide.search.basic.IBasicQuery;
   import org.apache.slide.search.basic.Literals;
  @@ -77,7 +77,7 @@
           List basicExpressions = new ArrayList(expressionsToMerge.size());
           for(Iterator i = expressionsToMerge.iterator(); i.hasNext();) {
               Object o = i.next();
  -            if (o instanceof AbstractExpression) {
  +            if (o instanceof AbstractLuceneExpression) {
                   luceneExpressions.add(o);
               } else {
                   basicExpressions.add(o);
  @@ -103,15 +103,16 @@
               } 
               else if (mergeOperator.equals(Literals.AND)) {
                   if (basicExpressions.size() > 0 && luceneExpressions.size() 
> 0) {
  -                    // a mixture
  -                    // TODO this could be optimized
  -                    IBasicExpression e1 = new MergeExpression(this.index, 
true, luceneExpressions);
  -                    e1.setFactory(this);
  -                    basicExpressions.add(0, e1);
  -                    result =  super.createMergeExpression(Literals.AND, 
namespace, basicExpressions);
  +                    // a mixture between fast lucene expr. and slow basic 
expr.
  +                    AbstractLuceneExpression e = new 
MergeExpression(this.index, 
  +                            true, luceneExpressions);
  +                    e.setFactory(this);
  +                    result = new MergeExpressionMixed(this.index, e, 
  +                            basicExpressions);
                   } else if (luceneExpressions.size() > 0) {
                       // lucene expressions only
  -                    result = new MergeExpression(this.index, true, 
expressionsToMerge);
  +                    result = new MergeExpression(this.index, true, 
  +                            expressionsToMerge);
                   } else {
                       // basic expressions only
                       result = super.createMergeExpression(mergeOperator, 
  @@ -119,7 +120,8 @@
                   }
               }
               else {
  -                super.createMergeExpression(mergeOperator, namespace, 
expressionsToMerge);
  +                super.createMergeExpression(mergeOperator, namespace, 
  +                        expressionsToMerge);
               }
           }
           if (result != null) {
  @@ -175,7 +177,7 @@
   
           // the following expressions all are property related and
           // must have a <DAV:prop> element
  -        Element property = AbstractExpression.getPropertyElement(e);
  +        Element property = AbstractLuceneExpression.getPropertyElement(e);
           String namespace = property.getNamespaceURI();
           String name = property.getName();
           IndexConfiguration configuration = index.getConfiguration();
  @@ -248,7 +250,7 @@
               return new IsPrincipalExpression(this.index, true);
           }
           
  -        Element property = AbstractExpression.getPropertyElement(e);
  +        Element property = AbstractLuceneExpression.getPropertyElement(e);
           String namespace = property.getNamespaceURI();
           String name = property.getName();
           IndexConfiguration configuration = index.getConfiguration();
  @@ -299,15 +301,7 @@
       public void init(IBasicQuery query, PropertyProvider propertyProvider)
           throws BadQueryException
       {
  -        this.query = (IBasicQuery) query;
  +        this.query = query;
           this.propertyProvider = propertyProvider;
  -    }
  -
  -
  -    protected ComparableResourcesPool getRequestedResourcePool()
  -            throws BadQueryException
  -    {
  -        // TODO Auto-generated method stub
  -        return super.getRequestedResourcePool();
       }
   }
  
  
  
  1.3       +6 -6      
jakarta-slide/src/stores/org/apache/slide/index/lucene/expressions/MergeExpression.java
  
  Index: MergeExpression.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/src/stores/org/apache/slide/index/lucene/expressions/MergeExpression.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- MergeExpression.java      25 Oct 2004 07:52:30 -0000      1.2
  +++ MergeExpression.java      29 Nov 2004 18:39:38 -0000      1.3
  @@ -34,14 +34,14 @@
   /**
    * Implements <code>and</code> and <code>or</code>.
    */
  -public class MergeExpression extends AbstractExpression
  +public class MergeExpression extends AbstractLuceneExpression
   {
       /**
        * Constructor.
        * @param index The index to be searched.
        * @param and <code>true</code> if AND or <code>false</code> if OR
        * @param expressions list of expressions (must all be derived from 
  -     *        [EMAIL PROTECTED] AbstractExpression}, i.e. must all be lucene 
executable)
  +     *        [EMAIL PROTECTED] AbstractLuceneExpression}, i.e. must all be 
lucene executable)
        */
       public MergeExpression(Index index, boolean and, Collection expressions)
       {
  @@ -51,7 +51,7 @@
           
           for(Iterator i = expressions.iterator(); i.hasNext();) {
               Object e = i.next();
  -            Query q = ((AbstractExpression)e).getQuery();
  +            Query q = ((AbstractLuceneExpression)e).getQuery();
               booleanQuery.add(q, and, false);
           }
           
  
  
  
  1.1                  
jakarta-slide/src/stores/org/apache/slide/index/lucene/expressions/MergeExpressionMixed.java
  
  Index: MergeExpressionMixed.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-slide/src/stores/org/apache/slide/index/lucene/expressions/MergeExpressionMixed.java,v
 1.1 2004/11/29 18:39:38 luetzkendorf Exp $
   * $Revision: 1.1 $
   * $Date: 2004/11/29 18:39:38 $
   *
   * ====================================================================
   *
   * Copyright 1999-2004 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   */
  package org.apache.slide.index.lucene.expressions;
  
  import java.util.Collection;
  import java.util.Iterator;
  import java.util.Set;
  
  import org.apache.slide.index.lucene.Index;
  import org.apache.slide.search.BadQueryException;
  import org.apache.slide.search.SearchException;
  import org.apache.slide.search.basic.ComparableResourcesPool;
  import org.apache.slide.search.basic.IBasicResultSet;
  import org.apache.slide.search.basic.expression.GenericBasicExpression;
  
  
  /**
   * Implements <code>and</code>.
   */
  public class MergeExpressionMixed extends AbstractLuceneExpression
  {
        private AbstractLuceneExpression expression;
        private Collection basicExpressions; 
      /**
       * Constructor.
       * @param index The index to be searched.
       * @param expressions list of expressions (must all be derived from 
       *        [EMAIL PROTECTED] AbstractLuceneExpression}, i.e. must all be 
lucene executable)
       */
      public MergeExpressionMixed(Index index, AbstractLuceneExpression 
expression, 
                Collection basicExpressions)
      {
          super(index);
          
          this.expression = expression;
          this.basicExpressions = basicExpressions;
          
      }
  
      public IBasicResultSet execute() throws SearchException {
                
        // 1st execute the lucene expression
        IBasicResultSet resultSet = this.expression.execute();
        
        // iterate over the basic expressions and execute them relative to 
        // the current result set
        for(Iterator i = this.basicExpressions.iterator(); i.hasNext();) {
                Object o = i.next();
                
                try {
                        GenericBasicExpression expression = 
(GenericBasicExpression)o;
                        
                        expression.setRequestedResourcePool(
                                        new 
ComparableResourcesPoolImpl(resultSet));
                        
                        resultSet = expression.execute();
                } catch(ClassCastException e) {
                        throw new SearchException("Unexpected query structure", 
e);
                }
        }
        
        return resultSet;
        }
      
      private static class ComparableResourcesPoolImpl 
                implements ComparableResourcesPool 
      {
        private IBasicResultSet resultSet;
        
        ComparableResourcesPoolImpl(IBasicResultSet resultSet) {
                this.resultSet = resultSet;
        }
                
                public Set getPool() throws BadQueryException {
                        return this.resultSet;
                }
                public boolean partialResult() {
                        return false;
                }
                public Iterator resourceIterator() throws BadQueryException {
                        return this.resultSet.iterator();
                }
      }
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to