List of usage examples for org.springframework.data.mongodb.core.aggregation Fields from
public static Fields from(Field... fields)
From source file:eu.cloudwave.wp5.feedbackhandler.repositories.ProcedureExecutionRepositoryImpl.java
/** * {@inheritDoc}//from w w w.j a va 2 s . c om */ @Override public Optional<AggregatedInvocation> getCallersOfInvokedMethod(String invokedClassName, String invokedMethodName, String callerClassName, String callerMethodName) { // objects have to have the same method name + class name final MatchOperation matchOperation = match( new Criteria(PROC__NAME).is(invokedMethodName).and(PROC__CLASS_NAME).is(invokedClassName)); /* * add all distinct callers of the given invoked method to set * * Fields.from(Fields.field(<NEW ATTRIBUTE NAME>, <ORIGINAL ATTRIBUTE NAME>)) */ final GroupOperation groupOperation = group( Fields.from(Fields.field(INVOKED_METHOD_NAME_PROJECTION, PROC__NAME)) .and(INVOKED_CLASS_NAME_PROJECTION, PROC__CLASS_NAME)).addToSet("$" + CALLER) .as(CALLER_AGGREGATION_ATTRIBUTE); List<AggregatedInvocation> aggregationResults = aggregateProcedureExecution( newAggregation(matchOperation, groupOperation), AggregatedInvocation.class).getMappedResults(); if (!aggregationResults.isEmpty()) { return Optional.of(aggregationResults.get(0)); } return Optional.absent(); }
From source file:eu.cloudwave.wp5.feedbackhandler.repositories.ProcedureExecutionRepositoryImpl.java
/** * Helper that builds and runs the query. It creates a Match Operation, Group Operation and the Aggregation. The * GroupOperation groups by caller, callee, calleeMethod and method name. * //from w ww .ja v a2s . com * @param matchCriteria * {@link Criteria} which specifies the annotation and other filters * @return {@link ClientRequestCollector} a list of matching requests */ private List<ClientRequestCollector> getRequestsWithCriteria(Criteria matchCriteria) { // create match operation based on input final MatchOperation matchOperation = match(matchCriteria); // 1. group by caller Fields fields = Fields.from(Fields.field(Ids.MICROSERVICE_CLIENT_REQUEST_ANNOTATION_FROM_ATTRIBUTE, "$" + ANNOTATION_FROM_ATTRIBUTE)); // 2. group by callee fields = fields.and(Ids.MICROSERVICE_CLIENT_REQUEST_ANNOTATION_TO_ATTRIBUTE, "$" + ANNOTATION_TO_ATTRIBUTE); // 3. group by callee method fields = fields.and(Ids.MICROSERVICE_CLIENT_REQUEST_ANNOTATION_TO_METHOD_ATTRIBUTE, "$" + ANNOTATION_TO_METHOD_ATTRIBUTE); // 4. group by name of method that contains the invocation fields = fields.and(METHOD_PROJECTION, "$" + METHOD_ATTRIBUTE); // create group operation final GroupOperation groupOperation = group(fields).push("$" + TIME_FIELD).as(TIME_AGGREGATION_ATTRIBUTE); final Aggregation microserviceClientAggregationSpec = newAggregation(matchOperation, groupOperation); return aggregateProcedureExecution(microserviceClientAggregationSpec, ClientRequestCollector.class) .getMappedResults(); }
From source file:eu.cloudwave.wp5.feedbackhandler.repositories.ProcedureExecutionRepositoryImpl.java
/** * Helper that builds and runs the query. It creates a Match Operation, Group Operation and the Aggregation. The * GroupOperation groups by caller, callee, calleeMethod and method name. * //from w ww. j a v a2s. c o m * @param matchCriteria * {@link Criteria} which specifies the annotation and other filters * @return {@link IncomingRequestCollector} a list of matching requests */ private List<IncomingRequestCollector> getIncomingRequestsWithCriteria(Criteria matchCriteria, boolean groupByMethod) { // create match operation based on input final MatchOperation matchOperation = match(matchCriteria); // 1. group by service identifier Fields fields = Fields.from(Fields.field(Ids.MICROSERVICE_ENDPOINT_ANNOTATION_IDENTIFIER_ATTRIBUTE, "$" + ANNOTATION_IDENTIFIER_ATTRIBUTE)); // 2. group by service method if (groupByMethod) { fields = fields.and(Ids.MICROSERVICE_DECLARATION_ANNOTATION_METHOD_ATTRIBUTE, "$" + ANNOTATION_METHOD_ATTRIBUTE); } // create group operation and push all timestamps into a list final GroupOperation groupOperation = group(fields).push("$" + TIME_FIELD).as(TIME_AGGREGATION_ATTRIBUTE); final Aggregation microserviceClientAggregationSpec = newAggregation(matchOperation, groupOperation); return aggregateProcedureExecution(microserviceClientAggregationSpec, IncomingRequestCollector.class) .getMappedResults(); }
From source file:org.devgateway.ocds.web.rest.controller.CostEffectivenessVisualsController.java
@ApiOperation(value = "Cost effectiveness of Tenders:" + " Displays the total amount of the active tenders that have active awards, " + "grouped by year. Only tenders.status=active" + "are taken into account. The year is calculated from tenderPeriod.startDate") @RequestMapping(value = "/api/costEffectivenessTenderAmount", method = { RequestMethod.POST, RequestMethod.GET }, produces = "application/json") public List<DBObject> costEffectivenessTenderAmount( @ModelAttribute @Valid final GroupingFilterPagingRequest filter) { DBObject project = new BasicDBObject(); project.put("year", new BasicDBObject("$year", ref(MongoConstants.FieldNames.TENDER_PERIOD_START_DATE))); addYearlyMonthlyProjection(filter, project, ref(MongoConstants.FieldNames.TENDER_PERIOD_START_DATE)); project.put(MongoConstants.FieldNames.TENDER_VALUE_AMOUNT, 1); project.put(Fields.UNDERSCORE_ID, "$tender._id"); project.put("tenderWithAwards", new BasicDBObject("$cond", Arrays.asList(new BasicDBObject("$eq", Arrays.asList(ref(MongoConstants.FieldNames.AWARDS_STATUS), Award.Status.active.toString())), 1, 0)));//from w w w. j a v a2s.c o m project.put("tenderWithAwardsValue", new BasicDBObject("$cond", Arrays.asList( new BasicDBObject("$eq", Arrays.asList(ref(MongoConstants.FieldNames.AWARDS_STATUS), Award.Status.active.toString())), ref(MongoConstants.FieldNames.TENDER_VALUE_AMOUNT), 0))); project.putAll(filterProjectMap); DBObject group1 = new BasicDBObject(); group1.put(Fields.UNDERSCORE_ID, Fields.UNDERSCORE_ID_REF); addYearlyMonthlyGroupingOperationFirst(filter, group1); group1.put("tenderWithAwards", new BasicDBObject("$max", "$tenderWithAwards")); group1.put("tenderWithAwardsValue", new BasicDBObject("$max", "$tenderWithAwardsValue")); group1.put("tenderAmount", new BasicDBObject("$first", ref(MongoConstants.FieldNames.TENDER_VALUE_AMOUNT))); filterProjectMap .forEach( (k, v) -> group1 .put(k.replace(".", ""), k.equals("tender.items.classification._id") ? new BasicDBObject("$first", new BasicDBObject("$arrayElemAt", Arrays.asList("$" + k, 0))) : new BasicDBObject("$first", "$" + k))); Aggregation agg = Aggregation .newAggregation( match(where(MongoConstants.FieldNames.TENDER_STATUS) .is(Tender.Status.active.toString()) .and(MongoConstants.FieldNames.TENDER_PERIOD_START_DATE).exists(true) .andOperator(getYearDefaultFilterCriteria(filter, MongoConstants.FieldNames.TENDER_PERIOD_START_DATE))), getMatchDefaultFilterOperation(filter), new CustomUnwindOperation("$awards", true), new CustomProjectionOperation(project), new CustomGroupingOperation(group1), getTopXFilterOperation(filter, getYearlyMonthlyGroupingFields(filter)) .sum("tenderWithAwardsValue").as(Keys.TOTAL_TENDER_AMOUNT).count() .as(Keys.TOTAL_TENDERS).sum("tenderWithAwards").as(Keys.TOTAL_TENDER_WITH_AWARDS), project(Keys.TOTAL_TENDER_AMOUNT, Keys.TOTAL_TENDERS, Keys.TOTAL_TENDER_WITH_AWARDS) .andInclude( Fields.from(Fields.field(Fields.UNDERSCORE_ID, Fields.UNDERSCORE_ID_REF))) .and(Keys.TOTAL_TENDER_WITH_AWARDS).divide(Keys.TOTAL_TENDERS) .as(Keys.FRACTION_TENDERS_WITH_AWARDS), project(Keys.TOTAL_TENDER_AMOUNT, Keys.TOTAL_TENDERS, Keys.TOTAL_TENDER_WITH_AWARDS, Fields.UNDERSCORE_ID).and(Keys.FRACTION_TENDERS_WITH_AWARDS).multiply(100) .as(Keys.PERCENTAGE_TENDERS_WITH_AWARDS), (filter.getGroupByCategory() == null ? transformYearlyGrouping(filter) : project()) .andInclude(Keys.TOTAL_TENDER_AMOUNT, Keys.TOTAL_TENDERS, Keys.TOTAL_TENDER_WITH_AWARDS, Keys.PERCENTAGE_TENDERS_WITH_AWARDS), filter.getGroupByCategory() == null ? getSortByYearMonth(filter) : sort(Sort.Direction.DESC, Keys.TOTAL_TENDER_AMOUNT), skip(filter.getSkip()), limit(filter.getPageSize())) .withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).build()); return releaseAgg(agg); }