Skip to content

Commit cfc56e4

Browse files
author
Gleb Patsiia
committed
remove -enum-poly-variant
make variants are generated by the default until custom module is specified
1 parent b842bd3 commit cfc56e4

File tree

5 files changed

+394
-60
lines changed

5 files changed

+394
-60
lines changed

lib/sql.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,9 @@ module Meta = struct
249249
let of_list list = List.fold_left (fun map (k, v) -> StringMap.add k v map) StringMap.empty list
250250

251251
let empty () = StringMap.empty
252-
253252
let find_opt k map = StringMap.find_opt map k
253+
254+
let mem k map = StringMap.mem map k
254255
let pp fmt t =
255256
if StringMap.is_empty t then
256257
Format.fprintf fmt "{}"

src/cli.ml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ let main () =
127127
"-show-tables", Arg.Unit Tables.print_all, " Show all current tables";
128128
"-show-table", Arg.String Tables.print1, "<name> Show specified table";
129129
"-allow-write-notnull-null", Arg.Unit (fun () -> Sqlgg_config.allow_write_notnull_null true), "Treat writing NULL to NOT NULL columns as error";
130-
"-enum-poly-variant", Arg.Unit (fun () -> Sqlgg_config.enum_as_poly_variant := true), " Represent enums as variants in generated code";
131130
"-dialect", Arg.String set_dialect, "mysql|sqlite|postgresql|tidb Set SQL dialect - will only allow this dialect's features in SQL queries";
132131
"-no-check", Arg.String set_no_check, "{all|<feature>{,<feature>}+} Disable dialect feature checks (possible features: collation|join_on_subquery|create_table_as_select) - do not enforce dialect feature checks";
133132
"-", Arg.Unit (fun () -> work "-"), " Read sql from stdin";

src/gen_caml.ml

Lines changed: 66 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -171,23 +171,22 @@ let get_column index attr =
171171
let format_t_get_column type_name =
172172
sprintf "(T.get_column_%s%s stmt %u)" type_name nullable_suffix index
173173
in
174-
let rec format_column_expr attr =
175-
match attr with
176-
| { domain={ t = Union {ctors; _}; _ }; _ } when !Sqlgg_config.enum_as_poly_variant ->
177-
sprintf "(%s.get_column%s stmt %u)" (get_enum_name ctors) nullable_suffix index
178-
| { domain={ t = Union _; _ }; _ } as c ->
179-
format_column_expr { c with domain = { c.domain with t = Text } }
180-
| _ ->
181-
match Sql.Meta.find_opt attr.meta "module" with
182-
| None ->
183-
let lang_type_name = L.as_lang_type attr.domain in
184-
format_t_get_column lang_type_name
185-
| Some m ->
174+
let format_column_expr attr =
175+
match Sql.Meta.find_opt attr.meta "module" with
176+
| Some m ->
186177
let runtime_repr_name = L.as_runtime_repr_name attr.domain in
187178
let inner_get_column_expr = format_t_get_column runtime_repr_name in
188179
let get_column = "get_column" in
189180
let get_column_name = get_column |> Sql.Meta.find_opt attr.meta |> Option.default get_column in
190181
sprintf "(%s.%s%s %s)" m get_column_name nullable_suffix inner_get_column_expr
182+
| None ->
183+
begin match attr.domain with
184+
| { t = Union { ctors; _ }; _ } ->
185+
sprintf "(%s.get_column%s stmt %u)" (get_enum_name ctors) nullable_suffix index
186+
| _ ->
187+
let lang_type_name = L.as_lang_type attr.domain in
188+
format_t_get_column lang_type_name
189+
end
191190
in
192191
format_column_expr attr
193192

@@ -286,28 +285,32 @@ let match_variant_pattern i name args ~is_poly =
286285
else
287286
variant_name ^ " (" ^ String.concat ", " patterns ^ ")"
288287

