type logical_plan =
  | Scan of string (* Table name *)
  | Filter of logical_plan * condition
  | Join of logical_plan * Ast.join_type * logical_plan 
and condition = 
  | Condition of string

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 
  | Ast.Query(Select(_, Some(tables), _)) -> 
      let base_plan = generate_from_clause tables in
      base_plan
  | Ast.Query(Select(_, None, _)) -> failwith "not supported"

(*let evaluate_plan plan =
  match plan with
  | Scan(table) -> 
  | _ -> failwith "Unsupported plan"
*)