Skip to content
Snippets Groups Projects
Commit 5d07c24b authored by Jared Hancock's avatar Jared Hancock
Browse files

search: Prefer ticket number hits if possible

parent 27637076
No related branches found
No related tags found
No related merge requests found
......@@ -26,46 +26,6 @@ class TicketsAjaxAPI extends AjaxController {
function lookup() {
global $thisstaff;
if(!is_numeric($_REQUEST['q']))
return self::lookupByEmail();
$limit = isset($_REQUEST['limit']) ? (int) $_REQUEST['limit']:25;
$tickets=array();
$visibility = Q::any(array(
'staff_id' => $thisstaff->getId(),
'team_id__in' => $thisstaff->teams->values_flat('team_id'),
));
if (!$thisstaff->showAssignedOnly() && ($depts=$thisstaff->getDepts())) {
$visibility->add(array('dept_id__in' => $depts));
}
$hits = TicketModel::objects()
->filter(Q::any(array(
'number__startswith' => $_REQUEST['q'],
)))
->filter($visibility)
->values('number', 'user__emails__address')
->annotate(array('tickets' => SqlAggregate::COUNT('ticket_id')))
->order_by('-created')
->limit($limit);
foreach ($hits as $T) {
$tickets[] = array('id'=>$T['number'], 'value'=>$T['number'],
'info'=>"{$T['number']}{$T['user__emails__address']}",
'matches'=>$_REQUEST['q']);
}
if (!$tickets)
return self::lookupByEmail();
return $this->json_encode($tickets);
}
function lookupByEmail() {
global $thisstaff;
$limit = isset($_REQUEST['limit']) ? (int) $_REQUEST['limit']:25;
$tickets=array();
......@@ -80,8 +40,10 @@ class TicketsAjaxAPI extends AjaxController {
$hits = TicketModel::objects()
->filter($visibility)
->values('user__emails__address')
->annotate(array('tickets' => SqlAggregate::COUNT('ticket_id')))
->values('user__default_email__address')
->annotate(array(
'number' => new SqlCode('null'),
'tickets' => SqlAggregate::COUNT('ticket_id', true)))
->limit($limit);
$q = $_REQUEST['q'];
......@@ -92,17 +54,35 @@ class TicketsAjaxAPI extends AjaxController {
$hits = $ost->searcher->find($q, $hits)
->order_by(new SqlCode('__relevance__'), QuerySet::DESC);
if (!count($hits) && $q[strlen($q)-1] != '*') {
if (preg_match('/\d{2,}[^*]/', $q, $T = array())) {
$hits = TicketModel::objects()
->values('user__default_email__address', 'number')
->annotate(array(
'tickets' => new SqlCode('1'),
'__relevance__' => new SqlCode(1)
))
->filter(array('number__startswith' => $q))
->limit($limit)
->union($hits);
}
elseif (!count($hits) && $q[strlen($q)-1] != '*') {
// Do wild-card fulltext search
$_REQUEST['q'] = $q.'*';
return $this->lookupByEmail();
return $this->lookup();
}
foreach ($hits as $T) {
$email = $T['user__emails__address'];
$email = $T['user__default_email__address'];
$count = $T['tickets'];
$tickets[] = array('email'=>$email, 'value'=>$email,
'info'=>"$email ($count)", 'matches'=>$_REQUEST['q']);
if ($T['number']) {
$tickets[] = array('id'=>$T['number'], 'value'=>$T['number'],
'info'=>"{$T['number']}{$email}",
'matches'=>$_REQUEST['q']);
}
else {
$tickets[] = array('email'=>$email, 'value'=>$email,
'info'=>"$email ($count)", 'matches'=>$_REQUEST['q']);
}
}
return $this->json_encode($tickets);
......
......@@ -41,7 +41,7 @@ abstract class SearchBackend {
);
abstract function update($model, $id, $content, $new=false, $attrs=array());
abstract function find($query, QuerySet $criteria);
abstract function find($query, QuerySet $criteria, $addRelevance=true);
static function register($backend=false) {
$backend = $backend ?: get_called_class();
......@@ -76,9 +76,9 @@ class SearchInterface {
$this->bootstrap();
}
function find($query, QuerySet $criteria) {
function find($query, QuerySet $criteria, $addRelevance=true) {
$query = Format::searchable($query);
return $this->backend->find($query, $criteria);
return $this->backend->find($query, $criteria, $addRelevance);
}
function update($model, $id, $content, $new=false, $attrs=array()) {
......@@ -324,7 +324,7 @@ class MysqlSearchBackend extends SearchBackend {
return implode(' ', $results);
}
function find($query, QuerySet $criteria) {
function find($query, QuerySet $criteria, $addRelevance=true) {
global $thisstaff;
$criteria = clone $criteria;
......@@ -343,10 +343,14 @@ class MysqlSearchBackend extends SearchBackend {
switch ($criteria->model) {
case false:
case 'TicketModel':
if ($addRelevance) {
$criteria = $criteria->extra(array(
'select' => array(
'__relevance__' => 'Z1.`relevance`',
),
));
}
$criteria->extra(array(
'select' => array(
'__relevance__' => 'Z1.`relevance`',
),
'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"),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment