@@ -165,3 +165,59 @@ func TestOptimize_filter_len(t *testing.T) {
165
165
166
166
assert .Equal (t , ast .Dump (expected ), ast .Dump (tree .Node ))
167
167
}
168
+
169
+ func TestOptimize_filter_0 (t * testing.T ) {
170
+ tree , err := parser .Parse (`filter(users, .Name == "Bob")[0]` )
171
+ require .NoError (t , err )
172
+
173
+ err = optimizer .Optimize (& tree .Node , nil )
174
+ require .NoError (t , err )
175
+
176
+ expected := & ast.BuiltinNode {
177
+ Name : "find" ,
178
+ Arguments : []ast.Node {
179
+ & ast.IdentifierNode {Value : "users" },
180
+ & ast.ClosureNode {
181
+ Node : & ast.BinaryNode {
182
+ Operator : "==" ,
183
+ Left : & ast.MemberNode {
184
+ Node : & ast.PointerNode {},
185
+ Property : & ast.StringNode {Value : "Name" },
186
+ },
187
+ Right : & ast.StringNode {Value : "Bob" },
188
+ },
189
+ },
190
+ },
191
+ Throws : true ,
192
+ }
193
+
194
+ assert .Equal (t , ast .Dump (expected ), ast .Dump (tree .Node ))
195
+ }
196
+
197
+ func TestOptimize_filter_first (t * testing.T ) {
198
+ tree , err := parser .Parse (`first(filter(users, .Name == "Bob"))` )
199
+ require .NoError (t , err )
200
+
201
+ err = optimizer .Optimize (& tree .Node , nil )
202
+ require .NoError (t , err )
203
+
204
+ expected := & ast.BuiltinNode {
205
+ Name : "find" ,
206
+ Arguments : []ast.Node {
207
+ & ast.IdentifierNode {Value : "users" },
208
+ & ast.ClosureNode {
209
+ Node : & ast.BinaryNode {
210
+ Operator : "==" ,
211
+ Left : & ast.MemberNode {
212
+ Node : & ast.PointerNode {},
213
+ Property : & ast.StringNode {Value : "Name" },
214
+ },
215
+ Right : & ast.StringNode {Value : "Bob" },
216
+ },
217
+ },
218
+ },
219
+ Throws : false ,
220
+ }
221
+
222
+ assert .Equal (t , ast .Dump (expected ), ast .Dump (tree .Node ))
223
+ }
0 commit comments