package de.asideas.crowdsource.service.statistics; import de.asideas.crowdsource.domain.model.UserEntity; import de.asideas.crowdsource.presentation.statistics.requests.TimeRangedStatisticsRequest; import de.asideas.crowdsource.presentation.statistics.results.LineChartStatisticsResult; import de.asideas.crowdsource.repository.UserRepository; import org.joda.time.Instant; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.Future; import java.util.stream.Collectors; import static de.asideas.crowdsource.domain.shared.StatisticsTypes.SUM_REGISTERED_USER; import static de.asideas.crowdsource.service.statistics.StatisticsActionUtil.fillMap; import static de.asideas.crowdsource.service.statistics.StatisticsActionUtil.formatDate; import static de.asideas.crowdsource.service.statistics.StatisticsActionUtil.getDefaultMap; @Async @Service public class RegisteredUserSumAction { private final UserRepository userRepository; @Autowired public RegisteredUserSumAction(UserRepository userRepository) { this.userRepository = userRepository; } public Future<LineChartStatisticsResult> getCountOfRegisteredUsersByTimeRange(TimeRangedStatisticsRequest request) { final List<UserEntity> userEntityList = userRepository.findByCreatedDateBetween(request.getStartDate(), request.getEndDate()); final Map<String, Long> map = userEntityList.stream().collect(Collectors.groupingBy( p -> formatDate(p.getCreatedDate()), Collectors.reducing( 0L, t -> 1L, Long::sum ) )); final Map<String, Long> resultMap = fillMap( getDefaultMap(request), map ); final LineChartStatisticsResult result = new LineChartStatisticsResult(SUM_REGISTERED_USER.getDisplayName(), resultMap); return new AsyncResult<>(result); } }