You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2010/10/28 22:38:20 UTC

svn commit: r1028464 - in /lucene/dev/trunk/solr/src/java/org/apache/solr/search: Grouping.java SolrIndexSearcher.java function/DocValues.java function/OrdFieldSource.java function/ReverseOrdFieldSource.java

Author: yonik
Date: Thu Oct 28 20:38:19 2010
New Revision: 1028464

URL: http://svn.apache.org/viewvc?rev=1028464&view=rev
Log:
SOLR-2205: Search Grouping - test for doc competitiveness before looking up group

Modified:
    lucene/dev/trunk/solr/src/java/org/apache/solr/search/Grouping.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/search/SolrIndexSearcher.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/DocValues.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/OrdFieldSource.java
    lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/search/Grouping.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/search/Grouping.java?rev=1028464&r1=1028463&r2=1028464&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/search/Grouping.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/search/Grouping.java Thu Oct 28 20:38:19 2010
@@ -143,6 +143,7 @@ class TopGroupCollector extends GroupCol
   int spareSlot;
 
   int matches;
+  boolean groupsFull = false;
 
   public TopGroupCollector(ValueSource groupByVS, Map vsContext, Sort sort, int nGroups) throws IOException {
     this.vs = groupByVS;
@@ -173,6 +174,29 @@ class TopGroupCollector extends GroupCol
   @Override
   public void collect(int doc) throws IOException {
     matches++;
+
+    // Doing this before ValueFiller and HashMap are executed
+    // This allows us to exit this method asap when a doc is not competitive
+    // As it turns out this happens most of the times.
+    if (groupsFull) {
+      for (int i = 0;; i++) {
+        final int c = reversed[i] * comparators[i].compareBottom(doc);
+        if (c < 0) {
+          // Definitely not competitive. So don't even bother to continue
+          return;
+        } else if (c > 0) {
+          // Definitely competitive.
+          break;
+        } else if (i == comparators.length - 1) {
+          // Here c=0. If we're at the last comparator, this doc is not
+          // competitive, since docs are visited in doc Id order, which means
+          // this doc cannot compete with any other document in the queue.
+          return;
+        }
+      }
+    }
+
+    // These next two statements are expensive
     filler.fillValue(doc);
     SearchGroup group = groupMap.get(mval);
     if (group == null) {
@@ -191,6 +215,7 @@ class TopGroupCollector extends GroupCol
       }
 
       if (orderedGroups == null) {
+        groupsFull = true;
         buildSet();
       }
 

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/search/SolrIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/search/SolrIndexSearcher.java?rev=1028464&r1=1028463&r2=1028464&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/search/SolrIndexSearcher.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/search/SolrIndexSearcher.java Thu Oct 28 20:38:19 2010
@@ -17,32 +17,33 @@
 
 package org.apache.solr.search;
 
-import org.apache.lucene.document.*;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.FieldSelector;
+import org.apache.lucene.document.FieldSelectorResult;
 import org.apache.lucene.index.*;
 import org.apache.lucene.search.*;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.BytesRef;
+import org.apache.lucene.util.OpenBitSet;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.core.SolrConfig;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrInfoMBean;
+import org.apache.solr.request.UnInvertedField;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
-import org.apache.solr.request.UnInvertedField;
-import org.apache.lucene.util.OpenBitSet;
+import org.apache.solr.search.function.ValueSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.net.URL;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.apache.solr.search.function.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 
 /**
  * SolrIndexSearcher adds schema awareness and caching functionality

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/DocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/DocValues.java?rev=1028464&r1=1028463&r2=1028464&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/DocValues.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/DocValues.java Thu Oct 28 20:38:19 2010
@@ -46,6 +46,18 @@ public abstract class DocValues {
   public double doubleVal(int doc) { throw new UnsupportedOperationException(); }
   // TODO: should we make a termVal, returns BytesRef?
   public String strVal(int doc) { throw new UnsupportedOperationException(); }
+
+  /**
+   * @param doc The doc to retrieve to sort ordinal for
+   * @return the sort ordinal for the specified doc
+   * TODO: Maybe we can just use intVal for this...
+   */
+  public int ordVal(int doc) { throw new UnsupportedOperationException(); }
+
+  /**
+   * @return the number of unique sort ordinals this instance has
+   */
+  public int numOrd() { throw new UnsupportedOperationException(); }
   public abstract String toString(int doc);
 
   /** @lucene.experimental  */

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/OrdFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/OrdFieldSource.java?rev=1028464&r1=1028463&r2=1028464&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/OrdFieldSource.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/OrdFieldSource.java Thu Oct 28 20:38:19 2010
@@ -74,6 +74,14 @@ public class OrdFieldSource extends Valu
         return (double)termsIndex.getOrd(doc);
       }
 
+      public int ordVal(int doc) {
+        return termsIndex.getOrd(doc);
+      }
+
+      public int numOrd() {
+        return termsIndex.numOrd();
+      }
+
       public String strVal(int doc) {
         // the string value of the ordinal, not the string itself
         return Integer.toString(termsIndex.getOrd(doc));

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java?rev=1028464&r1=1028463&r2=1028464&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java Thu Oct 28 20:38:19 2010
@@ -73,6 +73,14 @@ public class ReverseOrdFieldSource exten
         return (long)(end - sindex.getOrd(doc));
       }
 
+      public int ordVal(int doc) {
+        return (end - sindex.getOrd(doc));
+      }
+
+      public int numOrd() {
+        return end;
+      }
+
       public double doubleVal(int doc) {
         return (double)(end - sindex.getOrd(doc));
       }