Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package clap.server.adapter.inbound.web.statistics;

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;
Expand All @@ -13,21 +15,28 @@
@RequiredArgsConstructor
public class StatisticsFindController {
private final PeriodTaskRequestUsecase periodTaskRequestUsecase;
// private final PeriodTaskProcessUsecase periodTaskProcessUsecase;
// private final CategoryTaskRequestUsecase categoryTaskRequestUsecase;
// private final SubCategoryTaskRequestUsecase subCategoryTaskRequestUsecase;
private final PeriodTaskProcessUsecase periodTaskProcessUsecase;
private final CategoryTaskRequestUsecase categoryTaskRequestUsecase;
private final SubCategoryTaskRequestUsecase subCategoryTaskRequestUsecase;
// private final ManagerTaskProcessUsecase managerTaskProcessUsecase;

@GetMapping(value = "/task/statistics/task-requests-by-period")
public Map<String, Long> aggregatePeriodTaskRequest(@RequestParam String period) {
return periodTaskRequestUsecase.periodTaskRequestAggregate(period);
}

// @GetMapping("/task/statistics/task-processed-by-period")
//
// @GetMapping("/task/statistics/task-requests-by-category")
//
// @GetMapping("/task/statistics/task-requests-by-subcategory")
//
@GetMapping("/task/statistics/task-processed-by-period")
public Map<String, Long> aggregatePeriodTaskProcess(@RequestParam String period) {
return periodTaskProcessUsecase.periodTaskProcessAggregate(period);
}
Comment on lines +28 to +31
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

응답시 따로 상태코드는 안보내는 것으로 보이는데 Http 상태 코드가 리턴되어야 하지 않을까 싶습네요.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

응답시 따로 상태코드는 안보내는 것으로 보이는데 Http 상태 코드가 리턴되어야 하지 않을까 싶습네요.

저희 공통 응답 양식 클래스 올라오면 한번에 바꾸려고 했는데 혹시 그거 사용 안하기로 했었나요?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네넵 성공의 경우에는 http 상태코드와 응답결과만 보내주면 될 것 같습니다.

{
   "결과":"result"
}

오류처리에 대한 부분만 처리하기로 했습니다.

@GetMapping("/task/statistics/task-requests-by-category")
public Map<String, Long> aggregateCategoryTaskRequest(@RequestParam String period) {
return categoryTaskRequestUsecase.categoryTaskRequestAggregate(period);
}

@GetMapping("/task/statistics/task-requests-by-subcategory")
public Map<String, Long> aggregateSubCategoryTaskRequest(@RequestParam String period, @RequestParam String mainCategory) {
return subCategoryTaskRequestUsecase.subCategoryTaskRequestAggregate(period, mainCategory);
}
// @GetMapping("/task/statistics/tasks-processed-by-manager")
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package clap.server.adapter.outbound.infrastructure.elastic;

import clap.server.adapter.outbound.infrastructure.elastic.dto.PeriodConfig;
import clap.server.adapter.outbound.infrastructure.elastic.entity.ElasticTask;
import clap.server.adapter.outbound.infrastructure.elastic.repository.TaskElasticRepository;
import clap.server.application.port.outbound.task.ElasticTaskPort;
import clap.server.common.annotation.architecture.InfrastructureAdapter;
import co.elastic.clients.elasticsearch._types.aggregations.AggregationBuilders;
import co.elastic.clients.elasticsearch._types.aggregations.CalendarInterval;
import co.elastic.clients.elasticsearch._types.aggregations.MultiBucketBase;
import lombok.RequiredArgsConstructor;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchAggregations;
Expand All @@ -32,30 +30,111 @@ public void saveStatistics(List<ElasticTask> statistics) {

@Override
public Map<String, Long> findPeriodTaskRequestByPeriod(String period) {
PeriodConfig periodConfig = getPeriodConfig(period);
PeriodConfig periodConfig = PeriodConfig.valueOf(period.toUpperCase());

NativeQuery query = buildQuery(periodConfig);
ElasticsearchAggregations result = executeQuery(query);
return processResults(result, periodConfig);
NativeQuery query = buildPeriodTaskRequestQuery(periodConfig);
return getPeriodTaskResults(executeQuery(query), periodConfig);
}

private PeriodConfig getPeriodConfig(String period) {
if (period.equals("week")) {
return new PeriodConfig(14, CalendarInterval.Day, 0, 10);
}
return new PeriodConfig(1, CalendarInterval.Hour, 11, 19);
@Override
public Map<String, Long> findPeriodTaskProcessByPeriod(String period) {
PeriodConfig periodConfig = PeriodConfig.valueOf(period.toUpperCase());

NativeQuery query = buildPeriodTaskProcessQuery(periodConfig);
return getPeriodTaskResults(executeQuery(query), periodConfig);
}

@Override
public Map<String, Long> findCategoryTaskRequestByPeriod(String period) {
PeriodConfig periodConfig = PeriodConfig.valueOf(period.toUpperCase());

NativeQuery query = buildCategoryTaskRequestQuery(periodConfig);
return getCategoryTaskResults(executeQuery(query));
}

private NativeQuery buildQuery(PeriodConfig config) {
@Override
public Map<String, Long> 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
.range(r -> r
.date(d -> d
.field("created_at")
.gte(String.valueOf(LocalDate.now().minusDays(config.daysToSubtract()))))))
.withAggregation("period_task_request", AggregationBuilders.dateHistogram()
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract()))))))
.withAggregation("period_task", AggregationBuilders.dateHistogram()
.field("created_at")
.calendarInterval(config.getCalendarInterval())
.build()._toAggregation())
.withMaxResults(0)
.build();
}

