mirror of
https://github.com/moodle/moodle.git
synced 2025-04-21 08:22:07 +02:00
MDL-17327 data module - improve adv. search by avoiding all the extra joins when getting max number of records ; merged from 19_STABLE
This commit is contained in:
parent
1c05907d07
commit
5e1f1a6e61
@ -441,6 +441,12 @@
|
||||
|
||||
$ilike = $DB->sql_ilike(); //Be case-insensitive
|
||||
|
||||
// Init some variables to be used by advanced search
|
||||
$advsearchselect = '';
|
||||
$advwhere = '';
|
||||
$advtables = '';
|
||||
$advparams = array();
|
||||
|
||||
/// Find the field we are sorting on
|
||||
if ($sort <= 0 or !$sortfield = data_get_field_from_id($sort, $data)) {
|
||||
|
||||
@ -489,10 +495,10 @@
|
||||
$params['search_flname_'.$i] = "%$val->data%";
|
||||
continue;
|
||||
}
|
||||
$tables .= ', {data_content} c'.$key.' ';
|
||||
$where .= ' AND c'.$key.'.recordid = r.id';
|
||||
$searchselect .= ' AND ('.$val->sql.') ';
|
||||
$params = array_merge($params, $val->params);
|
||||
$advtables .= ', {data_content} c'.$key.' ';
|
||||
$advwhere .= ' AND c'.$key.'.recordid = r.id';
|
||||
$advsearchselect .= ' AND ('.$val->sql.') ';
|
||||
$advparams = array_merge($advparams, $val->params);
|
||||
}
|
||||
} else if ($search) {
|
||||
$searchselect = " AND (cs.content $ilike :search1 OR u.firstname $ilike :search2 OR u.lastname $ilike :search3 ) ";
|
||||
@ -535,10 +541,10 @@
|
||||
$params['search_flname_'.$i] = "%$val->data%";
|
||||
continue;
|
||||
}
|
||||
$tables .= ', {data_content} c'.$key.' ';
|
||||
$where .= ' AND c'.$key.'.recordid = r.id AND c'.$key.'.fieldid = '.$key;
|
||||
$searchselect .= ' AND ('.$val->sql.') ';
|
||||
$params = array_merge($params, $val->params);
|
||||
$advtables .= ', {data_content} c'.$key.' ';
|
||||
$advwhere .= ' AND c'.$key.'.recordid = r.id AND c'.$key.'.fieldid = '.$key;
|
||||
$advsearchselect .= ' AND ('.$val->sql.') ';
|
||||
$advparams = array_merge($advparams, $val->params);
|
||||
}
|
||||
} else if ($search) {
|
||||
$searchselect = " AND (cs.content $ilike :search1 OR u.firstname $ilike :search2 OR u.lastname $ilike :search3 ) ";
|
||||
@ -552,16 +558,17 @@
|
||||
|
||||
/// To actually fetch the records
|
||||
|
||||
$fromsql = "FROM $tables $where $groupselect $approveselect $searchselect";
|
||||
$fromsql = "FROM $tables $advtables $where $advwhere $groupselect $approveselect $searchselect $advsearchselect";
|
||||
$sqlselect = "SELECT $what $fromsql $sortorder";
|
||||
$sqlcount = "SELECT $count $fromsql"; // Total number of records when searching
|
||||
$sqlrids = "SELECT tmp.id FROM ($sqlselect) tmp";
|
||||
$sqlmax = "SELECT $count FROM $tables $where $groupselect $approveselect"; // number of all recoirds user may see
|
||||
$allparams = array_merge($params, $advparams);
|
||||
|
||||
/// Work out the paging numbers and counts
|
||||
|
||||
$totalcount = $DB->count_records_sql($sqlcount, $params);
|
||||
if (empty($searchselect)) {
|
||||
$totalcount = $DB->count_records_sql($sqlcount, $allparams);
|
||||
if (empty($searchselect) && empty($advsearchselect)) {
|
||||
$maxcount = $totalcount;
|
||||
} else {
|
||||
$maxcount = $DB->count_records_sql($sqlmax, $params);
|
||||
@ -572,7 +579,7 @@
|
||||
$mode = 'single';
|
||||
|
||||
$page = 0;
|
||||
if ($allrecordids = $DB->get_records_sql($sqlrids, $params)) {
|
||||
if ($allrecordids = $DB->get_records_sql($sqlrids, $allparams)) {
|
||||
$allrecordids = array_keys($allrecordids);
|
||||
$page = (int)array_search($record->id, $allrecordids);
|
||||
unset($allrecordids);
|
||||
@ -587,7 +594,7 @@
|
||||
|
||||
/// Get the actual records
|
||||
|
||||
if (!$records = $DB->get_records_sql($sqlselect, $params, $page * $nowperpage, $nowperpage)) {
|
||||
if (!$records = $DB->get_records_sql($sqlselect, $allparams, $page * $nowperpage, $nowperpage)) {
|
||||
// Nothing to show!
|
||||
if ($record) { // Something was requested so try to show that at least (bug 5132)
|
||||
if (has_capability('mod/data:manageentries', $context) || empty($data->approval) ||
|
||||
|
Loading…
x
Reference in New Issue
Block a user