diff --git a/src/main/java/clap/server/adapter/inbound/web/statistics/StatisticsFindController.java b/src/main/java/clap/server/adapter/inbound/web/statistics/StatisticsFindController.java index 726d9797..c2d25831 100644 --- a/src/main/java/clap/server/adapter/inbound/web/statistics/StatisticsFindController.java +++ b/src/main/java/clap/server/adapter/inbound/web/statistics/StatisticsFindController.java @@ -3,6 +3,7 @@ import clap.server.application.port.inbound.statistics.CategoryTaskRequestUsecase; import clap.server.application.port.inbound.statistics.PeriodTaskProcessUsecase; import clap.server.application.port.inbound.statistics.PeriodTaskRequestUsecase; +import clap.server.application.port.inbound.statistics.SubCategoryTaskRequestUsecase; import clap.server.common.annotation.architecture.WebAdapter; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; @@ -16,7 +17,7 @@ public class StatisticsFindController { private final PeriodTaskRequestUsecase periodTaskRequestUsecase; private final PeriodTaskProcessUsecase periodTaskProcessUsecase; private final CategoryTaskRequestUsecase categoryTaskRequestUsecase; -// private final SubCategoryTaskRequestUsecase subCategoryTaskRequestUsecase; + private final SubCategoryTaskRequestUsecase subCategoryTaskRequestUsecase; // private final ManagerTaskProcessUsecase managerTaskProcessUsecase; @GetMapping(value = "/task/statistics/task-requests-by-period") @@ -33,7 +34,9 @@ public Map aggregateCategoryTaskRequest(@RequestParam String perio return categoryTaskRequestUsecase.categoryTaskRequestAggregate(period); } -// @GetMapping("/task/statistics/task-requests-by-subcategory") -// + @GetMapping("/task/statistics/task-requests-by-subcategory") + public Map aggregateSubCategoryTaskRequest(@RequestParam String period, @RequestParam String mainCategory) { + return subCategoryTaskRequestUsecase.subCategoryTaskRequestAggregate(period, mainCategory); + } // @GetMapping("/task/statistics/tasks-processed-by-manager") } \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/outbound/infrastructure/elastic/ElasticTaskAdapter.java b/src/main/java/clap/server/adapter/outbound/infrastructure/elastic/ElasticTaskAdapter.java index 698b19a8..ef5bee3e 100644 --- a/src/main/java/clap/server/adapter/outbound/infrastructure/elastic/ElasticTaskAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/infrastructure/elastic/ElasticTaskAdapter.java @@ -52,6 +52,14 @@ public Map findCategoryTaskRequestByPeriod(String period) { return getCategoryTaskResults(executeQuery(query)); } + @Override + public Map findSubCategoryTaskRequestByPeriod(String period, String mainCategory) { + PeriodConfig periodConfig = PeriodConfig.valueOf(period.toUpperCase()); + + NativeQuery query = buildSubCategoryTaskRequestQuery(periodConfig, mainCategory); + return getCategoryTaskResults(executeQuery(query)); + } + private NativeQuery buildPeriodTaskRequestQuery(PeriodConfig config) { return NativeQuery.builder() .withQuery(q -> q @@ -107,6 +115,31 @@ private NativeQuery buildCategoryTaskRequestQuery(PeriodConfig config) { .build(); } + private NativeQuery buildSubCategoryTaskRequestQuery(PeriodConfig config, String mainCategory) { + NativeQuery rangeQuery = NativeQuery.builder() + .withQuery(q -> q + .range(r -> r + .date(d -> d + .field("created_at") + .gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract())))))).build(); + NativeQuery categoryQuery = NativeQuery.builder() + .withQuery(q -> q + .term(v -> v + .field("main_category") + .value(mainCategory))).build(); + + return NativeQuery.builder() + .withQuery(q -> q + .bool(b -> b + .must(rangeQuery.getQuery(), categoryQuery.getQuery())) + ) + .withAggregation("category_task", AggregationBuilders.terms() + .field("sub_category") + .build()._toAggregation()) + .withMaxResults(0) + .build(); + } + private ElasticsearchAggregations executeQuery(NativeQuery query) { return (ElasticsearchAggregations) elasticsearchOperations .search(query, ElasticTask.class) diff --git a/src/main/java/clap/server/application/port/inbound/statistics/SubCategoryTaskRequestUsecase.java b/src/main/java/clap/server/application/port/inbound/statistics/SubCategoryTaskRequestUsecase.java new file mode 100644 index 00000000..acb2dfa2 --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/statistics/SubCategoryTaskRequestUsecase.java @@ -0,0 +1,7 @@ +package clap.server.application.port.inbound.statistics; + +import java.util.Map; + +public interface SubCategoryTaskRequestUsecase { + Map subCategoryTaskRequestAggregate(String period, String mainCategory); +} diff --git a/src/main/java/clap/server/application/port/outbound/task/ElasticTaskPort.java b/src/main/java/clap/server/application/port/outbound/task/ElasticTaskPort.java index 21d9feb8..0778c8ac 100644 --- a/src/main/java/clap/server/application/port/outbound/task/ElasticTaskPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/ElasticTaskPort.java @@ -13,4 +13,6 @@ public interface ElasticTaskPort { Map findPeriodTaskProcessByPeriod(String period); Map findCategoryTaskRequestByPeriod(String period); + + Map findSubCategoryTaskRequestByPeriod(String period, String mainCategory); } diff --git a/src/main/java/clap/server/application/statistics/SubCategoryTaskRequestService.java b/src/main/java/clap/server/application/statistics/SubCategoryTaskRequestService.java new file mode 100644 index 00000000..fa57c48d --- /dev/null +++ b/src/main/java/clap/server/application/statistics/SubCategoryTaskRequestService.java @@ -0,0 +1,19 @@ +package clap.server.application.statistics; + +import clap.server.application.port.inbound.statistics.SubCategoryTaskRequestUsecase; +import clap.server.application.port.outbound.task.ElasticTaskPort; +import clap.server.common.annotation.architecture.ApplicationService; +import lombok.RequiredArgsConstructor; + +import java.util.Map; + +@ApplicationService +@RequiredArgsConstructor +public class SubCategoryTaskRequestService implements SubCategoryTaskRequestUsecase { + private final ElasticTaskPort elasticTaskPort; + + @Override + public Map subCategoryTaskRequestAggregate(String period, String mainCategory) { + return elasticTaskPort.findSubCategoryTaskRequestByPeriod(period, mainCategory); + } +}