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/24 21:16:17 UTC

[incubator-superset] branch master updated: [geo] JS function to receive the whole data array instead of individual object (#4262)

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 ff2f85f  [geo] JS function to receive the whole data array instead of individual object (#4262)
ff2f85f is described below

commit ff2f85f39b03c9c65d959f0d1ead32ad62a56251
Author: Maxime Beauchemin <ma...@gmail.com>
AuthorDate: Wed Jan 24 13:16:14 2018 -0800

    [geo] JS function to receive the whole data array instead of individual object (#4262)
    
    Moving from having the user define an interceptor function that operates
    on one object at a time.
    
    By passing the entire array, it's possible to do multiple pass where
    needed. A common pattern might be to figure out the max value in order
    to define a scaler function. That's only possible if dealing with the
    whole array.
---
 superset/assets/javascripts/explore/stores/controls.jsx |  9 +++++----
 superset/assets/javascripts/explore/stores/visTypes.js  |  8 ++++----
 .../assets/visualizations/deckgl/layers/geojson.jsx     | 17 ++++++++---------
 superset/assets/visualizations/deckgl/layers/path.jsx   |  6 +++---
 .../assets/visualizations/deckgl/layers/polygon.jsx     |  6 +++---
 .../assets/visualizations/deckgl/layers/scatter.jsx     |  6 +++---
 6 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/superset/assets/javascripts/explore/stores/controls.jsx b/superset/assets/javascripts/explore/stores/controls.jsx
index 9aac6cc..372a01f 100644
--- a/superset/assets/javascripts/explore/stores/controls.jsx
+++ b/superset/assets/javascripts/explore/stores/controls.jsx
@@ -1881,10 +1881,11 @@ export const controls = {
     },
   },
 
-  js_datapoint_mutator: jsFunctionControl(
-    t('Javascript data point mutator'),
-    t('Define a javascript function that receives each data point and can alter it ' +
-      'before getting sent to the deck.gl layer'),
+  js_data_mutator: jsFunctionControl(
+    t('Javascript data interceptor'),
+    t('Define a javascript function that receives the data array used in the visualization ' +
+      'and is expected to return a modified version of that array. This can be used ' +
+      'to alter properties of the data, filter, or enrich the array.'),
   ),
 
   js_data: jsFunctionControl(
diff --git a/superset/assets/javascripts/explore/stores/visTypes.js b/superset/assets/javascripts/explore/stores/visTypes.js
index b175ff3..4b0120d 100644
--- a/superset/assets/javascripts/explore/stores/visTypes.js
+++ b/superset/assets/javascripts/explore/stores/visTypes.js
@@ -437,7 +437,7 @@ export const visTypes = {
         label: t('Advanced'),
         controlSetRows: [
           ['js_columns'],
-          ['js_datapoint_mutator'],
+          ['js_data_mutator'],
           ['js_tooltip'],
           ['js_onclick_href'],
         ],
@@ -509,7 +509,7 @@ export const visTypes = {
         label: t('Advanced'),
         controlSetRows: [
           ['js_columns'],
-          ['js_datapoint_mutator'],
+          ['js_data_mutator'],
           ['js_tooltip'],
           ['js_onclick_href'],
         ],
@@ -549,7 +549,7 @@ export const visTypes = {
         label: t('Advanced'),
         controlSetRows: [
           ['js_columns'],
-          ['js_datapoint_mutator'],
+          ['js_data_mutator'],
           ['js_tooltip'],
           ['js_onclick_href'],
         ],
@@ -621,7 +621,7 @@ export const visTypes = {
         label: t('Advanced'),
         controlSetRows: [
           ['js_columns'],
-          ['js_datapoint_mutator'],
+          ['js_data_mutator'],
           ['js_tooltip'],
           ['js_onclick_href'],
         ],
diff --git a/superset/assets/visualizations/deckgl/layers/geojson.jsx b/superset/assets/visualizations/deckgl/layers/geojson.jsx
index c21ce3b..7792d23 100644
--- a/superset/assets/visualizations/deckgl/layers/geojson.jsx
+++ b/superset/assets/visualizations/deckgl/layers/geojson.jsx
@@ -35,10 +35,10 @@ const alterProps = (props, propOverrides) => {
   };
 };
 let features;
-const recurseGeoJson = (node, propOverrides, jsFnMutator, extraProps) => {
+const recurseGeoJson = (node, propOverrides, extraProps) => {
   if (node && node.features) {
     node.features.forEach((obj) => {
-      recurseGeoJson(obj, propOverrides, jsFnMutator, node.extraProps || extraProps);
+      recurseGeoJson(obj, propOverrides, node.extraProps || extraProps);
     });
   }
   if (node && node.geometry) {
@@ -46,9 +46,6 @@ const recurseGeoJson = (node, propOverrides, jsFnMutator, extraProps) => {
       ...node,
       properties: alterProps(node.properties, propOverrides),
     };
-    if (jsFnMutator) {
-      jsFnMutator(newNode);
-    }
     if (!newNode.extraProps) {
       newNode.extraProps = extraProps;
     }
@@ -70,14 +67,16 @@ export default function geoJsonLayer(formData, payload, slice) {
     propOverrides.strokeColor = strokeColor;
   }
 
+  features = [];
+  recurseGeoJson(payload.data, propOverrides);
+
   let jsFnMutator;
-  if (fd.js_datapoint_mutator) {
+  if (fd.js_data_mutator) {
     // Applying user defined data mutator if defined
-    jsFnMutator = sandboxedEval(fd.js_datapoint_mutator);
+    jsFnMutator = sandboxedEval(fd.js_data_mutator);
+    features = jsFnMutator(features);
   }
 
-  features = [];
-  recurseGeoJson(payload.data, propOverrides, jsFnMutator);
   return new GeoJsonLayer({
     id: `geojson-layer-${fd.slice_id}`,
     filled: fd.filled,
diff --git a/superset/assets/visualizations/deckgl/layers/path.jsx b/superset/assets/visualizations/deckgl/layers/path.jsx
index c69f236..df2c1b0 100644
--- a/superset/assets/visualizations/deckgl/layers/path.jsx
+++ b/superset/assets/visualizations/deckgl/layers/path.jsx
@@ -14,9 +14,9 @@ export default function getLayer(formData, payload, slice) {
     color: fixedColor,
   }));
 
-  if (fd.js_datapoint_mutator) {
-    const jsFnMutator = sandboxedEval(fd.js_datapoint_mutator);
-    data = data.map(jsFnMutator);
+  if (fd.js_data_mutator) {
+    const jsFnMutator = sandboxedEval(fd.js_data_mutator);
+    data = jsFnMutator(data);
   }
 
   return new PathLayer({
diff --git a/superset/assets/visualizations/deckgl/layers/polygon.jsx b/superset/assets/visualizations/deckgl/layers/polygon.jsx
index 05c32c6..8862827 100644
--- a/superset/assets/visualizations/deckgl/layers/polygon.jsx
+++ b/superset/assets/visualizations/deckgl/layers/polygon.jsx
@@ -11,10 +11,10 @@ export default function polygonLayer(formData, payload, slice) {
     fillColor: [fc.r, fc.g, fc.b, 255 * fc.a],
   }));
 
-  if (fd.js_datapoint_mutator) {
+  if (fd.js_data_mutator) {
     // Applying user defined data mutator if defined
-    const jsFnMutator = sandboxedEval(fd.js_datapoint_mutator);
-    data = data.map(jsFnMutator);
+    const jsFnMutator = sandboxedEval(fd.js_data_mutator);
+    data = jsFnMutator(data);
   }
 
   return new PolygonLayer({
diff --git a/superset/assets/visualizations/deckgl/layers/scatter.jsx b/superset/assets/visualizations/deckgl/layers/scatter.jsx
index eda1b7c..0f591a2 100644
--- a/superset/assets/visualizations/deckgl/layers/scatter.jsx
+++ b/superset/assets/visualizations/deckgl/layers/scatter.jsx
@@ -28,10 +28,10 @@ export default function getLayer(formData, payload, slice) {
     };
   });
 
-  if (fd.js_datapoint_mutator) {
+  if (fd.js_data_mutator) {
     // Applying user defined data mutator if defined
-    const jsFnMutator = sandboxedEval(fd.js_datapoint_mutator);
-    data = data.map(jsFnMutator);
+    const jsFnMutator = sandboxedEval(fd.js_data_mutator);
+    data = jsFnMutator(data);
   }
 
   return new ScatterplotLayer({

-- 
To stop receiving notification emails like this one, please contact
maximebeauchemin@apache.org.