]> git.mxchange.org Git - friendica.git/blobdiff - src/Module/Search/Acl.php
Issue 9231: Speed up full text search
[friendica.git] / src / Module / Search / Acl.php
index 95ebd1cf74025c1bb31c75f617baa59b49fc2959..e8b6f357d9c422280d805a922a60e4df55a28bdb 100644 (file)
@@ -1,19 +1,37 @@
 <?php
+/**
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
 
 namespace Friendica\Module\Search;
 
 use Friendica\BaseModule;
 use Friendica\Content\Widget;
 use Friendica\Core\Hook;
-use Friendica\Core\L10n;
 use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
 use Friendica\Core\Search;
 use Friendica\Database\DBA;
+use Friendica\DI;
 use Friendica\Model\Contact;
 use Friendica\Model\Item;
 use Friendica\Network\HTTPException;
-use Friendica\Util\Proxy as ProxyUtils;
 use Friendica\Util\Strings;
 
 /**
@@ -31,14 +49,13 @@ class Acl extends BaseModule
        const TYPE_PRIVATE_MESSAGE       = 'm';
        const TYPE_ANY_CONTACT           = 'a';
 
-       public static function rawContent()
+       public static function rawContent(array $parameters = [])
        {
                if (!local_user()) {
-                       throw new HTTPException\UnauthorizedException(L10n::t('You must be logged in to use this module.'));
+                       throw new HTTPException\UnauthorizedException(DI::l10n()->t('You must be logged in to use this module.'));
                }
 
                $type = $_REQUEST['type'] ?? self::TYPE_MENTION_CONTACT_GROUP;
-
                if ($type === self::TYPE_GLOBAL_CONTACT) {
                        $o = self::globalContactSearch();
                } else {
@@ -56,17 +73,17 @@ class Acl extends BaseModule
                $mode = $_REQUEST['smode'];
                $page = $_REQUEST['page'] ?? 1;
 
-               $r = Search::searchGlobalContact($search, $mode, $page);
+               $result = Search::searchContact($search, $mode, $page);
 
                $contacts = [];
-               foreach ($r as $g) {
+               foreach ($result as $contact) {
                        $contacts[] = [
-                               'photo'   => ProxyUtils::proxifyUrl($g['photo'], false, ProxyUtils::SIZE_MICRO),
-                               'name'    => htmlspecialchars($g['name']),
-                               'nick'    => $g['addr'] ?: $g['url'],
-                               'network' => $g['network'],
-                               'link'    => $g['url'],
-                               'forum'   => !empty($g['community']) ? 1 : 0,
+                               'photo'   => Contact::getMicro($contact),
+                               'name'    => htmlspecialchars($contact['name']),
+                               'nick'    => $contact['addr'] ?: $contact['url'],
+                               'network' => $contact['network'],
+                               'link'    => $contact['url'],
+                               'forum'   => $contact['contact-type'] == Contact::TYPE_COMMUNITY,
                        ];
                }
 
@@ -207,7 +224,7 @@ class Acl extends BaseModule
                $r = [];
                switch ($type) {
                        case self::TYPE_MENTION_CONTACT_GROUP:
-                               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv`, (`prv` OR `forum`) AS `frm` FROM `contact`
+                               $r = q("SELECT `id`, `name`, `nick`, `avatar`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv`, (`prv` OR `forum`) AS `frm` FROM `contact`
                                        WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
                                        AND NOT (`network` IN ('%s', '%s'))
                                        $sql_extra2
@@ -219,7 +236,7 @@ class Acl extends BaseModule
                                break;
 
                        case self::TYPE_MENTION_CONTACT:
-                               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
+                               $r = q("SELECT `id`, `name`, `nick`, `avatar`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
                                        WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
                                        AND NOT (`network` IN ('%s'))
                                        $sql_extra2
@@ -230,7 +247,7 @@ class Acl extends BaseModule
                                break;
 
                        case self::TYPE_MENTION_FORUM:
-                               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
+                               $r = q("SELECT `id`, `name`, `nick`, `avatar`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
                                        WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
                                        AND NOT (`network` IN ('%s'))
                                        AND (`forum` OR `prv`)
@@ -242,7 +259,7 @@ class Acl extends BaseModule
                                break;
 
                        case self::TYPE_PRIVATE_MESSAGE:
-                               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr` FROM `contact`
+                               $r = q("SELECT `id`, `name`, `nick`, `avatar`, `micro`, `network`, `url`, `attag`, `addr` FROM `contact`
                                        WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive`
                                        AND `network` IN ('%s', '%s', '%s')
                                        $sql_extra2
@@ -256,7 +273,7 @@ class Acl extends BaseModule
 
                        case self::TYPE_ANY_CONTACT:
                        default:
-                               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
+                               $r = q("SELECT `id`, `name`, `nick`, `avatar`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv`, `avatar` FROM `contact`
                                        WHERE `uid` = %d AND NOT `deleted` AND NOT `pending` AND NOT `archive`
                                        $sql_extra2
                                        ORDER BY `name`",
@@ -270,13 +287,13 @@ class Acl extends BaseModule
                        foreach ($r as $g) {
                                $entry = [
                                        'type'    => 'c',
-                                       'photo'   => ProxyUtils::proxifyUrl($g['micro'], false, ProxyUtils::SIZE_MICRO),
+                                       'photo'   => Contact::getMicro($g),
                                        'name'    => htmlspecialchars($g['name']),
                                        'id'      => intval($g['id']),
                                        'network' => $g['network'],
                                        'link'    => $g['url'],
-                                       'nick'    => htmlentities(defaults($g, 'attag', $g['nick'])),
-                                       'addr'    => htmlentities(defaults($g, 'addr', $g['url'])),
+                                       'nick'    => htmlentities(($g['attag'] ?? '') ?: $g['nick']),
+                                       'addr'    => htmlentities(($g['addr'] ?? '') ?: $g['url']),
                                        'forum'   => !empty($g['forum']) || !empty($g['prv']) ? 1 : 0,
                                ];
                                if ($entry['forum']) {
@@ -326,18 +343,18 @@ class Acl extends BaseModule
                                        continue;
                                }
 
-                               $contact = Contact::getDetailsByURL($author);
+                               $contact = Contact::getByURL($author, false, ['micro', 'name', 'id', 'network', 'nick', 'addr', 'url', 'forum', 'avatar']);
 
                                if (count($contact) > 0) {
                                        $unknown_contacts[] = [
                                                'type'    => 'c',
-                                               'photo'   => ProxyUtils::proxifyUrl($contact['micro'], false, ProxyUtils::SIZE_MICRO),
+                                               'photo'   => Contact::getMicro($contact),
                                                'name'    => htmlspecialchars($contact['name']),
-                                               'id'      => intval($contact['cid']),
+                                               'id'      => intval($contact['id']),
                                                'network' => $contact['network'],
                                                'link'    => $contact['url'],
-                                               'nick'    => htmlentities(defaults($contact, 'nick', $contact['addr'])),
-                                               'addr'    => htmlentities(defaults($contact, 'addr', $contact['url'])),
+                                               'nick'    => htmlentities(($contact['nick'] ?? '') ?: $contact['addr']),
+                                               'addr'    => htmlentities(($contact['addr'] ?? '') ?: $contact['url']),
                                                'forum'   => $contact['forum']
                                        ];
                                }