blob: b856b43def7e3946f7b1fb2fb49d76fa6c897afd [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.skywalking.library.elasticsearch.requests.search;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import org.apache.skywalking.library.elasticsearch.requests.search.aggregation.Aggregation;
import org.apache.skywalking.library.elasticsearch.requests.search.aggregation.AggregationBuilder;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState;
import static java.util.Objects.requireNonNull;
public final class SearchBuilder {
private Integer from;
private Integer size;
private QueryBuilder queryBuilder;
private ImmutableList.Builder<Sort> sort;
private ImmutableMap.Builder<String, Aggregation> aggregations;
SearchBuilder() {
}
public SearchBuilder from(Integer from) {
requireNonNull(from, "from");
checkArgument(from >= 0, "from must be >= 0, but was %s", from);
this.from = from;
return this;
}
public SearchBuilder size(Integer size) {
requireNonNull(size, "size");
checkArgument(size >= 0, "size must be positive, but was %s", size);
this.size = size;
return this;
}
public SearchBuilder sort(String by, Sort.Order order) {
checkArgument(!Strings.isNullOrEmpty(by), "by cannot be blank");
requireNonNull(order, "order");
sort().add(new Sort(by, order));
return this;
}
public SearchBuilder query(QueryBuilder queryBuilder) {
checkState(this.queryBuilder == null, "queryBuilder is already set");
this.queryBuilder = requireNonNull(queryBuilder, "queryBuilder");
return this;
}
public SearchBuilder aggregation(Aggregation aggregation) {
requireNonNull(aggregation, "aggregation");
aggregations().put(aggregation.name(), aggregation);
return this;
}
public SearchBuilder aggregation(AggregationBuilder builder) {
requireNonNull(builder, "builder");
return aggregation(builder.build());
}
public Search build() {
final Sorts sorts;
if (sort == null) {
sorts = null;
} else {
sorts = new Sorts(sort.build());
}
final ImmutableMap<String, Aggregation> aggregations;
if (this.aggregations == null) {
aggregations = null;
} else {
aggregations = aggregations().build();
}
final Query query;
if (queryBuilder != null) {
query = queryBuilder.build();
} else {
query = null;
}
return new Search(
from, size, query, sorts, aggregations
);
}
private ImmutableList.Builder<Sort> sort() {
if (sort == null) {
sort = ImmutableList.builder();
}
return sort;
}
private ImmutableMap.Builder<String, Aggregation> aggregations() {
if (aggregations == null) {
aggregations = ImmutableMap.builder();
}
return aggregations;
}
}