diff options
| author | 2020-04-01 17:26:19 +0200 | |
|---|---|---|
| committer | 2020-04-01 17:26:19 +0200 | |
| commit | 61c8026ac98a5ed7d4c715102d66d56d967553ab (patch) | |
| tree | d10292dc8446d29fbe2f7b71856c7c2a4bd98e09 /app/Models/Search.php | |
| parent | 656b61ff2956351538cc70fe79cc534b1eb58e0c (diff) | |
Implement negation for searching by date intervals (#2869)
* Implement negation for searching by date intervals
#fix https://github.com/FreshRSS/FreshRSS/issues/2866
Allow searching for e.g. `!date:P1W` to exlude all articles newer than
one week.
More generally, allows exclusion on some date intervals.
* Fix OR
Diffstat (limited to 'app/Models/Search.php')
| -rw-r--r-- | app/Models/Search.php | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/app/Models/Search.php b/app/Models/Search.php index f9cda7354..74264b712 100644 --- a/app/Models/Search.php +++ b/app/Models/Search.php @@ -24,6 +24,10 @@ class FreshRSS_Search { private $search; private $not_intitle; + private $not_min_date; + private $not_max_date; + private $not_min_pubdate; + private $not_max_pubdate; private $not_inurl; private $not_author; private $not_tags; @@ -37,6 +41,9 @@ class FreshRSS_Search { $input = preg_replace('/:"(.*?)"/', ':"\1"', $input); + $input = $this->parseNotPubdateSearch($input); + $input = $this->parseNotDateSearch($input); + $input = $this->parseNotIntitleSearch($input); $input = $this->parseNotAuthorSearch($input); $input = $this->parseNotInurlSearch($input); @@ -72,7 +79,9 @@ class FreshRSS_Search { public function getMinDate() { return $this->min_date; } - + public function getNotMinDate() { + return $this->not_min_date; + } public function setMinDate($value) { return $this->min_date = $value; } @@ -80,7 +89,9 @@ class FreshRSS_Search { public function getMaxDate() { return $this->max_date; } - + public function getNotMaxDate() { + return $this->not_max_date; + } public function setMaxDate($value) { return $this->max_date = $value; } @@ -88,10 +99,16 @@ class FreshRSS_Search { public function getMinPubdate() { return $this->min_pubdate; } + public function getNotMinPubdate() { + return $this->not_min_pubdate; + } public function getMaxPubdate() { return $this->max_pubdate; } + public function getNotMaxPubdate() { + return $this->not_max_pubdate; + } public function getInurl() { return $this->inurl; @@ -257,6 +274,18 @@ class FreshRSS_Search { return $input; } + private function parseNotDateSearch($input) { + if (preg_match_all('/[!-]date:(?P<search>[^\s]*)/', $input, $matches)) { + $input = str_replace($matches[0], '', $input); + $dates = self::removeEmptyValues($matches['search']); + if (!empty($dates[0])) { + list($this->not_min_date, $this->not_max_date) = parseDateInterval($dates[0]); + } + } + return $input; + } + + /** * Parse the search string to find pubdate keyword and the search related * to it. @@ -276,6 +305,17 @@ class FreshRSS_Search { return $input; } + private function parseNotPubdateSearch($input) { + if (preg_match_all('/[!-]pubdate:(?P<search>[^\s]*)/', $input, $matches)) { + $input = str_replace($matches[0], '', $input); + $dates = self::removeEmptyValues($matches['search']); + if (!empty($dates[0])) { + list($this->not_min_pubdate, $this->not_max_pubdate) = parseDateInterval($dates[0]); + } + } + return $input; + } + /** * Parse the search string to find tags keyword (# followed by a word) * and the search related to it. |
