Merge pull request #33982 from nextcloud/backport/33788/stable23

[stable23] Improve getting recent files performance
This commit is contained in:
Carl Schwan 2022-09-13 12:23:10 +02:00 committed by GitHub
commit 39ef21a6b8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 59 additions and 31 deletions

View file

@ -484,37 +484,65 @@ class Folder extends Node implements \OCP\Files\Folder {
* @return \OCP\Files\Node[]
*/
public function getRecent($limit, $offset = 0) {
$query = new SearchQuery(
new SearchBinaryOperator(
// filter out non empty folders
ISearchBinaryOperator::OPERATOR_OR,
[
new SearchBinaryOperator(
ISearchBinaryOperator::OPERATOR_NOT,
[
new SearchComparison(
ISearchComparison::COMPARE_EQUAL,
'mimetype',
FileInfo::MIMETYPE_FOLDER
),
]
),
new SearchComparison(
ISearchComparison::COMPARE_EQUAL,
'size',
0
),
]
),
$limit,
$offset,
$filterOutNonEmptyFolder = new SearchBinaryOperator(
// filter out non empty folders
ISearchBinaryOperator::OPERATOR_OR,
[
new SearchOrder(
ISearchOrder::DIRECTION_DESCENDING,
'mtime'
new SearchBinaryOperator(
ISearchBinaryOperator::OPERATOR_NOT,
[
new SearchComparison(
ISearchComparison::COMPARE_EQUAL,
'mimetype',
FileInfo::MIMETYPE_FOLDER
),
]
),
new SearchComparison(
ISearchComparison::COMPARE_EQUAL,
'size',
0
),
]
);
$filterNonRecentFiles = new SearchComparison(
ISearchComparison::COMPARE_GREATER_THAN,
'mtime',
strtotime("-2 week")
);
if ($offset === 0 && $limit <= 100) {
$query = new SearchQuery(
new SearchBinaryOperator(
ISearchBinaryOperator::OPERATOR_AND,
[
$filterOutNonEmptyFolder,
$filterNonRecentFiles,
],
),
$limit,
$offset,
[
new SearchOrder(
ISearchOrder::DIRECTION_DESCENDING,
'mtime'
),
]
);
} else {
$query = new SearchQuery(
$filterOutNonEmptyFolder,
$limit,
$offset,
[
new SearchOrder(
ISearchOrder::DIRECTION_DESCENDING,
'mtime'
),
]
);
}
return $this->search($query);
}
}

View file

@ -711,7 +711,7 @@ class FolderTest extends NodeTest {
$this->assertEquals($expected, $node->getNonExistingName($name));
}
public function testRecent() {
public function testRecent(): void {
$manager = $this->createMock(Manager::class);
$folderPath = '/bar/foo';
/**
@ -727,7 +727,7 @@ class FolderTest extends NodeTest {
$folderInfo = $this->getMockBuilder(FileInfo::class)
->disableOriginalConstructor()->getMock();
$baseTime = 1000;
$baseTime = time();
$storage = new Temporary();
$mount = new MountPoint($storage, '');
@ -795,7 +795,7 @@ class FolderTest extends NodeTest {
$folderInfo = $this->getMockBuilder(FileInfo::class)
->disableOriginalConstructor()->getMock();
$baseTime = 1000;
$baseTime = time();
$storage = new Temporary();
$mount = new MountPoint($storage, '');
@ -862,7 +862,7 @@ class FolderTest extends NodeTest {
$folderInfo = $this->getMockBuilder(FileInfo::class)
->disableOriginalConstructor()->getMock();
$baseTime = 1000;
$baseTime = time();
$storage = new Temporary();
$jail = new Jail([
'storage' => $storage,