You are here

function contextual_range_filter_build_range_query in Views Contextual Range Filter 7

Add to the query a WHERE-clause based on the range(s) passed in.

Parameters

object $views_handler_argument: The Views handler that holds one or more contextual filter ranges.

string $field: Name or expression to be used left of the operator in the WHERE clause

callback/callable $range_converter: Optional function to convert the from--to range, e.g., for relative date ranges like "-3 months--last week" to be converted to "20140120--20140413".

3 calls to contextual_range_filter_build_range_query()
contextual_range_filter_handler_argument_date_range::query in views/contextual_range_filter_handler_argument_date_range.inc
Prepare the range query WHERE-clause.
contextual_range_filter_handler_argument_numeric_range::query in views/contextual_range_filter_handler_argument_numeric_range.inc
Help build the query.
contextual_range_filter_handler_argument_string_range::query in views/contextual_range_filter_handler_argument_string_range.inc
Build the query.

File

views/contextual_range_filter.views.inc, line 79
contextual_range_filter_views.inc

Code

function contextual_range_filter_build_range_query($views_handler_argument, $field = NULL, $range_converter = NULL) {
  if (!isset($views_handler_argument) || $views_handler_argument->value === FALSE) {
    return;
  }
  if (!isset($field)) {

    // E.g. field_datafield_price.field_price_value.
    $field = "{$views_handler_argument->table_alias}.{$views_handler_argument->real_field}";
  }

  // From "Exclude:" tickbox.
  $is_not = !empty($views_handler_argument->options['not']);
  $null_check = $is_not ? "OR {$field} IS NULL" : '';

  // All WHERE clauses are OR-ed or AND-ed together in the same group.
  // Note: NOT (a OR b OR c) == (NOT a) AND (NOT b) AND (NOT c).
  $group = $views_handler_argument->query
    ->set_where_group($is_not ? 'AND' : 'OR');
  foreach ($views_handler_argument->value as $range) {
    $placeholder = $views_handler_argument
      ->placeholder();
    list($from, $to) = contextual_range_filter_split($range);
    if (is_callable($range_converter)) {
      list($from, $to) = call_user_func($range_converter, $from, $to);
    }
    if ($to === FALSE) {

      // Single value, not a range.
      $operator = $is_not ? '!=' : '=';
      $views_handler_argument->query
        ->add_where_expression($group, "{$field} {$operator} {$placeholder} {$null_check}", array(
        $placeholder => $range,
      ));
    }
    elseif ($from != '' && $to != '') {

      // Range from--to.
      $operator = $is_not ? 'NOT BETWEEN' : 'BETWEEN';
      $placeholder_from = $placeholder;
      $placeholder_to = $views_handler_argument
        ->placeholder();
      $views_handler_argument->query
        ->add_where_expression($group, "{$field} {$operator} {$placeholder_from} AND {$placeholder_to} {$null_check}", array(
        $placeholder_from => $from,
        $placeholder_to => $to,
      ));
    }
    elseif ($from != '') {

      // Range from--.
      $operator = $is_not ? '<' : '>=';
      $views_handler_argument->query
        ->add_where_expression($group, "{$field} {$operator} {$placeholder} {$null_check}", array(
        $placeholder => $from,
      ));
    }
    elseif ($to != '') {

      // Range --to.
      $operator = $is_not ? '>' : '<=';
      $views_handler_argument->query
        ->add_where_expression($group, "{$field} {$operator} {$placeholder} {$null_check}", array(
        $placeholder => $to,
      ));
    }
  }
}