let compteur = ref 0
let table_qtree = QTreeHash.create 97
-
-let all_nodes tree = let root = Naive_tree.root tree in
- let acc1 = get_descendant tree [root] in
- root::acc1
-
-
-let element_by_tag tree tagset kind = let dom = all_nodes tree in
- List.filter (fun c ->
- Tree.NodeKind.is_a (Naive_tree.kind tree c) kind &&
- QNameSet.mem (Naive_tree.tag tree c) tagset ) dom
+
+
+let element_by_tag tree tagset kind = let v = Bitvector.create (Naive_tree.size tree) in
+ for i=0 to (Bitvector.length v)-1 do
+ let c = Naive_tree.by_preorder tree i in
+ if (Tree.NodeKind.is_a (Naive_tree.kind tree c) kind &&
+ QNameSet.mem (Naive_tree.tag tree c) tagset )
+ then Bitvector.set v i true
+ done;
+ v
+
let mk_node q = {desc = q; id = -1; hash = -1}
let res =
match q.desc with
| Start -> start
- | Dom -> all_nodes tree
+ | Dom -> (* Bitvector.create 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 ls = eval_qtree tree start q1 in
- eval_axis tree ls a
+ | Axis (a,q1) -> let v = eval_qtree tree start q1 in
+ eval_axis tree v a
| Binop (op,q1,q2)-> begin
- let ls1 = eval_qtree tree start q1 in
- let ls2 = eval_qtree tree start q2 in
+ let v1 = eval_qtree tree start q1 in
+ let v2 = eval_qtree 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
+ | 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 + (List.length res);
+ compteur := !compteur + Bitvector.length res; (*????8*)
res
end
in
- debug tree q resultat;
+ (* debug tree q resultat;*)
resultat