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/01/11 23:42:21 UTC
[incubator-superset] branch master updated: [datasource editor]
click checkbox creates metrics instantly (#4183)
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 ee63ebc [datasource editor] click checkbox creates metrics instantly (#4183)
ee63ebc is described below
commit ee63ebc8ecb4ef8b89aaaf58e8a0e53493be8a96
Author: Maxime Beauchemin <ma...@gmail.com>
AuthorDate: Thu Jan 11 15:42:19 2018 -0800
[datasource editor] click checkbox creates metrics instantly (#4183)
* [datasource editor] click checkbox creates metrics instantly
* Fix tests
---
superset/connectors/base/models.py | 7 +++
superset/connectors/druid/views.py | 3 +-
superset/connectors/sqla/models.py | 90 +++++++++++++++++++-------------------
superset/views/core.py | 12 +++--
4 files changed, 62 insertions(+), 50 deletions(-)
diff --git a/superset/connectors/base/models.py b/superset/connectors/base/models.py
index 2057ea8..940cc44 100644
--- a/superset/connectors/base/models.py
+++ b/superset/connectors/base/models.py
@@ -115,6 +115,13 @@ class BaseDatasource(AuditMixinNullable, ImportMixin):
if m.d3format
}
+ def add_missing_metrics(self, metrics):
+ exisiting_metrics = {m.metric_name for m in self.metrics}
+ for metric in metrics:
+ if metric.metric_name not in exisiting_metrics:
+ metric.table_id = self.id
+ self.metrics += [metric]
+
@property
def metrics_combo(self):
return sorted(
diff --git a/superset/connectors/druid/views.py b/superset/connectors/druid/views.py
index d73331b..ca407fb 100644
--- a/superset/connectors/druid/views.py
+++ b/superset/connectors/druid/views.py
@@ -28,6 +28,8 @@ class DruidColumnInlineView(CompactCRUDMixin, SupersetModelView): # noqa
add_title = _('Add Druid Column')
edit_title = _('Edit Druid Column')
+ list_widget = ListWidgetWithCheckboxes
+
edit_columns = [
'column_name', 'description', 'dimension_spec_json', 'datasource',
'groupby', 'filterable', 'count_distinct', 'sum', 'min', 'max']
@@ -197,7 +199,6 @@ class DruidDatasourceModelView(DatasourceModelView, DeleteMixin, YamlExportMixin
add_title = _('Add Druid Datasource')
edit_title = _('Edit Druid Datasource')
- list_widget = ListWidgetWithCheckboxes
list_columns = [
'datasource_link', 'cluster', 'changed_by_', 'modified']
order_columns = ['datasource_link', 'modified']
diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py
index 8ac6e82..6ccddbe 100644
--- a/superset/connectors/sqla/models.py
+++ b/superset/connectors/sqla/models.py
@@ -97,6 +97,10 @@ class TableColumn(Model, BaseColumn):
col = literal_column(self.expression).label(name)
return col
+ @property
+ def datasource(self):
+ return self.table
+
def get_time_filter(self, start_dttm, end_dttm):
col = self.sqla_col.label('__time')
l = [] # noqa: E741
@@ -155,6 +159,42 @@ class TableColumn(Model, BaseColumn):
self.type or '', dttm)
return s or "'{}'".format(dttm.strftime('%Y-%m-%d %H:%M:%S.%f'))
+ def get_metrics(self):
+ metrics = []
+ M = SqlMetric # noqa
+ quoted = self.column_name
+ if self.sum:
+ metrics.append(M(
+ metric_name='sum__' + self.column_name,
+ metric_type='sum',
+ expression='SUM({})'.format(quoted),
+ ))
+ if self.avg:
+ metrics.append(M(
+ metric_name='avg__' + self.column_name,
+ metric_type='avg',
+ expression='AVG({})'.format(quoted),
+ ))
+ if self.max:
+ metrics.append(M(
+ metric_name='max__' + self.column_name,
+ metric_type='max',
+ expression='MAX({})'.format(quoted),
+ ))
+ if self.min:
+ metrics.append(M(
+ metric_name='min__' + self.column_name,
+ metric_type='min',
+ expression='MIN({})'.format(quoted),
+ ))
+ if self.count_distinct:
+ metrics.append(M(
+ metric_name='count_distinct__' + self.column_name,
+ metric_type='count_distinct',
+ expression='COUNT(DISTINCT {})'.format(quoted),
+ ))
+ return {m.metric_name: m for m in metrics}
+
class SqlMetric(Model, BaseMetric):
@@ -702,47 +742,12 @@ class SqlaTable(Model, BaseDatasource):
dbcol.sum = dbcol.is_num
dbcol.avg = dbcol.is_num
dbcol.is_dttm = dbcol.is_time
+ else:
+ dbcol.type = datatype
self.columns.append(dbcol)
if not any_date_col and dbcol.is_time:
any_date_col = col.name
-
- quoted = col.name
- if dbcol.sum:
- metrics.append(M(
- metric_name='sum__' + dbcol.column_name,
- verbose_name='sum__' + dbcol.column_name,
- metric_type='sum',
- expression='SUM({})'.format(quoted),
- ))
- if dbcol.avg:
- metrics.append(M(
- metric_name='avg__' + dbcol.column_name,
- verbose_name='avg__' + dbcol.column_name,
- metric_type='avg',
- expression='AVG({})'.format(quoted),
- ))
- if dbcol.max:
- metrics.append(M(
- metric_name='max__' + dbcol.column_name,
- verbose_name='max__' + dbcol.column_name,
- metric_type='max',
- expression='MAX({})'.format(quoted),
- ))
- if dbcol.min:
- metrics.append(M(
- metric_name='min__' + dbcol.column_name,
- verbose_name='min__' + dbcol.column_name,
- metric_type='min',
- expression='MIN({})'.format(quoted),
- ))
- if dbcol.count_distinct:
- metrics.append(M(
- metric_name='count_distinct__' + dbcol.column_name,
- verbose_name='count_distinct__' + dbcol.column_name,
- metric_type='count_distinct',
- expression='COUNT(DISTINCT {})'.format(quoted),
- ))
- dbcol.type = datatype
+ metrics += dbcol.get_metrics().values()
metrics.append(M(
metric_name='count',
@@ -750,16 +755,9 @@ class SqlaTable(Model, BaseDatasource):
metric_type='count',
expression='COUNT(*)',
))
-
- dbmetrics = db.session.query(M).filter(M.table_id == self.id).filter(
- or_(M.metric_name == metric.metric_name for metric in metrics))
- dbmetrics = {metric.metric_name: metric for metric in dbmetrics}
- for metric in metrics:
- metric.table_id = self.id
- if not dbmetrics.get(metric.metric_name, None):
- db.session.add(metric)
if not self.main_dttm_col:
self.main_dttm_col = any_date_col
+ self.add_missing_metrics(metrics)
db.session.merge(self)
db.session.commit()
diff --git a/superset/views/core.py b/superset/views/core.py
index b235964..3e18cf3 100755
--- a/superset/views/core.py
+++ b/superset/views/core.py
@@ -1351,11 +1351,17 @@ class Superset(BaseSupersetView):
modelview_to_model = {
'TableColumnInlineView':
ConnectorRegistry.sources['table'].column_class,
+ 'DruidColumnInlineView':
+ ConnectorRegistry.sources['druid'].column_class,
}
model = modelview_to_model[model_view]
- obj = db.session.query(model).filter_by(id=id_).first()
- if obj:
- setattr(obj, attr, value == 'true')
+ col = db.session.query(model).filter_by(id=id_).first()
+ checked = value == 'true'
+ if col:
+ setattr(col, attr, checked)
+ if checked:
+ metrics = col.get_metrics().values()
+ col.datasource.add_missing_metrics(metrics)
db.session.commit()
return json_success('OK')
--
To stop receiving notification emails like this one, please contact
['"commits@superset.apache.org" <co...@superset.apache.org>'].