Skip to content

Commit 4befe46

Browse files
committed
[21] generate a better optimized query for path prefix search filters
Signed-off-by: Robin Appelman <robin@icewind.nl>
1 parent 7d01d1b commit 4befe46

File tree

2 files changed

+24
-22
lines changed

2 files changed

+24
-22
lines changed

lib/private/Files/Cache/Cache.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,7 @@ public function search($pattern) {
800800
* @param IResult $result
801801
* @return CacheEntry[]
802802
*/
803-
private function searchResultToCacheEntries(IResult $result): array {
803+
protected function searchResultToCacheEntries(IResult $result): array {
804804
$files = $result->fetchAll();
805805

806806
return array_map(function (array $data) {
@@ -837,7 +837,7 @@ public function searchByMime($mimetype) {
837837
}, $files);
838838
}
839839

840-
public function searchQuery(ISearchQuery $searchQuery) {
840+
protected function buildSearchQuery(ISearchQuery $searchQuery): IQueryBuilder {
841841
$builder = $this->getQueryBuilder();
842842

843843
$query = $builder->selectFileCache('file');
@@ -877,6 +877,12 @@ public function searchQuery(ISearchQuery $searchQuery) {
877877
$query->setFirstResult($searchQuery->getOffset());
878878
}
879879

880+
return $query;
881+
}
882+
883+
public function searchQuery(ISearchQuery $searchQuery) {
884+
$query = $this->buildSearchQuery($searchQuery);
885+
880886
$result = $query->execute();
881887
$cacheEntries = $this->searchResultToCacheEntries($result);
882888
$result->closeCursor();

lib/private/Files/Cache/Wrapper/CacheJail.php

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
namespace OC\Files\Cache\Wrapper;
3030

3131
use OC\Files\Cache\Cache;
32+
use OC\Files\Cache\QuerySearchHelper;
3233
use OC\Files\Search\SearchBinaryOperator;
3334
use OC\Files\Search\SearchComparison;
3435
use OC\Files\Search\SearchQuery;
@@ -63,6 +64,7 @@ public function __construct($cache, $root) {
6364
} else {
6465
$this->unjailedRoot = $root;
6566
}
67+
$this->querySearchHelper = new QuerySearchHelper($this->mimetypeLoader);
6668
}
6769

6870
protected function getRoot() {
@@ -260,7 +262,7 @@ public function search($pattern) {
260262
->whereStorageId()
261263
->andWhere($query->expr()->orX(
262264
$query->expr()->like('path', $query->createNamedParameter($this->getGetUnjailedRoot() . '/%')),
263-
$query->expr()->eq('path_hash', $query->createNamedParameter(md5($this->getGetUnjailedRoot()))),
265+
$query->expr()->eq('path', $query->createNamedParameter($this->getGetUnjailedRoot())),
264266
))
265267
->andWhere($query->expr()->iLike('name', $query->createNamedParameter($pattern)));
266268

@@ -292,7 +294,7 @@ public function searchByMime($mimetype) {
292294
->whereStorageId()
293295
->andWhere($query->expr()->orX(
294296
$query->expr()->like('path', $query->createNamedParameter($this->getGetUnjailedRoot() . '/%')),
295-
$query->expr()->eq('path_hash', $query->createNamedParameter(md5($this->getGetUnjailedRoot()))),
297+
$query->expr()->eq('path', $query->createNamedParameter($this->getGetUnjailedRoot())),
296298
));
297299

298300
if (strpos($mimetype, '/')) {
@@ -311,27 +313,21 @@ public function searchByMime($mimetype) {
311313
return $this->formatSearchResults($results);
312314
}
313315

314-
public function searchQuery(ISearchQuery $query) {
316+
public function searchQuery(ISearchQuery $searchQuery) {
315317
if ($this->getGetUnjailedRoot() === '' || $this->getGetUnjailedRoot() === '/') {
316-
return parent::searchQuery($query);
318+
return parent::searchQuery($searchQuery);
317319
}
318320

319-
$prefixFilter = new SearchComparison(
320-
ISearchComparison::COMPARE_LIKE,
321-
'path',
322-
$this->getGetUnjailedRoot() . '/%'
323-
);
324-
$rootFilter = new SearchComparison(
325-
ISearchComparison::COMPARE_EQUAL,
326-
'path',
327-
$this->getGetUnjailedRoot()
328-
);
329-
$operation = new SearchBinaryOperator(
330-
ISearchBinaryOperator::OPERATOR_AND,
331-
[new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_OR, [$prefixFilter, $rootFilter]) , $query->getSearchOperation()]
332-
);
333-
$simpleQuery = new SearchQuery($operation, $query->getLimit(), $query->getOffset(), $query->getOrder(), $query->getUser());
334-
$results = $this->getCache()->searchQuery($simpleQuery);
321+
$query = $this->buildSearchQuery($searchQuery);
322+
323+
$query->andWhere($query->expr()->orX(
324+
$query->expr()->like('path', $query->createNamedParameter($this->getGetUnjailedRoot() . '/%')),
325+
$query->expr()->eq('path', $query->createNamedParameter($this->getGetUnjailedRoot())),
326+
));
327+
328+
$result = $query->execute();
329+
$results = $this->searchResultToCacheEntries($result);
330+
$result->closeCursor();
335331
return $this->formatSearchResults($results);
336332
}
337333

0 commit comments

Comments
 (0)