diff options
Diffstat (limited to 'lib/analysers/dependency.ml')
-rw-r--r-- | lib/analysers/dependency.ml | 66 |
1 files changed, 48 insertions, 18 deletions
diff --git a/lib/analysers/dependency.ml b/lib/analysers/dependency.ml index 38bc23c..8c969fe 100644 --- a/lib/analysers/dependency.ml +++ b/lib/analysers/dependency.ml @@ -1,7 +1,5 @@ open StdLabels module IntSet = ImportContainers.IntSet -module Table = ImportDataTypes.Table -module Path = ImportDataTypes.Path module Expression = ImportExpression.T (* @@ -19,13 +17,14 @@ type deps = (ImportContainers.Source.t * ImportContainers.Source.t list) list type key = { name : string; - expression : Path.column Expression.t; + expression : ImportDataTypes.Path.column Expression.t; columns : ImportContainers.IntSet.t Lazy.t; + filters : ImportDataTypes.Path.column ImportExpression.T.t list; } [@@deriving show, eq] type t = { - table : Table.t; + table : ImportDataTypes.Table.t; columns : IntSet.t; keys : key list; } @@ -47,8 +46,8 @@ type build_map = t ImportContainers.Externals.t - [of_path] is need to extract the qualified source from any kind of path. *) type 'a expression_extractor = { - to_mapping : t -> Path.column -> t; - of_path : 'a -> string option * Path.column; + to_mapping : t -> ImportDataTypes.Path.column -> t; + of_path : 'a -> string option * ImportDataTypes.Path.column; } (** [add_path_in_map f parent path ] Extract the column from element [path] and @@ -112,9 +111,15 @@ let add_columns_in_map : This function is called for each path declared inside the expression. *) let add_dependancies : - conf:ImporterSyntax.t -> ImporterSyntax.Extern.t -> deps -> Path.t -> deps = + conf:ImporterSyntax.t -> + ImporterSyntax.Extern.t -> + deps -> + ImportDataTypes.Path.t -> + deps = fun ~conf extern graph path -> - let source_table = ImporterSyntax.get_table_for_name conf path.Path.alias in + let source_table = + ImporterSyntax.get_table_for_name conf path.ImportDataTypes.Path.alias + in let source = ImportContainers.Source.from_table source_table in let target = ImportContainers.Source.from_table extern.target in @@ -134,7 +139,10 @@ let add_external_in_map : let _ = Expression.fold_values extern.intern_key ~init:() ~f:(fun () path -> try - let _ = ImporterSyntax.get_table_for_name conf path.Path.alias in + let _ = + ImporterSyntax.get_table_for_name conf + path.ImportDataTypes.Path.alias + in () with | Not_found -> ( @@ -147,16 +155,19 @@ let add_external_in_map : raise (ImportErrors.Unknown_source root.name))) in + let columns () = + let f = fun acc k -> ImportContainers.IntSet.add k acc in + Expression.fold_values extern.extern_key ~f + ~init:ImportContainers.IntSet.empty + in + (* Create the new key with all the expression and all the columns inside it *) let new_key = { - name = extern.target.Table.name; + name = extern.target.ImportDataTypes.Table.name; expression = extern.extern_key; - columns = - lazy - (Expression.fold_values extern.extern_key - ~f:(fun acc k -> ImportContainers.IntSet.add k acc) - ~init:ImportContainers.IntSet.empty); + columns = Lazy.from_fun columns; + filters = extern.filters; } in let build_map = @@ -182,7 +193,7 @@ let add_external_in_map : ~f: { of_path = - (fun Path.{ alias; column } -> + (fun ImportDataTypes.Path.{ alias; column } -> let table = ImporterSyntax.get_table_for_name conf alias in (Some table.name, column)); to_mapping = @@ -197,7 +208,8 @@ let mapper = to_mapping = (fun mapping column -> { mapping with columns = IntSet.add column mapping.columns }); - of_path = (fun ({ alias; column } : Path.t) -> (alias, column)); + of_path = + (fun ({ alias; column } : ImportDataTypes.Path.t) -> (alias, column)); } let get_mapping : ImporterSyntax.t -> build_map * deps = @@ -221,7 +233,24 @@ let get_mapping : ImporterSyntax.t -> build_map * deps = in let map, graph = List.fold_left conf.externals ~init ~f:(fun map extern -> - add_external_in_map ~conf extern map) + let map, graph = add_external_in_map ~conf extern map in + + (* Also add the filters in the externals. The column are not defined as + a full path, with table and column, but only with a column. We need + to transform them to make them present as the same as the others *) + let table = + ImporterSyntax.get_table_for_name conf (Some extern.target.name) + in + let path_filters = + List.map extern.filters ~f:(fun expression -> + Expression.map + ~f:(fun column -> + ImportDataTypes.Path.{ alias = Some table.name; column }) + expression) + in + let map = add_columns_in_map ~conf ~f:mapper path_filters map in + + (map, graph)) in (* Now we don’t bother anymore with the graph and it’s dependency, we just @@ -233,6 +262,7 @@ let get_mapping : ImporterSyntax.t -> build_map * deps = |> add_columns_in_map ~conf ~f:mapper conf.filters |> add_columns_in_map ~conf ~f:mapper conf.uniq in + (map, graph) let get_process_order : ImporterSyntax.t -> t list = |