statisticsDao = $statisticsDao; } #[\Override] public function prepare(Account $account, array $incomingMailboxes, array $outgoingMailboxes, array $messages): void { /** @var string[] $senders */ $senders = array_unique(array_map(static fn (Message $message) => $message->getFrom()->first()->getEmail(), array_filter($messages, static fn (Message $message) => $message->getFrom()->first() !== null && $message->getFrom()->first()->getEmail() !== null))); $this->totalMessages = $this->statisticsDao->getNumberOfMessagesGrouped($incomingMailboxes, $senders); $this->repliedMessages = $this->statisticsDao->getNumberOfMessagesWithFlagGrouped($incomingMailboxes, 'answered', $senders); } #[\Override] public function extract(Message $message): array { $sender = $message->getFrom()->first(); if ($sender === null) { throw new RuntimeException('This should not happen'); } $email = $sender->getEmail(); $total = $this->totalMessages[$email] ?? 0; // Prevent division by zero and just say no emails are read if ($total === 0) { return [0]; } return [($this->repliedMessages[$email] ?? 0) / $total]; } }