prostgles-server 2.0.187 → 2.0.188

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/DboBuilder/insert.d.ts +5 -0
  2. package/dist/DboBuilder/insert.d.ts.map +1 -0
  3. package/dist/DboBuilder/insert.js +129 -0
  4. package/dist/DboBuilder/insert.js.map +1 -0
  5. package/dist/DboBuilder/insertDataParse.d.ts +11 -0
  6. package/dist/DboBuilder/insertDataParse.d.ts.map +1 -0
  7. package/dist/DboBuilder/insertDataParse.js +283 -0
  8. package/dist/DboBuilder/insertDataParse.js.map +1 -0
  9. package/dist/DboBuilder.d.ts +10 -5
  10. package/dist/DboBuilder.d.ts.map +1 -1
  11. package/dist/DboBuilder.js +105 -365
  12. package/dist/DboBuilder.js.map +1 -1
  13. package/dist/FileManager.d.ts.map +1 -1
  14. package/dist/FileManager.js +17 -12
  15. package/dist/FileManager.js.map +1 -1
  16. package/dist/Prostgles.d.ts +1 -1
  17. package/dist/Prostgles.d.ts.map +1 -1
  18. package/dist/Prostgles.js.map +1 -1
  19. package/dist/QueryBuilder.d.ts.map +1 -1
  20. package/dist/QueryBuilder.js +7 -2
  21. package/dist/QueryBuilder.js.map +1 -1
  22. package/dist/TableConfig.d.ts +1 -4
  23. package/dist/TableConfig.d.ts.map +1 -1
  24. package/dist/TableConfig.js.map +1 -1
  25. package/lib/DboBuilder/insert.d.ts +5 -0
  26. package/lib/DboBuilder/insert.d.ts.map +1 -0
  27. package/lib/DboBuilder/insert.js +128 -0
  28. package/lib/DboBuilder/insert.ts +138 -0
  29. package/lib/DboBuilder/insertDataParse.d.ts +11 -0
  30. package/lib/DboBuilder/insertDataParse.d.ts.map +1 -0
  31. package/lib/DboBuilder/insertDataParse.js +282 -0
  32. package/lib/DboBuilder/insertDataParse.ts +355 -0
  33. package/lib/DboBuilder.d.ts +10 -5
  34. package/lib/DboBuilder.d.ts.map +1 -1
  35. package/lib/DboBuilder.js +105 -365
  36. package/lib/DboBuilder.ts +121 -440
  37. package/lib/FileManager.d.ts.map +1 -1
  38. package/lib/FileManager.js +17 -12
  39. package/lib/FileManager.ts +18 -13
  40. package/lib/Prostgles.d.ts +1 -1
  41. package/lib/Prostgles.d.ts.map +1 -1
  42. package/lib/Prostgles.ts +664 -652
  43. package/lib/QueryBuilder.d.ts.map +1 -1
  44. package/lib/QueryBuilder.js +7 -2
  45. package/lib/QueryBuilder.ts +12 -7
  46. package/lib/TableConfig.d.ts +1 -4
  47. package/lib/TableConfig.d.ts.map +1 -1
  48. package/lib/TableConfig.ts +2 -6
  49. package/package.json +2 -2
  50. package/tests/client/PID.txt +1 -1
  51. package/tests/client/tsconfig.json +1 -1
  52. package/tests/client_only_queries.d.ts +1 -1
  53. package/tests/client_only_queries.d.ts.map +1 -1
  54. package/tests/client_only_queries.ts +1 -1
  55. package/tests/isomorphic_queries.d.ts +1 -1
  56. package/tests/isomorphic_queries.d.ts.map +1 -1
  57. package/tests/isomorphic_queries.js +48 -1
  58. package/tests/isomorphic_queries.ts +65 -4
  59. package/tests/manual_test/DBoGenerated.d.ts +398 -0
  60. package/tests/manual_test/index.d.ts +2 -0
  61. package/tests/manual_test/index.d.ts.map +1 -0
  62. package/tests/{config_test2 → manual_test}/index.html +14 -23
  63. package/tests/{config_test2 → manual_test}/index.js +21 -15
  64. package/tests/{config_test2 → manual_test}/index.ts +22 -17
  65. package/tests/{config_test2 → manual_test}/init.sql +36 -5
  66. package/tests/manual_test/package-lock.json +2483 -0
  67. package/tests/{config_test2 → manual_test}/package.json +6 -7
  68. package/tests/manual_test/tsconfig.json +21 -0
  69. package/tests/server/DBoGenerated.d.ts +70 -0
  70. package/tests/server/index.js +29 -2
  71. package/tests/server/index.ts +30 -4
  72. package/tests/server/init.sql +25 -0
  73. package/tests/server/package-lock.json +3 -3
  74. package/tests/config_test2/DBoGenerated.d.ts +0 -135
  75. package/tests/config_test2/tsconfig.json +0 -21
