]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/metadata/metadataDb.ml
ocaml 3.09 transition
[helm.git] / helm / ocaml / metadata / metadataDb.ml
index 3d618a52cdb7db8c7a7edf122c38b8650950b311..c5fbb79a832ac642a3584d93a270fd931140c94b 100644 (file)
  * http://helm.cs.unibo.it/
  *)
 
-open Printf
-
-module DB = Dbi_mysql
+open MetadataTypes
 
-let sort_tbl = "refSort"
-let rel_tbl = "refRel"
-let obj_tbl = "refObj"
-let owners_tbl = "owners"
-let conclno_tbl = "no_inconcl_aux"
-let conclno_hyp_tbl = "no_concl_hyp"
-let name_tbl = "objectName"
-
-(* let baseuri = "http://www.cs.unibo.it/helm/schemas/schema-helm#" *)
-let baseuri = ""
-let inconcl_uri = baseuri ^ "InConclusion"
-let mainconcl_uri = baseuri ^ "MainConclusion"
-let mainhyp_uri = baseuri ^ "MainHypothesis"
-let inhyp_uri = baseuri ^ "InHypothesis"
-let inbody_uri = baseuri ^ "InBody"
+open Printf
 
-let prepare_insert (dbh: Dbi.connection) =
-  let insert_owner =
-    dbh#prepare (sprintf "INSERT INTO %s VALUES (\"?\",\"?\")" owners_tbl)
+let execute_insert dbd uri (sort_cols, rel_cols, obj_cols) =
+  let sort_tuples = 
+    List.fold_left (fun s l -> match l with
+      | [`String a; `String b; `Int c; `String d] -> 
+          sprintf "(\"%s\", \"%s\", %d, \"%s\")" a b c d :: s
+      | _ -> assert false )
+    [] sort_cols
   in
