package com.silverforge.elasticsearchrawclient.queryDSL.queries.innerQueries;
import com.silverforge.elasticsearchrawclient.exceptions.MandatoryParametersAreMissingException;
import com.silverforge.elasticsearchrawclient.model.GeoPoint;
import com.silverforge.elasticsearchrawclient.model.QueryTypeItem;
import com.silverforge.elasticsearchrawclient.queryDSL.Constants;
import com.silverforge.elasticsearchrawclient.definition.Queryable;
import com.silverforge.elasticsearchrawclient.queryDSL.generator.QueryFactory;
import com.silverforge.elasticsearchrawclient.queryDSL.operators.GeoBoundingBoxTypeOperator;
import com.silverforge.elasticsearchrawclient.utils.QueryTypeArrayList;
public class GeoBoundingBoxQuery
implements Queryable {
private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>();
GeoBoundingBoxQuery(QueryTypeArrayList<QueryTypeItem> queryBag) {
this.queryBag = queryBag;
}
@Override
public String getQueryString() {
return QueryFactory
.geoBoundingBoxQueryGenerator()
.generate(queryBag);
}
public static GeoBoundingBoxQueryBuilder builder() {
return new GeoBoundingBoxQueryBuilder();
}
public static class GeoBoundingBoxQueryBuilder
extends Init<GeoBoundingBoxQueryBuilder> {
@Override
protected GeoBoundingBoxQueryBuilder self() {
return this;
}
}
public static abstract class Init<T extends Init<T>> {
private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>();
protected abstract T self();
public T fieldName(String fieldName) {
queryBag.addParentItem(Constants.FIELD_NAME, fieldName);
return self();
}
public T topLeft(GeoPoint geoPoint) {
queryBag.addItem(Constants.TOP_LEFT, geoPoint);
return self();
}
public T topLeftGeohash(String geoHash) {
queryBag.addItem(Constants.TOP_LEFT, geoHash);
return self();
}
public T topRight(GeoPoint geoPoint) {
queryBag.addItem(Constants.TOP_RIGHT, geoPoint);
return self();
}
public T topRightGeohash(String geoHash) {
queryBag.addItem(Constants.TOP_RIGHT, geoHash);
return self();
}
public T bottomLeft(GeoPoint geoPoint) {
queryBag.addItem(Constants.BOTTOM_LEFT, geoPoint);
return self();
}
public T bottomLeftGeohash(String geoHash) {
queryBag.addItem(Constants.BOTTOM_LEFT, geoHash);
return self();
}
public T bottomRight(GeoPoint geoPoint) {
queryBag.addItem(Constants.BOTTOM_RIGHT, geoPoint);
return self();
}
public T bottomRightGeohash(String geoHash) {
queryBag.addItem(Constants.BOTTOM_RIGHT, geoHash);
return self();
}
public T type(GeoBoundingBoxTypeOperator geoBoundingBoxTypeOperator) {
String value = geoBoundingBoxTypeOperator.toString();
queryBag.addItem(Constants.TYPE, value);
return self();
}
public GeoBoundingBoxQuery build()
throws MandatoryParametersAreMissingException {
if (!queryBag.containsKey(Constants.FIELD_NAME))
throw new MandatoryParametersAreMissingException(Constants.FIELD_NAME);
return new GeoBoundingBoxQuery(queryBag);
}
}
}