From 6b3c16a1d9514b2e90bb6576fef3d177afd0349a Mon Sep 17 00:00:00 2001 From: Dmitry Tikhonov Date: Thu, 29 Mar 2018 20:54:47 +0300 Subject: [PATCH] SOLR-9685 tag a query in JSON syntax Support following structure: {"tagged": {"name": "RCOLOR","query": { "term": { "f": "color","v": "blue"}}}} --- .../solr/request/json/JsonQueryConverter.java | 12 +- .../solr/search/json/TestJsonRequest.java | 125 ++++++++++++++++-- 2 files changed, 126 insertions(+), 11 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/request/json/JsonQueryConverter.java b/solr/core/src/java/org/apache/solr/request/json/JsonQueryConverter.java index e732470749b9..a4e35a2d3100 100644 --- a/solr/core/src/java/org/apache/solr/request/json/JsonQueryConverter.java +++ b/solr/core/src/java/org/apache/solr/request/json/JsonQueryConverter.java @@ -69,6 +69,13 @@ private void buildLocalParams(StringBuilder builder, Object val, boolean isQPars "Error when parsing json query, expect only one query parser here, but found : "+map.keySet()); } String qtype = map.keySet().iterator().next(); + String tagName = null; + if ("tagged".equals(qtype)) { + map = (Map) map.get("tagged"); + tagName = (String) map.get("tagName"); + map = (Map) map.get("query"); + qtype = map.keySet().iterator().next(); + } Object subVal = map.get(qtype); // We don't want to introduce unnecessary variable at root level @@ -77,7 +84,10 @@ private void buildLocalParams(StringBuilder builder, Object val, boolean isQPars if (useSubBuilder) subBuilder = new StringBuilder(); - subBuilder = subBuilder.append("{!").append(qtype).append(' ');; + if (tagName != null) { + subBuilder.append("{!tag=").append(tagName).append("}"); + } + subBuilder = subBuilder.append("{!").append(qtype).append(' '); buildLocalParams(subBuilder, subVal, false, additionalParams); subBuilder.append("}"); diff --git a/solr/core/src/test/org/apache/solr/search/json/TestJsonRequest.java b/solr/core/src/test/org/apache/solr/search/json/TestJsonRequest.java index 4f47f8a2652a..94923bbf4449 100644 --- a/solr/core/src/test/org/apache/solr/search/json/TestJsonRequest.java +++ b/solr/core/src/test/org/apache/solr/search/json/TestJsonRequest.java @@ -56,6 +56,11 @@ public void testLocalJsonRequest() throws Exception { doJsonRequest(Client.localClient, false); } + @Test + public void testLocalJsonRequestWithTags() throws Exception { + doJsonRequestWithTag(Client.localClient); + } + @Test public void testDistribJsonRequest() throws Exception { initServers(); @@ -66,16 +71,7 @@ public void testDistribJsonRequest() throws Exception { } public static void doJsonRequest(Client client, boolean isDistrib) throws Exception { - client.deleteByQuery("*:*", null); - client.add(sdoc("id", "1", "cat_s", "A", "where_s", "NY"), null); - client.add(sdoc("id", "2", "cat_s", "B", "where_s", "NJ"), null); - client.add(sdoc("id", "3"), null); - client.commit(); - client.add(sdoc("id", "4", "cat_s", "A", "where_s", "NJ"), null); - client.add(sdoc("id", "5", "cat_s", "B", "where_s", "NJ"), null); - client.commit(); - client.add(sdoc("id", "6", "cat_s", "B", "where_s", "NY"), null); - client.commit(); + addDocs(client); // test json param @@ -401,4 +397,113 @@ public static void doJsonRequest(Client client, boolean isDistrib) throws Except } + public static void doJsonRequestWithTag(Client client) throws Exception { + addDocs(client); + client.testJQ( params("json","{" + + " query : '*:*'," + + " filter : {" + + " tagged : {" + + " tagName : RCAT," + + " query : {" + + " term : {" + + " f : cat_s," + + " v : A" + + " } " + + " } " + + " } " + + " } " + + "}", "json.facet", "{" + + "categories:{ type:terms, field:cat_s, domain:{excludeTags:RCAT} } " + + "}"), "facets=={ count:2, " + + " categories:{ buckets:[ {val:B, count:3}, {val:A, count:2} ] }" + + "}" + ); + + client.testJQ( params("json","{" + + " query : '*:*'," + + " filter : {" + + " term : {" + + " f : cat_s," + + " v : A" + + " } " + + " } " + + "}", "json.facet", "{" + + "categories:{ type:terms, field:cat_s, domain:{excludeTags:RCAT} } " + + "}"), "facets=={ count:2, " + + " categories:{ buckets:[ {val:A, count:2} ] }" + + "}" + ); + + client.testJQ( params("json","{" + + " query : '*:*'," + + " filter : {" + + " term : {" + + " f : cat_s," + + " v : A" + + " } " + + " } " + + "}", "json.facet", "{" + + "categories:{ type:terms, field:cat_s } " + + "}"), "facets=={ count:2, " + + " categories:{ buckets:[ {val:A, count:2} ] }" + + "}" + ); + + client.testJQ( params("json","{" + + " query : '*:*'," + + " filter : {" + + " tagged : {" + + " tagName : RCAT," + + " query : {" + + " term : {" + + " f : cat_s," + + " v : A" + + " } " + + " } " + + " } " + + " } " + + "}", "json.facet", "{" + + "categories:{ type:terms, field:cat_s } " + + "}"), "facets=={ count:2, " + + " categories:{ buckets:[ {val:A, count:2} ] }" + + "}" + ); + + + + client.testJQ( params("json","{" + + " query : {" + + " tagged : {" + + " tagName : RCAT," + + " query : {" + + " term : {" + + " f : cat_s," + + " v : A" + + " } " + + " } " + + " } " + + " } " + + "}", "json.facet", "{" + + "categories:{ type:terms, field:cat_s, domain:{excludeTags:RCAT} } " + + "}"), "facets=={ count:2, " + + " categories:{ buckets:[ {val:B, count:3}, {val:A, count:2} ] }" + + "}" + ); + + + } + + private static void addDocs(Client client) throws Exception { + client.deleteByQuery("*:*", null); + client.add(sdoc("id", "1", "cat_s", "A", "where_s", "NY"), null); + client.add(sdoc("id", "2", "cat_s", "B", "where_s", "NJ"), null); + client.add(sdoc("id", "3"), null); + client.commit(); + client.add(sdoc("id", "4", "cat_s", "A", "where_s", "NJ"), null); + client.add(sdoc("id", "5", "cat_s", "B", "where_s", "NJ"), null); + client.commit(); + client.add(sdoc("id", "6", "cat_s", "B", "where_s", "NY"), null); + client.commit(); + } + }