Skip to content

Commit a76ec0f

Browse files
Merge pull request #49 from TaskFlow-CLAP/CLAP-94
CLAP-94 1차 카테고리별 작업 요청량 조회
2 parents b38c32c + cb244ee commit a76ec0f

File tree

9 files changed

+168
-37
lines changed

9 files changed

+168
-37
lines changed

src/main/java/clap/server/adapter/inbound/web/statistics/StatisticsFindController.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package clap.server.adapter.inbound.web.statistics;
22

3+
import clap.server.application.port.inbound.statistics.CategoryTaskRequestUsecase;
34
import clap.server.application.port.inbound.statistics.PeriodTaskProcessUsecase;
45
import clap.server.application.port.inbound.statistics.PeriodTaskRequestUsecase;
6+
import clap.server.application.port.inbound.statistics.SubCategoryTaskRequestUsecase;
57
import clap.server.common.annotation.architecture.WebAdapter;
68
import lombok.RequiredArgsConstructor;
79
import org.springframework.web.bind.annotation.GetMapping;
@@ -14,8 +16,8 @@
1416
public class StatisticsFindController {
1517
private final PeriodTaskRequestUsecase periodTaskRequestUsecase;
1618
private final PeriodTaskProcessUsecase periodTaskProcessUsecase;
17-
// private final CategoryTaskRequestUsecase categoryTaskRequestUsecase;
18-
// private final SubCategoryTaskRequestUsecase subCategoryTaskRequestUsecase;
19+
private final CategoryTaskRequestUsecase categoryTaskRequestUsecase;
20+
private final SubCategoryTaskRequestUsecase subCategoryTaskRequestUsecase;
1921
// private final ManagerTaskProcessUsecase managerTaskProcessUsecase;
2022

2123
@GetMapping(value = "/task/statistics/task-requests-by-period")
@@ -27,9 +29,14 @@ public Map<String, Long> aggregatePeriodTaskRequest(@RequestParam String period)
2729
public Map<String, Long> aggregatePeriodTaskProcess(@RequestParam String period) {
2830
return periodTaskProcessUsecase.periodTaskProcessAggregate(period);
2931
}
30-
// @GetMapping("/task/statistics/task-requests-by-category")
31-
//
32-
// @GetMapping("/task/statistics/task-requests-by-subcategory")
33-
//
32+
@GetMapping("/task/statistics/task-requests-by-category")
33+
public Map<String, Long> aggregateCategoryTaskRequest(@RequestParam String period) {
34+
return categoryTaskRequestUsecase.categoryTaskRequestAggregate(period);
35+
}
36+
37+
@GetMapping("/task/statistics/task-requests-by-subcategory")
38+
public Map<String, Long> aggregateSubCategoryTaskRequest(@RequestParam String period, @RequestParam String mainCategory) {
39+
return subCategoryTaskRequestUsecase.subCategoryTaskRequestAggregate(period, mainCategory);
40+
}
3441
// @GetMapping("/task/statistics/tasks-processed-by-manager")
3542
}

src/main/java/clap/server/adapter/outbound/infrastructure/elastic/ElasticTaskAdapter.java

Lines changed: 81 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package clap.server.adapter.outbound.infrastructure.elastic;
22

