From 8f7fb1e4c4647a1cd4b086fb32c2562cbd471833 Mon Sep 17 00:00:00 2001 From: bosik Date: Sun, 5 Apr 2020 02:15:26 +0300 Subject: [PATCH] getFoodStatistics() method introduced --- .../base/dish/DishBaseLocalService.java | 2 +- .../features/diary/DiaryLocalService.java | 56 ++++++++++++++++++- .../web/backend/features/diary/DiaryRest.java | 12 ++++ .../features/diary/DiaryLocalServiceTest.java | 4 +- .../business/diary/records/MealRecord.java | 5 ++ .../entities/business/dishbase/DishItem.java | 2 +- 6 files changed, 76 insertions(+), 5 deletions(-) diff --git a/portable/comp-server-core/src/main/java/org/bosik/diacomp/web/backend/features/base/dish/DishBaseLocalService.java b/portable/comp-server-core/src/main/java/org/bosik/diacomp/web/backend/features/base/dish/DishBaseLocalService.java index dd0884417..534ef64f0 100644 --- a/portable/comp-server-core/src/main/java/org/bosik/diacomp/web/backend/features/base/dish/DishBaseLocalService.java +++ b/portable/comp-server-core/src/main/java/org/bosik/diacomp/web/backend/features/base/dish/DishBaseLocalService.java @@ -74,7 +74,7 @@ private static Versioned convert(DishEntity e) return result; } - private static List> convert(List list) + public static List> convert(List list) { return list.stream().map(DishBaseLocalService::convert).collect(toList()); } diff --git a/portable/comp-server-core/src/main/java/org/bosik/diacomp/web/backend/features/diary/DiaryLocalService.java b/portable/comp-server-core/src/main/java/org/bosik/diacomp/web/backend/features/diary/DiaryLocalService.java index fac478493..d876d17fd 100644 --- a/portable/comp-server-core/src/main/java/org/bosik/diacomp/web/backend/features/diary/DiaryLocalService.java +++ b/portable/comp-server-core/src/main/java/org/bosik/diacomp/web/backend/features/diary/DiaryLocalService.java @@ -19,7 +19,10 @@ import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import org.bosik.diacomp.core.entities.business.FoodMassed; import org.bosik.diacomp.core.entities.business.diary.DiaryRecord; +import org.bosik.diacomp.core.entities.business.diary.records.MealRecord; +import org.bosik.diacomp.core.entities.business.dishbase.DishItem; import org.bosik.diacomp.core.persistence.parsers.Parser; import org.bosik.diacomp.core.persistence.parsers.ParserDiaryRecord; import org.bosik.diacomp.core.persistence.serializers.Serializer; @@ -27,6 +30,8 @@ import org.bosik.diacomp.core.services.ObjectService; import org.bosik.diacomp.core.utils.Utils; import org.bosik.diacomp.web.backend.common.UserDataService; +import org.bosik.diacomp.web.backend.features.base.dish.DishBaseLocalService; +import org.bosik.diacomp.web.backend.features.base.dish.DishEntityRepository; import org.bosik.merklesync.HashUtils; import org.bosik.merklesync.MerkleTree; import org.bosik.merklesync.Versioned; @@ -36,8 +41,10 @@ import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.SortedMap; import java.util.TimeZone; import java.util.TreeMap; @@ -57,7 +64,10 @@ public class DiaryLocalService implements UserDataService private DiaryEntityRepository repository; @Autowired - private CachedDiaryHashTree cachedHashTree; + private DishEntityRepository dishEntityRepository; + + @Autowired + private CachedDiaryHashTree cachedHashTree; private static Versioned convert(DiaryEntity e) { @@ -144,6 +154,50 @@ public List> findAll(int userId, boolean includeRemoved) } } + public Map getFoodStatistics(int userId, Date from, Date to) + { + final List entities = repository.findByUserIdAndTimeCacheBetweenAndDeletedIsFalseOrderByTimeCache( + userId, from, to); + final List diaryFood = convert(entities).stream() + .filter(v -> v.getData() instanceof MealRecord) + .flatMap(v -> ((MealRecord) v.getData()).getItems().stream()) + .collect(toList()); + + final List> dishes = DishBaseLocalService.convert( + dishEntityRepository.findByUserIdAndDeletedIsFalse(userId)); + + final Map stat = new HashMap<>(); + + for (FoodMassed food : diaryFood) + { + final Optional> dish = dishes.stream() + .filter(d -> d.getData().getName().equals(food.getName())) + .findFirst(); + + if (dish.isPresent()) + { + for (FoodMassed dishItem : dish.get().getData().getContent()) + { + final String name = dishItem.getName(); + double mass = food.getMass() / dish.get().getData().getRealMass() * dishItem.getMass(); + + stat.putIfAbsent(name, 0.0); + stat.put(name, stat.getOrDefault(name, 0.0) + mass); + } + } + else + { + final String name = food.getName(); + double mass = food.getMass(); + + stat.putIfAbsent(name, 0.0); + stat.put(name, stat.getOrDefault(name, 0.0) + mass); + } + } + + return stat; + } + @Override public Versioned findById(int userId, String id) { diff --git a/portable/comp-server-rest/src/main/java/org/bosik/diacomp/web/backend/features/diary/DiaryRest.java b/portable/comp-server-rest/src/main/java/org/bosik/diacomp/web/backend/features/diary/DiaryRest.java index 310502ea6..c1c49967a 100644 --- a/portable/comp-server-rest/src/main/java/org/bosik/diacomp/web/backend/features/diary/DiaryRest.java +++ b/portable/comp-server-rest/src/main/java/org/bosik/diacomp/web/backend/features/diary/DiaryRest.java @@ -64,6 +64,18 @@ public Integer count() return diaryService.count(userId); } + @GetMapping("/foodstat") + public Map getFoodStatistics( + @RequestParam("from") String parTimeFrom, + @RequestParam("to") String parTimeTo) + { + final int userId = getUserId(); + final Date timeFrom = Utils.parseTimeUTC(parTimeFrom); + final Date timeTo = Utils.parseTimeUTC(parTimeTo); + + return diaryService.getFoodStatistics(userId, timeFrom, timeTo); + } + @GetMapping("/count/{prefix}") public Integer count(@PathVariable(name = "prefix") String prefix) { diff --git a/portable/comp-server-rest/src/test/java/org/bosik/diacomp/web/backend/features/diary/DiaryLocalServiceTest.java b/portable/comp-server-rest/src/test/java/org/bosik/diacomp/web/backend/features/diary/DiaryLocalServiceTest.java index 391e59401..9cd7d58c7 100644 --- a/portable/comp-server-rest/src/test/java/org/bosik/diacomp/web/backend/features/diary/DiaryLocalServiceTest.java +++ b/portable/comp-server-rest/src/test/java/org/bosik/diacomp/web/backend/features/diary/DiaryLocalServiceTest.java @@ -96,9 +96,9 @@ public void export() static class Config { @Bean - public DiaryLocalService employeeService(DiaryEntityRepository repository, CachedDiaryHashTree cachedHashTree) + public DiaryLocalService diaryLocalService(DiaryEntityRepository repository, CachedDiaryHashTree cachedHashTree) { - return new DiaryLocalService(repository, cachedHashTree); + return new DiaryLocalService(repository, null, cachedHashTree); } } } diff --git a/portable/comp-transfer/src/main/java/org/bosik/diacomp/core/entities/business/diary/records/MealRecord.java b/portable/comp-transfer/src/main/java/org/bosik/diacomp/core/entities/business/diary/records/MealRecord.java index 6ae5fbf17..2c3ab84e8 100644 --- a/portable/comp-transfer/src/main/java/org/bosik/diacomp/core/entities/business/diary/records/MealRecord.java +++ b/portable/comp-transfer/src/main/java/org/bosik/diacomp/core/entities/business/diary/records/MealRecord.java @@ -154,6 +154,11 @@ public FoodMassed get(int index) return items.get(index); } + public List getItems() + { + return items; + } + public int count() { return items.size(); diff --git a/portable/comp-transfer/src/main/java/org/bosik/diacomp/core/entities/business/dishbase/DishItem.java b/portable/comp-transfer/src/main/java/org/bosik/diacomp/core/entities/business/dishbase/DishItem.java index 7ae3b2704..6e534cd86 100644 --- a/portable/comp-transfer/src/main/java/org/bosik/diacomp/core/entities/business/dishbase/DishItem.java +++ b/portable/comp-transfer/src/main/java/org/bosik/diacomp/core/entities/business/dishbase/DishItem.java @@ -52,7 +52,7 @@ public class DishItem implements NamedRelative, Serializable // ================================ GET / SET ================================ - private double getRealMass() + public double getRealMass() { if (mass != null) {