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 <[email protected]>
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)