Mercurial > hg > solrsearch
diff plugins/facetapi/query_type_geo.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_geo.inc Mon Jun 08 10:21:54 2015 +0200 @@ -0,0 +1,84 @@ +<?php + +/** + * Plugin for "apachesolr_geo" query types. + */ +class solrsearchFacetapiGeo extends FacetapiQueryType implements FacetapiQueryTypeInterface { + // Center point is Denver. + public $center_point = '39.7391667,-104.9841667'; + public $facet_options = '0.5,0.1,0.01'; + public $default_radius = 100; + + /** + * Returns the query type associated with the plugin. + * + * @return string + * The query type. + */ + static public function getType() { + return 'geo'; + } + + /** + * Adds the filter to the query object. + * + * @param DrupalSolrQueryInterface $query + * An object containing the query in the backend's native API. + */ + public function execute($query) { + // Retrieve settings of the facet. + // We should be able to get all constants as facet options. + $settings = $this->adapter->getFacet($this->facet)->getSettings(); + + $facet_distances = explode(',', $this->facet_options); + + $active_items = $this->adapter->getActiveItems($this->facet); + + if (empty($active_items)) { + $distance = $this->default_radius; + } + else { + $active_item = array_pop($active_items); + $distance = substr($active_item['value'], 1); + // Add current selected distance to have possibility to unselect it. + $facet_distances[] = 1; + } + + // Search center point. + $query->addParam('pt', $this->center_point); + + // Set location field name. + $query->addParam('sfield', $this->facet['field']); + $query->addParam('fq', '{!geofilt sfield=' . $this->facet['field'] . '}'); + + // Set search radius. + $query->addParam('d', $distance); + + // Set facets. + foreach ($facet_distances as $facet_option) { + $facet_distance = $distance * $facet_option; + $query->addParam('facet.query', '{!geofilt d=' . $facet_distance . ' key=d' . $facet_distance . '}'); + } + } + + /** + * Initializes the facet's build array. + * + * @return array + * The initialized render array. + */ + public function build() { + $build = array(); + if ($response = apachesolr_static_response_cache($this->adapter->getSearcher())) { + if (isset($response->facet_counts->facet_queries)) { + foreach ($response->facet_counts->facet_queries as $value => $count) { + // Skip zero results values. + if ($count > 0) { + $build[$value] = array('#count' => $count); + } + } + } + } + return $build; + } +}