diff options
| author | Andrew Dolgov <fox@fakecake.org> | 2025-02-08 17:19:20 +0000 |
|---|---|---|
| committer | Andrew Dolgov <fox@fakecake.org> | 2025-02-08 17:19:20 +0000 |
| commit | 169ff6de341b20803796298d8ffea3ee4c4c4f09 (patch) | |
| tree | db2c7c8796359accedeb6c6d06842d4895c9821c /classes | |
| parent | 59b94a9e455dabd54dfc7684637333826d70306f (diff) | |
| parent | 708563acd4aac95bc7a02b4b4e1f3725ad84fe8a (diff) | |
Merge branch 'feature/filter-test-cleanup' into 'master'
Clean up 'Pref_Filters::testFilterDo()'.
See merge request tt-rss/tt-rss!100
Diffstat (limited to 'classes')
| -rw-r--r-- | classes/Pref_Filters.php | 103 |
1 files changed, 36 insertions, 67 deletions
diff --git a/classes/Pref_Filters.php b/classes/Pref_Filters.php index 28de1ab82..b3e378ccc 100644 --- a/classes/Pref_Filters.php +++ b/classes/Pref_Filters.php @@ -70,43 +70,38 @@ class Pref_Filters extends Handler_Protected { $offset = (int) clean($_REQUEST["offset"]); $limit = (int) clean($_REQUEST["limit"]); - $filter = array(); - - $filter["enabled"] = true; - $filter["match_any_rule"] = checkbox_to_sql_bool($_REQUEST["match_any_rule"] ?? false); - $filter["inverse"] = checkbox_to_sql_bool($_REQUEST["inverse"] ?? false); - - $filter["rules"] = array(); - $filter["actions"] = array("dummy-action"); - - $res = $this->pdo->query("SELECT id,name FROM ttrss_filter_types"); + $filter = [ + 'enabled' => true, + 'match_any_rule' => checkbox_to_sql_bool($_REQUEST['match_any_rule'] ?? false), + 'inverse' => checkbox_to_sql_bool($_REQUEST['inverse'] ?? false), + 'rules' => [], + 'actions' => ['dummy-action'], + ]; /** @var array<int, string> */ $filter_types = []; - while ($line = $res->fetch()) { - $filter_types[$line["id"]] = $line["name"]; + foreach (ORM::for_table('ttrss_filter_types')->find_many() as $filter_type) { + $filter_types[$filter_type->id] = $filter_type->name; } - $scope_qparts = array(); - - $rctr = 0; + $scope_qparts = []; - /** @var string $r */ - foreach (clean($_REQUEST["rule"]) AS $r) { + /** @var string $rule_json */ + foreach (clean($_REQUEST['rule']) as $rule_json) { /** @var array{'reg_exp': string, 'filter_type': int, 'feed_id': array<int, int|string>, 'name': string}|null */ - $rule = json_decode($r, true); + $rule = json_decode($rule_json, true); - if ($rule && $rctr < 5) { - $rule["type"] = $filter_types[$rule["filter_type"]]; - unset($rule["filter_type"]); + if (is_array($rule)) { + $rule['type'] = $filter_types[$rule['filter_type']]; + unset($rule['filter_type']); + array_push($filter['rules'], $rule); $scope_inner_qparts = []; /** @var int|string $feed_id may be a category string (e.g. 'CAT:7') or feed ID int */ foreach ($rule["feed_id"] as $feed_id) { - - if (str_starts_with("$feed_id", "CAT:")) { + if (str_starts_with("$feed_id", "CAT:")) { $cat_id = (int) substr("$feed_id", 4); array_push($scope_inner_qparts, "cat_id = " . $cat_id); } else if (is_numeric($feed_id) && $feed_id > 0) { @@ -114,56 +109,33 @@ class Pref_Filters extends Handler_Protected { } } - if (count($scope_inner_qparts) > 0) { - array_push($scope_qparts, "(" . implode(" OR ", $scope_inner_qparts) . ")"); - } - - array_push($filter["rules"], $rule); - - ++$rctr; - } else { - break; + if (count($scope_inner_qparts) > 0) + array_push($scope_qparts, '(' . implode(' OR ', $scope_inner_qparts) . ')'); } } - if (count($scope_qparts) == 0) $scope_qparts = ["true"]; - - $glue = $filter['match_any_rule'] ? " OR " : " AND "; - $scope_qpart = join($glue, $scope_qparts); - - $rv = array(); - - //while ($found < $limit && $offset < $limit * 1000 && time() - $started < ini_get("max_execution_time") * 0.7) { - - $sth = $this->pdo->prepare("SELECT ttrss_entries.id, - ttrss_entries.title, - ttrss_feeds.id AS feed_id, - ttrss_feeds.title AS feed_title, - ttrss_feed_categories.id AS cat_id, - content, - date_entered, - link, - author, - tag_cache - FROM - ttrss_entries, ttrss_user_entries - LEFT JOIN ttrss_feeds ON (feed_id = ttrss_feeds.id) - LEFT JOIN ttrss_feed_categories ON (ttrss_feeds.cat_id = ttrss_feed_categories.id) - WHERE - ref_id = ttrss_entries.id AND - ($scope_qpart) AND - ttrss_user_entries.owner_uid = ? - ORDER BY date_entered DESC LIMIT $limit OFFSET $offset"); + $query = ORM::for_table('ttrss_entries') + ->table_alias('e') + ->select_many('e.title', 'e.content', 'e.date_entered', 'e.link', 'e.author', 'ue.tag_cache', + ['feed_id' => 'f.id', 'feed_title' => 'f.title', 'cat_id' => 'fc.id']) + ->join('ttrss_user_entries', [ 'ue.ref_id', '=', 'e.id'], 'ue') + ->left_outer_join('ttrss_feeds', ['f.id', '=', 'ue.feed_id'], 'f') + ->left_outer_join('ttrss_feed_categories', ['fc.id', '=', 'f.cat_id'], 'fc') + ->where('ue.owner_uid', $_SESSION['uid']) + ->order_by_desc('e.date_entered') + ->limit($limit) + ->offset($offset); - $sth->execute([$_SESSION['uid']]); + if (count($scope_qparts) > 0) + $query->where_raw(join($filter['match_any_rule'] ? ' OR ' : ' AND ', $scope_qparts)); - while ($line = $sth->fetch()) { + $rv = []; + foreach ($query->find_array() as $line) { $rc = RSSUtils::get_article_filters(array($filter), $line['title'], $line['content'], $line['link'], $line['author'], explode(",", $line['tag_cache'])); if (count($rc) > 0) { - $line["content_preview"] = truncate_string(strip_tags($line["content"]), 200, '…'); $excerpt_length = 100; @@ -176,13 +148,10 @@ class Pref_Filters extends Handler_Protected { $content_preview = $line["content_preview"]; - $tmp = "<li><span class='title'>" . $line["title"] . "</span><br/>" . + $rv[] = "<li><span class='title'>" . $line["title"] . "</span><br/>" . "<span class='feed'>" . $line['feed_title'] . "</span>, <span class='date'>" . mb_substr($line["date_entered"], 0, 16) . "</span>" . "<div class='preview text-muted'>" . $content_preview . "</div>" . "</li>"; - - array_push($rv, $tmp); - } } |