X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Fmetadata%2FmetadataDb.ml;h=84e8fad7147e6331b6683081c1f9a3ce4a4a2f8a;hb=71590f4a0cb620a5e98fee3e8d65670271234532;hp=a4e6008a8a0ff22e6ebe526e4845d490657bee5b;hpb=26c3b57c2142bfd2242571109374c3203c7980dd;p=helm.git diff --git a/helm/ocaml/metadata/metadataDb.ml b/helm/ocaml/metadata/metadataDb.ml index a4e6008a8..84e8fad71 100644 --- a/helm/ocaml/metadata/metadataDb.ml +++ b/helm/ocaml/metadata/metadataDb.ml @@ -72,7 +72,33 @@ let execute_insert dbd uri (sort_cols, rel_cols, obj_cols) = ignore (Mysql.exec dbd query_obj) end + +let count_distinct position l = + MetadataConstraints.UriManagerSet.cardinal + (List.fold_left (fun acc d -> + match position with + | `Conclusion -> + (match d with + | `Obj (name,`InConclusion) + | `Obj (name,`MainConclusion _ ) -> + MetadataConstraints.UriManagerSet.add name acc + | _ -> acc) + | `Hypothesis -> + (match d with + | `Obj (name,`InHypothesis) + | `Obj (name,`MainHypothesis _) -> + MetadataConstraints.UriManagerSet.add name acc + | _ -> acc) + | `Statement -> + (match d with + | `Obj (name,`InBody) -> acc + | `Obj (name,_) -> MetadataConstraints.UriManagerSet.add name acc + | _ -> acc) + ) MetadataConstraints.UriManagerSet.empty l) +(* let insert_const_no dbd uri = + let term = CicUtil.term_of_uri uri in + let ty = CicTypeChecker.type_of_aux' let inconcl_no = sprintf "INSERT %s SELECT \"%s\", COUNT(DISTINCT h_occurrence) FROM %s WHERE (h_position=\"%s\" OR h_position=\"%s\") AND source LIKE \"%s%%\"" (conclno_tbl ()) uri (obj_tbl ()) inconcl_pos mainconcl_pos uri @@ -86,10 +112,20 @@ let insert_const_no dbd uri = in ignore (Mysql.exec dbd inconcl_no); ignore (Mysql.exec dbd concl_hyp) - +*) +let insert_const_no dbd (uri,metadata) = + let no_concl = count_distinct `Conclusion metadata in + let no_hyp = count_distinct `Hypothesis metadata in + let no_full = count_distinct `Statement metadata in + let insert = + sprintf "INSERT INTO %s VALUES (\"%s\", %d, %d, %d)" + (count_tbl ()) (UriManager.string_of_uri uri) no_concl no_hyp no_full + in + ignore (Mysql.exec dbd insert) + let insert_name ~dbd ~uri ~name = let query = - sprintf "INSERT %s VALUES (\"%s\", \"%s\")" (name_tbl ()) uri name + sprintf "INSERT %s VALUES (\"%s\", \"%s\")" (name_tbl ()) (UriManager.string_of_uri uri) name in ignore (Mysql.exec dbd query) @@ -102,7 +138,7 @@ let already_indexed _ = false let index_constant ~dbd = let query = prepare_insert () in fun ~uri ~body ~ty -> - if not (already_indexed uri) then begin + if not (already_indexed uri) then beginrel_tbl () let name = UriManager.name_of_uri uri in let uri = UriManager.string_of_uri uri in let metadata = MetadataExtractor.compute ~body ~ty in @@ -126,25 +162,40 @@ let index_inductive_def ~dbd = List.iter (fun (uri, name, _) -> insert_name ~dbd ~uri ~name) metadata end *) + +(***** TENTATIVE HACK FOR THE DB SLOWDOWN - BEGIN *******) +let analyze_index = ref 0 +let eventually_analyze dbd = + incr analyze_index; + if !analyze_index > 30 then + begin + let analyze t = "OPTIMIZE TABLE " ^ t ^ ";" in + List.iter + (fun table -> ignore (Mysql.exec dbd (analyze table))) + [name_tbl (); rel_tbl (); sort_tbl (); obj_tbl(); count_tbl()] + end + +(***** TENTATIVE HACK FOR THE DB SLOWDOWN - END *******) + let index_obj ~dbd ~uri = if not (already_indexed uri) then begin + eventually_analyze dbd; let metadata = MetadataExtractor.compute_obj uri in - let uri_of (a,b,c) = a in - let uris = UriManager.string_of_uri uri :: List.map uri_of metadata in + let uri_of (a,b,c) = (a,c) in let uri = UriManager.string_of_uri uri in let columns = MetadataPp.columns_of_metadata metadata in execute_insert dbd uri (columns :> columns); - List.iter (insert_const_no dbd) uris; + List.iter (insert_const_no dbd) (List.map uri_of metadata); List.iter (fun (uri, name, _) -> insert_name ~dbd ~uri ~name) metadata end let tables_to_clean = - [sort_tbl; rel_tbl; obj_tbl; conclno_tbl; fullno_tbl; name_tbl; hypno_tbl] + [sort_tbl; rel_tbl; obj_tbl; name_tbl; count_tbl] let clean ~(dbd:Mysql.dbd) = let owned_uris = (* list of uris in list-of-columns format *) - let query = sprintf "SELECT source FROM %s" (obj_tbl ()) in + let query = sprintf "SELECT source FROM %s" (name_tbl ()) in let result = Mysql.exec dbd query in let uris = Mysql.map result (fun cols -> match cols.(0) with