aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Files/Cache/QuerySearchHelper.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/private/Files/Cache/QuerySearchHelper.php')
-rw-r--r--lib/private/Files/Cache/QuerySearchHelper.php32
1 files changed, 30 insertions, 2 deletions
diff --git a/lib/private/Files/Cache/QuerySearchHelper.php b/lib/private/Files/Cache/QuerySearchHelper.php
index 931f258ec5b..7d8098f0efa 100644
--- a/lib/private/Files/Cache/QuerySearchHelper.php
+++ b/lib/private/Files/Cache/QuerySearchHelper.php
@@ -49,6 +49,8 @@ class QuerySearchHelper {
ISearchComparison::COMPARE_LESS_THAN_EQUAL => 'lt'
];
+ const TAG_FAVORITE = '_$!<Favorite>!$_';
+
/** @var IMimeTypeLoader */
private $mimetypeLoader;
@@ -61,6 +63,23 @@ class QuerySearchHelper {
$this->mimetypeLoader = $mimetypeLoader;
}
+ /**
+ * Whether or not the tag tables should be joined to complete the search
+ *
+ * @param ISearchOperator $operator
+ * @return boolean
+ */
+ public function shouldJoinTags(ISearchOperator $operator) {
+ if ($operator instanceof ISearchBinaryOperator) {
+ return array_reduce($operator->getArguments(), function ($shouldJoin, ISearchOperator $operator) {
+ return $shouldJoin || $this->shouldJoinTags($operator);
+ }, false);
+ } else if ($operator instanceof ISearchComparison) {
+ return $operator->getField() === 'tagname' || $operator->getField() === 'favorite';
+ }
+ return false;
+ }
+
public function searchOperatorToDBExpr(IQueryBuilder $builder, ISearchOperator $operator) {
$expr = $builder->expr();
if ($operator instanceof ISearchBinaryOperator) {
@@ -116,6 +135,11 @@ class QuerySearchHelper {
throw new \InvalidArgumentException('Unsupported query value for mimetype: ' . $value . ', only values in the format "mime/type" or "mime/%" are supported');
}
}
+ } else if ($field === 'favorite') {
+ $field = 'tag.category';
+ $value = self::TAG_FAVORITE;
+ } else if ($field === 'tagname') {
+ $field = 'tag.category';
}
return [$field, $value, $type];
}
@@ -125,13 +149,17 @@ class QuerySearchHelper {
'mimetype' => 'string',
'mtime' => 'integer',
'name' => 'string',
- 'size' => 'integer'
+ 'size' => 'integer',
+ 'tagname' => 'string',
+ 'favorite' => 'boolean'
];
$comparisons = [
'mimetype' => ['eq', 'like'],
'mtime' => ['eq', 'gt', 'lt', 'gte', 'lte'],
'name' => ['eq', 'like'],
- 'size' => ['eq', 'gt', 'lt', 'gte', 'lte']
+ 'size' => ['eq', 'gt', 'lt', 'gte', 'lte'],
+ 'tagname' => ['eq', 'like'],
+ 'favorite' => ['eq'],
];
if (!isset($types[$operator->getField()])) {