protected function Sql::buildCondition

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'.

1 call to Sql::buildCondition()
Sql::query in drupal/core/modules/views/lib/Drupal/views/Plugin/views/query/Sql.php
Generate a query and a countquery from all of the information supplied to the object.

File

drupal/core/modules/views/lib/Drupal/views/Plugin/views/query/Sql.php, line 1019
Definition of Drupal\views\Plugin\views\query\Sql.

Class

Sql
@todo.

Namespace

Drupal\views\Plugin\views\query

Code

protected function buildCondition($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) {

        // DBTNG doesn't support to add the same subquery twice to the main
        // query and the count query, so clone the subquery to have two instances
        // of the same object. - 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;
  }
}