package de.asideas.crowdsource.repository;
import de.asideas.crowdsource.domain.model.ProjectEntity;
import de.asideas.crowdsource.domain.shared.ProjectStatus;
import de.asideas.crowdsource.presentation.statistics.results.BarChartStatisticsResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import java.util.List;
import java.util.stream.Collectors;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;
public class ProjectRepositoryImpl implements ProjectRepositoryCustom {
private final MongoTemplate mongoTemplate;
@Autowired
public ProjectRepositoryImpl(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
@Override
public List<BarChartStatisticsResult> sumProjectsGroupedByStatus() {
AggregationResults<ProjectPerStatusResult> aggregationResults = mongoTemplate.aggregate(
newAggregation(
ProjectEntity.class,
group("status").count().as("count")
), ProjectPerStatusResult.class);
return aggregationResults.getMappedResults().stream()
.map(res -> new BarChartStatisticsResult(res.getId().name(), res.getId().getDisplayName(), res.getCount()))
.collect(Collectors.toList());
}
static class ProjectPerStatusResult {
private ProjectStatus id;
private Long count;
private ProjectPerStatusResult() {
}
public ProjectPerStatusResult(ProjectStatus id, Long count) {
this.id = id;
this.count = count;
}
public ProjectStatus getId() {
return id;
}
public Long getCount() {
return count;
}
}
}