diff --git a/pkg/compiler/compiler_bench_test.go b/pkg/compiler/compiler_bench_test.go index 72daf760..3e50e403 100644 --- a/pkg/compiler/compiler_bench_test.go +++ b/pkg/compiler/compiler_bench_test.go @@ -105,3 +105,28 @@ func BenchmarkForTernary(b *testing.B) { RETURN foo ? TRUE : (FOR i IN 1..5 RETURN i*2) `) } + +func BenchmarkForSort(b *testing.B) { + RunBenchmark(b, ` +LET users = [ + { + active: true, + age: 31, + gender: "m" + }, + { + active: true, + age: 29, + gender: "f" + }, + { + active: true, + age: 36, + gender: "m" + } + ] + FOR u IN users + SORT u.age + RETURN u + `) +} diff --git a/pkg/compiler/compiler_exec_test.go b/pkg/compiler/compiler_exec_test.go index 26db02cc..7e5e0b0c 100644 --- a/pkg/compiler/compiler_exec_test.go +++ b/pkg/compiler/compiler_exec_test.go @@ -1362,5 +1362,72 @@ LET users = [ map[string]any{"active": true, "age": 31, "gender": "m"}, map[string]any{"active": true, "age": 29, "gender": "f"}, }, "Should compile query with DESC SORT statement"), - }) + CaseArray(` LET users = [ + { + active: true, + age: 31, + gender: "m" + }, + { + active: true, + age: 29, + gender: "f" + }, + { + active: true, + age: 31, + gender: "f" + }, + { + active: true, + age: 36, + gender: "m" + } + ] + FOR u IN users + SORT u.age, u.gender + RETURN u`, + []any{ + map[string]any{"active": true, "age": 29, "gender": "f"}, + map[string]any{"active": true, "age": 31, "gender": "f"}, + map[string]any{"active": true, "age": 31, "gender": "m"}, + map[string]any{"active": true, "age": 36, "gender": "m"}, + }, "Should compile query with SORT statement with multiple expressions"), + CaseArray(` + LET users = [ + { + active: true, + age: 31, + gender: "m" + }, + { + active: true, + age: 29, + gender: "f" + }, + { + active: true, + age: 31, + gender: "f" + }, + { + active: true, + age: 36, + gender: "m" + } + ] + FOR u IN users + LET x = "foo" + TEST(x) + SORT u.age, u.gender + RETURN u + `, []any{ + map[string]any{"active": true, "age": 29, "gender": "f"}, + map[string]any{"active": true, "age": 31, "gender": "f"}, + map[string]any{"active": true, "age": 31, "gender": "m"}, + map[string]any{"active": true, "age": 36, "gender": "m"}, + }, "Should define variables and call functions"), + }, runtime.WithFunction("TEST", func(ctx context.Context, args ...core.Value) (core.Value, error) { + return values.None, nil + })) }