@@ -165,3 +165,59 @@ func TestOptimize_filter_len(t *testing.T) {
165165
166166 assert .Equal (t , ast .Dump (expected ), ast .Dump (tree .Node ))
167167}
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