let string_of_vtable = fun vtable ->
let current = ref vtable.vt_ftable.ta_name
and first = ref true
and string_of_constraint = fun (c1, c2) ->
Printf.sprintf "%s = %s"
(column_fullname c1)
(column_fullname c2) in
let do_join = fun (table, columns) ->
let parent_current =
if !first
then !current
else Printf.sprintf "(%s)" !current
in
first := false;
match columns with
| [] ->
current := Printf.sprintf "%s, %s" parent_current table.ta_name
| _ ->
let constraints =
Dbf_misc.join
~sep:" AND "
~to_string:string_of_constraint
columns
in
current :=
Printf.sprintf "%s INNER JOIN %s ON %s"
parent_current table.ta_name constraints
in
List.iter do_join vtable.vt_join;
!current