diff options
author | Vincent Petry <vincent@nextcloud.com> | 2021-10-19 17:45:27 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-19 17:45:27 +0300 |
commit | 220004cf58b02a6a583d64b38785b1980de703a3 (patch) | |
tree | 711ba4f26a5e940943b1bd01fd721bb762e05f6d /lib | |
parent | 888b46204393dfa953beb59f3ac5619b4c7a8f6f (diff) | |
parent | ff1029e8ef33b5973d8bdd0a4029bc903f3fb85a (diff) |
Merge pull request #29192 from nextcloud/backport/29080/stable20
[stable20] [21] generate a better optimized query for path prefix search filters
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/Files/Cache/Cache.php | 14 | ||||
-rw-r--r-- | lib/private/Files/Cache/Wrapper/CacheJail.php | 40 |
2 files changed, 24 insertions, 30 deletions
diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php index 2bc7fbb9541..74a386b3f9e 100644 --- a/lib/private/Files/Cache/Cache.php +++ b/lib/private/Files/Cache/Cache.php @@ -799,7 +799,7 @@ class Cache implements ICache { * @param Statement $result * @return CacheEntry[] */ - private function searchResultToCacheEntries(Statement $result) { + protected function searchResultToCacheEntries(Statement $result) { $files = $result->fetchAll(); return array_map(function (array $data) { @@ -836,11 +836,7 @@ class Cache implements ICache { }, $files); } - /** - * @param ISearchQuery $searchQuery - * @return CacheEntry[] - */ - public function searchQuery(ISearchQuery $searchQuery) { + protected function buildSearchQuery(ISearchQuery $searchQuery): IQueryBuilder { $builder = $this->getQueryBuilder(); $query = $builder->selectFileCache('file'); @@ -880,6 +876,12 @@ class Cache implements ICache { $query->setFirstResult($searchQuery->getOffset()); } + return $query; + } + + public function searchQuery(ISearchQuery $searchQuery) { + $query = $this->buildSearchQuery($searchQuery); + $result = $query->execute(); return $this->searchResultToCacheEntries($result); } diff --git a/lib/private/Files/Cache/Wrapper/CacheJail.php b/lib/private/Files/Cache/Wrapper/CacheJail.php index b456bfccd19..7b2942b02b9 100644 --- a/lib/private/Files/Cache/Wrapper/CacheJail.php +++ b/lib/private/Files/Cache/Wrapper/CacheJail.php @@ -29,13 +29,10 @@ namespace OC\Files\Cache\Wrapper; use OC\Files\Cache\Cache; -use OC\Files\Search\SearchBinaryOperator; -use OC\Files\Search\SearchComparison; +use OC\Files\Cache\QuerySearchHelper; use OC\Files\Search\SearchQuery; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\Files\Cache\ICacheEntry; -use OCP\Files\Search\ISearchBinaryOperator; -use OCP\Files\Search\ISearchComparison; use OCP\Files\Search\ISearchQuery; /** @@ -63,6 +60,7 @@ class CacheJail extends CacheWrapper { } else { $this->unjailedRoot = $root; } + $this->querySearchHelper = new QuerySearchHelper($this->mimetypeLoader); } protected function getRoot() { @@ -260,7 +258,7 @@ class CacheJail extends CacheWrapper { ->whereStorageId() ->andWhere($query->expr()->orX( $query->expr()->like('path', $query->createNamedParameter($this->getGetUnjailedRoot() . '/%')), - $query->expr()->eq('path_hash', $query->createNamedParameter(md5($this->getGetUnjailedRoot()))) + $query->expr()->eq('path', $query->createNamedParameter($this->getGetUnjailedRoot())) )) ->andWhere($query->expr()->iLike('name', $query->createNamedParameter($pattern))); @@ -292,7 +290,7 @@ class CacheJail extends CacheWrapper { ->whereStorageId() ->andWhere($query->expr()->orX( $query->expr()->like('path', $query->createNamedParameter($this->getGetUnjailedRoot() . '/%')), - $query->expr()->eq('path_hash', $query->createNamedParameter(md5($this->getGetUnjailedRoot()))) + $query->expr()->eq('path', $query->createNamedParameter($this->getGetUnjailedRoot())) )); if (strpos($mimetype, '/')) { @@ -311,27 +309,21 @@ class CacheJail extends CacheWrapper { return $this->formatSearchResults($results); } - public function searchQuery(ISearchQuery $query) { + public function searchQuery(ISearchQuery $searchQuery) { if ($this->getGetUnjailedRoot() === '' || $this->getGetUnjailedRoot() === '/') { - return parent::searchQuery($query); + return parent::searchQuery($searchQuery); } - $prefixFilter = new SearchComparison( - ISearchComparison::COMPARE_LIKE, - 'path', - $this->getGetUnjailedRoot() . '/%' - ); - $rootFilter = new SearchComparison( - ISearchComparison::COMPARE_EQUAL, - 'path', - $this->getGetUnjailedRoot() - ); - $operation = new SearchBinaryOperator( - ISearchBinaryOperator::OPERATOR_AND, - [new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_OR, [$prefixFilter, $rootFilter]) , $query->getSearchOperation()] - ); - $simpleQuery = new SearchQuery($operation, $query->getLimit(), $query->getOffset(), $query->getOrder(), $query->getUser()); - $results = $this->getCache()->searchQuery($simpleQuery); + $query = $this->buildSearchQuery($searchQuery); + + $query->andWhere($query->expr()->orX( + $query->expr()->like('path', $query->createNamedParameter($this->getGetUnjailedRoot() . '/%')), + $query->expr()->eq('path', $query->createNamedParameter($this->getGetUnjailedRoot())) + )); + + $result = $query->execute(); + $results = $this->searchResultToCacheEntries($result); + $result->closeCursor(); return $this->formatSearchResults($results); } |