mirror of
https://github.com/nextcloud/server.git
synced 2026-03-27 04:43:20 -04:00
Merge pull request #33602 from nextcloud/perf/parent-node
This commit is contained in:
commit
06340b6672
4 changed files with 60 additions and 17 deletions
|
|
@ -101,9 +101,9 @@ class Folder extends Node implements \OCP\Files\Folder {
|
|||
|
||||
return array_map(function (FileInfo $info) {
|
||||
if ($info->getMimetype() === FileInfo::MIMETYPE_FOLDER) {
|
||||
return new Folder($this->root, $this->view, $info->getPath(), $info);
|
||||
return new Folder($this->root, $this->view, $info->getPath(), $info, $this);
|
||||
} else {
|
||||
return new File($this->root, $this->view, $info->getPath(), $info);
|
||||
return new File($this->root, $this->view, $info->getPath(), $info, $this);
|
||||
}
|
||||
}, $folderContent);
|
||||
}
|
||||
|
|
@ -119,10 +119,11 @@ class Folder extends Node implements \OCP\Files\Folder {
|
|||
} else {
|
||||
$isDir = $info->getType() === FileInfo::TYPE_FOLDER;
|
||||
}
|
||||
$parent = dirname($path) === $this->getPath() ? $this : null;
|
||||
if ($isDir) {
|
||||
return new Folder($this->root, $this->view, $path, $info);
|
||||
return new Folder($this->root, $this->view, $path, $info, $parent);
|
||||
} else {
|
||||
return new File($this->root, $this->view, $path, $info);
|
||||
return new File($this->root, $this->view, $path, $info, $parent);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -163,7 +164,8 @@ class Folder extends Node implements \OCP\Files\Folder {
|
|||
if (!$this->view->mkdir($fullPath)) {
|
||||
throw new NotPermittedException('Could not create folder');
|
||||
}
|
||||
$node = new Folder($this->root, $this->view, $fullPath);
|
||||
$parent = dirname($fullPath) === $this->getPath() ? $this : null;
|
||||
$node = new Folder($this->root, $this->view, $fullPath, null, $parent);
|
||||
$this->sendHooks(['postWrite', 'postCreate'], [$node]);
|
||||
return $node;
|
||||
} else {
|
||||
|
|
@ -193,7 +195,7 @@ class Folder extends Node implements \OCP\Files\Folder {
|
|||
if ($result === false) {
|
||||
throw new NotPermittedException('Could not create path');
|
||||
}
|
||||
$node = new File($this->root, $this->view, $fullPath);
|
||||
$node = new File($this->root, $this->view, $fullPath, null, $this);
|
||||
$this->sendHooks(['postWrite', 'postCreate'], [$node]);
|
||||
return $node;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,17 +61,23 @@ class Node implements \OCP\Files\Node {
|
|||
*/
|
||||
protected $fileInfo;
|
||||
|
||||
/**
|
||||
* @var Node|null
|
||||
*/
|
||||
protected $parent;
|
||||
|
||||
/**
|
||||
* @param \OC\Files\View $view
|
||||
* @param \OCP\Files\IRootFolder $root
|
||||
* @param string $path
|
||||
* @param FileInfo $fileInfo
|
||||
*/
|
||||
public function __construct($root, $view, $path, $fileInfo = null) {
|
||||
public function __construct($root, $view, $path, $fileInfo = null, ?Node $parent = null) {
|
||||
$this->view = $view;
|
||||
$this->root = $root;
|
||||
$this->path = $path;
|
||||
$this->fileInfo = $fileInfo;
|
||||
$this->parent = $parent;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -278,11 +284,16 @@ class Node implements \OCP\Files\Node {
|
|||
* @return Node
|
||||
*/
|
||||
public function getParent() {
|
||||
$newPath = dirname($this->path);
|
||||
if ($newPath === '' || $newPath === '.' || $newPath === '/') {
|
||||
return $this->root;
|
||||
if ($this->parent === null) {
|
||||
$newPath = dirname($this->path);
|
||||
if ($newPath === '' || $newPath === '.' || $newPath === '/') {
|
||||
return $this->root;
|
||||
}
|
||||
|
||||
$this->parent = $this->root->get($newPath);
|
||||
}
|
||||
return $this->root->get($newPath);
|
||||
|
||||
return $this->parent;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ class ProviderV1Adapter implements IProviderV2 {
|
|||
}
|
||||
|
||||
private function getViewAndPath(File $file) {
|
||||
$view = new View($file->getParent()->getPath());
|
||||
$view = new View(dirname($file->getPath()));
|
||||
$path = $file->getName();
|
||||
|
||||
return [$view, $path];
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ use OC\Files\Config\CachedMountInfo;
|
|||
use OC\Files\FileInfo;
|
||||
use OC\Files\Mount\Manager;
|
||||
use OC\Files\Mount\MountPoint;
|
||||
use OC\Files\Node\File;
|
||||
use OC\Files\Node\Folder;
|
||||
use OC\Files\Node\Node;
|
||||
use OC\Files\Node\Root;
|
||||
|
|
@ -105,11 +106,13 @@ class FolderTest extends NodeTest {
|
|||
->method('getUser')
|
||||
->willReturn($this->user);
|
||||
|
||||
$node = new File($root, $view, '/bar/foo/asd');
|
||||
$root->method('get')
|
||||
->with('/bar/foo/asd');
|
||||
->with('/bar/foo/asd')
|
||||
->willReturn($node);
|
||||
|
||||
$node = new Folder($root, $view, '/bar/foo');
|
||||
$node->get('asd');
|
||||
$parentNode = new Folder($root, $view, '/bar/foo');
|
||||
self::assertEquals($node, $parentNode->get('asd'));
|
||||
}
|
||||
|
||||
public function testNodeExists() {
|
||||
|
|
@ -178,11 +181,38 @@ class FolderTest extends NodeTest {
|
|||
->willReturn(true);
|
||||
|
||||
$node = new Folder($root, $view, '/bar/foo');
|
||||
$child = new Folder($root, $view, '/bar/foo/asd');
|
||||
$child = new Folder($root, $view, '/bar/foo/asd', null, $node);
|
||||
$result = $node->newFolder('asd');
|
||||
$this->assertEquals($child, $result);
|
||||
}
|
||||
|
||||
public function testNewFolderDeepParent() {
|
||||
$manager = $this->createMock(Manager::class);
|
||||
/**
|
||||
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
|
||||
*/
|
||||
$view = $this->createMock(View::class);
|
||||
$root = $this->getMockBuilder(Root::class)
|
||||
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
|
||||
->getMock();
|
||||
$root->expects($this->any())
|
||||
->method('getUser')
|
||||
->willReturn($this->user);
|
||||
|
||||
$view->method('getFileInfo')
|
||||
->with('/foobar')
|
||||
->willReturn($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_ALL]));
|
||||
|
||||
$view->method('mkdir')
|
||||
->with('/foobar/asd/sdf')
|
||||
->willReturn(true);
|
||||
|
||||
$node = new Folder($root, $view, '/foobar');
|
||||
$child = new Folder($root, $view, '/foobar/asd/sdf', null, null);
|
||||
$result = $node->newFolder('asd/sdf');
|
||||
$this->assertEquals($child, $result);
|
||||
}
|
||||
|
||||
|
||||
public function testNewFolderNotPermitted() {
|
||||
$this->expectException(\OCP\Files\NotPermittedException::class);
|
||||
|
|
@ -228,7 +258,7 @@ class FolderTest extends NodeTest {
|
|||
->willReturn(true);
|
||||
|
||||
$node = new Folder($root, $view, '/bar/foo');
|
||||
$child = new \OC\Files\Node\File($root, $view, '/bar/foo/asd');
|
||||
$child = new \OC\Files\Node\File($root, $view, '/bar/foo/asd', null, $node);
|
||||
$result = $node->newFile('asd');
|
||||
$this->assertEquals($child, $result);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue