diff options
author | Robin Appelman <robin@icewind.nl> | 2021-08-23 16:01:03 +0300 |
---|---|---|
committer | Robin Appelman <robin@icewind.nl> | 2021-08-26 20:07:52 +0300 |
commit | 735105932680718e443cc6b9a883792d3e35729d (patch) | |
tree | 6d057ebe9247ee86a5a28dc65045a1025d83a68a /lib/private/Files/Cache | |
parent | fd93aa816231954ca628daa85bd091fd6ff3a570 (diff) |
generate a better optimized query for path prefix search filters
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'lib/private/Files/Cache')
-rw-r--r-- | lib/private/Files/Cache/QuerySearchHelper.php | 21 | ||||
-rw-r--r-- | lib/private/Files/Cache/SearchBuilder.php | 5 |
2 files changed, 17 insertions, 9 deletions
diff --git a/lib/private/Files/Cache/QuerySearchHelper.php b/lib/private/Files/Cache/QuerySearchHelper.php index 683b580d9d1..e065e95e4fd 100644 --- a/lib/private/Files/Cache/QuerySearchHelper.php +++ b/lib/private/Files/Cache/QuerySearchHelper.php @@ -25,6 +25,7 @@ */ namespace OC\Files\Cache; +use OC\Files\Search\QueryOptimizer\QueryOptimizer; use OC\Files\Search\SearchBinaryOperator; use OC\SystemConfig; use OCP\Files\Cache\ICache; @@ -47,19 +48,23 @@ class QuerySearchHelper { private $logger; /** @var SearchBuilder */ private $searchBuilder; + /** @var QueryOptimizer */ + private $queryOptimizer; public function __construct( IMimeTypeLoader $mimetypeLoader, IDBConnection $connection, SystemConfig $systemConfig, ILogger $logger, - SearchBuilder $searchBuilder + SearchBuilder $searchBuilder, + QueryOptimizer $queryOptimizer ) { $this->mimetypeLoader = $mimetypeLoader; $this->connection = $connection; $this->systemConfig = $systemConfig; $this->logger = $logger; $this->searchBuilder = $searchBuilder; + $this->queryOptimizer = $queryOptimizer; } protected function getQueryBuilder() { @@ -115,15 +120,17 @@ class QuerySearchHelper { ->andWhere($builder->expr()->eq('tag.uid', $builder->createNamedParameter($user->getUID()))); } - $searchExpr = $this->searchBuilder->searchOperatorToDBExpr($builder, $searchQuery->getSearchOperation()); - if ($searchExpr) { - $query->andWhere($searchExpr); - } - $storageFilters = array_values(array_map(function (ICache $cache) { return $cache->getQueryFilterForStorage(); }, $caches)); - $query->andWhere($this->searchBuilder->searchOperatorToDBExpr($builder, new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_OR, $storageFilters))); + $storageFilter = new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_OR, $storageFilters); + $filter = new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_AND, [$searchQuery->getSearchOperation(), $storageFilter]); + $this->queryOptimizer->processOperator($filter); + + $searchExpr = $this->searchBuilder->searchOperatorToDBExpr($builder, $filter); + if ($searchExpr) { + $query->andWhere($searchExpr); + } $this->searchBuilder->addSearchOrdersToQuery($query, $searchQuery->getOrder()); diff --git a/lib/private/Files/Cache/SearchBuilder.php b/lib/private/Files/Cache/SearchBuilder.php index be38e5622bf..003d3ac15e7 100644 --- a/lib/private/Files/Cache/SearchBuilder.php +++ b/lib/private/Files/Cache/SearchBuilder.php @@ -87,7 +87,7 @@ class SearchBuilder { /** * @param IQueryBuilder $builder - * @param ISearchOperator $operator + * @param ISearchOperator[] $operators */ public function searchOperatorArrayToDBExprArray(IQueryBuilder $builder, array $operators) { return array_filter(array_map(function ($operator) use ($builder) { @@ -97,6 +97,7 @@ class SearchBuilder { public function searchOperatorToDBExpr(IQueryBuilder $builder, ISearchOperator $operator) { $expr = $builder->expr(); + if ($operator instanceof ISearchBinaryOperator) { if (count($operator->getArguments()) === 0) { return null; @@ -166,7 +167,7 @@ class SearchBuilder { $field = 'tag.category'; } elseif ($field === 'fileid') { $field = 'file.fileid'; - } elseif ($field === 'path' && $type === ISearchComparison::COMPARE_EQUAL) { + } elseif ($field === 'path' && $type === ISearchComparison::COMPARE_EQUAL && $operator->getQueryHint(ISearchComparison::HINT_PATH_EQ_HASH, true)) { $field = 'path_hash'; $value = md5((string)$value); } |