X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Fquery_tree.ml;fp=src%2Fquery_tree.ml;h=018036bf82cb63ae84e5ebcd58d9252d6645353e;hp=79aee48f5c1e3f363fe47742a16b74ad7e303acb;hb=8fbdb25170c3376272f7eec7ef2be8fc008d11f7;hpb=f636f951e53b2503718d1e740ff7d967486d23f8 diff --git a/src/query_tree.ml b/src/query_tree.ml index 79aee48..018036b 100644 --- a/src/query_tree.ml +++ b/src/query_tree.ml @@ -125,25 +125,35 @@ let debug tree q l = Format.pp_print_flush Format.std_formatter (); end +let table_query_tree = Hashtbl.create 97 + let rec eval_query_tree tree start q = let resultat = - match q with - | Start -> start - | Dom -> all_nodes tree - | Tag t -> element_by_tag tree t - | Axis (a,q1) -> let ls = eval_query_tree tree start q1 in - eval_axis tree ls a - | Binop (op,q1,q2)-> begin - let ls1 = eval_query_tree tree start q1 in - let ls2 = eval_query_tree tree start q2 in - match op with - | Union -> union_list tree ls1 ls2 - | Inter -> inter_list tree ls1 ls2 - | Diff -> diff_list tree ls1 ls2 - end + begin + try + Hashtbl.find table_query_tree q + with Not_found -> + let res = + match q with + | Start -> start + | Dom -> all_nodes tree + | Tag t -> element_by_tag tree t + | Axis (a,q1) -> let ls = eval_query_tree tree start q1 in + eval_axis tree ls a + | Binop (op,q1,q2)-> begin + let ls1 = eval_query_tree tree start q1 in + let ls2 = eval_query_tree tree start q2 in + match op with + | Union -> union_list tree ls1 ls2 + | Inter -> inter_list tree ls1 ls2 + | Diff -> diff_list tree ls1 ls2 + end + in + Hashtbl.add table_query_tree q res; + compteur := !compteur + (List.length res); + res + end in debug tree q resultat; - compteur := !compteur + (List.length resultat); resultat -