mirror of
https://github.com/silverstripe/silverstripe-mssql
synced 2024-10-22 08:05:53 +02:00
ENHANCEMENT: allow custom columns in search, honour the classesToSearch, join all objects with base class, so we can query ClassName
This commit is contained in:
parent
e83c14236c
commit
058c29bf69
@ -1251,8 +1251,10 @@ class MSSQLDatabase extends SS_Database {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The core search engine configuration.
|
* The core search engine configuration.
|
||||||
* @todo There is no result relevancy or ordering as it currently stands.
|
* Picks up the fulltext-indexed tables from the database and executes search on all of them.
|
||||||
|
* Results are obtained as ID-ClassName pairs which is later used to reconstruct the DataObjectSet.
|
||||||
*
|
*
|
||||||
|
* @param array classesToSearch computes all descendants and includes them. Check is done via WHERE clause.
|
||||||
* @param string $keywords Keywords as a space separated string
|
* @param string $keywords Keywords as a space separated string
|
||||||
* @return object DataObjectSet of result pages
|
* @return object DataObjectSet of result pages
|
||||||
*/
|
*/
|
||||||
@ -1260,6 +1262,12 @@ class MSSQLDatabase extends SS_Database {
|
|||||||
$results = new DataObjectSet();
|
$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);
|
if (substr($sortBy, 0, 9)!='Relevance') user_error("Non-relevance sort not supported.", E_USER_ERROR);
|
||||||
|
|
||||||
|
$allClassesToSearch = array();
|
||||||
|
foreach ($classesToSearch as $class) {
|
||||||
|
$allClassesToSearch = array_merge($allClassesToSearch, ClassInfo::dataClassesFor($class));
|
||||||
|
}
|
||||||
|
$allClassesToSearch = array_unique($allClassesToSearch);
|
||||||
|
|
||||||
//Get a list of all the tables and columns we'll be searching on:
|
//Get a list of all the tables and columns we'll be searching on:
|
||||||
$fulltextColumns = DB::query('EXEC sp_help_fulltext_columns');
|
$fulltextColumns = DB::query('EXEC sp_help_fulltext_columns');
|
||||||
@ -1277,8 +1285,10 @@ class MSSQLDatabase extends SS_Database {
|
|||||||
else array_push($table, $column['FULLTEXT_COLUMN_NAME']);
|
else array_push($table, $column['FULLTEXT_COLUMN_NAME']);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create one query per each table, columns not used.
|
// Create one query per each table, $columns not used. We want just the ID and the ClassName of the object from this query.
|
||||||
foreach($tables as $tableName=>$columns){
|
foreach($tables as $tableName=>$columns){
|
||||||
|
$baseClass = ClassInfo::baseDataClass($tableName);
|
||||||
|
|
||||||
$join = $this->fullTextSearchMSSQL($tableName, $keywords);
|
$join = $this->fullTextSearchMSSQL($tableName, $keywords);
|
||||||
if (!$join) return new DataObjectSet(); // avoid "Null or empty full-text predicate"
|
if (!$join) return new DataObjectSet(); // avoid "Null or empty full-text predicate"
|
||||||
|
|
||||||
@ -1288,11 +1298,24 @@ class MSSQLDatabase extends SS_Database {
|
|||||||
$where = array("\"$tableName\".\"ShowInSearch\"!=0");
|
$where = array("\"$tableName\".\"ShowInSearch\"!=0");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Join with CONTAINSTABLE, a full text searcher that includes relevance factor
|
|
||||||
$queries[$tableName] = singleton($tableName)->extendedSQL($where);
|
$queries[$tableName] = singleton($tableName)->extendedSQL($where);
|
||||||
$queries[$tableName]->from = array("\"$tableName\" INNER JOIN $join AS \"ft\" ON \"$tableName\".\"ID\"=\"ft\".\"KEY\"");
|
|
||||||
$queries[$tableName]->select = array("\"$tableName\".\"ID\"", "'$tableName' AS Source", "\"Rank\" AS \"Relevance\"");
|
|
||||||
$queries[$tableName]->orderby = null;
|
$queries[$tableName]->orderby = null;
|
||||||
|
|
||||||
|
// Join with CONTAINSTABLE, a full text searcher that includes relevance factor
|
||||||
|
$queries[$tableName]->from = array("\"$tableName\" INNER JOIN $join AS \"ft\" ON \"$tableName\".\"ID\"=\"ft\".\"KEY\"");
|
||||||
|
// Join with the base class if needed, as we want to test agains the ClassName
|
||||||
|
if ($tableName!=$baseClass) {
|
||||||
|
$queries[$tableName]->from[] = "INNER JOIN \"$baseClass\" ON \"$baseClass\".\"ID\"=\"$tableName\".\"ID\"";
|
||||||
|
}
|
||||||
|
$queries[$tableName]->select = array("\"$tableName\".\"ID\"", "'$tableName' AS Source", "\"Rank\" AS \"Relevance\"");
|
||||||
|
if ($extraFilter) {
|
||||||
|
$queries[$tableName]->where[] = $extraFilter;
|
||||||
|
}
|
||||||
|
if (count($allClassesToSearch)) {
|
||||||
|
$queries[$tableName]->where[] = "\"$baseClass\".\"ClassName\" IN ('".implode($allClassesToSearch, "', '")."')";
|
||||||
|
}
|
||||||
|
// Reset the parameters that would get in the way
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate SQL
|
// Generate SQL
|
||||||
|
Loading…
Reference in New Issue
Block a user