Mercurial > hg > solrsearch
diff plugins/facetapi/query_type_numeric_range.inc @ 0:a2b4f67e73dc default tip
initial
author | Dirk Wintergruen <dwinter@mpiwg-berlin.mpg.de> |
---|---|
date | Mon, 08 Jun 2015 10:21:54 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/facetapi/query_type_numeric_range.inc Mon Jun 08 10:21:54 2015 +0200 @@ -0,0 +1,102 @@ +<?php + +/** + * @file + * Numeric range query type plugin for the Apache Solr adapter. + */ + +/** + * Plugin for "numeric_range" query types. + */ +class solrsearchFacetapiNumericRange extends FacetapiQueryType implements FacetapiQueryTypeInterface { + + private $single_key; + /** + * Returns the query type associated with the plugin. + * + * @return string + * The query type. + */ + static public 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 = solrsearch_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_solrsearch'); + $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 = solrsearch_get_solr(); + + // We possibly need some caching for this query + $query_stats = solrsearch_drupal_query('solrsearch_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_solrsearch'); + } + } + else { + // Set our statistics from the cache + $stats_minmax = $cache->data; + } + + if ($response = solrsearch_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; + } +}