protected function SearchApiSolrBackend::createFilterQueries in Search API Solr 8.2
Same name and namespace in other branches
- 8.3 src/Plugin/search_api/backend/SearchApiSolrBackend.php \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend::createFilterQueries()
- 8 src/Plugin/search_api/backend/SearchApiSolrBackend.php \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend::createFilterQueries()
- 4.x src/Plugin/search_api/backend/SearchApiSolrBackend.php \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend::createFilterQueries()
Recursively transforms conditions into a flat array of Solr filter queries.
Parameters
\Drupal\search_api\Query\ConditionGroupInterface $condition_group: The group of conditions.
array $solr_fields: The mapping from Drupal to Solr field names.
\Drupal\search_api\Item\FieldInterface[] $index_fields: The fields handled by the current index.
array $options: The query options.
Return value
array Array of filter query strings.
Throws
\Drupal\search_api\SearchApiException
2 calls to SearchApiSolrBackend::createFilterQueries()
- AbstractSearchApiSolrMultilingualBackend::getFilterQueries in src/
Plugin/ search_api/ backend/ AbstractSearchApiSolrMultilingualBackend.php - Serializes a query's conditions as Solr filter queries.
- SearchApiSolrBackend::getFilterQueries in src/
Plugin/ search_api/ backend/ SearchApiSolrBackend.php - Serializes a query's conditions as Solr filter queries.
File
- src/
Plugin/ search_api/ backend/ SearchApiSolrBackend.php, line 2020
Class
- SearchApiSolrBackend
- Apache Solr backend for search api.
Namespace
Drupal\search_api_solr\Plugin\search_api\backendCode
protected function createFilterQueries(ConditionGroupInterface $condition_group, array $solr_fields, array $index_fields, array &$options, QueryInterface $query) {
$fq = [];
$conditions = $condition_group
->getConditions();
foreach ($conditions as $condition) {
if ($condition instanceof ConditionInterface) {
// Nested condition.
$field = $condition
->getField();
if (!isset($index_fields[$field])) {
throw new SearchApiException("Filter term on unknown or unindexed field {$field}.");
}
$value = $condition
->getValue();
$filter_query = '';
if (strpos($solr_fields[$field], 't') === 0 && $value) {
// Fulltext fields.
$parse_mode_id = $query
->getParseMode()
->getPluginId();
$keys = [
'#conjunction' => 'OR',
'#negation' => $condition
->getOperator() == '<>',
];
switch ($parse_mode_id) {
// This is a hack. We assume that the user filters for any term /
// phrase. But this prevents an explicit selection of all terms.
// @see https://www.drupal.org/project/search_api/issues/2991134
case 'terms':
case 'phrase':
if (is_array($value)) {
$keys += $value;
}
else {
$keys[] = $value;
}
break;
case 'direct':
$keys = $value;
break;
default:
throw new SearchApiSolrException('Incompatible parse mode.');
}
$filter_query = $this
->flattenKeys($keys, [
$solr_fields[$field],
], $parse_mode_id);
}
else {
// Non-fulltext fields or fulltext fields checked against NULL.
$filter_query = $this
->createFilterQuery($solr_fields[$field], $value, $condition
->getOperator(), $index_fields[$field], $options);
}
if ($filter_query) {
$fq[] = [
'query' => $filter_query,
'tags' => $condition_group
->getTags(),
];
}
}
else {
// Nested condition group.
$nested_fqs = $this
->createFilterQueries($condition, $solr_fields, $index_fields, $options, $query);
$fq = array_merge($fq, $this
->reduceFilterQueries($nested_fqs, $condition));
}
}
return $fq;
}