X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Ftable.ml;h=1c10693bdab68888e3a51830e7b3b094d3e555d8;hb=refs%2Fheads%2Ffeature%2Fstage-huibo;hp=64d4103ba64558375126848ae1914c2c993d0561;hpb=72818d02fb469c39a3d8043300152beae3e7e162;p=tatoo.git diff --git a/src/table.ml b/src/table.ml index 64d4103..1c10693 100644 --- a/src/table.ml +++ b/src/table.ml @@ -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 c 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 b 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