You are here

public function SearchApiFilterLocation::query in Search API Location 8

Add this filter to the query.

Due to the nature of fapi, the value and the operator have an unintended level of indirection. You will find them in $this->operator and $this->value respectively.

Overrides FilterPluginBase::query

File

modules/search_api_location_views/src/Plugin/views/filter/SearchApiFilterLocation.php, line 179

Class

SearchApiFilterLocation
Defines a filter for filtering on location fields.

Namespace

Drupal\search_api_location_views\Plugin\views\filter

Code

public function query() {
  $plugin_id = $this->options['plugin'];
  if (!$plugin_id) {
    return;
  }
  $plugin_options = $this->options['plugin-' . $plugin_id];

  /** @var \Drupal\search_api_location\LocationInput\LocationInputInterface $plugin */
  $plugin = $this->locationInputManager
    ->createInstance($plugin_id, $plugin_options);
  if (!$plugin
    ->hasInput($this->value, $this->options)) {
    return;
  }
  $location = $plugin
    ->getParsedInput($this->value);
  if (!$location) {
    $this
      ->messenger()
      ->addWarning($this
      ->t('The location %location could not be resolved and was ignored.', [
      '%location' => $this->value['value'],
    ]));
    return;
  }
  $location = explode(',', $location, 2);

  /** @var \Drupal\search_api\Query\Query $query */
  $query = $this->query;
  $location_options = (array) $query
    ->getOption('search_api_location', []);

  // If the radius isn't numeric omit it. Necessary since "no radius" is "-".
  $radius = !is_numeric($this->value['distance']['from']) ? NULL : $this->value['distance']['from'];
  if ($plugin_options['radius_type'] == 'textfield') {
    $units = array_column(search_api_location_get_units(), 'multiplier', 'id');
    $multiplier = $units[$plugin_options['radius_units']];
    $radius *= $multiplier;
  }
  $location_options[] = [
    'field' => $this->realField,
    'lat' => $location[0],
    'lon' => $location[1],
    'radius' => $radius,
  ];
  $query
    ->setOption('search_api_location', $location_options);
}