You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jb...@apache.org on 2014/05/27 16:09:55 UTC

svn commit: r1597796 - in /lucene/dev/branches/branch_4x: ./ solr/ solr/core/ solr/core/src/java/org/apache/solr/handler/component/ solr/core/src/java/org/apache/solr/search/ solr/core/src/test/org/apache/solr/search/ solr/solrj/ solr/solrj/src/java/or...

Author: jbernste
Date: Tue May 27 14:09:54 2014
New Revision: 1597796

URL: http://svn.apache.org/r1597796
Log:
SOLR-5973: Pluggable Ranking Collectors and Merge Strategies

Modified:
    lucene/dev/branches/branch_4x/   (props changed)
    lucene/dev/branches/branch_4x/solr/   (props changed)
    lucene/dev/branches/branch_4x/solr/core/   (props changed)
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/MergeStrategy.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/RankQuery.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/MergeStrategyTest.java
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/RankQueryTest.java
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java
    lucene/dev/branches/branch_4x/solr/solrj/   (props changed)
    lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/MergeStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/MergeStrategy.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/MergeStrategy.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/MergeStrategy.java Tue May 27 14:09:54 2014
@@ -23,8 +23,10 @@ import java.util.Comparator;
 import java.io.IOException;
 
 /**
- * The MergeStrategy class defines custom merge logic for distributed searches.
- **/
+* The MergeStrategy class defines custom merge logic for distributed searches.
+*
+*  <b>Note: This API is experimental and may change in non backward-compatible ways in the future</b>
+**/
 
 
 public interface MergeStrategy {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java Tue May 27 14:09:54 2014
@@ -151,17 +151,28 @@ public class QueryComponent extends Sear
         q = new BooleanQuery();        
       }
 
