mirror of
https://tt-rss.org/git/tt-rss.git
synced 2024-06-28 12:10:52 +02:00
implement filter testing
This commit is contained in:
parent
9299102f43
commit
4e02f58294
|
@ -8,46 +8,46 @@ class Pref_Filters extends Handler_Protected {
|
||||||
return array_search($method, $csrf_ignored) !== false;
|
return array_search($method, $csrf_ignored) !== false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* function filter_test($filter_type, $reg_exp,
|
function testFilter() {
|
||||||
$action_id, $action_param, $filter_param, $inverse, $feed_id, $cat_id,
|
$filter = array();
|
||||||
$cat_filter) {
|
|
||||||
|
|
||||||
$result = db_query($this->link, "SELECT name FROM ttrss_filter_types WHERE
|
$filter["enabled"] = true;
|
||||||
id = " . $filter_type);
|
$filter["match_any_rule"] = sql_bool_to_bool(
|
||||||
|
checkbox_to_sql_bool(db_escape_string($_REQUEST["match_any_rule"])));
|
||||||
|
$filter["rules"] = array();
|
||||||
|
|
||||||
|
$result = db_query($this->link, "SELECT id,name FROM ttrss_filter_types");
|
||||||
$type_name = db_fetch_result($result, 0, "name");
|
$type_name = db_fetch_result($result, 0, "name");
|
||||||
|
|
||||||
$result = db_query($this->link, "SELECT name FROM ttrss_filter_actions WHERE
|
$filter_types = array();
|
||||||
id = " . $action_id);
|
while ($line = db_fetch_assoc($result)) {
|
||||||
$action_name = db_fetch_result($result, 0, "name");
|
$filter_types[$line["id"]] = $line["name"];
|
||||||
|
}
|
||||||
|
|
||||||
$filter["reg_exp"] = $reg_exp;
|
$rctr = 0;
|
||||||
$filter["action"] = $action_name;
|
foreach ($_REQUEST["rule"] AS $r) {
|
||||||
$filter["type"] = $type_name;
|
$rule = json_decode($r, true);
|
||||||
$filter["action_param"] = $action_param;
|
|
||||||
$filter["filter_param"] = $filter_param;
|
|
||||||
$filter["inverse"] = $inverse;
|
|
||||||
|
|
||||||
$filters[$type_name] = array($filter);
|
if ($rule && $rctr < 5) {
|
||||||
|
$rule["type"] = $filter_types[$rule["filter_type"]];
|
||||||
|
unset($rule["filter_type"]);
|
||||||
|
|
||||||
if ($feed_id)
|
if (strpos($rule["feed_id"], "CAT:") === 0) {
|
||||||
$feed = $feed_id;
|
$rule["cat_id"] = (int) substr($rule["feed_id"], 4);
|
||||||
else
|
unset($rule["feed_id"]);
|
||||||
$feed = -4;
|
}
|
||||||
|
|
||||||
$regexp_valid = preg_match('/' . $filter['reg_exp'] . '/',
|
array_push($filter["rules"], $rule);
|
||||||
$filter['reg_exp']) !== FALSE;
|
|
||||||
|
|
||||||
print __("Articles matching this filter:");
|
++$rctr;
|
||||||
|
} else {
|
||||||
print "<div class=\"filterTestHolder\">";
|
break;
|
||||||
print "<table width=\"100%\" cellspacing=\"0\" id=\"prefErrorFeedList\">";
|
}
|
||||||
|
}
|
||||||
if ($regexp_valid) {
|
|
||||||
|
|
||||||
$feed_title = getFeedTitle($this->link, $feed);
|
$feed_title = getFeedTitle($this->link, $feed);
|
||||||
|
|
||||||
$qfh_ret = queryFeedHeadlines($this->link, $cat_filter ? $cat_id : $feed,
|
$qfh_ret = queryFeedHeadlines($this->link, -4, 30, "", false, false, false,
|
||||||
30, "", $cat_filter, false, false,
|
|
||||||
false, "date_entered DESC", 0, $_SESSION["uid"], $filter);
|
false, "date_entered DESC", 0, $_SESSION["uid"], $filter);
|
||||||
|
|
||||||
$result = $qfh_ret[0];
|
$result = $qfh_ret[0];
|
||||||
|
@ -55,6 +55,11 @@ class Pref_Filters extends Handler_Protected {
|
||||||
$articles = array();
|
$articles = array();
|
||||||
$found = 0;
|
$found = 0;
|
||||||
|
|
||||||
|
print __("Articles matching this filter:");
|
||||||
|
|
||||||
|
print "<div class=\"filterTestHolder\">";
|
||||||
|
print "<table width=\"100%\" cellspacing=\"0\" id=\"prefErrorFeedList\">";
|
||||||
|
|
||||||
while ($line = db_fetch_assoc($result)) {
|
while ($line = db_fetch_assoc($result)) {
|
||||||
|
|
||||||
$entry_timestamp = strtotime($line["updated"]);
|
$entry_timestamp = strtotime($line["updated"]);
|
||||||
|
@ -87,18 +92,18 @@ class Pref_Filters extends Handler_Protected {
|
||||||
|
|
||||||
if ($found == 0) {
|
if ($found == 0) {
|
||||||
print "<tr><td align='center'>" .
|
print "<tr><td align='center'>" .
|
||||||
__("No articles matching this filter has been found.") . "</td></tr>";
|
__("No recent articles matching this filter have been found.") . "</td></tr>";
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print "<tr><td align='center' class='error'>" .
|
|
||||||
__("Invalid regular expression.") . "</td></tr>";
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
print "</table>";
|
print "</table></div>";
|
||||||
|
|
||||||
|
print "<div style='text-align : center'>";
|
||||||
|
print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('filterTestDlg').hide()\">".
|
||||||
|
__('Close this window')."</button>";
|
||||||
print "</div>";
|
print "</div>";
|
||||||
|
|
||||||
} */
|
}
|
||||||
|
|
||||||
|
|
||||||
function getfiltertree() {
|
function getfiltertree() {
|
||||||
$root = array();
|
$root = array();
|
||||||
|
@ -239,11 +244,14 @@ class Pref_Filters extends Handler_Protected {
|
||||||
|
|
||||||
while ($line = db_fetch_assoc($rules_result)) {
|
while ($line = db_fetch_assoc($rules_result)) {
|
||||||
if (sql_bool_to_bool($line["cat_filter"])) {
|
if (sql_bool_to_bool($line["cat_filter"])) {
|
||||||
unset($line["cat_filter"]);
|
|
||||||
$line["feed_id"] = "CAT:" . (int)$line["cat_id"];
|
$line["feed_id"] = "CAT:" . (int)$line["cat_id"];
|
||||||
unset($line["cat_id"]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unset($line["cat_filter"]);
|
||||||
|
unset($line["cat_id"]);
|
||||||
|
unset($line["filter_id"]);
|
||||||
|
unset($line["id"]);
|
||||||
|
|
||||||
$data = htmlspecialchars(json_encode($line));
|
$data = htmlspecialchars(json_encode($line));
|
||||||
|
|
||||||
print "<li><input dojoType='dijit.form.CheckBox' type='checkbox' onclick='toggleSelectListRow2(this)'>".
|
print "<li><input dojoType='dijit.form.CheckBox' type='checkbox' onclick='toggleSelectListRow2(this)'>".
|
||||||
|
@ -283,6 +291,10 @@ class Pref_Filters extends Handler_Protected {
|
||||||
|
|
||||||
while ($line = db_fetch_assoc($actions_result)) {
|
while ($line = db_fetch_assoc($actions_result)) {
|
||||||
$line["action_param_label"] = $line["action_param"];
|
$line["action_param_label"] = $line["action_param"];
|
||||||
|
|
||||||
|
unset($line["filter_id"]);
|
||||||
|
unset($line["id"]);
|
||||||
|
|
||||||
$data = htmlspecialchars(json_encode($line));
|
$data = htmlspecialchars(json_encode($line));
|
||||||
|
|
||||||
print "<li><input dojoType='dijit.form.CheckBox' type='checkbox' onclick='toggleSelectListRow2(this)'>".
|
print "<li><input dojoType='dijit.form.CheckBox' type='checkbox' onclick='toggleSelectListRow2(this)'>".
|
||||||
|
@ -321,8 +333,8 @@ class Pref_Filters extends Handler_Protected {
|
||||||
__('Remove')."</button>";
|
__('Remove')."</button>";
|
||||||
print "</div>";
|
print "</div>";
|
||||||
|
|
||||||
# print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">".
|
print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">".
|
||||||
# __('Test')."</button> ";
|
__('Test')."</button> ";
|
||||||
|
|
||||||
print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').execute()\">".
|
print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').execute()\">".
|
||||||
__('Save')."</button> ";
|
__('Save')."</button> ";
|
||||||
|
@ -379,6 +391,9 @@ class Pref_Filters extends Handler_Protected {
|
||||||
}
|
}
|
||||||
|
|
||||||
function editSave() {
|
function editSave() {
|
||||||
|
if ($_REQUEST["savemode"] && $_REQUEST["savemode"] == "test") {
|
||||||
|
return $this->testFilter();
|
||||||
|
}
|
||||||
|
|
||||||
# print_r($_REQUEST);
|
# print_r($_REQUEST);
|
||||||
|
|
||||||
|
@ -491,6 +506,10 @@ class Pref_Filters extends Handler_Protected {
|
||||||
}
|
}
|
||||||
|
|
||||||
function add() {
|
function add() {
|
||||||
|
if ($_REQUEST["savemode"] && $_REQUEST["savemode"] == "test") {
|
||||||
|
return $this->testFilter();
|
||||||
|
}
|
||||||
|
|
||||||
# print_r($_REQUEST);
|
# print_r($_REQUEST);
|
||||||
|
|
||||||
$enabled = checkbox_to_sql_bool($_REQUEST["enabled"]);
|
$enabled = checkbox_to_sql_bool($_REQUEST["enabled"]);
|
||||||
|
@ -689,8 +708,8 @@ class Pref_Filters extends Handler_Protected {
|
||||||
|
|
||||||
print "<div class=\"dlgButtons\">";
|
print "<div class=\"dlgButtons\">";
|
||||||
|
|
||||||
# print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">".
|
print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">".
|
||||||
# __('Test')."</button> ";
|
__('Test')."</button> ";
|
||||||
|
|
||||||
print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').execute()\">".
|
print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').execute()\">".
|
||||||
__('Create')."</button> ";
|
__('Create')."</button> ";
|
||||||
|
|
|
@ -2281,7 +2281,16 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($filter) {
|
if ($filter) {
|
||||||
$filter_query_part = filter_to_sql($filter);
|
|
||||||
|
if (DB_TYPE == "pgsql") {
|
||||||
|
$query_strategy_part .= " AND updated > NOW() - INTERVAL '14 days' ";
|
||||||
|
} else {
|
||||||
|
$query_strategy_part .= " AND updated > DATE_SUB(NOW(), INTERVAL 14 DAY) ";
|
||||||
|
}
|
||||||
|
|
||||||
|
$override_order = "updated DESC";
|
||||||
|
|
||||||
|
$filter_query_part = filter_to_sql($filter) . " AND";
|
||||||
} else {
|
} else {
|
||||||
$filter_query_part = "";
|
$filter_query_part = "";
|
||||||
}
|
}
|
||||||
|
@ -5049,71 +5058,66 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
function filter_to_sql($filter) {
|
function filter_to_sql($filter) {
|
||||||
$query = "";
|
$query = array();
|
||||||
|
|
||||||
$regexp_valid = preg_match('/' . $filter['reg_exp'] . '/',
|
|
||||||
$filter['reg_exp']) !== FALSE;
|
|
||||||
|
|
||||||
if ($regexp_valid) {
|
|
||||||
|
|
||||||
if (DB_TYPE == "pgsql")
|
if (DB_TYPE == "pgsql")
|
||||||
$reg_qpart = "~";
|
$reg_qpart = "~";
|
||||||
else
|
else
|
||||||
$reg_qpart = "REGEXP";
|
$reg_qpart = "REGEXP";
|
||||||
|
|
||||||
switch ($filter["type"]) {
|
foreach ($filter["rules"] AS $rule) {
|
||||||
|
$regexp_valid = preg_match('/' . $rule['reg_exp'] . '/',
|
||||||
|
$rule['reg_exp']) !== FALSE;
|
||||||
|
|
||||||
|
if ($regexp_valid) {
|
||||||
|
|
||||||
|
$rule['reg_exp'] = db_escape_string($rule['reg_exp']);
|
||||||
|
|
||||||
|
switch ($rule["type"]) {
|
||||||
case "title":
|
case "title":
|
||||||
$query = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
|
$qpart = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
|
||||||
$filter['reg_exp'] . "')";
|
$rule['reg_exp'] . "')";
|
||||||
break;
|
break;
|
||||||
case "content":
|
case "content":
|
||||||
$query = "LOWER(ttrss_entries.content) $reg_qpart LOWER('".
|
$qpart = "LOWER(ttrss_entries.content) $reg_qpart LOWER('".
|
||||||
$filter['reg_exp'] . "')";
|
$rule['reg_exp'] . "')";
|
||||||
break;
|
break;
|
||||||
case "both":
|
case "both":
|
||||||
$query = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
|
$qpart = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
|
||||||
$filter['reg_exp'] . "') OR LOWER(" .
|
$rule['reg_exp'] . "') OR LOWER(" .
|
||||||
"ttrss_entries.content) $reg_qpart LOWER('" . $filter['reg_exp'] . "')";
|
"ttrss_entries.content) $reg_qpart LOWER('" . $rule['reg_exp'] . "')";
|
||||||
break;
|
break;
|
||||||
case "tag":
|
case "tag":
|
||||||
$query = "LOWER(ttrss_user_entries.tag_cache) $reg_qpart LOWER('".
|
$qpart = "LOWER(ttrss_user_entries.tag_cache) $reg_qpart LOWER('".
|
||||||
$filter['reg_exp'] . "')";
|
$rule['reg_exp'] . "')";
|
||||||
break;
|
break;
|
||||||
case "link":
|
case "link":
|
||||||
$query = "LOWER(ttrss_entries.link) $reg_qpart LOWER('".
|
$qpart = "LOWER(ttrss_entries.link) $reg_qpart LOWER('".
|
||||||
$filter['reg_exp'] . "')";
|
$rule['reg_exp'] . "')";
|
||||||
break;
|
|
||||||
case "date":
|
|
||||||
|
|
||||||
if ($filter["filter_param"] == "before")
|
|
||||||
$cmp_qpart = "<";
|
|
||||||
else
|
|
||||||
$cmp_qpart = ">=";
|
|
||||||
|
|
||||||
$timestamp = date("Y-m-d H:N:s", strtotime($filter["reg_exp"]));
|
|
||||||
$query = "ttrss_entries.date_entered $cmp_qpart '$timestamp'";
|
|
||||||
break;
|
break;
|
||||||
case "author":
|
case "author":
|
||||||
$query = "LOWER(ttrss_entries.author) $reg_qpart LOWER('".
|
$qpart = "LOWER(ttrss_entries.author) $reg_qpart LOWER('".
|
||||||
$filter['reg_exp'] . "')";
|
$rule['reg_exp'] . "')";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($filter["inverse"])
|
if (isset($rule["feed_id"])) {
|
||||||
$query = "NOT ($query)";
|
$qpart .= " AND feed_id " . ($rule["feed_id"] ? '= ' . $rule["feed_id"] : 'IS NULL');
|
||||||
|
|
||||||
if ($query) {
|
|
||||||
if (DB_TYPE == "pgsql") {
|
|
||||||
$query = " ($query) AND ttrss_entries.date_entered > NOW() - INTERVAL '14 days'";
|
|
||||||
} else {
|
|
||||||
$query = " ($query) AND ttrss_entries.date_entered > DATE_SUB(NOW(), INTERVAL 14 DAY)";
|
|
||||||
}
|
|
||||||
$query .= " AND ";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $query;
|
if (isset($rule["cat_id"])) {
|
||||||
|
$qpart .= " AND cat_id " . ($rule["cat_id"] ? '= ' . $rule["cat_id"] : 'IS NULL');
|
||||||
|
}
|
||||||
|
|
||||||
|
array_push($query, "($qpart)");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($query) > 0) {
|
||||||
|
return "(" . join($filter["match_any_rule"] ? "OR" : "AND", $query) . ")";
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return "(false)";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1111,6 +1111,20 @@ function quickAddFilter() {
|
||||||
id: "filterEditDlg",
|
id: "filterEditDlg",
|
||||||
title: __("Create Filter"),
|
title: __("Create Filter"),
|
||||||
style: "width: 600px",
|
style: "width: 600px",
|
||||||
|
test: function() {
|
||||||
|
var query = "backend.php?" + dojo.formToQuery("filter_new_form") + "&savemode=test";
|
||||||
|
|
||||||
|
if (dijit.byId("filterTestDlg"))
|
||||||
|
dijit.byId("filterTestDlg").destroyRecursive();
|
||||||
|
|
||||||
|
var test_dlg = new dijit.Dialog({
|
||||||
|
id: "filterTestDlg",
|
||||||
|
title: "Test Filter",
|
||||||
|
style: "width: 600px",
|
||||||
|
href: query});
|
||||||
|
|
||||||
|
test_dlg.show();
|
||||||
|
},
|
||||||
selectRules: function(select) {
|
selectRules: function(select) {
|
||||||
$$("#filterDlg_Matches input[type=checkbox]").each(function(e) {
|
$$("#filterDlg_Matches input[type=checkbox]").each(function(e) {
|
||||||
e.checked = select;
|
e.checked = select;
|
||||||
|
|
14
js/prefs.js
14
js/prefs.js
|
@ -136,6 +136,20 @@ function editFilter(id) {
|
||||||
id: "filterEditDlg",
|
id: "filterEditDlg",
|
||||||
title: __("Edit Filter"),
|
title: __("Edit Filter"),
|
||||||
style: "width: 600px",
|
style: "width: 600px",
|
||||||
|
test: function() {
|
||||||
|
var query = "backend.php?" + dojo.formToQuery("filter_edit_form") + "&savemode=test";
|
||||||
|
|
||||||
|
if (dijit.byId("filterTestDlg"))
|
||||||
|
dijit.byId("filterTestDlg").destroyRecursive();
|
||||||
|
|
||||||
|
var test_dlg = new dijit.Dialog({
|
||||||
|
id: "filterTestDlg",
|
||||||
|
title: "Test Filter",
|
||||||
|
style: "width: 600px",
|
||||||
|
href: query});
|
||||||
|
|
||||||
|
test_dlg.show();
|
||||||
|
},
|
||||||
selectRules: function(select) {
|
selectRules: function(select) {
|
||||||
$$("#filterDlg_Matches input[type=checkbox]").each(function(e) {
|
$$("#filterDlg_Matches input[type=checkbox]").each(function(e) {
|
||||||
e.checked = select;
|
e.checked = select;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user