Skip to content

Commit

Permalink
Feat : CHAT-278-BE-API-태그-상세-통계 (#42)
Browse files Browse the repository at this point in the history
* Feat : DTO 추가

상세 태그 통계를 위해 detailstatic dto 추가

* Feat : 컨트롤러 계층, 서비스 계층 추가

기존의 매서드 최대한 활용해서 구현, 파라매터로 카테고리까지 받게, 전체에대한 부분은 자바 로직을 통해 구현

* Chore : 주석 추가

코드 로직 설명 추가 (추후 리펙토링시 용이하기 위함)

* Chore : 주석 추가

* Feat : 수정사항 반영

DTO 맵으로 바꾸고, 맵을 순회하며 데이터 매핑 + 전체 따로 처리

* Feat : 수정사항 반영

DTO 맵으로 바꾸고, 맵을 순회하며 데이터 매핑 + 전체 따로 처리

* Feat : 수정사항 반영

DTO 구조 바꾸고, 변경에따른 tagList 로직 수정

* Feat : 레포지토리 수정사항 반영

레포지토리 일반적으로 수정, 쿼리문이 복잡해서 맞는지 모르겠음..

* Revert "Feat : 수정사항 반영"

This reverts commit 9153cf6.

# Conflicts:
#	src/main/java/com/kuit/chatdiary/repository/diary/TagSearchRepository.java

* Fix : 커밋 취소

* Fix : 커밋 취소

* Feat : 서비스 단 수정

statisticsMap을 채우는 부분에서, ".limit(10)" 추가를 통해 결과 10개로 제한

* Chore : 주석 추가

* Feat : 컨트롤러 도메인 커밋 반영

* Fix : 커밋 수정사항 반영
  • Loading branch information
Mouon authored Feb 7, 2024
1 parent 820bc0d commit b504edd
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.kuit.chatdiary.controller.diary;

import com.kuit.chatdiary.dto.diary.TagDetailStatisticsResponseDTO;
import com.kuit.chatdiary.dto.diary.TagStatisticsWithDateResponseDTO;
import com.kuit.chatdiary.service.diary.DiaryTagStatisticsService;
import org.springframework.http.ResponseEntity;
Expand All @@ -22,4 +23,14 @@ public ResponseEntity<TagStatisticsWithDateResponseDTO> getTagStatistics(
TagStatisticsWithDateResponseDTO tagStatistics = diaryTagStatisticsService.calculateTagStatistics(memberId, type);
return ResponseEntity.ok(tagStatistics);
}

@GetMapping("/tags/detail")
public ResponseEntity<TagDetailStatisticsResponseDTO> geDetailTagStatistics(
@RequestParam("memberId") Long memberId,
@RequestParam("type") String type
) {
TagDetailStatisticsResponseDTO tagStatistics = diaryTagStatisticsService.calculateTagDetailStatistics(memberId,type);
return ResponseEntity.ok(tagStatistics);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.kuit.chatdiary.dto.diary;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;


@Getter
@Setter
@AllArgsConstructor
public class TagDetailStatisticsDTO {
private Long count;
private String[] tags;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.kuit.chatdiary.dto.diary;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

import java.sql.Date;
import java.util.List;
import java.util.Map;


@AllArgsConstructor
@Getter
@Setter
public class TagDetailStatisticsResponseDTO {
private Date startDate;
private Date endDate;
private Map<String, List<TagDetailStatisticsDTO>> statistics;

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,5 @@ public List<Object[]> findTagStatisticsByMember(Long memberId, Date startDate, D
.getResultList();
}


}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.kuit.chatdiary.service.diary;

import com.kuit.chatdiary.dto.diary.DateRangeDTO;
import com.kuit.chatdiary.dto.diary.TagStatisticResponseDTO;
import com.kuit.chatdiary.dto.diary.TagStatisticsWithDateResponseDTO;
import com.kuit.chatdiary.dto.diary.*;
import com.kuit.chatdiary.repository.diary.DiaryTagRepository;
import org.springframework.stereotype.Service;

import java.sql.Date;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;

@Service
public class DiaryTagStatisticsService {
Expand All @@ -30,6 +29,46 @@ public TagStatisticsWithDateResponseDTO calculateTagStatistics(Long memberId, St
return new TagStatisticsWithDateResponseDTO(dateRange.getStartDate(), dateRange.getEndDate(), statisticsList);
}


public TagDetailStatisticsResponseDTO calculateTagDetailStatistics(Long memberId, String type) {
LocalDate localDate = LocalDate.now();
DateRangeDTO dateRange = calculateDateRangeBasedOnType(type, localDate);
List<Object[]> tagStatistics = diaryTagRepository.findTagStatisticsByMember(memberId, dateRange.getStartDate(), dateRange.getEndDate());

Map<String, Map<Long, Set<String>>> categoryTagsMap = new HashMap<>();

String[] categories = {"전체", "인물", "행동", "장소", "감정"};
for (String category : categories) {
categoryTagsMap.put(category, new HashMap<>());
}

for (Object[] row : tagStatistics) {
String category = (String) row[0];
String tagName = (String) row[1];
Long count = (Long) row[2];

/** 카테고리로 맵 가져오기
* 맵에 특정 카운트에 해당하는 집합 없으면 새로운 집합 생성
* */
categoryTagsMap.get(category).computeIfAbsent(count, k -> new HashSet<>()).add(tagName);
categoryTagsMap.get("전체").computeIfAbsent(count, k -> new HashSet<>()).add(tagName);
}

Map<String, List<TagDetailStatisticsDTO>> statisticsMap = new HashMap<>();
for (String category : categories) {
List<TagDetailStatisticsDTO> categoryStats = categoryTagsMap.get(category).entrySet().stream()
.map(entry -> new TagDetailStatisticsDTO(entry.getKey(), entry.getValue().toArray(new String[0])))
.sorted(Comparator.comparingLong(TagDetailStatisticsDTO::getCount).reversed())
.limit(10)
.collect(Collectors.toList());
statisticsMap.put(category, categoryStats);
}

return new TagDetailStatisticsResponseDTO(dateRange.getStartDate(),dateRange.getEndDate(), statisticsMap);
}



/** 타입별로 나눠서 계산 */
private DateRangeDTO calculateDateRangeBasedOnType(String type, LocalDate date) {
return staticsType(type, date);
Expand All @@ -51,17 +90,34 @@ private List<TagStatisticResponseDTO> buildStatisticsList(List<Object[]> tagStat
return statisticsList;
}

/** 리스안에 리스트안에 리스트 와 같은 구조로 가공 (맵안에 맵)
* 카테고리로 한번 묶고, 횟수로 그 안에서 그릅화 하기 위함
* */
private List<TagDetailStatisticsDTO> buildDetailStatisticsList(Map<Long, List<String>> countMap) {
return countMap.entrySet().stream()
.map(entry -> new TagDetailStatisticsDTO(entry.getKey(), entry.getValue().toArray(new String[0])))
.sorted(Comparator.comparingLong(TagDetailStatisticsDTO::getCount).reversed())
.collect(Collectors.toList());
}


/** 정렬 메서드 */
private void sortStatisticsListByCount(List<TagStatisticResponseDTO> statisticsList) {
statisticsList.sort(Comparator.comparingLong(TagStatisticResponseDTO::getCount).reversed());
}
/** 정렬 메서드 재탕
* 반환하는 자료형이 달라서 분리됬지만.. 리펙시 묶는것 가능해보임
* */
private void sortDetailStatisticsListByCount(List<TagDetailStatisticsDTO> statisticsList) {
statisticsList.sort(Comparator.comparingLong(TagDetailStatisticsDTO::getCount).reversed());
}

public double calculatePercent(long count,long totalTags){
double percentage = (double) count / totalTags * 100;
return Math.round(percentage*10)/10.0;
}

/** 코드 더 줄이고 싶은데.. */
/** 통계에서 공통으로 사용하는 메서드라 나중에 합칠수 있을듯*/
public DateRangeDTO staticsType(String type, LocalDate localDate){
LocalDate startDate;
LocalDate endDate;
Expand Down

0 comments on commit b504edd

Please sign in to comment.