use of io.arlas.server.core.model.response.AggregationResponse in project ARLAS-server by gisaia.
the class GeoAggregateRESTService method geotilegeoaggregate.
@Timed
@Path("{collection}/_geoaggregate/{z}/{x}/{y}")
@GET
@Produces(UTF8JSON)
@Consumes(UTF8JSON)
@ApiOperation(value = "GeoAggregate on a geotile", produces = UTF8JSON, notes = Documentation.GEOTILE_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 geotilegeoaggregate(// --------------------------------------------------------
@ApiParam(name = "collection", value = "collection", required = true) @PathParam(value = "collection") String collection, @ApiParam(name = "z", value = "z", required = true) @PathParam(value = "z") Integer z, @ApiParam(name = "x", value = "x", required = true) @PathParam(value = "x") Integer x, @ApiParam(name = "y", value = "y", required = true) @PathParam(value = "y") Integer y, // --------------------------------------------------------
@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 (agg == null || agg.size() == 0) {
agg = Collections.singletonList("geotile:" + collectionReference.params.centroidPath + ":interval-" + (z + 3));
}
List<BoundingBox> bboxes = getBoundingBoxes(z, x, y, 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(z + "/" + x + "/" + y))), maxagecache);
}
use of io.arlas.server.core.model.response.AggregationResponse in project ARLAS-server by gisaia.
the class AggregateRESTService method flatten.
private AggregationResponse flatten(AggregationResponse aggregationResponse) {
List<AggregationResponse> elements = aggregationResponse.elements;
if (elements != null && elements.size() > 0) {
for (AggregationResponse element : elements) {
element.flattenedElements = new HashMap<>();
exploreService.flat(element, new MapExplorer.ReduceArrayOnKey(ArlasServerConfiguration.FLATTEN_CHAR), s -> (!"elements".equals(s))).forEach((key, value) -> element.flattenedElements.put(key, value));
element.elements = null;
element.metrics = null;
}
}
return aggregationResponse;
}
use of io.arlas.server.core.model.response.AggregationResponse in project ARLAS-server by gisaia.
the class AggregateRESTService method aggregate.
@Timed
@Path("{collection}/_aggregate")
@GET
@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 aggregate(// --------------------------------------------------------
@ApiParam(name = "collection", value = "collection", required = true) @PathParam(value = "collection") String collection, // --------------------------------------------------------
@ApiParam(name = "agg", value = Documentation.AGGREGATION_PARAM_AGG, required = true) @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 ArlasException {
long startArlasTime = System.nanoTime();
CollectionReference collectionReference = exploreService.getCollectionReferenceService().getCollectionReference(collection);
if (collectionReference == null) {
throw new NotFoundException(collection);
}
AggregationsRequest aggregationsRequest = new AggregationsRequest();
aggregationsRequest.filter = ParamsParser.getFilter(collectionReference, f, q, dateformat);
aggregationsRequest.aggregations = ParamsParser.getAggregations(collectionReference, agg);
exploreService.setValidGeoFilters(collectionReference, aggregationsRequest);
ColumnFilterUtil.assertRequestAllowed(columnFilter, collectionReference, aggregationsRequest);
AggregationsRequest aggregationsRequestHeader = new AggregationsRequest();
aggregationsRequestHeader.filter = ParamsParser.getFilter(partitionFilter);
MixedRequest request = new MixedRequest();
request.basicRequest = aggregationsRequest;
exploreService.setValidGeoFilters(collectionReference, aggregationsRequestHeader);
request.headerRequest = aggregationsRequestHeader;
request.columnFilter = ColumnFilterUtil.getCollectionRelatedColumnFilter(columnFilter, collectionReference);
AggregationResponse aggregationResponse = getArlasAggregation(request, collectionReference, Boolean.TRUE.equals(flat));
aggregationResponse.totalTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startArlasTime);
return cache(Response.ok(aggregationResponse), maxagecache);
}
Aggregations