-      if(q instanceof RankQuery) {
-        MergeStrategy mergeStrategy = ((RankQuery)q).getMergeStrategy();
-        if(mergeStrategy != null) {
-          rb.addMergeStrategy(mergeStrategy);
-          if(mergeStrategy.handlesMergeFields()) {
-            rb.mergeFieldHandler = mergeStrategy;
+      rb.setQuery( q );
+
+
+      String rankQueryString = rb.req.getParams().get(CommonParams.RQ);
+      if(rankQueryString != null) {
+        QParser rqparser = QParser.getParser(rankQueryString, defType, req);
+        Query rq = rqparser.getQuery();
+        if(rq instanceof RankQuery) {
+          RankQuery rankQuery = (RankQuery)rq;
+          rb.setQuery(rankQuery.wrap(q)); //Wrap the RankQuery around the main query.
+          MergeStrategy mergeStrategy = rankQuery.getMergeStrategy();
+          if(mergeStrategy != null) {
+            rb.addMergeStrategy(mergeStrategy);
+            if(mergeStrategy.handlesMergeFields()) {
+              rb.mergeFieldHandler = mergeStrategy;
+            }
           }
+        } else {
+          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,"rq parameter must be a RankQuery");
         }
       }
 
-      rb.setQuery( q );
       rb.setSortSpec( parser.getSort(true) );
       rb.setQparser(parser);
       

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/RankQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/RankQuery.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/RankQuery.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/RankQuery.java Tue May 27 14:09:54 2014
@@ -17,13 +17,21 @@
 
 package org.apache.solr.search;
 
+import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.TopDocsCollector;
 import org.apache.lucene.search.Query;
 import org.apache.solr.handler.component.MergeStrategy;
 
+import java.io.IOException;
+
+/**
+ *  <b>Note: This API is experimental and may change in non backward-compatible ways in the future</b>
+ **/
+
 public abstract class RankQuery extends Query {
 
-  public abstract TopDocsCollector getTopDocsCollector(int len, SolrIndexSearcher.QueryCommand cmd);
+  public abstract TopDocsCollector getTopDocsCollector(int len, SolrIndexSearcher.QueryCommand cmd, IndexSearcher searcher) throws IOException;
   public abstract MergeStrategy getMergeStrategy();
+  public abstract RankQuery wrap(Query mainQuery);
 
 }
\ No newline at end of file

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java Tue May 27 14:09:54 2014
@@ -1482,7 +1482,7 @@ public class SolrIndexSearcher extends I
     Query q = cmd.getQuery();
     if(q instanceof RankQuery) {
       RankQuery rq = (RankQuery)q;
-      return rq.getTopDocsCollector(len, cmd);
+      return rq.getTopDocsCollector(len, cmd, this);
     }
 
     if (null == cmd.getSort()) {

Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/MergeStrategyTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/MergeStrategyTest.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/MergeStrategyTest.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/MergeStrategyTest.java Tue May 27 14:09:54 2014
@@ -80,18 +80,18 @@ public class MergeStrategyTest extends B
     handle.put("_version_", SKIP);
 
     //Test mergeStrategy that uses score
-    query("q", "{!rank q=$qq}", "qq", "*:*", "rows","12",  "sort",  "sort_i asc", "fl","*,score");
+    query("rq", "{!rank}", "q", "*:*", "rows","12",  "sort",  "sort_i asc", "fl","*,score");
 
     //Test without mergeStrategy
     query("q", "*:*", "rows","12", "sort", "sort_i asc");
 
     //Test mergeStrategy1 that uses a sort field.
-    query("q", "{!rank mergeStrategy=1 q=$qq}", "qq", "*:*", "rows","12", "sort", "sort_i asc");
+    query("rq", "{!rank mergeStrategy=1}", "q", "*:*", "rows","12", "sort", "sort_i asc");
 
     ModifiableSolrParams params = new ModifiableSolrParams();
-    params.add("qq", "*:*");
+    params.add("q", "*:*");
     params.add("rows", "12");
-    params.add("q", "{!rank q=$qq}");
+    params.add("rq", "{!rank}");
     params.add("sort", "sort_i asc");
     params.add("fl","*,score");
     setDistributedParams(params);

Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/RankQueryTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/RankQueryTest.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/RankQueryTest.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/RankQueryTest.java Tue May 27 14:09:54 2014
@@ -70,8 +70,8 @@ public class RankQueryTest extends SolrT
 
     ModifiableSolrParams params = new ModifiableSolrParams();
 
-    params.add("qq", "*:*");
-    params.add("q", "{!rank q=$qq}");
+    params.add("q", "*:*");
+    params.add("rq", "{!rank}");
     params.add("sort","sort_i asc");
 
     assertQ(req(params), "*[count(//doc)=6]",
@@ -84,9 +84,9 @@ public class RankQueryTest extends SolrT
     );
 
     params = new ModifiableSolrParams();
-    params.add("qq", "{!edismax bf=$bff}*:*");
+    params.add("q", "{!edismax bf=$bff}*:*");
     params.add("bff", "field(sort_i)");
-    params.add("q", "{!rank q=$qq collector=1}");
+    params.add("rq", "{!rank collector=1}");
 
     assertQ(req(params), "*[count(//doc)=6]",
         "//result/doc[6]/str[@name='id'][.='4']",

Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java Tue May 27 14:09:54 2014
@@ -84,12 +84,10 @@ public class TestRankQueryPlugin extends
     }
 
     public Query parse() throws SyntaxError {
-      String qs = localParams.get("q");
-      QParser parser = QParser.getParser(qs, null, req);
-      Query q = parser.getQuery();
+
       int mergeStrategy = localParams.getInt("mergeStrategy", 0);
       int collector = localParams.getInt("collector", 0);
-      return new TestRankQuery(collector, mergeStrategy, q);
+      return new TestRankQuery(collector, mergeStrategy);
     }
   }
 
@@ -133,13 +131,17 @@ public class TestRankQueryPlugin extends
       return q.toString(field);
     }
 
-    public TestRankQuery(int collector, int mergeStrategy, Query q) {
+    public RankQuery wrap(Query q) {
       this.q = q;
+      return this;
+    }
+
+    public TestRankQuery(int collector, int mergeStrategy) {
       this.collector = collector;
       this.mergeStrategy = mergeStrategy;
     }
 
-    public TopDocsCollector getTopDocsCollector(int len, SolrIndexSearcher.QueryCommand cmd) {
+    public TopDocsCollector getTopDocsCollector(int len, SolrIndexSearcher.QueryCommand cmd, IndexSearcher searcher) {
       if(collector == 0)
         return new TestCollector(null);
       else

Modified: lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java (original)
+++ lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java Tue May 27 14:09:54 2014
@@ -47,6 +47,9 @@ public interface CommonParams {
   
   /** query string */
   public static final String Q ="q";
+
+  /** rank query */
+  public static final String RQ ="rq";
   
   /** distrib string */
   public static final String DISTRIB = "distrib";