You are here

public function views_plugin_query_default::compile_fields in Views (for Drupal 7) 7.3

Same name and namespace in other branches
  1. 6.3 plugins/views_plugin_query_default.inc \views_plugin_query_default::compile_fields()

Build fields array.

1 call to views_plugin_query_default::compile_fields()
views_plugin_query_default::query in plugins/views_plugin_query_default.inc
Generate a query and a countquery from all of the information supplied to the object.

File

plugins/views_plugin_query_default.inc, line 1195
Definition of views_plugin_query_default.

Class

views_plugin_query_default
Object used to create a SELECT query.

Code

public function compile_fields($fields_array, $query) {
  $non_aggregates = array();
  foreach ($fields_array as $field) {
    $string = '';
    if (!empty($field['table'])) {
      $string .= $field['table'] . '.';
    }
    $string .= $field['field'];
    $fieldname = !empty($field['alias']) ? $field['alias'] : $string;
    if (!empty($field['distinct'])) {
      throw new Exception("Column-level distinct is not supported anymore.");
    }
    if (!empty($field['count'])) {

      // Retained for compatibility.
      $field['function'] = 'count';

      // It seems there's no way to abstract the table+column reference
      // without adding a field, aliasing, and then using the alias.
    }
    if (!empty($field['function'])) {
      $info = $this
        ->get_aggregation_info();
      if (!empty($info[$field['function']]['method']) && function_exists($info[$field['function']]['method'])) {
        $string = $info[$field['function']]['method']($field['function'], $string);
        $placeholders = !empty($field['placeholders']) ? $field['placeholders'] : array();
        $query
          ->addExpression($string, $fieldname, $placeholders);
      }
      $this->has_aggregate = TRUE;
    }
    elseif (empty($field['table'])) {
      if (Database::getConnection()
        ->databaseType() != 'pgsql') {
        $non_aggregates[] = $fieldname;
      }
      elseif (!in_array($fieldname, $non_aggregates)) {
        $non_aggregates[] = $fieldname;
      }
      $placeholders = !empty($field['placeholders']) ? $field['placeholders'] : array();
      $query
        ->addExpression($string, $fieldname, $placeholders);
    }
    elseif ($this->distinct && !in_array($fieldname, $this->groupby)) {

      // d7cx: This code was there, apparently needed for PostgreSQL
      // $string = db_driver() == 'pgsql' ? "FIRST($string)" : $string;
      if (Database::getConnection()
        ->databaseType() == 'pgsql' && !in_array($string, $non_aggregates)) {
        $non_aggregates[] = $string;
      }
      $query
        ->addField(!empty($field['table']) ? $field['table'] : $this->base_table, $field['field'], $fieldname);
    }
    elseif (empty($field['aggregate'])) {
      if (Database::getConnection()
        ->databaseType() != 'pgsql') {
        $non_aggregates[] = $fieldname;
      }
      elseif (!in_array($string, $non_aggregates)) {
        $non_aggregates[] = $string;
      }
      $query
        ->addField(!empty($field['table']) ? $field['table'] : $this->base_table, $field['field'], $fieldname);
    }

    // @todo Remove this old code.
    if (!empty($field['distinct']) && empty($field['function'])) {
      $distinct[] = $string;
    }
    else {
      $fields[] = $string;
    }
    if ($this->get_count_optimized) {

      // We only want the first field in this case.
      break;
    }
  }
  return array(
    $non_aggregates,
  );
}