You are here

protected function SearchApiFacetapiDate::createRangeFilter in Search API 7

Rewrites the handler-specific date range syntax to the normal facet syntax.

Parameters

string $value: The user-facing facet value.

Return value

string|null A facet to add as a filter, in the format used internally in this module. Or NULL if the raw facet in $value is not valid.

1 call to SearchApiFacetapiDate::createRangeFilter()
SearchApiFacetapiDate::execute in contrib/search_api_facetapi/plugins/facetapi/query_type_date.inc
Adds the filter to the query object.

File

contrib/search_api_facetapi/plugins/facetapi/query_type_date.inc, line 93
Date query type plugin for the Search API adapter.

Class

SearchApiFacetapiDate
Plugin for "date" query types.

Code

protected function createRangeFilter($value) {

  // Ignore any filters passed directly from the server (range or missing).
  if (!$value || $value == '!' || !ctype_digit($value[0]) && preg_match('/^[\\[(][^ ]+ TO [^ ]+[\\])]$/', $value)) {
    return $value ? $value : NULL;
  }

  // Parse into date parts.
  $parts = $this
    ->parseRangeFilter($value);

  // Return NULL if the date parts are invalid or none were found.
  if (empty($parts)) {
    return NULL;
  }
  $date = new DateTime();
  switch (count($parts)) {
    case 1:
      $date
        ->setDate($parts[0], 1, 1);
      $date
        ->setTime(0, 0, 0);
      $lower = $date
        ->format('U');
      $date
        ->setDate($parts[0] + 1, 1, 1);
      $date
        ->setTime(0, 0, -1);
      $upper = $date
        ->format('U');
      break;
    case 2:

      // Luckily, $month = 13 is treated as January of next year. (The same
      // goes for all other parameters.) We use the inverse trick for the
      // seconds of the upper bound, since that's inclusive and we want to
      // stop at a second before the next segment starts.
      $date
        ->setDate($parts[0], $parts[1], 1);
      $date
        ->setTime(0, 0, 0);
      $lower = $date
        ->format('U');
      $date
        ->setDate($parts[0], $parts[1] + 1, 1);
      $date
        ->setTime(0, 0, -1);
      $upper = $date
        ->format('U');
      break;
    case 3:
      $date
        ->setDate($parts[0], $parts[1], $parts[2]);
      $date
        ->setTime(0, 0, 0);
      $lower = $date
        ->format('U');
      $date
        ->setDate($parts[0], $parts[1], $parts[2] + 1);
      $date
        ->setTime(0, 0, -1);
      $upper = $date
        ->format('U');
      break;
    case 4:
      $date
        ->setDate($parts[0], $parts[1], $parts[2]);
      $date
        ->setTime($parts[3], 0, 0);
      $lower = $date
        ->format('U');
      $date
        ->setTime($parts[3] + 1, 0, -1);
      $upper = $date
        ->format('U');
      break;
    case 5:
      $date
        ->setDate($parts[0], $parts[1], $parts[2]);
      $date
        ->setTime($parts[3], $parts[4], 0);
      $lower = $date
        ->format('U');
      $date
        ->setTime($parts[3], $parts[4] + 1, -1);
      $upper = $date
        ->format('U');
      break;
    case 6:
      $date
        ->setDate($parts[0], $parts[1], $parts[2]);
      $date
        ->setTime($parts[3], $parts[4], $parts[5]);
      return $date
        ->format('U');
    default:
      return $value;
  }
  return "[{$lower} TO {$upper}]";
}