From 158bfda0ac5108065ece93cde0c67ef38459328d Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 13 Jan 2013 14:50:55 +0100 Subject: [PATCH] Changing the tag system to the "term" table. --- boot.php | 3 ++- database.sql | 26 ++++++++++++++----------- include/api.php | 9 +++++---- include/tags.php | 50 ++++++++++++++++++++++++++++++++++++++++-------- mod/network.php | 4 +++- mod/search.php | 23 +++++++++++++--------- object/Item.php | 21 ++++++++++++++------ update.php | 11 ++++------- 8 files changed, 100 insertions(+), 47 deletions(-) diff --git a/boot.php b/boot.php index 7bd0fec4db..6864e533d8 100644 --- a/boot.php +++ b/boot.php @@ -204,10 +204,11 @@ define ( 'NOTIFY_SYSTEM', 0x8000 ); define ( 'TERM_UNKNOWN', 0 ); define ( 'TERM_HASHTAG', 1 ); -define ( 'TERM_MENTION', 2 ); +define ( 'TERM_MENTION', 2 ); define ( 'TERM_CATEGORY', 3 ); define ( 'TERM_PCATEGORY', 4 ); define ( 'TERM_FILE', 5 ); +define ( 'TERM_SAVEDSEARCH', 6 ); define ( 'TERM_OBJ_POST', 1 ); define ( 'TERM_OBJ_PHOTO', 2 ); diff --git a/database.sql b/database.sql index f7fdfa3d9e..99d60429ae 100644 --- a/database.sql +++ b/database.sql @@ -1017,18 +1017,22 @@ CREATE TABLE IF NOT EXISTS `spam` ( -- CREATE TABLE IF NOT EXISTS `term` ( - `tid` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `oid` INT UNSIGNED NOT NULL , - `otype` TINYINT( 3 ) UNSIGNED NOT NULL , - `type` TINYINT( 3 ) UNSIGNED NOT NULL , - `term` CHAR( 255 ) NOT NULL , - `url` CHAR( 255 ) NOT NULL, + `tid` int(10) unsigned NOT NULL AUTO_INCREMENT, + `aid` int(10) unsigned NOT NULL DEFAULT '0', + `uid` int(10) unsigned NOT NULL DEFAULT '0', + `oid` int(10) unsigned NOT NULL, + `otype` tinyint(3) unsigned NOT NULL, + `type` tinyint(3) unsigned NOT NULL, + `term` char(255) NOT NULL, + `url` char(255) NOT NULL, PRIMARY KEY (`tid`), - KEY `oid` ( `oid` ), - KEY `otype` ( `otype` ), - KEY `type` ( `type` ), - KEY `term` ( `term` ) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; + KEY `oid` (`oid`), + KEY `otype` (`otype`), + KEY `type` (`type`), + KEY `term` (`term`), + KEY `uid` (`uid`), + KEY `aid` (`aid`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -------------------------------------------------------- diff --git a/include/api.php b/include/api.php index 1b33378b0a..4efb0c614a 100644 --- a/include/api.php +++ b/include/api.php @@ -1037,10 +1037,11 @@ $myurl = $a->get_baseurl() . '/profile/'. $a->user['nickname']; $myurl = substr($myurl,strpos($myurl,'://')+3); - $myurl = str_replace(array('www.','.'),array('','\\.'),$myurl); + //$myurl = str_replace(array('www.','.'),array('','\\.'),$myurl); + $myurl = str_replace('www.','',$myurl); $diasp_url = str_replace('/profile/','/u/',$myurl); - /*if (get_config('system','use_fulltext_engine')) +/* if (get_config('system','use_fulltext_engine')) $sql_extra .= sprintf(" AND `item`.`parent` IN (SELECT distinct(`parent`) from item where (MATCH(`author-link`) AGAINST ('".'"%s"'."' in boolean mode) or MATCH(`tag`) AGAINST ('".'"%s"'."' in boolean mode) or MATCH(tag) AGAINST ('".'"%s"'."' in boolean mode))) ", dbesc(protect_sprintf($myurl)), dbesc(protect_sprintf($myurl)), @@ -1051,8 +1052,8 @@ dbesc(protect_sprintf('%' . $myurl)), dbesc(protect_sprintf('%' . $myurl . ']%')), dbesc(protect_sprintf('%' . $diasp_url . ']%')) - );*/ - + ); +*/ $sql_extra .= sprintf(" AND `item`.`parent` IN (SELECT distinct(`parent`) from item where `author-link` IN ('https://%s', 'http://%s') OR `mention`)", dbesc(protect_sprintf($myurl)), dbesc(protect_sprintf($myurl)) diff --git a/include/tags.php b/include/tags.php index aabe40d1c6..6a5728a9ba 100644 --- a/include/tags.php +++ b/include/tags.php @@ -12,12 +12,17 @@ if(is_null($db)) { unset($db_host, $db_user, $db_pass, $db_data); }; -$a->set_baseurl(get_config('system','url')); +$a->set_baseurl("https://pirati.ca"); */ function create_tags_from_item($itemid) { global $a; + $profile_base = $a->get_baseurl(); + $profile_data = parse_url($profile_base); + $profile_base_friendica = $profile_data['host'].$profile_data['path']."/profile/"; + $profile_base_diaspora = $profile_data['host'].$profile_data['path']."/u/"; + $searchpath = $a->get_baseurl()."/search?tag="; $messages = q("SELECT `uri`, `uid`, `id`, `created`, `edited`, `commented`, `received`, `changed`, `deleted`, `title`, `body`, `tag` FROM `item` WHERE `id` = %d LIMIT 1", intval($itemid)); @@ -28,7 +33,11 @@ function create_tags_from_item($itemid) { $message = $messages[0]; // Clean up all tags - q("DELETE FROM `tag` WHERE `iid` = %d", intval($itemid)); + q("DELETE FROM `term` WHERE `otype` = %d AND `oid` = %d AND `type` IN (%d, %d)", + intval(TERM_OBJ_POST), + intval($itemid), + intval(TERM_HASHTAG), + intval(TERM_MENTION)); if ($message["deleted"]) return; @@ -49,7 +58,7 @@ function create_tags_from_item($itemid) { $pattern = "/\W\#([^\[].*?)[\s'\".,:;\?!\[\]\/]/ism"; if (preg_match_all($pattern, $data, $matches)) foreach ($matches[1] as $match) - $tags["#".strtolower($match)] = $searchpath.strtolower($match); + $tags["#".strtolower($match)] = ""; // $searchpath.strtolower($match); $pattern = "/\W([\#@])\[url\=(.*?)\](.*?)\[\/url\]/ism"; if (preg_match_all($pattern, $data, $matches, PREG_SET_ORDER)) { @@ -57,10 +66,31 @@ function create_tags_from_item($itemid) { $tags[$match[1].strtolower(trim($match[3], ',.:;[]/\"?!'))] = $match[2]; } - foreach ($tags as $tag=>$link) - $r = q("INSERT INTO `tag` (`iid`, `tag`, `link`, `created`, `edited`, `commented`, `received`, `changed`) VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s')", - intval($itemid), dbesc($tag), dbesc($link), dbesc($message["created"]), - dbesc($message["edited"]), dbesc($message["commented"]), dbesc($message["received"]), dbesc($message["changed"])); + foreach ($tags as $tag=>$link) { + + if (substr(trim($tag), 0, 1) == "#") { + $type = TERM_HASHTAG; + $term = substr($tag, 1); + } elseif (substr(trim($tag), 0, 1) == "@") { + $type = TERM_MENTION; + $term = substr($tag, 1); + } else { // This shouldn't happen + $type = TERM_HASHTAG; + $term = $tag; + } + + $r = q("INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`, `url`) VALUES (%d, %d, %d, %d, '%s', '%s')", + intval($message["uid"]), intval($itemid), intval(TERM_OBJ_POST), intval($type), dbesc($term), dbesc($link)); + + // Search for mentions + if ((substr($tag, 0, 1) == '@') AND (strpos($link, $profile_base_friendica) OR strpos($link, $profile_base_diaspora))) { + $users = q("SELECT `uid` FROM `contact` WHERE self AND (`url` = '%s' OR `nurl` = '%s')", $link, $link); + foreach ($users AS $user) { + if ($user["uid"] == $message["uid"]) + q("UPDATE `item` SET `mention` = 1 WHERE `id` = %d", intval($itemid)); + } + } + } } function create_tags_from_itemuri($itemuri, $uid) { @@ -71,12 +101,16 @@ function create_tags_from_itemuri($itemuri, $uid) { } function update_items() { - $messages = q("SELECT `id` FROM `item` where tag !='' ORDER BY `created` DESC LIMIT 100"); + //$messages = q("SELECT `id` FROM `item` where tag !='' ORDER BY `created` DESC limit 10"); + $messages = q("SELECT `id` FROM `item` where tag !=''"); foreach ($messages as $message) create_tags_from_item($message["id"]); } +//print_r($tags); +//print_r($hashtags); +//print_r($mentions); //update_items(); //create_tags_from_item(265194); //create_tags_from_itemuri("infoagent@diasp.org:cce94abd104c06e8", 2); diff --git a/mod/network.php b/mod/network.php index ecef7c1dfb..4a8b54762c 100644 --- a/mod/network.php +++ b/mod/network.php @@ -689,7 +689,9 @@ function network_content(&$a, $update = 0) { dbesc(protect_sprintf('%' . $diasp_url . ']%')) );*/ - $sql_extra .= sprintf(" AND `item`.`parent` IN (SELECT distinct(`parent`) from item where `author-link` IN ('https://%s', 'http://%s') OR `mention`)", + //$sql_extra .= sprintf(" AND `item`.`parent` IN (SELECT distinct(`parent`) from item where `author-link` IN ('https://%s', 'http://%s') OR `mention`)", + //$sql_extra .= sprintf(" AND `item`.`parent` IN (SELECT distinct(`parent`) from item where `mention`)", + $sql_extra .= sprintf(" AND `item`.`parent` IN (SELECT distinct(`parent`) from item where `author-link` IN ('https://%s', 'http://%s'))", dbesc(protect_sprintf($myurl)), dbesc(protect_sprintf($myurl)) ); diff --git a/mod/search.php b/mod/search.php index aedd639403..c6d5989fb5 100644 --- a/mod/search.php +++ b/mod/search.php @@ -23,7 +23,7 @@ function search_saved_searches() { ); } - + $tpl = get_markup_template("saved_searches_aside.tpl"); $o .= replace_macros($tpl, array( @@ -32,7 +32,7 @@ function search_saved_searches() { '$searchbox' => '', '$saved' => $saved, )); - } + } return $o; @@ -127,7 +127,7 @@ function search_content(&$a) { if (get_config('system','only_tag_search')) $tag = true; - if (get_config('system','use_fulltext_engine')) { + /*if (get_config('system','use_fulltext_engine')) { if($tag) $sql_extra = sprintf(" AND MATCH (`item`.`tag`) AGAINST ('".'"%s"'."' in boolean mode) ", '#'.dbesc(protect_sprintf($search))); else @@ -137,15 +137,20 @@ function search_content(&$a) { $sql_extra = sprintf(" AND `item`.`tag` REGEXP '%s' ", dbesc('\\]' . protect_sprintf(preg_quote($search)) . '\\[')); else $sql_extra = sprintf(" AND `item`.`body` REGEXP '%s' ", dbesc(protect_sprintf(preg_quote($search)))); - } + }*/ if($tag) { - $sql_extra = sprintf(" AND `tag`.`tag` = '%s' ", '#'.dbesc(protect_sprintf($search))); - $sql_table = "`tag` LEFT JOIN `item` ON `item`.`id` = `tag`.`iid`"; - } else + $sql_extra = sprintf(" AND `term`.`term` = '%s' AND `term`.`otype` = %d AND `term`.`type` = %d", + dbesc(protect_sprintf($search)), intval(TERM_OBJ_POST), intval(TERM_HASHTAG)); + $sql_table = "`term` LEFT JOIN `item` ON `item`.`id` = `term`.`oid` AND `item`.`uid` = `term`.`uid` "; + } else { + if (get_config('system','use_fulltext_engine')) { + $sql_extra = sprintf(" AND MATCH (`item`.`body`, `item`.`title`) AGAINST ('%s' in boolean mode) ", dbesc(protect_sprintf($search))); + } else { + $sql_extra = sprintf(" AND `item`.`body` REGEXP '%s' ", dbesc(protect_sprintf(preg_quote($search)))); + } $sql_table = "`item`"; - - + } // Here is the way permissions work in the search module... // Only public posts can be shown diff --git a/object/Item.php b/object/Item.php index 215c987b19..648b558071 100644 --- a/object/Item.php +++ b/object/Item.php @@ -145,18 +145,27 @@ class Item extends BaseObject { call_hooks('render_location',$locate); $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate)); + $searchpath = $a->get_baseurl()."/search?tag="; $tags=array(); $hashtags = array(); $mentions = array(); - $taglist = q("select tag,link from tag where iid=%d", intval($item['id'])); + $taglist = q("SELECT `type`, `term`, `url` FROM `term` WHERE `otype` = %d AND `oid` = %d AND `type` IN (%d, %d)", + intval(TERM_OBJ_POST), intval($item['id']), intval(TERM_HASHTAG), intval(TERM_MENTION)); foreach($taglist as $tag) { - $tags[] = substr($tag["tag"], 0, 1)."".substr($tag["tag"], 1).""; - if (substr($tag["tag"], 0, 1) == "#") - $hashtags[] = "#".substr($tag["tag"], 1).""; - elseif (substr($tag["tag"], 0, 1) == "@") - $mentions[] = "@".substr($tag["tag"], 1).""; + + if ($tag["url"] == "") + $tag["url"] = $searchpath.strtolower($tag["term"]); + + if ($tag["type"] == TERM_HASHTAG) { + $hashtags[] = "#".$tag["term"].""; + $prefix = "#"; + } elseif ($tag["type"] == TERM_MENTION) { + $mentions[] = "@".$tag["term"].""; + $prefix = "@"; + } + $tags[] = $prefix."".$tag["term"].""; } /*foreach(explode(',',$item['tag']) as $tag){ diff --git a/update.php b/update.php index 04ae451a1c..4bee3a3bc1 100644 --- a/update.php +++ b/update.php @@ -1371,13 +1371,10 @@ ADD INDEX ( `datasize` ) "); } function update_1157() { - $r = q("CREATE TABLE IF NOT EXISTS `tag` ( - `iid` int(11) NOT NULL, - `tag` char(255) NOT NULL, - `link` char(255) NOT NULL, - PRIMARY KEY (`iid`, `tag`), - KEY `tag` (`tag`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8;"); + $r = q("ALTER TABLE `term` ADD `aid` int(10) unsigned NOT NULL DEFAULT '0', + ADD `uid` int(10) unsigned NOT NULL DEFAULT '0', + ADD INDEX (`uid`), + ADD INDEX (`aid`)"); if(!$r) return UPDATE_FAILED; return UPDATE_SUCCESS;