Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2021-10-05 16:42:59 +0300
committerRobin Appelman <robin@icewind.nl>2021-10-18 16:39:24 +0300
commitff1029e8ef33b5973d8bdd0a4029bc903f3fb85a (patch)
treedf0f459aa0fc0b4f37408fb8aa631830f3bcf5f5 /lib
parent13fc105138e952fabe94ae53d717c8b2154ce6f8 (diff)
[21] generate a better optimized query for path prefix search filters
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'lib')
-rw-r--r--lib/private/Files/Cache/Cache.php14
-rw-r--r--lib/private/Files/Cache/Wrapper/CacheJail.php40
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);
}