Compare commits

...

2 Commits

Author SHA1 Message Date
5a048a62ac simplifying 2024-12-13 14:05:36 +00:00
df350c7730 adding a test for logicla plan 2024-12-13 14:05:15 +00:00
4 changed files with 54 additions and 29 deletions

View File

@ -1,31 +1,17 @@
type logical_plan = type logical_plan =
| Project of logical_plan * string
| Scan of string (* Table name *) | Scan of string (* Table name *)
| Filter of logical_plan * condition | Filter of logical_plan
| Join of logical_plan * Ast.join_type * logical_plan | Join of logical_plan * Ast.join_type * logical_plan
and condition = | Group of logical_plan * string list
| Condition of string
let rec generate_from_clause tables = let ast_to_logical ast =
match tables with
| [Ast.Table(name)] -> Scan(name)
| [Ast.Join(left, j_type, right, _)] ->
Join(
generate_from_clause [left],
j_type,
generate_from_clause [right]
)
| _ -> failwith "Unsupported table structure"
let generate_logical_plan ast =
match ast with match ast with
| Ast.Query(Select(_, Some(tables), _)) -> | Ast.Select(_, _) -> Project(Scan("table"), "ok")
let base_plan = generate_from_clause tables in | _ -> failwith "Query not supported yet"
base_plan
| Ast.Query(Select(_, None, _)) -> failwith "not supported"
(*let evaluate_plan plan = let rec pp_logical_plan plan =
match plan with match plan with
| Scan(table) -> | Project(plan2, name) -> pp_logical_plan plan2 ^ name
| _ -> failwith "Unsupported plan" | _ -> "Not supported"
*)

View File

@ -2,6 +2,10 @@
(name test_ast) (name test_ast)
(libraries parser lexer ast alcotest)) (libraries parser lexer ast alcotest))
(test
(name test_logical_plan)
(libraries ast logical_plan alcotest))
(test (test
(name test_parquet) (name test_parquet)
(libraries parquet) (libraries parquet)

View File

@ -4,11 +4,8 @@ let parse query =
let lexbuf = Lexing.from_string query in let lexbuf = Lexing.from_string query in
Parser.main Lexer.read_token lexbuf Parser.main Lexer.read_token lexbuf
let equal_ast ast1 ast2 =
ast1 = ast2
let query_testable = let query_testable =
Alcotest.testable Ast.pp_query equal_ast Alcotest.testable Ast.pp_query (=)
let test_simple_select () = let test_simple_select () =
let query = "SELECT a, b FROM t" in let query = "SELECT a, b FROM t" in

38
test/test_logical_plan.ml Normal file
View File

@ -0,0 +1,38 @@
open Logical_plan
let logical_plan_testable =
let pp_format fmt plan =
Format.fprintf fmt "%s" (Logical_plan.pp_logical_plan plan)
in
Alcotest.testable pp_format (=)
let test_simple_select () =
let ast1 =
Ast.Select(
[
Ast.Column(
Ast.StringLiteral("string"),
None
)
],
Ast.TableExpression(
None,
None,
None
)
)
in
let plan1 = ast_to_logical ast1 in
let plan2 =
Project(Scan("table"), "string")
in
Alcotest.(check logical_plan_testable) "ok" plan1 plan2
let simple_select_set = [ ("Equals", `Quick, test_simple_select) ]
let () =
Alcotest.run "Logical plan tests"
[
("Simple Selects", simple_select_set)
]