1 views_plugin_query_default.inc views_plugin_query_default::build_condition($where = 'where')

Construct the "WHERE" or "HAVING" part of the query.

As views has to wrap the conditions from arguments with AND, a special group is wrapped around all conditions. This special group has the ID 0. There is other code in filters which makes sure that the group IDs are higher than zero.

Parameters

$where: 'where' or 'having'.

File

core/modules/views/plugins/views_plugin_query_default.inc, line 1118
Defines the default query object.

Class

views_plugin_query_default
Object used to create a SELECT query.

Code

function build_condition($where = 'where') {
  $has_condition = FALSE;
  $has_arguments = FALSE;
  $has_filter = FALSE;

  $main_group = db_and();
  $filter_group = $this->group_operator == 'OR' ? db_or() : db_and();

  foreach ($this->$where as $group => $info) {

    if (!empty($info['conditions'])) {
      $sub_group = $info['type'] == 'OR' ? db_or() : db_and();
      foreach ($info['conditions'] as $key => $clause) {
        // The database layer doesn't support adding the same subquery twice
        // to the main query and the count query, so clone the subquery to
        // have two instances of the same object.
        // See http://drupal.org/node/1112854
        if (is_object($clause['value']) && $clause['value'] instanceof SelectQuery) {
          $clause['value'] = clone $clause['value'];
        }
        if ($clause['operator'] == 'formula') {
          $has_condition = TRUE;
          $sub_group->where($clause['field'], $clause['value']);
        }
        else {
          $has_condition = TRUE;
          $sub_group->condition($clause['field'], $clause['value'], $clause['operator']);
        }
      }

      // Add the item to the filter group.
      if ($group != 0) {
        $has_filter = TRUE;
        $filter_group->condition($sub_group);
      }
      else {
        $has_arguments = TRUE;
        $main_group->condition($sub_group);
      }
    }
  }

  if ($has_filter) {
    $main_group->condition($filter_group);
  }

  if (!$has_arguments && $has_condition) {
    return $filter_group;
  }
  if ($has_arguments && $has_condition) {
    return $main_group;
  }
}