1111var Lib = require ( '../lib' ) ;
1212var axisIds = require ( '../plots/cartesian/axis_ids' ) ;
1313
14+ var INEQUALITY_OPS = [ '=' , '<' , '>=' , '>' , '<=' ] ;
15+ var INTERVAL_OPS = [ '[]' , '()' , '[)' , '(]' , '][' , ')(' , '](' , ')[' ] ;
16+ var SET_OPS = [ '{}' , '}{' ] ;
17+
1418exports . moduleType = 'transform' ;
1519
1620exports . name = 'filter' ;
@@ -33,10 +37,31 @@ exports.attributes = {
3337 } ,
3438 operation : {
3539 valType : 'enumerated' ,
36- values : [ '=' , '<' , '>' , 'within' , 'notwithin' , 'in' , 'notin' ] ,
40+ values : [ ] . concat ( INEQUALITY_OPS ) . concat ( INTERVAL_OPS ) . concat ( SET_OPS ) ,
3741 dflt : '=' ,
3842 description : [
39- 'Sets the filter operation.'
43+ 'Sets the filter operation.' ,
44+
45+ '*=* filters items equal to `value`' ,
46+
47+ '*<* filters items less than `value`' ,
48+ '*<=* filters items less than or equal to `value`' ,
49+
50+ '*>* filters items greater than `value`' ,
51+ '*>=* filters items greater than or equal to `value`' ,
52+
53+ '*[]* filters items inside `value[0]` to value[1]` including both bounds`' ,
54+ '*()* filters items inside `value[0]` to value[1]` excluding both bounds`' ,
55+ '*[)* filters items inside `value[0]` to value[1]` including `value[0]` but excluding `value[1]' ,
56+ '*(]* filters items inside `value[0]` to value[1]` including both bounds`' ,
57+
58+ '*][* filters items outside `value[0]` to value[1]` and not equal to both bounds`' ,
59+ '*)(* filters items outside `value[0]` to value[1]`' ,
60+ '*](* filters items outside `value[0]` to value[1]` and not equal to `value[0]`' ,
61+ '*)[* filters items outside `value[0]` to value[1]` and not equal to `value[1]`' ,
62+
63+ '*{}* filters items present in a set of values' ,
64+ '*}{* filters items not present in a set of values'
4065 ] . join ( ' ' )
4166 } ,
4267 value : {
@@ -51,19 +76,6 @@ exports.attributes = {
5176 'is the lower bound and the second item is the upper bound.' ,
5277 'When `operation`, is set to *in*, *notin* '
5378 ] . join ( ' ' )
54- } ,
55- strictinterval : {
56- valType : 'boolean' ,
57- dflt : true ,
58- arrayOk : true ,
59- description : [
60- 'Determines whether or not the filter operation includes data item value,' ,
61- 'equal to *value*.' ,
62- 'Has only an effect for `operation` *>*, *<*, *within* and *notwithin*' ,
63- 'When `operation` is set to *within* and *notwithin*,' ,
64- '`strictinterval` is expected to be a 2-item array where the first (second)' ,
65- 'item determines strictness for the lower (second) bound.'
66- ] . join ( ' ' )
6779 }
6880} ;
6981
@@ -77,14 +89,9 @@ exports.supplyDefaults = function(transformIn) {
7789 var enabled = coerce ( 'enabled' ) ;
7890
7991 if ( enabled ) {
80- var operation = coerce ( 'operation' ) ;
81-
92+ coerce ( 'operation' ) ;
8293 coerce ( 'value' ) ;
8394 coerce ( 'filtersrc' ) ;
84-
85- if ( [ '=' , 'in' , 'notin' ] . indexOf ( operation ) === - 1 ) {
86- coerce ( 'strictinterval' ) ;
87- }
8895 }
8996
9097 return transformOut ;
@@ -154,33 +161,23 @@ function getDataToCoordFunc(gd, filtersrc) {
154161function getFilterFunc ( opts , d2c ) {
155162 var operation = opts . operation ,
156163 value = opts . value ,
157- hasArrayValue = Array . isArray ( value ) ,
158- strict = opts . strictinterval ,
159- hasArrayStrict = Array . isArray ( strict ) ;
164+ hasArrayValue = Array . isArray ( value ) ;
160165
161166 function isOperationIn ( array ) {
162167 return array . indexOf ( operation ) !== - 1 ;
163168 }
164169
165- var coercedValue , coercedStrict ;
170+ var coercedValue ;
166171
167- if ( isOperationIn ( [ '=' , '<' , '>' ] ) ) {
172+ if ( isOperationIn ( INEQUALITY_OPS ) ) {
168173 coercedValue = hasArrayValue ? d2c ( value [ 0 ] ) : d2c ( value ) ;
169-
170- if ( isOperationIn ( [ '<' , '>' ] ) ) {
171- coercedStrict = hasArrayStrict ? strict [ 0 ] : strict ;
172- }
173174 }
174- else if ( isOperationIn ( [ 'within' , 'notwithin' ] ) ) {
175+ else if ( isOperationIn ( INTERVAL_OPS ) ) {
175176 coercedValue = hasArrayValue ?
176177 [ d2c ( value [ 0 ] ) , d2c ( value [ 1 ] ) ] :
177178 [ d2c ( value ) , d2c ( value ) ] ;
178-
179- coercedStrict = hasArrayStrict ?
180- [ strict [ 0 ] , strict [ 1 ] ] :
181- [ strict , strict ] ;
182179 }
183- else if ( isOperationIn ( [ 'in' , 'notin' ] ) ) {
180+ else if ( isOperationIn ( SET_OPS ) ) {
184181 coercedValue = hasArrayValue ? value . map ( d2c ) : [ d2c ( value ) ] ;
185182 }
186183
@@ -190,85 +187,71 @@ function getFilterFunc(opts, d2c) {
190187 return function ( v ) { return d2c ( v ) === coercedValue ; } ;
191188
192189 case '<' :
193- if ( coercedStrict ) {
194- return function ( v ) { return d2c ( v ) < coercedValue ; } ;
195- }
196- else {
197- return function ( v ) { return d2c ( v ) <= coercedValue ; } ;
198- }
190+ return function ( v ) { return d2c ( v ) < coercedValue ; } ;
191+
192+ case '<=' :
193+ return function ( v ) { return d2c ( v ) <= coercedValue ; } ;
199194
200195 case '>' :
201- if ( coercedStrict ) {
202- return function ( v ) { return d2c ( v ) > coercedValue ; } ;
203- }
204- else {
205- return function ( v ) { return d2c ( v ) >= coercedValue ; } ;
206- }
207-
208- case 'within' :
209-
210- if ( coercedStrict [ 0 ] && coercedStrict [ 1 ] ) {
211- return function ( v ) {
212- var cv = d2c ( v ) ;
213- return cv > coercedValue [ 0 ] && cv < coercedValue [ 1 ] ;
214- } ;
215- }
216- else if ( coercedStrict [ 0 ] && ! coercedStrict [ 1 ] ) {
217- return function ( v ) {
218- var cv = d2c ( v ) ;
219- return cv > coercedValue [ 0 ] && cv <= coercedValue [ 1 ] ;
220- } ;
221- }
222- else if ( ! coercedStrict [ 0 ] && coercedStrict [ 1 ] ) {
223- return function ( v ) {
224- var cv = d2c ( v ) ;
225- return cv >= coercedValue [ 0 ] && cv < coercedValue [ 1 ] ;
226- } ;
227- }
228- else if ( ! coercedStrict [ 0 ] && ! coercedStrict [ 1 ] ) {
229- return function ( v ) {
230- var cv = d2c ( v ) ;
231- return cv >= coercedValue [ 0 ] && cv <= coercedValue [ 1 ] ;
232- } ;
233- }
234-
235- break ;
236-
237- case 'notwithin' :
238-
239- if ( coercedStrict [ 0 ] && coercedStrict [ 1 ] ) {
240- return function ( v ) {
241- var cv = d2c ( v ) ;
242- return cv < coercedValue [ 0 ] || cv > coercedValue [ 1 ] ;
243- } ;
244- }
245- else if ( coercedStrict [ 0 ] && ! coercedStrict [ 1 ] ) {
246- return function ( v ) {
247- var cv = d2c ( v ) ;
248- return cv < coercedValue [ 0 ] || cv >= coercedValue [ 1 ] ;
249- } ;
250- }
251- else if ( ! coercedStrict [ 0 ] && coercedStrict [ 1 ] ) {
252- return function ( v ) {
253- var cv = d2c ( v ) ;
254- return cv <= coercedValue [ 0 ] || cv > coercedValue [ 1 ] ;
255- } ;
256- }
257- else if ( ! coercedStrict [ 0 ] && ! coercedStrict [ 1 ] ) {
258- return function ( v ) {
259- var cv = d2c ( v ) ;
260- return cv <= coercedValue [ 0 ] || cv >= coercedValue [ 1 ] ;
261- } ;
262- }
263-
264- break ;
265-
266- case 'in' :
196+ return function ( v ) { return d2c ( v ) > coercedValue ; } ;
197+
198+ case '>=' :
199+ return function ( v ) { return d2c ( v ) >= coercedValue ; } ;
200+
201+ case '[]' :
202+ return function ( v ) {
203+ var cv = d2c ( v ) ;
204+ return cv >= coercedValue [ 0 ] && cv <= coercedValue [ 1 ] ;
205+ } ;
206+
207+ case '()' :
208+ return function ( v ) {
209+ var cv = d2c ( v ) ;
210+ return cv > coercedValue [ 0 ] && cv < coercedValue [ 1 ] ;
211+ } ;
212+
213+ case '[)' :
214+ return function ( v ) {
215+ var cv = d2c ( v ) ;
216+ return cv >= coercedValue [ 0 ] && cv < coercedValue [ 1 ] ;
217+ } ;
218+
219+ case '(]' :
220+ return function ( v ) {
221+ var cv = d2c ( v ) ;
222+ return cv > coercedValue [ 0 ] && cv <= coercedValue [ 1 ] ;
223+ } ;
224+
225+ case '][' :
226+ return function ( v ) {
227+ var cv = d2c ( v ) ;
228+ return cv < coercedValue [ 0 ] || cv > coercedValue [ 1 ] ;
229+ } ;
230+
231+ case ')(' :
232+ return function ( v ) {
233+ var cv = d2c ( v ) ;
234+ return cv <= coercedValue [ 0 ] || cv >= coercedValue [ 1 ] ;
235+ } ;
236+
237+ case '](' :
238+ return function ( v ) {
239+ var cv = d2c ( v ) ;
240+ return cv < coercedValue [ 0 ] || cv >= coercedValue [ 1 ] ;
241+ } ;
242+
243+ case ')[' :
244+ return function ( v ) {
245+ var cv = d2c ( v ) ;
246+ return cv <= coercedValue [ 0 ] || cv > coercedValue [ 1 ] ;
247+ } ;
248+
249+ case '{}' :
267250 return function ( v ) {
268251 return coercedValue . indexOf ( d2c ( v ) ) !== - 1 ;
269252 } ;
270253
271- case 'notin ' :
254+ case '}{ ' :
272255 return function ( v ) {
273256 return coercedValue . indexOf ( d2c ( v ) ) === - 1 ;
274257 } ;
0 commit comments