@@ -0,0 +1,398 @@
1
+ /* This file was generated by Prostgles
2
+ */
3
+
4
+ /* SCHEMA DEFINITON. Table names have been altered to work with Typescript */
5
+ /* DBO Definition. Isomorphic */
6
+
7
+ export type DBSchemaGenerated = {
8
+ "\"*\"": {
9
+ is_view: false;
10
+ select: true;
11
+ insert: true;
12
+ update: true;
13
+ delete: true;
14
+ columns: {
15
+ "\"*\""?: string | null;
16
+ id?: number
17
+ };
18
+ };
19
+ "*": {
20
+ is_view: false;
21
+ select: true;
22
+ insert: true;
23
+ update: true;
24
+ delete: true;
25
+ columns: {
26
+ "*"?: string | null;
27
+ id?: number
28
+ };
29
+ };
30
+ ex_j_ins: {
31
+ is_view: false;
32
+ select: true;
33
+ insert: true;
34
+ update: true;
35
+ delete: true;
36
+ columns: {
37
+ added?: Date | null;
38
+ id?: number;
39
+ name: string;
40
+ public?: string | null
41
+ };
42
+ };
43
+ geography_columns: {
44
+ is_view: true;
45
+ select: true;
46
+ insert: true;
47
+ update: true;
48
+ delete: true;
49
+ columns: {
50
+ coord_dimension?: number | null;
51
+ f_geography_column?: string | null;
52
+ f_table_catalog?: string | null;
53
+ f_table_name?: string | null;
54
+ f_table_schema?: string | null;
55
+ srid?: number | null;
56
+ type?: string | null
57
+ };
58
+ };
59
+ geometry_columns: {
60
+ is_view: true;
61
+ select: true;
62
+ insert: true;
63
+ update: true;
64
+ delete: true;
65
+ columns: {
66
+ coord_dimension?: number | null;
67
+ f_geometry_column?: string | null;
68
+ f_table_catalog?: string | null;
69
+ f_table_name?: string | null;
70
+ f_table_schema?: string | null;
71
+ srid?: number | null;
72
+ type?: string | null
73
+ };
74
+ };
75
+ insert_rules: {
76
+ is_view: false;
77
+ select: true;
78
+ insert: true;
79
+ update: true;
80
+ delete: true;
81
+ columns: {
82
+ added?: Date | null;
83
+ id?: number;
84
+ name?: string | null
85
+ };
86
+ };
87
+ item_children: {
88
+ is_view: false;
89
+ select: true;
90
+ insert: true;
91
+ update: true;
92
+ delete: true;
93
+ columns: {
94
+ id?: number;
95
+ item_id?: number | null;
96
+ name?: string | null;
97
+ tst?: Date | null
98
+ };
99
+ };
100
+ items: {
101
+ is_view: false;
102
+ select: true;
103
+ insert: true;
104
+ update: true;
105
+ delete: true;
106
+ columns: {
107
+ h?: Array<string> | null;
108
+ id?: number;
109
+ name?: string | null
110
+ };
111
+ };
112
+ items_multi: {
113
+ is_view: false;
114
+ select: true;
115
+ insert: true;
116
+ update: true;
117
+ delete: true;
118
+ columns: {
119
+ id?: number;
120
+ items0_id?: number | null;
121
+ items1_id?: number | null;
122
+ items2_id?: number | null;
123
+ items3_id?: number | null;
124
+ name?: string | null
125
+ };
126
+ };
127
+ items_with_media: {
128
+ is_view: false;
129
+ select: true;
130
+ insert: true;
131
+ update: true;
132
+ delete: true;
133
+ columns: {
134
+ id?: number;
135
+ name?: string | null
136
+ };
137
+ };
138
+ items_with_one_media: {
139
+ is_view: false;
140
+ select: true;
141
+ insert: true;
142
+ update: true;
143
+ delete: true;
144
+ columns: {
145
+ id?: number;
146
+ name?: string | null
147
+ };
148
+ };
149
+ items2: {
150
+ is_view: false;
151
+ select: true;
152
+ insert: true;
153
+ update: true;
154
+ delete: true;
155
+ columns: {
156
+ hh?: Array<string> | null;
157
+ id?: number;
158
+ items_id?: number | null;
159
+ name?: string | null
160
+ };
161
+ };
162
+ items3: {
163
+ is_view: false;
164
+ select: true;
165
+ insert: true;
166
+ update: true;
167
+ delete: true;
168
+ columns: {
169
+ hh?: Array<string> | null;
170
+ id?: number;
171
+ items_id?: number | null;
172
+ items2_id?: number | null;
173
+ name?: string | null
174
+ };
175
+ };
176
+ items4: {
177
+ is_view: false;
178
+ select: true;
179
+ insert: true;
180
+ update: true;
181
+ delete: true;
182
+ columns: {
183
+ added?: Date | null;
184
+ id?: number;
185
+ name: string;
186
+ public?: string | null
187
+ };
188
+ };
189
+ items4_pub: {
190
+ is_view: false;
191
+ select: true;
192
+ insert: true;
193
+ update: true;
194
+ delete: true;
195
+ columns: {
196
+ added?: Date | null;
197
+ id?: number;
198
+ name: string;
199
+ public?: string | null
200
+ };
201
+ };
202
+ items4a: {
203
+ is_view: false;
204
+ select: true;
205
+ insert: true;
206
+ update: true;
207
+ delete: true;
208
+ columns: {
209
+ id?: number;
210
+ items_id?: number | null;
211
+ items2_id?: number | null;
212
+ name?: string | null
213
+ };
214
+ };
215
+ lookup_col1: {
216
+ is_view: false;
217
+ select: true;
218
+ insert: true;
219
+ update: true;
220
+ delete: true;
221
+ columns: {
222
+ id: string
223
+ };
224
+ };
225
+ lookup_status: {
226
+ is_view: false;
227
+ select: true;
228
+ insert: true;
229
+ update: true;
230
+ delete: true;
231
+ columns: {
232
+ en?: string | null;
233
+ fr?: string | null;
234
+ id: string
235
+ };
236
+ };
237
+ media: {
238
+ is_view: false;
239
+ select: true;
240
+ insert: true;
241
+ update: true;
242
+ delete: true;
243
+ columns: {
244
+ content_type: string;
245
+ description?: string | null;
246
+ etag?: string | null;
247
+ extension: string;
248
+ id?: string;
249
+ name: string;
250
+ original_name: string;
251
+ s3_url?: string | null;
252
+ signed_url?: string | null;
253
+ signed_url_expires?: number | null;
254
+ url: string
255
+ };
256
+ };
257
+ obj_table: {
258
+ is_view: false;
259
+ select: true;
260
+ insert: true;
261
+ update: true;
262
+ delete: true;
263
+ columns: {
264
+ id?: number;
265
+ obj?: any | null
266
+ };
267
+ };
268
+ planes: {
269
+ is_view: false;
270
+ select: true;
271
+ insert: true;
272
+ update: true;
273
+ delete: true;
274
+ columns: {
275
+ flight_number?: string | null;
276
+ id?: number;
277
+ last_updated: number;
278
+ x?: number | null;
279
+ y?: number | null
280
+ };
281
+ };
282
+ prostgles_lookup_media_items_with_media: {
283
+ is_view: false;
284
+ select: true;
285
+ insert: true;
286
+ update: true;
287
+ delete: true;
288
+ columns: {
289
+ foreign_id?: number | null;
290
+ media_id: string
291
+ };
292
+ };
293
+ prostgles_lookup_media_items_with_one_media: {
294
+ is_view: false;
295
+ select: true;
296
+ insert: true;
297
+ update: true;
298
+ delete: true;
299
+ columns: {
300
+ foreign_id: number;
301
+ media_id: string
302
+ };
303
+ };
304
+ shapes: {
305
+ is_view: false;
306
+ select: true;
307
+ insert: true;
308
+ update: true;
309
+ delete: true;
310
+ columns: {
311
+ geog?: any | null;
312
+ geom?: any | null;
313
+ id?: string
314
+ };
315
+ };
316
+ spatial_ref_sys: {
317
+ is_view: false;
318
+ select: true;
319
+ insert: true;
320
+ update: true;
321
+ delete: true;
322
+ columns: {
323
+ auth_name?: string | null;
324
+ auth_srid?: number | null;
325
+ proj4text?: string | null;
326
+ srid: number;
327
+ srtext?: string | null
328
+ };
329
+ };
330
+ tr1: {
331
+ is_view: false;
332
+ select: true;
333
+ insert: true;
334
+ update: true;
335
+ delete: true;
336
+ columns: {
337
+ id?: number;
338
+ t1?: string | null
339
+ };
340
+ };
341
+ tr2: {
342
+ is_view: false;
343
+ select: true;
344
+ insert: true;
345
+ update: true;
346
+ delete: true;
347
+ columns: {
348
+ id?: number;
349
+ t1?: string | null;
350
+ t2?: string | null;
351
+ tr1_id?: number | null
352
+ };
353
+ };
354
+ usr: {
355
+ is_view: false;
356
+ select: true;
357
+ insert: true;
358
+ update: true;
359
+ delete: true;
360
+ columns: {
361
+ added?: Date | null;
362
+ age?: number | null;
363
+ id?: number;
364
+ is_active?: boolean | null;
365
+ msg?: string | null;
366
+ status?: string | null
367
+ };
368
+ };
369
+ uuid_text: {
370
+ is_view: false;
371
+ select: true;
372
+ insert: true;
373
+ update: true;
374
+ delete: true;
375
+ columns: {
376
+ col1?: string | null;
377
+ col2?: string | null;
378
+ id?: string;
379
+ name?: string | null
380
+ };
381
+ };
382
+ various: {
383
+ is_view: false;
384
+ select: true;
385
+ insert: true;
386
+ update: true;
387
+ delete: true;
388
+ columns: {
389
+ added?: Date | null;
390
+ h?: Array<string> | null;
391
+ id?: number;
392
+ jsn?: any | null;
393
+ name?: string | null;
394
+ tsv?: any | null
395
+ };
396
+ };
397
+
398
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":""}
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <!-- <script src="https://unpkg.com/socket.io-client@2.3.1/dist/socket.io.slim.js" type="text/javascript"></script> -->
7
7
 
8
- <script src="https://unpkg.com/socket.io-client@3.1.0/dist/socket.io.min.js" type="text/javascript"></script>
8
+ <script src="https://unpkg.com/socket.io-client@latest/dist/socket.io.min.js" type="text/javascript"></script>
9
9
  <script src="https://unpkg.com/prostgles-client@latest/dist/index.js" type="text/javascript"></script>
10
10
  </head>
11
11
  <body>
@@ -28,18 +28,8 @@
28
28
  // })
29
29
  const log = console.log;
30
30
 
31
- const socket = io("wss://prostgles.com", { path: "/teztz/s", reconnect: true });
32
-
33
31
 
34
- // socket.on("connected", () => {
35
- // log("Client connected.")
36
- // });
37
- // socket.on("connect", () => {
38
- // log("Client connect.")
39
- // });
40
- // socket.on("connect_failed", (err) => {
41
- // log("connect_failed", err)
42
- // })
32
+ const socket = io("/", { path: "/s", reconnect: true });
43
33
 
44
34
  prostgles({
45
35
  socket,
@@ -57,21 +47,22 @@
57
47
  window.dbo = db;
58
48
  window.s = socket;
59
49
 
60
- // let schema = await Promise.all(Object.keys(db).filter(t => db[t].find).map(async t => ({
61
- // table: t,
62
- // cols: await db[t].getColumns()
63
- // })))
64
- // console.log("onReady", schema);
65
50
  const d1 = document.body.querySelector(".d1"),
66
51
  d2 = document.body.querySelector(".d2"),
67
52
  d3 = document.body.querySelector(".d3");
68
53
 
69
- db.various.subscribe({ $and: [] }, {}, d => {
70
- if(d1) d1.innerText = JSON.stringify(d, null, 2)
71
- })
72
- db.various.subscribe({ "id.<": 75648356348 }, {}, d => {
73
- if(d2) d2.innerText = JSON.stringify(d, null, 2)
74
- })
54
+ // db.various.subscribe({ $and: [] }, {}, d => {
55
+ // if(d1) d1.innerText = JSON.stringify(d, null, 2)
56
+ // })
57
+ // db.various.subscribe({ "id.<": 75648356348 }, {}, d => {
58
+ // if(d2) d2.innerText = JSON.stringify(d, null, 2)
59
+ // })
60
+ d1.style.whiteSpace = "pre"
61
+ d1.innerText = JSON.stringify({
62
+ items: await db.items.find(),
63
+ items2: await db.items2.find(),
64
+ items4a: await db.items4a.find(),
65
+ }, null, 2)
75
66
 
76
67
  } catch(e) {
77
68
  console.error(e)
@@ -3,7 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- /* Dashboard */
7
6
  const path_1 = __importDefault(require("path"));
8
7
  const express_1 = __importDefault(require("express"));
9
8
  const prostgles_server_1 = __importDefault(require("prostgles-server"));
@@ -11,7 +10,7 @@ process.on('unhandledRejection', (reason, p) => {
11
10
  console.trace('Unhandled Rejection at:', p, 'reason:', reason);
12
11
  process.exit(1);
13
12
  });
14
- const app = express_1.default();
13
+ const app = (0, express_1.default)();
15
14
  app.use(express_1.default.json());
16
15
  app.use(express_1.default.urlencoded({ extended: true }));
17
16
  const _http = require("http");
@@ -19,19 +18,17 @@ const http = _http.createServer(app);
19
18
  const io = require("socket.io")(http, {
20
19
  path: "/s"
21
20
  });
22
- http.listen(process.env.NPORT || 30011);
23
- const log = (msg, extra) => {
24
- console.log(...["(server): " + msg, extra].filter(v => v));
25
- };
26
- console.log(2);
27
- prostgles_server_1.default({
21
+ const port = process.env.NPORT || 3004;
22
+ console.log("App listening on port: ", port);
23
+ http.listen(port);
24
+ (0, prostgles_server_1.default)({
28
25
  dbConnection: {
29
26
  host: process.env.POSTGRES_HOST || "localhost",
30
27
  port: +process.env.POSTGRES_PORT || 5432,
31
28
  database: process.env.POSTGRES_DB || "postgres",
32
29
  user: process.env.POSTGRES_USER || "api",
33
30
  password: process.env.POSTGRES_PASSWORD || "api",
34
- application_name: "hehe" + Date.now()
31
+ application_name: "manual_test" + Date.now()
35
32
  },
36
33
  io,
37
34
  tsGeneratedTypesDir: path_1.default.join(__dirname + '/'),
@@ -41,16 +38,25 @@ prostgles_server_1.default({
41
38
  sqlFilePath: path_1.default.join(__dirname + '/init.sql'),
42
39
  // transactions: true,
43
40
  joins: "inferred",
44
- publishRawSQL: async (socket, db, _db, user) => {
41
+ publishRawSQL: async (params) => {
45
42
  // log("set auth logic")
46
43
  return true;
47
44
  },
48
- publish: async (socket, dbo, _db, user) => {
49
- return {
50
- various: "*",
51
- };
45
+ publish: async (params) => {
46
+ return "*";
52
47
  },
53
- onReady: async (db, _db) => {
48
+ onReady: async (db) => {
49
+ app.get('*', function (req, res) {
50
+ console.log(req.originalUrl);
51
+ res.sendFile(path_1.default.join(__dirname + '/index.html'));
52
+ });
53
+ const nestedRow = { name: "nested_insert" };
54
+ const parentRow = { name: "parent insert" };
55
+ // await db.items3.insert({ items_id: nestedRow, items2_id: nestedRow, ...parentRow });
56
+ console.log({
57
+ items: await db.items.find(),
58
+ items_multi: await db.items_multi.find(),
59
+ });
54
60
  // await _db.any("CREATE TABLE IF NOT EXISTS ttt(id INTEGER, t TEXT)");
55
61
  // console.log(await db.various.find({ "id.<": 1423 }) )
56
62
  // db.various.subscribe({ "id.<": 1423 }, {}, console.log)
@@ -1,6 +1,4 @@
1
1
 
2
-
3
- /* Dashboard */
4
2
  import path from 'path';
5
3
  import express from 'express';
6
4
  import prostgles from "prostgles-server";
@@ -18,14 +16,10 @@ const http = _http.createServer(app);
18
16
  const io = require("socket.io")(http, {
19
17
  path: "/s"
20
18
  });
21
- http.listen(process.env.NPORT || 30011);
22
-
23
- const log = (msg: string, extra?: any) => {
24
- console.log(...["(server): " + msg, extra].filter(v => v));
25
- }
26
- console.log(2)
19
+ const port = process.env.NPORT || 3004;
20
+ console.log("App listening on port: ", port)
21
+ http.listen(port);
27
22
 
28
- import { DBObj } from "./DBoGenerated";
29
23
 
30
24
  prostgles({
31
25
  dbConnection: {
@@ -34,7 +28,7 @@ prostgles({
34
28
  database: process.env.POSTGRES_DB || "postgres",
35
29
  user: process.env.POSTGRES_USER || "api",
36
30
  password: process.env.POSTGRES_PASSWORD || "api",
37
- application_name: "hehe" + Date.now()
31
+ application_name: "manual_test" + Date.now()
38
32
  },
39
33
  io,
40
34
  tsGeneratedTypesDir: path.join(__dirname + '/'),
@@ -44,19 +38,30 @@ prostgles({
44
38
  sqlFilePath: path.join(__dirname+'/init.sql'),
45
39
  // transactions: true,
46
40
  joins: "inferred",
47
- publishRawSQL: async (socket, db: any, _db: any, user: any) => {
41
+ publishRawSQL: async (params) => {
48
42
  // log("set auth logic")
49
43
  return true
50
44
  },
51
- publish: async (socket, dbo: any, _db: any, user: any) => {
45
+ publish: async (params) => {
52
46
 
53
- return {
54
- various: "*",
55
-
56
- };
47
+ return "*" as "*"
57
48
 
58
49
  },
59
- onReady: async (db: DBObj, _db: any) => {
50
+ onReady: async (db) => {
51
+ app.get('*', function(req, res){
52
+ console.log(req.originalUrl)
53
+ res.sendFile(path.join(__dirname+'/index.html'));
54
+ });
55
+
56
+
57
+ const nestedRow = { name: "nested_insert" };
58
+ const parentRow = { name: "parent insert" }
59
+ // await db.items3.insert({ items_id: nestedRow, items2_id: nestedRow, ...parentRow });
60
+
61
+ console.log({
62
+ items: await db.items.find(),
63
+ items_multi: await db.items_multi.find(),
64
+ })
60
65
  // await _db.any("CREATE TABLE IF NOT EXISTS ttt(id INTEGER, t TEXT)");
61
66
 
62
67
  // console.log(await db.various.find({ "id.<": 1423 }) )
@@ -10,17 +10,48 @@ CREATE TABLE IF NOT EXISTS various (
10
10
  added TIMESTAMP DEFAULT NOW()
11
11
  );
12
12
 
13
-
14
13
  DROP TABLE IF EXISTS items CASCADE;
15
14
  CREATE TABLE IF NOT EXISTS items (
16
- id SERIAL PRIMARY KEY,
17
- name TEXT,
18
- tst TIMESTAMP DEFAULT NOW()
15
+ id SERIAL PRIMARY KEY,
16
+ h TEXT[],
17
+ name TEXT
18
+ -- PRIMARY KEY(id, id1)
19
19
  );
20
20
 
21
- INSERT INTO items(name) VALUES ('a'), ('b'),('a'), ('b'),('a'), ('b'),('a'), ('b'), ('c');
21
+ DROP TABLE IF EXISTS items2 CASCADE;
22
+ CREATE TABLE IF NOT EXISTS items2 (
23
+ id SERIAL PRIMARY KEY,
24
+ items_id INTEGER REFERENCES items(id),
25
+ hh TEXT[],
26
+ name TEXT
27
+ );
22
28
 
29
+ DROP TABLE IF EXISTS items3 CASCADE;
30
+ CREATE TABLE IF NOT EXISTS items3 (
31
+ id SERIAL PRIMARY KEY,
32
+ items_id INTEGER REFERENCES items(id),
33
+ items2_id INTEGER REFERENCES items2(id),
34
+ hh TEXT[],
35
+ name TEXT
36
+ );
23
37
 
38
+ DROP TABLE IF EXISTS items4a CASCADE;
39
+ CREATE TABLE IF NOT EXISTS items4a (
40
+ id SERIAL PRIMARY KEY,
41
+ items_id INTEGER REFERENCES items(id),
42
+ items2_id INTEGER REFERENCES items2(id),
43
+ name TEXT
44
+ );
45
+
46
+ DROP TABLE IF EXISTS items_multi CASCADE;
47
+ CREATE TABLE IF NOT EXISTS items_multi (
48
+ id SERIAL PRIMARY KEY,
49
+ items0_id INTEGER REFERENCES items(id),
50
+ items1_id INTEGER REFERENCES items(id),
51
+ items2_id INTEGER REFERENCES items(id),
52
+ items3_id INTEGER REFERENCES items(id),
53
+ name TEXT
54
+ );
24
55
 
25
56
  DROP TABLE IF EXISTS item_children CASCADE;
26
57
  CREATE TABLE IF NOT EXISTS item_children (