TendersAwardsYears extends GenericOCDSController { @ApiOperation(value = "Computes all available years from awards.date, tender.tenderPeriod.startDate" + "and planning.bidPlanProjectDateApprove") @RequestMapping(value = "/api/tendersAwardsYears", method = {RequestMethod.POST, RequestMethod.GET }, produces = "application/json") public List<DBObject> tendersAwardsYears() { BasicDBObject project1 = new BasicDBObject(); project1.put("tenderYear", new BasicDBObject("$cond", Arrays.asList(new BasicDBObject("$gt", Arrays.asList(MongoConstants.FieldNames.TENDER_PERIOD_START_DATE_REF, null)), new BasicDBObject("$year", MongoConstants.FieldNames.TENDER_PERIOD_START_DATE_REF), null))); project1.put("bidPlanYear", new BasicDBObject("$cond", Arrays.asList(new BasicDBObject("$gt", Arrays.asList("$planning.bidPlanProjectDateApprove", null)), new BasicDBObject("$year", "$planning.bidPlanProjectDateApprove"), null))); project1.put("awardYear", new BasicDBObject("$cond", Arrays.asList(new BasicDBObject("$gt", Arrays.asList("$awards.date", null)), new BasicDBObject("$year", "$awards.date"), null))); project1.put(Fields.UNDERSCORE_ID, 0); BasicDBObject project2 = new BasicDBObject(); project2.put("year", Arrays.asList("$tenderYear", "$awardYear", "$bidPlanYear")); Aggregation agg = Aggregation.newAggregation( project().and(MongoConstants.FieldNames.TENDER_PERIOD_START_DATE) .as(MongoConstants.FieldNames.TENDER_PERIOD_START_DATE). and("awards.date") .as("awards.date").and("planning.bidPlanProjectDateApprove"). as("planning.bidPlanProjectDateApprove"), match(new Criteria().orOperator(where(MongoConstants.FieldNames.TENDER_PERIOD_START_DATE).exists(true), where("awards.date").exists(true), where("planning.bidPlanProjectDateApprove").exists(true))), new CustomUnwindOperation("$awards", true), new CustomProjectionOperation(project1), new CustomProjectionOperation(project2), new CustomUnwindOperation("$year"), match(where("year").ne(null)), new CustomGroupingOperation(new BasicDBObject(Fields.UNDERSCORE_ID, "$year")), new CustomSortingOperation(new BasicDBObject(Fields.UNDERSCORE_ID, 1))); AggregationResults<DBObject> results = mongoTemplate.aggregate(agg, "release", DBObject.class); List<DBObject> tagCount = results.getMappedResults(); return tagCount; }  @ApiOperation(value = "Computes all available years from awards.date, tender.tenderPeriod.startDate" + "and planning.bidPlanProjectDateApprove") @RequestMapping(value = "/api/tendersAwardsYears", method = {RequestMethod.POST, RequestMethod.GET }, produces = "application/json") List<DBObject> tendersAwardsYears();  }
@Test public void tendersAwardsYears() throws Exception { final List<DBObject> response = tendersAwardsYears.tendersAwardsYears(); final DBObject first = response.get(0); int year = (int) first.get(Fields.UNDERSCORE_ID); Assert.assertEquals(2014, year); final DBObject second = response.get(1); year = (int) second.get(Fields.UNDERSCORE_ID); Assert.assertEquals(2015, year); final DBObject third = response.get(2); year = (int) third.get(Fields.UNDERSCORE_ID); Assert.assertEquals(2016, year); }