diff --git a/lib/logical_plan.ml b/lib/logical_plan.ml index 5ca7384..ef831e0 100644 --- a/lib/logical_plan.ml +++ b/lib/logical_plan.ml @@ -1,17 +1,34 @@ type logical_plan = - | Project of logical_plan * string + | Project of logical_plan * string list | Scan of string (* Table name *) | Filter of logical_plan | Join of logical_plan * Ast.join_type * logical_plan | Group of logical_plan * string list -let ast_to_logical ast = +let rec ast_to_logical ast = match ast with - | Ast.Select(_, _) -> Project(Scan("table"), "ok") + | Ast.Select(cols, _) -> Project(Scan("table"), (columns_to_logical cols)) | _ -> failwith "Query not supported yet" +and columns_to_logical columns = + let rec aux cols acc = + match cols with + | [] -> acc + | Ast.Column(col,_)::l -> + let s = expression_to_logical col in + aux l (s::acc) + | _ -> failwith "Not supported" + in + aux columns [] + +and expression_to_logical exp = + match exp with + | Ast.Ref(s) -> s + | _ -> failwith "Expression not supported yet" + + let rec pp_logical_plan plan = match plan with - | Project(plan2, name) -> pp_logical_plan plan2 ^ name + | Project(plan2, name) -> pp_logical_plan plan2 ^ (String.concat ";" name) | _ -> "Not supported" diff --git a/test/test_logical_plan.ml b/test/test_logical_plan.ml index 586f486..b38fb37 100644 --- a/test/test_logical_plan.ml +++ b/test/test_logical_plan.ml @@ -25,7 +25,7 @@ let test_simple_select () = in let plan1 = ast_to_logical ast1 in let plan2 = - Project(Scan("table"), "string") + Project(Scan("table"), ["string"]) in Alcotest.(check logical_plan_testable) "ok" plan1 plan2