]> git.wh0rd.org - tt-rss.git/commitdiff
implement filter testing
authorAndrew Dolgov <fox@madoka.volgo-balt.ru>
Mon, 3 Sep 2012 11:05:43 +0000 (15:05 +0400)
committerAndrew Dolgov <fox@madoka.volgo-balt.ru>
Mon, 3 Sep 2012 11:05:43 +0000 (15:05 +0400)
classes/pref/filters.php
include/functions.php
js/functions.js
js/prefs.js

index 13b80ac4bbe43066d69687de0aa691ef1a3f50df..4c867c23fd31bbadcc1578eb5f570cf4fbecb647 100644 (file)
@@ -8,97 +8,102 @@ class Pref_Filters extends Handler_Protected {
                return array_search($method, $csrf_ignored) !== false;
        }
 
-/*     function filter_test($filter_type, $reg_exp,
-                       $action_id, $action_param, $filter_param, $inverse, $feed_id, $cat_id,
-                       $cat_filter) {
+       function testFilter() {
+               $filter = array();
 
-               $result = db_query($this->link, "SELECT name FROM ttrss_filter_types WHERE
-                       id = " . $filter_type);
-               $type_name = db_fetch_result($result, 0, "name");
+               $filter["enabled"] = true;
+               $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 name FROM ttrss_filter_actions WHERE
-                       id = " . $action_id);
-               $action_name = db_fetch_result($result, 0, "name");
+               $result = db_query($this->link, "SELECT id,name FROM ttrss_filter_types");
+               $type_name = db_fetch_result($result, 0, "name");
 
-               $filter["reg_exp"] = $reg_exp;
-               $filter["action"] = $action_name;
-               $filter["type"] = $type_name;
-               $filter["action_param"] = $action_param;
-               $filter["filter_param"] = $filter_param;
-               $filter["inverse"] = $inverse;
+               $filter_types = array();
+               while ($line = db_fetch_assoc($result)) {
+                       $filter_types[$line["id"]] = $line["name"];
+               }
 
-               $filters[$type_name] = array($filter);
+               $rctr = 0;
+               foreach ($_REQUEST["rule"] AS $r) {
+                       $rule = json_decode($r, true);
 
-               if ($feed_id)
-                       $feed = $feed_id;
-               else
-                       $feed = -4;
+                       if ($rule && $rctr < 5) {
+                               $rule["type"] = $filter_types[$rule["filter_type"]];
+                               unset($rule["filter_type"]);
 
-               $regexp_valid = preg_match('/' . $filter['reg_exp'] . '/',
-                       $filter['reg_exp']) !== FALSE;
+                               if (strpos($rule["feed_id"], "CAT:") === 0) {
+                                       $rule["cat_id"] = (int) substr($rule["feed_id"], 4);
+                                       unset($rule["feed_id"]);
+                               }
 
-               print __("Articles matching this filter:");
+                               array_push($filter["rules"], $rule);
 
-               print "<div class=\"filterTestHolder\">";
-               print "<table width=\"100%\" cellspacing=\"0\" id=\"prefErrorFeedList\">";
+                               ++$rctr;
+                       } else {
+                               break;
+                       }
+               }
 
-               if ($regexp_valid) {
+               $feed_title = getFeedTitle($this->link, $feed);
 
-                       $feed_title = getFeedTitle($this->link, $feed);
+               $qfh_ret = queryFeedHeadlines($this->link, -4, 30, "", false, false, false,
+                       false, "date_entered DESC", 0, $_SESSION["uid"], $filter);
 
-                       $qfh_ret = queryFeedHeadlines($this->link, $cat_filter ? $cat_id : $feed,
-                               30, "", $cat_filter, false, false,
-                               false, "date_entered DESC", 0, $_SESSION["uid"], $filter);
+               $result = $qfh_ret[0];
 
-                       $result = $qfh_ret[0];
+               $articles = array();
+               $found = 0;
 
-                       $articles = array();
-                       $found = 0;
+               print __("Articles matching this filter:");
 
-                       while ($line = db_fetch_assoc($result)) {
+               print "<div class=\"filterTestHolder\">";
+               print "<table width=\"100%\" cellspacing=\"0\" id=\"prefErrorFeedList\">";
 
-                               $entry_timestamp = strtotime($line["updated"]);
-                               $entry_tags = get_article_tags($this->link, $line["id"], $_SESSION["uid"]);
+               while ($line = db_fetch_assoc($result)) {
 
-                               $content_preview = truncate_string(
-                                       strip_tags($line["content_preview"]), 100, '...');
+                       $entry_timestamp = strtotime($line["updated"]);
+                       $entry_tags = get_article_tags($this->link, $line["id"], $_SESSION["uid"]);
 
-                               if ($line["feed_title"])
-                                       $feed_title = $line["feed_title"];
+                       $content_preview = truncate_string(
+                               strip_tags($line["content_preview"]), 100, '...');
 
-                               print "<tr>";
+                       if ($line["feed_title"])
+                               $feed_title = $line["feed_title"];
 
-                               print "<td width='5%' align='center'><input
-                                       dojoType=\"dijit.form.CheckBox\" checked=\"1\"
-                                       disabled=\"1\" type=\"checkbox\"></td>";
-                               print "<td>";
+                       print "<tr>";
 
-                               print $line["title"];
-                               print "&nbsp;(";
-                               print "<b>" . $feed_title . "</b>";
-                               print "):&nbsp;";
-                               print "<span class=\"insensitive\">" . $content_preview . "</span>";
-                               print " " . mb_substr($line["date_entered"], 0, 16);
+                       print "<td width='5%' align='center'><input
+                               dojoType=\"dijit.form.CheckBox\" checked=\"1\"
+                               disabled=\"1\" type=\"checkbox\"></td>";
+                       print "<td>";
 
-                               print "</td></tr>";
+                       print $line["title"];
+                       print "&nbsp;(";
+                       print "<b>" . $feed_title . "</b>";
+                       print "):&nbsp;";
+                       print "<span class=\"insensitive\">" . $content_preview . "</span>";
+                       print " " . mb_substr($line["date_entered"], 0, 16);
 
-                               $found++;
-                       }
+                       print "</td></tr>";
 
-                       if ($found == 0) {
-                               print "<tr><td align='center'>" .
-                                       __("No articles matching this filter has been found.") . "</td></tr>";
-                       }
-               } else {
-                       print "<tr><td align='center' class='error'>" .
-                               __("Invalid regular expression.") . "</td></tr>";
+                       $found++;
+               }
 
+               if ($found == 0) {
+                       print "<tr><td align='center'>" .
+                               __("No recent articles matching this filter have been found.") . "</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>";
 
-                       } */
+       }
+
 
        function getfiltertree() {
                $root = array();
@@ -239,11 +244,14 @@ class Pref_Filters extends Handler_Protected {
 
                while ($line = db_fetch_assoc($rules_result)) {
                        if (sql_bool_to_bool($line["cat_filter"])) {
-                               unset($line["cat_filter"]);
                                $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));
 
                        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)) {
                        $line["action_param_label"] = $line["action_param"];
+
+                       unset($line["filter_id"]);
+                       unset($line["id"]);
+
                        $data = htmlspecialchars(json_encode($line));
 
                        print "<li><input dojoType='dijit.form.CheckBox' type='checkbox' onclick='toggleSelectListRow2(this)'>".
@@ -321,8 +333,8 @@ class Pref_Filters extends Handler_Protected {
                        __('Remove')."</button>";
                print "</div>";
 
-#              print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">".
-#                      __('Test')."</button> ";
+               print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">".
+                       __('Test')."</button> ";
 
                print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').execute()\">".
                        __('Save')."</button> ";
@@ -379,6 +391,9 @@ class Pref_Filters extends Handler_Protected {
        }
 
        function editSave() {
+               if ($_REQUEST["savemode"] && $_REQUEST["savemode"] == "test") {
+                       return $this->testFilter();
+               }
 
 #              print_r($_REQUEST);
 
@@ -491,6 +506,10 @@ class Pref_Filters extends Handler_Protected {
        }
 
        function add() {
+               if ($_REQUEST["savemode"] && $_REQUEST["savemode"] == "test") {
+                       return $this->testFilter();
+               }
+
 #              print_r($_REQUEST);
 
                $enabled = checkbox_to_sql_bool($_REQUEST["enabled"]);
@@ -689,8 +708,8 @@ class Pref_Filters extends Handler_Protected {
 
                print "<div class=\"dlgButtons\">";
 
-#              print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">".
-#                      __('Test')."</button> ";
+               print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">".
+                       __('Test')."</button> ";
 
                print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').execute()\">".
                        __('Create')."</button> ";
index 2845acb226e234fb2e35f3f4964ec0ea179dc0ea..dd97522c4493b0f9b9a871e9e187339f94ae75eb 100644 (file)
                        }
 
                        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 {
                                $filter_query_part = "";
                        }
        }
 
        function filter_to_sql($filter) {
-               $query = "";
+               $query = array();
 
-               $regexp_valid = preg_match('/' . $filter['reg_exp'] . '/',
-                       $filter['reg_exp']) !== FALSE;
+               if (DB_TYPE == "pgsql")
+                       $reg_qpart = "~";
+               else
+                       $reg_qpart = "REGEXP";
 
-               if ($regexp_valid) {
+               foreach ($filter["rules"] AS $rule) {
+                       $regexp_valid = preg_match('/' . $rule['reg_exp'] . '/',
+                               $rule['reg_exp']) !== FALSE;
 
-                       if (DB_TYPE == "pgsql")
-                               $reg_qpart = "~";
-                       else
-                               $reg_qpart = "REGEXP";
-
-                       switch ($filter["type"]) {
-                               case "title":
-                                       $query = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
-                                               $filter['reg_exp'] . "')";
-                                       break;
-                               case "content":
-                                       $query = "LOWER(ttrss_entries.content) $reg_qpart LOWER('".
-                                               $filter['reg_exp'] . "')";
-                                       break;
-                               case "both":
-                                       $query = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
-                                               $filter['reg_exp'] . "') OR LOWER(" .
-                                               "ttrss_entries.content) $reg_qpart LOWER('" . $filter['reg_exp'] . "')";
-                                       break;
-                               case "tag":
-                                       $query = "LOWER(ttrss_user_entries.tag_cache) $reg_qpart LOWER('".
-                                               $filter['reg_exp'] . "')";
-                                       break;
-                               case "link":
-                                       $query = "LOWER(ttrss_entries.link) $reg_qpart LOWER('".
-                                               $filter['reg_exp'] . "')";
-                                       break;
-                               case "date":
+                       if ($regexp_valid) {
 
-                                       if ($filter["filter_param"] == "before")
-                                               $cmp_qpart = "<";
-                                       else
-                                               $cmp_qpart = ">=";
+                               $rule['reg_exp'] = db_escape_string($rule['reg_exp']);
 
-                                       $timestamp = date("Y-m-d H:N:s", strtotime($filter["reg_exp"]));
-                                       $query = "ttrss_entries.date_entered $cmp_qpart '$timestamp'";
-                                       break;
-                               case "author":
-                                       $query = "LOWER(ttrss_entries.author) $reg_qpart LOWER('".
-                                               $filter['reg_exp'] . "')";
-                                       break;
-                       }
+                               switch ($rule["type"]) {
+                                       case "title":
+                                               $qpart = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
+                                                       $rule['reg_exp'] . "')";
+                                               break;
+                                       case "content":
+                                               $qpart = "LOWER(ttrss_entries.content) $reg_qpart LOWER('".
+                                                       $rule['reg_exp'] . "')";
+                                               break;
+                                       case "both":
+                                               $qpart = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
+                                                       $rule['reg_exp'] . "') OR LOWER(" .
+                                                       "ttrss_entries.content) $reg_qpart LOWER('" . $rule['reg_exp'] . "')";
+                                               break;
+                                       case "tag":
+                                               $qpart = "LOWER(ttrss_user_entries.tag_cache) $reg_qpart LOWER('".
+                                                       $rule['reg_exp'] . "')";
+                                               break;
+                                       case "link":
+                                               $qpart = "LOWER(ttrss_entries.link) $reg_qpart LOWER('".
+                                                       $rule['reg_exp'] . "')";
+                                               break;
+                                       case "author":
+                                               $qpart = "LOWER(ttrss_entries.author) $reg_qpart LOWER('".
+                                                       $rule['reg_exp'] . "')";
+                                               break;
+                               }
 
-                       if ($filter["inverse"])
-                               $query = "NOT ($query)";
+                               if (isset($rule["feed_id"])) {
+                                       $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)";
+                               if (isset($rule["cat_id"])) {
+                                       $qpart .= " AND cat_id " . ($rule["cat_id"] ? '= ' . $rule["cat_id"] : 'IS NULL');
                                }
-                               $query .= " AND ";
+
+                               array_push($query, "($qpart)");
+
                        }
+               }
 
-                       return $query;
+               if (count($query) > 0) {
+                       return "(" . join($filter["match_any_rule"] ? "OR" : "AND", $query) . ")";
                } else {
-                       return false;
+                       return "(false)";
                }
        }
 
index 313cbe5c9bbf98819469dbc4a74b3c2a59fe3adf..02aeb454fd14a31f24153044614feb83b13b4165 100644 (file)
@@ -1111,6 +1111,20 @@ function quickAddFilter() {
                        id: "filterEditDlg",
                        title: __("Create Filter"),
                        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) {
                                $$("#filterDlg_Matches input[type=checkbox]").each(function(e) {
                                        e.checked = select;
index 72d253a95cca9f749caaa6d16be9b9ed285ead86..d23d4a68b0788af34696ba7df0ae6a1bef7360f7 100644 (file)
@@ -136,6 +136,20 @@ function editFilter(id) {
                        id: "filterEditDlg",
                        title: __("Edit Filter"),
                        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) {
                                $$("#filterDlg_Matches input[type=checkbox]").each(function(e) {
                                        e.checked = select;