11package clap .server .adapter .outbound .infrastructure .elastic ;
22
3- import clap .server .adapter .outbound .infrastructure .elastic .dto .PeriodConfig ;
43import clap .server .adapter .outbound .infrastructure .elastic .entity .ElasticTask ;
54import clap .server .adapter .outbound .infrastructure .elastic .repository .TaskElasticRepository ;
65import clap .server .application .port .outbound .task .ElasticTaskPort ;
76import clap .server .common .annotation .architecture .InfrastructureAdapter ;
87import co .elastic .clients .elasticsearch ._types .aggregations .AggregationBuilders ;
9- import co .elastic .clients .elasticsearch ._types .aggregations .CalendarInterval ;
108import co .elastic .clients .elasticsearch ._types .aggregations .MultiBucketBase ;
119import lombok .RequiredArgsConstructor ;
1210import 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}
0 commit comments