- 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
+ QTreeHash.find table_qtree q
+ with Not_found ->
+ let res =
+ match q.desc with
+ | Start -> start
+ | Dom -> Bitvector.create ~init:true (Naive_tree.size tree)
+ (*let v = Bitvector.create (Naive_tree.size tree) in
+ for i=0 to (Bitvector.length v)-1 do
+ Bitvector.set v i true
+ done;
+ v*)
+ | Tag (t,k) -> element_by_tag tree t k
+ | Axis (a,q1) -> let v = eval_qtree tree start q1 in
+ eval_axis tree v a
+ | Binop (op,q1,q2)-> begin
+ let v1 = eval_qtree tree start q1 in
+ let v2 = eval_qtree tree start q2 in
+ match op with
+ | Union -> Bitvector.union v1 v2
+ | Inter -> Bitvector.inter v1 v2
+ | Diff -> Bitvector.diff v1 v2
+ end
+ in
+ QTreeHash.add table_qtree q res;
+ compteur := !compteur + Bitvector.length res; (*????8*)
+ res
+ end