superset-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From maximebeauche...@apache.org
Subject [incubator-superset] branch master updated: auto-set 'Is Temporal' to true where column_name == '__time' (#6857)
Date Tue, 05 Mar 2019 04:51:24 GMT
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 ed79134  auto-set 'Is Temporal' to true where column_name == '__time' (#6857)
ed79134 is described below

commit ed79134e7f8cda0700a53d9286087a92c802dd38
Author: Maxime Beauchemin <maximebeauchemin@gmail.com>
AuthorDate: Mon Mar 4 20:51:11 2019 -0800

    auto-set 'Is Temporal' to true where column_name == '__time' (#6857)
    
    * auto-set 'Is Temporal' to true where column_name == '__time'
    
    * Adress comments
    
    * lint
    
    * clarifying name and comments
---
 superset/connectors/sqla/models.py |  2 ++
 superset/db_engine_specs.py        | 14 +++++++++++++
 tests/sqla_models_tests.py         | 42 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 58 insertions(+)

diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py
index e788ce7..6493370 100644
--- a/superset/connectors/sqla/models.py
+++ b/superset/connectors/sqla/models.py
@@ -885,6 +885,7 @@ class SqlaTable(Model, BaseDatasource):
         M = SqlMetric  # noqa
         metrics = []
         any_date_col = None
+        db_engine_spec = self.database.db_engine_spec
         db_dialect = self.database.get_dialect()
         dbcols = (
             db.session.query(TableColumn)
@@ -907,6 +908,7 @@ class SqlaTable(Model, BaseDatasource):
                 dbcol.sum = dbcol.is_num
                 dbcol.avg = dbcol.is_num
                 dbcol.is_dttm = dbcol.is_time
+                db_engine_spec.alter_new_orm_column(dbcol)
             else:
                 dbcol.type = datatype
             dbcol.groupby = True
diff --git a/superset/db_engine_specs.py b/superset/db_engine_specs.py
index 6412d10..64bffe7 100644
--- a/superset/db_engine_specs.py
+++ b/superset/db_engine_specs.py
@@ -153,6 +153,15 @@ class BaseEngineSpec(object):
         return cursor.fetchall()
 
     @classmethod
+    def alter_new_orm_column(cls, orm_col):
+        """Allow altering default column attributes when first detected/added
+
+        For instance special column like `__time` for Druid can be
+        set to is_dttm=True. Note that this only gets called when new
+        columns are detected/created"""
+        pass
+
+    @classmethod
     def epoch_to_dttm(cls):
         raise NotImplementedError()
 
@@ -1708,6 +1717,11 @@ class DruidEngineSpec(BaseEngineSpec):
         'P1Y': 'FLOOR({col} TO YEAR)',
     }
 
+    @classmethod
+    def alter_new_orm_column(cls, orm_col):
+        if orm_col.column_name == '__time':
+            orm_col.is_dttm = True
+
 
 class GSheetsEngineSpec(SqliteEngineSpec):
     """Engine for Google spreadsheets"""
diff --git a/tests/sqla_models_tests.py b/tests/sqla_models_tests.py
new file mode 100644
index 0000000..7d183d0
--- /dev/null
+++ b/tests/sqla_models_tests.py
@@ -0,0 +1,42 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from superset.connectors.sqla.models import TableColumn
+from superset.db_engine_specs import DruidEngineSpec
+from .base_tests import SupersetTestCase
+
+
+class DatabaseModelTestCase(SupersetTestCase):
+
+    def test_is_time_druid_time_col(self):
+        """Druid has a special __time column"""
+        col = TableColumn(column_name='__time', type='INTEGER')
+        self.assertEquals(col.is_dttm, None)
+        DruidEngineSpec.alter_new_orm_column(col)
+        self.assertEquals(col.is_dttm, True)
+
+        col = TableColumn(column_name='__not_time', type='INTEGER')
+        self.assertEquals(col.is_time, False)
+
+    def test_is_time_by_type(self):
+        col = TableColumn(column_name='foo', type='DATE')
+        self.assertEquals(col.is_time, True)
+
+        col = TableColumn(column_name='foo', type='DATETIME')
+        self.assertEquals(col.is_time, True)
+
+        col = TableColumn(column_name='foo', type='STRING')
+        self.assertEquals(col.is_time, False)


Mime
View raw message