]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/mathql_interpreter/mQueryInterpreter.ml
ocaml 3.09 transition
[helm.git] / helm / ocaml / mathql_interpreter / mQueryInterpreter.ml
index 5816a99bc10ae7def653c5558e1faa7a8b9d5f9c..453b1643ce7fec85eef7483312848fde097f0298 100644 (file)
@@ -23,6 +23,9 @@
  * http://cs.unibo.it/helm/.
  *)
 
+(*  AUTOR: Ferruccio Guidi <fguidi@cs.unibo.it>
+ *)
+
 (* contexts *****************************************************************)
 
 type svar_context = (MathQL.svar * MathQL.resource_set) list
@@ -53,7 +56,7 @@ let execute h x =
      if C.set h C.Warn then 
      begin
         C.log h "MQIExecute: waring: reference to undefined variables: ";
-       P.text_of_query (C.log h) q "\n"
+       P.text_of_query (C.log h) "\n" q
      end
    in
    let rec eval_val c = function
@@ -61,7 +64,7 @@ let execute h x =
       | M.True -> U.mql_true
       | M.Const s -> [s]
       | M.Set l -> U.iter (eval_val c) l
-      | M.Test k y1 y2 ->
+      | M.Test (k,y1,y2) ->
          let cand y1 y2 =
            if eval_val c y1 = U.mql_false then U.mql_false else eval_val c y2
         in
@@ -86,16 +89,16 @@ let execute h x =
       | M.VVar i -> begin
          try List.assoc i c.vvars 
          with Not_found -> warn (M.Subj (M.VVar i)); [] end
-      | M.Dot i p -> begin
+      | M.Dot (i,p) -> begin
          try List.assoc p (List.assoc i c.groups) 
-        with Not_found -> warn (M.Subj (M.Dot i p)); [] end
-      | M.Proj None x -> List.map (fun (r, _) -> r) (eval_query c x)
-      | M.Proj (Some p) x -> 
+        with Not_found -> warn (M.Subj (M.Dot (i,p))); [] end
+      | M.Proj (None,x) -> List.map (fun (r, _) -> r) (eval_query c x)
+      | M.Proj ((Some p),x) -> 
          let proj_group_aux (q, v) = if q = p then v else [] in 
          let proj_group a = U.iter proj_group_aux a in
          let proj_set (_, g) = U.iter proj_group g in
          U.iter proj_set (eval_query c x)
-      | M.Ex l y -> 
+      | M.Ex (l,y) -> 
          let rec ex_aux h = function
            | []        -> 
               let d = {c with groups = h} in
@@ -120,32 +123,32 @@ let execute h x =
          C.log h (Printf.sprintf "Stat: %s,%i\n" s (List.length r));
         r
       | M.Count y -> [string_of_int (List.length (eval_val c y))]
-      | M.Align s y -> U.iter (U.align s) (eval_val c y)
+      | M.Align (s,y) -> U.iter (U.align s) (eval_val c y)
    and eval_query c = function
       | M.Empty -> [] 
       | M.Subj x ->
          List.map (fun s -> (s, [])) (eval_val c x)
-      | M.Log _ b x ->
+      | M.Log (_,b,x) ->
          if b then begin
            let t = P.start_time () in
-           P.text_of_query (C.log h) x "\n";
+           P.text_of_query (C.log h) "\n" x;
            let s = P.stop_time t in
-           if C.set h C.Stat then 
+           if C.set h C.Times then 
               C.log h (Printf.sprintf "Log source: %s\n" s);
            eval_query c x
         end else begin
             let s = (eval_query c x) in
            let t = P.start_time () in
-           P.text_of_result (C.log h) s "\n"
+           P.text_of_result (C.log h) "\n" s
            let r = P.stop_time t in
-           if C.set h C.Stat then 
+           if C.set h C.Times then 
               C.log h (Printf.sprintf "Log: %s\n" r);
            s
         end
-      | M.If y x1 x2 ->
+      | M.If (y,x1,x2) ->
          if (eval_val c y) = U.mql_false 
            then (eval_query c x2) else (eval_query c x1)
-      | M.Bin k x1 x2 ->
+      | M.Bin (k,x1,x2) ->
          let f = match k with
            | M.BinFJoin -> U.mql_union
            | M.BinFMeet -> U.mql_intersect
@@ -158,13 +161,13 @@ let execute h x =
       | M.AVar i -> begin
          try [List.assoc i c.avars] 
         with Not_found -> warn (M.AVar i); [] end
-      | M.LetSVar i x1 x2 ->
+      | M.LetSVar (i,x1,x2) ->
         let d = {c with svars = U.set (i, eval_query c x1) c.svars} in
          eval_query d x2
-      | M.LetVVar i y x ->
+      | M.LetVVar (i,y,x) ->
         let d = {c with vvars = U.set (i, eval_val c y) c.vvars} in
          eval_query d x
-      | M.For k i x1 x2 ->
+      | M.For (k,i,x1,x2) ->
          let f = match k with
            | M.GenFJoin -> U.mql_union
            | M.GenFMeet -> U.mql_intersect
@@ -176,11 +179,11 @@ let execute h x =
               f (eval_query d x2) (for_aux t)
         in
         for_aux (eval_query c x1)
-      | M.Add b z x ->
+      | M.Add (b,z,x) ->
          let f = if b then U.mql_prod else U.set_union in
         let g a s = (fst a, f (snd a) (eval_grp c z)) :: s in
         List.fold_right g (eval_query c x) []
-      | M.Property q0 q1 q2 mc ct cfl el pat y ->
+      | M.Property (q0,q1,q2,mc,ct,cfl,el,pat,y) ->
         let subj, mct = 
            if q0 then [], (pat, q2 @ mc, eval_val c y)
                  else (q2 @ mc), (pat, [], eval_val c y)  
@@ -193,7 +196,7 @@ let execute h x =
         let t = P.start_time () in
         let r = MQIProperty.exec h q1 subj cons_true cons_false exp in 
         let s = P.stop_time t in
-         if C.set h C.Stat then 
+         if C.set h C.Times then 
            C.log h (Printf.sprintf "Property: %s,%i\n" s (List.length r));
         r 
       | M.StatQuery x ->
@@ -202,7 +205,7 @@ let execute h x =
         let s = P.stop_time t in
          C.log h (Printf.sprintf "Stat: %s,%i\n" s (List.length r));
         r
-      | M.Select i x y ->
+      | M.Select (i,x,y) ->
          let rec select_aux = function
            | []     -> []
            | h :: t ->
@@ -211,7 +214,7 @@ let execute h x =
                  then select_aux t else h :: select_aux t
         in
         select_aux (eval_query c x)
-      | M.Keep b l x -> 
+      | M.Keep (b,l,x) -> 
          let keep_path (p, v) t = 
            if List.mem p l = b then t else (p, v) :: t in
         let keep_grp a = List.fold_right keep_path a [] in
@@ -231,10 +234,12 @@ let execute h x =
         with Not_found -> warn (M.AVar i); []
    in
    let c = {svars = []; avars = []; groups = []; vvars = []} in
-   let t = P.start_time () in
+   let t = P.start_time () in   
+   if C.set h C.Source then P.text_of_query (C.log h) "\n" x;
    let r = eval_query c x in
+   if C.set h C.Result then P.text_of_result (C.log h) "\n" r;
    let s = P.stop_time t in
-   if C.set h C.Stat then 
+   if C.set h C.Times then 
       C.log h (Printf.sprintf "MQIExecute: %s,%s\n" s 
          (C.string_of_flags (C.flags h)));
    r