]> matita.cs.unibo.it Git - helm.git/blob - helm/ocaml/mathql_interpreter/relation.ml
the db connection parameters are now parametrized istead of hard-coded
[helm.git] / helm / ocaml / mathql_interpreter / relation.ml
1 (* Copyright (C) 2000, HELM Team.
2  * 
3  * This file is part of HELM, an Hypertextual, Electronic
4  * Library of Mathematics, developed at the Computer Science
5  * Department, University of Bologna, Italy.
6  * 
7  * HELM is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  * 
12  * HELM is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with HELM; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20  * MA  02111-1307, USA.
21  * 
22  * For details, see the HELM World-Wide-Web page,
23  * http://www.cs.unibo.it/helm/.
24  *)
25
26 open Union;;
27 open Dbconn;;
28 open Utility;;
29 (*
30  * implementazione del comando Relation 
31  *)
32
33
34 let get_prop_id propl =
35  let prop = List.hd propl in
36   if prop="refObj" then "F"
37   else if prop="backPointer" then "B"
38        else assert false
39 ;;
40
41
42
43 let relation_ex rop path rset attl =
44  if path = [] then []
45  else
46  let usek = get_prop_id path in
47
48 let vvar = if attl = [] then "position"
49            else List.hd attl
50 in         
51 (*let (uril,atts) = List.split rset in*)
52 let _ = print_string ("RELATION "^usek)
53 and t = Sys.time () in
54 let result =
55  let c = pgc () in
56
57 let rset_list =  (* lista di singoletti:resource_set di un elemento *)
58 (List.fold_left (fun acc (uri,l) ->
59                          let tv = pgresult_to_string (c#exec ("select id from registry where uri='" ^ uri ^ "'"))
60                          in
61                           let qq = "select uri, context from t" ^ tv ^ " where prop_id='" ^ usek ^ "' order by uri asc"
62                           in
63                            let res = c#exec qq in
64                              
65                             (List.map
66                              (function [uri;context] -> [(uri,[[(vvar,[context])]])]
67                                        | _ -> assert false ) 
68                               res#get_list) @ acc
69                                     )                 
70             [] rset                           
71 )
72 in                    
73                              let rec edup = function
74                                 [] -> []
75                               | rs1::tl -> union_ex rs1 (edup tl) 
76                              in 
77                               edup rset_list 
78                                
79
80 in
81 print_string (" = " ^ string_of_int (List.length result) ^ ": ") ; 
82 print_endline (string_of_float (Sys.time () -. t) ^ "s") ;
83 flush stdout ;
84    result
85 ;;
86