]> matita.cs.unibo.it Git - helm.git/blob - helm/ocaml/mathql_interpreter/mqint.ml
First very-very-very-very-alfa release of a MathQL Interpreter implemented
[helm.git] / helm / ocaml / mathql_interpreter / mqint.ml
1
2 (*
3  * implementazione del'interprete MathQL
4  *)
5 open Mathql;;
6 open Eval;;
7 open Utility;;
8 open Dbconn;;
9 open Pattern;;
10 open Union;;
11 open Intersect;;
12 open Use;;
13 open Select;;
14
15 (*
16  * inizializzazione della connessione al database
17  *)
18 let init () = Dbconn.init ();;
19
20 (*
21  * esecuzione di una query
22  *
23  * parametri:
24  * q
25  *
26  * output: string list list; risultato internto formato da uri + contesto.
27  *)
28 let rec execute_ex q =
29    match q with
30       MQSelect (apvar, alist, abool) ->
31        select_ex apvar (execute_ex alist) abool
32    |  MQUsedBy (alist, asvar) ->
33        use_ex (execute_ex alist) asvar "refObj"
34    |  MQUse (alist, asvar) ->
35        use_ex (execute_ex alist) asvar "backPointer"
36    |  MQPattern (apreamble, apattern, ext, afragid) ->
37        pattern_ex apreamble apattern ext afragid
38    |  MQUnion (l1, l2) ->
39        union_ex (execute_ex l1) (execute_ex l2)
40    |  MQIntersect (l1, l2) ->
41        intersect_ex (execute_ex l1) (execute_ex l2)
42 ;;
43
44 (*
45  * converte il risultato interno di una query (uri + contesto)
46  * in un risultato di sole uri
47  *
48  * parametri:
49  * l: string list list;
50  *
51  * output: mqresult;
52  *
53  * note:
54  * il tipo del risultato mantenuto internamente e' diverso dal tipo di risultato
55  * restituito in output poiche', mentre chi effettua le query vuole come risultato
56  * solo le eventuali uri che soddisfano le query stesse, internamente ad una uri
57  * sono associati anche i valori delle variabili che ancora non sono state valutate
58  * perche', ad esempio, si trovano in altri rami dell'albero.
59  *
60  * Esempio:
61  * SELECT x IN USE PATTERN "cic:/**.con" POSITION $a WHERE $a IS MainConclusion
62  * L'albero corrispondente a questa query e':
63  *
64  *                  SELECT
65  *                /   |    \
66  *               x   USE    IS
67  *                  /   \    /\
68  *           PATTERN    $a  $a MainConclusion
69  *
70  * Nel momento in cui si esegue il ramo USE non sono noti i vincoli sullla variabile $a
71  * percui e' necessario considerare, oltre alle uri, i valori della variabile per i quali
72  * la uri puo' far parte del risultato.
73  *)
74 let xres_to_res l =
75  MQStrUri
76   (
77    List.map
78     List.hd
79     (List.tl l)
80   )
81 ;;
82
83 (*
84  * 
85  *)
86 let execute q =
87  match q with
88     MQList qq -> xres_to_res (execute_ex qq)
89 ;;
90
91 (*
92  * chiusura della connessione al database
93  *)
94 let close () = Dbconn.close ();;
95