use of io.arlas.server.core.model.response.AggregationResponse in project ARLAS-server by gisaia.
the class GeoAggregateRESTService method geohashgeoaggregate.
@Timed
@Path("{collection}/_geoaggregate/{geohash}")
@GET
@Produces(UTF8JSON)
@Consumes(UTF8JSON)
@ApiOperation(value = "GeoAggregate on a geohash", produces = UTF8JSON, notes = Documentation.GEOHASH_GEOAGGREGATION_OPERATION, consumes = UTF8JSON, response = FeatureCollection.class)
@ApiResponses(value = { @ApiResponse(code = 200, message = "Successful operation", response = FeatureCollection.class, responseContainer = "FeatureCollection"), @ApiResponse(code = 500, message = "Arlas Server Error.", response = Error.class), @ApiResponse(code = 400, message = "Bad request.", response = Error.class), @ApiResponse(code = 501, message = "Not implemented functionality.", response = Error.class) })
public Response geohashgeoaggregate(// --------------------------------------------------------
@ApiParam(name = "collection", value = "collection", required = true) @PathParam(value = "collection") String collection, @ApiParam(name = "geohash", value = "geohash", required = true) @PathParam(value = "geohash") String geohash, // --------------------------------------------------------
@ApiParam(name = "agg", value = Documentation.GEOAGGREGATION_PARAM_AGG) @QueryParam(value = "agg") List<String> agg, // --------------------------------------------------------
@ApiParam(name = "f", value = Documentation.FILTER_PARAM_F, allowMultiple = true) @QueryParam(value = "f") List<String> f, @ApiParam(name = "q", value = Documentation.FILTER_PARAM_Q, allowMultiple = true) @QueryParam(value = "q") List<String> q, @ApiParam(name = "dateformat", value = Documentation.FILTER_DATE_FORMAT) @QueryParam(value = "dateformat") String dateformat, @ApiParam(hidden = true) @HeaderParam(value = "partition-filter") String partitionFilter, @ApiParam(hidden = true) @HeaderParam(value = "Column-Filter") Optional<String> columnFilter, // --------------------------------------------------------
@ApiParam(name = "pretty", value = Documentation.FORM_PRETTY, defaultValue = "false") @QueryParam(value = "pretty") Boolean pretty, @ApiParam(name = "flat", value = Documentation.FORM_FLAT, defaultValue = "false") @QueryParam(value = "flat") Boolean flat, // --------------------------------------------------------
@ApiParam(value = "max-age-cache") @QueryParam(value = "max-age-cache") Integer maxagecache) throws NotFoundException, ArlasException {
CollectionReference collectionReference = exploreService.getCollectionReferenceService().getCollectionReference(collection);
if (collectionReference == null) {
throw new NotFoundException(collection);
}
if (geohash.startsWith("#")) {
geohash = geohash.substring(1);
}
if (agg == null || agg.size() == 0) {
agg = Collections.singletonList("geohash:" + collectionReference.params.centroidPath + ":interval-" + geohash.length());
}
List<BoundingBox> bboxes = getBoundingBoxes(geohash, agg, collectionReference);
List<CompletableFuture<AggregationResponse>> futureList = new ArrayList<>();
AggregationTypeEnum aggType = null;
for (BoundingBox b : bboxes) {
Expression pwithinBbox = new Expression(collectionReference.params.centroidPath, OperatorEnum.within, b.getWest() + "," + b.getSouth() + "," + String.format(Locale.ROOT, "%.8f", b.getEast() - GEOHASH_EPSILON) + "," + String.format(Locale.ROOT, "%.8f", b.getNorth() - GEOHASH_EPSILON));
MixedRequest request = getGeoaggregateRequest(collectionReference, ParamsParser.getFilter(collectionReference, f, q, dateformat, b, pwithinBbox), partitionFilter, columnFilter, agg);
aggType = ((AggregationsRequest) request.basicRequest).aggregations.get(0).type;
futureList.add(CompletableFuture.supplyAsync(() -> {
try {
return exploreService.aggregate(request, collectionReference, true, ((AggregationsRequest) request.basicRequest).aggregations, 0, System.nanoTime());
} catch (ArlasException e) {
throw new RuntimeException(e);
}
}));
}
List<AggregationResponse> aggResponses = futureList.stream().map(CompletableFuture::join).collect(Collectors.toList());
return cache(Response.ok(toGeoJson(merge(aggResponses), aggType, Boolean.TRUE.equals(flat), Optional.of(geohash))), maxagecache);
}
use of io.arlas.server.core.model.response.AggregationResponse in project ARLAS-server by gisaia.
the class AggregateRESTService method aggregatePost.
@Timed
@Path("{collection}/_aggregate")
@POST
@Produces(UTF8JSON)
@Consumes(UTF8JSON)
@ApiOperation(value = "Aggregate", produces = UTF8JSON, notes = Documentation.AGGREGATION_OPERATION, consumes = UTF8JSON, response = AggregationResponse.class)
@ApiResponses(value = { @ApiResponse(code = 200, message = "Successful operation", response = AggregationResponse.class, responseContainer = "ArlasAggregation"), @ApiResponse(code = 500, message = "Arlas Server Error.", response = Error.class), @ApiResponse(code = 400, message = "Bad request.", response = Error.class) })
public Response aggregatePost(// --------------------------------------------------------
@ApiParam(name = "collection", value = "collection", required = true) @PathParam(value = "collection") String collection, // --------------------------------------------------------
AggregationsRequest aggregationsRequest, @ApiParam(hidden = true) @HeaderParam(value = "partition-filter") String partitionFilter, @ApiParam(hidden = true) @HeaderParam(value = "Column-Filter") Optional<String> columnFilter, // --------------------------------------------------------
@ApiParam(name = "pretty", value = Documentation.FORM_PRETTY, defaultValue = "false") @QueryParam(value = "pretty") Boolean pretty, // --------------------------------------------------------
@ApiParam(value = "max-age-cache") @QueryParam(value = "max-age-cache") Integer maxagecache) throws NotFoundException, ArlasException {
long startArlasTime = System.nanoTime();
CollectionReference collectionReference = exploreService.getCollectionReferenceService().getCollectionReference(collection);
if (collectionReference == null) {
throw new NotFoundException(collection);
}
AggregationsRequest aggregationsRequestHeader = new AggregationsRequest();
aggregationsRequestHeader.filter = ParamsParser.getFilter(partitionFilter);
MixedRequest request = new MixedRequest();
exploreService.setValidGeoFilters(collectionReference, aggregationsRequest);
exploreService.setValidGeoFilters(collectionReference, aggregationsRequestHeader);
ColumnFilterUtil.assertRequestAllowed(columnFilter, collectionReference, aggregationsRequest);
request.basicRequest = aggregationsRequest;
request.headerRequest = aggregationsRequestHeader;
request.columnFilter = ColumnFilterUtil.getCollectionRelatedColumnFilter(columnFilter, collectionReference);
AggregationResponse aggregationResponse = getArlasAggregation(request, collectionReference, (aggregationsRequest.form != null && Boolean.TRUE.equals(aggregationsRequest.form.flat)));
aggregationResponse.totalTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startArlasTime);
return cache(Response.ok(aggregationResponse), maxagecache);
}
use of io.arlas.server.core.model.response.AggregationResponse in project ARLAS-server by gisaia.
the class GeoAggregateRESTService method getFeatureCollection.
private FeatureCollection getFeatureCollection(MixedRequest request, CollectionReference collectionReference, boolean flat, Optional<String> geohash) throws ArlasException {
FeatureCollection fc;
AggregationTypeEnum mainAggregationType = ((AggregationsRequest) request.basicRequest).aggregations.get(0).type;
AggregationResponse aggregationResponse = exploreService.aggregate(request, collectionReference, true, ((AggregationsRequest) request.basicRequest).aggregations, 0, System.nanoTime());
fc = toGeoJson(aggregationResponse, mainAggregationType, flat, geohash);
return fc;
}
use of io.arlas.server.core.model.response.AggregationResponse in project ARLAS-server by gisaia.
the class GeoAggregateRESTService method merge.
private AggregationResponse merge(List<AggregationResponse> aggResponses) {
AggregationResponse result = new AggregationResponse();
if (aggResponses.size() > 1) {
result.name = aggResponses.get(0).name;
result.totalnb = aggResponses.stream().filter(r -> r.totalnb != null).mapToLong(r -> r.totalnb).sum();
result.elements = aggResponses.stream().map(r -> r.elements).filter(Objects::nonNull).flatMap(Collection::stream).collect(Collectors.toList());
result.metrics = aggResponses.stream().map(r -> r.metrics).filter(Objects::nonNull).flatMap(Collection::stream).collect(Collectors.toList());
result.hits = aggResponses.stream().map(r -> r.hits).filter(Objects::nonNull).flatMap(Collection::stream).collect(Collectors.toList());
result.geometries = aggResponses.stream().map(r -> r.geometries).filter(Objects::nonNull).flatMap(Collection::stream).collect(Collectors.toList());
} else {
return aggResponses.get(0);
}
return result;
}
use of io.arlas.server.core.model.response.AggregationResponse in project ARLAS-server by gisaia.
the class GeoAggregateRESTService method toGeoJson.
private FeatureCollection toGeoJson(AggregationResponse aggregationResponse, AggregationTypeEnum mainAggregationType, boolean flat, Optional<String> tile) {
FeatureCollection fc = new FeatureCollection();
List<AggregationResponse> elements = aggregationResponse.elements;
if (!CollectionUtils.isEmpty(elements)) {
for (AggregationResponse element : elements) {
if (!CollectionUtils.isEmpty(element.geometries)) {
element.geometries.forEach(g -> {
Feature feature = new Feature();
Map<String, Object> properties = new HashMap<>();
properties.put("count", element.count);
if (mainAggregationType == AggregationTypeEnum.geohash) {
properties.put("geohash", element.keyAsString);
tile.ifPresent(s -> properties.put("parent_geohash", s));
} else if (mainAggregationType == AggregationTypeEnum.h3) {
properties.put("h3", element.keyAsString);
tile.ifPresent(s -> properties.put("parent_cell", s));
} else if (mainAggregationType == AggregationTypeEnum.geotile) {
properties.put("tile", element.keyAsString);
tile.ifPresent(s -> properties.put("parent_tile", s));
} else {
properties.put("key", element.keyAsString);
}
if (flat) {
properties.putAll(exploreService.flat(element, new MapExplorer.ReduceArrayOnKey(ArlasServerConfiguration.FLATTEN_CHAR), s -> (!"elements".equals(s))));
} else {
properties.put("elements", element.elements);
properties.put("metrics", element.metrics);
if (element.hits != null) {
properties.put("hits", element.hits);
}
}
feature.setProperties(properties);
feature.setProperty(FEATURE_TYPE_KEY, FEATURE_TYPE_VALUE);
feature.setProperty(GEOMETRY_REFERENCE, g.reference);
String aggregationGeometryType = g.isRaw ? AggregationGeometryEnum.RAW.value() : AggregationGeometryEnum.AGGREGATED.value();
feature.setProperty(GEOMETRY_TYPE, aggregationGeometryType);
if (g.isRaw) {
feature.setProperty(GEOMETRY_SORT, g.sort);
}
GeoJsonObject geometry = g.geometry;
feature.setGeometry(geometry);
fc.add(feature);
});
}
}
}
return fc;
}
Aggregations