Commit 6987dd4c authored by Dries's avatar Dries

- Patch #791270 by duellj, lotyrin, Berdir: SearchQuery exact search...

- Patch #791270 by duellj, lotyrin, Berdir: SearchQuery exact search conditions not added to CountQuery.
parent 6cb598ec
......@@ -1542,16 +1542,10 @@ function node_search_execute($keys = NULL) {
// Add the ranking expressions.
_node_rankings($query);
// Add a count query.
$inner_query = clone $query;
$count_query = db_select($inner_query->fields('i', array('sid')), NULL, array('target' => 'slave'));
$count_query->addExpression('COUNT(*)');
$query->setCountQuery($count_query);
// Load results.
$find = $query
->limit(10)
->execute();
// Load results.
$results = array();
foreach ($find as $item) {
// Render the node.
......
......@@ -177,16 +177,10 @@ function hook_search_execute($keys = NULL) {
// Add the ranking expressions.
_node_rankings($query);
// Add a count query.
$inner_query = clone $query;
$count_query = db_select($inner_query->fields('i', array('sid')));
$count_query->addExpression('COUNT(*)');
$query->setCountQuery($count_query);
// Load results.
$find = $query
->limit(10)
->execute();
// Load results.
$results = array();
foreach ($find as $item) {
// Build the node body.
......
......@@ -407,6 +407,7 @@ public function execute()
return new DatabaseStatementEmpty();
}
// Add conditions to query.
$this->join('search_dataset', 'd', 'i.sid = d.sid AND i.type = d.type');
$this->condition($this->conditions);
......@@ -443,4 +444,35 @@ public function execute()
return $this->query->execute();
}
/**
* Build the default count query for SearchQuery.
*
* Since SearchQuery always uses GROUP BY, we can default to a subquery. Also
* adding the same conditions as execute() because countQuery() is called
* first.
*/
public function countQuery() {
// Clone the inner query.
$inner = clone $this->query;
// Add conditions to query.
$inner->join('search_dataset', 'd', 'i.sid = d.sid AND i.type = d.type');
$inner->condition($this->conditions);
// Remove existing fields and expressions, they are not needed for a count
// query.
$fields =& $inner->getFields();
$fields = array();
$expressions =& $inner->getExpressions();
$expressions = array();
// Add the sid as the only field and count them as a subquery.
$count = db_select($inner->fields('i', array('sid')), NULL, array('target' => 'slave'));
// Add the COUNT() expression.
$count->addExpression('COUNT(*)');
return $count;
}
}
......@@ -593,6 +593,66 @@ class SearchBlockTestCase extends DrupalWebTestCase {
}
}
/**
* Tests that searching for a phrase gets the correct page count.
*/
class SearchExactTestCase extends DrupalWebTestCase {
public static function getInfo() {
return array(
'name' => 'Search engine phrase queries',
'description' => 'Tests that searching for a phrase gets the correct page count.',
'group' => 'Search',
);
}
function setUp() {
parent::setUp('search');
}
/**
* Tests that the correct number of pager links are found for both keywords and phrases.
*/
function testExactQuery() {
// Login with sufficient privileges.
$this->drupalLogin($this->drupalCreateUser(array('create page content', 'search content')));
$settings = array(
'type' => 'page',
'title' => 'Simple Node',
);
// Create nodes with exact phrase.
for ($i = 0; $i <= 17; $i++) {
$settings['body'] = array(LANGUAGE_NONE => array(array('value' => 'love pizza')));
$this->drupalCreateNode($settings);
}
// Create nodes containing keywords.
for ($i = 0; $i <= 17; $i++) {
$settings['body'] = array(LANGUAGE_NONE => array(array('value' => 'love cheesy pizza')));
$this->drupalCreateNode($settings);
}
// Update the search index.
module_invoke_all('update_index');
search_update_totals();
// Refresh variables after the treatment.
$this->refreshVariables();
// Test that the correct number of pager links are found for keyword search.
$edit = array('keys' => 'love pizza');
$this->drupalPost('search/node', $edit, t('Search'));
$this->assertLinkByHref('page=1', 0, '2nd page link is found for keyword search.');
$this->assertLinkByHref('page=2', 0, '3rd page link is found for keyword search.');
$this->assertLinkByHref('page=3', 0, '4th page link is found for keyword search.');
$this->assertNoLinkByHref('page=4', '5th page link is not found for keyword search.');
// Test that the correct number of pager links are found for exact phrase search.
$edit = array('keys' => '"love pizza"');
$this->drupalPost('search/node', $edit, t('Search'));
$this->assertLinkByHref('page=1', 0, '2nd page link is found for exact phrase search.');
$this->assertNoLinkByHref('page=2', '3rd page link is not found for exact phrase search.');
}
}
/**
* Test integration searching comments.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment