You are here

DateRangeQueryType.php in Date Facets 7

Contains Drupal_Apachesolr_Facetapi_QueryType_DateRangeQueryType.

File

lib/Drupal/Apachesolr/Facetapi/QueryType/DateRangeQueryType.php
View source
<?php

/**
 * @file
 * Contains Drupal_Apachesolr_Facetapi_QueryType_DateRangeQueryType.
 */

/**
 * Date range query type plugin for the Apache Solr Search Integration adapter.
 */
class Drupal_Apachesolr_Facetapi_QueryType_DateRangeQueryType extends FacetapiQueryType implements FacetapiQueryTypeInterface {

  /**
   * Implements FacetapiQueryTypeInterface::getType().
   */
  public static function getType() {
    return DATE_FACETS_DATE_RANGE_QUERY_TYPE;
  }

  /**
   * Implements FacetapiQueryTypeInterface::execute().
   *
   * @see http://searchhub.org/dev/2012/02/23/date-math-now-and-filter-queries/
   */
  public function execute($query) {
    $active = $this
      ->getActiveItems();
    $settings = $this->adapter
      ->getFacetSettings($this->facet, facetapi_realm_load('block'));

    // Get the configured date ranges, or the default ranges if none have been
    // set up already.
    $ranges = isset($settings->settings['ranges']) ? $settings->settings['ranges'] : date_facets_default_ranges();

    // We generate the ranges and add them to the facet query to get facet counts.
    foreach (array_merge($ranges, date_facets_default_ranges()) as $range) {
      list($start, $end) = $this
        ->generateRange($range, $this->facet['field']);
      $query
        ->addParam('facet.query', $this->facet['field'] . ":[{$start} TO {$end}]");
    }

    // Generate the date range and add it as a filter.
    if (!empty($active)) {
      $range = $ranges[key($active)];
      list($start, $end) = $this
        ->generateRange($range, $this->facet['field']);
      $query
        ->addParam('fq', $this->facet['field'] . ":[{$start} TO {$end}]");
    }
  }

  /**
   * Return the divisor for the given unit.
   */
  protected function unitDivisor($unit) {
    switch ($unit) {
      case "HOUR":
        return "HOUR";
      case "DAY":
        return "DAY";
      case "MONTH":
      case "YEAR":
        return "MONTH";
    }
  }

  /**
   * Generate a Solr version of a lower and upper date range.
   */
  protected function generateRange($range, $field = NULL) {
    if ($range['date_range_start_op'] == 'NOW') {
      $lower = "NOW/DAY";
    }
    else {
      $s = (int) abs($range['date_range_start_amount']) > 1 ? 'S' : '';
      $lower = "NOW/" . $this
        ->unitDivisor($range['date_range_start_unit']) . $range['date_range_start_op'] . $range['date_range_start_amount'] . $range['date_range_start_unit'] . $s;
    }
    if ($range['date_range_end_op'] == 'NOW') {
      $upper = "NOW/DAY+1DAY";
    }
    else {
      $s = (int) abs($range['date_range_end_amount']) > 1 ? 'S' : '';
      $upper = "NOW/" . $this
        ->unitDivisor($range['date_range_end_unit']) . $range['date_range_end_op'] . $range['date_range_end_amount'] . $range['date_range_end_unit'] . $s;
    }
    if (!empty($field) && !SolrBaseQuery::validFilterValue($field . ":[{$lower} TO {$upper}]")) {
      $lower = "NOW/DAY";
      $upper = "NOW/DAY+1DAY";
    }
    return array(
      $lower,
      $upper,
    );
  }

  /**
   * Implements FacetapiQueryTypeInterface::build().
   *
   * Unlike normal facets, we provide a static list of options.
   */
  public function build() {

    // Get facet's configured date ranges, or defaults if none have been set up.
    $settings = $this->adapter
      ->getFacetSettings($this->facet, facetapi_realm_load('block'));
    $ranges = isset($settings->settings['ranges']) && !empty($settings->settings['ranges']) ? $settings->settings['ranges'] : date_facets_default_ranges();

    // Build the markup for the date ranges.
    $build = date_facets_get_ranges_render_arrays($ranges);
    if ($response = apachesolr_static_response_cache($this->adapter
      ->getSearcher())) {
      $facet_global_settings = $this->adapter
        ->getFacet($this->facet)
        ->getSettings();
      $values = (array) $response->facet_counts->facet_queries;

      // Add result counts from the facet queries added in execute().
      foreach ($ranges as $range) {
        list($start, $end) = $this
          ->generateRange($range);
        $build[$range['machine_name']]['#count'] = $values[$this->facet['field'] . ":[{$start} TO {$end}]"];
      }

      // Unset options with fewer results than the minimum count setting.
      foreach ($build as $name => $item) {
        if ($item['#count'] < $facet_global_settings->settings['facet_mincount']) {
          unset($build[$name]);
        }
      }
    }
    return $build;
  }

}

Classes

Namesort descending Description
Drupal_Apachesolr_Facetapi_QueryType_DateRangeQueryType Date range query type plugin for the Apache Solr Search Integration adapter.