@@ -46,145 +46,68 @@ public void All_Typed()
46
46
}
47
47
48
48
[ Fact ]
49
- public void And ( )
49
+ public void FilterDefinition_and_operator ( )
50
50
{
51
51
var subject = CreateSubject < BsonDocument > ( ) ;
52
- var filter = subject . And (
53
- subject . Eq ( "a" , 1 ) ,
54
- subject . Eq ( "b" , 2 ) ) ;
52
+ var filter = subject . Eq ( "a" , 1 ) & "{ a: 2 }" ;
55
53
56
- Assert ( filter , "{a: 1, b: 2}" ) ;
57
- }
58
-
59
- [ Fact ]
60
- public void And_with_clashing_keys_should_get_promoted_to_dollar_form ( )
61
- {
62
- var subject = CreateSubject < BsonDocument > ( ) ;
63
- var filter = subject . And (
64
- subject . Eq ( "a" , 1 ) ,
65
- subject . Eq ( "a" , 2 ) ) ;
66
-
67
- Assert ( filter , "{$and: [{a: 1}, {a: 2}]}" ) ;
68
- }
69
-
70
- [ Fact ]
71
- public void And_with_clashing_keys_but_different_operators_should_get_merged ( )
72
- {
73
- var subject = CreateSubject < BsonDocument > ( ) ;
74
- var filter = subject . And (
75
- subject . Gt ( "a" , 1 ) ,
76
- subject . Lt ( "a" , 10 ) ) ;
77
-
78
- Assert ( filter , "{a: {$gt: 1, $lt: 10}}" ) ;
54
+ Assert ( filter , "{ $and : [ { a: 1 }, { a: 2 } ] }" ) ;
79
55
}
80
56
81
57
[ Theory ]
82
- [ InlineData ( "{ geoField : { $geoWithin : { $box : [ [ 1.0, 2.0 ], [ 3.0, 4.0 ] ] } } }" , "{ geoField : { $near : [ 5.0, 6.0 ] } }" ) ]
83
- [ InlineData ( "{ geoField : { $near : [ 5.0, 6.0 ] } }" , "{ geoField : { $geoWithin : { $box : [ [ 1.0, 2.0 ], [ 3.0, 4.0 ] ] } } }" ) ]
84
- [ InlineData ( "{ geoField : { $nearSphere : { $geometry : { type : 'Point', coordinates : [ 1, 2 ] } } } }" , "{ geoField : { $geoIntersects : { $geometry : { type : 'Polygon', coordinates: [ [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ] ] ] } } } }" ) ]
85
- [ InlineData ( "{ geoField : { $geoIntersects : { $geometry : { type : 'Polygon', coordinates: [ [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ] ] ] } } } }" , "{ geoField : { $nearSphere : { $geometry : { type : 'Point', coordinates : [ 1, 2 ] } } } }" ) ]
86
- public void And_with_clashing_keys_and_different_operators_but_with_filters_that_support_only_dollar_form_should_get_promoted_to_dollar_form ( string firstFilter , string secondFilter )
87
- {
88
- var subject = CreateSubject < BsonDocument > ( ) ;
89
-
90
- var combinedFilter = subject . And ( firstFilter , secondFilter ) ;
91
-
92
- Assert ( combinedFilter , $ "{{ $and : [ { firstFilter } , { secondFilter } ] }}") ;
93
- }
94
-
95
- [ Fact ]
96
- public void And_with_clashing_keys_and_different_operators_but_with_filters_that_support_only_dollar_form_and_empty_filter_should_ignore_empty_filter ( )
97
- {
98
- var subject = CreateSubject < BsonDocument > ( ) ;
99
-
100
- var combinedFilter = subject . And (
101
- "{ geoField : { $near : [ 5.0, 6.0 ] } }" ,
102
- "{ geoField : { } }" ) ;
103
-
104
- Assert ( combinedFilter , "{ geoField : { $near : [ 5.0, 6.0 ] } }" ) ;
105
- }
106
-
107
- [ Fact ]
108
- public void And_with_an_empty_filter ( )
109
- {
110
- var subject = CreateSubject < BsonDocument > ( ) ;
111
- var filter = subject . And (
112
- "{}" ,
113
- subject . Eq ( "a" , 10 ) ) ;
114
-
115
- Assert ( filter , "{a: 10}" ) ;
116
- }
117
-
118
- [ Fact ]
119
- public void And_with_a_nested_and_should_get_flattened ( )
120
- {
121
- var subject = CreateSubject < BsonDocument > ( ) ;
122
- var filter = subject . And (
123
- subject . And ( "{a: 1}" , new BsonDocument ( "b" , 2 ) ) ,
124
- subject . Eq ( "c" , 3 ) ) ;
125
-
126
- Assert ( filter , "{a: 1, b: 2, c: 3}" ) ;
127
- }
128
-
129
- [ Fact ]
130
- public void And_with_a_nested_and_and_clashing_keys ( )
131
- {
132
- var subject = CreateSubject < BsonDocument > ( ) ;
133
- var filter = subject . And (
134
- subject . And ( subject . Eq ( "a" , 1 ) , subject . Eq ( "a" , 2 ) ) ,
135
- subject . Eq ( "c" , 3 ) ) ;
136
-
137
- Assert ( filter , "{$and: [{a: 1}, {a: 2}, {c: 3}]}" ) ;
138
- }
139
-
140
- [ Fact ]
141
- public void And_with_a_nested_and_and_clashing_operators_on_the_same_key ( )
142
- {
143
- var subject = CreateSubject < BsonDocument > ( ) ;
144
- var filter = subject . Lt ( "a" , 1 ) & subject . Lt ( "a" , 2 ) ;
145
-
146
- Assert ( filter , "{$and: [{a: {$lt: 1}}, {a: {$lt: 2}}]}" ) ;
147
- }
148
-
149
- [ Fact ]
150
- public void And_with_a_nested_and_and_clashing_keys_using_ampersand ( )
151
- {
152
- var subject = CreateSubject < BsonDocument > ( ) ;
153
- var filter = subject . Eq ( "a" , 1 ) & "{a: 2}" & new BsonDocument ( "c" , 3 ) ;
154
-
155
- Assert ( filter , "{$and: [{a: 1}, {a: 2}, {c: 3}]}" ) ;
156
- }
157
-
158
- [ Fact ]
159
- public void And_with_no_clauses ( )
160
- {
161
- var subject = CreateSubject < BsonDocument > ( ) ;
162
-
163
- var filter = subject . And ( ) ;
164
-
165
- Assert ( filter , "{ $and : [] }" ) ;
166
- }
167
-
168
- [ Fact ]
169
- public void And_with_one_empty_clause ( )
170
- {
171
- var subject = CreateSubject < BsonDocument > ( ) ;
172
- var empty = Builders < BsonDocument > . Filter . Empty ;
173
-
174
- var filter = subject . And ( empty ) ;
58
+ [ InlineData ( "{ $and : [] }" ) ]
59
+ [ InlineData ( "{}" , "{}" ) ]
60
+ [ InlineData ( "{}" , "{}" , "{}" ) ]
61
+ [ InlineData ( "{ a : 10 }" , "{}" , "{ a : 10 }" ) ]
62
+ [ InlineData ( "{ a : 10 }" , "{ a : 10 }" , "{}" ) ]
63
+ [ InlineData ( "{ a : 1, b : 2, c : 3 }" , "{ a : 1 }" , "{ b : 2 }" , "{ c : 3 }" ) ]
64
+ [ InlineData ( "{ a : 1, b : 2, c : 3 }" , "{ a : 1 }" , "{ $and: [{ b : 2 }, { c : 3 }] }" ) ]
65
+ [ InlineData ( "{ a : { $gt : 1, $lt : 10 } }" , "{ a : { $gt : 1 } }" , "{ a : { $lt : 10 } }" ) ]
66
+ [ InlineData ( "{ $and : [{ a : { $lt : 1 } }, { a : { $lt : 2 } }] }" , "{ a : { $lt : 1 } }" , "{ a : { $lt : 2 } }" ) ]
67
+ [ InlineData ( "{ $and : [{ a : 1 }, { a : 2 }] }" , "{ a : 1 }" , "{ a : 2 }" ) ]
68
+ [ InlineData ( "{ $and : [{ a : 1 }, { a : 2 }, { c : 3 }] }" , "{ a : 1 }" , "{ a : 2 }" , "{ c : 3 }" ) ]
69
+ [ InlineData ( "{ $and : [{ c : 3 }, { a : 1 }, { a : 2 }] }" , "{ c : 3 }" , "{ a : 1 }" , "{ a : 2 }" ) ]
70
+ [ InlineData ( "{ $and : [{ a : 1 }, { a : 2 }, { c : 3 }] }" , "{ $and : [{ a : 1 }, { a : 2 }] }" , "{ c : 3}" ) ]
71
+ [ InlineData ( "{ $and : [{ a : 1 }, { a : 2 }, { c : 3 }] }" , "{ $and : [{ a : 1 }, { $and : [{ a : 2 }] }] }" , "{ c : 3 }" ) ]
72
+ [ InlineData ( "{ $and : [{ a : 1 }, { a : 2 }, { c : 3 }] }" , "{ a : 1 }" , "{ $and : [{ a : 2 }, { c : 3 }] }" ) ]
73
+
74
+ [ InlineData ( "{ geoField : { $near : [5.0, 6.0] } }" , "{ geoField : { $near : [5.0, 6.0] } }" , "{}" ) ]
75
+ [ InlineData (
76
+ "{ $and : [{ geoField : { $near : [40.0, 18.0] } }, { geoField : { $near : [42.0, 10.0] } }] }" ,
77
+ "{ geoField: { $near : [40.0, 18.0] } }" ,
78
+ "{ geoField : { $near : [42.0, 10.0] } }" ) ]
79
+ [ InlineData (
80
+ "{ $and : [{ geoField : { $geoWithin : { $box : [[1.0, 2.0], [3.0, 4.0]] } } }, { geoField : { $near : [5.0, 6.0] } }] }" ,
81
+ "{ geoField : { $geoWithin : { $box : [[1.0, 2.0], [3.0, 4.0]] } } }" ,
82
+ "{ geoField : { $near : [5.0, 6.0] } }" ) ]
83
+ [ InlineData (
84
+ "{ $and : [{ geoField : { $near : [5.0, 6.0] } }, { geoField : { $geoWithin : { $box : [[1.0, 2.0], [3.0, 4.0]] } } }] }" ,
85
+ "{ geoField : { $near : [5.0, 6.0] } }" ,
86
+ "{ geoField : { $geoWithin : { $box : [[1.0, 2.0], [3.0, 4.0]] } } }" ) ]
87
+ [ InlineData (
88
+ "{ $and : [{ geoField : { $nearSphere : { $geometry : { type : 'Point', coordinates : [1, 2] } } } }, { geoField : { $geoIntersects : { $geometry : { type : 'Polygon', coordinates: [[[1, 2], [3, 4], [5, 6], [7, 8]]] } } } }] }" ,
89
+ "{ geoField : { $nearSphere : { $geometry : { type : 'Point', coordinates : [1, 2] } } } }" ,
90
+ "{ geoField : { $geoIntersects : { $geometry : { type : 'Polygon', coordinates: [[[1, 2], [3, 4], [5, 6], [7, 8]]] } } } }" ) ]
91
+ [ InlineData (
92
+ "{ $and : [{ geoField : { $geoIntersects : { $geometry : { type : 'Polygon', coordinates: [[[1, 2], [3, 4], [5, 6], [7, 8]]] } } } }, { geoField : { $nearSphere : { $geometry : { type : 'Point', coordinates : [1, 2] } } } }] }" ,
93
+ "{ geoField : { $geoIntersects : { $geometry : { type : 'Polygon', coordinates: [[[1, 2], [3, 4], [5, 6], [7, 8]]] } } } }" ,
94
+ "{ geoField : { $nearSphere : { $geometry : { type : 'Point', coordinates : [1, 2] } } } }" ) ]
95
+
96
+ [ InlineData ( "{ a : 1 , $expr : { $eq : ['$_id', 1] } }" , "{ a : 1 }" , "{ $expr : { $eq : ['$_id', 1] } }" ) ]
97
+ [ InlineData ( "{ $expr : { $eq : ['$_id', 1] }, a: 1 }" , "{ $expr : { $eq : ['$_id', 1] } }" , "{ a: 1 }" ) ]
98
+ [ InlineData ( "{ $expr : { $eq : ['$_id', 1] } }" , "{ $expr : { $eq : ['$_id', 1] } }" , "{}" ) ]
99
+ [ InlineData (
100
+ "{ $and : [{ $expr : { $eq : ['$_id', 1] } }, { $expr : { $ne : ['$a', ''] } }] }" ,
101
+ "{ $expr : { $eq : ['$_id', 1] } }" ,
102
+ "{ $expr : { $ne : ['$a', ''] } }" ) ]
103
+ public void And ( string expected , params string [ ] clauses )
104
+ {
105
+ var subject = CreateSubject < BsonDocument > ( ) ;
106
+ var args = clauses . Select ( c => new JsonFilterDefinition < BsonDocument > ( c ) ) ;
107
+
108
+ var filter = subject . And ( args ) ;
175
109
176
- Assert ( filter , "{ }" ) ;
177
- }
178
-
179
- [ Fact ]
180
- public void And_with_two_empty_clauses ( )
181
- {
182
- var subject = CreateSubject < BsonDocument > ( ) ;
183
- var empty = Builders < BsonDocument > . Filter . Empty ;
184
-
185
- var filter = subject . And ( empty , empty ) ;
186
-
187
- Assert ( filter , "{ }" ) ;
110
+ Assert ( filter , expected ) ;
188
111
}
189
112
190
113
[ Fact ]
0 commit comments