3-
import clap.server.adapter.outbound.infrastructure.elastic.dto.PeriodConfig;
43
import clap.server.adapter.outbound.infrastructure.elastic.entity.ElasticTask;
54
import clap.server.adapter.outbound.infrastructure.elastic.repository.TaskElasticRepository;
65
import clap.server.application.port.outbound.task.ElasticTaskPort;
76
import clap.server.common.annotation.architecture.InfrastructureAdapter;
87
import co.elastic.clients.elasticsearch._types.aggregations.AggregationBuilders;
9-
import co.elastic.clients.elasticsearch._types.aggregations.CalendarInterval;
108
import co.elastic.clients.elasticsearch._types.aggregations.MultiBucketBase;
119
import lombok.RequiredArgsConstructor;
1210
import org.springframework.data.elasticsearch.client.elc.ElasticsearchAggregations;
@@ -32,27 +30,34 @@ public void saveStatistics(List<ElasticTask> statistics) {
3230

3331
@Override
3432
public Map<String, Long> findPeriodTaskRequestByPeriod(String period) {
35-
PeriodConfig periodConfig = getPeriodConfig(period);
33+
PeriodConfig periodConfig = PeriodConfig.valueOf(period.toUpperCase());
3634

3735
NativeQuery query = buildPeriodTaskRequestQuery(periodConfig);
38-
ElasticsearchAggregations result = executeQuery(query);
39-
return processResults(result, periodConfig);
36+
return getPeriodTaskResults(executeQuery(query), periodConfig);
4037
}
4138

4239
@Override
4340
public Map<String, Long> findPeriodTaskProcessByPeriod(String period) {
44-
PeriodConfig periodConfig = getPeriodConfig(period);
41+
PeriodConfig periodConfig = PeriodConfig.valueOf(period.toUpperCase());
4542

4643
NativeQuery query = buildPeriodTaskProcessQuery(periodConfig);
47-
ElasticsearchAggregations result = executeQuery(query);
48-
return processResults(result, periodConfig);
44+
return getPeriodTaskResults(executeQuery(query), periodConfig);
4945
}
5046

51-
private PeriodConfig getPeriodConfig(String period) {
52-
if (period.equals("week")) {
53-
return new PeriodConfig(14, CalendarInterval.Day, 0, 10);
54-
}
55-
return new PeriodConfig(1, CalendarInterval.Hour, 11, 19);
47+
@Override
48+
public Map<String, Long> findCategoryTaskRequestByPeriod(String period) {
49+
PeriodConfig periodConfig = PeriodConfig.valueOf(period.toUpperCase());
50+
51+
NativeQuery query = buildCategoryTaskRequestQuery(periodConfig);
52+
return getCategoryTaskResults(executeQuery(query));
53+
}
54+
55+
@Override
56+
public Map<String, Long> findSubCategoryTaskRequestByPeriod(String period, String mainCategory) {
57+
PeriodConfig periodConfig = PeriodConfig.valueOf(period.toUpperCase());
58+
59+
NativeQuery query = buildSubCategoryTaskRequestQuery(periodConfig, mainCategory);
60+
return getCategoryTaskResults(executeQuery(query));
5661
}
5762

5863
private NativeQuery buildPeriodTaskRequestQuery(PeriodConfig config) {
@@ -61,10 +66,10 @@ private NativeQuery buildPeriodTaskRequestQuery(PeriodConfig config) {
6166
.range(r -> r
6267
.date(d -> d
6368
.field("created_at")
64-
.gte(String.valueOf(LocalDate.now().minusDays(config.daysToSubtract()))))))
69+
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract()))))))
6570
.withAggregation("period_task", AggregationBuilders.dateHistogram()
6671
.field("created_at")
67-
.calendarInterval(config.calendarInterval())
72+
.calendarInterval(config.getCalendarInterval())
6873
.build()._toAggregation())
6974
.withMaxResults(0)
7075
.build();
@@ -76,7 +81,7 @@ private NativeQuery buildPeriodTaskProcessQuery(PeriodConfig config) {
7681
.range(r -> r
7782
.date(d -> d
7883
.field("created_at")
79-
.gte(String.valueOf(LocalDate.now().minusDays(config.daysToSubtract())))))).build();
84+
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract())))))).build();
8085
NativeQuery statusQuery = NativeQuery.builder()
8186
.withQuery(q -> q
8287
.term(v -> v
@@ -87,10 +92,49 @@ private NativeQuery buildPeriodTaskProcessQuery(PeriodConfig config) {
8792
.withQuery(q -> q
8893
.bool(b -> b
8994
.must(rangeQuery.getQuery(), statusQuery.getQuery()))
90-
)
95+
)
9196
.withAggregation("period_task", AggregationBuilders.dateHistogram()
9297
.field("created_at")
93-
.calendarInterval(config.calendarInterval())
98+
.calendarInterval(config.getCalendarInterval())
99+
.build()._toAggregation())
100+
.withMaxResults(0)
101+
.build();
102+
}
103+
104+
private NativeQuery buildCategoryTaskRequestQuery(PeriodConfig config) {
105+
return NativeQuery.builder()
106+
.withQuery(q -> q
107+
.range(r -> r
108+
.date(d -> d
109+
.field("created_at")
110+
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract()))))))
111+
.withAggregation("category_task", AggregationBuilders.terms()
112+
.field("main_category")
113+
.build()._toAggregation())
114+
.withMaxResults(0)
115+
.build();
116+
}
117+
118+
private NativeQuery buildSubCategoryTaskRequestQuery(PeriodConfig config, String mainCategory) {
119+
NativeQuery rangeQuery = NativeQuery.builder()
120+
.withQuery(q -> q
121+
.range(r -> r
122+
.date(d -> d
123+
.field("created_at")
124+
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract())))))).build();
125+
NativeQuery categoryQuery = NativeQuery.builder()
126+
.withQuery(q -> q
127+
.term(v -> v
128+
.field("main_category")
129+
.value(mainCategory))).build();
130+
131+
return NativeQuery.builder()
132+
.withQuery(q -> q
133+
.bool(b -> b
134+
.must(rangeQuery.getQuery(), categoryQuery.getQuery()))
135+
)
136+
.withAggregation("category_task", AggregationBuilders.terms()
137+
.field("sub_category")
94138
.build()._toAggregation())
95139
.withMaxResults(0)
96140
.build();
@@ -102,7 +146,7 @@ private ElasticsearchAggregations executeQuery(NativeQuery query) {
102146
.getAggregations();
103147
}
104148

