X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fmetadata%2FmetadataDeps.ml;h=71fbcda7dd63286637ea783538fd71af4c4a45df;hb=2b837ca9e298eb44eee95d9ca0e331c577785dcb;hp=b393dbb91a8f0f0a3ca74983758e386c02738c3a;hpb=abd2098b6c4a40b36bb4b950c607eb4b4a7852bc;p=helm.git diff --git a/helm/software/components/metadata/metadataDeps.ml b/helm/software/components/metadata/metadataDeps.ml index b393dbb91..71fbcda7d 100644 --- a/helm/software/components/metadata/metadataDeps.ml +++ b/helm/software/components/metadata/metadataDeps.ml @@ -64,14 +64,17 @@ let direct_deps ~dbd uri = prerr_endline "invalid (direct) refObj metadata row"; assert false in - let do_query tbl = - let res = HMysql.exec dbd (SqlStatements.direct_deps tbl uri) in + let do_query (dbtype, tbl) = + let res = + HSql.exec dbtype dbd (SqlStatements.direct_deps tbl uri dbtype dbd) + in let deps = - HMysql.map res (fun row -> unbox_row (obj_metadata_of_row row)) in + HSql.map res (fun row -> unbox_row (obj_metadata_of_row row)) in deps in - do_query (MetadataTypes.obj_tbl ()) - @ do_query MetadataTypes.library_obj_tbl + do_query (HSql.User, MetadataTypes.obj_tbl ()) + @ do_query (HSql.Library, MetadataTypes.library_obj_tbl) + @ do_query (HSql.Legacy, MetadataTypes.library_obj_tbl) let inverse_deps ~dbd uri = let inv_obj_metadata_of_row = @@ -82,14 +85,62 @@ let inverse_deps ~dbd uri = prerr_endline "invalid (inverse) refObj metadata row"; assert false in - let do_query tbl = - let res = HMysql.exec dbd (SqlStatements.inverse_deps tbl uri) in + let do_query (dbtype, tbl) = + let res = + HSql.exec dbtype dbd (SqlStatements.inverse_deps tbl uri dbtype dbd) + in let deps = - HMysql.map res (fun row -> unbox_row (inv_obj_metadata_of_row row)) in + HSql.map res (fun row -> unbox_row (inv_obj_metadata_of_row row)) in deps in - do_query (MetadataTypes.obj_tbl ()) - @ do_query MetadataTypes.library_obj_tbl + do_query (HSql.User, MetadataTypes.obj_tbl ()) + @ do_query (HSql.Library, MetadataTypes.library_obj_tbl) + @ do_query (HSql.Legacy, MetadataTypes.library_obj_tbl) + +let topological_sort ~dbd uris = + let module OrderedUri = + struct + type t = UriManager.uri + let compare = UriManager.compare + end in + let module Topo = HTopoSort.Make(OrderedUri) in + Topo.topological_sort uris + (fun uri -> fst (List.split (direct_deps ~dbd uri))) + +let sorted_uris_of_baseuri ~dbd baseuri = + let sql_pat = + Pcre.replace ~pat:"([^\\\\])_" ~templ:"$1\\_" baseuri ^ "%" + in + let query dbtype tbl = + Printf.sprintf + ("SELECT source FROM %s WHERE source LIKE \"%s\" " + ^^ HSql.escape_string_for_like dbtype dbd) + tbl sql_pat + in + let map cols = match cols.(0) with + | Some s -> UriManager.uri_of_string s + | _ -> assert false + in + let uris = + List.fold_left + (fun acc (dbtype, table) -> + let result = HSql.exec dbtype dbd (query dbtype table) in + HSql.map result map @ acc) + [] + [HSql.User, MetadataTypes.name_tbl (); + HSql.Library, MetadataTypes.library_name_tbl; + HSql.Legacy, MetadataTypes.library_name_tbl] + in + let sorted_uris = topological_sort ~dbd uris in + let filter_map uri = + let s = + Pcre.replace ~rex:(Pcre.regexp "#xpointer\\(1/1\\)") ~templ:"" + (UriManager.string_of_uri uri) + in + try ignore (Pcre.exec ~rex:(Pcre.regexp"#xpointer") s); None + with Not_found -> Some (UriManager.uri_of_string s) + in + HExtlib.filter_map filter_map sorted_uris module DepGraph = struct @@ -137,7 +188,8 @@ struct function | [] -> () | uri :: tl -> - let suri = UriManager.string_of_uri uri in + let nice = UriManager.strip_xpointer in + let suri = UriManager.string_of_uri (nice uri) in Pp.node suri ~attrs:([ "href", UriManager.string_of_uri uri; "label", label_of_uri uri @@ -148,13 +200,13 @@ struct let neighbs = UriTbl.find adjlist uri in if Lazy.lazy_is_val neighbs.adjacency then begin let adjacency, _ = - HExtlib.split_nth neighbs.shown (Lazy.force neighbs.adjacency) + HExtlib.split_nth "MD 1" neighbs.shown (Lazy.force neighbs.adjacency) in List.iter (fun dest -> let uri1, uri2 = if invert then dest, uri else uri, dest in - Pp.edge (UriManager.string_of_uri uri1) - (UriManager.string_of_uri uri2) fmt) + Pp.edge (UriManager.string_of_uri (nice uri1)) + (UriManager.string_of_uri (nice uri2)) fmt) adjacency; new_nodes := adjacency end; @@ -190,7 +242,7 @@ struct UriTbl.add adjlist dest neighborhood) adjacency; neighbs.shown <- weight; - fst (HExtlib.split_nth weight adjacency), weight + fst (HExtlib.split_nth "MD 2" weight adjacency), weight else begin (* nodes has been expanded at least once *) let adjacency = Lazy.force neighbs.adjacency in let total_nodes = List.length adjacency in @@ -199,7 +251,7 @@ struct let shown_before = neighbs.shown in neighbs.shown <- min (neighbs.shown + fat_increment) total_nodes; let new_shown = neighbs.shown - shown_before in - (fst (HExtlib.split_nth new_shown (List.rev adjacency))), new_shown + (fst (HExtlib.split_nth "MD 3" new_shown (List.rev adjacency))), new_shown end else [], 0 (* all children are already shown *) end