-  let insert_sort =
-    dbh#prepare (sprintf "INSERT INTO %s VALUES (\"?\",\"?\",?,\"?\")" sort_tbl)
+  let rel_tuples =
+    List.fold_left (fun s l -> match l with
+      | [`String a; `String b; `Int c] ->
+          sprintf "(\"%s\", \"%s\", %d)" a b c :: s
+      | _ -> assert false)
+    [] rel_cols  
   in
-  let insert_rel =
-    dbh#prepare (sprintf "INSERT INTO %s VALUES (\"?\",\"?\",?)" rel_tbl)
+  let obj_tuples = List.fold_left (fun s l -> match l with
+      | [`String a; `String b; `String c; `Int d] ->
+          sprintf "(\"%s\", \"%s\", \"%s\", %d)" a b c d :: s
+      | [`String a; `String b; `String c; `Null] ->
+          sprintf "(\"%s\", \"%s\", \"%s\", %s)" a b c "NULL" :: s
+      | _ -> assert false)
+    [] obj_cols
   in
-  let insert_obj =
-    dbh#prepare (sprintf "INSERT INTO %s VALUES (\"?\",\"?\",\"?\",?)" obj_tbl)
-  in
-  (insert_owner, insert_sort, insert_rel, insert_obj)
+  if sort_tuples <> [] then
+    begin
+    let query_sort = 
+      sprintf "INSERT %s VALUES %s;" (sort_tbl ()) (String.concat "," sort_tuples) 
+    in
+    ignore (HMysql.exec dbd query_sort)
+    end;
+  if rel_tuples <> [] then
+    begin
+    let query_rel = 
+      sprintf "INSERT %s VALUES %s;" (rel_tbl ()) (String.concat "," rel_tuples) 
+    in
+    ignore (HMysql.exec dbd query_rel)
+    end;
+  if obj_tuples <> [] then
+    begin
+    let query_obj = 
+      sprintf "INSERT %s VALUES %s;" (obj_tbl ()) (String.concat "," obj_tuples) 
+    in
+    ignore (HMysql.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 execute_insert dbh (insert_owner, insert_sort, insert_rel, insert_obj)
-  uri owner (sort_cols, rel_cols, obj_cols)
-=
-  insert_owner#execute [`String uri; `String owner];
-  List.iter insert_sort#execute sort_cols;
-  List.iter insert_rel#execute rel_cols;
-  List.iter insert_obj#execute obj_cols
+let insert_const_no ~dbd l =
+ let data =
+  List.fold_left
+   (fun acc (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
+      (sprintf "(\"%s\", %d, %d, %d)" 
+       (UriManager.string_of_uri uri) no_concl no_hyp no_full) :: acc
+   ) [] l in
+ let insert =
+  sprintf "INSERT INTO %s VALUES %s" (count_tbl ()) (String.concat "," data)
+ in
+  ignore (HMysql.exec dbd insert)
+  
+let insert_name ~dbd l =
+ let data =
+  List.fold_left
+   (fun acc (uri,name,_) -> 
+      (sprintf "(\"%s\", \"%s\")" (UriManager.string_of_uri uri) name) :: acc
+   ) [] l in
+ let insert =
+  sprintf "INSERT INTO %s VALUES %s" (name_tbl ()) (String.concat "," data)
+ in
+  ignore (HMysql.exec dbd insert)
 
-let insert_const_no dbh uri =
-  let inconcl_no =
-    sprintf "INSERT INTO %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_uri mainconcl_uri uri
-  in
-  let concl_hyp =
-    sprintf "INSERT INTO %s
-        SELECT \"%s\",COUNT(DISTINCT h_occurrence)
-        FROM %s
-        WHERE NOT (h_position=\"%s\") AND (source = \"%s\")"
-      conclno_hyp_tbl uri obj_tbl inbody_uri uri
-  in
-  (dbh#prepare inconcl_no)#execute [];
-  (dbh#prepare concl_hyp)#execute []
+type columns =
+  MetadataPp.t list list * MetadataPp.t list list * MetadataPp.t list list
 
-let insert_name ~dbh ~uri ~name =
-  let query =
-    dbh#prepare
-      (sprintf "INSERT INTO %s VALUES (\"%s\", \"%s\")" name_tbl uri name)
-  in
-  query#execute []
+  (* TODO ZACK: verify if an object has already been indexed *)
+let already_indexed _ = false
 
-type dbi_columns =
-  Dbi.sql_t list list * Dbi.sql_t list list * Dbi.sql_t list list
+(***** 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 (HMysql.exec dbd (analyze table)))
+        [name_tbl (); rel_tbl (); sort_tbl (); obj_tbl(); count_tbl()]
+    end
+  
+(***** TENTATIVE HACK FOR THE DB SLOWDOWN - END *******)
 
-let index_constant ~dbh =
-  let query = prepare_insert dbh in
-  fun ~owner ~uri ~body ~ty  ->
-    let name = UriManager.name_of_uri uri in
+let index_obj ~dbd ~uri = 
+  if not (already_indexed uri) then begin
+    eventually_analyze dbd;
+    let metadata = MetadataExtractor.compute_obj uri in
     let uri = UriManager.string_of_uri uri in
-    let metadata = MetadataExtractor.compute ~body ~ty in
-    let columns = MetadataPp.columns_of_metadata ~about:uri metadata in
-    execute_insert dbh query uri owner (columns :> dbi_columns);
-    insert_const_no dbh uri;
-    insert_name ~dbh ~uri ~name
+    let columns = MetadataPp.columns_of_metadata metadata in
+    execute_insert dbd uri (columns :> columns);
+    insert_const_no ~dbd metadata;
+    insert_name ~dbd metadata
+  end
+  
 
-let index_inductive_def ~dbh =
-  let query = prepare_insert dbh in
-  fun ~owner ~uri ~types ->
-    let metadata = MetadataExtractor.compute_ind ~uri ~types in
-    let uri_of (a,b,c) = a in
-    let uris = UriManager.string_of_uri uri :: List.map uri_of metadata in
-    let uri = UriManager.string_of_uri uri in
-    let columns = MetadataPp.columns_of_ind_metadata metadata in
-    execute_insert dbh query uri owner (columns :> dbi_columns);
-    List.iter (insert_const_no dbh) uris;
-    List.iter (fun (uri, name, _) -> insert_name ~dbh ~uri ~name) metadata
+let tables_to_clean =
+  [sort_tbl; rel_tbl; obj_tbl; name_tbl; count_tbl]
 
-let clean ~(dbh: Dbi.connection) ~owner =
+let clean ~(dbd:HMysql.dbd) =
   let owned_uris =  (* list of uris in list-of-columns format *)
-    let query =
-      dbh#prepare (sprintf
-        "SELECT source FROM %s WHERE owner = \"%s\"" owners_tbl owner)
+    let query = sprintf "SELECT source FROM %s" (name_tbl ()) in
+    let result = HMysql.exec dbd query in
+    let uris = HMysql.map result (fun cols ->
+      match cols.(0) with
+      | Some src -> src
+      | None -> assert false) in
+    (* and now some stuff to remove #xpointers and duplicates *)
+    uris
+  in
+  let del_from tbl =
+    let query s = 
+      sprintf "DELETE FROM %s WHERE source LIKE \"%s%%\"" (tbl ()) s 
     in
-    query#execute [];
-    List.map
-      (function [source_col] -> source_col | _ -> assert false)
-      (query#fetchall ())
+    List.iter
+      (fun source_col -> ignore (HMysql.exec dbd (query source_col)))
+      owned_uris
   in
+  List.iter del_from tables_to_clean;
+  owned_uris
+
+let unindex ~dbd ~uri =
+  let uri = UriManager.string_of_uri uri in
   let del_from tbl =
-    let query =
-      dbh#prepare (sprintf "DELETE FROM %s WHERE source LIKE \"?%%\"" tbl)
+    let query tbl =
+      sprintf "DELETE FROM %s WHERE source LIKE \"%s%%\"" (tbl ()) uri
     in
-    query#execute owned_uris
+    ignore (HMysql.exec dbd (query tbl))
   in
-  List.iter del_from
-    [sort_tbl; rel_tbl; obj_tbl; conclno_tbl; conclno_hyp_tbl; name_tbl;
-    owners_tbl]
+  List.iter del_from tables_to_clean