From 4828dd6f00962c151153813ad70bcb7f9403058b Mon Sep 17 00:00:00 2001 From: Jared Hancock <jared@osticket.com> Date: Tue, 2 Jun 2015 14:53:13 -0500 Subject: [PATCH] search: Eliminate join to view for search on custom fields * Fix search on boolean field --- include/class.forms.php | 12 ++++++++++++ include/class.search.php | 19 +++++++++++-------- include/class.ticket.php | 6 ++++++ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/include/class.forms.php b/include/class.forms.php index a0192de63..ea0947e44 100644 --- a/include/class.forms.php +++ b/include/class.forms.php @@ -1252,6 +1252,18 @@ class BooleanField extends FormField { 'set.not' => null, ); } + + function getSearchQ($method, $value, $name=false) { + $name = $name ?: $this->get('name'); + switch ($method) { + case 'set': + return new Q(array($name => '1')); + case 'set.not': + return new Q(array($name => '0')); + default: + return parent::getSearchQ($method, $value, $name); + } + } } class ChoiceField extends FormField { diff --git a/include/class.search.php b/include/class.search.php index 43a9cb30c..1236d14bb 100644 --- a/include/class.search.php +++ b/include/class.search.php @@ -795,6 +795,7 @@ class SavedSearch extends VerySimpleModel { foreach ($form->getFields() as $f) { if (substr($f->get('name'), -7) == '+search' && $f->getClean()) { $name = substr($f->get('name'), 0, -7); + $filter = new Q(); // Determine the search method and fetch the original field if (($M = $form->getField("{$name}+method")) && ($method = $M->getClean()) @@ -816,12 +817,6 @@ class SavedSearch extends VerySimpleModel { ); $column = $field->get('name') ?: 'field_'.$field->get('id'); list($type,$id) = explode('!', $name, 2); - $OP = $other_paths[$type]; - if ($type == ':field') { - $DF = DynamicFormField::lookup($id); - TicketModel::registerCustomData($DF->form); - $OP = 'cdata+'.$DF->form->id.'__'; - } // XXX: Last mile — find a better idea switch (array($type, $column)) { case array(':user', 'name'): @@ -834,13 +829,21 @@ class SavedSearch extends VerySimpleModel { $name = 'user__org__name'; break; default: + if ($type == ':field' && $id) { + $name = 'entries__answers__value'; + $filter->add(array('entries__answers__field_id' => $id)); + break; + } + $OP = $other_paths[$type]; $name = $OP . $column; } } // Add the criteria to the QuerySet - if ($Q = $field->getSearchQ($method, $value, $name)) - $qs = $qs->filter($Q); + if ($Q = $field->getSearchQ($method, $value, $name)) { + $filter->add($Q); + $qs = $qs->filter($filter); + } } } } diff --git a/include/class.ticket.php b/include/class.ticket.php index 866346032..1cb11c7f8 100644 --- a/include/class.ticket.php +++ b/include/class.ticket.php @@ -81,6 +81,12 @@ class TicketModel extends VerySimpleModel { 'reverse' => 'TicketCData.ticket', 'list' => false, ), + 'entries' => array( + 'constraint' => array( + "'T'" => 'DynamicFormEntry.object_type', + 'ticket_id' => 'DynamicFormEntry.object_id', + ), + ), ) ); -- GitLab