--- /dev/null
+
+(*
+ * implementazione del'interprete MathQL
+ *)
+open Mathql;;
+open Eval;;
+open Utility;;
+open Dbconn;;
+open Pattern;;
+open Union;;
+open Intersect;;
+open Use;;
+open Select;;
+
+(*
+ * inizializzazione della connessione al database
+ *)
+let init () = Dbconn.init ();;
+
+(*
+ * esecuzione di una query
+ *
+ * parametri:
+ * q
+ *
+ * output: string list list; risultato internto formato da uri + contesto.
+ *)
+let rec execute_ex q =
+ match q with
+ MQSelect (apvar, alist, abool) ->
+ select_ex apvar (execute_ex alist) abool
+ | MQUsedBy (alist, asvar) ->
+ use_ex (execute_ex alist) asvar "refObj"
+ | MQUse (alist, asvar) ->
+ use_ex (execute_ex alist) asvar "backPointer"
+ | MQPattern (apreamble, apattern, ext, afragid) ->
+ pattern_ex apreamble apattern ext afragid
+ | MQUnion (l1, l2) ->
+ union_ex (execute_ex l1) (execute_ex l2)
+ | MQIntersect (l1, l2) ->
+ intersect_ex (execute_ex l1) (execute_ex l2)
+;;
+
+(*
+ * converte il risultato interno di una query (uri + contesto)
+ * in un risultato di sole uri
+ *
+ * parametri:
+ * l: string list list;
+ *
+ * output: mqresult;
+ *
+ * note:
+ * il tipo del risultato mantenuto internamente e' diverso dal tipo di risultato
+ * restituito in output poiche', mentre chi effettua le query vuole come risultato
+ * solo le eventuali uri che soddisfano le query stesse, internamente ad una uri
+ * sono associati anche i valori delle variabili che ancora non sono state valutate
+ * perche', ad esempio, si trovano in altri rami dell'albero.
+ *
+ * Esempio:
+ * SELECT x IN USE PATTERN "cic:/**.con" POSITION $a WHERE $a IS MainConclusion
+ * L'albero corrispondente a questa query e':
+ *
+ * SELECT
+ * / | \
+ * x USE IS
+ * / \ /\
+ * PATTERN $a $a MainConclusion
+ *
+ * Nel momento in cui si esegue il ramo USE non sono noti i vincoli sullla variabile $a
+ * percui e' necessario considerare, oltre alle uri, i valori della variabile per i quali
+ * la uri puo' far parte del risultato.
+ *)
+let xres_to_res l =
+ MQStrUri
+ (
+ List.map
+ List.hd
+ (List.tl l)
+ )
+;;
+
+(*
+ *
+ *)
+let execute q =
+ match q with
+ MQList qq -> xres_to_res (execute_ex qq)
+;;
+
+(*
+ * chiusura della connessione al database
+ *)
+let close () = Dbconn.close ();;
+