You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by cc...@apache.org on 2018/09/13 01:34:25 UTC

[incubator-superset] branch master updated: [SIP-6] removed get_data for BigNumber (#5861)

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

ccwilliams 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 ee89a3e  [SIP-6] removed get_data for BigNumber (#5861)
ee89a3e is described below

commit ee89a3eb5e9f854236384d5ad1be0e0342299653
Author: Conglei <sh...@gmail.com>
AuthorDate: Wed Sep 12 18:34:21 2018 -0700

    [SIP-6] removed get_data for BigNumber (#5861)
    
    * removed get_data for BigNumber
    
    * removed duplicated condition
    
    * fixed typo
---
 .../src/visualizations/BigNumber/BigNumber.jsx     | 64 +---------------
 .../src/visualizations/BigNumber/adaptor.jsx       | 85 ++++++++++++++++++++++
 .../assets/src/visualizations/BigNumber/index.js   |  5 ++
 superset/assets/src/visualizations/index.js        |  4 +-
 superset/viz.py                                    | 18 -----
 5 files changed, 94 insertions(+), 82 deletions(-)

diff --git a/superset/assets/src/visualizations/BigNumber/BigNumber.jsx b/superset/assets/src/visualizations/BigNumber/BigNumber.jsx
index 3c5cffb..9f8a4a2 100644
--- a/superset/assets/src/visualizations/BigNumber/BigNumber.jsx
+++ b/superset/assets/src/visualizations/BigNumber/BigNumber.jsx
@@ -1,11 +1,8 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import ReactDOM from 'react-dom';
-import * as color from 'd3-color';
 import { XYChart, AreaSeries, CrossHair, LinearGradient } from '@data-ui/xy-chart';
 
 import { brandColor } from '../../modules/colors';
-import { d3FormatPreset } from '../../modules/utils';
 import { formatDateVerbose } from '../../modules/dates';
 import { computeMaxFontSize } from '../../modules/visUtils';
 
@@ -26,7 +23,7 @@ const PROPORTION = {
   TRENDLINE: 0.3,
 };
 
-function renderTooltipFactory(formatValue) {
+export function renderTooltipFactory(formatValue) {
   return function renderTooltip({ datum }) { // eslint-disable-line
     const { x: rawDate, y: rawValue } = datum;
     const formattedDate = formatDateVerbose(rawDate);
@@ -228,61 +225,4 @@ class BigNumberVis extends React.Component {
 BigNumberVis.propTypes = propTypes;
 BigNumberVis.defaultProps = defaultProps;
 
-function adaptor(slice, payload) {
-  const { formData, containerId } = slice;
-  const { data, subheader, compare_suffix: compareSuffix } = payload.data;
-  const compareLag = Number(payload.data.compare_lag);
-  const supportTrendline = formData.viz_type === 'big_number';
-  const showTrendline = supportTrendline && formData.show_trend_line;
-  const startYAxisAtZero = formData.start_y_axis_at_zero;
-  const formatValue = d3FormatPreset(formData.y_axis_format);
-  const bigNumber = supportTrendline ? data[data.length - 1][1] : data[0][0];
-  let userColor;
-  if (formData.color_picker) {
-    const { r, g, b } = formData.color_picker;
-    userColor = color.rgb(r, g, b).hex();
-  }
-
-  let percentChange = 0;
-  let formattedSubheader = subheader;
-
-  if (supportTrendline && compareLag > 0) {
-    const compareIndex = data.length - (compareLag + 1);
-    if (compareIndex >= 0) {
-      const compareValue = data[compareIndex][1];
-      percentChange = compareValue === 0
-        ? 0 : (bigNumber - compareValue) / Math.abs(compareValue);
-      const formatPercentChange = d3.format('+.1%');
-      formattedSubheader = `${formatPercentChange(percentChange)} ${compareSuffix}`;
-    }
-  }
-
-  const trendlineData = showTrendline ? data.map(([x, y]) => ({ x, y })) : null;
-
-  let className = '';
-  if (percentChange > 0) {
-    className = 'positive';
-  } else if (percentChange < 0) {
-    className = 'negative';
-  }
-
-  ReactDOM.render(
-    <BigNumberVis
-      className={className}
-      width={slice.width()}
-      height={slice.height()}
-      bigNumber={bigNumber}
-      formatBigNumber={formatValue}
-      subheader={formattedSubheader}
-      showTrendline={showTrendline}
-      startYAxisAtZero={startYAxisAtZero}
-      trendlineData={trendlineData}
-      mainColor={userColor}
-      gradientId={`big_number_${containerId}`}
-      renderTooltip={renderTooltipFactory(formatValue)}
-    />,
-    document.getElementById(containerId),
-  );
-}
-
-export default adaptor;
+export default BigNumberVis;
diff --git a/superset/assets/src/visualizations/BigNumber/adaptor.jsx b/superset/assets/src/visualizations/BigNumber/adaptor.jsx
new file mode 100644
index 0000000..40a3a0f
--- /dev/null
+++ b/superset/assets/src/visualizations/BigNumber/adaptor.jsx
@@ -0,0 +1,85 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import * as color from 'd3-color';
+
+import BigNumberVis, { renderTooltipFactory } from './BigNumber';
+import { d3FormatPreset } from '../../modules/utils';
+
+const TIME_COLUMN = '__timestamp';
+
+function transform(data, formData) {
+  let bigNumber;
+  let trendlineData;
+  const metricName = formData.metric.label || formData.metric;
+  const compareSuffix = formData.compare_suffix || '';
+  const compareLag = +formData.compare_lag || 0;
+  const supportTrendline = formData.viz_type === 'big_number';
+  const showTrendline = supportTrendline && formData.show_trend_line;
+  let percentChange = 0;
+  const subheader = formData.subheader || '';
+  let formattedSubheader = subheader;
+  if (supportTrendline) {
+    const sortedData = [...data].sort((a, b) => a[TIME_COLUMN] - b[TIME_COLUMN]);
+    bigNumber = sortedData[sortedData.length - 1][metricName];
+    if (compareLag > 0) {
+      const compareIndex = sortedData.length - (compareLag + 1);
+      if (compareIndex >= 0) {
+        const compareValue = sortedData[compareIndex][metricName];
+        percentChange = compareValue === 0
+          ? 0 : (bigNumber - compareValue) / Math.abs(compareValue);
+        const formatPercentChange = d3.format('+.1%');
+        formattedSubheader = `${formatPercentChange(percentChange)} ${compareSuffix}`;
+      }
+    }
+    trendlineData = showTrendline
+      ? sortedData.map(point => ({ x: point[TIME_COLUMN], y: point[metricName] }))
+      : null;
+  } else {
+    bigNumber = data[0][metricName];
+    trendlineData = null;
+  }
+
+  let className = '';
+  if (percentChange > 0) {
+    className = 'positive';
+  } else if (percentChange < 0) {
+    className = 'negative';
+  }
+
+  return {
+    bigNumber,
+    trendlineData,
+    className,
+    subheader: formattedSubheader,
+    showTrendline,
+  };
+}
+
+function adaptor(slice, payload) {
+  const { formData, containerId } = slice;
+
+  const transformedData = transform(payload.data, formData);
+  const startYAxisAtZero = formData.start_y_axis_at_zero;
+  const formatValue = d3FormatPreset(formData.y_axis_format);
+  let userColor;
+  if (formData.color_picker) {
+    const { r, g, b } = formData.color_picker;
+    userColor = color.rgb(r, g, b).hex();
+  }
+
+  ReactDOM.render(
+    <BigNumberVis
+      width={slice.width()}
+      height={slice.height()}
+      formatBigNumber={formatValue}
+      startYAxisAtZero={startYAxisAtZero}
+      mainColor={userColor}
+      gradientId={`big_number_${containerId}`}
+      renderTooltip={renderTooltipFactory(formatValue)}
+      {...transformedData}
+    />,
+    document.getElementById(containerId),
+  );
+}
+
+export default adaptor;
diff --git a/superset/assets/src/visualizations/BigNumber/index.js b/superset/assets/src/visualizations/BigNumber/index.js
new file mode 100644
index 0000000..3aaef63
--- /dev/null
+++ b/superset/assets/src/visualizations/BigNumber/index.js
@@ -0,0 +1,5 @@
+import adaptor from './adaptor';
+import BigNumber from './BigNumber';
+
+export { BigNumber };
+export default adaptor;
diff --git a/superset/assets/src/visualizations/index.js b/superset/assets/src/visualizations/index.js
index d6445c4..91f425b 100644
--- a/superset/assets/src/visualizations/index.js
+++ b/superset/assets/src/visualizations/index.js
@@ -65,9 +65,9 @@ const vizMap = {
   [VIZ_TYPES.area]: loadNvd3,
   [VIZ_TYPES.bar]: loadNvd3,
   [VIZ_TYPES.big_number]: () =>
-    loadVis(import(/* webpackChunkName: 'big_number' */ './BigNumber/BigNumber.jsx')),
+    loadVis(import(/* webpackChunkName: 'big_number' */ './BigNumber/index.js')),
   [VIZ_TYPES.big_number_total]: () =>
-    loadVis(import(/* webpackChunkName: "big_number" */ './BigNumber/BigNumber.jsx')),
+    loadVis(import(/* webpackChunkName: "big_number" */ './BigNumber/index.js')),
   [VIZ_TYPES.box_plot]: loadNvd3,
   [VIZ_TYPES.bubble]: loadNvd3,
   [VIZ_TYPES.bullet]: loadNvd3,
diff --git a/superset/viz.py b/superset/viz.py
index d88685e..77d8da5 100644
--- a/superset/viz.py
+++ b/superset/viz.py
@@ -1029,16 +1029,6 @@ class BigNumberViz(BaseViz):
         self.form_data['metric'] = metric
         return d
 
-    def get_data(self, df):
-        form_data = self.form_data
-        df.sort_values(by=df.columns[0], inplace=True)
-        compare_lag = form_data.get('compare_lag')
-        return {
-            'data': df.values.tolist(),
-            'compare_lag': compare_lag,
-            'compare_suffix': form_data.get('compare_suffix', ''),
-        }
-
 
 class BigNumberTotalViz(BaseViz):
 
@@ -1058,14 +1048,6 @@ class BigNumberTotalViz(BaseViz):
         self.form_data['metric'] = metric
         return d
 
-    def get_data(self, df):
-        form_data = self.form_data
-        df.sort_values(by=df.columns[0], inplace=True)
-        return {
-            'data': df.values.tolist(),
-            'subheader': form_data.get('subheader', ''),
-        }
-
 
 class NVD3TimeSeriesViz(NVD3Viz):