Skip to content

Commit 57d0c13

Browse files
committed
reuse the plotly_schema crawler and fix some crawling issues (squashed)
1 parent 61f3385 commit 57d0c13

File tree

3 files changed

+31
-45
lines changed

3 files changed

+31
-45
lines changed

src/plot_api/plot_schema.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,17 @@ PlotSchema.get = function() {
5656
return plotSchema;
5757
};
5858

59-
PlotSchema.crawl = function(attrs, callback) {
59+
PlotSchema.crawl = function (attrs, callback, specifiedLevel) {
60+
var level = specifiedLevel || 0;
6061
Object.keys(attrs).forEach(function(attrName) {
6162
var attr = attrs[attrName];
6263

6364
if(UNDERSCORE_ATTRS.indexOf(attrName) !== -1) return;
6465

65-
callback(attr, attrName, attrs);
66+
callback(attr, attrName, attrs, level);
6667

6768
if(PlotSchema.isValObject(attr)) return;
68-
if(Lib.isPlainObject(attr)) PlotSchema.crawl(attr, callback);
69+
if(Lib.isPlainObject(attr)) PlotSchema.crawl(attr, callback, level + 1);
6970
});
7071
};
7172

src/plots/plots.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
'use strict';
1111

12+
var PlotSchema = require('./../plot_api/plot_schema')
1213
var d3 = require('d3');
1314
var isNumeric = require('fast-isnumeric');
1415

@@ -786,6 +787,27 @@ function applyTransforms(fullTrace, fullData, layout) {
786787
var container = fullTrace.transforms,
787788
dataOut = [fullTrace];
788789

790+
var attributeSets = dataOut.map(function(trace) {
791+
792+
var arraySplitAttributes = [];
793+
794+
var stack = [];
795+
796+
function callback(attr, attrName, attrs, level) {
797+
798+
stack = stack.slice(0, level).concat([attrName]);
799+
800+
var splittableAttr = attr.valType === 'data_array' || attr.arrayOk === true
801+
if(splittableAttr) {
802+
arraySplitAttributes.push(stack.slice());
803+
}
804+
}
805+
806+
PlotSchema.crawl(trace._module.attributes, callback);
807+
808+
return arraySplitAttributes;
809+
});
810+
789811
for(var i = 0; i < container.length; i++) {
790812
var transform = container[i],
791813
type = transform.type,
@@ -796,6 +818,7 @@ function applyTransforms(fullTrace, fullData, layout) {
796818
transform: transform,
797819
fullTrace: fullTrace,
798820
fullData: fullData,
821+
attributeSets: attributeSets,
799822
layout: layout
800823
});
801824
}

src/transforms/groupby.js

Lines changed: 4 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -90,20 +90,15 @@ exports.transform = function(data, state) {
9090

9191
var newData = [];
9292

93-
data.forEach(function(trace) {
93+
data.forEach(function(trace, i) {
9494

95-
var splittingAttributes = [];
96-
97-
var attributes = trace._module.attributes;
98-
crawl(attributes, splittingAttributes);
99-
100-
newData = newData.concat(transformOne(trace, state, splittingAttributes));
95+
newData = newData.concat(transformOne(trace, state, state.attributeSets[i]));
10196
});
10297

10398
return newData;
10499
};
105100

106-
function transformOne(trace, state, splittingAttributes) {
101+
function transformOne(trace, state, attributeSet) {
107102

108103
var opts = state.transform;
109104
var groups = opts.groups;
@@ -117,7 +112,7 @@ function transformOne(trace, state, splittingAttributes) {
117112

118113
var style = opts.style || {};
119114

120-
var topLevelAttributes = splittingAttributes
115+
var topLevelAttributes = attributeSet
121116
.filter(function(array) {return Array.isArray(getDeepProp(trace, array));});
122117

123118
var initializeArray = function(newTrace, a) {
@@ -177,36 +172,3 @@ function setDeepProp(thing, propArray, value) {
177172
}
178173
current[propArray[propArray.length - 1]] = value;
179174
}
180-
181-
// fixme check if similar functions in plot_schema.js can be reused
182-
function crawl(attrs, list, path) {
183-
path = path || [];
184-
185-
Object.keys(attrs).forEach(function(attrName) {
186-
var attr = attrs[attrName];
187-
var _path = path.slice();
188-
_path.push(attrName);
189-
190-
if(attrName.charAt(0) === '_') return;
191-
192-
callback(attr, list, _path);
193-
194-
if(isValObject(attr)) return;
195-
if(isPlainObject(attr)) crawl(attr, list, _path);
196-
});
197-
}
198-
199-
function isValObject(obj) {
200-
return obj && obj.valType !== undefined;
201-
}
202-
203-
function callback(attr, list, path) {
204-
// see schema.defs for complete list of 'val types'
205-
if(attr.valType === 'data_array' || attr.arrayOk === true) {
206-
list.push(path);
207-
}
208-
}
209-
210-
function isPlainObject(obj) {
211-
return Object.prototype.toString.call(obj) === '[object Object]';
212-
}

0 commit comments

Comments
 (0)