package com.silverforge.elasticsearchrawclient.queryDSL.queries.innerQueries;
import android.text.TextUtils;
import com.silverforge.elasticsearchrawclient.exceptions.MandatoryParametersAreMissingException;
import com.silverforge.elasticsearchrawclient.model.QueryTypeItem;
import com.silverforge.elasticsearchrawclient.queryDSL.Constants;
import com.silverforge.elasticsearchrawclient.definition.MultiTermQueryable;
import com.silverforge.elasticsearchrawclient.queryDSL.generator.QueryFactory;
import com.silverforge.elasticsearchrawclient.queryDSL.operators.TimeZoneOperator;
import com.silverforge.elasticsearchrawclient.queryDSL.queries.innerQueries.common.BoostQuery;
import com.silverforge.elasticsearchrawclient.utils.QueryTypeArrayList;
import java.util.Date;
import static br.com.zbra.androidlinq.Linq.stream;
public class RangeQuery
extends BoostQuery implements MultiTermQueryable {
private QueryTypeArrayList<QueryTypeItem> queryBag;
RangeQuery(QueryTypeArrayList<QueryTypeItem> queryBag) {
this.queryBag = queryBag;
}
@Override
public String getQueryString() {
return QueryFactory
.rangeQueryGenerator()
.generate(queryBag);
}
public static Init<?> builder() {
return new RangeQueryBuilder();
}
public static class RangeQueryBuilder
extends Init<RangeQueryBuilder> {
@Override
protected RangeQueryBuilder self() {
return this;
}
}
public static abstract class Init<T extends Init<T>>
extends BoostQuery.BoostInit<T> {
public T fieldName(String fieldName) {
if (TextUtils.isEmpty(fieldName))
return allFields();
queryBag.addParentItem(Constants.FIELD_NAME, fieldName);
return self();
}
public T allFields() {
queryBag.addParentItem(Constants.FIELD_NAME, "_all");
return self();
}
// region number
public T gte(int gte) {
queryBag.addItem(Constants.GTE, gte);
return self();
}
public T gte(float gte) {
queryBag.addItem(Constants.GTE, gte);
return self();
}
public T gt(int gt) {
queryBag.addItem(Constants.GT, gt);
return self();
}
public T gt(float gt) {
queryBag.addItem(Constants.GT, gt);
return self();
}
public T lte(int lte) {
queryBag.addItem(Constants.LTE, lte);
return self();
}
public T lte(float lte) {
queryBag.addItem(Constants.LTE, lte);
return self();
}
public T lt(int lt) {
queryBag.addItem(Constants.LT, lt);
return self();
}
public T lt(float lt) {
queryBag.addItem(Constants.LT, lt);
return self();
}
// endregion number
// region date
public T gte(String gte) {
queryBag.addItem(Constants.GTE, gte);
return self();
}
public T gte(Date gte, String format) {
queryBag.addItem(Constants.GTE, gte, format);
return self();
}
public T gt(String gt) {
queryBag.addItem(Constants.GT, gt);
return self();
}
public T gt(Date gt, String format) {
queryBag.addItem(Constants.GT, gt, format);
return self();
}
public T lte(Date lte, String format) {
queryBag.addItem(Constants.LTE, lte, format);
return self();
}
public T lte(String lte) {
queryBag.addItem(Constants.LTE, lte);
return self();
}
public T lt(Date lt, String format) {
queryBag.addItem(Constants.LT, lt, format);
return self();
}
public T lt(String lt) {
queryBag.addItem(Constants.LT, lt);
return self();
}
public T format(String format) {
queryBag.addItem(Constants.FORMAT, format);
return self();
}
public T timeZone(String timeZone) {
queryBag.addItem(Constants.TIME_ZONE, timeZone);
return self();
}
public T timeZone(TimeZoneOperator timeZone) {
String value = timeZone.toString();
queryBag.addItem(Constants.TIME_ZONE, value);
return self();
}
// endregion date
public RangeQuery build() throws MandatoryParametersAreMissingException {
if(!queryBag.containsKey(Constants.FIELD_NAME)) {
throw new MandatoryParametersAreMissingException(Constants.FIELD_NAME);
}
return new RangeQuery(queryBag);
}
}
}