From 2b5f25455fad0784e130efc8d5b4915cc716a430 Mon Sep 17 00:00:00 2001 From: Mateusz Uzdowski Date: Wed, 1 Sep 2010 04:06:36 +0000 Subject: [PATCH] BUGFIX: limit the query results for pagination --- code/MSSQLDatabase.php | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/code/MSSQLDatabase.php b/code/MSSQLDatabase.php index 2da0080..aaf94c3 100644 --- a/code/MSSQLDatabase.php +++ b/code/MSSQLDatabase.php @@ -1228,9 +1228,8 @@ class MSSQLDatabase extends SS_Database { */ public function searchEngine($classesToSearch, $keywords, $start, $pageLength, $sortBy = "Relevance DESC", $extraFilter = "", $booleanSearch = false, $alternativeFileFilter = "", $invertedMatch = false) { $results = new DataObjectSet(); - if(!$this->fullTextEnabled()) { - return $results; - } + if(!$this->fullTextEnabled()) return $results; + if (substr($sortBy, 0, 9)!='Relevance') user_error("Non-relevance sort not supported.", E_USER_ERROR); //Get a list of all the tables and columns we'll be searching on: $fulltextColumns = DB::query('EXEC sp_help_fulltext_columns'); @@ -1266,7 +1265,7 @@ class MSSQLDatabase extends SS_Database { $queries[$tableName]->orderby = null; } - // Generate SQL and count totals + // Generate SQL $querySQLs = array(); foreach($queries as $query) { $querySQLs[] = $query->sql(); @@ -1278,16 +1277,20 @@ class MSSQLDatabase extends SS_Database { // Perform the search $result = DB::query($fullQuery); - // Regenerate the DataObjects, apply security - $totalCount = 0; - foreach($result as $row) { - $record = DataObject::get_by_id($row['Source'], $row['ID']); - if($record->canView()) { - $results->push($record); - $totalCount++; - } - } + // Regenerate DataObjectSet + $totalCount = $result->numRecords(); + $current = -1; + $results = new DataObjectSet(); + foreach ($result as $row) { + $current++; + // Select a subset for paging + if ($current>=$start+$pageLength) break; + if ($current<$start) continue; + + $results->push(DataObject::get_by_id($row['Source'], $row['ID'])); + } + $results->setPageLimits($start, $pageLength, $totalCount); return $results;