From 288992d9ad64c52b77983e27f497aa6f4ed5728e Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Wed, 27 Aug 2025 21:56:10 +0200 Subject: Fix logic for searching labels (#7863) `L:1 L:2` is supposed to be an implicit `AND`, while `L:1,2` as well as `L:1 OR L:2` is an `OR` logic --- app/Models/EntryDAO.php | 68 +++++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 30 deletions(-) (limited to 'app/Models/EntryDAO.php') diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php index 8713ba930..4aa7c5056 100644 --- a/app/Models/EntryDAO.php +++ b/app/Models/EntryDAO.php @@ -937,49 +937,57 @@ SQL; } if ($filter->getLabelIds() !== null) { - if ($filter->getLabelIds() === '*') { - $sub_search .= 'AND EXISTS (SELECT et.id_tag FROM `_entrytag` et WHERE et.id_entry = ' . $alias . 'id) '; - } else { - $sub_search .= 'AND ' . $alias . 'id IN (SELECT et.id_entry FROM `_entrytag` et WHERE et.id_tag IN ('; - foreach ($filter->getLabelIds() as $label_id) { - $sub_search .= '?,'; - $values[] = $label_id; + foreach ($filter->getLabelIds() as $label_ids) { + if ($label_ids === '*') { + $sub_search .= 'AND EXISTS (SELECT et.id_tag FROM `_entrytag` et WHERE et.id_entry = ' . $alias . 'id) '; + } else { + $sub_search .= 'AND ' . $alias . 'id IN (SELECT et.id_entry FROM `_entrytag` et WHERE et.id_tag IN ('; + foreach ($label_ids as $label_id) { + $sub_search .= '?,'; + $values[] = $label_id; + } + $sub_search = rtrim($sub_search, ','); + $sub_search .= ')) '; } - $sub_search = rtrim($sub_search, ','); - $sub_search .= ')) '; } } if ($filter->getNotLabelIds() !== null) { - if ($filter->getNotLabelIds() === '*') { - $sub_search .= 'AND NOT EXISTS (SELECT et.id_tag FROM `_entrytag` et WHERE et.id_entry = ' . $alias . 'id) '; - } else { - $sub_search .= 'AND ' . $alias . 'id NOT IN (SELECT et.id_entry FROM `_entrytag` et WHERE et.id_tag IN ('; - foreach ($filter->getNotLabelIds() as $label_id) { - $sub_search .= '?,'; - $values[] = $label_id; + foreach ($filter->getNotLabelIds() as $label_ids) { + if ($label_ids === '*') { + $sub_search .= 'AND NOT EXISTS (SELECT et.id_tag FROM `_entrytag` et WHERE et.id_entry = ' . $alias . 'id) '; + } else { + $sub_search .= 'AND ' . $alias . 'id NOT IN (SELECT et.id_entry FROM `_entrytag` et WHERE et.id_tag IN ('; + foreach ($label_ids as $label_id) { + $sub_search .= '?,'; + $values[] = $label_id; + } + $sub_search = rtrim($sub_search, ','); + $sub_search .= ')) '; } - $sub_search = rtrim($sub_search, ','); - $sub_search .= ')) '; } } if ($filter->getLabelNames() !== null) { - $sub_search .= 'AND ' . $alias . 'id IN (SELECT et.id_entry FROM `_entrytag` et, `_tag` t WHERE et.id_tag = t.id AND t.name IN ('; - foreach ($filter->getLabelNames() as $label_name) { - $sub_search .= '?,'; - $values[] = $label_name; + foreach ($filter->getLabelNames() as $label_names) { + $sub_search .= 'AND ' . $alias . 'id IN (SELECT et.id_entry FROM `_entrytag` et, `_tag` t WHERE et.id_tag = t.id AND t.name IN ('; + foreach ($label_names as $label_name) { + $sub_search .= '?,'; + $values[] = $label_name; + } + $sub_search = rtrim($sub_search, ','); + $sub_search .= ')) '; } - $sub_search = rtrim($sub_search, ','); - $sub_search .= ')) '; } if ($filter->getNotLabelNames() !== null) { - $sub_search .= 'AND ' . $alias . 'id NOT IN (SELECT et.id_entry FROM `_entrytag` et, `_tag` t WHERE et.id_tag = t.id AND t.name IN ('; - foreach ($filter->getNotLabelNames() as $label_name) { - $sub_search .= '?,'; - $values[] = $label_name; + foreach ($filter->getNotLabelNames() as $label_names) { + $sub_search .= 'AND ' . $alias . 'id NOT IN (SELECT et.id_entry FROM `_entrytag` et, `_tag` t WHERE et.id_tag = t.id AND t.name IN ('; + foreach ($label_names as $label_name) { + $sub_search .= '?,'; + $values[] = $label_name; + } + $sub_search = rtrim($sub_search, ','); + $sub_search .= ')) '; } - $sub_search = rtrim($sub_search, ','); - $sub_search .= ')) '; } if ($filter->getAuthor() !== null) { -- cgit v1.2.3