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.utils.QueryTypeArrayList;
import com.silverforge.elasticsearchrawclient.utils.StringUtils;
import java.util.List;
import static br.com.zbra.androidlinq.Linq.*;
public class GeoPolygonQuery
implements Queryable {
private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>();
GeoPolygonQuery(QueryTypeArrayList<QueryTypeItem> queryBag) {
this.queryBag = queryBag;
}
@Override
public String getQueryString() {
return QueryFactory
.geoPolygonQueryGenerator()
.generate(queryBag);
}
public static Init<?> builder() {
return new GeoPolygonQueryBuilder();
}
public static class GeoPolygonQueryBuilder
extends Init<GeoPolygonQueryBuilder> {
@Override
protected GeoPolygonQueryBuilder 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 points(GeoPoint... geoPoints) {
List<String> points = stream(geoPoints)
.select(gp ->
String.format("[%s,%s]",
Double.toString(gp.getLongitude()),
Double.toString(gp.getLatitude())))
.toList();
String concatenatedPoints = StringUtils.makeCommaSeparatedList(points);
queryBag.addItem(Constants.POINTS, String.format("[%s]", concatenatedPoints));
return self();
}
public T points(String... geoHashes) {
String concatenatedPoints
= StringUtils.makeCommaSeparatedListWithQuotationMark(geoHashes);
queryBag.addItem(Constants.POINTS, String.format("[%s]", concatenatedPoints));
return self();
}
public T queryName(String name) {
queryBag.addItem(Constants._NAME, name);
return self();
}
public T coerce(boolean coerce) {
queryBag.addItem(Constants.COERCE, coerce);
return self();
}
public GeoPolygonQuery build()
throws MandatoryParametersAreMissingException {
if (!queryBag.containsKey(Constants.FIELD_NAME))
throw new MandatoryParametersAreMissingException(Constants.FIELD_NAME);
if (!queryBag.containsKey(Constants.POINTS))
throw new MandatoryParametersAreMissingException(Constants.POINTS);
return new GeoPolygonQuery(queryBag);
}
}
}