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} ] }" +
+ "}"
+ );
+
}