]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/searchEngine/searchEngine.ml
mathql_generator: new constraint format (more type safe)
[helm.git] / helm / searchEngine / searchEngine.ml
index ca507663511a7696d2b182064c3ba4ab94d783cb..6e3b846d2ea3ff6d6db6450e15e6aaabcc7b5ab8 100644 (file)
  * http://cs.unibo.it/helm/.
  *)
 
+module T = MQGTypes
+module U = MQGUtil
+module G = MQueryGenerator
+module C = MQIConn
+
 open Http_types ;;
 
 let debug = true;;
@@ -72,41 +77,29 @@ let int_of_string' = function
         failwith ("Can't parse an int option from string: " ^ s)
 ;;
 
-let is_concl_pos pos =
-  pos = "http://www.cs.unibo.it/helm/schemas/schema-helm#MainConclusion"
-  or
-  pos = "http://www.cs.unibo.it/helm/schemas/schema-helm#InConclusion"
-;;
-
-let is_main_pos pos =
-  pos = "http://www.cs.unibo.it/helm/schemas/schema-helm#MainConclusion"
-  or
-  pos = "http://www.cs.unibo.it/helm/schemas/schema-helm#MainHypothesis"
-;;
-
   (* HTML pretty printers for mquery_generator types *)
 
-let html_of_r_obj (uri, pos, depth) =
+let html_of_r_obj (pos, uri) =
   sprintf
     "<tr><td><input type='checkbox' name='constr_obj' checked='on'/></td><td>%s</td><td>%s</td><td>%s</td></tr>"
-    uri (Str.string_after pos ((String.rindex pos '#') + 1))
-    (if is_main_pos pos then
+    uri (U.text_of_position pos)
+    (if U.is_main_position pos then
       sprintf "<input name='obj_depth' size='2' type='text' value='%s' />"
-        (match depth with Some i -> string_of_int i | None -> "")
+        (U.text_of_depth pos "")
     else
       "<input type=\"hidden\" name=\"obj_depth\" />")
 ;;
 
-let html_of_r_rel (pos, depth) =
+let html_of_r_rel pos =
   sprintf
     "<tr><td><input type='checkbox' name='constr_rel' checked='on'/></td><td>%s</td><td><input name='rel_depth' size='2' type='text' value='%s' /></td></tr>"
-    pos (match depth with Some i -> string_of_int i | None -> "")
+    (U.text_of_position (pos:>T.full_position)) (U.text_of_depth (pos:>T.full_position) "")
 ;;
 
-let html_of_r_sort (pos, depth, sort) =
+let html_of_r_sort (pos, sort) =
   sprintf
     "<tr><td><input type='checkbox' name='constr_sort' checked='on'/></td><td>%s</td><td>%s</td><td><input name='sort_depth' size='2' type='text' value='%s'/></td></tr>"
-    sort pos (match depth with Some i -> string_of_int i | None -> "")
+    (U.text_of_sort sort) (U.text_of_position (pos:>T.full_position)) (U.text_of_depth (pos:>T.full_position) "")
 ;;
 
   (** pretty print a MathQL query result to an HELM theory file *)
@@ -184,37 +177,25 @@ let contype = "Content-Type", "text/html";;
 
 (* SEARCH ENGINE functions *)
 
-let whole_statement_universe =
- ["http://www.cs.unibo.it/helm/schemas/schema-helm#MainConclusion" ;
-  "http://www.cs.unibo.it/helm/schemas/schema-helm#InConclusion" ;
-  "http://www.cs.unibo.it/helm/schemas/schema-helm#MainHypothesis" ;
-  "http://www.cs.unibo.it/helm/schemas/schema-helm#InHypothesis"]
-;;
-
-let only_conclusion_universe =
- ["http://www.cs.unibo.it/helm/schemas/schema-helm#MainConclusion" ;
-  "http://www.cs.unibo.it/helm/schemas/schema-helm#InConclusion"]
-;;
-
-let refine_constraints (constr_obj, constr_rel, constr_sort) =
+let refine_constraints ((constr_obj:T.r_obj list), (constr_rel:T.r_rel list), (constr_sort:T.r_sort list)) =
  function
     "/searchPattern" ->
-      whole_statement_universe,
+      U.universe_for_search_pattern,
        (constr_obj, constr_rel, constr_sort),
        (Some constr_obj, Some constr_rel, Some constr_sort)
   | "/matchConclusion" ->
       let constr_obj' =
        List.map
-        (function (uri,pos,_) -> (uri,pos,None))
+        (function (pos, uri) -> U.set_full_position pos None, uri)
         (List.filter
-          (function (uri,pos,depth) as constr -> is_concl_pos pos)
+          (function (pos, _) -> U.is_conclusion pos)
           constr_obj)
       in
-       only_conclusion_universe,
+       U.universe_for_match_conclusion,
        (*CSC: we must select the must constraints here!!! *)
        (constr_obj',[],[]),(Some constr_obj', None, None)
   | _ -> assert false
-in
+;;
 
 let get_constraints term =
  function
@@ -225,25 +206,16 @@ let get_constraints term =
         | _ -> raise NotAnInductiveDefinition
       in
       let constr_obj =
-       [uri,"http://www.cs.unibo.it/helm/schemas/schema-helm#InHypothesis",
-         None ;
-        uri,"http://www.cs.unibo.it/helm/schemas/schema-helm#MainHypothesis",
-         Some 0
-       ]
+       [(`InHypothesis, uri); (`MainHypothesis (Some 0), uri)]
       in
-      let constr_rel =
-       ["http://www.cs.unibo.it/helm/schemas/schema-helm#MainConclusion",
-        None] in
-      let constr_sort =
-       ["http://www.cs.unibo.it/helm/schemas/schema-helm#MainHypothesis",
-        Some 1, "Prop"]
-      in
-       whole_statement_universe,
+      let constr_rel = [`MainConclusion None] in
+      let constr_sort = [(`MainHypothesis (Some 1), T.Prop)] in
+       U.universe_for_search_pattern,
         (constr_obj, constr_rel, constr_sort), (None,None,None)
   | req_path ->
      let must = MQueryLevels2.get_constraints term in
       refine_constraints must req_path
