diff options
Diffstat (limited to 'lib/analysers/chunk.ml')
-rw-r--r-- | lib/analysers/chunk.ml | 87 |
1 files changed, 63 insertions, 24 deletions
diff --git a/lib/analysers/chunk.ml b/lib/analysers/chunk.ml index cefa6d8..b09f311 100644 --- a/lib/analysers/chunk.ml +++ b/lib/analysers/chunk.ml @@ -43,9 +43,24 @@ let add_parameters : t -> ImportDataTypes.Value.t Seq.t -> unit = fun t p -> Queue.add_seq t.parameters p module Table = ImportDataTypes.Table -module Q = ImportExpression.Query open StdLabels +let add_expression : + repr:(Format.formatter -> 'a -> unit) -> + t -> + 'a ImportExpression.T.t -> + unit = + fun ~repr group expression -> + let formatter = Format.formatter_of_buffer group.b in + Format.pp_print_char formatter '('; + let queue = + ImportExpression.Query.query_of_expression ImportExpression.Query.BindParam + formatter repr expression + in + Format.pp_print_char formatter ')'; + Format.pp_print_flush formatter (); + add_parameters group (Queue.to_seq queue) + (** Extract the informations from the dependancies. We get two informations here : @@ -57,20 +72,34 @@ let join_external : fun ~conf ~join_buffer external_ -> let extern_table = Table.name external_.target in - let formatter = Format.formatter_of_buffer join_buffer.b in - Format.fprintf formatter "\nLEFT JOIN '%s' AS '%s' ON %t = %s" extern_table - external_.target.name - (Printers.prepare_key ~f:(fun f -> - let q = - Q.query_of_expression Q.BindParam f (Printers.path ~conf) - external_.intern_key - in - - add_parameters join_buffer (Queue.to_seq q))) - (Table.print_column external_.ImporterSyntax.Extern.target - ("key_" ^ external_.ImporterSyntax.Extern.target.name)); - - Format.pp_print_flush formatter () + add_string join_buffer "\nLEFT JOIN '"; + add_string join_buffer extern_table; + add_string join_buffer "' AS '"; + add_string join_buffer external_.target.name; + add_string join_buffer "' ON "; + add_string join_buffer + (Format.asprintf "%t = %s" + (Printers.prepare_key ~f:(fun f -> + let q = + ImportExpression.Query.query_of_expression + ImportExpression.Query.BindParam f (Printers.path ~conf) + external_.intern_key + in + + add_parameters join_buffer (Queue.to_seq q))) + (Table.print_column external_.ImporterSyntax.Extern.target + ("key_" ^ external_.ImporterSyntax.Extern.target.name))); + + (* Add the filters given for this external in the query *) + let table = external_.ImporterSyntax.Extern.target + and filters = external_.ImporterSyntax.Extern.filters in + List.iter filters ~f:(fun f -> + add_string join_buffer " AND "; + add_expression + ~repr:(fun formatter column -> + Format.fprintf formatter "%s" + (Table.print_column table ("col_" ^ string_of_int column))) + join_buffer f) (** Create the from part of the query, adding all the required externals (even when not required) @@ -90,16 +119,26 @@ let create_from_statement_of_chunck : (* Add the externals in the query *) List.iter externals ~f:(join_external ~conf ~join_buffer:c) -let add_expression : - conf:ImporterSyntax.t -> +(** Add a list of expressions into the group *) +let add_expressions : + repr:(Format.formatter -> 'a -> unit) -> + sep:string -> t -> - ImportDataTypes.Path.t ImportExpression.T.t -> + 'a ImportExpression.T.t list -> unit = - fun ~conf group expression -> + fun ~repr ~sep group exppressions -> let formatter = Format.formatter_of_buffer group.b in - let queue = - ImportExpression.Query.query_of_expression ImportExpression.Query.BindParam - formatter (Printers.path ~conf) expression + let () = + Format.pp_print_list + ~pp_sep:(fun f () -> Format.pp_print_string f sep) + (fun formatter column -> + Format.pp_print_char formatter '('; + let seq = + ImportExpression.Query.query_of_expression + ImportExpression.Query.BindParam formatter repr column + in + Format.pp_print_char formatter ')'; + Queue.transfer seq group.parameters) + formatter exppressions in - Format.pp_print_flush formatter (); - add_parameters group (Queue.to_seq queue) + Format.pp_print_flush formatter () |