You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ma...@apache.org on 2018/05/14 18:43:17 UTC

[incubator-superset] branch master updated: Force lowercase column names for Snowflake and Oracle (#4994)

This is an automated email from the ASF dual-hosted git repository.

maximebeauchemin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git


The following commit(s) were added to refs/heads/master by this push:
     new b391676  Force lowercase column names for Snowflake and Oracle (#4994)
b391676 is described below

commit b391676544ee139d0478f51abb77d59721794aba
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Mon May 14 21:43:13 2018 +0300

    Force lowercase column names for Snowflake and Oracle (#4994)
    
    * Force lowercase column names for Snowflake and Oracle
    
    * Force lowercase column names for Snowflake and Oracle
    
    * Remove lowercasing of DB2 columns
    
    * Remove DB2 lowercasing
    
    * Fix test cases
---
 superset/db_engine_specs.py | 17 +++++++++++++++++
 superset/sql_lab.py         |  8 +++-----
 tests/sqllab_tests.py       |  6 +++---
 3 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/superset/db_engine_specs.py b/superset/db_engine_specs.py
index a718a0d..733588a 100644
--- a/superset/db_engine_specs.py
+++ b/superset/db_engine_specs.py
@@ -281,6 +281,15 @@ class BaseEngineSpec(object):
         """
         return {}
 
+    @classmethod
+    def get_normalized_column_names(cls, cursor_description):
+        columns = cursor_description if cursor_description else []
+        return [cls.normalize_column_name(col[0]) for col in columns]
+
+    @staticmethod
+    def normalize_column_name(column_name):
+        return column_name
+
 
 class PostgresBaseEngineSpec(BaseEngineSpec):
     """ Abstract class for Postgres 'like' databases """
@@ -350,6 +359,10 @@ class SnowflakeEngineSpec(PostgresBaseEngineSpec):
         Grain('year', _('year'), "DATE_TRUNC('YEAR', {col})", 'P1Y'),
     )
 
+    @staticmethod
+    def normalize_column_name(column_name):
+        return column_name.lower()
+
 
 class VerticaEngineSpec(PostgresBaseEngineSpec):
     engine = 'vertica'
@@ -379,6 +392,10 @@ class OracleEngineSpec(PostgresBaseEngineSpec):
             """TO_TIMESTAMP('{}', 'YYYY-MM-DD"T"HH24:MI:SS.ff6')"""
         ).format(dttm.isoformat())
 
+    @staticmethod
+    def normalize_column_name(column_name):
+        return column_name.lower()
+
 
 class Db2EngineSpec(BaseEngineSpec):
     engine = 'ibm_db_sa'
diff --git a/superset/sql_lab.py b/superset/sql_lab.py
index 856ea48..98f612a 100644
--- a/superset/sql_lab.py
+++ b/superset/sql_lab.py
@@ -97,10 +97,8 @@ def session_scope(nullpool):
         session.close()
 
 
-def convert_results_to_df(cursor_description, data):
+def convert_results_to_df(column_names, data):
     """Convert raw query results to a DataFrame."""
-    column_names = (
-        [col[0] for col in cursor_description] if cursor_description else [])
     column_names = dedup(column_names)
 
     # check whether the result set has any nested dict columns
@@ -236,7 +234,7 @@ def execute_sql(
         return handle_error(db_engine_spec.extract_error_message(e))
 
     logging.info('Fetching cursor description')
-    cursor_description = cursor.description
+    column_names = db_engine_spec.get_normalized_column_names(cursor.description)
 
     if conn is not None:
         conn.commit()
@@ -245,7 +243,7 @@ def execute_sql(
     if query.status == utils.QueryStatus.STOPPED:
         return handle_error('The query has been stopped')
 
-    cdf = convert_results_to_df(cursor_description, data)
+    cdf = convert_results_to_df(column_names, data)
 
     query.rows = cdf.size
     query.progress = 100
diff --git a/tests/sqllab_tests.py b/tests/sqllab_tests.py
index 4626f53..49926f8 100644
--- a/tests/sqllab_tests.py
+++ b/tests/sqllab_tests.py
@@ -203,7 +203,7 @@ class SqlLabTests(SupersetTestCase):
             raise_on_error=True)
 
     def test_df_conversion_no_dict(self):
-        cols = [['string_col'], ['int_col'], ['float_col']]
+        cols = ['string_col', 'int_col', 'float_col']
         data = [['a', 4, 4.0]]
         cdf = convert_results_to_df(cols, data)
 
@@ -211,7 +211,7 @@ class SqlLabTests(SupersetTestCase):
         self.assertEquals(len(cols), len(cdf.columns))
 
     def test_df_conversion_tuple(self):
-        cols = [['string_col'], ['int_col'], ['list_col'], ['float_col']]
+        cols = ['string_col', 'int_col', 'list_col', 'float_col']
         data = [(u'Text', 111, [123], 1.0)]
         cdf = convert_results_to_df(cols, data)
 
@@ -219,7 +219,7 @@ class SqlLabTests(SupersetTestCase):
         self.assertEquals(len(cols), len(cdf.columns))
 
     def test_df_conversion_dict(self):
-        cols = [['string_col'], ['dict_col'], ['int_col']]
+        cols = ['string_col', 'dict_col', 'int_col']
         data = [['a', {'c1': 1, 'c2': 2, 'c3': 3}, 4]]
         cdf = convert_results_to_df(cols, data)
 

-- 
To stop receiving notification emails like this one, please contact
maximebeauchemin@apache.org.