-in
+;;
 
 (*
   format:
@@ -270,19 +242,19 @@ let add_user_constraints ~constraints
     (* to be used on "obj" *)
   let add_user_must33 user_must must =
     List.map2
-      (fun (b, i) (p1, p2, p3) -> if b then (p1, p2, i) else (p1, p2, None))
+      (fun (b, i) (p, u) -> U.set_full_position p (if b then i else None), u)
       user_must must
   in
     (* to be used on "rel" *)
   let add_user_must22 user_must must =
     List.map2
-      (fun (b, i) (p1, p2) -> if b then (p1, i) else (p1, None))
+      (fun (b, i) p -> U.set_main_position p (if b then i else None))
       user_must must
   in
     (* to be used on "sort" *)
   let add_user_must32 user_must must =
     List.map2
-      (fun (b, i) (p1, p2, p3) -> if b then (p1, i, p3) else (p1, None, p3))
+      (fun (b, i) (p, s) -> U.set_main_position p (if b then i else None), s)
       user_must must
   in
   match Pcre.split ~pat:":" constraints with
@@ -318,20 +290,20 @@ let callback (req: Http_types.request) outchan =
     debug_print (sprintf "Received request: %s" req#path);
     (match req#path with
     | "/execute" ->
-        let mqi_handle = MQIConn.init mqi_flags debug_print in 
+        let mqi_handle = C.init mqi_flags debug_print in 
         let query_string = req#param "query" in
         let lexbuf = Lexing.from_string query_string in
         let query = MQueryUtil.query_of_text lexbuf in
         let result = MQueryInterpreter.execute mqi_handle query in
         let result_string = pp_result result in
-             MQIConn.close mqi_handle;
+             C.close mqi_handle;
         Http_daemon.respond ~body:result_string ~headers:[contype] outchan
     | "/locate" ->
-        let mqi_handle = MQIConn.init mqi_flags debug_print in
+        let mqi_handle = C.init mqi_flags debug_print in
         let id = req#param "id" in
-        let query = MQueryGenerator.locate id in
+        let query = G.locate id in
        let result = MQueryInterpreter.execute mqi_handle query in
-             MQIConn.close mqi_handle;
+             C.close mqi_handle;
         Http_daemon.respond ~headers:[contype] ~body:(pp_result result) outchan
     | "/getpage" ->
         (* TODO implement "is_permitted" *)
@@ -388,7 +360,7 @@ let callback (req: Http_types.request) outchan =
     | "/searchPattern"
     | "/matchConclusion"
     | "/locateInductivePrinciple" ->
-        let mqi_handle = MQIConn.init mqi_flags debug_print in
+        let mqi_handle = C.init mqi_flags debug_print in
         let term_string = req#param "term" in
         let lexbuf = Lexing.from_string term_string in
         let (context, metasenv) = ([], []) in
@@ -613,7 +585,7 @@ List.iter (fun u -> prerr_endline ("<" ^ Netencoding.Url.decode u ^ ">")) tail;
                   raise Chat_unfinished)
             in
             let query =
-             MQueryGenerator.query_of_constraints (Some universe) must'' only'
+             G.query_of_constraints (Some universe) must'' only'
             in
                  let results = MQueryInterpreter.execute mqi_handle query in 
              Http_daemon.send_basic_headers ~code:200 outchan ;
@@ -651,7 +623,7 @@ List.iter (fun u -> prerr_endline ("<" ^ Netencoding.Url.decode u ^ ">")) tail;
               ~headers:[contype]
               ~body:"some implicit variables are still unistantiated :-("
               outchan);
-            MQIConn.close mqi_handle
+            C.close mqi_handle
     | invalid_request ->
         Http_daemon.respond_error ~status:(`Client_error `Bad_request) outchan);
     debug_print (sprintf "%s done!" req#path)