use limit instead of since when listing recent files
This commit is contained in:
parent
a4ba3eadd0
commit
81e103074e
|
@ -198,8 +198,7 @@ class ApiController extends Controller {
|
||||||
* @return DataResponse
|
* @return DataResponse
|
||||||
*/
|
*/
|
||||||
public function getRecentFiles() {
|
public function getRecentFiles() {
|
||||||
$since = time() - (60 * 60 * 24 * 7);//1 week
|
$nodes = $this->userFolder->getRecent(100);
|
||||||
$nodes = $this->userFolder->getRecent($since);
|
|
||||||
$files = $this->formatNodes($nodes);
|
$files = $this->formatNodes($nodes);
|
||||||
return new DataResponse(['files' => $files]);
|
return new DataResponse(['files' => $files]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -363,10 +363,11 @@ class Folder extends Node implements \OCP\Files\Folder {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param int $since
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return \OCP\Files\Node[]
|
* @return \OCP\Files\Node[]
|
||||||
*/
|
*/
|
||||||
public function getRecent($since) {
|
public function getRecent($limit, $offset = 0) {
|
||||||
$mimetypeLoader = \OC::$server->getMimeTypeLoader();
|
$mimetypeLoader = \OC::$server->getMimeTypeLoader();
|
||||||
$mounts = $this->root->getMountsIn($this->path);
|
$mounts = $this->root->getMountsIn($this->path);
|
||||||
$mounts[] = $this->getMountPoint();
|
$mounts[] = $this->getMountPoint();
|
||||||
|
@ -387,55 +388,19 @@ class Folder extends Node implements \OCP\Files\Folder {
|
||||||
$query = $builder
|
$query = $builder
|
||||||
->select('f.*')
|
->select('f.*')
|
||||||
->from('filecache', 'f')
|
->from('filecache', 'f')
|
||||||
->where($builder->expr()->gt('f.storage_mtime', $builder->createNamedParameter($since, IQueryBuilder::PARAM_INT)))
|
|
||||||
->andWhere($builder->expr()->in('f.storage', $builder->createNamedParameter($storageIds, IQueryBuilder::PARAM_INT_ARRAY)))
|
->andWhere($builder->expr()->in('f.storage', $builder->createNamedParameter($storageIds, IQueryBuilder::PARAM_INT_ARRAY)))
|
||||||
->andWhere($builder->expr()->orX(
|
->andWhere($builder->expr()->orX(
|
||||||
// handle non empty folders separate
|
// handle non empty folders separate
|
||||||
$builder->expr()->neq('f.mimetype', $builder->createNamedParameter($folderMimetype, IQueryBuilder::PARAM_INT)),
|
$builder->expr()->neq('f.mimetype', $builder->createNamedParameter($folderMimetype, IQueryBuilder::PARAM_INT)),
|
||||||
$builder->expr()->eq('f.size', new Literal(0))
|
$builder->expr()->eq('f.size', new Literal(0))
|
||||||
))
|
))
|
||||||
->orderBy('f.mtime', 'DESC');
|
->orderBy('f.mtime', 'DESC')
|
||||||
|
->setMaxResults($limit)
|
||||||
|
->setFirstResult($offset);
|
||||||
|
|
||||||
$result = $query->execute()->fetchAll();
|
$result = $query->execute()->fetchAll();
|
||||||
|
|
||||||
// select folders with their mtime being the mtime of the oldest file in the folder
|
$files = array_filter(array_map(function (array $entry) use ($mountMap, $mimetypeLoader) {
|
||||||
// this way we still show new folders but dont bumb the folder every time a file in it is changed
|
|
||||||
$builder = \OC::$server->getDatabaseConnection()->getQueryBuilder();
|
|
||||||
$query = $builder
|
|
||||||
->select('p.fileid', 'p.storage', 'p.mimetype', 'p.mimepart', 'p.size', 'p.path', 'p.etag', 'f1.storage_mtime', 'f1.mtime', 'p.permissions')
|
|
||||||
->from('filecache', 'f1')
|
|
||||||
->leftJoin('f1', 'filecache', 'f2', $builder->expr()->andX( // find the f1 with lowest mtime in the folder
|
|
||||||
$builder->expr()->eq('f1.parent', 'f2.parent'),
|
|
||||||
$builder->expr()->gt('f1.storage_mtime', 'f2.storage_mtime')
|
|
||||||
))
|
|
||||||
->innerJoin('f1', 'filecache', 'p', $builder->expr()->eq('f1.parent', 'p.fileid'))
|
|
||||||
->where($builder->expr()->isNull('f2.fileid'))
|
|
||||||
->andWhere($builder->expr()->gt('f1.storage_mtime', $builder->createNamedParameter($since, IQueryBuilder::PARAM_INT)))
|
|
||||||
->andWhere($builder->expr()->in('f1.storage', $builder->createNamedParameter($storageIds, IQueryBuilder::PARAM_INT_ARRAY)))
|
|
||||||
->andWhere($builder->expr()->neq('f1.size', new Literal(0)))
|
|
||||||
->orderBy('f1.storage_mtime', 'DESC');
|
|
||||||
|
|
||||||
$folderResults = $query->execute()->fetchAll();
|
|
||||||
|
|
||||||
$found = []; // we sometimes get duplicate folders
|
|
||||||
$folderResults = array_filter($folderResults, function ($item) use (&$found) {
|
|
||||||
$isFound = isset($found[$item['fileid']]);
|
|
||||||
$found[$item['fileid']] = true;
|
|
||||||
return !$isFound;
|
|
||||||
});
|
|
||||||
|
|
||||||
$result = array_merge($folderResults, $result);
|
|
||||||
|
|
||||||
usort($result, function ($a, $b) use ($folderMimetype) {
|
|
||||||
$diff = $b['mtime'] - $a['mtime'];
|
|
||||||
if ($diff === 0) {
|
|
||||||
return $a['mimetype'] === $folderMimetype ? -1 : 1;
|
|
||||||
} else {
|
|
||||||
return $diff;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$files = array_filter(array_map(function (array $entry) use ($mountMap, $mimetypeLoader) {
|
|
||||||
$mount = $mountMap[$entry['storage']];
|
$mount = $mountMap[$entry['storage']];
|
||||||
$entry['internalPath'] = $entry['path'];
|
$entry['internalPath'] = $entry['path'];
|
||||||
$entry['mimetype'] = $mimetypeLoader->getMimetypeById($entry['mimetype']);
|
$entry['mimetype'] = $mimetypeLoader->getMimetypeById($entry['mimetype']);
|
||||||
|
|
|
@ -474,7 +474,7 @@ class LazyRoot implements IRootFolder {
|
||||||
/**
|
/**
|
||||||
* @inheritDoc
|
* @inheritDoc
|
||||||
*/
|
*/
|
||||||
public function getRecent($type) {
|
public function getRecent($limit, $offset = 0) {
|
||||||
return $this->__call(__FUNCTION__, func_get_args());
|
return $this->__call(__FUNCTION__, func_get_args());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -177,9 +177,10 @@ interface Folder extends Node {
|
||||||
public function getNonExistingName($name);
|
public function getNonExistingName($name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param int $since
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return \OCP\Files\Node[]
|
* @return \OCP\Files\Node[]
|
||||||
* @since 9.1.0
|
* @since 9.1.0
|
||||||
*/
|
*/
|
||||||
public function getRecent($since);
|
public function getRecent($limit, $offset = 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -836,7 +836,7 @@ class FolderTest extends \Test\TestCase {
|
||||||
'mimetype' => 'text/plain',
|
'mimetype' => 'text/plain',
|
||||||
'size' => 3
|
'size' => 3
|
||||||
]);
|
]);
|
||||||
$cache->put('bar/foo/toold.txt', [
|
$id3 = $cache->put('bar/foo/older.txt', [
|
||||||
'storage_mtime' => $baseTime - 600,
|
'storage_mtime' => $baseTime - 600,
|
||||||
'mtime' => $baseTime - 600,
|
'mtime' => $baseTime - 600,
|
||||||
'mimetype' => 'text/plain',
|
'mimetype' => 'text/plain',
|
||||||
|
@ -846,11 +846,11 @@ class FolderTest extends \Test\TestCase {
|
||||||
$node = new \OC\Files\Node\Folder($root, $view, $folderPath, $folderInfo);
|
$node = new \OC\Files\Node\Folder($root, $view, $folderPath, $folderInfo);
|
||||||
|
|
||||||
|
|
||||||
$nodes = $node->getRecent($baseTime - 500);
|
$nodes = $node->getRecent(5);
|
||||||
$ids = array_map(function (Node $node) {
|
$ids = array_map(function (Node $node) {
|
||||||
return (int)$node->getId();
|
return (int)$node->getId();
|
||||||
}, $nodes);
|
}, $nodes);
|
||||||
$this->assertEquals([$id1, $id2], $ids);
|
$this->assertEquals([$id1, $id2, $id3], $ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testRecentFolder() {
|
public function testRecentFolder() {
|
||||||
|
@ -900,14 +900,13 @@ class FolderTest extends \Test\TestCase {
|
||||||
$node = new \OC\Files\Node\Folder($root, $view, $folderPath, $folderInfo);
|
$node = new \OC\Files\Node\Folder($root, $view, $folderPath, $folderInfo);
|
||||||
|
|
||||||
|
|
||||||
$nodes = $node->getRecent($baseTime - 500);
|
$nodes = $node->getRecent(5);
|
||||||
$ids = array_map(function (Node $node) {
|
$ids = array_map(function (Node $node) {
|
||||||
return (int)$node->getId();
|
return (int)$node->getId();
|
||||||
}, $nodes);
|
}, $nodes);
|
||||||
$this->assertEquals([$id2, $id1, $id3], $ids);// sort folders before files with the same mtime, folders get the lowest child mtime
|
$this->assertEquals([$id2, $id3], $ids);
|
||||||
$this->assertEquals($baseTime, $nodes[0]->getMTime());
|
$this->assertEquals($baseTime, $nodes[0]->getMTime());
|
||||||
$this->assertEquals($baseTime - 100, $nodes[1]->getMTime());
|
$this->assertEquals($baseTime - 100, $nodes[1]->getMTime());
|
||||||
$this->assertEquals($baseTime - 100, $nodes[2]->getMTime());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testRecentJail() {
|
public function testRecentJail() {
|
||||||
|
@ -952,7 +951,7 @@ class FolderTest extends \Test\TestCase {
|
||||||
|
|
||||||
$node = new \OC\Files\Node\Folder($root, $view, $folderPath, $folderInfo);
|
$node = new \OC\Files\Node\Folder($root, $view, $folderPath, $folderInfo);
|
||||||
|
|
||||||
$nodes = $node->getRecent($baseTime - 500);
|
$nodes = $node->getRecent(5);
|
||||||
$ids = array_map(function (Node $node) {
|
$ids = array_map(function (Node $node) {
|
||||||
return (int)$node->getId();
|
return (int)$node->getId();
|
||||||
}, $nodes);
|
}, $nodes);
|
||||||
|
|
Loading…
Reference in New Issue