une version marché et correcte avec bitvector
[tatoo.git] / src / table_driver.ml
1 open Table
2 open Table_options
3 open Query_tree
4
5 let parse_xpath p =
6   Xpath.Parser.parse (Ulexing.from_utf8_string p)
7
8 let display = ref false
9
10 let main () = 
11   let () = Table_options.parse () in
12   let doc =
13     let fd, close_fd = match !Table_options.input_file with
14         None | Some "-" | Some "/dev/stdin" ->stdin,ignore 
15       | Some input ->
16         let fd = open_in input in fd, fun() -> close_in fd
17     in
18     (*let inc = open_in Sys.argv.(1) in*)
19     let doc = Naive_tree.load_xml_file fd in
20     close_fd(); 
21     doc
22   in
23   let queries =
24     List.map ( fun q ->
25       parse_xpath q) 
26       !Table_options.queries
27   in
28   let t1 = Unix.gettimeofday () in
29   let query_tree_list =
30     List.map (fun query -> compile_xpath query) queries
31   in
32   let mini_qtree_list = 
33     List.map (fun qtree -> Query_tree.minimize_qtree qtree) query_tree_list 
34   in
35   let root = Bitvector.create (Naive_tree.size doc) in
36   Bitvector.set root 0 true;
37   List.iter ( fun q -> 
38     let v = eval_qtree doc root q in
39     if !display then begin
40       let res = decode_bit doc v in
41       
42       print_string "<xml_result num=\"1\" >\n";
43       print_node_list doc res;
44       print_string "</xml_result>\n";
45     end;
46     ()
47   ) mini_qtree_list ;
48   
49   let t2 = Unix.gettimeofday () in
50   let t = (t2 -. t1) *. 1000. in
51   let _ = if !Table_options.count then 
52        Format.fprintf Format.std_formatter "there are %i nodes\nit takes %fms\n" !Query_tree.compteur t;
53   in
54   exit 0
55
56
57 let () = main ()
58
59
60
61
62
63
64
65