tq: mark hidden files

Signed-off-by: Varun Patil <radialapps@gmail.com>
pull/807/merge
Varun Patil 2023-10-02 17:09:10 -07:00
parent 58760b1c53
commit 5820c53857
2 changed files with 30 additions and 25 deletions

View File

@ -10,23 +10,15 @@ trait TimelineQueryCTE
* CTE to get all files recursively in the given top folders
* :topFolderIds - The top folders to get files from.
*
* @param bool $noHidden Whether to filter out files in hidden folders
* @param bool $hidden Whether to include files in hidden folders
* If the top folder is hidden, the files in it will still be returned
* Hidden files are marked as such in the "hidden" field
*/
protected static function CTE_FOLDERS_ALL(bool $noHidden): string
protected static function CTE_FOLDERS_ALL(bool $hidden): string
{
// Whether to filter out the archive folder
$CLS_HIDDEN_JOIN = $noHidden ? "f.name NOT LIKE '.%'" : '1 = 1';
// Filter out folder MIME types
$FOLDER_MIME_QUERY = "SELECT MAX(id) FROM *PREFIX*mimetypes WHERE mimetype = 'httpd/unix-directory'";
// Select filecache as f
$BASE_QUERY = 'SELECT f.fileid, f.name FROM *PREFIX*filecache f';
// From top folders
$CLS_TOP_FOLDER = 'f.fileid IN (:topFolderIds)';
// Select 1 if there is a .nomedia file in the folder
$SEL_NOMEDIA = "SELECT 1 FROM *PREFIX*filecache f2
WHERE (f2.parent = f.fileid)
@ -35,22 +27,29 @@ trait TimelineQueryCTE
// Check no nomedia file exists in the folder
$CLS_NOMEDIA = "NOT EXISTS ({$SEL_NOMEDIA})";
// Whether to filter out hidden folders
$CLS_HIDDEN_JOIN = $hidden ? '1 = 1' : "f.name NOT LIKE '.%'";
return
"*PREFIX*cte_folders_all(fileid, name) AS (
{$BASE_QUERY}
"*PREFIX*cte_folders_all(fileid, name, hidden) AS (
SELECT f.fileid, f.name,
(0) AS hidden
FROM *PREFIX*filecache f
WHERE (
{$CLS_TOP_FOLDER} AND
f.fileid IN (:topFolderIds) AND
{$CLS_NOMEDIA}
)
UNION ALL
{$BASE_QUERY}
SELECT f.fileid, f.name,
(CASE WHEN c.hidden = 1 OR f.name LIKE '.%' THEN 1 ELSE 0 END) AS hidden
FROM *PREFIX*filecache f
INNER JOIN *PREFIX*cte_folders_all c
ON (
f.parent = c.fileid AND
f.mimetype = ({$FOLDER_MIME_QUERY}) AND
{$CLS_HIDDEN_JOIN}
({$CLS_HIDDEN_JOIN})
)
WHERE (
{$CLS_NOMEDIA}
@ -58,19 +57,25 @@ trait TimelineQueryCTE
)";
}
/** CTE to get all folders recursively in the given top folders excluding archive */
protected static function CTE_FOLDERS(): string
/**
* CTE to get all folders recursively in the given top folders.
*
* @param bool $hidden Whether to include files in hidden folders
*/
protected static function CTE_FOLDERS(bool $hidden): string
{
$cte = '*PREFIX*cte_folders AS (
$CLS_HIDDEN = $hidden ? 'MIN(hidden)' : '0';
$cte = "*PREFIX*cte_folders AS (
SELECT
fileid
fileid, ({$CLS_HIDDEN}) AS hidden
FROM
*PREFIX*cte_folders_all
GROUP BY
fileid
)';
)";
return self::bundleCTEs([self::CTE_FOLDERS_ALL(true), $cte]);
return self::bundleCTEs([self::CTE_FOLDERS_ALL($hidden), $cte]);
}
/** CTE to get all archive folders recursively in the given top folders */
@ -94,7 +99,7 @@ trait TimelineQueryCTE
ON (f.parent = c.fileid)
)";
return self::bundleCTEs([self::CTE_FOLDERS_ALL(false), $cte]);
return self::bundleCTEs([self::CTE_FOLDERS_ALL(true), $cte]);
}
protected static function bundleCTEs(array $ctes): string

View File

@ -126,7 +126,7 @@ trait TimelineQueryDays
// Get SQL
$CTE_SQL = \array_key_exists('cteFoldersArchive', $params) && $params['cteFoldersArchive']
? self::CTE_FOLDERS_ARCHIVE()
: self::CTE_FOLDERS();
: self::CTE_FOLDERS(false);
// Add WITH clause if needed
if (false !== strpos($sql, 'cte_folders')) {