diff options
author | Sébastien Dailly <sebastien@dailly.me> | 2025-03-04 21:32:23 +0100 |
---|---|---|
committer | Sébastien Dailly <sebastien@dailly.me> | 2025-03-06 20:57:10 +0100 |
commit | e74106cc7b236fac4913b192af1faab688736f33 (patch) | |
tree | 90829d77f54fc1d63e192678f8dbd39cb5707ff4 | |
parent | 81db1bfd580791910646525e30bc45af34533987 (diff) |
Added the possibility to filter a group function without giving a group
-rw-r--r-- | lib/expression/query.ml | 7 | ||||
-rw-r--r-- | tests/analyser_query_test.ml | 4 | ||||
-rw-r--r-- | tests/expression_query.ml | 13 | ||||
-rw-r--r-- | tests/sql_db.ml | 40 |
4 files changed, 44 insertions, 20 deletions
diff --git a/lib/expression/query.ml b/lib/expression/query.ml index 89c9e0a..e648daf 100644 --- a/lib/expression/query.ml +++ b/lib/expression/query.ml @@ -148,7 +148,12 @@ module Query = TypeBuilder.Make (struct unit = fun nested formatter (expressions, order, range) -> match (expressions, order) with - | [], _ -> () + | [], [] -> () + | [], _ -> + Format.fprintf formatter " OVER (ORDER BY %a%a)" + (print_expression nested) order + (Format.pp_print_option (fun f v -> Format.fprintf f "%s" v)) + range | _, [] -> Format.fprintf formatter " OVER (PARTITION BY %a%a)" (print_expression nested) expressions diff --git a/tests/analyser_query_test.ml b/tests/analyser_query_test.ml index c4ab6d8..16a9bca 100644 --- a/tests/analyser_query_test.ml +++ b/tests/analyser_query_test.ml @@ -166,7 +166,9 @@ let sum_unfiltered = let query, _ = ImportAnalyser.Query.select conf in let expected_query = - "SELECT SUM('previous'.'col_5') AS result_0\nFROM 'source' AS 'previous'" + "SELECT SUM('previous'.'col_5') OVER (ORDER BY 'previous'.'col_1') AS \ + result_0\n\ + FROM 'source' AS 'previous'" in Alcotest.check Alcotest.string "" expected_query query.q diff --git a/tests/expression_query.ml b/tests/expression_query.ml index 367a1e2..a9840b7 100644 --- a/tests/expression_query.ml +++ b/tests/expression_query.ml @@ -154,6 +154,18 @@ let max = assert_equal expected content +let max_no_partition = + "max" >:: fun _ -> + let expr = eval @@ Expr.(max (path ":C") [] [ path ":A"; path ":B" ]) in + + let content = test_expr expr + and expected = + "LAST_VALUE(:C) OVER (ORDER BY :A, :B RANGE BETWEEN UNBOUNDED PRECEDING \ + AND UNBOUNDED FOLLOWING)" + in + + assert_equal expected content + let in_int = "in_int" >:: fun _ -> let expr = @@ -219,6 +231,7 @@ let test_suit = not_in_string; in_int; max; + max_no_partition; counter_no_order; counter_order; cmp; diff --git a/tests/sql_db.ml b/tests/sql_db.ml index 65a93ce..ab402bc 100644 --- a/tests/sql_db.ml +++ b/tests/sql_db.ml @@ -144,7 +144,11 @@ columns = [ [ (0, Integer 2); (2, Integer 100) ]; ] ~expected: - (Ok [ [| ImportCSV.DataType.Integer 1; ImportCSV.DataType.Integer 200 |] ]) + (Ok + [ + [| ImportCSV.DataType.Integer 1; ImportCSV.DataType.Integer 100 |]; + [| ImportCSV.DataType.Integer 2; ImportCSV.DataType.Integer 200 |]; + ]) let sum_group = run_test "sum_group" @@ -213,16 +217,16 @@ columns = [ ] filters = [ - "max(:B, [:C], [:B]) = :B", + "max(:B, [], [:B]) = :B", ] |} ~input: ImportCSV.DataType. [ - [ (0, Integer 1); (1, Integer 100); (2, Integer 0) ]; - [ (0, Integer 2); (1, Integer 150); (2, Integer 0) ]; - [ (0, Integer 3); (1, Integer 200); (2, Integer 0) ]; + [ (0, Integer 1); (1, Integer 100) ]; + [ (0, Integer 2); (1, Integer 150) ]; + [ (0, Integer 3); (1, Integer 200) ]; ] ~expected:(Ok ImportCSV.DataType.[ [| Integer 3 |] ]) @@ -242,16 +246,16 @@ columns = [ filters = [ ":B <> 200", - "max(:B, [:C], [:B]) = :B", + "max(:B, [], [:B]) = :B", ] |} ~input: ImportCSV.DataType. [ - [ (0, Integer 1); (1, Integer 100); (2, Integer 0) ]; - [ (0, Integer 2); (1, Integer 150); (2, Integer 0) ]; - [ (0, Integer 3); (1, Integer 200); (2, Integer 0) ]; + [ (0, Integer 1); (1, Integer 100) ]; + [ (0, Integer 2); (1, Integer 150) ]; + [ (0, Integer 3); (1, Integer 200) ]; ] ~expected:(Ok ImportCSV.DataType.[ [| Integer 2 |] ]) @@ -270,7 +274,7 @@ columns = [ ] filters = [ - "max(:B, [:C], [:B]) = :B", + "max(:B, [], [:B]) = :B", ":B <> 200", ] @@ -278,9 +282,9 @@ filters = [ ~input: ImportCSV.DataType. [ - [ (0, Integer 1); (1, Integer 100); (2, Integer 0) ]; - [ (0, Integer 2); (1, Integer 150); (2, Integer 0) ]; - [ (0, Integer 3); (1, Integer 200); (2, Integer 0) ]; + [ (0, Integer 1); (1, Integer 100) ]; + [ (0, Integer 2); (1, Integer 150) ]; + [ (0, Integer 3); (1, Integer 200) ]; ] ~expected:(Ok []) @@ -301,17 +305,17 @@ columns = [ ] filters = [ - "max(:B, [:C], [:B]) <> :B", - "max(:B, [:C], [:B]) <> :B", + "max(:B, [], [:B]) <> :B", + "max(:B, [], [:B]) <> :B", ] |} ~input: ImportCSV.DataType. [ - [ (0, Integer 1); (1, Integer 100); (2, Integer 0) ]; - [ (0, Integer 2); (1, Integer 150); (2, Integer 0) ]; - [ (0, Integer 3); (1, Integer 200); (2, Integer 0) ]; + [ (0, Integer 1); (1, Integer 100) ]; + [ (0, Integer 2); (1, Integer 150) ]; + [ (0, Integer 3); (1, Integer 200) ]; ] ~expected:(Ok [ [| ImportCSV.DataType.Integer 1 |] ]) |