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/08/22 04:33:37 UTC

[incubator-superset] branch master updated: [viz flow] detect TIMESTAMP, transition to line chart (#5634)

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 6e8c7f7  [viz flow] detect TIMESTAMP, transition to line chart (#5634)
6e8c7f7 is described below

commit 6e8c7f7b2044ba3c59baa7892c105aef098b3a59
Author: Maxime Beauchemin <ma...@gmail.com>
AuthorDate: Tue Aug 21 21:33:34 2018 -0700

    [viz flow] detect TIMESTAMP, transition to line chart (#5634)
    
    * [viz flow] detect TIMESTAMP, transition to line chart
    
    * Refactor is_date
---
 superset/assets/src/explore/controls.jsx |  2 +-
 superset/assets/src/explore/visTypes.jsx |  3 ---
 superset/dataframe.py                    | 27 ++++++++++++++++-----------
 tests/dataframe_test.py                  | 10 +++++++---
 4 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/superset/assets/src/explore/controls.jsx b/superset/assets/src/explore/controls.jsx
index f2f12e0..0900d2c 100644
--- a/superset/assets/src/explore/controls.jsx
+++ b/superset/assets/src/explore/controls.jsx
@@ -898,7 +898,7 @@ export const controls = {
   time_grain_sqla: {
     type: 'SelectControl',
     label: t('Time Grain'),
-    default: control => control.choices && control.choices.length ? control.choices[0][0] : null,
+    default: 'P1D',
     description: t('The time granularity for the visualization. This ' +
     'applies a date transformation to alter ' +
     'your time column and defines a new time granularity. ' +
diff --git a/superset/assets/src/explore/visTypes.jsx b/superset/assets/src/explore/visTypes.jsx
index 5df65df..69b1297 100644
--- a/superset/assets/src/explore/visTypes.jsx
+++ b/superset/assets/src/explore/visTypes.jsx
@@ -948,9 +948,6 @@ export const visTypes = {
       metrics: {
         validators: [],
       },
-      time_grain_sqla: {
-        default: null,
-      },
     },
   },
 
diff --git a/superset/dataframe.py b/superset/dataframe.py
index 447aa68..834f118 100644
--- a/superset/dataframe.py
+++ b/superset/dataframe.py
@@ -132,13 +132,18 @@ class SupersetDataFrame(object):
                 continue
         return 100 * success / total
 
-    @classmethod
-    def is_date(cls, dtype):
-        if dtype and dtype.name:
-            return any([
-                dtype.name.lower().startswith(s)
-                for s in ['date', 'time']
-            ])
+    @staticmethod
+    def is_date(np_dtype, db_type_str):
+
+        def looks_daty(s):
+            if isinstance(s, basestring):
+                return any([s.lower().startswith(ss) for ss in ('time', 'date')])
+            return False
+
+        if looks_daty(db_type_str):
+            return True
+        if np_dtype and np_dtype.name and looks_daty(np_dtype.name):
+            return True
         return False
 
     @classmethod
@@ -176,19 +181,19 @@ class SupersetDataFrame(object):
         if sample_size:
             sample = self.df.sample(sample_size)
         for col in self.df.dtypes.keys():
-            col_db_type = (
+            db_type_str = (
                 self._type_dict.get(col) or
                 self.db_type(self.df.dtypes[col])
             )
             column = {
                 'name': col,
                 'agg': self.agg_func(self.df.dtypes[col], col),
-                'type': col_db_type,
-                'is_date': self.is_date(self.df.dtypes[col]),
+                'type': db_type_str,
+                'is_date': self.is_date(self.df.dtypes[col], db_type_str),
                 'is_dim': self.is_dimension(self.df.dtypes[col], col),
             }
 
-            if column['type'] in ('OBJECT', None):
+            if not db_type_str or db_type_str.upper() == 'OBJECT':
                 v = sample[col].iloc[0] if not sample[col].empty else None
                 if isinstance(v, basestring):
                     column['type'] = 'STRING'
diff --git a/tests/dataframe_test.py b/tests/dataframe_test.py
index c5ea504..b52b950 100644
--- a/tests/dataframe_test.py
+++ b/tests/dataframe_test.py
@@ -122,10 +122,14 @@ class SupersetDataFrameTestCase(SupersetTestCase):
 
     def test_is_date(self):
         f = SupersetDataFrame.is_date
-        self.assertEquals(f(np.dtype('M')), True)
+        self.assertEquals(f(np.dtype('M'), ''), True)
+        self.assertEquals(f(np.dtype('f'), 'DATETIME'), True)
+        self.assertEquals(f(np.dtype('i'), 'TIMESTAMP'), True)
+        self.assertEquals(f(None, 'DATETIME'), True)
+        self.assertEquals(f(None, 'TIMESTAMP'), True)
 
-        self.assertEquals(f(None), False)
-        self.assertEquals(f(np.dtype(np.int32)), False)
+        self.assertEquals(f(None, ''), False)
+        self.assertEquals(f(np.dtype(np.int32), ''), False)
 
     def test_dedup_with_data(self):
         data = [