aboutsummaryrefslogtreecommitdiff
path: root/app/Models/BooleanSearch.php
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2022-08-16 10:56:07 +0200
committerGravatar GitHub <noreply@github.com> 2022-08-16 10:56:07 +0200
commite27eb1ca9198119ea1b0bd79be5f1aead45d615a (patch)
treefd4e2767ab4d65a68b437d77f57b9e6274a65b9d /app/Models/BooleanSearch.php
parent8587efa62189a30e3e47075739382d52ecc34cb6 (diff)
Basic support for negative searches with parentheses (#4503)
* Basic support for negative searches with parentheses * `!((author:Alice intitle:hello) OR (author:Bob intitle:world))` * `(author:Alice intitle:hello) !(author:Bob intitle:world)` * `!(S:1 OR S:2)` * Minor documentation / comment * Remove syslog debug line
Diffstat (limited to 'app/Models/BooleanSearch.php')
-rw-r--r--app/Models/BooleanSearch.php17
1 files changed, 15 insertions, 2 deletions
diff --git a/app/Models/BooleanSearch.php b/app/Models/BooleanSearch.php
index 332757556..b1c7bbd3b 100644
--- a/app/Models/BooleanSearch.php
+++ b/app/Models/BooleanSearch.php
@@ -10,7 +10,7 @@ class FreshRSS_BooleanSearch {
/** @var array<FreshRSS_BooleanSearch|FreshRSS_Search> */
private $searches = array();
- /** @var string 'AND' or 'OR' */
+ /** @var string 'AND' or 'OR' or 'AND NOT' */
private $operator;
public function __construct(string $input, int $level = 0, $operator = 'AND') {
@@ -123,7 +123,20 @@ class FreshRSS_BooleanSearch {
$hasParenthesis = true;
$before = trim($before);
- if (preg_match('/\bOR$/i', $before)) {
+ if (preg_match('/[!-]$/i', $before)) {
+ // Trim trailing negation
+ $before = substr($before, 0, -1);
+
+ // The text prior to the negation is a BooleanSearch
+ $searchBefore = new FreshRSS_BooleanSearch($before, $level + 1, $nextOperator);
+ if (count($searchBefore->searches()) > 0) {
+ $this->searches[] = $searchBefore;
+ }
+ $before = '';
+
+ // The next BooleanSearch will have to be combined with AND NOT instead of default AND
+ $nextOperator = 'AND NOT';
+ } elseif (preg_match('/\bOR$/i', $before)) {
// Trim trailing OR
$before = substr($before, 0, -2);