From 0916c7abe7b1e803c111a0e0e177ead6feebf2a9 Mon Sep 17 00:00:00 2001
From: Jared Hancock <jared@osticket.com>
Date: Wed, 30 Sep 2015 19:18:30 -0500
Subject: [PATCH] search: Bubble search relevance for related objects

Instead of using distinct alone, change to add the relevance of related
items when searching for tickets. In other words, when performing a full
text search for 'xyz', add the relevance of matched user, organization, and
thread objects.
---
 include/class.search.php      | 2 +-
 include/staff/tickets.inc.php | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/class.search.php b/include/class.search.php
index 6cac6d7e4..dbf1f7eac 100644
--- a/include/class.search.php
+++ b/include/class.search.php
@@ -376,7 +376,7 @@ class MysqlSearchBackend extends SearchBackend {
             $criteria->extra(array(
                 'tables' => array(
                     str_replace(array(':', '{}'), array(TABLE_PREFIX, $search),
-                    "(SELECT COALESCE(Z3.`object_id`, Z5.`ticket_id`, Z8.`ticket_id`) as `ticket_id`, {} AS `relevance` FROM `:_search` Z1 LEFT JOIN `:thread_entry` Z2 ON (Z1.`object_type` = 'H' AND Z1.`object_id` = Z2.`id`) LEFT JOIN `:thread` Z3 ON (Z2.`thread_id` = Z3.`id` AND Z3.`object_type` = 'T') LEFT JOIN `:ticket` Z5 ON (Z1.`object_type` = 'T' AND Z1.`object_id` = Z5.`ticket_id`) LEFT JOIN `:user` Z6 ON (Z6.`id` = Z1.`object_id` and Z1.`object_type` = 'U') LEFT JOIN `:organization` Z7 ON (Z7.`id` = Z1.`object_id` AND Z7.`id` = Z6.`org_id` AND Z1.`object_type` = 'O') LEFT JOIN :ticket Z8 ON (Z8.`user_id` = Z6.`id`) WHERE {}) Z1"),
+                    "(SELECT COALESCE(Z3.`object_id`, Z5.`ticket_id`, Z8.`ticket_id`) as `ticket_id`, SUM({}) AS `relevance` FROM `:_search` Z1 LEFT JOIN `:thread_entry` Z2 ON (Z1.`object_type` = 'H' AND Z1.`object_id` = Z2.`id`) LEFT JOIN `:thread` Z3 ON (Z2.`thread_id` = Z3.`id` AND Z3.`object_type` = 'T') LEFT JOIN `:ticket` Z5 ON (Z1.`object_type` = 'T' AND Z1.`object_id` = Z5.`ticket_id`) LEFT JOIN `:user` Z6 ON (Z6.`id` = Z1.`object_id` and Z1.`object_type` = 'U') LEFT JOIN `:organization` Z7 ON (Z7.`id` = Z1.`object_id` AND Z7.`id` = Z6.`org_id` AND Z1.`object_type` = 'O') LEFT JOIN :ticket Z8 ON (Z8.`user_id` = Z6.`id`) WHERE {} GROUP BY `ticket_id`) Z1"),
                 )
             ));
             $criteria->filter(array('ticket_id'=>new SqlCode('Z1.`ticket_id`')));
diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php
index 5adab6cec..6e2defbe7 100644
--- a/include/staff/tickets.inc.php
+++ b/include/staff/tickets.inc.php
@@ -100,7 +100,7 @@ case 'search':
                 // Do wildcard search if no hits
                 $__tickets = $ost->searcher->find($_REQUEST['query'].'*', $tickets);
             }
-            $tickets = $__tickets->distinct('ticket_id');
+            $tickets = $__tickets;
             $has_relevance = true;
         }
         if (count($tickets) == 1) {
-- 
GitLab