diff --git a/integration_tests/inputs/tracks1_ex.dl b/integration_tests/inputs/tracks1_ex.dl new file mode 100644 index 00000000..b706d4b0 --- /dev/null +++ b/integration_tests/inputs/tracks1_ex.dl @@ -0,0 +1,21 @@ +source tracks('TRACK':string,'DATE':int,'RATING':int,'ALBUM':string). +source albums('ALBUM':string,'QUANTITY':int). +view tracks1('TRACK':string,'DATE':int,'RATING':int,'ALBUM':string,'QUANTITY':int). + +% constraints: + +⊥ :- tracks1(T,D,R,A,_), tracks1(_,_,_,A,Q), not tracks1(T,D,R,A,Q). + +% view definition: +tracks1(T,D,R,A,Q) :- tracks(T,D,R,A), albums(A,Q). + +% caculate delta relation of tracks for the modification in the view ++tracks(TRACK,DATE,RATING,ALBUM) :- tracks1(TRACK,DATE,RATING,ALBUM,_), not tracks(TRACK,DATE,RATING,ALBUM). +-tracks(TRACK,DATE,RATING,ALBUM) :- tracks(TRACK,DATE,RATING,ALBUM),not tracks1(TRACK,DATE,RATING,ALBUM,_), albums(ALBUM,_). +-tracks(TRACK,DATE,RATING,ALBUM) :- tracks(TRACK,DATE,RATING,ALBUM),not tracks1(TRACK,DATE,RATING,ALBUM,_), tracks1(_,_,_,ALBUM,_). + +% caculate delta relation of albums for the modification in the view ++albums(ALBUM, QUANTITY) :- tracks1(_,_,_,ALBUM,QUANTITY), not albums(ALBUM,QUANTITY). +-albums(ALBUM, QUANTITY) :- albums(ALBUM,QUANTITY), not tracks1(_,_,_,ALBUM,QUANTITY), tracks(TRACK,DATE,RATING,ALBUM), not -tracks(TRACK,DATE,RATING,ALBUM). +-albums(ALBUM, QUANTITY) :- albums(ALBUM,QUANTITY), not tracks1(_,_,_,ALBUM,QUANTITY), +tracks(TRACK,DATE,RATING,ALBUM), not -tracks(TRACK,DATE,RATING,ALBUM). +-albums(ALBUM, QUANTITY) :- albums(ALBUM,QUANTITY), not tracks1(_,_,_,ALBUM,QUANTITY), tracks1(_,_,_,ALBUM,_), not -tracks(_,_,_,ALBUM). diff --git a/src/main.ml b/src/main.ml index 1e907296..975085a5 100644 --- a/src/main.ml +++ b/src/main.ml @@ -390,10 +390,21 @@ let main () = if (!verification) then print_endline @@ "-- Program is validated --"; let oc =if !outputf = "" then stdout else open_out !outputf in if (not has_get) then fprintf oc "\n/*view definition (get):\n%s*/\n\n" view_rules_string; +(* let sql = Ast2sql.unfold_view_sql (!dbschema) (!log) ast2 in fprintf oc "%s\n" sql; let trigger_sql = Ast2sql.unfold_delta_trigger_stt (!dbschema) (!log) (!dejima_ud) shell_script (!dejima_user) (!inc) (!optimize) (constraint2rule ast2) in fprintf oc "%s\n" trigger_sql; +*) + let sql = + match Ast2sql.convert_expr_to_operation_based_sql ast2 with + | Error e -> + failwith (Ast2sql.show_error e) + | Ok sql_operations -> + sql_operations |> List.map Ast2sql.stringify_sql_operation |> String.concat "\n" + in + let trigger_sql = "" in + fprintf oc "%s" sql; if (!connectdb) then let c = new connection ~conninfo () in