Skip to content

Commit ad77818

Browse files
committed
transforms: allow 'filtersrc' to be an arbitrary attr string
- so that filters can be applied to ALL possible data array e.g `filtersrc: 'marker.color'` - add tests for geo 'lon' / 'lat' and 'marker.color'
1 parent 0aa4958 commit ad77818

File tree

2 files changed

+86
-6
lines changed

2 files changed

+86
-6
lines changed

src/transforms/filter.js

+12-6
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,17 @@ exports.attributes = {
2828
].join(' ')
2929
},
3030
filtersrc: {
31-
valType: 'enumerated',
32-
values: ['x', 'y', 'z', 'ids'],
31+
valType: 'string',
32+
strict: true,
33+
noBlank: true,
3334
dflt: 'x',
3435
description: [
3536
'Sets the variable in the parent trace object',
36-
'by which the filter will be applied.'
37+
'by which the filter will be applied.',
38+
39+
'To filter about nested variables, use *.* to access them.',
40+
'For example, set `filtersrc` to *marker.color* to filter',
41+
'about the marker color array.'
3742
].join(' ')
3843
},
3944
operation: {
@@ -110,14 +115,15 @@ exports.supplyDefaults = function(transformIn) {
110115
};
111116

112117
exports.calcTransform = function(gd, trace, opts) {
113-
var filtersrc = opts.filtersrc;
118+
var filtersrc = opts.filtersrc,
119+
filtersrcOk = filtersrc && Array.isArray(Lib.nestedProperty(trace, filtersrc).get());
114120

115-
if(!opts.enabled || !trace[filtersrc]) return;
121+
if(!opts.enabled || !filtersrcOk) return;
116122

117123
var dataToCoord = getDataToCoordFunc(gd, filtersrc),
118124
filterFunc = getFilterFunc(opts, dataToCoord);
119125

120-
var filterArr = trace[filtersrc],
126+
var filterArr = Lib.nestedProperty(trace, filtersrc).get(),
121127
len = filterArr.length;
122128

123129
var arrayAttrs = Lib.findArrayAttributes(trace),

test/jasmine/tests/transform_filter_test.js

+74
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,31 @@ describe('filter transforms defaults:', function() {
4949
enabled: false,
5050
}]);
5151
});
52+
53+
it('supplyTraceDefaults should coerce *filtersrc* as a strict / noBlank string', function() {
54+
traceIn = {
55+
x: [1, 2, 3],
56+
transforms: [{
57+
type: 'filter',
58+
}, {
59+
type: 'filter',
60+
filtersrc: 0
61+
}, {
62+
type: 'filter',
63+
filtersrc: ''
64+
}, {
65+
type: 'filter',
66+
filtersrc: 'marker.color'
67+
}]
68+
};
69+
70+
traceOut = Plots.supplyTraceDefaults(traceIn, 0, {});
71+
72+
expect(traceOut.transforms[0].filtersrc).toEqual('x');
73+
expect(traceOut.transforms[1].filtersrc).toEqual('x');
74+
expect(traceOut.transforms[2].filtersrc).toEqual('x');
75+
expect(traceOut.transforms[3].filtersrc).toEqual('marker.color');
76+
});
5277
});
5378

5479
describe('filter transforms calc:', function() {
@@ -95,6 +120,55 @@ describe('filter transforms calc:', function() {
95120
expect(out[0].y).toEqual(base.y);
96121
});
97122

123+
it('filters should handle geographical *lon* data', function() {
124+
var trace0 = {
125+
type: 'scattergeo',
126+
lon: [-90, -40, 100, 120, 130],
127+
lat: [-50, -40, 10, 20, 30],
128+
transforms: [{
129+
type: 'filter',
130+
operation: '>',
131+
value: 0,
132+
filtersrc: 'lon'
133+
}]
134+
};
135+
136+
var trace1 = {
137+
type: 'scattermapbox',
138+
lon: [-90, -40, 100, 120, 130],
139+
lat: [-50, -40, 10, 20, 30],
140+
transforms: [{
141+
type: 'filter',
142+
operation: '<',
143+
value: 0,
144+
filtersrc: 'lat'
145+
}]
146+
};
147+
148+
var out = _transform([trace0, trace1]);
149+
150+
expect(out[0].lon).toEqual([100, 120, 130]);
151+
expect(out[0].lat).toEqual([10, 20, 30]);
152+
153+
expect(out[1].lon).toEqual([-90, -40]);
154+
expect(out[1].lat).toEqual([-50, -40]);
155+
});
156+
157+
it('filters should handle nested attributes', function() {
158+
var out = _transform([Lib.extendDeep({}, base, {
159+
transforms: [{
160+
type: 'filter',
161+
operation: '>',
162+
value: 0.2,
163+
filtersrc: 'marker.color'
164+
}]
165+
})]);
166+
167+
expect(out[0].x).toEqual([-2, 2, 3]);
168+
expect(out[0].y).toEqual([3, 3, 1]);
169+
expect(out[0].marker.color).toEqual([0.3, 0.3, 0.4]);
170+
});
171+
98172
it('filters should skip if *enabled* is false', function() {
99173
var out = _transform([Lib.extendDeep({}, base, {
100174
transforms: [{

0 commit comments

Comments
 (0)