|
|
|
@ -25,6 +25,7 @@ |
|
|
|
*/ |
|
|
|
namespace OC\Files\Cache; |
|
|
|
|
|
|
|
use OC\Files\Search\SearchBinaryOperator; |
|
|
|
use OC\SystemConfig; |
|
|
|
use OCP\DB\QueryBuilder\IQueryBuilder; |
|
|
|
use OCP\Files\Cache\ICache; |
|
|
|
@ -47,7 +48,7 @@ class QuerySearchHelper { |
|
|
|
ISearchComparison::COMPARE_GREATER_THAN => 'gt', |
|
|
|
ISearchComparison::COMPARE_GREATER_THAN_EQUAL => 'gte', |
|
|
|
ISearchComparison::COMPARE_LESS_THAN => 'lt', |
|
|
|
ISearchComparison::COMPARE_LESS_THAN_EQUAL => 'lte' |
|
|
|
ISearchComparison::COMPARE_LESS_THAN_EQUAL => 'lte', |
|
|
|
]; |
|
|
|
|
|
|
|
protected static $searchOperatorNegativeMap = [ |
|
|
|
@ -56,7 +57,7 @@ class QuerySearchHelper { |
|
|
|
ISearchComparison::COMPARE_GREATER_THAN => 'lte', |
|
|
|
ISearchComparison::COMPARE_GREATER_THAN_EQUAL => 'lt', |
|
|
|
ISearchComparison::COMPARE_LESS_THAN => 'gte', |
|
|
|
ISearchComparison::COMPARE_LESS_THAN_EQUAL => 'lt' |
|
|
|
ISearchComparison::COMPARE_LESS_THAN_EQUAL => 'lt', |
|
|
|
]; |
|
|
|
|
|
|
|
public const TAG_FAVORITE = '_$!<Favorite>!$_'; |
|
|
|
@ -124,7 +125,7 @@ class QuerySearchHelper { |
|
|
|
} else { |
|
|
|
throw new \InvalidArgumentException('Binary operators inside "not" is not supported'); |
|
|
|
} |
|
|
|
// no break
|
|
|
|
// no break
|
|
|
|
case ISearchBinaryOperator::OPERATOR_AND: |
|
|
|
return call_user_func_array([$expr, 'andX'], $this->searchOperatorArrayToDBExprArray($builder, $operator->getArguments())); |
|
|
|
case ISearchBinaryOperator::OPERATOR_OR: |
|
|
|
@ -195,7 +196,8 @@ class QuerySearchHelper { |
|
|
|
'size' => 'integer', |
|
|
|
'tagname' => 'string', |
|
|
|
'favorite' => 'boolean', |
|
|
|
'fileid' => 'integer' |
|
|
|
'fileid' => 'integer', |
|
|
|
'storage' => 'integer', |
|
|
|
]; |
|
|
|
$comparisons = [ |
|
|
|
'mimetype' => ['eq', 'like'], |
|
|
|
@ -205,7 +207,8 @@ class QuerySearchHelper { |
|
|
|
'size' => ['eq', 'gt', 'lt', 'gte', 'lte'], |
|
|
|
'tagname' => ['eq', 'like'], |
|
|
|
'favorite' => ['eq'], |
|
|
|
'fileid' => ['eq'] |
|
|
|
'fileid' => ['eq'], |
|
|
|
'storage' => ['eq'], |
|
|
|
]; |
|
|
|
|
|
|
|
if (!isset($types[$operator->getField()])) { |
|
|
|
@ -274,12 +277,6 @@ class QuerySearchHelper { |
|
|
|
|
|
|
|
$query = $builder->selectFileCache('file'); |
|
|
|
|
|
|
|
$storageFilters = array_map(function (ICache $cache) use ($builder) { |
|
|
|
return $cache->getQueryFilterForStorage($builder); |
|
|
|
}, $caches); |
|
|
|
|
|
|
|
$query->andWhere($query->expr()->orX(...$storageFilters)); |
|
|
|
|
|
|
|
if ($this->shouldJoinTags($searchQuery->getSearchOperation())) { |
|
|
|
$user = $searchQuery->getUser(); |
|
|
|
if ($user === null) { |
|
|
|
@ -300,6 +297,11 @@ class QuerySearchHelper { |
|
|
|
$query->andWhere($searchExpr); |
|
|
|
} |
|
|
|
|
|
|
|
$storageFilters = array_map(function (ICache $cache) { |
|
|
|
return $cache->getQueryFilterForStorage(); |
|
|
|
}, $caches); |
|
|
|
$query->andWhere($this->searchOperatorToDBExpr($builder, new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_OR, $storageFilters))); |
|
|
|
|
|
|
|
if ($searchQuery->limitToHome() && ($this instanceof HomeCache)) { |
|
|
|
$query->andWhere($builder->expr()->like('path', $query->expr()->literal('files/%'))); |
|
|
|
} |
|
|
|
|