From 10ac0935f7698d226a0e1eb85325f1829494b001 Mon Sep 17 00:00:00 2001
From: Tim Schumacher <tschumacher@tourevo-software.com>
Date: Tue, 15 Dec 2009 11:40:01 +0100
Subject: [PATCH] Reworked patch to add safe aliases in ->add_field()

---
 .../sites/all/modules/views/includes/query.inc     |   35 ++++++++++---------
 .../sites/all/modules/views/includes/view.inc      |    6 ++--
 2 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/trunk/src/drupal/sites/all/modules/views/includes/query.inc b/trunk/src/drupal/sites/all/modules/views/includes/query.inc
index 8ffc400..5198db8 100644
--- a/trunk/src/drupal/sites/all/modules/views/includes/query.inc
+++ b/trunk/src/drupal/sites/all/modules/views/includes/query.inc
@@ -66,6 +66,11 @@ class views_query {
   var $distinct = FALSE;
 
   /**
+   * A counter for used safe aliases by this query.
+   */
+  var $safe_alias_counter = 0;
+
+  /**
    * Constructor; Create the basic query object and fill with default values.
    */
   function views_query($base_table = 'node', $base_field = 'nid') {
@@ -648,6 +653,18 @@ class views_query {
     }
 
     $name = $alias ? $alias : $field;
+    
+    // At least postgres(maybe others?) only support aliases with
+    // string length < 64, so we need to introduce an safe alias here and
+    // when the query has finished translate it back to the full alias
+
+    $safe_alias = '';
+    if (strlen($alias) > 63) {
+      $safe_alias = sprintf("%s_%d", substr($alias, 0, 60), $this->safe_alias_counter++);
+    } 
+    else {
+      $safe_alias = $alias;
+    }
 
     // @todo FIXME -- $alias, then $name is inconsistent
     if (empty($this->fields[$alias])) {
@@ -655,6 +672,7 @@ class views_query {
         'field' => $field,
         'table' => $table,
         'alias' => $alias,
+        'safe_alias' => $safe_alias,
       );
     }
 
@@ -938,24 +956,7 @@ class views_query {
 
     $has_aggregate = FALSE;
     $non_aggregates = array();
-    $too_long_fields = array();
     foreach ($fields_array as $field_name => $field) {
-      // If aliases are longer than 63 chars, postgres cut them off
-      // and Views does cannot find the results. So we need to limit
-      // ourself here and make the aliases <= 63 chars.
-      if (strlen($field['alias']) > 63) {
-        $safe_alias_prefix = substr($field['alias'],0,60);
-        if (array_key_exists($safe_alias_prefix,$too_long_fields)) {
-          $too_long_fields[$safe_alias_prefix]++;
-        } else {
-          $too_long_fields[$safe_alias_prefix] = 0;
-        }
-        $this->fields[$field_name]['safe_alias'] = sprintf("%s_%d",$safe_alias_prefix,$too_long_fields[$safe_alias_prefix]);
-        $field['safe_alias'] = $this->fields[$field_name]['safe_alias'];
-      } else {
-        $this->fields[$field_name]['safe_alias'] = $field['alias'];
-        $field['safe_alias'] = $this->fields[$field_name]['safe_alias'];
-      }
       if ($fields) {
         $fields .= ",\n   ";
       }
diff --git a/trunk/src/drupal/sites/all/modules/views/includes/view.inc b/trunk/src/drupal/sites/all/modules/views/includes/view.inc
index c10c09c..ffebfda 100644
--- a/trunk/src/drupal/sites/all/modules/views/includes/view.inc
+++ b/trunk/src/drupal/sites/all/modules/views/includes/view.inc
@@ -772,9 +772,9 @@ class view extends views_db_object {
         $this->result = array();
         while ($item = db_fetch_object($result)) {
           // translate safe_alias back to normal alias
-          foreach($this->query->fields as $field) {
-            if ($field['alias'] != $field['safe_alias']) {
-              $item->{$field['alias']} = $item->{$field['safe_alias']};
+          foreach ($this->query->fields as $field) {
+            if (array_key_exists('safe_alias', $field) && ($field['alias'] != $field['safe_alias'])) {
+              $item-> {$field['alias']} = $item-> {$field['safe_alias']};
             }
           }
           $this->result[] = $item;
-- 
1.6.3.3

