mirror of
https://code.mensbeam.com/MensBeam/Arsse.git
synced 2024-12-22 21:22:40 +00:00
Handle edge case with folder 0
Folder 0 (the root folder) is a valid, though nonsensical selection: using it as a positive option is the same as not using the option at all, and using it as a negative option necessarily yields an empty set. However, it can in some contexts be validly specified, and so it should be handled consistently. It had not been previously, but is now.
This commit is contained in:
parent
98f6fca7e3
commit
cce1089e10
3 changed files with 5 additions and 2 deletions
|
@ -49,6 +49,7 @@ class ExclusionContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __clone() {
|
public function __clone() {
|
||||||
|
// if the context was cloned because its parent was cloned, change the parent to the clone
|
||||||
if ($this->parent) {
|
if ($this->parent) {
|
||||||
$t = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS | \DEBUG_BACKTRACE_PROVIDE_OBJECT, 2)[1];
|
$t = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS | \DEBUG_BACKTRACE_PROVIDE_OBJECT, 2)[1];
|
||||||
if (($t['object'] ?? null) instanceof self && $t['function'] === "__clone") {
|
if (($t['object'] ?? null) instanceof self && $t['function'] === "__clone") {
|
||||||
|
|
|
@ -1461,13 +1461,13 @@ class Database {
|
||||||
}
|
}
|
||||||
if ($context->folder()) {
|
if ($context->folder()) {
|
||||||
// add a common table expression to list the folder and its children so that we select from the entire subtree
|
// add a common table expression to list the folder and its children so that we select from the entire subtree
|
||||||
$q->setCTE("folders(folder)", "SELECT ? union select id from arsse_folders join folders on parent = folder", "int", $context->folder);
|
$q->setCTE("folders(folder)", "SELECT ? union select id from arsse_folders join folders on coalesce(parent,0) = folder", "int", $context->folder);
|
||||||
// limit subscriptions to the listed folders
|
// limit subscriptions to the listed folders
|
||||||
$q->setWhere("coalesce(arsse_subscriptions.folder,0) in (select folder from folders)");
|
$q->setWhere("coalesce(arsse_subscriptions.folder,0) in (select folder from folders)");
|
||||||
}
|
}
|
||||||
if ($context->not->folder()) {
|
if ($context->not->folder()) {
|
||||||
// add a common table expression to list the folder and its children so that we exclude from the entire subtree
|
// add a common table expression to list the folder and its children so that we exclude from the entire subtree
|
||||||
$q->setCTE("folders_excluded(folder)", "SELECT ? union select id from arsse_folders join folders_excluded on parent = folder", "int", $context->not->folder);
|
$q->setCTE("folders_excluded(folder)", "SELECT ? union select id from arsse_folders join folders_excluded on coalesce(parent,0) = folder", "int", $context->not->folder);
|
||||||
// excluded any subscriptions in the listed folders
|
// excluded any subscriptions in the listed folders
|
||||||
$q->setWhereNot("coalesce(arsse_subscriptions.folder,0) in (select folder from folders_excluded)");
|
$q->setWhereNot("coalesce(arsse_subscriptions.folder,0) in (select folder from folders_excluded)");
|
||||||
}
|
}
|
||||||
|
|
|
@ -424,6 +424,7 @@ trait SeriesArticle {
|
||||||
return [
|
return [
|
||||||
'Blank context' => [new Context, [1,2,3,4,5,6,7,8,19,20]],
|
'Blank context' => [new Context, [1,2,3,4,5,6,7,8,19,20]],
|
||||||
'Folder tree' => [(new Context)->folder(1), [5,6,7,8]],
|
'Folder tree' => [(new Context)->folder(1), [5,6,7,8]],
|
||||||
|
'Entire folder tree' => [(new Context)->folder(0), [1,2,3,4,5,6,7,8,19,20]],
|
||||||
'Leaf folder' => [(new Context)->folder(6), [7,8]],
|
'Leaf folder' => [(new Context)->folder(6), [7,8]],
|
||||||
'Root folder only' => [(new Context)->folderShallow(0), [1,2,3,4]],
|
'Root folder only' => [(new Context)->folderShallow(0), [1,2,3,4]],
|
||||||
'Shallow folder' => [(new Context)->folderShallow(1), [5,6]],
|
'Shallow folder' => [(new Context)->folderShallow(1), [5,6]],
|
||||||
|
@ -506,6 +507,7 @@ trait SeriesArticle {
|
||||||
'Excluding tag ID 5' => [(new Context)->not->tag(5), [1,2,3,4,5,6]],
|
'Excluding tag ID 5' => [(new Context)->not->tag(5), [1,2,3,4,5,6]],
|
||||||
'Excluding tag "Technology"' => [(new Context)->not->tagName("Technology"), [1,2,3,4,19,20]],
|
'Excluding tag "Technology"' => [(new Context)->not->tagName("Technology"), [1,2,3,4,19,20]],
|
||||||
'Excluding tag "Politics"' => [(new Context)->not->tagName("Politics"), [1,2,3,4,5,6]],
|
'Excluding tag "Politics"' => [(new Context)->not->tagName("Politics"), [1,2,3,4,5,6]],
|
||||||
|
'Excluding entire folder tree' => [(new Context)->not->folder(0), []],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue