blob: ae4d23e4fe944a24af1c25f4f72660c9ace3cef6 [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.Date;
import java.util.Map;
/**
* Represents a "range" facet in a JSON request query.
*
* Ready for use with {@link JsonQueryRequest#withFacet(String, Map)}
*/
public class RangeFacetMap extends JsonFacetMap<RangeFacetMap> {
public RangeFacetMap(String field, long start, long end, long gap) {
super("range");
if (field == null) {
throw new IllegalArgumentException("Parameter 'field' must be non-null");
}
if (end < start) {
throw new IllegalArgumentException("Parameter 'end' must be greater than parameter 'start'");
}
if (gap <= 0) {
throw new IllegalArgumentException("Parameter 'gap' must be a positive integer");
}
put("field", field);
put("start", start);
put("end", end);
put("gap", gap);
}
public RangeFacetMap(String field, double start, double end, double gap) {
super("range");
if (field == null) {
throw new IllegalArgumentException("Parameter 'field' must be non-null");
}
if (end < start) {
throw new IllegalArgumentException("Parameter 'end' must be greater than parameter 'start'");
}
if (gap <= 0) {
throw new IllegalArgumentException("Parameter 'gap' must be a positive value");
}
put("field", field);
put("start", start);
put("end", end);
put("gap", gap);
}
/**
* Creates a "range" facet representation for a date field
*
* @param gap a DateMathParser compatible time/interval String. (e.g. "+1MONTH")
*/
public RangeFacetMap(String field, Date start, Date end, String gap) {
super("range");
if (field == null) {
throw new IllegalArgumentException("Parameter 'field' must be non-null");
}
if (start == null) {
throw new IllegalArgumentException("Parameter 'start' must be non-null");
}
if (end == null) {
throw new IllegalArgumentException("Parameter 'gap' must be non-null");
}
put("field", field);
put("start", start);
put("end", end);
put("gap", gap);
}
@Override
public RangeFacetMap getThis() { return this; }
/**
* Indicates whether the facet's last bucket should stop exactly at {@code end}, or be extended to be {@code gap} wide
*
* Defaults to false if not specified.
*
* @param hardEnd true if the final bucket should be truncated at {@code end}; false otherwise
*/
public RangeFacetMap setHardEnd(boolean hardEnd) {
put("hardend", hardEnd);
return this;
}
public enum OtherBuckets {
BEFORE("before"), AFTER("after"), BETWEEN("between"), NONE("none"), ALL("all");
private final String value;
OtherBuckets(String value) {
this.value = value;
}
public String toString() { return value; }
}
/**
* Indicates that an additional range bucket(s) should be computed and added to those computed for {@code start} and {@code end}
*
* See {@link OtherBuckets} for possible options.
*/
public RangeFacetMap setOtherBuckets(OtherBuckets bucketSpecifier) {
if (bucketSpecifier == null) {
throw new IllegalArgumentException("Parameter 'bucketSpecifier' must be non-null");
}
put("other", bucketSpecifier.toString());
return this;
}
/**
* Indicates that buckets should be returned only if they have a count of at least {@code minOccurrences}
*
* Defaults to '0' if not specified.
*/
public RangeFacetMap setMinCount(int minOccurrences) {
if (minOccurrences < 0) {
throw new IllegalArgumentException(" Parameter 'minOccurrences' must be non-negative");
}
put("mincount", minOccurrences);
return this;
}
}