105-
private Map<String, Long> processResults(ElasticsearchAggregations aggregations, PeriodConfig config) {
149+
private Map<String, Long> getPeriodTaskResults(ElasticsearchAggregations aggregations, PeriodConfig config) {
106150
return new TreeMap<>(
107151
aggregations.get("period_task")
108152
.aggregation()
@@ -113,11 +157,27 @@ private Map<String, Long> processResults(ElasticsearchAggregations aggregations,
113157
.stream()
114158
.collect(Collectors.toMap(
115159
bucket -> bucket.keyAsString().substring(
116-
config.substringStart(),
117-
config.substringEnd()
160+
config.getSubstringStart(),
161+
config.getSubstringEnd()
118162
),
119163
MultiBucketBase::docCount
120164
))
121165
);
122166
}
167+
168+
private Map<String, Long> getCategoryTaskResults(ElasticsearchAggregations aggregations) {
169+
return new TreeMap<>(
170+
aggregations.get("category_task")
171+
.aggregation()
172+
.getAggregate()
173+
.sterms()
174+
.buckets()
175+
.array()
176+
.stream()
177+
.collect(Collectors.toMap(
178+
bucket -> bucket.key().stringValue(),
179+
MultiBucketBase::docCount
180+
))
181+
);
182+
}
123183
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package clap.server.adapter.outbound.infrastructure.elastic;
2+
3+
import co.elastic.clients.elasticsearch._types.aggregations.CalendarInterval;
4+
import lombok.Getter;
5+
import lombok.RequiredArgsConstructor;
6+
7+
@Getter
8+
@RequiredArgsConstructor
9+
public enum PeriodConfig {
10+
DAY(1, CalendarInterval.Hour, 11, 19),
11+
WEEK(14, CalendarInterval.Day, 0, 10);
12+
13+
private final long daysToSubtract;
14+
private final CalendarInterval calendarInterval;
15+
private final int substringStart;
16+
private final int substringEnd;
17+
18+
}

src/main/java/clap/server/adapter/outbound/infrastructure/elastic/dto/PeriodConfig.java

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package clap.server.application.port.inbound.statistics;
2+
3+
import java.util.Map;
4+
5+
public interface CategoryTaskRequestUsecase {
6+
Map<String, Long> categoryTaskRequestAggregate(String period);
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package clap.server.application.port.inbound.statistics;
2+
3+
import java.util.Map;
4+
5+
public interface SubCategoryTaskRequestUsecase {
6+
Map<String, Long> subCategoryTaskRequestAggregate(String period, String mainCategory);
7+
}

src/main/java/clap/server/application/port/outbound/task/ElasticTaskPort.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,8 @@ public interface ElasticTaskPort {
1111
Map<String, Long> findPeriodTaskRequestByPeriod(String period);
1212

1313
Map<String, Long> findPeriodTaskProcessByPeriod(String period);
14+
15+
Map<String, Long> findCategoryTaskRequestByPeriod(String period);
16+
17+
Map<String, Long> findSubCategoryTaskRequestByPeriod(String period, String mainCategory);
1418
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package clap.server.application.statistics;
2+
3+
import clap.server.application.port.inbound.statistics.CategoryTaskRequestUsecase;
4+
import clap.server.application.port.outbound.task.ElasticTaskPort;
5+
import clap.server.common.annotation.architecture.ApplicationService;
6+
import lombok.RequiredArgsConstructor;
7+
8+
import java.util.Map;
9+
10+
@ApplicationService
11+
@RequiredArgsConstructor
12+
public class CategoryTaskRequestService implements CategoryTaskRequestUsecase {
13+
private final ElasticTaskPort elasticTaskPort;
14+
15+
@Override
16+
public Map<String, Long> categoryTaskRequestAggregate(String period) {
17+
return elasticTaskPort.findCategoryTaskRequestByPeriod(period);
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package clap.server.application.statistics;
2+
3+
import clap.server.application.port.inbound.statistics.SubCategoryTaskRequestUsecase;
4+
import clap.server.application.port.outbound.task.ElasticTaskPort;
5+
import clap.server.common.annotation.architecture.ApplicationService;
6+
import lombok.RequiredArgsConstructor;
7+
8+
import java.util.Map;
9+
10+
@ApplicationService
11+
@RequiredArgsConstructor
12+
public class SubCategoryTaskRequestService implements SubCategoryTaskRequestUsecase {
13+
private final ElasticTaskPort elasticTaskPort;
14+
15+
@Override
16+
public Map<String, Long> subCategoryTaskRequestAggregate(String period, String mainCategory) {
17+
return elasticTaskPort.findSubCategoryTaskRequestByPeriod(period, mainCategory);
18+
}
19+
}

0 commit comments

Comments
 (0)