From 6cf2ab7394565cf8015444da0af1c11d1ba90dd4 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Tue, 25 Jul 2017 18:41:12 +0200 Subject: [PATCH] MDL-59627 mod_data: Fix totalcount calculation in search_entries totalcount was incorrectly calculated for normal search. For advanced search it was working as expected. This was making searched entries pagination behave incorrectly. --- mod/data/locallib.php | 4 +++- mod/data/tests/externallib_test.php | 14 +++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/mod/data/locallib.php b/mod/data/locallib.php index 89624ef5858..5be0b56cde9 100644 --- a/mod/data/locallib.php +++ b/mod/data/locallib.php @@ -1006,15 +1006,17 @@ function data_search_entries($data, $cm, $context, $mode, $currentgroup, $search $recordids = data_get_all_recordids($data->id, $initialselect, $initialparams); $newrecordids = data_get_advance_search_ids($recordids, $searcharray, $data->id); - $totalcount = count($newrecordids); $selectdata = $where . $groupselect . $approveselect; if (!empty($advanced)) { $advancedsearchsql = data_get_advanced_search_sql($sort, $data, $newrecordids, $selectdata, $sortorder); $sqlselect = $advancedsearchsql['sql']; $allparams = array_merge($allparams, $advancedsearchsql['params']); + $totalcount = count($newrecordids); } else { $sqlselect = "SELECT $what $fromsql $sortorder"; + $sqlcountselect = "SELECT $count $fromsql $sortorder"; + $totalcount = $DB->count_records_sql($sqlcountselect, $allparams); } // Work out the paging numbers and counts. diff --git a/mod/data/tests/externallib_test.php b/mod/data/tests/externallib_test.php index 1b61d09bf49..28f4b263fe7 100644 --- a/mod/data/tests/externallib_test.php +++ b/mod/data/tests/externallib_test.php @@ -666,8 +666,20 @@ class mod_data_external_testcase extends externallib_advanced_testcase { global $DB; list($entry11, $entry12, $entry13, $entry21) = self::populate_database_with_entries(); - // First do a normal text search as student 1. I should see my two group entries. $this->setUser($this->student1); + // Empty search, it should return all the visible entries. + $result = mod_data_external::search_entries($this->database->id, 0, false); + $result = external_api::clean_returnvalue(mod_data_external::search_entries_returns(), $result); + $this->assertCount(2, $result['entries']); + $this->assertEquals(2, $result['totalcount']); + + // Search for something that does not exists. + $result = mod_data_external::search_entries($this->database->id, 0, false, 'abc'); + $result = external_api::clean_returnvalue(mod_data_external::search_entries_returns(), $result); + $this->assertCount(0, $result['entries']); + $this->assertEquals(0, $result['totalcount']); + + // Search by text matching all the entries. $result = mod_data_external::search_entries($this->database->id, 0, false, 'text'); $result = external_api::clean_returnvalue(mod_data_external::search_entries_returns(), $result); $this->assertCount(2, $result['entries']);