Compare commits
No commits in common. "5a048a62ac74ee01f4c022ab3dc1b216014f1015" and "82460a22fd75e6969eca3a6535467dbc6b8f8015" have entirely different histories.
5a048a62ac
...
82460a22fd
@ -1,17 +1,31 @@
|
|||||||
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
|
| Filter of logical_plan * condition
|
||||||
| Join of logical_plan * Ast.join_type * logical_plan
|
| Join of logical_plan * Ast.join_type * logical_plan
|
||||||
| Group of logical_plan * string list
|
and condition =
|
||||||
|
| Condition of string
|
||||||
|
|
||||||
let ast_to_logical ast =
|
let rec generate_from_clause tables =
|
||||||
|
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.Select(_, _) -> Project(Scan("table"), "ok")
|
| Ast.Query(Select(_, Some(tables), _)) ->
|
||||||
| _ -> failwith "Query not supported yet"
|
let base_plan = generate_from_clause tables in
|
||||||
|
base_plan
|
||||||
let rec pp_logical_plan plan =
|
| Ast.Query(Select(_, None, _)) -> failwith "not supported"
|
||||||
match plan with
|
|
||||||
| Project(plan2, name) -> pp_logical_plan plan2 ^ name
|
|
||||||
| _ -> "Not supported"
|
|
||||||
|
|
||||||
|
(*let evaluate_plan plan =
|
||||||
|
match plan with
|
||||||
|
| Scan(table) ->
|
||||||
|
| _ -> failwith "Unsupported plan"
|
||||||
|
*)
|
||||||
|
@ -2,10 +2,6 @@
|
|||||||
(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)
|
||||||
|
@ -4,8 +4,11 @@ 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 (=)
|
Alcotest.testable Ast.pp_query equal_ast
|
||||||
|
|
||||||
let test_simple_select () =
|
let test_simple_select () =
|
||||||
let query = "SELECT a, b FROM t" in
|
let query = "SELECT a, b FROM t" in
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
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)
|
|
||||||
]
|
|
Loading…
Reference in New Issue
Block a user