]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/metadata/metadataDb.ml
single INSERT on multiple tuples
[helm.git] / helm / ocaml / metadata / metadataDb.ml
index 6cbfeb1ff12e3a47d464d02da468c2d428258538..a4e6008a8a0ff22e6ebe526e4845d490657bee5b 100644 (file)
@@ -27,45 +27,51 @@ open MetadataTypes
 
 open Printf
 
-let prepare_insert () =
-  (*
-  let insert_owner a b =
-    sprintf "INSERT %s VALUES (\"%s\", \"%s\")" (owners_tbl ())a b
+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  a b c d =
-    sprintf "INSERT %s VALUES (\"%s\", \"%s\", %d, \"%s\")" (sort_tbl ())a b c d
-  in
-  let insert_rel a b c =
-    sprintf "INSERT %s VALUES (\"%s\", \"%s\", %d)" (rel_tbl ()) a b c
-  in
-  let insert_obj a b c d =
-    sprintf "INSERT %s VALUES (\"%s\", \"%s\", \"%s\", %s)" (obj_tbl ()) a b c d
-  in
-  ((*insert_owner, *)insert_sort, insert_rel, insert_obj)
-
-let execute_insert dbd ((*insert_owner, *)insert_sort, insert_rel, insert_obj)
-  uri (sort_cols, rel_cols, obj_cols)
-=
-  (* ignore (Mysql.exec dbd (insert_owner uri owner)); *)
-  List.iter (function
-      | [`String a; `String b; `Int c; `String d] ->
-          ignore (Mysql.exec dbd (insert_sort a b c d))
-      | _ -> assert false)
-    sort_cols;
-  List.iter (function
+  let rel_tuples =
+    List.fold_left (fun s l -> match l with
       | [`String a; `String b; `Int c] ->
-          ignore (Mysql.exec dbd (insert_rel a b c))
+          sprintf "(\"%s\", \"%s\", %d)" a b c :: s
       | _ -> assert false)
-    rel_cols;
-  List.iter (function
+    [] rel_cols  
+  in
+  let obj_tuples = List.fold_left (fun s l -> match l with
       | [`String a; `String b; `String c; `Int d] ->
-          ignore (Mysql.exec dbd (insert_obj a b c (string_of_int d)))
+          sprintf "(\"%s\", \"%s\", \"%s\", %d)" a b c d :: s
       | [`String a; `String b; `String c; `Null] ->
-          ignore (Mysql.exec dbd (insert_obj a b c "NULL"))
+          sprintf "(\"%s\", \"%s\", \"%s\", %s)" a b c "NULL" :: s
       | _ -> assert false)
-    obj_cols
-
+    [] obj_cols
+  in
+  if sort_tuples <> [] then
+    begin
+    let query_sort = 
+      sprintf "INSERT %s VALUES %s;" (sort_tbl ()) (String.concat "," sort_tuples) 
+    in
+    ignore (Mysql.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 (Mysql.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 (Mysql.exec dbd query_obj)
+    end
+  
 let insert_const_no dbd uri =
   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%%\""
@@ -92,7 +98,7 @@ type columns =
 
   (* TODO ZACK: verify if an object has already been indexed *)
 let already_indexed _ = false
-
+(*
 let index_constant ~dbd =
   let query = prepare_insert () in
   fun ~uri ~body ~ty  ->
@@ -110,7 +116,7 @@ let index_inductive_def ~dbd =
   let query = prepare_insert () in
   fun ~uri ~types ->
     if not (already_indexed uri) then begin
-      let metadata = MetadataExtractor.compute_ind ~uri ~types in
+      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 = UriManager.string_of_uri uri in
@@ -119,6 +125,19 @@ let index_inductive_def ~dbd =
       List.iter (insert_const_no dbd) uris;
       List.iter (fun (uri, name, _) -> insert_name ~dbd ~uri ~name) metadata
     end
+*)
+let index_obj ~dbd ~uri = 
+  if not (already_indexed uri) then begin
+    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 = 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 (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]