You are here

function date_api_filter_handler::query in Date 6.2

Custom implementation of query() so we can get the AND and OR methods in the right places.

File

includes/date_api_filter_handler.inc, line 450
Date Views filter handler.

Class

date_api_filter_handler
A flexible, configurable date filter.

Code

function query() {
  $this
    ->get_query_fields();
  if (!empty($this->query_fields)) {
    foreach ((array) $this->query_fields as $query_field) {
      $field = $query_field['field'];
      if (!isset($this->query->table_queue[$field['table_name']])) {
        if ($field['table_name'] != $this->table || !empty($this->relationship)) {
          $this->related_table_alias = $this->query
            ->ensure_table($field['table_name'], $this->relationship);
        }
      }
      $table_alias = !empty($this->related_table_alias) ? $this->related_table_alias : $field['table_name'];
      $query_field['field']['fullname'] = $table_alias . '.' . $query_field['field']['field_name'];
      $sql = '';
      $sql_parts = array();
      switch ($this->operator) {
        case 'between':
          $sql_parts[] = $this
            ->date_filter('min', $query_field, '>=');
          $sql_parts[] = $this
            ->date_filter('max', $query_field, '<=');
          $sql = implode(' AND ', array_filter($sql_parts));
          break;
        case 'not between':
          $sql_parts[] = $this
            ->date_filter('min', $query_field, '<');
          $sql_parts[] = $this
            ->date_filter('max', $query_field, '>');
          $sql = implode(' OR ', array_filter($sql_parts));
          break;
        case 'contains':
          $query_field['field']['fullname'] = str_replace($field['table_name'] . '_', $table_alias . '.', $field['fromto'][0]);
          $sql_parts[] = $this
            ->date_filter('value', $query_field, '<=');
          $query_field['field']['fullname'] = str_replace($field['table_name'] . '_', $table_alias . '.', $field['fromto'][1]);
          $sql_parts[] = $this
            ->date_filter('value', $query_field, '>=');
          $sql = implode(' AND ', array_filter($sql_parts));
          break;
        default:
          $sql = $this
            ->date_filter('value', $query_field, $this->operator);
          break;
      }
      if (!empty($sql)) {

        // Use set_where_group() with the selected date_method
        // of 'AND' or 'OR' to combine the field WHERE clauses.
        $this->query
          ->set_where_group($this->options['date_method'], 'date');
        $this->query
          ->add_where('date', $sql);
      }
    }
  }
}