]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/mathql_interpreter/mqint.ml
new semantics for relation and attribute
[helm.git] / helm / ocaml / mathql_interpreter / mqint.ml
index dce67f86494d9fc3f95006622eae5af340626a51..a0c56e3848835e0cc8a65212d8227ae87e28008c 100644 (file)
 (*
  * implementazione del'interprete MathQL
  *)
+
+(*
+(* FG: ROBA VECCHIA DA BUTTARE (tranne apertura e chiusura database *)
+
 open MathQL;;
 open Eval;;
 open Utility;;
 open Dbconn;;
 open Pattern;;
-open Union;;
+open Union;;*)
 open Intersect;;
-open Diff;;
+(*open Diff;;
 open Sortedby;;
 open Use;;
 open Select;;
+open Letin;;
+open Mathql_semantics;;
+
+
+
+let prop_pool = ref None;;
 
 let fi_to_string fi =
  match fi with
@@ -55,10 +65,38 @@ let fi_to_string fi =
      ")"
 ;;
 
+let see_prop_pool () =
+ let _ = print_endline "eccomi" in
+ List.iter
+  (fun elem -> print_endline (fst elem ^ ": " ^ snd elem))
+  (match !prop_pool with Some l -> l | _ -> print_endline "ciao"; assert false)
+;;
+
 (*
  * inizializzazione della connessione al database
  *)
-let init () = Dbconn.init ();;
+let init () =
+ let _ = Dbconn.init () in
+  let c = pgc () in
+   let res = 
+    c#exec "select name,id from property where ns_id in (select id from namespace where url='http://www.cs.unibo.it/helm/schemas/mattone.rdf#')"
+   in
+    prop_pool := Some
+     (
+      List.map
+       (function
+           a::b::_ -> (a, b)
+         | _       -> print_endline "no"; assert false
+       )
+       res#get_list
+     )
+;;
+
+let get_prop_id prop =
+ if prop="refObj" then "F"
+ else if prop="backPointer" then "B"
+ else List.assoc prop (match !prop_pool with Some l -> l | _ -> assert false)
+;;
 
 (* execute_ex env q                                                   *)
 (*  [env] is the attributed uri environment in which the query [q]    *)
@@ -70,22 +108,41 @@ let rec execute_ex env =
     MQSelect (apvar, alist, abool) ->
      select_ex env apvar (execute_ex env alist) abool
  |  MQUsedBy (alist, asvar) ->
-     use_ex (execute_ex env alist) asvar "F" (*"refObj"*)
+     use_ex (execute_ex env alist) asvar (get_prop_id "refObj")      (* "F" (*"refObj"*) *)
  |  MQUse (alist, asvar) ->
-     use_ex (execute_ex env alist) asvar "B" (*"backPointer"*)
+     use_ex (execute_ex env alist) asvar (get_prop_id "backPointer") (* "B" (*"backPointer"*) *)
  |  MQPattern (apreamble, apattern, afragid) ->
      pattern_ex (apreamble, apattern, afragid)
  |  MQUnion (l1, l2) ->
      union_ex (execute_ex env l1) (execute_ex env l2)
-(*
  |  MQDiff (l1, l2) ->
      diff_ex (execute_ex env l1) (execute_ex env l2)
  |  MQSortedBy (l, o, f) ->
      sortedby_ex (execute_ex env l) o f
-*)
  |  MQIntersect (l1, l2) ->
      intersect_ex (execute_ex env l1) (execute_ex env l2)
- |  MQRVarOccur rvar -> [List.assoc rvar env]
+ |  MQListRVar rvar -> [List.assoc rvar env]
+ |  MQLetIn (lvar, l1, l2) ->
+     let t = Unix.time () in
+      let res =
+       (*CSC: The interesting code *)
+       let _ = letin_ex lvar (execute_ex env l1) in
+        execute_ex env l2
+       (*CSC: end of the interesting code *)
+      in
+       letdispose ();
+       print_string ("LETIN = " ^ string_of_int (List.length res) ^ ": ") ;
+       print_endline (string_of_float (Unix.time () -. t) ^ "s") ;
+       flush stdout ;
+       res
+ |  MQListLVar lvar ->
+     letref_ex lvar
+ |  MQReference l ->
+     let rec build_result = function
+       | [] -> []
+       | s :: tail -> 
+        {uri = s ; attributes = [] ; extra = ""} :: build_result tail
+     in build_result (List.sort compare l)
 ;;
 
 (* Let's initialize the execute in Select, creating a cyclical recursion *)
@@ -128,10 +185,11 @@ let xres_to_res l =
   MQRefs
    (List.map
     (function l ->
-      match Str.split (Str.regexp ":\|#\|/") l with
-         hd::tl -> (
+      (*let _ = print_endline ("DEBUG: (mqint.ml: xres_to_res)" ^ l) in*)
+      match Str.split (Str.regexp ":\|#\|/\|(\|)") l with
+         hd::""::tl -> (
           match List.rev tl with
-             ")"::n::"xpointer(1"::tail    ->
+             n::"1"::"xpointer"::tail    ->
               (
                Some hd,
                List.fold_left
@@ -144,7 +202,7 @@ let xres_to_res l =
                 tail, 
                [MQFC (int_of_string n)]
               )
-          |  ")"::n::m::"xpointer(1"::tail ->
+          |  n::m::"1"::"xpointer"::tail ->
               (
                Some hd,
                List.fold_left
@@ -171,7 +229,7 @@ let xres_to_res l =
                []
               )
       )  
-      |  [] -> assert false
+       | _ -> assert false
     )
     tmp
    )
@@ -192,3 +250,58 @@ let execute q =
  *)
 let close () = Dbconn.close ();;
 
+*****************************************************************************)
+
+let init () = () (* FG: implementare l'apertura del database *)
+
+let close () = () (* FG: implementare la chiusura del database *)
+
+
+(* contexts *****************************************************************)
+
+type svar_context = (MathQL.svar * MathQL.resource_set) list
+
+type rvar_context = (MathQL.rvar * MathQL.resource) list
+
+type group_context = (MathQL.rvar * MathQL.attribute_group) list
+
+type vvar_context = (MathQL.vvar * MathQL.value) list
+
+
+let svars = ref [] (* contesto delle svar *)
+
+let rvars = ref [] (* contesto delle rvar *)
+
+let groups = ref [] (* contesto dei gruppi *)
+
+let vvars = ref [] (* contesto delle vvar introdotte con let-in *)
+
+
+let rec exec_set_exp = function 
+   | MathQL.Ref vexp -> List.map (fun s -> (s,[])) (exec_val_exp vexp)
+   | MathQL.Intersect sexp1 sexp2 -> intersect_ex (exec_set_exp sexp1) (exec_set_exp sexp2)    
+   | _ -> assert false
+   
+(* valuta una MathQL.boole_exp e ritorna un boole *)
+
+and exec_boole_exp = function
+   | MathQL.False      -> false
+   | MathQL.True       -> true
+   | MathQL.Not x      -> not (exec_boole_exp x)
+   | MathQL.And (x, y) -> (exec_boole_exp x) && (exec_boole_exp y)
+   | MathQL.Or (x, y)  -> (exec_boole_exp x) || (exec_boole_exp y)   
+   | _ -> assert false
+
+(* valuta una MathQL.val_exp e ritorna un MathQL.value *)
+
+and exec_val_exp = function
+   | MathQL.Const x -> x
+   | _ -> assert false
+
+(* valuta una MathQL.set_exp nel contesto vuoto e ritorna un MathQL.resource_set *)
+
+(* valuta una MathQL.set_exp e ritorna un MathQL.resource_set *)
+let execute x =
+   svars := []; rvars := []; groups := []; vvars := [];
+   exec_set_exp x
+