BUGFIX Fixed support for fulltext search in PostgreSQLDatabase::searchEngine() by supporting DataList/PaginatedList/ArrayList when these classes are available

This commit is contained in:
Sean Harvey 2012-02-11 15:58:04 +13:00
parent 8bbf8401f9
commit 7a3024d046

View File

@ -1656,7 +1656,6 @@ class PostgreSQLDatabase extends SS_Database {
* @return object DataObjectSet of result pages * @return object DataObjectSet of result pages
*/ */
public function searchEngine($classesToSearch, $keywords, $start, $pageLength, $sortBy = "ts_rank DESC", $extraFilter = "", $booleanSearch = false, $alternativeFileFilter = "", $invertedMatch = false) { public function searchEngine($classesToSearch, $keywords, $start, $pageLength, $sortBy = "ts_rank DESC", $extraFilter = "", $booleanSearch = false, $alternativeFileFilter = "", $invertedMatch = false) {
//Fix the keywords to be ts_query compatitble: //Fix the keywords to be ts_query compatitble:
//Spaces must have pipes //Spaces must have pipes
//@TODO: properly handle boolean operators here. //@TODO: properly handle boolean operators here.
@ -1677,7 +1676,7 @@ class PostgreSQLDatabase extends SS_Database {
// Make column selection lists // Make column selection lists
$select = array( $select = array(
'SiteTree' => array("\"ClassName\"","\"SiteTree\".\"ID\"","\"ParentID\"","\"Title\"","\"URLSegment\"","\"Content\"","\"LastEdited\"","\"Created\"","NULL AS \"Filename\"", "NULL AS \"Name\"", "\"CanViewType\""), 'SiteTree' => array("\"ClassName\"","\"SiteTree\".\"ID\"","\"ParentID\"","\"Title\"","\"URLSegment\"","\"Content\"","\"LastEdited\"","\"Created\"","NULL AS \"Filename\"", "NULL AS \"Name\"", "\"CanViewType\""),
'File' => array("\"ClassName\"","\"File\".\"ID\"","NULL AS \"ParentID\"","\"Title\"","NULL AS \"URLSegment\"","\"Content\"","\"LastEdited\"","\"Created\"","\"Filename\"","\"Name\"", "NULL AS \"CanViewType\""), 'File' => array("\"ClassName\"","\"File\".\"ID\"","0 AS \"ParentID\"","\"Title\"","NULL AS \"URLSegment\"","\"Content\"","\"LastEdited\"","\"Created\"","\"Filename\"","\"Name\"", "NULL AS \"CanViewType\""),
); );
foreach($result as $row){ foreach($result as $row){
@ -1694,7 +1693,12 @@ class PostgreSQLDatabase extends SS_Database {
} }
//public function extendedSQL($filter = "", $sort = "", $limit = "", $join = "", $having = ""){ //public function extendedSQL($filter = "", $sort = "", $limit = "", $join = "", $having = ""){
$query=singleton($row['table_name'])->extendedSql("\"" . $row['table_name'] . "\".\"" . $row['column_name'] . "\" " . $this->default_fts_search_method . ' q ' . $showInSearch, ''); $where = "\"" . $row['table_name'] . "\".\"" . $row['column_name'] . "\" " . $this->default_fts_search_method . ' q ' . $showInSearch;
if(class_exists('DataList')) {
$query = DataList::create($row['table_name'])->where($where, '')->dataQuery()->query();
} else {
$query = singleton($row['table_name'])->extendedSql($where, '');
}
$query->select=$select[$row['table_name']]; $query->select=$select[$row['table_name']];
$query->from['tsearch']=", to_tsquery('" . $this->get_search_language() . "', '$keywords') AS q"; $query->from['tsearch']=", to_tsquery('" . $this->get_search_language() . "', '$keywords') AS q";
@ -1707,8 +1711,6 @@ class PostgreSQLDatabase extends SS_Database {
$tables[] = $query->sql(); $tables[] = $query->sql();
} }
$doSet=new DataObjectSet();
$limit=$pageLength; $limit=$pageLength;
$offset=$start; $offset=$start;
@ -1725,13 +1727,21 @@ class PostgreSQLDatabase extends SS_Database {
$objects[] = new $record['ClassName']($record); $objects[] = new $record['ClassName']($record);
$totalCount++; $totalCount++;
} }
if(isset($objects)) $doSet = new DataObjectSet($objects);
else $doSet = new DataObjectSet();
$doSet->setPageLimits($start, $pageLength, $totalCount);
return $doSet;
if(class_exists('PaginatedList')) {
if(isset($objects)) $results = new ArrayList($objects);
else $results = new ArrayList();
$list = new PaginatedList($results);
$list->setPageStart($start);
$list->setPageLength($pageLength);
$list->setTotalItems($totalCount);
return $list;
} else {
if(isset($objects)) $results = new DataObjectSet($objects);
else $results = new DataObjectSet();
$results->setPageLimits($start, $pageLength, $current+1);
return $results;
}
} }
/* /*