QueryTypeRangeBase.php in Facets 8
File
src/QueryType/QueryTypeRangeBase.php
View source
<?php
namespace Drupal\facets\QueryType;
use Drupal\facets\Result\Result;
abstract class QueryTypeRangeBase extends QueryTypePluginBase {
public function execute() {
$query = $this->query;
if (!empty($query)) {
$options =& $query
->getOptions();
$operator = $this->facet
->getQueryOperator();
$field_identifier = $this->facet
->getFieldIdentifier();
$exclude = $this->facet
->getExclude();
$options['search_api_facets'][$field_identifier] = $this
->getFacetOptions();
$active_items = $this->facet
->getActiveItems();
$filter = $query
->createConditionGroup($operator, [
'facet:' . $field_identifier,
]);
if (count($active_items)) {
foreach ($active_items as $value) {
$range = $this
->calculateRange($value);
$conjunction = $exclude ? 'OR' : 'AND';
$item_filter = $query
->createConditionGroup($conjunction, [
'facet:' . $field_identifier,
]);
$item_filter
->addCondition($this->facet
->getFieldIdentifier(), $range['start'], $exclude ? '<' : '>=');
$item_filter
->addCondition($this->facet
->getFieldIdentifier(), $range['stop'], $exclude ? '>' : '<=');
$filter
->addConditionGroup($item_filter);
}
$query
->addConditionGroup($filter);
}
}
}
public abstract function calculateRange($value);
public function build() {
if (empty($this->results)) {
return $this->facet;
}
$query_operator = $this->facet
->getQueryOperator();
$facet_results = [];
foreach ($this->results as $result) {
if ($result['count'] || $query_operator == 'or') {
$count = $result['count'];
if ($result_filter = $this
->calculateResultFilter(trim($result['filter'], '"'))) {
if (isset($facet_results[$result_filter['raw']])) {
$facet_results[$result_filter['raw']]
->setCount($facet_results[$result_filter['raw']]
->getCount() + $count);
}
else {
$facet_results[$result_filter['raw']] = new Result($this->facet, $result_filter['raw'], $result_filter['display'], $count);
}
}
}
}
$this->facet
->setResults($facet_results);
return $this->facet;
}
public abstract function calculateResultFilter($value);
}