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;