|
|
|
|
@ -33,6 +33,7 @@ namespace OC\Files\Node; |
|
|
|
|
|
|
|
|
|
use OC\DB\QueryBuilder\Literal; |
|
|
|
|
use OC\Files\Mount\MountPoint; |
|
|
|
|
use OC\Files\Search\SearchBinaryOperator; |
|
|
|
|
use OC\Files\Search\SearchComparison; |
|
|
|
|
use OC\Files\Search\SearchQuery; |
|
|
|
|
use OC\Files\Storage\Wrapper\Jail; |
|
|
|
|
@ -45,6 +46,7 @@ use OCP\Files\FileInfo; |
|
|
|
|
use OCP\Files\Mount\IMountPoint; |
|
|
|
|
use OCP\Files\NotFoundException; |
|
|
|
|
use OCP\Files\NotPermittedException; |
|
|
|
|
use OCP\Files\Search\ISearchBinaryOperator; |
|
|
|
|
use OCP\Files\Search\ISearchComparison; |
|
|
|
|
use OCP\Files\Search\ISearchOperator; |
|
|
|
|
use OCP\Files\Search\ISearchQuery; |
|
|
|
|
@ -253,10 +255,23 @@ class Folder extends Node implements \OCP\Files\Folder { |
|
|
|
|
throw new \InvalidArgumentException('searching by owner is only allows on the users home folder'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$rootLength = strlen($this->path); |
|
|
|
|
$mount = $this->root->getMount($this->path); |
|
|
|
|
$storage = $mount->getStorage(); |
|
|
|
|
$internalPath = $mount->getInternalPath($this->path); |
|
|
|
|
$internalPath = rtrim($internalPath, '/'); |
|
|
|
|
if ($internalPath !== '') { |
|
|
|
|
$internalPath = $internalPath . '/'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$subQueryLimit = $query->getLimit() > 0 ? $query->getLimit() + $query->getOffset() : PHP_INT_MAX; |
|
|
|
|
$subQueryOffset = $query->getOffset(); |
|
|
|
|
$noLimitQuery = new SearchQuery( |
|
|
|
|
$query->getSearchOperation(), |
|
|
|
|
$rootQuery = new SearchQuery( |
|
|
|
|
new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_AND, [ |
|
|
|
|
new SearchComparison(ISearchComparison::COMPARE_LIKE, 'path', $internalPath . '%'), |
|
|
|
|
$query->getSearchOperation(), |
|
|
|
|
] |
|
|
|
|
), |
|
|
|
|
$subQueryLimit, |
|
|
|
|
0, |
|
|
|
|
$query->getOrder(), |
|
|
|
|
@ -264,28 +279,17 @@ class Folder extends Node implements \OCP\Files\Folder { |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
$files = []; |
|
|
|
|
$rootLength = strlen($this->path); |
|
|
|
|
$mount = $this->root->getMount($this->path); |
|
|
|
|
$storage = $mount->getStorage(); |
|
|
|
|
$internalPath = $mount->getInternalPath($this->path); |
|
|
|
|
$internalPath = rtrim($internalPath, '/'); |
|
|
|
|
if ($internalPath !== '') { |
|
|
|
|
$internalPath = $internalPath . '/'; |
|
|
|
|
} |
|
|
|
|
$internalRootLength = strlen($internalPath); |
|
|
|
|
|
|
|
|
|
$cache = $storage->getCache(''); |
|
|
|
|
|
|
|
|
|
$results = $cache->searchQuery($noLimitQuery); |
|
|
|
|
$results = $cache->searchQuery($rootQuery); |
|
|
|
|
$count = count($results); |
|
|
|
|
$results = array_slice($results, $subQueryOffset, $subQueryLimit); |
|
|
|
|
$subQueryOffset = max(0, $subQueryOffset - $count); |
|
|
|
|
$subQueryLimit = max(0, $subQueryLimit - $count); |
|
|
|
|
|
|
|
|
|
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) { |
|
|
|
|
@ -330,7 +334,7 @@ class Folder extends Node implements \OCP\Files\Folder { |
|
|
|
|
private function cacheEntryToFileInfo(IMountPoint $mount, string $appendRoot, string $trimRoot, ICacheEntry $cacheEntry): FileInfo { |
|
|
|
|
$trimLength = strlen($trimRoot); |
|
|
|
|
$cacheEntry['internalPath'] = $cacheEntry['path']; |
|
|
|
|
$cacheEntry['path'] = $appendRoot . substr($cacheEntry['path'], $trimLength); |
|
|
|
|
$cacheEntry['path'] = $appendRoot . substr($cacheEntry['path'], $trimLength); |
|
|
|
|
return new \OC\Files\FileInfo($this->path . '/' . $cacheEntry['path'], $mount->getStorage(), $cacheEntry['internalPath'], $cacheEntry, $mount); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|