projects
/
tatoo.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
1) modifie la definition de query_tree
[tatoo.git]
/
src
/
query_tree.ml
diff --git
a/src/query_tree.ml
b/src/query_tree.ml
index
02ed498
..
5999df6
100644
(file)
--- a/
src/query_tree.ml
+++ b/
src/query_tree.ml
@@
-10,6
+10,8
@@
let element_by_tag tree tagset kind = let dom = all_nodes tree in
Tree.NodeKind.is_a (Naive_tree.kind tree c) kind &&
QNameSet.mem (Naive_tree.tag tree c) tagset ) dom
Tree.NodeKind.is_a (Naive_tree.kind tree c) kind &&
QNameSet.mem (Naive_tree.tag tree c) tagset ) dom
+let mk_node q = {desc = q; id = -1; hash = -1}
+
let rec compile_single_path p =
let open Xpath.Ast in
match p with
let rec compile_single_path p =
let open Xpath.Ast in
match p with
@@
-17,24
+19,24
@@
let rec compile_single_path p =
and compile_step_list p =
match p with
and compile_step_list p =
match p with
- | [] -> Start
+ | [] ->
mk_node
Start
| (a,(test,kind),el) :: r ->
let qtree = compile_step_list r in
| (a,(test,kind),el) :: r ->
let qtree = compile_step_list r in
- let res =
Binop ( Inter,Axis (a,qtree), Tag (test,kind
) ) in
+ let res =
mk_node ( Binop ( Inter,mk_node( Axis (a,qtree)),mk_node (Tag (test,kind) )
) ) in
List.fold_left (fun acc e ->
List.fold_left (fun acc e ->
-
Binop(Inter, acc, compile_expr e
)) res el
+
mk_node (Binop(Inter, acc, compile_expr e)
)) res el
and compile_expr (e : Xpath.Ast.expr ) = match e with
| Fun_call (f, [ e0 ]) when (QName.to_string f) = "not" ->
let qtree = compile_expr e0 in
and compile_expr (e : Xpath.Ast.expr ) = match e with
| Fun_call (f, [ e0 ]) when (QName.to_string f) = "not" ->
let qtree = compile_expr e0 in
-
Binop (Diff , Dom, qtree
)
+
mk_node (Binop (Diff , mk_node (Dom), qtree)
)
| Binop (e1,op,e2) -> let qtree1 = compile_expr e1 in
let qtree2 = compile_expr e2 in
begin
match op with
| Binop (e1,op,e2) -> let qtree1 = compile_expr e1 in
let qtree2 = compile_expr e2 in
begin
match op with
- | Or ->
Binop (Union , qtree1,qtree2
)
- | And ->
Binop (Inter ,qtree1,qtree2
)
+ | Or ->
mk_node (Binop (Union , qtree1,qtree2)
)
+ | And ->
mk_node (Binop (Inter ,qtree1,qtree2)
)
| _ -> failwith "Unknown operator"
end
| Path p -> compile_path_rev p
| _ -> failwith "Unknown operator"
end
| Path p -> compile_path_rev p
@@
-44,21
+46,21
@@
and compile_step_list p =
match p with
| [] -> assert false
| [p] -> compile_single_path_rev p
match p with
| [] -> assert false
| [p] -> compile_single_path_rev p
- | p::r -> List.fold_left (fun acc p ->
Binop (Union , acc, compile_single_path_rev p
) ) (compile_single_path_rev p) r
+ | p::r -> List.fold_left (fun acc p ->
mk_node (Binop (Union , acc, compile_single_path_rev p)
) ) (compile_single_path_rev p) r
and compile_single_path_rev p =
match p with
and compile_single_path_rev p =
match p with
- | Absolute p | Relative p -> compile_step_list_rev p
(*(List.rev p)*)
+ | Absolute p | Relative p -> compile_step_list_rev p
and compile_step_list_rev p = match p with
and compile_step_list_rev p = match p with
- | [] -> Dom
+ | [] ->
mk_node
Dom
| (a,(test,kind),el) :: r ->
let qtree = compile_step_list_rev r in
| (a,(test,kind),el) :: r ->
let qtree = compile_step_list_rev r in
- let res =
Binop (Inter , qtree, Tag(test,kind
)) in
+ let res =
mk_node (Binop (Inter , qtree,mk_node (Tag(test,kind))
)) in
let qtree2 = List.fold_left (fun acc e ->
let qtree2 = List.fold_left (fun acc e ->
-
Binop(Inter, acc, compile_expr e
)) res el in
+
mk_node (Binop(Inter, acc, compile_expr e)
)) res el in
let a_rev = axis_rev a in
let a_rev = axis_rev a in
-
Axis (a_rev , qtree2
)
+
mk_node (Axis (a_rev , qtree2)
)
and axis_rev a =
and axis_rev a =
@@
-83,7
+85,7
@@
and compile_step_list p =
let compile_xpath p = match p with
| [] -> assert false
| [p] -> compile_single_path p
let compile_xpath p = match p with
| [] -> assert false
| [p] -> compile_single_path p
- | p::r -> List.fold_left (fun acc p ->
Binop (Union , acc, compile_single_path p)
) (compile_single_path p) r
+ | p::r -> List.fold_left (fun acc p ->
mk_node (Binop (Union , acc, compile_single_path p) )
) (compile_single_path p) r
let comp_node t n1 n2 = (Naive_tree.preorder t n1) < (Naive_tree.preorder t n2)
let comp_node t n1 n2 = (Naive_tree.preorder t n1) < (Naive_tree.preorder t n2)
@@
-139,7
+141,7
@@
let rec eval_query_tree tree start q =
Hashtbl.find table_query_tree q
with Not_found ->
let res =
Hashtbl.find table_query_tree q
with Not_found ->
let res =
- match q with
+ match q
.desc
with
| Start -> start
| Dom -> all_nodes tree
| Tag (t,k) -> element_by_tag tree t k
| Start -> start
| Dom -> all_nodes tree
| Tag (t,k) -> element_by_tag tree t k