Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 3 |
CRAP | |
0.00% |
0 / 61 |
| Search | |
0.00% |
0 / 1 |
|
0.00% |
0 / 3 |
132 | |
0.00% |
0 / 61 |
| init | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
| queryParseSearchExpression | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 6 |
|||
| query | |
0.00% |
0 / 1 |
72 | |
0.00% |
0 / 52 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\search\Plugin\views\argument\Search. | |
| */ | |
| namespace Drupal\search\Plugin\views\argument; | |
| use Drupal\views\Plugin\views\argument\ArgumentPluginBase; | |
| use Drupal\views\Plugin\views\display\DisplayPluginBase; | |
| use Drupal\views\ViewExecutable; | |
| use Drupal\views\Views; | |
| /** | |
| * Argument handler for search keywords. | |
| * | |
| * @ingroup views_argument_handlers | |
| * | |
| * @ViewsArgument("search") | |
| */ | |
| class Search extends ArgumentPluginBase { | |
| /** | |
| * A search query to use for parsing search keywords. | |
| * | |
| * @var \Drupal\search\ViewsSearchQuery | |
| */ | |
| protected $searchQuery = NULL; | |
| /** | |
| * The search type name (value of {search_index}.type in the database). | |
| * | |
| * @var string | |
| */ | |
| protected $searchType; | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) { | |
| parent::init($view, $display, $options); | |
| $this->searchType = $this->definition['search_type']; | |
| } | |
| /** | |
| * Sets up and parses the search query. | |
| * | |
| * @param string $input | |
| * The search keywords entered by the user. | |
| */ | |
| protected function queryParseSearchExpression($input) { | |
| if (!isset($this->searchQuery)) { | |
| $this->searchQuery = db_select('search_index', 'i', array('target' => 'replica'))->extend('Drupal\search\ViewsSearchQuery'); | |
| $this->searchQuery->searchExpression($input, $this->searchType); | |
| $this->searchQuery->publicParseSearchExpression(); | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function query($group_by = FALSE) { | |
| $required = FALSE; | |
| $this->queryParseSearchExpression($this->argument); | |
| if (!isset($this->searchQuery)) { | |
| $required = TRUE; | |
| } | |
| else { | |
| $words = $this->searchQuery->words(); | |
| if (empty($words)) { | |
| $required = TRUE; | |
| } | |
| } | |
| if ($required) { | |
| if ($this->operator == 'required') { | |
| $this->query->addWhere(0, 'FALSE'); | |
| } | |
| } | |
| else { | |
| $search_index = $this->ensureMyTable(); | |
| $search_condition = db_and(); | |
| // Create a new join to relate the 'search_total' table to our current 'search_index' table. | |
| $definition = array( | |
| 'table' => 'search_total', | |
| 'field' => 'word', | |
| 'left_table' => $search_index, | |
| 'left_field' => 'word', | |
| ); | |
| $join = Views::pluginManager('join')->createInstance('standard', $definition); | |
| $search_total = $this->query->addRelationship('search_total', $join, $search_index); | |
| // Add the search score field to the query. | |
| $this->search_score = $this->query->addField('', "$search_index.score * $search_total.count", 'score', array('function' => 'sum')); | |
| // Add the conditions set up by the search query to the views query. | |
| $search_condition->condition("$search_index.type", $this->searchType); | |
| $search_dataset = $this->query->addTable('node_search_dataset'); | |
| $conditions = $this->searchQuery->conditions(); | |
| $condition_conditions =& $conditions->conditions(); | |
| foreach ($condition_conditions as $key => &$condition) { | |
| // Make sure we just look at real conditions. | |
| if (is_numeric($key)) { | |
| // Replace the conditions with the table alias of views. | |
| $this->searchQuery->conditionReplaceString('d.', "$search_dataset.", $condition); | |
| } | |
| } | |
| $search_conditions =& $search_condition->conditions(); | |
| $search_conditions = array_merge($search_conditions, $condition_conditions); | |
| // Add the keyword conditions, as is done in | |
| // SearchQuery::prepareAndNormalize(), but simplified because we are | |
| // only concerned with relevance ranking so we do not need to normalize. | |
| $or = db_or(); | |
| foreach ($words as $word) { | |
| $or->condition("$search_index.word", $word); | |
| } | |
| $search_condition->condition($or); | |
| // Add the GROUP BY and HAVING expressions to the query. | |
| $this->query->addWhere(0, $search_condition); | |
| $this->query->addGroupBy("$search_index.sid"); | |
| $matches = $this->searchQuery->matches(); | |
| $placeholder = $this->placeholder(); | |
| $this->query->addHavingExpression(0, "COUNT(*) >= $placeholder", array($placeholder => $matches)); | |
| } | |
| // Set to NULL to prevent PDO exception when views object is cached | |
| // and to clear out memory. | |
| $this->searchQuery = NULL; | |
| } | |
| } |