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 74a9d3969..433cdc9f9 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; public 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) {