@@ -21,35 +21,41 @@ function compile(filter) {
21
21
var op = filter [ 0 ] ;
22
22
if ( filter . length <= 1 ) return op === 'any' ? 'false' : 'true' ;
23
23
var str =
24
- op === '==' ? compare ( filter [ 1 ] , filter [ 2 ] , '===' , false ) :
25
- op === '!=' ? compare ( filter [ 1 ] , filter [ 2 ] , '!==' , false ) :
24
+ op === '==' ? compileComparisonOp ( filter [ 1 ] , filter [ 2 ] , '===' , false ) :
25
+ op === '!=' ? compileComparisonOp ( filter [ 1 ] , filter [ 2 ] , '!==' , false ) :
26
26
op === '<' ||
27
27
op === '>' ||
28
28
op === '<=' ||
29
- op === '>=' ? compare ( filter [ 1 ] , filter [ 2 ] , op , true ) :
30
- op === 'any' ? filter . slice ( 1 ) . map ( compile ) . join ( '||' ) :
31
- op === 'all' ? filter . slice ( 1 ) . map ( compile ) . join ( '&&' ) :
32
- op === 'none' ? '!(' + filter . slice ( 1 ) . map ( compile ) . join ( '||' ) + ')' :
33
- op === 'in' ? compileIn ( filter [ 1 ] , filter . slice ( 2 ) ) :
34
- op === '!in' ? '!(' + compileIn ( filter [ 1 ] , filter . slice ( 2 ) ) + ')' :
35
- op === 'has' ? compileHas ( filter [ 1 ] ) :
36
- op === '!has' ? negate ( compileHas ( [ filter [ 1 ] ] ) ) :
29
+ op === '>=' ? compileComparisonOp ( filter [ 1 ] , filter [ 2 ] , op , true ) :
30
+ op === 'any' ? compileLogicalOp ( filter . slice ( 1 ) , '||' ) :
31
+ op === 'all' ? compileLogicalOp ( filter . slice ( 1 ) , '&&' ) :
32
+ op === 'none' ? compileNegation ( compileLogicalOp ( filter . slice ( 1 ) , '||' ) ) :
33
+ op === 'in' ? compileInOp ( filter [ 1 ] , filter . slice ( 2 ) ) :
34
+ op === '!in' ? compileNegation ( compileInOp ( filter [ 1 ] , filter . slice ( 2 ) ) ) :
35
+ op === 'has' ? compileHasOp ( filter [ 1 ] ) :
36
+ op === '!has' ? compileNegation ( compileHasOp ( [ filter [ 1 ] ] ) ) :
37
37
'true' ;
38
38
return '(' + str + ')' ;
39
39
}
40
40
41
- function valueExpr ( key ) {
42
- return key === '$type' ? 'f.type' : 'p[' + JSON . stringify ( key ) + ']' ;
41
+ function compilePropertyReference ( property ) {
42
+ return property === '$type' ? 'f.type' : 'p[' + JSON . stringify ( property ) + ']' ;
43
43
}
44
- function compare ( key , val , op , checkType ) {
45
- var left = valueExpr ( key ) ;
46
- var right = key === '$type' ? types . indexOf ( val ) : JSON . stringify ( val ) ;
44
+
45
+ function compileComparisonOp ( property , value , op , checkType ) {
46
+ var left = compilePropertyReference ( property ) ;
47
+ var right = property === '$type' ? types . indexOf ( value ) : JSON . stringify ( value ) ;
47
48
return ( checkType ? 'typeof ' + left + '=== typeof ' + right + '&&' : '' ) + left + op + right ;
48
49
}
49
- function compileIn ( key , values ) {
50
- if ( key === '$type' ) values = values . map ( function ( value ) { return types . indexOf ( value ) ; } ) ;
51
- var left = JSON . stringify ( values . sort ( compareFn ) ) ;
52
- var right = valueExpr ( key ) ;
50
+
51
+ function compileLogicalOp ( expressions , op ) {
52
+ return expressions . map ( compile ) . join ( op ) ;
53
+ }
54
+
55
+ function compileInOp ( property , values ) {
56
+ if ( property === '$type' ) values = values . map ( function ( value ) { return types . indexOf ( value ) ; } ) ;
57
+ var left = JSON . stringify ( values . sort ( compareDescending ) ) ;
58
+ var right = compilePropertyReference ( property ) ;
53
59
54
60
if ( values . length <= 200 ) return left + '.indexOf(' + right + ') !== -1' ;
55
61
@@ -60,14 +66,14 @@ function compileIn(key, values) {
60
66
'return false; }(' + right + ', ' + left + ',0,' + ( values . length - 1 ) + ')' ;
61
67
}
62
68
63
- function compileHas ( key ) {
64
- return JSON . stringify ( key ) + ' in p' ;
69
+ function compileHasOp ( property ) {
70
+ return JSON . stringify ( property ) + ' in p' ;
65
71
}
66
72
67
- function compareFn ( a , b ) {
68
- return a < b ? - 1 : a > b ? 1 : 0 ;
73
+ function compileNegation ( expression ) {
74
+ return '!(' + expression + ')' ;
69
75
}
70
76
71
- function negate ( expression ) {
72
- return '!(' + expression + ')' ;
77
+ function compareDescending ( a , b ) {
78
+ return a - b ;
73
79
}
0 commit comments