289-
let rec set_param ~meta index param =
288+
let set_param ~meta index param =
290289
let nullable = is_param_nullable param in
291290
let pname = show_param_name param index in
292291
let ptype = show_param_type param in
293292
let set_param_nullable v r = output "begin match %s with None -> T.set_param_null p | Some %s -> %s end;" pname v r in
294-
match param with
295-
| { typ = { t=Union _; _}; _ } as c when not !Sqlgg_config.enum_as_poly_variant -> set_param ~meta index { c with typ = { c.typ with t = Text } }
296-
| { typ = { t=Union {ctors; _}; _}; _ } when nullable -> set_param_nullable "v" @@ (get_enum_name ctors) ^ ".set_param p v"
297-
| { typ = { t=Union {ctors; _}; _ }; _ } -> output "%s.set_param p %s;" (get_enum_name ctors) pname
298-
| param' ->
299-
let module_ = Sql.Meta.find_opt meta "module" in
300-
match module_ with
301-
| None -> if nullable then set_param_nullable "v" @@ sprintf "T.set_param_%s %s" (show_param_type param') "p v"
302-
else output "T.set_param_%s p %s;" ptype pname
303-
| Some m ->
293+
let module_ = Sql.Meta.find_opt meta "module" in
294+
match module_ with
295+
| Some m ->
304296
let set_param = "set_param" in
305297
let set_param_name = set_param |> Sql.Meta.find_opt meta |> Option.default set_param in
306-
let runtime_repr_name = L.as_runtime_repr_name param'.typ in
298+
let runtime_repr_name = L.as_runtime_repr_name param.typ in
307299
if nullable then
308-
set_param_nullable pname @@ sprintf "T.set_param_%s p (%s);" runtime_repr_name (sprintf "%s.%s %s" m set_param_name pname)
300+
set_param_nullable pname @@ sprintf "T.set_param_%s p (%s);" runtime_repr_name (sprintf "%s.%s %s" m set_param_name pname)
309301
else
310302
output "T.set_param_%s p (%s);" runtime_repr_name (sprintf "%s.%s %s" m set_param_name pname)
303+
| None ->
304+
match param with
305+
| { typ = { t=Union { ctors; _ }; _ }; _ } when nullable ->
306+
set_param_nullable "v" @@ (get_enum_name ctors) ^ ".set_param p v"
307+
| { typ = { t=Union { ctors; _ }; _ }; _ } ->
308+
output "%s.set_param p %s;" (get_enum_name ctors) pname
309+
| param' ->
310+
if nullable then
311+
set_param_nullable "v" @@ sprintf "T.set_param_%s %s" (show_param_type param') "p v"
312+
else
313+
output "T.set_param_%s p %s;" ptype pname
311314

312315
let set_var index var =
313316
let execute_generators = List.iter (fun f -> f ()) in
@@ -532,16 +535,16 @@ let output_params_binder index vars =
532535

533536

534537
let make_to_literal meta typ =
535-
let rec go domain = match domain with
536-
| { Type.t = Union _; _ } when not !Sqlgg_config.enum_as_poly_variant -> go { domain with Type.t = Text }
537-
| { Type.t = Union { ctors; _ }; _ } -> sprintf "%s.to_literal" (get_enum_name ctors)
538-
| t -> match Sql.Meta.find_opt meta "module" with
539-
| None -> sprintf "T.Types.%s.to_literal" (Sql.Type.type_name t)
540-
| Some m ->
541-
let set_param = "set_param" in
542-
let set_param_name = set_param |> Sql.Meta.find_opt meta |> Option.default set_param in
543-
sprintf "(fun v -> T.Types.%s.%s_to_literal (%s.%s v))" (Sql.Type.type_name t) (L.as_runtime_repr_name t) m set_param_name
544-
in go typ
538+
match Sql.Meta.find_opt meta "module" with
539+
| Some m ->
540+
let set_param = "set_param" in
541+
let set_param_name = set_param |> Sql.Meta.find_opt meta |> Option.default set_param in
542+
let trait_type_name = match typ.Type.t with | Union _ -> "Text" | StringLiteral _ -> "Text" | _ -> Sql.Type.type_name typ in
543+
sprintf "(fun v -> T.Types.%s.%s_to_literal (%s.%s v))" trait_type_name (L.as_runtime_repr_name typ) m set_param_name
544+
| None ->
545+
match typ.Type.t with
546+
| Union { ctors; _ } -> sprintf "%s.to_literal" (get_enum_name ctors)
547+
| _ -> sprintf "T.Types.%s.to_literal" (Sql.Type.type_name typ)
545548

546549
let gen_in_substitution meta var =
547550
if Option.is_none var.id.label then failwith "empty label in IN param";
@@ -742,25 +745,34 @@ let generate_enum_modules stmts =
742745
| Datetime | Decimal | Any | StringLiteral _ | Json_path | One_or_all -> None
743746
in
744747

745-
let schemas_to_enums schemas = schemas |> List.filter_map (fun { domain; _ } -> get_enum domain) in
746-
747-
let rec vars_to_enums vars = List.concat_map (function
748-
| Single ({ typ; _ }, _)
749-
| SingleIn ({ typ; _ }, _) -> typ |> get_enum |> option_list
750-
| SharedVarsGroup (vars, _)
751-
| OptionActionChoice (_, vars, _, _)
752-
| ChoiceIn { vars; _ } -> vars_to_enums vars
753-
| Choice (_, ctor_list) ->
754-
List.concat_map ( function
755-
| Simple (_, vars) -> Option.map vars_to_enums vars |> option_list |> List.concat
756-
| Verbatim _ -> []
757-
) ctor_list
758-
| TupleList (_, ValueRows { types; _ }) ->
759-
List.concat_map (fun typ -> typ |> get_enum |> option_list) types
760-
| TupleList (_, Where_in (types, _, _)) ->
761-
List.concat_map (fun (typ, _) -> typ |> get_enum |> option_list) types
762-
| TupleList (_, Insertion schema) -> schemas_to_enums schema
763-
) vars in
748+
let meta_has_module m = Sql.Meta.mem m "module" in
749+
750+
let schemas_to_enums schemas =
751+
List.filter_map (fun { domain; meta; _ } ->
752+
if meta_has_module meta then None else get_enum domain
753+
) schemas
754+
in
755+
756+
let rec vars_to_enums vars =
757+
let enum_opt typ = typ |> get_enum |> option_list in
758+
let enum_opt_with_meta typ meta = if meta_has_module meta then [] else enum_opt typ in
759+
List.concat_map (function
760+
| Single ({ typ; _ }, meta)
761+
| SingleIn ({ typ; _ }, meta) -> enum_opt_with_meta typ meta
762+
| SharedVarsGroup (vars, _)
763+
| OptionActionChoice (_, vars, _, _)
764+
| ChoiceIn { vars; _ } -> vars_to_enums vars
765+
| Choice (_, ctor_list) ->
766+
List.concat_map ( function
767+
| Simple (_, vars) -> Option.map vars_to_enums vars |> option_list |> List.concat
768+
| Verbatim _ -> []
769+
) ctor_list
770+
| TupleList (_, ValueRows { types; _ }) ->
771+
List.concat_map enum_opt types
772+
| TupleList (_, Where_in (types, _, _)) ->
773+
List.concat_map (fun (typ, meta) -> enum_opt_with_meta typ meta) types
774+
| TupleList (_, Insertion schema) -> schemas_to_enums schema
775+
) vars in
764776

765777
Hashtbl.reset enums_hash_tbl;
766778

@@ -794,8 +806,6 @@ let generate_enum_modules stmts =
794806
end 0 result in
795807
()
796808
)
797-
798-
let generate_enum_modules stmts = if !Sqlgg_config.enum_as_poly_variant then generate_enum_modules stmts
799809

800810
let generate ~gen_io name stmts =
801811
(*

src/sqlgg_config.ml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ let gen_header : [ `Full | `Without_timestamp | `Static ] option ref = ref (Some
1717

1818
let include_category : [ `All | `None | `Only of Stmt.category list | `Except of Stmt.category list ] ref = ref `All
1919

20-
let enum_as_poly_variant = ref false
21-
2220
let no_check_features: Dialect.feature list ref = ref []
2321

2422
let set_no_check_features l = no_check_features := l

0 commit comments

Comments
 (0)