]> matita.cs.unibo.it Git - helm.git/blob - helm/ocaml/mathql_interpreter/relation.ml
After add relation.ml relation.mli
[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
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 = Unix.time () in
54 let result =
55  let c = pgc () in
56  List.sort
57 compare      
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                             (List.map
65                              (function [uri;context] -> (uri,[[(vvar,[context])]])
66                                        | _ -> assert false ) 
67                               res#get_list) @ acc
68             )                 
69             [] rset                           
70 )
71 (*Come faccio a togliere i duplicati????*)       
72
73
74 in
75 print_string (" = " ^ string_of_int (List.length result) ^ ": ") ; 
76 print_endline (string_of_float (Unix.time () -. t) ^ "s") ;
77 flush stdout ;
78    result
79 ;;
80