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
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2021-08-23 16:01:03 +0300
committerRobin Appelman <robin@icewind.nl>2021-08-26 20:07:52 +0300
commit735105932680718e443cc6b9a883792d3e35729d (patch)
tree6d057ebe9247ee86a5a28dc65045a1025d83a68a /lib/private/Files/Cache
parentfd93aa816231954ca628daa85bd091fd6ff3a570 (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.php21
-rw-r--r--lib/private/Files/Cache/SearchBuilder.php5
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);
}