Skip to content

Commit 036dbf1

Browse files
committed
CLAP-94 Feature: 1차 카테고리별 작업 요청량 조회 API 조회
<footer> - 관련: #48
1 parent b38c32c commit 036dbf1

File tree

7 files changed

+101
-34
lines changed

7 files changed

+101
-34
lines changed

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
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;
56
import clap.server.common.annotation.architecture.WebAdapter;
@@ -14,7 +15,7 @@
1415
public class StatisticsFindController {
1516
private final PeriodTaskRequestUsecase periodTaskRequestUsecase;
1617
private final PeriodTaskProcessUsecase periodTaskProcessUsecase;
17-
// private final CategoryTaskRequestUsecase categoryTaskRequestUsecase;
18+
private final CategoryTaskRequestUsecase categoryTaskRequestUsecase;
1819
// private final SubCategoryTaskRequestUsecase subCategoryTaskRequestUsecase;
1920
// private final ManagerTaskProcessUsecase managerTaskProcessUsecase;
2021

@@ -27,8 +28,11 @@ public Map<String, Long> aggregatePeriodTaskRequest(@RequestParam String period)
2728
public Map<String, Long> aggregatePeriodTaskProcess(@RequestParam String period) {
2829
return periodTaskProcessUsecase.periodTaskProcessAggregate(period);
2930
}
30-
// @GetMapping("/task/statistics/task-requests-by-category")
31-
//
31+
@GetMapping("/task/statistics/task-requests-by-category")
32+
public Map<String, Long> aggregateCategoryTaskRequest(@RequestParam String period) {
33+
return categoryTaskRequestUsecase.categoryTaskRequestAggregate(period);
34+
}
35+
3236
// @GetMapping("/task/statistics/task-requests-by-subcategory")
3337
//
3438
// @GetMapping("/task/statistics/tasks-processed-by-manager")

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

Lines changed: 48 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,26 @@ 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));
5653
}
5754

5855
private NativeQuery buildPeriodTaskRequestQuery(PeriodConfig config) {
@@ -61,10 +58,10 @@ private NativeQuery buildPeriodTaskRequestQuery(PeriodConfig config) {
6158
.range(r -> r
6259
.date(d -> d
6360
.field("created_at")
64-
.gte(String.valueOf(LocalDate.now().minusDays(config.daysToSubtract()))))))
61+
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract()))))))
6562
.withAggregation("period_task", AggregationBuilders.dateHistogram()
6663
.field("created_at")
67-
.calendarInterval(config.calendarInterval())
64+
.calendarInterval(config.getCalendarInterval())
6865
.build()._toAggregation())
6966
.withMaxResults(0)
7067
.build();
@@ -76,7 +73,7 @@ private NativeQuery buildPeriodTaskProcessQuery(PeriodConfig config) {
7673
.range(r -> r
7774
.date(d -> d
7875
.field("created_at")
79-
.gte(String.valueOf(LocalDate.now().minusDays(config.daysToSubtract())))))).build();
76+
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract())))))).build();
8077
NativeQuery statusQuery = NativeQuery.builder()
8178
.withQuery(q -> q
8279
.term(v -> v
@@ -87,10 +84,24 @@ private NativeQuery buildPeriodTaskProcessQuery(PeriodConfig config) {
8784
.withQuery(q -> q
8885
.bool(b -> b
8986
.must(rangeQuery.getQuery(), statusQuery.getQuery()))
90-
)
87+
)
9188
.withAggregation("period_task", AggregationBuilders.dateHistogram()
9289
.field("created_at")
93-
.calendarInterval(config.calendarInterval())
90+
.calendarInterval(config.getCalendarInterval())
91+
.build()._toAggregation())
92+
.withMaxResults(0)
93+
.build();
94+
}
95+
96+
private NativeQuery buildCategoryTaskRequestQuery(PeriodConfig config) {
97+
return NativeQuery.builder()
98+
.withQuery(q -> q
99+
.range(r -> r
100+
.date(d -> d
101+
.field("created_at")
102+
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract()))))))
103+
.withAggregation("category_task", AggregationBuilders.terms()
104+
.field("main_category")
94105
.build()._toAggregation())
95106
.withMaxResults(0)
96107
.build();
@@ -102,7 +113,7 @@ private ElasticsearchAggregations executeQuery(NativeQuery query) {
102113
.getAggregations();
103114
}
104115

105-
private Map<String, Long> processResults(ElasticsearchAggregations aggregations, PeriodConfig config) {
116+
private Map<String, Long> getPeriodTaskResults(ElasticsearchAggregations aggregations, PeriodConfig config) {
106117
return new TreeMap<>(
107118
aggregations.get("period_task")
108119
.aggregation()
@@ -113,11 +124,27 @@ private Map<String, Long> processResults(ElasticsearchAggregations aggregations,
113124
.stream()
114125
.collect(Collectors.toMap(
115126
bucket -> bucket.keyAsString().substring(
116-
config.substringStart(),
117-
config.substringEnd()
127+
config.getSubstringStart(),
128+
config.getSubstringEnd()
118129
),
119130
MultiBucketBase::docCount
120131
))
121132
);
122133
}
134+
135+
private Map<String, Long> getCategoryTaskResults(ElasticsearchAggregations aggregations) {
136+
return new TreeMap<>(
137+
aggregations.get("category_task")
138+
.aggregation()
139+
.getAggregate()
140+
.sterms()
141+
.buckets()
142+
.array()
143+
.stream()
144+
.collect(Collectors.toMap(
145+
bucket -> bucket.key().stringValue(),
146+
MultiBucketBase::docCount
147+
))
148+
);
149+
}
123150
}
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+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ 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);
1416
}
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+
}

0 commit comments

Comments
 (0)