blob: 51679be0f34563826687757e21a413efe41f6b8b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.client.ref_guide_examples;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
import org.apache.solr.client.solrj.request.json.DomainMap;
import org.apache.solr.client.solrj.request.json.JsonQueryRequest;
import org.apache.solr.client.solrj.request.json.QueryFacetMap;
import org.apache.solr.client.solrj.request.json.RangeFacetMap;
import org.apache.solr.client.solrj.request.json.TermsFacetMap;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.client.solrj.response.json.BucketJsonFacet;
import org.apache.solr.client.solrj.response.json.NestableJsonFacet;
import org.apache.solr.cloud.SolrCloudTestCase;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.util.ExternalPaths;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Example SolrJ usage of the JSON Request API.
*
* Snippets surrounded by "tag" and "end" comments are extracted and used in the Solr Reference Guide.
*/
public class JsonRequestApiTest extends SolrCloudTestCase {
private static final String COLLECTION_NAME = "techproducts";
private static final String CONFIG_NAME = "techproducts_config";
@BeforeClass
public static void setupCluster() throws Exception {
configureCluster(1)
.addConfig(CONFIG_NAME, new File(ExternalPaths.TECHPRODUCTS_CONFIGSET).toPath())
.configure();
final List<String> solrUrls = new ArrayList<>();
solrUrls.add(cluster.getJettySolrRunner(0).getBaseUrl().toString());
CollectionAdminRequest.createCollection(COLLECTION_NAME, CONFIG_NAME, 1, 1).setPerReplicaState(SolrCloudTestCase.USE_PER_REPLICA_STATE)
.process(cluster.getSolrClient());
ContentStreamUpdateRequest up = new ContentStreamUpdateRequest("/update");
up.setParam("collection", COLLECTION_NAME);
up.addFile(getFile("solrj/techproducts.xml"), "application/xml");
up.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
UpdateResponse updateResponse = up.process(cluster.getSolrClient());
assertEquals(0, updateResponse.getStatus());
}
@Test
public void testSimpleJsonQuery() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
final int expectedResults = 4;
// tag::solrj-json-query-simple[]
final JsonQueryRequest simpleQuery = new JsonQueryRequest()
.setQuery("memory")
.withFilter("inStock:true");
QueryResponse queryResponse = simpleQuery.process(solrClient, COLLECTION_NAME);
// end::solrj-json-query-simple[]
assertResponseFoundNumDocs(queryResponse, expectedResults);
}
@Test
public void testJsonQueryWithJsonQueryParamOverrides() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
final int expectedResults = 4;
// This subtest has its own scope so that it and its twin below can can have identical variable declarations (as they appear as separate snippets in the ref-guide)
{
// tag::solrj-json-query-param-overrides[]
final ModifiableSolrParams overrideParams = new ModifiableSolrParams();
final JsonQueryRequest queryWithParamOverrides = new JsonQueryRequest(overrideParams)
.setQuery("memory")
.setLimit(10)
.withFilter("inStock:true");
overrideParams.set("json.limit", 5);
overrideParams.add("json.filter", "\"cat:electronics\"");
QueryResponse queryResponse = queryWithParamOverrides.process(solrClient, COLLECTION_NAME);
// end::solrj-json-query-param-overrides[]
assertResponseFoundNumDocs(queryResponse, expectedResults);
}
// tag::solrj-json-query-param-overrides-equivalent[]
final JsonQueryRequest query = new JsonQueryRequest()
.setQuery("memory")
.setLimit(5)
.withFilter("inStock:true")
.withFilter("cat:electronics");
QueryResponse queryResponse = query.process(solrClient, COLLECTION_NAME);
// end::solrj-json-query-param-overrides-equivalent[]
assertResponseFoundNumDocs(queryResponse, expectedResults);
}
@Test
public void testJsonFacetWithAllQueryParams() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
// This subtest has its own scope so that it and its twin below can can have identical variable declarations (as they appear as separate snippets in the ref-guide)
{
//tag::solrj-json-facet-all-query-params[]
final ModifiableSolrParams params = new ModifiableSolrParams();
final SolrQuery query = new SolrQuery("*:*");
query.setRows(1);
query.setParam("json.facet.avg_price", "\"avg(price)\"");
query.setParam("json.facet.top_cats", "{type:terms,field:\"cat\",limit:3}");
QueryResponse queryResponse = solrClient.query(COLLECTION_NAME, query);
//end::solrj-json-facet-all-query-params[]
NestableJsonFacet topLevelFacet = queryResponse.getJsonFacetingResponse();
assertResponseFoundNumDocs(queryResponse, 1);
assertHasFacetWithBucketValues(topLevelFacet, "top_cats",
new FacetBucket("electronics", 12),
new FacetBucket("currency", 4),
new FacetBucket("memory", 3));
}
{
//tag::solrj-json-facet-all-query-params-equivalent[]
final JsonQueryRequest jsonQueryRequest = new JsonQueryRequest()
.setQuery("*:*")
.setLimit(1)
.withStatFacet("avg_price", "avg(price)")
.withFacet("top_cats", new TermsFacetMap("cat").setLimit(3));
QueryResponse queryResponse = jsonQueryRequest.process(solrClient, COLLECTION_NAME);
//end::solrj-json-facet-all-query-params-equivalent[]
NestableJsonFacet topLevelFacet = queryResponse.getJsonFacetingResponse();
assertResponseFoundNumDocs(queryResponse, 1);
assertHasFacetWithBucketValues(topLevelFacet, "top_cats",
new FacetBucket("electronics", 12),
new FacetBucket("currency", 4),
new FacetBucket("memory", 3));
}
}
@Test
public void testJsonQueryUsingParamsBlock() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-query-params-block[]
final ModifiableSolrParams params = new ModifiableSolrParams();
params.set("fl", "name", "price");
final JsonQueryRequest simpleQuery = new JsonQueryRequest(params)
.withParam("q", "memory")
.withParam("rows", 1);
QueryResponse queryResponse = simpleQuery.process(solrClient, COLLECTION_NAME);
// end::solrj-json-query-params-block[]
assertEquals(0, queryResponse.getStatus());
assertEquals(1, queryResponse.getResults().size());
final SolrDocument doc = queryResponse.getResults().get(0);
final Collection<String> returnedFields = doc.getFieldNames();
assertEquals(2, doc.getFieldNames().size());
assertTrue("Expected returned field list to include 'name'", returnedFields.contains("name"));
assertTrue("Expected returned field list to include 'price'", returnedFields.contains("price"));
}
@Test
public void testJsonQueryMacroExpansion() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-query-macro-expansion[]
final ModifiableSolrParams params = new ModifiableSolrParams();
params.set("FIELD", "text");
params.set("TERM", "memory");
final JsonQueryRequest simpleQuery = new JsonQueryRequest(params)
.setQuery("${FIELD}:${TERM}");
QueryResponse queryResponse = simpleQuery.process(solrClient, COLLECTION_NAME);
// end::solrj-json-query-macro-expansion[]
assertResponseFoundNumDocs(queryResponse, 5);
}
@Test
public void testJsonQueryDslBasicEquivalents() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
{
//tag::solrj-ipod-query-basic[]
final SolrQuery query = new SolrQuery("name:iPod");
final QueryResponse response = solrClient.query(COLLECTION_NAME, query);
//end::solrj-ipod-query-basic[]
assertResponseFoundNumDocs(response, 3);
}
{
//tag::solrj-ipod-query-dsl-1[]
final JsonQueryRequest query = new JsonQueryRequest()
.setQuery("name:iPod");
final QueryResponse response = query.process(solrClient, COLLECTION_NAME);
//end::solrj-ipod-query-dsl-1[]
assertResponseFoundNumDocs(response, 3);
}
{
//tag::solrj-ipod-query-dsl-2[]
final JsonQueryRequest query = new JsonQueryRequest()
.setQuery("{!lucene df=name}iPod");
final QueryResponse response = query.process(solrClient, COLLECTION_NAME);
//end::solrj-ipod-query-dsl-2[]
assertResponseFoundNumDocs(response, 3);
}
{
//tag::solrj-ipod-query-dsl-3[]
final Map<String, Object> queryTopLevel = new HashMap<>();
final Map<String, Object> luceneQueryProperties = new HashMap<>();
queryTopLevel.put("lucene", luceneQueryProperties);
luceneQueryProperties.put("df", "name");
luceneQueryProperties.put("query", "iPod");
final JsonQueryRequest query = new JsonQueryRequest()
.setQuery(queryTopLevel);
final QueryResponse response = query.process(solrClient, COLLECTION_NAME);
//end::solrj-ipod-query-dsl-3[]
assertResponseFoundNumDocs(response, 3);
}
}
@Test
public void testJsonQueryDslBoostEquivalents() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
QueryResponse[] responses = new QueryResponse[3];
{
//tag::solrj-ipod-query-boosted-basic[]
final SolrQuery query = new SolrQuery("{!boost b=log(popularity) v=\'{!lucene df=name}iPod\'}");
final QueryResponse response = solrClient.query(COLLECTION_NAME, query);
//end::solrj-ipod-query-boosted-basic[]
responses[0] = response;
}
{
//tag::solrj-ipod-query-boosted-dsl-1[]
final Map<String, Object> queryTopLevel = new HashMap<>();
final Map<String, Object> boostQuery = new HashMap<>();
queryTopLevel.put("boost", boostQuery);
boostQuery.put("b", "log(popularity)");
boostQuery.put("query", "{!lucene df=name}iPod");
final JsonQueryRequest query = new JsonQueryRequest()
.setQuery(queryTopLevel);
final QueryResponse response = query.process(solrClient, COLLECTION_NAME);
//end::solrj-ipod-query-boosted-dsl-1[]
responses[1] = response;
}
{
//tag::solrj-ipod-query-boosted-dsl-2[]
final Map<String, Object> queryTopLevel = new HashMap<>();
final Map<String, Object> boostProperties = new HashMap<>();
final Map<String, Object> luceneTopLevel = new HashMap<>();
final Map<String, Object> luceneProperties = new HashMap<>();
queryTopLevel.put("boost", boostProperties);
boostProperties.put("b", "log(popularity)");
boostProperties.put("query", luceneTopLevel);
luceneTopLevel.put("lucene", luceneProperties);
luceneProperties.put("df", "name");
luceneProperties.put("query", "iPod");
final JsonQueryRequest query = new JsonQueryRequest()
.setQuery(queryTopLevel);
final QueryResponse response = query.process(solrClient, COLLECTION_NAME);
//end::solrj-ipod-query-boosted-dsl-2[]
responses[2] = response;
}
for (QueryResponse response : responses) {
assertResponseFoundNumDocs(response, 3);
assertEquals("MA147LL/A", response.getResults().get(0).get("id"));
assertEquals("F8V7067-APL-KIT", response.getResults().get(1).get("id"));
assertEquals("IW-02", response.getResults().get(2).get("id"));
}
}
@Test
public void testJsonBooleanQuery() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
QueryResponse[] responses = new QueryResponse[3];
{
//tag::solrj-ipod-query-bool[]
final Map<String, Object> queryTopLevel = new HashMap<>();
final Map<String, Object> boolProperties = new HashMap<>();
final List<Object> mustClauses = new ArrayList<>();
final List<Object> mustNotClauses = new ArrayList<>();
final Map<String, Object> frangeTopLevel = new HashMap<>();
final Map<String, Object> frangeProperties = new HashMap<>();
queryTopLevel.put("bool", boolProperties);
boolProperties.put("must", mustClauses);
mustClauses.add("name:iPod");
boolProperties.put("must_not", mustNotClauses);
frangeTopLevel.put("frange", frangeProperties);
frangeProperties.put("l", 0);
frangeProperties.put("u", 5);
frangeProperties.put("query", "popularity");
mustNotClauses.add(frangeTopLevel);
final JsonQueryRequest query = new JsonQueryRequest()
.setQuery(queryTopLevel);
final QueryResponse response = query.process(solrClient, COLLECTION_NAME);
//end::solrj-ipod-query-bool[]
responses[0] = response;
}
{
//tag::solrj-ipod-query-bool-condensed[]
final Map<String, Object> queryTopLevel = new HashMap<>();
final Map<String, Object> boolProperties = new HashMap<>();
final List<Object> mustClauses = new ArrayList<>();
final List<Object> mustNotClauses = new ArrayList<>();
queryTopLevel.put("bool", boolProperties);
boolProperties.put("must", "name:iPod");
boolProperties.put("must_not", "{!frange l=0 u=5}popularity");
final JsonQueryRequest query = new JsonQueryRequest()
.setQuery(queryTopLevel);
final QueryResponse response = query.process(solrClient, COLLECTION_NAME);
//end::solrj-ipod-query-bool-condensed[]
responses[1] = response;
}
{
//tag::solrj-ipod-query-bool-filter[]
final Map<String, Object> queryTopLevel = new HashMap<>();
final Map<String, Object> boolProperties = new HashMap<>();
queryTopLevel.put("bool", boolProperties);
boolProperties.put("must_not","{!frange l=0 u=5}popularity");
final JsonQueryRequest query = new JsonQueryRequest()
.setQuery(queryTopLevel)
.withFilter("name:iPod");
final QueryResponse response = query.process(solrClient, COLLECTION_NAME);
//end::solrj-ipod-query-bool-filter[]
responses[2] = response;
}
for (QueryResponse response : responses) {
assertResponseFoundNumDocs(response, 1);
assertEquals("MA147LL/A", response.getResults().get(0).get("id"));
}
}
@Test
public void testJsonTaggedQuery() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-tagged-query[]
final Map<String, Object> titleTaggedQuery = new HashMap<>();
titleTaggedQuery.put("#titleTag", "name:Solr");
final Map<String, Object> inStockTaggedQuery = new HashMap<>();
inStockTaggedQuery.put("#inStockTag", "inStock:true");
final JsonQueryRequest query = new JsonQueryRequest()
.setQuery("*:*")
.withFilter(titleTaggedQuery)
.withFilter(inStockTaggedQuery);
final QueryResponse response = query.process(solrClient, COLLECTION_NAME);
//end::solrj-tagged-query[]
assertResponseFoundNumDocs(response, 1);
assertEquals("SOLR1000", response.getResults().get(0).get("id"));
}
@Test
public void testSimpleJsonTermsFacet() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-simple-terms-facet[]
final TermsFacetMap categoryFacet = new TermsFacetMap("cat").setLimit(3);
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("*:*")
.withFacet("categories", categoryFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-simple-terms-facet[]
assertEquals(0, queryResponse.getStatus());
assertEquals(32, queryResponse.getResults().getNumFound());
assertEquals(10, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertHasFacetWithBucketValues(topLevelFacetingData,"categories",
new FacetBucket("electronics",12),
new FacetBucket("currency", 4),
new FacetBucket("memory", 3));
}
@Test
public void testTermsFacet2() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-terms-facet-2[]
final TermsFacetMap categoryFacet = new TermsFacetMap("cat").setLimit(5);
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("*:*")
.withFacet("categories", categoryFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-terms-facet-2[]
assertEquals(0, queryResponse.getStatus());
assertEquals(32, queryResponse.getResults().getNumFound());
assertEquals(10, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertHasFacetWithBucketValues(topLevelFacetingData,"categories",
new FacetBucket("electronics",12),
new FacetBucket("currency", 4),
new FacetBucket("memory", 3),
new FacetBucket("connector", 2),
new FacetBucket("graphics card", 2));
}
@Test
public void testStatFacet1() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-metrics-facet-1[]
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("memory")
.withFilter("inStock:true")
.withStatFacet("avg_price", "avg(price)")
.withStatFacet("min_manufacturedate_dt", "min(manufacturedate_dt)")
.withStatFacet("num_suppliers", "unique(manu_exact)")
.withStatFacet("median_weight", "percentile(weight,50)");
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-metrics-facet-1[]
assertEquals(0, queryResponse.getStatus());
assertEquals(4, queryResponse.getResults().getNumFound());
assertEquals(4, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertEquals(146.66, (double) topLevelFacetingData.getStatValue("avg_price"), 0.5);
assertEquals(3, topLevelFacetingData.getStatValue("num_suppliers"));
assertEquals(352.0, (double) topLevelFacetingData.getStatValue("median_weight"), 0.5);
Object val = topLevelFacetingData.getStatValue("min_manufacturedate_dt");
assertTrue(val instanceof Date);
assertEquals("2006-02-13T15:26:37Z", ((Date)val).toInstant().toString());
}
@Test
public void testStatFacetSimple() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-metrics-facet-simple[]
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("*:*")
.withFilter("price:[1.0 TO *]")
.withFilter("popularity:[0 TO 10]")
.withStatFacet("min_manu_id_s", "min(manu_id_s)")
.withStatFacet("avg_value", "avg(div(popularity,price))");
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-metrics-facet-simple[]
assertEquals(0, queryResponse.getStatus());
assertEquals(13, queryResponse.getResults().getNumFound());
assertEquals(10, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertEquals(0.036, (double) topLevelFacetingData.getStatValue("avg_value"), 0.1);
Object val = topLevelFacetingData.getStatValue("min_manu_id_s");
assertTrue(val instanceof String);
assertEquals("apple", val.toString());
}
@Test
public void testStatFacetExpanded() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-metrics-facet-expanded[]
final Map<String, Object> expandedStatFacet = new HashMap<>();
expandedStatFacet.put("type", "func");
expandedStatFacet.put("func", "avg(div($numer,$denom))");
expandedStatFacet.put("numer", "mul(popularity,3.0)");
expandedStatFacet.put("denom", "price");
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("*:*")
.withFilter("price:[1.0 TO *]")
.withFilter("popularity:[0 TO 10]")
.withFacet("avg_value", expandedStatFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-metrics-facet-expanded[]
assertEquals(0, queryResponse.getStatus());
assertEquals(13, queryResponse.getResults().getNumFound());
assertEquals(10, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertEquals(0.108, (double) topLevelFacetingData.getStatValue("avg_value"), 0.1);
}
@Test
public void testQueryFacetSimple() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-query-facet-simple[]
QueryFacetMap queryFacet = new QueryFacetMap("popularity:[8 TO 10]");
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("*:*")
.withFacet("high_popularity", queryFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-query-facet-simple[]
assertEquals(0, queryResponse.getStatus());
assertEquals(32, queryResponse.getResults().getNumFound());
assertEquals(10, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertEquals(2, topLevelFacetingData.getQueryFacet("high_popularity").getCount());
}
@Test
public void testQueryFacetExpanded() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-query-facet-expanded[]
QueryFacetMap queryFacet = new QueryFacetMap("popularity:[8 TO 10]")
.withStatSubFacet("average_price", "avg(price)");
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("*:*")
.withFacet("high_popularity", queryFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-query-facet-expanded[]
assertEquals(0, queryResponse.getStatus());
assertEquals(32, queryResponse.getResults().getNumFound());
assertEquals(10, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertEquals(2, topLevelFacetingData.getQueryFacet("high_popularity").getCount());
assertEquals(199.5, topLevelFacetingData.getQueryFacet("high_popularity").getStatValue("average_price"));
}
@Test
public void testRangeFacetSimple() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-range-facet-simple[]
RangeFacetMap rangeFacet = new RangeFacetMap("price", 0.0, 100.0, 20.0);
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("*:*")
.withFacet("prices", rangeFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-range-facet-simple[]
assertEquals(0, queryResponse.getStatus());
assertEquals(32, queryResponse.getResults().getNumFound());
assertEquals(10, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertHasFacetWithBucketValues(topLevelFacetingData,"prices",
new FacetBucket(0.0f,5),
new FacetBucket(20.0f, 0),
new FacetBucket(40.0f, 0),
new FacetBucket(60.0f, 1),
new FacetBucket(80.0f, 1));
}
@Test
public void testNestedFacetSimple() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-nested-cat-facet[]
final TermsFacetMap topCategoriesFacet = new TermsFacetMap("cat").setLimit(3);
final TermsFacetMap topManufacturerFacet = new TermsFacetMap("manu_id_s").setLimit(1);
topCategoriesFacet.withSubFacet("top_manufacturers", topManufacturerFacet);
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("*:*")
.withFacet("categories", topCategoriesFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-nested-cat-facet[]
assertEquals(0, queryResponse.getStatus());
assertEquals(32, queryResponse.getResults().getNumFound());
assertEquals(10, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertHasFacetWithBucketValues(topLevelFacetingData, "categories",
new FacetBucket("electronics", 12),
new FacetBucket("currency", 4),
new FacetBucket("memory", 3));
// Check the top manufacturer for each category
List<BucketJsonFacet> catBuckets = topLevelFacetingData.getBucketBasedFacets("categories").getBuckets();
assertHasFacetWithBucketValues(catBuckets.get(0), "top_manufacturers",
new FacetBucket("corsair", 3));
assertHasFacetWithBucketValues(catBuckets.get(1), "top_manufacturers",
new FacetBucket("boa", 1));
assertHasFacetWithBucketValues(catBuckets.get(2), "top_manufacturers",
new FacetBucket("corsair", 3));
}
@Test
public void testFacetSortedByNestedMetric() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-nested-cat-facet-sorted[]
final TermsFacetMap topCategoriesFacet = new TermsFacetMap("cat")
.setLimit(3)
.withStatSubFacet("avg_price", "avg(price)")
.setSort("avg_price desc");
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("*:*")
.withFacet("categories", topCategoriesFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-nested-cat-facet-sorted[]
assertEquals(0, queryResponse.getStatus());
assertEquals(32, queryResponse.getResults().getNumFound());
assertEquals(10, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertHasFacetWithBucketValues(topLevelFacetingData, "categories",
new FacetBucket("electronics and computer1", 1),
new FacetBucket("graphics card", 2),
new FacetBucket("music", 1));
}
@Test
public void testFacetFilteredDomain() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-facet-filtered-domain[]
final TermsFacetMap categoryFacet = new TermsFacetMap("cat")
.setLimit(3)
.withDomain(new DomainMap().withFilter("popularity:[5 TO 10]"));
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("*:*")
.withFacet("categories", categoryFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-facet-filtered-domain[]
assertEquals(0, queryResponse.getStatus());
assertEquals(32, queryResponse.getResults().getNumFound());
assertEquals(10, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertHasFacetWithBucketValues(topLevelFacetingData, "categories",
new FacetBucket("electronics", 9),
new FacetBucket("graphics card", 2),
new FacetBucket("hard drive", 2));
}
@Test
public void testFacetWidenedExcludeTagsDomain() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-facet-excludetags-domain[]
final TermsFacetMap inStockFacet = new TermsFacetMap("inStock").setLimit(2);
final TermsFacetMap allManufacturersFacet = new TermsFacetMap("manu_id_s")
.setLimit(2)
.withDomain(new DomainMap().withTagsToExclude("MANU"));
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("cat:electronics")
.withFilter("{!tag=MANU}manu_id_s:apple")
.withFacet("stock", inStockFacet)
.withFacet("manufacturers", allManufacturersFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-facet-excludetags-domain[]
assertEquals(0, queryResponse.getStatus());
assertEquals(1, queryResponse.getResults().getNumFound());
assertEquals(1, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertHasFacetWithBucketValues(topLevelFacetingData, "stock",
new FacetBucket(true, 1));
assertHasFacetWithBucketValues(topLevelFacetingData, "manufacturers",
new FacetBucket("corsair", 3),
new FacetBucket("belkin", 2));
}
@Test
public void testFacetWidenedUsingQueryDomain() throws Exception {
SolrClient solrClient = cluster.getSolrClient();
//tag::solrj-json-facet-query-domain[]
final TermsFacetMap inStockFacet = new TermsFacetMap("inStock").setLimit(2);
final TermsFacetMap popularCategoriesFacet = new TermsFacetMap("cat")
.withDomain(new DomainMap().withQuery("popularity:[8 TO 10]"))
.setLimit(3);
final JsonQueryRequest request = new JsonQueryRequest()
.setQuery("apple")
.withFacet("popular_categories", popularCategoriesFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);
//end::solrj-json-facet-query-domain[]
assertEquals(0, queryResponse.getStatus());
assertEquals(1, queryResponse.getResults().getNumFound());
assertEquals(1, queryResponse.getResults().size());
final NestableJsonFacet topLevelFacetingData = queryResponse.getJsonFacetingResponse();
assertHasFacetWithBucketValues(topLevelFacetingData, "popular_categories",
new FacetBucket("electronics", 1),
new FacetBucket("music", 1),
new FacetBucket("search", 1));
}
private class FacetBucket {
private final Object val;
private final int count;
FacetBucket(Object val, int count) {
this.val = val;
this.count = count;
}
public Object getVal() { return val; }
public int getCount() { return count; }
}
private void assertHasFacetWithBucketValues(NestableJsonFacet response, String expectedFacetName, FacetBucket... expectedBuckets) {
assertTrue("Expected response to have facet with name " + expectedFacetName,
response.getBucketBasedFacets(expectedFacetName) != null);
final List<BucketJsonFacet> buckets = response.getBucketBasedFacets(expectedFacetName).getBuckets();
assertEquals(expectedBuckets.length, buckets.size());
for (int i = 0; i < expectedBuckets.length; i++) {
final FacetBucket expectedBucket = expectedBuckets[i];
final BucketJsonFacet actualBucket = buckets.get(i);
assertEquals(expectedBucket.getVal(), actualBucket.getVal());
assertEquals(expectedBucket.getCount(), actualBucket.getCount());
}
}
private void assertResponseFoundNumDocs(QueryResponse response, int expectedNumDocs) {
assertEquals(0, response.getStatus());
assertEquals(expectedNumDocs, response.getResults().size());
}
}