folder filtering in sql
Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
parent
de713967c0
commit
feed42dd6d
|
@ -33,6 +33,7 @@ namespace OC\Files\Node;
|
||||||
|
|
||||||
use OC\DB\QueryBuilder\Literal;
|
use OC\DB\QueryBuilder\Literal;
|
||||||
use OC\Files\Mount\MountPoint;
|
use OC\Files\Mount\MountPoint;
|
||||||
|
use OC\Files\Search\SearchBinaryOperator;
|
||||||
use OC\Files\Search\SearchComparison;
|
use OC\Files\Search\SearchComparison;
|
||||||
use OC\Files\Search\SearchQuery;
|
use OC\Files\Search\SearchQuery;
|
||||||
use OC\Files\Storage\Wrapper\Jail;
|
use OC\Files\Storage\Wrapper\Jail;
|
||||||
|
@ -45,6 +46,7 @@ use OCP\Files\FileInfo;
|
||||||
use OCP\Files\Mount\IMountPoint;
|
use OCP\Files\Mount\IMountPoint;
|
||||||
use OCP\Files\NotFoundException;
|
use OCP\Files\NotFoundException;
|
||||||
use OCP\Files\NotPermittedException;
|
use OCP\Files\NotPermittedException;
|
||||||
|
use OCP\Files\Search\ISearchBinaryOperator;
|
||||||
use OCP\Files\Search\ISearchComparison;
|
use OCP\Files\Search\ISearchComparison;
|
||||||
use OCP\Files\Search\ISearchOperator;
|
use OCP\Files\Search\ISearchOperator;
|
||||||
use OCP\Files\Search\ISearchQuery;
|
use OCP\Files\Search\ISearchQuery;
|
||||||
|
@ -253,17 +255,6 @@ class Folder extends Node implements \OCP\Files\Folder {
|
||||||
throw new \InvalidArgumentException('searching by owner is only allows on the users home folder');
|
throw new \InvalidArgumentException('searching by owner is only allows on the users home folder');
|
||||||
}
|
}
|
||||||
|
|
||||||
$subQueryLimit = $query->getLimit() > 0 ? $query->getLimit() + $query->getOffset() : PHP_INT_MAX;
|
|
||||||
$subQueryOffset = $query->getOffset();
|
|
||||||
$noLimitQuery = new SearchQuery(
|
|
||||||
$query->getSearchOperation(),
|
|
||||||
$subQueryLimit,
|
|
||||||
0,
|
|
||||||
$query->getOrder(),
|
|
||||||
$query->getUser()
|
|
||||||
);
|
|
||||||
|
|
||||||
$files = [];
|
|
||||||
$rootLength = strlen($this->path);
|
$rootLength = strlen($this->path);
|
||||||
$mount = $this->root->getMount($this->path);
|
$mount = $this->root->getMount($this->path);
|
||||||
$storage = $mount->getStorage();
|
$storage = $mount->getStorage();
|
||||||
|
@ -272,21 +263,34 @@ class Folder extends Node implements \OCP\Files\Folder {
|
||||||
if ($internalPath !== '') {
|
if ($internalPath !== '') {
|
||||||
$internalPath = $internalPath . '/';
|
$internalPath = $internalPath . '/';
|
||||||
}
|
}
|
||||||
$internalRootLength = strlen($internalPath);
|
|
||||||
|
$subQueryLimit = $query->getLimit() > 0 ? $query->getLimit() + $query->getOffset() : PHP_INT_MAX;
|
||||||
|
$subQueryOffset = $query->getOffset();
|
||||||
|
$rootQuery = new SearchQuery(
|
||||||
|
new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_AND, [
|
||||||
|
new SearchComparison(ISearchComparison::COMPARE_LIKE, 'path', $internalPath . '%'),
|
||||||
|
$query->getSearchOperation(),
|
||||||
|
]
|
||||||
|
),
|
||||||
|
$subQueryLimit,
|
||||||
|
0,
|
||||||
|
$query->getOrder(),
|
||||||
|
$query->getUser()
|
||||||
|
);
|
||||||
|
|
||||||
|
$files = [];
|
||||||
|
|
||||||
$cache = $storage->getCache('');
|
$cache = $storage->getCache('');
|
||||||
|
|
||||||
$results = $cache->searchQuery($noLimitQuery);
|
$results = $cache->searchQuery($rootQuery);
|
||||||
$count = count($results);
|
$count = count($results);
|
||||||
$results = array_slice($results, $subQueryOffset, $subQueryLimit);
|
$results = array_slice($results, $subQueryOffset, $subQueryLimit);
|
||||||
$subQueryOffset = max(0, $subQueryOffset - $count);
|
$subQueryOffset = max(0, $subQueryOffset - $count);
|
||||||
$subQueryLimit = max(0, $subQueryLimit - $count);
|
$subQueryLimit = max(0, $subQueryLimit - $count);
|
||||||
|
|
||||||
foreach ($results as $result) {
|
foreach ($results as $result) {
|
||||||
if ($internalRootLength === 0 or substr($result['path'], 0, $internalRootLength) === $internalPath) {
|
|
||||||
$files[] = $this->cacheEntryToFileInfo($mount, '', $internalPath, $result);
|
$files[] = $this->cacheEntryToFileInfo($mount, '', $internalPath, $result);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!$limitToHome) {
|
if (!$limitToHome) {
|
||||||
$mounts = $this->root->getMountsIn($this->path);
|
$mounts = $this->root->getMountsIn($this->path);
|
||||||
|
|
|
@ -354,7 +354,6 @@ class FolderTest extends NodeTest {
|
||||||
$cache->method('searchQuery')
|
$cache->method('searchQuery')
|
||||||
->willReturn([
|
->willReturn([
|
||||||
new CacheEntry(['fileid' => 3, 'path' => 'files/foo', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain']),
|
new CacheEntry(['fileid' => 3, 'path' => 'files/foo', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain']),
|
||||||
new CacheEntry(['fileid' => 3, 'path' => 'files_trashbin/foo2.d12345', 'name' => 'foo2.d12345', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain']),
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$root->method('getMountsIn')
|
$root->method('getMountsIn')
|
||||||
|
|
Loading…
Reference in New Issue