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; public class GeohashCellQuery implements Queryable { private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>(); GeohashCellQuery(QueryTypeArrayList<QueryTypeItem> queryBag) { this.queryBag = queryBag; } @Override public String getQueryString() { return QueryFactory .geohashCellQueryGenerator() .generate(queryBag); } public static Init<?> builder() { return new GeohashCellQueryBuilder(); } public static class GeohashCellQueryBuilder extends Init<GeohashCellQueryBuilder> { @Override protected GeohashCellQueryBuilder 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 location(GeoPoint geoPoint) { String value = String.format("{\"lat\":%s,\"lon\":%s}", Double.toString(geoPoint.getLatitude()), Double.toString(geoPoint.getLongitude())); queryBag.addItem(Constants.VALUE, value); return self(); } public T precision(String precision) { queryBag.addItem(Constants.PRECISION, precision); return self(); } public T precision(int precision) { queryBag.addItem(Constants.PRECISION, precision); return self(); } public T precision(float precision) { queryBag.addItem(Constants.PRECISION, precision); return self(); } public T neighbors(boolean neighbors) { queryBag.addItem(Constants.NEIGHBORS, neighbors); return self(); } public GeohashCellQuery build() throws MandatoryParametersAreMissingException { if (!queryBag.containsKey(Constants.FIELD_NAME)) throw new MandatoryParametersAreMissingException(Constants.FIELD_NAME); if (!queryBag.containsKey(Constants.VALUE)) throw new MandatoryParametersAreMissingException(Constants.VALUE); return new GeohashCellQuery(queryBag); } } }