diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php index b851076e2c164..ae707fb5b54cb 100644 --- a/lib/private/Files/Cache/Cache.php +++ b/lib/private/Files/Cache/Cache.php @@ -800,7 +800,7 @@ public function search($pattern) { * @param IResult $result * @return CacheEntry[] */ - private function searchResultToCacheEntries(IResult $result): array { + protected function searchResultToCacheEntries(IResult $result): array { $files = $result->fetchAll(); return array_map(function (array $data) { @@ -837,7 +837,7 @@ public function searchByMime($mimetype) { }, $files); } - public function searchQuery(ISearchQuery $searchQuery) { + protected function buildSearchQuery(ISearchQuery $searchQuery): IQueryBuilder { $builder = $this->getQueryBuilder(); $query = $builder->selectFileCache('file'); @@ -877,6 +877,12 @@ public function searchQuery(ISearchQuery $searchQuery) { $query->setFirstResult($searchQuery->getOffset()); } + return $query; + } + + public function searchQuery(ISearchQuery $searchQuery) { + $query = $this->buildSearchQuery($searchQuery); + $result = $query->execute(); $cacheEntries = $this->searchResultToCacheEntries($result); $result->closeCursor(); diff --git a/lib/private/Files/Cache/Wrapper/CacheJail.php b/lib/private/Files/Cache/Wrapper/CacheJail.php index 8c6a1d21e7679..5c4a75bfefcf1 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 @@ public function __construct($cache, $root) { } else { $this->unjailedRoot = $root; } + $this->querySearchHelper = new QuerySearchHelper($this->mimetypeLoader); } protected function getRoot() { @@ -260,7 +258,7 @@ public function search($pattern) { ->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 @@ public function searchByMime($mimetype) { ->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 @@ public function searchByMime($mimetype) { 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); }