diff options
author | Mikhail Sazanov <m@sazanof.ru> | 2022-10-18 15:56:52 +0300 |
---|---|---|
committer | Mikhail Sazanov <m@sazanof.ru> | 2022-10-18 15:56:52 +0300 |
commit | 8aa852d365cc11ab3000e6fe369962048234e126 (patch) | |
tree | a1a179a461f78c98030bacb6e6ca2fbb1d5655b3 /lib | |
parent | 5ebbb02612dac30799b478e01bbb7633e307b01c (diff) |
Add basic messages filter and search
Signed-off-by: Mikhail Sazanov <m@sazanof.ru>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Db/MessageMapper.php | 27 | ||||
-rw-r--r-- | lib/Service/Search/FilterStringParser.php | 39 | ||||
-rw-r--r-- | lib/Service/Search/SearchQuery.php | 84 |
3 files changed, 149 insertions, 1 deletions
diff --git a/lib/Db/MessageMapper.php b/lib/Db/MessageMapper.php index ee3b8d6cb..63d0e1e13 100644 --- a/lib/Db/MessageMapper.php +++ b/lib/Db/MessageMapper.php @@ -726,6 +726,13 @@ class MessageMapper extends QBMapper { $qb->expr()->eq('m.mailbox_id', $qb->createNamedParameter($mailbox->getId()), IQueryBuilder::PARAM_INT) ); + if (!empty($query->getTags())) { + $select->innerJoin('m', 'mail_message_tags', 'tags', 'm.message_id = tags.imap_message_id'); + $select->andWhere( + $qb->expr()->in('tags.tag_id', $qb->createNamedParameter($query->getTags(), IQueryBuilder::PARAM_STR_ARRAY)) + ); + } + if (!empty($query->getFrom())) { $select->andWhere( $qb->expr()->in('r0.email', $qb->createNamedParameter($query->getFrom(), IQueryBuilder::PARAM_STR_ARRAY)) @@ -761,11 +768,31 @@ class MessageMapper extends QBMapper { ); } + if (!empty($query->getStart())) { + $select->andWhere( + $qb->expr()->gte('m.sent_at', $qb->createNamedParameter($query->getStart()), IQueryBuilder::PARAM_INT) + ); + } + + if (!empty($query->getEnd())) { + $select->andWhere( + $qb->expr()->lte('m.sent_at', $qb->createNamedParameter($query->getEnd()), IQueryBuilder::PARAM_INT) + ); + } + + + if ($query->getHasAttachments()) { + $select->andWhere( + $qb->expr()->eq('m.flag_attachments', $qb->createNamedParameter($query->getHasAttachments(), IQueryBuilder::PARAM_INT)) + ); + } + if ($query->getCursor() !== null) { $select->andWhere( $qb->expr()->lt('m.sent_at', $qb->createNamedParameter($query->getCursor(), IQueryBuilder::PARAM_INT)) ); } + // createParameter if ($uids !== null) { $select->andWhere( diff --git a/lib/Service/Search/FilterStringParser.php b/lib/Service/Search/FilterStringParser.php index 997fb077e..a9745efe6 100644 --- a/lib/Service/Search/FilterStringParser.php +++ b/lib/Service/Search/FilterStringParser.php @@ -56,6 +56,9 @@ class FilterStringParser { 'read' => Flag::is(Flag::SEEN), 'unread' => Flag::not(Flag::SEEN), 'important' => Flag::is(Flag::IMPORTANT), + 'is_important' => FlagExpression::and( + Flag::is(Flag::IMPORTANT) + ) ]; switch ($type) { @@ -98,7 +101,41 @@ class FilterStringParser { $query->addBcc($param); return true; case 'subject': - $query->addSubject($param); + // from frontend part subject:My+search+text + $subject = str_replace('+', ' ', $param); + $query->addSubject($subject); + return true; + case 'tags': + $tags = explode(',', $param); + $query->setTags($tags); + return true; + case 'start': + if (!empty($param)) { + $query->setStart($param); + } + return true; + case 'end': + if (!empty($param)) { + $query->setEnd($param); + } + return true; + case 'flags': + $flagArray = explode(',', $param); + foreach ($flagArray as $flagItem) { + if (array_key_exists($flagItem, $flagMap)) { + /** @var Flag $flag */ + $flag = $flagMap[$flagItem]; + if ($flag instanceof Flag) { + $query->addFlag($flag); + } elseif ($flag instanceof FlagExpression) { + $query->addFlagExpression($flag); + } + } elseif ($flagItem === 'attachments') { + $query->setHasAttachments(true); + } + } + + return true; } diff --git a/lib/Service/Search/SearchQuery.php b/lib/Service/Search/SearchQuery.php index 78b5cc90c..7e56497a3 100644 --- a/lib/Service/Search/SearchQuery.php +++ b/lib/Service/Search/SearchQuery.php @@ -53,6 +53,18 @@ class SearchQuery { /** @var string[] */ private $textTokens = []; + /** @var array[] */ + private $tags = []; + + /** @var string|null */ + private $start; + + /** @var string|null */ + private $end; + + /** @var bool */ + private $hasAttachments = false; + /** * @return int|null * @psalm-mutation-free @@ -153,4 +165,76 @@ class SearchQuery { public function addTextToken(string $textToken): void { $this->textTokens[] = $textToken; } + + /** + * Get tags to search query + * + * @return array + */ + public function getTags(): array { + return $this->tags; + } + + /** + * Set tags to search query + * + * @param array $tags + * @return void + */ + public function setTags(array $tags): void { + $this->tags = $tags; + } + + /** + * Get start date to search query + * + * @return string|null + */ + public function getStart(): ?string { + return $this->start; + } + + /** + * Set start date to search query + * + * @param string $start + * @return void + */ + public function setStart(string $start): void { + $this->start = $start; + } + + /** + * Get start date to search query + * + * @return string|null + */ + public function getEnd(): ?string { + return $this->end; + } + + /** + * Set end date to search query + * + * @param string $end + * @return void + */ + public function setEnd(string $end): void { + $this->end = $end; + } + + /** + * @return bool|null + * @psalm-mutation-free + */ + public function getHasAttachments(): ?bool { + return $this->hasAttachments; + } + + /** + * @param bool $hasAttachments + */ + public function setHasAttachments(bool $hasAttachments): void { + $this->hasAttachments = $hasAttachments; + } } |