Une version marche bien avec bitvector
[tatoo.git] / src / table.ml
index c40e93b..1c10693 100644 (file)
@@ -1,4 +1,6 @@
 
+let node_compteur = ref 0
+
 type query_tree_desc = Binop of op * query_tree * query_tree
                       | Axis of Xpath.Ast.axis * query_tree
                       | Start 
@@ -150,19 +152,20 @@ let get_descendant tree c v =
     else let n1 = Naive_tree.first_child tree n in
         let j = Naive_tree.preorder tree n in
         Bitvector.set acc j true;
+        incr node_compteur;
         let acc1 = aux n1 acc in
         let n2 = Naive_tree.next_sibling tree n in
         aux n2 acc1
   in       
   let v0 = Bitvector.create (Naive_tree.size tree) in
- (* let v = bitvector_of_nodes tree ln in*)
   if c then begin
     for i = 0 to (Bitvector.length v)-1 do
       if Bitvector.get v i then
        let n = Naive_tree.by_preorder tree i in
        let n1 = Naive_tree.first_child tree n in
        let _ = aux n1 v0 in 
-       Bitvector.set v0 i true
+       Bitvector.set v0 i true;
+       incr node_compteur
     done; end
   else
     for i = 0 to (Bitvector.length v)-1 do
@@ -179,10 +182,10 @@ let get_child tree v =
     else
       let n1 = Naive_tree.next_sibling tree n in
       Bitvector.set acc (Naive_tree.preorder tree n) true;
+      incr node_compteur;
       aux n1 acc
   in
   let v0 = Bitvector.create (Naive_tree.size tree) in
-  (*let v = bitvector_of_nodes tree ln in*)
   for i = 0 to (Bitvector.length v)-1 do
     if Bitvector.get v i then
       let n = Naive_tree.by_preorder tree i in
@@ -198,10 +201,10 @@ let get_followingSibling tree v =
     if n1 == Naive_tree.nil then acc
     else begin
       Bitvector.set acc (Naive_tree.preorder tree n1) true;
+      incr node_compteur;
       aux n1 acc end
   in
   let v0 = Bitvector.create (Naive_tree.size tree) in
- (* let v = bitvector_of_nodes tree ln in*)
   for i = 0 to (Bitvector.length v)-1 do
     if Bitvector.get v i then
       let n = Naive_tree.by_preorder tree i in
@@ -215,27 +218,27 @@ let rec get_firstBling tree n pred =
     
 let get_parent tree v = 
   let v0 = Bitvector.create (Naive_tree.size tree) in
- (* let v = bitvector_of_nodes tree ln in*)
   for i = 0 to (Bitvector.length v)-1 do
     if Bitvector.get v i then
       let n = Naive_tree.by_preorder tree i in
       let n1 = get_firstBling tree n Naive_tree.nil in
       let n2 = Naive_tree.parent_of_first tree n1 in
       if n2 != Naive_tree.nil then begin let j = Naive_tree.preorder tree n2 in
-                                        Bitvector.set v0 j true
+                                        Bitvector.set v0 j true;
+                                        incr node_compteur
       end
   done;
   v0
 
 let get_ancestor tree b v =
   let v0 = Bitvector.create (Naive_tree.size tree) in
- (* let v = bitvector_of_nodes tree ln in  *)
   if b then 
     begin
       for i = (Bitvector.length v)-1 downto 0 do
        if Bitvector.get v i then 
          begin
            Bitvector.set v0 i true;
+           incr node_compteur;
            let n = Naive_tree.by_preorder tree i in
            let n0 = ref n in
            while !n0 != Naive_tree.nil do
@@ -245,6 +248,7 @@ let get_ancestor tree b v =
              if n2 != Naive_tree.nil then begin let j = Naive_tree.preorder tree n2 in
                                                 Bitvector.set v0 j true;
                                                 Bitvector.set v j true;
+                                                node_compteur := !node_compteur + 2; 
              end
            done;
          end
@@ -263,6 +267,7 @@ let get_ancestor tree b v =
            if n2 != Naive_tree.nil then begin let j = Naive_tree.preorder tree n2 in
                                               Bitvector.set v0 j true;
                                               Bitvector.set v j true;
+                                              node_compteur := !node_compteur + 2; 
            end
          done;
        end
@@ -275,10 +280,10 @@ let get_preSibling tree v =
     if n1 == Naive_tree.nil then acc
     else begin
       Bitvector.set acc (Naive_tree.preorder tree n1) true;
+      incr node_compteur;
       aux n1 acc end
   in
   let v0 = Bitvector.create (Naive_tree.size tree) in
- (* let v = bitvector_of_nodes tree ln in*)
   for i = 0 to (Bitvector.length v)-1 do
     if Bitvector.get v i then
       let n = Naive_tree.by_preorder tree i in