Une version marche bien avec bitvector
[tatoo.git] / src / table.ml
index 64d4103..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 
@@ -144,24 +146,34 @@ let get_list_ordred tree ll =
   let l1 = List.fold_left (fun acc l -> merge_list tree acc l) [] ll in
   List.rev l1
 
-let get_descendant tree v =
+let get_descendant tree v =
   let rec aux n acc =
     if n == Naive_tree.nil then acc
     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*)
-  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 ();
-  done;
+  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;
+       incr node_compteur
+    done; end
+  else
+    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 ()
+    done;
   v0
 
 let get_child tree v =
@@ -170,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
@@ -189,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
@@ -206,36 +218,60 @@ 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 v =
+let get_ancestor tree v =
   let v0 = Bitvector.create (Naive_tree.size tree) in
- (* let v = bitvector_of_nodes tree ln in  *)
-
-  for i = (Bitvector.length v)-1 downto 0 do
-    if Bitvector.get v i then
-      let n = Naive_tree.by_preorder tree i in
-      let n0 = ref n in
-      while !n0 != Naive_tree.nil do
-       let n1 = get_firstBling tree !n0 Naive_tree.nil in
-       let n2 = Naive_tree.parent_of_first tree n1 in
-       n0 := n2;
-       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;
-       end
+  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
+             let n1 = get_firstBling tree !n0 Naive_tree.nil in
+             let n2 = Naive_tree.parent_of_first tree n1 in
+             n0 := n2;
+             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
       done;
-  done;
+    end
+  else
+    for i = (Bitvector.length v)-1 downto 0 do
+      if Bitvector.get v i then 
+       begin
+         let n = Naive_tree.by_preorder tree i in
+         let n0 = ref n in
+         while !n0 != Naive_tree.nil do
+           let n1 = get_firstBling tree !n0 Naive_tree.nil in
+           let n2 = Naive_tree.parent_of_first tree n1 in
+           n0 := n2;
+           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
+    done;
   v0
 
 let get_preSibling tree v =
@@ -244,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
@@ -267,18 +303,16 @@ let rec eval_axis tree v a =
            
          | Child -> get_child tree v
                       
-         | Descendant c -> let v2 = get_descendant tree v in
-                           if not c then v2
-                           else Bitvector.union v2 v
+         | Descendant c ->  get_descendant tree c v 
+                           
                           
                              
          | FollowingSibling -> get_followingSibling tree v
                                  
          | Parent -> get_parent tree v
                        
-         | Ancestor b -> let v2 = get_ancestor tree v in
-                         if not b then v2
-                         else Bitvector.union v2 v    
+         | Ancestor b ->  get_ancestor tree b v 
+    
                          
                            
          | PrecedingSibling -> get_preSibling tree v