Skip to content

Commit

Permalink
Merge pull request #452 from JNU-econovation/feat/#451
Browse files Browse the repository at this point in the history
[Be/Feat] 분석 API 쿼리 개선
  • Loading branch information
hwangdaesun authored Aug 7, 2024
2 parents 5e919d4 + 24ff666 commit 4be8a29
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.gaebaljip.exceed.adapter.out.jpa.meal;

import static java.util.stream.Collectors.groupingBy;

import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Component;

import com.gaebaljip.exceed.application.domain.meal.Meal;
import com.gaebaljip.exceed.application.domain.meal.MealEntity;
import com.gaebaljip.exceed.application.domain.meal.MealFoodEntity;
import com.gaebaljip.exceed.common.annotation.Timer;

import lombok.RequiredArgsConstructor;

@Component
@RequiredArgsConstructor
public class MealFoodConverter {

private final ConsumedFoodConverter converter;

@Timer
public List<Meal> toMeals(List<MealFoodEntity> mealFoodEntities) {
Map<MealEntity, List<MealFoodEntity>> mealEntityListMap =
mealFoodEntities.stream().collect(groupingBy(MealFoodEntity::getMealEntity));
return mealEntityListMap.keySet().stream()
.map(mealEntity -> toMeal(mealEntityListMap.get(mealEntity), mealEntity.getId()))
.toList();
}

private Meal toMeal(List<MealFoodEntity> mealFoodEntities, Long mealId) {
return Meal.builder()
.id(mealId)
.mealDateTime(mealFoodEntities.get(0).getCreatedDate())
.consumedFoods(converter.toConsumedFoods(mealFoodEntities))
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,7 @@ public interface MealFoodRepository extends JpaRepository<MealFoodEntity, Long>

@Query("select mf from MealFoodEntity mf where mf.mealEntity.memberEntity = :memberEntity")
List<MealFoodEntity> findByMemberEntity(MemberEntity memberEntity);

@Query("select mft from MealFoodEntity mft join fetch mft.foodEntity where mft.id in :ids")
List<MealFoodEntity> findMFTByIdInQuery(List<Long> ids);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import com.gaebaljip.exceed.application.domain.meal.DailyMeal;
import com.gaebaljip.exceed.application.domain.meal.Meal;
import com.gaebaljip.exceed.application.domain.meal.MealEntity;
import com.gaebaljip.exceed.application.domain.meal.MealFoodEntity;
import com.gaebaljip.exceed.application.domain.member.MemberEntity;
import com.gaebaljip.exceed.application.domain.nutritionist.MonthlyMeal;
import com.gaebaljip.exceed.application.port.out.meal.DailyMealPort;
Expand All @@ -30,6 +31,8 @@ public class MealPersistenceAdapter implements MealPort, DailyMealPort, MonthlyM

private final MealRepository mealRepository;
private final MealConverter mealConverter;
private final MealFoodConverter mealFoodConverter;
private final MealFoodRepository mealFoodRepository;

@Override
public MealEntity command(MealEntity mealEntity) {
Expand All @@ -52,10 +55,12 @@ public MonthlyMeal query(MonthlyMealDTO monthlyMealDTO) {
LocalDateTime startOfMonth = date.with(TemporalAdjusters.firstDayOfMonth());
LocalDateTime endOfMonth = date.with(TemporalAdjusters.firstDayOfNextMonth());

List<MealEntity> mealEntities =
List<Long> mealIds =
mealRepository.findMealsByMemberAndMonth(
startOfMonth, endOfMonth, monthlyMealDTO.memberId());
List<Meal> meals = mealConverter.toMeals(mealEntities);
List<MealFoodEntity> mealFoodEntities = mealFoodRepository.findMFTByIdInQuery(mealIds);

List<Meal> meals = mealFoodConverter.toMeals(mealFoodEntities);
Map<LocalDate, DailyMeal> monthlyMeal =
meals.stream()
.collect(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ public interface MealRepository extends JpaRepository<MealEntity, Long> {

@Timer
@Query(
"select m from MealEntity m join fetch m.mealFoodEntity mf join fetch mf.foodEntity where m.createdDate >= :startOfMonth and m.createdDate < :endOfMonth and m.memberEntity.id = :memberId")
List<MealEntity> findMealsByMemberAndMonth(
"select m.id from MealEntity m where m.memberEntity.id = :memberId and m.createdDate >= :startOfMonth and m.createdDate < :endOfMonth")
List<Long> findMealsByMemberAndMonth(
LocalDateTime startOfMonth, LocalDateTime endOfMonth, Long memberId);

void deleteByMemberEntity(MemberEntity memberEntity);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.gaebaljip.exceed.adapter.out.jpa.meal;

import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;

import java.time.LocalDateTime;
import java.util.List;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.gaebaljip.exceed.application.domain.meal.Meal;
import com.gaebaljip.exceed.application.domain.nutritionist.MonthlyMeal;
import com.gaebaljip.exceed.common.DatabaseTest;
import com.gaebaljip.exceed.common.dto.DailyMealDTO;
import com.gaebaljip.exceed.common.dto.MonthlyMealDTO;

class MealPersistenceAdapterTest extends DatabaseTest {

@Autowired private MealPersistenceAdapter mealPersistenceAdapter;

@Test
void when_queryForDaily_expected_success() {
LocalDateTime dateTime = LocalDateTime.of(2024, 6, 10, 11, 11);
List<Meal> meals = mealPersistenceAdapter.query(new DailyMealDTO(1L, dateTime));
assertAll(
() -> assertEquals(2, meals.size()),
() -> assertEquals(1, meals.get(0).getConsumedFoods().size()),
() -> assertEquals(1, meals.get(1).getConsumedFoods().size()));
}

@Test
void when_queryForMonth_expected_success() {
LocalDateTime dateTime = LocalDateTime.of(2024, 6, 20, 23, 22);
LocalDateTime plusDateTime = dateTime.plusDays(1);
MonthlyMealDTO monthlyMealDTO = new MonthlyMealDTO(1L, dateTime);
MonthlyMeal monthlyMeal = mealPersistenceAdapter.query(monthlyMealDTO);

assertAll(
() -> assertEquals(30, monthlyMeal.getMonthlyMeal().size()),
() ->
assertEquals(
3,
monthlyMeal.getMonthlyMeal().values().stream()
.filter(dailyMeal -> dailyMeal.isEmptyMeals())
.toList()
.size()),
() ->
assertEquals(
2,
monthlyMeal
.getMonthlyMeal()
.get(dateTime.toLocalDate())
.getMeals()
.size()),
() ->
assertEquals(
2,
monthlyMeal
.getMonthlyMeal()
.get(plusDateTime.toLocalDate())
.getMeals()
.size()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,26 @@
import org.springframework.context.annotation.Import;
import org.springframework.test.context.jdbc.Sql;

import com.gaebaljip.exceed.adapter.out.jpa.food.FoodConverter;
import com.gaebaljip.exceed.adapter.out.jpa.meal.ConsumedFoodConverter;
import com.gaebaljip.exceed.adapter.out.jpa.meal.MealConverter;
import com.gaebaljip.exceed.adapter.out.jpa.meal.MealFoodConverter;
import com.gaebaljip.exceed.adapter.out.jpa.meal.MealPersistenceAdapter;
import com.gaebaljip.exceed.adapter.out.jpa.member.HistoryPersistenceAdapter;
import com.gaebaljip.exceed.application.service.member.MemberConverter;
import com.gaebaljip.exceed.config.QueryDslConfig;

@Sql("classpath:db/testData.sql")
@Import({QueryDslConfig.class, MemberConverter.class, HistoryPersistenceAdapter.class})
@Import({
QueryDslConfig.class,
MemberConverter.class,
HistoryPersistenceAdapter.class,
MealPersistenceAdapter.class,
MealConverter.class,
FoodConverter.class,
ConsumedFoodConverter.class,
MealFoodConverter.class
})
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public abstract class DatabaseTest extends ContainerTest {}

0 comments on commit 4be8a29

Please sign in to comment.