mirror of
https://github.com/opensupports/opensupports.git
synced 2025-07-31 01:35:15 +02:00
Merge pull request #860 from opensupports/optimize-ticket-search
Optimize ticket search
This commit is contained in:
commit
68c3975ea4
@ -126,9 +126,8 @@ class SearchController extends Controller {
|
|||||||
'allowedDepartments' => $allowedDepartmentsId,
|
'allowedDepartments' => $allowedDepartmentsId,
|
||||||
'staffId' => Controller::getLoggedUser()->id
|
'staffId' => Controller::getLoggedUser()->id
|
||||||
];
|
];
|
||||||
|
|
||||||
$query = $this->getSQLQuery($inputs);
|
$query = $this->getSQLQuery($inputs);
|
||||||
$queryWithOrder = $this->getSQLQueryWithOrder($inputs);
|
$queryWithOrder = $this->getSQLQueryWithOrder($inputs, $query);
|
||||||
$totalCount = RedBean::getAll("SELECT COUNT(*) FROM (SELECT COUNT(*) " . $query . " ) AS T2", [':query' => "%" . $inputs['query'] . "%", ':queryAtBeginning' => $inputs['query'] . "%" ])[0]['COUNT(*)'];
|
$totalCount = RedBean::getAll("SELECT COUNT(*) FROM (SELECT COUNT(*) " . $query . " ) AS T2", [':query' => "%" . $inputs['query'] . "%", ':queryAtBeginning' => $inputs['query'] . "%" ])[0]['COUNT(*)'];
|
||||||
$ticketIdList = RedBean::getAll($queryWithOrder, [':query' => "%" . $inputs['query'] . "%", ':queryAtBeginning' => $inputs['query'] . "%"]);
|
$ticketIdList = RedBean::getAll($queryWithOrder, [':query' => "%" . $inputs['query'] . "%", ':queryAtBeginning' => $inputs['query'] . "%"]);
|
||||||
$ticketList = [];
|
$ticketList = [];
|
||||||
@ -136,25 +135,16 @@ class SearchController extends Controller {
|
|||||||
$ticket = Ticket::getDataStore($item['id']);
|
$ticket = Ticket::getDataStore($item['id']);
|
||||||
array_push($ticketList, $ticket->toArray());
|
array_push($ticketList, $ticket->toArray());
|
||||||
}
|
}
|
||||||
$ticketTableExists = RedBean::exec("select table_name from information_schema.tables where table_name = 'ticket';");
|
Response::respondSuccess([
|
||||||
if($ticketTableExists){
|
'tickets' => $ticketList,
|
||||||
Response::respondSuccess([
|
'pages' => ceil($totalCount / 10),
|
||||||
'tickets' => $ticketList,
|
'page' => $inputs['page'] ? ($inputs['page']*1) : 1
|
||||||
'pages' => ceil($totalCount / 10),
|
]);
|
||||||
'page' => $inputs['page'] ? ($inputs['page']*1) : 1
|
|
||||||
]);
|
|
||||||
}else{
|
|
||||||
Response::respondSuccess([]);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getSQLQuery($inputs) {
|
public function getSQLQuery($inputs) {
|
||||||
$tagsTableExists = RedBean::exec("select table_name from information_schema.tables where table_name = 'tag_ticket';");
|
$taglistQuery = " LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id";
|
||||||
$ticketEventTableExists = RedBean::exec("select table_name from information_schema.tables where table_name = 'ticketevent';");
|
$ticketeventlistQuery = " LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id";
|
||||||
|
|
||||||
$taglistQuery = ( $tagsTableExists ? " LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id" : '');
|
|
||||||
$ticketeventlistQuery = ( $ticketEventTableExists ? " LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id" : '');
|
|
||||||
|
|
||||||
$query = "FROM (ticket" . $taglistQuery . $ticketeventlistQuery .")";
|
$query = "FROM (ticket" . $taglistQuery . $ticketeventlistQuery .")";
|
||||||
$filters = "";
|
$filters = "";
|
||||||
@ -163,8 +153,7 @@ class SearchController extends Controller {
|
|||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getSQLQueryWithOrder($inputs) {
|
public function getSQLQueryWithOrder($inputs, $query) {
|
||||||
$query = $this->getSQLQuery($inputs);
|
|
||||||
$order = "";
|
$order = "";
|
||||||
$query = "SELECT" . " ticket.id " . $query;
|
$query = "SELECT" . " ticket.id " . $query;
|
||||||
|
|
||||||
@ -191,9 +180,7 @@ class SearchController extends Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function setTagFilter($tagList, &$filters){
|
private function setTagFilter($tagList, &$filters){
|
||||||
$tagsTableExists = RedBean::exec("select table_name from information_schema.tables where table_name = 'tag_ticket';");
|
if($tagList){
|
||||||
|
|
||||||
if($tagList && $tagsTableExists){
|
|
||||||
$filters != "" ? $filters .= " and " : null;
|
$filters != "" ? $filters .= " and " : null;
|
||||||
|
|
||||||
foreach($tagList as $key => $tag) {
|
foreach($tagList as $key => $tag) {
|
||||||
@ -334,11 +321,9 @@ class SearchController extends Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function setStringFilter($search, &$filters){
|
private function setStringFilter($search, &$filters){
|
||||||
$ticketEventTableExists = RedBean::exec("select table_name from information_schema.tables where table_name = 'ticketevent';");
|
|
||||||
|
|
||||||
if($search !== null){
|
if($search !== null){
|
||||||
if ($filters != "") $filters .= " and ";
|
if ($filters != "") $filters .= " and ";
|
||||||
$ticketevent = ( $ticketEventTableExists ? " or (ticketevent.type = 'COMMENT' and ticketevent.content LIKE :query)" : "");
|
$ticketevent = " or (ticketevent.type = 'COMMENT' and ticketevent.content LIKE :query)";
|
||||||
$filters .= " (ticket.title LIKE :query or ticket.content LIKE :query or ticket.ticket_number LIKE :query". $ticketevent ." )";
|
$filters .= " (ticket.title LIKE :query or ticket.content LIKE :query or ticket.ticket_number LIKE :query". $ticketevent ." )";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -373,10 +358,8 @@ class SearchController extends Controller {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
private function setStringOrder($querysearch, &$order){
|
private function setStringOrder($querysearch, &$order){
|
||||||
$ticketEventTableExists = RedBean::exec("select table_name from information_schema.tables where table_name = 'ticketevent';");
|
|
||||||
|
|
||||||
if($querysearch !== null){
|
if($querysearch !== null){
|
||||||
$ticketeventOrder = ( $ticketEventTableExists ? " WHEN (ticketevent.content LIKE :query) THEN 5 " : "");
|
$ticketeventOrder = " WHEN (ticketevent.content LIKE :query) THEN 5 ";
|
||||||
$order .= "CASE WHEN (ticket.ticket_number LIKE :query) THEN 1 WHEN (ticket.title LIKE :queryAtBeginning) THEN 2 WHEN (ticket.title LIKE :query) THEN 3 WHEN ( ticket.content LIKE :query) THEN 4 " . $ticketeventOrder ."END asc, ";
|
$order .= "CASE WHEN (ticket.ticket_number LIKE :query) THEN 1 WHEN (ticket.title LIKE :queryAtBeginning) THEN 2 WHEN (ticket.title LIKE :query) THEN 3 WHEN ( ticket.content LIKE :query) THEN 4 " . $ticketeventOrder ."END asc, ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -240,26 +240,29 @@ class SearchControllerTest extends TestCase {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
public function testQueryWithOrder() {
|
public function testQueryWithOrder() {
|
||||||
|
$inputs1 = [
|
||||||
|
'page' => 1
|
||||||
|
];
|
||||||
|
$inputs2 = [
|
||||||
|
'page' => 1,
|
||||||
|
'query' => 'stark'
|
||||||
|
];
|
||||||
|
$inputs3 = [
|
||||||
|
'page' => 1,
|
||||||
|
'orderBy' => ['value' => 'closed', 'asc' => 1]
|
||||||
|
];
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$this->searchController->getSQLQueryWithOrder([
|
$this->searchController->getSQLQueryWithOrder($inputs1, $this->searchController->getSQLQuery($inputs1)),
|
||||||
'page' => 1
|
|
||||||
]),
|
|
||||||
"SELECT ticket.id FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) GROUP BY ticket.id ORDER BY ticket.closed asc, ticket.owner_id asc, ticket.unread_staff asc, ticket.date desc, ticket.id desc LIMIT 10 OFFSET 0"
|
"SELECT ticket.id FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) GROUP BY ticket.id ORDER BY ticket.closed asc, ticket.owner_id asc, ticket.unread_staff asc, ticket.date desc, ticket.id desc LIMIT 10 OFFSET 0"
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$this->searchController->getSQLQueryWithOrder([
|
$this->searchController->getSQLQueryWithOrder($inputs2, $this->searchController->getSQLQuery($inputs2)),
|
||||||
'page' => 1,
|
|
||||||
'query' => 'stark'
|
|
||||||
]),
|
|
||||||
"SELECT ticket.id FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) WHERE (ticket.title LIKE :query or ticket.content LIKE :query or ticket.ticket_number LIKE :query or (ticketevent.type = 'COMMENT' and ticketevent.content LIKE :query) ) GROUP BY ticket.id ORDER BY CASE WHEN (ticket.ticket_number LIKE :query) THEN 1 WHEN (ticket.title LIKE :queryAtBeginning) THEN 2 WHEN (ticket.title LIKE :query) THEN 3 WHEN ( ticket.content LIKE :query) THEN 4 WHEN (ticketevent.content LIKE :query) THEN 5 END asc, ticket.closed asc, ticket.owner_id asc, ticket.unread_staff asc, ticket.date desc, ticket.id desc LIMIT 10 OFFSET 0"
|
"SELECT ticket.id FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) WHERE (ticket.title LIKE :query or ticket.content LIKE :query or ticket.ticket_number LIKE :query or (ticketevent.type = 'COMMENT' and ticketevent.content LIKE :query) ) GROUP BY ticket.id ORDER BY CASE WHEN (ticket.ticket_number LIKE :query) THEN 1 WHEN (ticket.title LIKE :queryAtBeginning) THEN 2 WHEN (ticket.title LIKE :query) THEN 3 WHEN ( ticket.content LIKE :query) THEN 4 WHEN (ticketevent.content LIKE :query) THEN 5 END asc, ticket.closed asc, ticket.owner_id asc, ticket.unread_staff asc, ticket.date desc, ticket.id desc LIMIT 10 OFFSET 0"
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$this->searchController->getSQLQueryWithOrder([
|
$this->searchController->getSQLQueryWithOrder($inputs3, $this->searchController->getSQLQuery($inputs3)),
|
||||||
'page' => 1,
|
|
||||||
'orderBy' => ['value' => 'closed', 'asc' => 1]
|
|
||||||
]),
|
|
||||||
"SELECT ticket.id FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) GROUP BY ticket.id ORDER BY ticket.closed asc,ticket.closed asc, ticket.owner_id asc, ticket.unread_staff asc, ticket.date desc, ticket.id desc LIMIT 10 OFFSET 0"
|
"SELECT ticket.id FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) GROUP BY ticket.id ORDER BY ticket.closed asc,ticket.closed asc, ticket.owner_id asc, ticket.unread_staff asc, ticket.date desc, ticket.id desc LIMIT 10 OFFSET 0"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user