[ 
http://issues.apache.org/jira/browse/LUCENE-330?page=comments#action_12368948 ] 

Erik Hatcher commented on LUCENE-330:
-------------------------------------

I manually applied that patch (prior to my first comment actually) as 
automatically applying didn't work.  I just committed another test to 
TestFilteredQuery, which fails with this patch with this error:

java.lang.IndexOutOfBoundsException: Not a valid hit number: 0
        at org.apache.lucene.search.Hits.hitDoc(Hits.java:134)
        at org.apache.lucene.search.Hits.id(Hits.java:116)
        at 
org.apache.lucene.search.TestFilteredQuery.testBoolean(TestFilteredQuery.java:139)

I'm fairly confident I applied the patch correctly, though I suppose its 
possible I missed something.  

Here's an inlined version of the diff I have locally of FilteredQuery:

$ svn diff FilteredQuery.java
Index: FilteredQuery.java
===================================================================
--- FilteredQuery.java  (revision 383339)
+++ FilteredQuery.java  (working copy)
@@ -34,6 +34,7 @@
  * <p>Created: Apr 20, 2004 8:58:29 AM
  *
  * @author  Tim Jones
+ * @author  Paul Elschot
  * @since   1.4
  * @version $Id$
  * @see     CachingWrapperFilter
@@ -75,22 +76,42 @@
       // return this query
       public Query getQuery() { return FilteredQuery.this; }
 
-      // return a scorer that overrides the enclosed query's score if
-      // the given hit has been filtered out.
-      public Scorer scorer (IndexReader indexReader) throws IOException {
+      // return a filtering scorer
+       public Scorer scorer (IndexReader indexReader) throws IOException {
         final Scorer scorer = weight.scorer (indexReader);
         final BitSet bitset = filter.bits (indexReader);
         return new Scorer (similarity) {
 
-          // pass these methods through to the enclosed scorer
-          public boolean next() throws IOException { return scorer.next(); }
+          public boolean next() throws IOException {
+            do {
+              if (! scorer.next()) {
+                return false;
+              }
+            } while (! bitset.get(scorer.doc()));
+            /* When skipTo() is allowed on scorer it should be used here
+             * in combination with bitset.nextSetBit(...)
+             * See the while loop in skipTo() below.
+             */
+            return true;
+          }
           public int doc() { return scorer.doc(); }
-          public boolean skipTo (int i) throws IOException { return 
scorer.skipTo(i); }
 
-          // if the document has been filtered out, set score to 0.0
-          public float score() throws IOException {
-            return (bitset.get(scorer.doc())) ? scorer.score() : 0.0f;
-          }
+          public boolean skipTo(int i) throws IOException {
+            if (! scorer.skipTo(i)) {
+              return false;
+            }
+            while (! bitset.get(scorer.doc())) {
+              int nextFiltered = bitset.nextSetBit(scorer.doc() + 1);
+              if (nextFiltered == -1) {
+                return false;
+              } else if (! scorer.skipTo(nextFiltered)) {
+                return false;
+              }
+            }
+            return true;
+           }
+          
+          public float score() throws IOException { return scorer.score(); }
 
           // add an explanation about whether the document was filtered
           public Explanation explain (int i) throws IOException {

What am I missing?

> [PATCH] Use filter bits for next() and skipTo() in FilteredQuery
> ----------------------------------------------------------------
>
>          Key: LUCENE-330
>          URL: http://issues.apache.org/jira/browse/LUCENE-330
>      Project: Lucene - Java
>         Type: Improvement
>   Components: Search
>     Versions: CVS Nightly - Specify date in submission
>  Environment: Operating System: other
> Platform: Other
>     Reporter: paul.elschot
>     Assignee: Lucene Developers
>     Priority: Minor
>  Attachments: FilteredQuery.java, FilteredQuery.java, FilteredQuery.java, 
> FilteredQuery.java, FilteredQueryPatch1.txt, IndexSearcherPatch2.txt, 
> SkipFilter.java, SkipFilter.java
>
> This improves performance of FilteredQuery by not calling score() 
> on documents that do not pass the filter. 
> This passes the current tests for FilteredQuery, but these tests 
> have not been adapted/extended.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


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

Reply via email to