X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fquery_tree.ml;h=1599c4c7f19b59d39e90ac26b71d0f2fe29d93a8;hb=cfaff4165f266dc2273989c9a62f3fd31c1f57ec;hp=79aee48f5c1e3f363fe47742a16b74ad7e303acb;hpb=f636f951e53b2503718d1e740ff7d967486d23f8;p=tatoo.git diff --git a/src/query_tree.ml b/src/query_tree.ml index 79aee48..1599c4c 100644 --- a/src/query_tree.ml +++ b/src/query_tree.ml @@ -63,7 +63,7 @@ and compile_step_list p = let open Xpath.Ast in match a with Self -> Self - | Attribute -> assert false + | Attribute -> Parent | Child -> Parent | Descendant b -> if not b then (Ancestor false) @@ -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 -