class CountPlansTendersAwardsController extends GenericOCDSController {

    @ApiOperation(value = "Count the awards and group the results by year. "
            + "The year is calculated from the awards.date field.")
    @RequestMapping(value = "/api/countAwardsByYear",
            method = {RequestMethod.POST, RequestMethod.GET}, produces = "application/json")
    public List<Document> countAwardsByYear(@ModelAttribute @Valid final YearFilterPagingRequest filter) {

        DBObject project0 = new BasicDBObject();
        project0.put("awards", 1);

        DBObject project = new BasicDBObject();
        addYearlyMonthlyProjection(filter, project, ref(MongoConstants.FieldNames.AWARDS_DATE));

        Aggregation agg = Aggregation.newAggregation(match(where("awards.0").exists(true).
                        andOperator(getDefaultFilterCriteria(filter))),
                new CustomOperation(new Document("$project", project0)),
                unwind("awards"), match(where(MongoConstants.FieldNames.AWARDS_DATE).exists(true).
                        andOperator(
                                getYearFilterCriteria(filter.awardFiltering(), MongoConstants.FieldNames.AWARDS_DATE))),
                new CustomOperation(new Document("$project", project)),
                group(getYearlyMonthlyGroupingFields(filter)).count().as(Keys.COUNT),
                transformYearlyGrouping(filter).andInclude(Keys.COUNT),
                getSortByYearMonth(filter),
                skip(filter.getSkip()),
                limit(filter.getPageSize())
        );

        return releaseAgg(agg);
    }

}