Example usage for org.springframework.data.mongodb.core.aggregation Fields from

List of usage examples for org.springframework.data.mongodb.core.aggregation Fields from

Introduction

In this page you can find the example usage for org.springframework.data.mongodb.core.aggregation Fields from.

Prototype

public static Fields from(Field... fields) 

Source Link

Document

Creates a new Fields instance from the given Fields .

Usage

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);
}