Search in sources :

Example 1 with AggregationResponse

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);
}
Also used : ArlasException(io.arlas.server.core.exceptions.ArlasException) CollectionReference(io.arlas.server.core.model.CollectionReference) CompletableFuture(java.util.concurrent.CompletableFuture) AggregationResponse(io.arlas.server.core.model.response.AggregationResponse) AggregationTypeEnum(io.arlas.server.core.model.enumerations.AggregationTypeEnum) Timed(com.codahale.metrics.annotation.Timed) ApiOperation(io.swagger.annotations.ApiOperation) ApiResponses(io.swagger.annotations.ApiResponses)

Example 2 with AggregationResponse

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);
}
Also used : AggregationsRequest(io.arlas.server.core.model.request.AggregationsRequest) MixedRequest(io.arlas.server.core.model.request.MixedRequest) AggregationResponse(io.arlas.server.core.model.response.AggregationResponse) CollectionReference(io.arlas.server.core.model.CollectionReference) Timed(com.codahale.metrics.annotation.Timed) ApiOperation(io.swagger.annotations.ApiOperation) ApiResponses(io.swagger.annotations.ApiResponses)

Example 3 with AggregationResponse

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;
}
Also used : AggregationResponse(io.arlas.server.core.model.response.AggregationResponse) FeatureCollection(org.geojson.FeatureCollection) AggregationTypeEnum(io.arlas.server.core.model.enumerations.AggregationTypeEnum)

Example 4 with AggregationResponse

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;
}
Also used : java.util(java.util) AggregationTypeEnum(io.arlas.server.core.model.enumerations.AggregationTypeEnum) ApiParam(io.swagger.annotations.ApiParam) CompletableFuture(java.util.concurrent.CompletableFuture) ApiResponses(io.swagger.annotations.ApiResponses) CollectionUtils(org.apache.commons.collections4.CollectionUtils) Feature(org.geojson.Feature) ApiOperation(io.swagger.annotations.ApiOperation) ArlasException(io.arlas.server.core.exceptions.ArlasException) ExploreService(io.arlas.server.core.services.ExploreService) FeatureCollection(org.geojson.FeatureCollection) InvalidParameterException(io.arlas.server.core.exceptions.InvalidParameterException) io.arlas.server.core.utils(io.arlas.server.core.utils) ArlasServerConfiguration(io.arlas.server.core.app.ArlasServerConfiguration) CollectionReference(io.arlas.server.core.model.CollectionReference) io.arlas.server.core.model.request(io.arlas.server.core.model.request) Documentation(io.arlas.server.core.app.Documentation) GeoJsonObject(org.geojson.GeoJsonObject) FileUtils(org.apache.commons.io.FileUtils) IOException(java.io.IOException) Collectors(java.util.stream.Collectors) File(java.io.File) Timed(com.codahale.metrics.annotation.Timed) ExploreRESTServices(io.arlas.server.rest.explore.ExploreRESTServices) javax.ws.rs(javax.ws.rs) Response(javax.ws.rs.core.Response) AggregationResponse(io.arlas.server.core.model.response.AggregationResponse) ApiResponse(io.swagger.annotations.ApiResponse) AggregationGeometryEnum(io.arlas.server.core.model.enumerations.AggregationGeometryEnum) OperatorEnum(io.arlas.server.core.model.enumerations.OperatorEnum) Error(io.arlas.server.core.model.response.Error) AggregationResponse(io.arlas.server.core.model.response.AggregationResponse) FeatureCollection(org.geojson.FeatureCollection)

Example 5 with AggregationResponse

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;
}
Also used : java.util(java.util) AggregationTypeEnum(io.arlas.server.core.model.enumerations.AggregationTypeEnum) ApiParam(io.swagger.annotations.ApiParam) CompletableFuture(java.util.concurrent.CompletableFuture) ApiResponses(io.swagger.annotations.ApiResponses) CollectionUtils(org.apache.commons.collections4.CollectionUtils) Feature(org.geojson.Feature) ApiOperation(io.swagger.annotations.ApiOperation) ArlasException(io.arlas.server.core.exceptions.ArlasException) ExploreService(io.arlas.server.core.services.ExploreService) FeatureCollection(org.geojson.FeatureCollection) InvalidParameterException(io.arlas.server.core.exceptions.InvalidParameterException) io.arlas.server.core.utils(io.arlas.server.core.utils) ArlasServerConfiguration(io.arlas.server.core.app.ArlasServerConfiguration) CollectionReference(io.arlas.server.core.model.CollectionReference) io.arlas.server.core.model.request(io.arlas.server.core.model.request) Documentation(io.arlas.server.core.app.Documentation) GeoJsonObject(org.geojson.GeoJsonObject) FileUtils(org.apache.commons.io.FileUtils) IOException(java.io.IOException) Collectors(java.util.stream.Collectors) File(java.io.File) Timed(com.codahale.metrics.annotation.Timed) ExploreRESTServices(io.arlas.server.rest.explore.ExploreRESTServices) javax.ws.rs(javax.ws.rs) Response(javax.ws.rs.core.Response) AggregationResponse(io.arlas.server.core.model.response.AggregationResponse) ApiResponse(io.swagger.annotations.ApiResponse) AggregationGeometryEnum(io.arlas.server.core.model.enumerations.AggregationGeometryEnum) OperatorEnum(io.arlas.server.core.model.enumerations.OperatorEnum) Error(io.arlas.server.core.model.response.Error) AggregationResponse(io.arlas.server.core.model.response.AggregationResponse) FeatureCollection(org.geojson.FeatureCollection) GeoJsonObject(org.geojson.GeoJsonObject) GeoJsonObject(org.geojson.GeoJsonObject) Feature(org.geojson.Feature)

Aggregations

AggregationResponse (io.arlas.server.core.model.response.AggregationResponse)8 Timed (com.codahale.metrics.annotation.Timed)7 CollectionReference (io.arlas.server.core.model.CollectionReference)7 ApiOperation (io.swagger.annotations.ApiOperation)7 ApiResponses (io.swagger.annotations.ApiResponses)7 ArlasException (io.arlas.server.core.exceptions.ArlasException)5 AggregationTypeEnum (io.arlas.server.core.model.enumerations.AggregationTypeEnum)5 CompletableFuture (java.util.concurrent.CompletableFuture)4 ArlasServerConfiguration (io.arlas.server.core.app.ArlasServerConfiguration)3 Documentation (io.arlas.server.core.app.Documentation)3 AggregationsRequest (io.arlas.server.core.model.request.AggregationsRequest)3 MixedRequest (io.arlas.server.core.model.request.MixedRequest)3 Error (io.arlas.server.core.model.response.Error)3 ExploreService (io.arlas.server.core.services.ExploreService)3 ExploreRESTServices (io.arlas.server.rest.explore.ExploreRESTServices)3 ApiParam (io.swagger.annotations.ApiParam)3 ApiResponse (io.swagger.annotations.ApiResponse)3 javax.ws.rs (javax.ws.rs)3 Response (javax.ws.rs.core.Response)3 FeatureCollection (org.geojson.FeatureCollection)3