diff options
Diffstat (limited to 'lib/private/Files/Cache/QuerySearchHelper.php')
-rw-r--r-- | lib/private/Files/Cache/QuerySearchHelper.php | 32 |
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()])) { |