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}]";
}