private NativeQuery buildPeriodTaskProcessQuery(PeriodConfig config) {
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 statusQuery = NativeQuery.builder()
.withQuery(q -> q
.term(v -> v
.field("status")
.value("completed"))).build();

return NativeQuery.builder()
.withQuery(q -> q
.bool(b -> b
.must(rangeQuery.getQuery(), statusQuery.getQuery()))
)
.withAggregation("period_task", AggregationBuilders.dateHistogram()
.field("created_at")
.calendarInterval(config.calendarInterval())
.calendarInterval(config.getCalendarInterval())
.build()._toAggregation())
.withMaxResults(0)
.build();
}

private NativeQuery buildCategoryTaskRequestQuery(PeriodConfig config) {
return NativeQuery.builder()
.withQuery(q -> q
.range(r -> r
.date(d -> d
.field("created_at")
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract()))))))
.withAggregation("category_task", AggregationBuilders.terms()
.field("main_category")
.build()._toAggregation())
.withMaxResults(0)
.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();
Expand All @@ -67,9 +146,9 @@ private ElasticsearchAggregations executeQuery(NativeQuery query) {
.getAggregations();
}

private Map<String, Long> processResults(ElasticsearchAggregations aggregations, PeriodConfig config) {
private Map<String, Long> getPeriodTaskResults(ElasticsearchAggregations aggregations, PeriodConfig config) {
return new TreeMap<>(
aggregations.get("period_task_request")
aggregations.get("period_task")
.aggregation()
.getAggregate()
.dateHistogram()
Expand All @@ -78,11 +157,27 @@ private Map<String, Long> processResults(ElasticsearchAggregations aggregations,
.stream()
.collect(Collectors.toMap(
bucket -> bucket.keyAsString().substring(
config.substringStart(),
config.substringEnd()
config.getSubstringStart(),
config.getSubstringEnd()
),
MultiBucketBase::docCount
))
);
}

private Map<String, Long> getCategoryTaskResults(ElasticsearchAggregations aggregations) {
return new TreeMap<>(
aggregations.get("category_task")
.aggregation()
.getAggregate()
.sterms()
.buckets()
.array()
.stream()
.collect(Collectors.toMap(
bucket -> bucket.key().stringValue(),
MultiBucketBase::docCount
))
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package clap.server.adapter.outbound.infrastructure.elastic;

import co.elastic.clients.elasticsearch._types.aggregations.CalendarInterval;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum PeriodConfig {
DAY(1, CalendarInterval.Hour, 11, 19),
WEEK(14, CalendarInterval.Day, 0, 10);

private final long daysToSubtract;
private final CalendarInterval calendarInterval;
private final int substringStart;
private final int substringEnd;

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public ElasticTask(TaskEntity taskEntity) {
this.taskCode = taskEntity.getTaskCode();
this.mainCategory = taskEntity.getCategory().getMainCategory().getName();
this.subCategory = taskEntity.getCategory().getName();
this.status = taskEntity.getStatus().getName();
this.status = taskEntity.getStatus().getStatusName().name().toLowerCase();
this.processor = taskEntity.getProcessor().getNickname();
this.createdAt = taskEntity.getCreatedAt().toLocalDate();
}
Comment on lines 33 to 39
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 status 엔티티는 삭제되었고 taskEntity.getTaskStatus() 를 통해 상태를 가져올 수 있을 것 같습니다.
develop 브랜치 rebase 해주신 후 수정 부탁드리겠습니다~

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus;
import clap.server.adapter.outbound.persistense.mapper.MemberPersistenceMapper;
import clap.server.adapter.outbound.persistense.repository.member.MemberRepository;
import clap.server.application.port.outbound.member.LoadMemberPort;
import clap.server.application.port.outbound.member.CommandMemberPort;
import clap.server.application.port.outbound.member.LoadMemberPort;
import clap.server.common.annotation.architecture.PersistenceAdapter;
import clap.server.domain.model.member.Member;
import lombok.RequiredArgsConstructor;
Expand All @@ -26,7 +26,7 @@ public Optional<Member> findById(final Long id) {

@Override
public Optional<Member> findActiveMemberById(final Long id) {
Optional<MemberEntity> memberEntity = memberRepository.findByMemberStatusAndMemberId(MemberStatus.ACTIVE, id);
Optional<MemberEntity> memberEntity = memberRepository.findByStatusAndMemberId(MemberStatus.ACTIVE, id);
return memberEntity.map(memberPersistenceMapper::toDomain);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@

@Repository
public interface MemberRepository extends JpaRepository<MemberEntity, Long> {
Optional<MemberEntity> findByMemberStatusAndMemberId(MemberStatus memberStatus, Long memberId);
Optional<MemberEntity> findByStatusAndMemberId(MemberStatus Status, Long memberId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package clap.server.application.port.inbound.statistics;

import java.util.Map;

public interface CategoryTaskRequestUsecase {
Map<String, Long> categoryTaskRequestAggregate(String period);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package clap.server.application.port.inbound.statistics;

import java.util.Map;

public interface PeriodTaskProcessUsecase {
Map<String, Long> periodTaskProcessAggregate(String period);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package clap.server.application.port.inbound.statistics;

import java.util.Map;

public interface SubCategoryTaskRequestUsecase {
Map<String, Long> subCategoryTaskRequestAggregate(String period, String mainCategory);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,10 @@ public interface ElasticTaskPort {
void saveStatistics(List<ElasticTask> statistics);

Map<String, Long> findPeriodTaskRequestByPeriod(String period);

Map<String, Long> findPeriodTaskProcessByPeriod(String period);

Map<String, Long> findCategoryTaskRequestByPeriod(String period);

Map<String, Long> findSubCategoryTaskRequestByPeriod(String period, String mainCategory);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package clap.server.application.statistics;

import clap.server.application.port.inbound.statistics.CategoryTaskRequestUsecase;
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 CategoryTaskRequestService implements CategoryTaskRequestUsecase {
private final ElasticTaskPort elasticTaskPort;

@Override
public Map<String, Long> categoryTaskRequestAggregate(String period) {
return elasticTaskPort.findCategoryTaskRequestByPeriod(period);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package clap.server.application.statistics;

import clap.server.application.port.inbound.statistics.PeriodTaskProcessUsecase;
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 PeriodTaskProcessService implements PeriodTaskProcessUsecase {
private final ElasticTaskPort elasticTaskPort;

@Override
public Map<String, Long> periodTaskProcessAggregate(String period) {
return elasticTaskPort.findPeriodTaskProcessByPeriod(period);
}
}
Original file line number Diff line number Diff line change
@@ -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<String, Long> subCategoryTaskRequestAggregate(String period, String mainCategory) {
return elasticTaskPort.findSubCategoryTaskRequestByPeriod(period, mainCategory);
}
}
Loading