protected function SearchApiSolrBackend::createFilterQuery in Search API Solr 8
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::createFilterQuery()
- 8.2 src/Plugin/search_api/backend/SearchApiSolrBackend.php \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend::createFilterQuery()
- 4.x src/Plugin/search_api/backend/SearchApiSolrBackend.php \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend::createFilterQuery()
Create a single search query string.
1 call to SearchApiSolrBackend::createFilterQuery()
- SearchApiSolrBackend::createFilterQueries in src/
Plugin/ search_api/ backend/ SearchApiSolrBackend.php - Recursively transforms conditions into a flat array of Solr filter queries.
File
- src/
Plugin/ search_api/ backend/ SearchApiSolrBackend.php, line 1770
Class
- SearchApiSolrBackend
- Apache Solr backend for search api.
Namespace
Drupal\search_api_solr\Plugin\search_api\backendCode
protected function createFilterQuery($field, $value, $operator, FieldInterface $index_field, array &$options) {
if (!is_array($value)) {
$value = [
$value,
];
}
foreach ($value as &$v) {
if (!is_null($v) || !in_array($operator, [
'=',
'<>',
'IN',
'NOT IN',
])) {
$v = trim($v);
$v = $this
->formatFilterValue($v, $index_field
->getType());
// Remaining NULL values are now converted to empty strings.
}
}
unset($v);
if (1 == count($value)) {
$value = array_shift($value);
switch ($operator) {
case 'IN':
$operator = '=';
break;
case 'NOT IN':
$operator = '<>';
break;
}
}
if (!is_null($value) && isset($options['search_api_location'])) {
foreach ($options['search_api_location'] as &$spatial) {
if (!empty($spatial['field']) && $index_field
->getFieldIdentifier() == $spatial['field']) {
// Spatial filter queries need modifications to the query itself.
// Therefor we just store the parameters an let them be handled later.
// @see setSpatial()
// @see createLocationFilterQuery()
$spatial['filter_query_conditions'] = [
'field' => $field,
'value' => $value,
'operator' => $operator,
];
return NULL;
}
}
}
switch ($operator) {
case '<>':
if (is_null($value)) {
return "{$field}:[* TO *]";
}
else {
return "(*:* -{$field}:{$value})";
}
case '<':
return "{$field}:{* TO {$value}}";
case '<=':
return "{$field}:[* TO {$value}]";
case '>=':
return "{$field}:[{$value} TO *]";
case '>':
return "{$field}:{{$value} TO *}";
case 'BETWEEN':
return "{$field}:[" . array_shift($value) . ' TO ' . array_shift($value) . ']';
case 'NOT BETWEEN':
return "(*:* -{$field}:[" . array_shift($value) . ' TO ' . array_shift($value) . '])';
case 'IN':
$parts = [];
$null = FALSE;
foreach ($value as $v) {
if (is_null($v)) {
$null = TRUE;
}
else {
$parts[] = "{$field}:{$v}";
}
}
if ($null) {
// @see https://stackoverflow.com/questions/4238609/how-to-query-solr-for-empty-fields/28859224#28859224
return "(*:* -{$field}:[* TO *])";
}
return '(' . implode(" ", $parts) . ')';
case 'NOT IN':
$parts = [];
$null = FALSE;
foreach ($value as $v) {
if (is_null($v)) {
$null = TRUE;
}
else {
$parts[] = "-{$field}:{$v}";
}
}
return '(' . ($null ? "{$field}:[* TO *]" : '*:*') . ' ' . implode(" ", $parts) . ')';
case '=':
default:
if (is_null($value)) {
// @see https://stackoverflow.com/questions/4238609/how-to-query-solr-for-empty-fields/28859224#28859224
return "(*:* -{$field}:[* TO *])";
}
else {
return "{$field}:{$value}";
}
}
}