aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Dailly <sebastien@dailly.me>2025-03-04 21:32:23 +0100
committerSébastien Dailly <sebastien@dailly.me>2025-03-06 20:57:10 +0100
commite74106cc7b236fac4913b192af1faab688736f33 (patch)
tree90829d77f54fc1d63e192678f8dbd39cb5707ff4
parent81db1bfd580791910646525e30bc45af34533987 (diff)
Added the possibility to filter a group function without giving a group
-rw-r--r--lib/expression/query.ml7
-rw-r--r--tests/analyser_query_test.ml4
-rw-r--r--tests/expression_query.ml13
-rw-r--r--tests/sql_db.ml40
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 |] ])