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 2016/11/05 19:30:01 UTC

lucene-solr:branch_6x: SOLR-9682: add param query type to facet filter

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_6x 9a8030171 -> b157e43b9


SOLR-9682: add param query type to facet filter


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/b157e43b
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/b157e43b
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/b157e43b

Branch: refs/heads/branch_6x
Commit: b157e43b9a2afc7724c343c8ea8fff62b606cbf9
Parents: 9a80301
Author: yonik <yo...@apache.org>
Authored: Sat Nov 5 15:24:57 2016 -0400
Committer: yonik <yo...@apache.org>
Committed: Sat Nov 5 15:29:40 2016 -0400

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  5 ++-
 .../solr/search/facet/FacetProcessor.java       | 44 ++++++++++++++++++--
 .../solr/search/facet/TestJsonFacets.java       | 38 +++++++++++++----
 3 files changed, 75 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b157e43b/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 3047aad..b9a52be 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -43,7 +43,10 @@ New Features
   (Jonny Marks, Christine Poerschke)
 
 * SOLR-9055: Make collection backup/restore extensible. (Hrishikesh Gadre, Varun Thacker, Mark Miller)
-  
+
+* SOLR-9682: JSON Facet API: added "param" query type to facet domain filter specification to obtain
+  filters via query parameters. (yonik)
+
 Optimizations
 ----------------------
 * SOLR-9704: Facet Module / JSON Facet API: Optimize blockChildren facets that have

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b157e43b/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java b/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java
index c1d2882..3a26e5b 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java
@@ -94,20 +94,58 @@ public abstract class FacetProcessor<FacetRequestT extends FacetRequest>  {
     List<Query> qlist = new ArrayList<>(freq.domain.filters.size());
     // TODO: prevent parsing filters each time!
     for (Object rawFilter : freq.domain.filters) {
-      Query symbolicFilter;
       if (rawFilter instanceof String) {
         QParser parser = null;
         try {
           parser = QParser.getParser((String)rawFilter, fcontext.req);
-          symbolicFilter = parser.getQuery();
+          Query symbolicFilter = parser.getQuery();
+          qlist.add(symbolicFilter);
         } catch (SyntaxError syntaxError) {
           throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, syntaxError);
         }
+      } else if (rawFilter instanceof Map) {
+
+        Map<String,Object> m = (Map<String, Object>) rawFilter;
+        String type;
+        Object args;
+
+        if (m.size() == 1) {
+          Map.Entry<String, Object> entry = m.entrySet().iterator().next();
+          type = entry.getKey();
+          args = entry.getValue();
+        } else {
+          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Can't convert map to query:" + rawFilter);
+        }
+
+        if (!"param".equals(type)) {
+          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Unknown type. Can't convert map to query:" + rawFilter);
+        }
+
+        String tag;
+        if (!(args instanceof String)) {
+          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Can't retrieve non-string param:" + args);
+        }
+        tag = (String)args;
+
+        String[] qstrings = fcontext.req.getParams().getParams(tag);
+
+        if (qstrings != null) {
+          for (String qstring : qstrings) {
+            QParser parser = null;
+            try {
+              parser = QParser.getParser((String) qstring, fcontext.req);
+              Query symbolicFilter = parser.getQuery();
+              qlist.add(symbolicFilter);
+            } catch (SyntaxError syntaxError) {
+              throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, syntaxError);
+            }
+          }
+        }
+
       } else {
         throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Bad query (expected a string):" + rawFilter);
       }
 
-      qlist.add(symbolicFilter);
     }
 
     this.filter = fcontext.searcher.getDocSet(qlist);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b157e43b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
