diff options
author | Carl Schwan <carl@carlschwan.eu> | 2022-09-01 11:45:50 +0300 |
---|---|---|
committer | backportbot-nextcloud[bot] <backportbot-nextcloud[bot]@users.noreply.github.com> | 2022-09-08 17:44:00 +0300 |
commit | 4d4a6727fc6280aa047d6cbae92f8fa9a91f6312 (patch) | |
tree | 1ad8e2785e9dc8d68c8fbc777cd6e8a83d77bb1d | |
parent | 19ac8fd167de17fb20d3b718a9bba6943a973fa5 (diff) |
Filter out old files when trying to get recent filesbackport/33788/stable23
Only do so when asking for less than 100 files and having an offset
equal to 0.
Signed-off-by: Carl Schwan <carl@carlschwan.eu>
-rw-r--r-- | lib/private/Files/Node/Folder.php | 82 | ||||
-rw-r--r-- | tests/lib/Files/Node/FolderTest.php | 8 |
2 files changed, 59 insertions, 31 deletions
diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php index 400fd6bedcc..48bc1c60b21 100644 --- a/lib/private/Files/Node/Folder.php +++ b/lib/private/Files/Node/Folder.php @@ -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); } } diff --git a/tests/lib/Files/Node/FolderTest.php b/tests/lib/Files/Node/FolderTest.php index 94bcac4aa00..362de61cb29 100644 --- a/tests/lib/Files/Node/FolderTest.php +++ b/tests/lib/Files/Node/FolderTest.php @@ -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, |