query_type_numeric_range.inc in Apache Solr Search 7
Same filename and directory in other branches
Numeric range query type plugin for the Apache Solr adapter.
File
plugins/facetapi/query_type_numeric_range.incView source
<?php
/**
* @file
* Numeric range query type plugin for the Apache Solr adapter.
*/
/**
* Plugin for "numeric_range" query types.
*/
class ApacheSolrFacetapiNumericRange extends FacetapiQueryType implements FacetapiQueryTypeInterface {
private $single_key;
/**
* Returns the query type associated with the plugin.
*
* @return string
* The query type.
*/
public static function getType() {
return 'numeric_range';
}
/**
* Adds the filter to the query object.
*
* @param DrupalSolrQueryInterface $query
* An object containing the query in the backend's native API.
* @todo Cache the values based on the filter query or any other way?
*/
public function execute($query) {
// Check if we have a cache of this field
//
$settings = $this->adapter
->getFacet($this->facet)
->getSettings();
$active = $this->adapter
->getActiveItems($this->facet);
$singular_field_info = $this->facet['map options'];
$singular_field_info['multiple'] = FALSE;
$this->single_key = apachesolr_index_key($singular_field_info);
// See: http://wiki.apache.org/solr/StatsComponent
$query
->addParam('stats', 'true');
$query
->addParam('stats.field', $this->single_key);
$query
->addParam('stats.facet', $this->single_key);
// Range filters don't support OR operator.
foreach ($active as $value => $item) {
$query
->addFilter($this->single_key, $value);
}
}
/**
* Initializes the facet's build array.
*
* Any calls to this method need to be wrapped in a try-catch block.
*
* @return array
* The initialized render array.
*/
public function build() {
$build = array();
if (!isset($this->single_key)) {
return $build;
}
// Per key we save our statistics result
$cache = cache_get('stats_' . $this->single_key, 'cache_apachesolr');
$stats_minmax = array();
if (!isset($cache->data)) {
// we need an additional query for the statistics of the field
// We can optionally specify a Solr object.
$solr = apachesolr_get_solr();
// We possibly need some caching for this query
$query_stats = apachesolr_drupal_query('apachesolr_stats', array(), '', '', $solr);
$query_stats
->addParam('stats', 'true');
$query_stats
->addParam('stats.field', $this->single_key);
$query_stats
->addParam('stats.facet', $this->single_key);
$response_stats = $query_stats
->search();
if ($response_stats->response) {
$stats_minmax = $response_stats->stats->stats_fields->{$this->single_key};
cache_set('stats_' . $this->single_key, $stats_minmax, 'cache_apachesolr');
}
}
else {
// Set our statistics from the cache
$stats_minmax = $cache->data;
}
if ($response = apachesolr_static_response_cache($this->adapter
->getSearcher())) {
if (isset($response->stats->stats_fields->{$this->single_key})) {
$stats = (array) $response->stats->stats_fields->{$this->single_key};
foreach ($stats as $key => $val) {
$build[$this->facet['field']]['#range_' . $key] = $val;
$build[$this->facet['field']]['#global_range_' . $key] = $stats_minmax->{$key};
}
}
}
return $build;
}
}
Classes
Name | Description |
---|---|
ApacheSolrFacetapiNumericRange | Plugin for "numeric_range" query types. |