-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathdatero_setup.sql
More file actions
200 lines (163 loc) · 7.4 KB
/
Copy pathdatero_setup.sql
File metadata and controls
200 lines (163 loc) · 7.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
create schema datero_fdw;
-- mysql
create extension mysql_fdw schema datero_fdw;
create server mysql foreign data wrapper mysql_fdw options (host 'mysql', port '3306');
create user mapping for postgres server mysql options (username 'mysql', password 'mysql');
create schema mysql;
import foreign schema finance from server mysql into mysql;
-- postgres
create extension postgres_fdw schema datero_fdw;
create server postgres foreign data wrapper postgres_fdw options (host 'postgres', port '5432', dbname 'factory');
create user mapping for postgres server postgres options (user 'postgres', password 'postgres');
create schema postgres;
import foreign schema public from server postgres into postgres;
-- mssql
create extension tds_fdw schema datero_fdw;
create server mssql foreign data wrapper tds_fdw options (servername 'mssql', port '1433', database 'hr');
create user mapping for postgres server mssql options (username 'sa', password 'Mssql_2019');
create schema mssql;
import foreign schema dbo from server mssql into mssql;
-- sqlite
create extension sqlite_fdw schema datero_fdw;
create server sqlite foreign data wrapper sqlite_fdw options (database '/data/sqlite/job_roles.db');
create schema sqlite;
import foreign schema public from server sqlite into sqlite;
-- csv
create extension file_fdw schema datero_fdw;
create server files foreign data wrapper file_fdw;
create schema csv;
create foreign table csv.departments
( id int
, name varchar
)
server files
options (filename '/data/departments.csv', format 'csv', header 'true')
;
-- mongo
create extension mongo_fdw schema datero_fdw;
create server mongo foreign data wrapper mongo_fdw options (address 'mongo', port '27017', authentication_database 'admin');
create user mapping for postgres server mongo options (username 'mongo', password 'mongo');
-- create foreign tables. mongo_fdw doesn't support import foreign schema
create schema mongo;
create foreign table mongo.orders
( _id name
, id int
, customer_id int
, product_id int
, employee_id int
, quantity int
)
server mongo
options (database 'sales', collection 'orders')
;
-- redis
create extension redis_fdw schema datero_fdw;
create server redis foreign data wrapper redis_fdw options (address 'redis', port '6379');
create user mapping for postgres server redis /*options (password '')*/;
create schema redis;
create foreign table redis.users(key text, val text[])
server redis
options (database '0', tabletype 'hash', tablekeyprefix 'users:')
;
-- duckdb
create extension duckdb_fdw schema datero_fdw;
create server duckdb foreign data wrapper duckdb_fdw options (database '/home/data/json_files.duckdb');
create schema duckdb;
import foreign schema public from server duckdb into duckdb;
-- oracle
create extension oracle_fdw schema datero_fdw;
create server oracle foreign data wrapper oracle_fdw options (dbserver '//oracle:1521/xepdb1');
create user mapping for postgres server oracle options (user 'oracle', password 'oracle');
create schema oracle;
create foreign table oracle.customer_profiles
( id int options (key 'true')
, customer_id int
, category varchar
)
server oracle
options (schema 'ORACLE', table 'CUSTOMER_PROFILES')
;
-- final queries that must work
select c.name as customer_name
, cp.category as customer_category
, p.name as product
, round(o.quantity * p.price, 2) as total_amount
, e.name as employee_name
, j.name as employee_position
, d.name as employee_department
from mongo.orders o
join mysql.customers c on c.id = o.customer_id
join oracle.customer_profiles cp on c.id = cp.customer_id
join postgres.products p on p.id = o.product_id
join mssql.employees e on e.id = o.employee_id
join sqlite.job_roles j on j.id = e.job_id
join csv.departments d on d.id = j.department_id
;
/*
customer_name | customer_category | product | total_amount | employee_name | employee_position | employee_department
---------------+-------------------+---------+--------------+---------------+-------------------+---------------------
Tom | Bronze | apple | 10.00 | John | owner | management
Tom | Bronze | banana | 4.60 | Bob | manager | finance
Tom | Bronze | orange | 17.50 | Lisa | salesman | sales
Kate | Silver | orange | 10.50 | Bob | manager | finance
Kate | Silver | apple | 5.00 | Lisa | salesman | sales
John | Gold | apple | 8.00 | Lisa | salesman | sales
(6 rows)
*/
select *
from redis.users;
select *
from duckdb.json_files_v;
-- DML tests
-- delete the last row from the orders table
-- John | Gold | apple | 8.00 | Lisa | salesman | sales
--
-- also update one of the row and insert a new one
-- Mysql
insert into mysql.customers values (4, 'Peter');
update mysql.customers set name = 'Ms. Kate' where name = 'Kate';
delete from mysql.customers where name = 'John';
-- Postgres
insert into postgres.products values (4, 'pear', 1.5);
delete from postgres.products where name = 'pear';
insert into postgres.products values (4, 'pear', 15);
update postgres.products set price = 100 where name = 'banana';
-- MSSQL
-- tds_fdw doesn't support DML operations
-- SQLite
insert into sqlite.job_roles values (4, 'developer', 1);
delete from sqlite.job_roles where name = 'developer';
insert into sqlite.job_roles values (4, 'developer', 3);
update sqlite.job_roles set name = 'CEO' where name = 'owner';
-- CSV
-- file_fdw doesn't support DML operations
-- Mongo
-- insert into mongo.orders (id, customer_id, product_id, employee_id, quantity) values (7, 3, 3, 2, 4);
-- delete from mongo.orders where _id = '67519d3bce358833416a05d2';
-- update mongo.orders set quantity = 44 where id = 7;
-- Redis
-- insert into redis.users values ('users:4', '{id,4,name,asdf}');
-- delete from redis.users where key = 'users:4';
-- update redis.users set val = '{id,2,name,Blahsss}' where key = 'users:2';
-- Oracle
insert into oracle.customer_profiles values (4, 4, 'Platinum');
update oracle.customer_profiles set category = 'Silver 925' where category = 'Silver';
delete from oracle.customer_profiles where category = 'Gold';
-- DuckDB
-- duckdb.json_file_v is a view, so we can't perform DML operations on it
-- run the query again to see the changes
select c.name as customer_name
, cp.category as customer_category
, p.name as product
, round(o.quantity * p.price, 2) as total_amount
, e.name as employee_name
, j.name as employee_position
, d.name as employee_department
from mongo.orders o
join mysql.customers c on c.id = o.customer_id
join oracle.customer_profiles cp on c.id = cp.customer_id
join postgres.products p on p.id = o.product_id
join mssql.employees e on e.id = o.employee_id
join sqlite.job_roles j on j.id = e.job_id
join csv.departments d on d.id = j.department_id
;