From 9bb0679915c802bdcf08c2757697fb00497650ba Mon Sep 17 00:00:00 2001 From: hse_sadunaev Date: Mon, 1 Jun 2026 18:43:26 +0300 Subject: [PATCH] dau: b --- .../lectures/lesson7/dau/DauServiceImpl.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/main/java/hse/java/lectures/lesson7/dau/DauServiceImpl.java diff --git a/src/main/java/hse/java/lectures/lesson7/dau/DauServiceImpl.java b/src/main/java/hse/java/lectures/lesson7/dau/DauServiceImpl.java new file mode 100644 index 0000000..ad86d43 --- /dev/null +++ b/src/main/java/hse/java/lectures/lesson7/dau/DauServiceImpl.java @@ -0,0 +1,51 @@ +package hse.java.lectures.lesson7.dau; + +import java.time.Clock; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public class DauServiceImpl implements DauService { + + private final Clock clock; + private final ConcurrentHashMap>> data = new ConcurrentHashMap<>(); + + public DauServiceImpl() { + this(Clock.systemDefaultZone()); + } + + public DauServiceImpl(Clock clock) { + this.clock = clock; + } + + @Override + public void postEvent(Event event) { + LocalDate today = LocalDate.now(clock); + data.computeIfAbsent(today, k -> new ConcurrentHashMap<>()) + .computeIfAbsent(event.authorId(), k -> ConcurrentHashMap.newKeySet()) + .add(event.userId()); + } + + @Override + public Map getDauStatistics(List authorIds) { + LocalDate yesterday = LocalDate.now(clock).minusDays(1); + Map result = new HashMap<>(); + var yesterdayData = data.getOrDefault(yesterday, new ConcurrentHashMap<>()); + for (int authorId : authorIds) { + Set users = yesterdayData.get(authorId); + result.put(authorId, users == null ? 0L : (long) users.size()); + } + return result; + } + + @Override + public Long getAuthorDauStatistics(int authorId) { + LocalDate yesterday = LocalDate.now(clock).minusDays(1); + var yesterdayData = data.getOrDefault(yesterday, new ConcurrentHashMap<>()); + Set users = yesterdayData.get(authorId); + return users == null ? 0L : (long) users.size(); + } +}