index 32c6ef1..b08e940 100644
--- a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
+++ b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
@@ -1165,26 +1165,30 @@ public class TestJsonFacets extends SolrTestCaseHS {
 
 
     // test filter
-    client.testJQ(params(p, "q", "*:*", "myfilt","${cat_s}:A"
+    client.testJQ(params(p, "q", "*:*", "myfilt","${cat_s}:A", "ff","-id:1", "ff","-id:2"
         , "json.facet", "{" +
             "t:{${terms} type:terms, field:${cat_s}, domain:{filter:[]} }" + // empty filter list
             ",t_filt:{${terms} type:terms, field:${cat_s}, domain:{filter:'${cat_s}:B'} }" +
-            ",t_filt2:{${terms} type:terms, field:${cat_s}, domain:{filter:'{!query v=$myfilt}'} }" +  // test access to qparser and other query parameters
-            ",t_filt3:{${terms} type:terms, field:${cat_s}, domain:{filter:['-id:1','-id:2']} }" +
+            ",t_filt2 :{${terms} type:terms, field:${cat_s}, domain:{filter:'{!query v=$myfilt}'} }" +  // test access to qparser and other query parameters
+            ",t_filt2a:{${terms} type:terms, field:${cat_s}, domain:{filter:{param:myfilt} } }" +  // test filter via "param" type
+            ",t_filt3: {${terms} type:terms, field:${cat_s}, domain:{filter:['-id:1','-id:2']} }" +
+            ",t_filt3a:{${terms} type:terms, field:${cat_s}, domain:{filter:{param:ff}} }" +  // test multi-valued query parameter
             ",q:{type:query, q:'${cat_s}:B', domain:{filter:['-id:5']} }" + // also tests a top-level negative filter
             ",r:{type:range, field:${num_d}, start:-5, end:10, gap:5, domain:{filter:'-id:4'} }" +
             "}"
         )
         , "facets=={ count:6, " +
-            "t       :{ buckets:[ {val:B, count:3}, {val:A, count:2} ] }" +
-            ",t_filt :{ buckets:[ {val:B, count:3}] } " +
-            ",t_filt2:{ buckets:[ {val:A, count:2}] } " +
-            ",t_filt3:{ buckets:[ {val:B, count:2}, {val:A, count:1}] } " +
+            "t        :{ buckets:[ {val:B, count:3}, {val:A, count:2} ] }" +
+            ",t_filt  :{ buckets:[ {val:B, count:3}] } " +
+            ",t_filt2 :{ buckets:[ {val:A, count:2}] } " +
+            ",t_filt2a:{ buckets:[ {val:A, count:2}] } " +
+            ",t_filt3 :{ buckets:[ {val:B, count:2}, {val:A, count:1}] } " +
+            ",t_filt3a:{ buckets:[ {val:B, count:2}, {val:A, count:1}] } " +
             ",q:{count:2}" +
             ",r:{buckets:[ {val:-5.0,count:1}, {val:0.0,count:1}, {val:5.0,count:0} ] }" +
             "}"
     );
-    
+
   }
 
   @Test
@@ -1433,6 +1437,24 @@ public class TestJsonFacets extends SolrTestCaseHS {
             "}"
     );
 
+
+    // test other various ways to get filters
+    client.testJQ(params(p, "q", "*:*", "f1","-id:3.1", "f2","id:1"
+        , "json.facet", "{ " +
+            "pages1:{type:terms, field:v_t, domain:{blockChildren:'type_s:book', filter:[]} }" +
+            ",pages2:{type:terms, field:v_t, domain:{blockChildren:'type_s:book', filter:{param:f1} } }" +
+            ",books:{type:terms, field:v_t, domain:{blockParent:'type_s:book', filter:[{param:q},{param:missing_param}]} }" +
+            ",books2:{type:terms, field:v_t, domain:{blockParent:'type_s:book', filter:[{param:f2}] } }" +
+            "}"
+        )
+        , "facets=={ count:10" +
+            ", pages1:{ buckets:[ {val:y,count:4},{val:x,count:3},{val:z,count:3} ] }" +
+            ", pages2:{ buckets:[ {val:y,count:4},{val:z,count:3},{val:x,count:2} ] }" +
+            ", books:{ buckets:[ {val:q,count:3},{val:e,count:2},{val:w,count:2} ] }" +
+            ", books2:{ buckets:[ {val:q,count:1} ] }" +
+            "}"
+    );
+
   }