Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/mail.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMikhail Sazanov <m@sazanof.ru>2022-10-18 15:56:52 +0300
committerMikhail Sazanov <m@sazanof.ru>2022-10-18 15:56:52 +0300
commit8aa852d365cc11ab3000e6fe369962048234e126 (patch)
treea1a179a461f78c98030bacb6e6ca2fbb1d5655b3 /lib
parent5ebbb02612dac30799b478e01bbb7633e307b01c (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.php27
-rw-r--r--lib/Service/Search/FilterStringParser.php39
-rw-r--r--lib/Service/Search/SearchQuery.php84
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;
+ }
}