blob: c088d45b8e4adf719553762bbce5a20934444662 [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.solrj.request.json;
import java.util.Map;
/**
* Represents a "terms" facet in a JSON query request.
*
* Ready for use in {@link JsonQueryRequest#withFacet(String, Map)}
*/
public class TermsFacetMap extends JsonFacetMap<TermsFacetMap> {
public TermsFacetMap(String fieldName) {
super("terms");
put("field", fieldName);
}
@Override
public TermsFacetMap getThis() { return this; }
/**
* Indicates that Solr should skip over the N buckets for this facet.
*
* Used for "paging" in facet results. Defaults to 0 if not provided.
*
* @param numToSkip the number of buckets to skip over before selecting the buckets to return
*/
public TermsFacetMap setBucketOffset(int numToSkip) {
if (numToSkip < 0) {
throw new IllegalArgumentException("Parameter 'numToSkip' must be non-negative");
}
put("offset", numToSkip);
return this;
}
/**
* Indicates the maximum number of buckets to be returned by this facet.
*
* Defaults to 10 if not specified.
*/
public TermsFacetMap setLimit(int maximumBuckets) {
put("limit", maximumBuckets);
return this;
}
/**
* Indicates the desired ordering for the returned buckets.
*
* Values can be based on 'count' (the number of results in each bucket), 'index' (the natural order of bucket values),
* or on any stat facet that occurs in the bucket. Defaults to "count desc" if not specified.
*
* By default, {@code sort} is calculated for all buckets generated by all shards. If {@code sort} is expensive a
* cheaper approximation can be provided using {@link #setPreliminarySort(String)} that will be run instead during
* bucket collection.
*
* @see TermsFacetMap#setPreliminarySort(String)
*/
public TermsFacetMap setSort(String sortString) {
if (sortString == null) {
throw new IllegalArgumentException("Parameter 'sortString' must be non-null");
}
put("sort", sortString);
return this;
}
/**
* Indicates an approximate sort calculation to be performed during initial bucket generation and collection.
*
* Values can be based on 'count' (the number of results in each bucket), 'index' (the natural order of bucket values),
* or on any stat facet that occurs in the bucket. Defaults to "count desc" if not specified.
*
* When no {@code prelim_sort} is provided, {@code sort} is calculated on all buckets generated by all shards. If
* {@code sort} is expensive, {@code prelim_sort} can be used to provide a cheaper approximation calculation that is
* run instead on initial bucket collection. {@code sort} is still used when assembling the final list of buckets.
*
* @see TermsFacetMap#setSort(String)
*/
public TermsFacetMap setPreliminarySort(String preliminarySort) {
if (preliminarySort == null) {
throw new IllegalArgumentException("Parameter 'preliminarySort' must be non-null");
}
put("prelim_sort", preliminarySort);
return this;
}
/**
* Indicates the number of additional buckets to request internally beyond those required by {@link #setLimit(int)}.
*
* Defaults to -1 if not specified, which triggers some heuristic guessing based on other settings.
*/
public TermsFacetMap setOverRequest(int numExtraBuckets) {
if (numExtraBuckets < -1) {
throw new IllegalArgumentException("Parameter 'numExtraBuckets' must be >= -1");
}
put("overrequest", numExtraBuckets);
return this;
}
/**
* Indicates whether this facet should use distributed facet refining.
*
* "Distributed facet refining" is a second, optional stage in the facet process that ensures that counts for the
* returned buckets are exact. Enabling it is a tradeoff between precision and speed/performance. Defaults to false
* if not specified.
* @param useRefining true if distributed facet refining should be used; false otherwise
*/
public TermsFacetMap useDistributedFacetRefining(boolean useRefining) {
put("refine", useRefining);
return this;
}
/**
* Indicates how many extra buckets to request during distributed-facet-refining beyond those required by {@link #setLimit(int)}
*
* Defaults to -1 if not specified, which triggers some heuristic guessing based on other settings.
*/
public TermsFacetMap setOverRefine(int numExtraBuckets) {
if (numExtraBuckets < -1) {
throw new IllegalArgumentException("Parameter 'numExtraBuckets' must be >= -1");
}
put("overrefine", numExtraBuckets);
return this;
}
/**
* Indicates that the facet results should not include any buckets with a count less than {@code minCount}.
*
* Defaults to 1 if not specified.
*/
public TermsFacetMap setMinCount(int minCount) {
if (minCount < 0) {
throw new IllegalArgumentException("Parameter 'minCount' must be a non-negative integer");
}
put("mincount", minCount);
return this;
}
/**
* Indicates that Solr should create a bucket corresponding to documents missing the field used by this facet.
*
* Defaults to false if not specified.
*
* @param missingBucket true if the special "missing" bucket should be created; false otherwise
*/
public TermsFacetMap includeMissingBucket(boolean missingBucket) {
put("missing", missingBucket);
return this;
}
/**
* Indicates that Solr should include the total number of buckets for this facet.
*
* Note that this is different than the number of buckets returned. Defaults to false if not specified
*
* @param numBuckets true if the "numBuckets" field should be computed; false otherwise
*/
public TermsFacetMap includeTotalNumBuckets(boolean numBuckets) {
put("numBuckets", numBuckets);
return this;
}
/**
* Creates a bucket representing the union of all other buckets.
*
* For multi-valued fields this is different than a bucket for the entire domain, since documents can belong to
* multiple buckets. Defaults to false if not specified.
*
* @param shouldInclude true if the union bucket "allBuckets" should be computed; false otherwise
*/
public TermsFacetMap includeAllBucketsUnionBucket(boolean shouldInclude) {
put("allBuckets", shouldInclude);
return this;
}
/**
* Indicates that the facet should only produce buckets for terms that start with the specified prefix.
*/
public TermsFacetMap setTermPrefix(String termPrefix) {
if (termPrefix == null) {
throw new IllegalArgumentException("Parameter 'termPrefix' must be non-null");
}
put("prefix", termPrefix);
return this;
}
public enum FacetMethod {
DV("dv"), UIF("uif"), DVHASH("dvhash"), ENUM("enum"), STREAM("stream"), SMART("smart");
private final String value;
FacetMethod(String value) {
this.value = value;
}
public String toString() {
return value;
}
}
/**
* Indicate which method should be used to compute the facet.
*
* Defaults to "smart" if not specified, which has Solr guess which computation method will be most efficient.
*/
public TermsFacetMap setFacetMethod(FacetMethod method) {
if (method == null) {
throw new IllegalArgumentException("Parameter 'method' must be non-null");
}
put("method", method.toString());
return this;
}
}