plugin for sql
[afterthought.git] / python_dict.ml
1 (* To be cleaned up - prototype version *)
2
3 open Aft_types
4 open Xpath_syntax
5 open Printf
6 open Python
7 open Globals
8 open Sql
9
10 let rec squash prefix = function
11     | Slash(Root, e) ->
12         print "Root squash";
13         squash "" e
14     | Slash(e1, e2) ->
15         (squash prefix e1) ^ "." ^ (squash prefix e2)
16     | Axis(_,e)->
17         squash prefix e
18     | Name(s)->
19         s
20     | _ -> print "XPath type not supported.";raise AftError
21
22              (*
23 let serialize_path_existential b xpath_path =
24   let serialize_path_ex' b prefix x =
25       match x with 
26         | Expr(expr) ->
27         | Pipe(e1, e2) ->  
28             print "Pipes not supported"
29             raise AftError
30         | Slash(e1, e2) ->
31             (serialize_xpath e1) ^ (serialize_xpath e2)
32         | Condition(e, expr) ->
33             if (b) then begin print "Double expressions not yet supported";raise AftError end
34                 else
35                    fully_qualify_expr prefix expr
36             eval e
37         | Root ->
38             -1
39         | Axis(_,e)->
40             eval e
41         | Name(s)->
42             let c = String.get s 0 in
43             let ic = int_of_char c in
44               if (ic > 64 && ic < 91) then 1 else 0
45         | _ -> raise AftError
46               *)
47
48 let rec fqe prefix = function
49   | PathExpr(path_expr) -> Var (prefix^"."^squash prefix path_expr)
50   | Equal(e1, e2) -> Equal (fqe prefix e1, fqe prefix e2)
51   | NotEqual(e1, e2) -> NotEqual (fqe prefix e1, fqe prefix e2)
52   | Lower(e1, e2) -> Lower(fqe prefix e1, fqe prefix e2)
53   | Greater(e1, e2) -> Greater(fqe prefix e1, fqe prefix e2)
54   | LowerEqual(e1, e2) -> LowerEqual(fqe prefix e1, fqe prefix e2)
55   | GreaterEqual(e1, e2) -> GreaterEqual(fqe prefix e1, fqe prefix e2)
56   | Plus(e1, e2) -> Plus(fqe prefix e1, fqe prefix e2)
57   | Minus(e1, e2) -> Minus(fqe prefix e1, fqe prefix e2)
58   | Mul(e1, e2) -> Mul(fqe prefix e1, fqe prefix e2)
59   | Div(e1, e2) -> Div(fqe prefix e1, fqe prefix e2)
60   | Mod(e1, e2) -> Mod(fqe prefix e1, fqe prefix e2)
61   | UnaryMinus(e) -> UnaryMinus(fqe prefix e)
62   | Or(e1, e2) -> Or(fqe prefix e1, fqe prefix e2)
63   | And(e1, e2) -> And(fqe prefix e1, fqe prefix e2)
64   | l -> l
65
66 let rec cond_to_sql_expr = function
67     | Slash(Root,e) -> cond_to_sql_expr e
68     | Condition(e, expr) ->
69         let prefix = squash "" e in
70             Select(["*"],prefix,Some(fqe "" expr))
71     | e -> 
72        Select(["*"],squash "" e,None)
73
74 let rec cond_to_expr = function
75     | Slash(Root,e) -> cond_to_expr e
76     | Condition(e, expr) ->
77         let prefix = squash "" e in
78             fqe prefix expr
79     | e -> 
80        Var (squash "" e) 
81
82 let rec from_aft acl =
83   let rec from_aft' l =
84       match l with 
85         | Filter(x) -> Return(Expr(fqe "" x))
86         | INF(path, True(l'), False(l'')) ->
87             let cond = cond_to_sql_expr path in
88               If (Sql(cond), from_aft(l'), from_aft(l''))
89         | PatternMatch(_) -> print "Expression not reduced";raise AftError
90   in
91     from_aft' acl