@reventlessdev/reventless-postgres 3.0.0-alpha.4 → 3.0.0-alpha.5

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 (68) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/lib/bs/.compiler.log +2 -2
  3. package/lib/bs/ReventlessPostgres.cmi +0 -0
  4. package/lib/bs/ReventlessPostgres.cmt +0 -0
  5. package/lib/bs/ReventlessPostgres.mlmap +1 -0
  6. package/lib/bs/compiler-info.json +1 -1
  7. package/lib/bs/src/DcbEventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  8. package/lib/bs/src/DcbEventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  9. package/lib/bs/src/EventLogChangeFeed-ReventlessPostgres.cmi +0 -0
  10. package/lib/bs/src/EventLogChangeFeed-ReventlessPostgres.cmt +0 -0
  11. package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  12. package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  13. package/lib/bs/src/PgChangeFeed-ReventlessPostgres.cmi +0 -0
  14. package/lib/bs/src/PgChangeFeed-ReventlessPostgres.cmt +0 -0
  15. package/lib/bs/src/QueryDbStorage_Postgres-ReventlessPostgres.cmi +0 -0
  16. package/lib/bs/src/QueryDbStorage_Postgres-ReventlessPostgres.cmj +0 -0
  17. package/lib/bs/src/QueryDbStorage_Postgres-ReventlessPostgres.cmt +0 -0
  18. package/lib/bs/src/QueryDbStorage_Postgres.ast +0 -0
  19. package/lib/bs/src/QueryDbStorage_Postgres.res +35 -14
  20. package/lib/bs/src/QueryDbStorage_Postgres.res.mjs +23 -8
  21. package/lib/bs/src/QueryEnginePostgres-ReventlessPostgres.cmi +0 -0
  22. package/lib/bs/src/QueryEnginePostgres-ReventlessPostgres.cmt +0 -0
  23. package/lib/bs/src/QueryEnginePostgres.ast +0 -0
  24. package/lib/bs/src/QueryEnginePostgres.res +175 -0
  25. package/lib/bs/src/QueryEnginePostgres.res.mjs +91 -0
  26. package/lib/bs/tests/PostgresIntegrationTest-ReventlessPostgres.cmi +0 -0
  27. package/lib/bs/tests/PostgresIntegrationTest-ReventlessPostgres.cmt +0 -0
  28. package/lib/bs/tests/QueryEnginePostgresListPageTest-ReventlessPostgres.cmi +0 -0
  29. package/lib/bs/tests/QueryEnginePostgresListPageTest-ReventlessPostgres.cmj +0 -0
  30. package/lib/bs/tests/QueryEnginePostgresListPageTest-ReventlessPostgres.cmt +0 -0
  31. package/lib/bs/tests/QueryEnginePostgresListPageTest.ast +0 -0
  32. package/lib/bs/tests/QueryEnginePostgresListPageTest.res +236 -0
  33. package/lib/bs/tests/QueryEnginePostgresListPageTest.res.mjs +325 -0
  34. package/lib/ocaml/.compiler.log +2 -2
  35. package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  36. package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  37. package/lib/ocaml/EventLogChangeFeed-ReventlessPostgres.cmi +0 -0
  38. package/lib/ocaml/EventLogChangeFeed-ReventlessPostgres.cmt +0 -0
  39. package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  40. package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  41. package/lib/ocaml/PgChangeFeed-ReventlessPostgres.cmi +0 -0
  42. package/lib/ocaml/PgChangeFeed-ReventlessPostgres.cmt +0 -0
  43. package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmi +0 -0
  44. package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmt +0 -0
  45. package/lib/ocaml/QueryDbStorage_Postgres-ReventlessPostgres.cmi +0 -0
  46. package/lib/ocaml/QueryDbStorage_Postgres-ReventlessPostgres.cmj +0 -0
  47. package/lib/ocaml/QueryDbStorage_Postgres-ReventlessPostgres.cmt +0 -0
  48. package/lib/ocaml/QueryDbStorage_Postgres.ast +0 -0
  49. package/lib/ocaml/QueryDbStorage_Postgres.res +35 -14
  50. package/lib/ocaml/QueryEnginePostgres-ReventlessPostgres.cmi +0 -0
  51. package/lib/ocaml/QueryEnginePostgres-ReventlessPostgres.cmt +0 -0
  52. package/lib/ocaml/QueryEnginePostgres.ast +0 -0
  53. package/lib/ocaml/QueryEnginePostgres.res +175 -0
  54. package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmi +0 -0
  55. package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmj +0 -0
  56. package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmt +0 -0
  57. package/lib/ocaml/QueryEnginePostgresListPageTest.ast +0 -0
  58. package/lib/ocaml/QueryEnginePostgresListPageTest.res +236 -0
  59. package/lib/ocaml/ReventlessPostgres.cmi +0 -0
  60. package/lib/ocaml/ReventlessPostgres.cmt +0 -0
  61. package/lib/ocaml/ReventlessPostgres.mlmap +1 -0
  62. package/package.json +7 -7
  63. package/src/QueryDbStorage_Postgres.res +35 -14
  64. package/src/QueryDbStorage_Postgres.res.mjs +23 -8
  65. package/src/QueryEnginePostgres.res +175 -0
  66. package/src/QueryEnginePostgres.res.mjs +91 -0
  67. package/tests/QueryEnginePostgresListPageTest.res +236 -0
  68. package/tests/QueryEnginePostgresListPageTest.res.mjs +325 -0
@@ -0,0 +1,325 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
4
+ import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
5
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
6
+ import * as Primitive_string from "@rescript/runtime/lib/es6/Primitive_string.js";
7
+ import * as PgDriver$ReventlessPostgres from "../src/PgDriver.res.mjs";
8
+ import * as QueryDbListQuery$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/QueryDbListQuery.res.mjs";
9
+ import * as QueryEnginePostgres$ReventlessPostgres from "../src/QueryEnginePostgres.res.mjs";
10
+ import * as QueryDbStorage_Postgres$ReventlessPostgres from "../src/QueryDbStorage_Postgres.res.mjs";
11
+
12
+ let capability_filterFields = [
13
+ {
14
+ name: "status",
15
+ gqlType: "String",
16
+ range: false
17
+ },
18
+ {
19
+ name: "qty",
20
+ gqlType: "Int",
21
+ range: true
22
+ }
23
+ ];
24
+
25
+ let capability_sortFields = [
26
+ "name",
27
+ "qty",
28
+ "status"
29
+ ];
30
+
31
+ let capability = {
32
+ filterFields: capability_filterFields,
33
+ sortFields: capability_sortFields
34
+ };
35
+
36
+ function mk(id, status, name, qty) {
37
+ let o = {};
38
+ o["id"] = id;
39
+ o["status"] = status;
40
+ o["name"] = name;
41
+ o["qty"] = qty;
42
+ return o;
43
+ }
44
+
45
+ let rows = [
46
+ [
47
+ "p-1",
48
+ "active",
49
+ "Charlie",
50
+ 3
51
+ ],
52
+ [
53
+ "p-2",
54
+ "active",
55
+ "Alpha",
56
+ 1
57
+ ],
58
+ [
59
+ "p-3",
60
+ "inactive",
61
+ "Echo",
62
+ 5
63
+ ],
64
+ [
65
+ "p-4",
66
+ "active",
67
+ "Bravo",
68
+ 2
69
+ ],
70
+ [
71
+ "p-5",
72
+ "inactive",
73
+ "Delta",
74
+ 4
75
+ ]
76
+ ];
77
+
78
+ let seededItems = rows.map(param => mk(param[0], param[1], param[2], param[3]));
79
+
80
+ function field(j, k) {
81
+ return Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(j), d => d[k]);
82
+ }
83
+
84
+ function str(j, k) {
85
+ return Stdlib_Option.flatMap(field(j, k), Stdlib_JSON.Decode.string);
86
+ }
87
+
88
+ function norm(conn) {
89
+ let edges = Stdlib_Option.getOr(Stdlib_Option.flatMap(field(conn, "edges"), Stdlib_JSON.Decode.array), []).map(e => ({
90
+ id: Stdlib_Option.getOr(Stdlib_Option.flatMap(field(e, "node"), n => str(n, "id")), ""),
91
+ cursor: Stdlib_Option.getOr(str(e, "cursor"), "")
92
+ }));
93
+ let pi = Stdlib_Option.getOr(field(conn, "pageInfo"), null);
94
+ return {
95
+ edges: edges,
96
+ hasNext: Stdlib_Option.getOr(Stdlib_Option.flatMap(field(pi, "hasNextPage"), Stdlib_JSON.Decode.bool), false),
97
+ hasPrev: Stdlib_Option.getOr(Stdlib_Option.flatMap(field(pi, "hasPreviousPage"), Stdlib_JSON.Decode.bool), false),
98
+ startCursor: str(pi, "startCursor"),
99
+ endCursor: str(pi, "endCursor")
100
+ };
101
+ }
102
+
103
+ function argsOf(entries) {
104
+ return Object.fromEntries(entries);
105
+ }
106
+
107
+ function filterOf(entries) {
108
+ return Object.fromEntries(entries);
109
+ }
110
+
111
+ function orderBy(f, dir) {
112
+ return Object.fromEntries([
113
+ [
114
+ "field",
115
+ f
116
+ ],
117
+ [
118
+ "direction",
119
+ dir
120
+ ]
121
+ ]);
122
+ }
123
+
124
+ function expectedFor(argsDict) {
125
+ return norm(QueryDbListQuery$ReventlessCore.run(seededItems, argsDict, capability, "name", param => {}));
126
+ }
127
+
128
+ let url = process.env["PG_URL"];
129
+
130
+ if (url !== undefined) {
131
+ let pool = PgDriver$ReventlessPostgres.makePool({
132
+ connectionString: url
133
+ });
134
+ let Eng = QueryEnginePostgres$ReventlessPostgres.Make({
135
+ pool: pool
136
+ });
137
+ let name = "listparity";
138
+ globalThis.beforeAll(async () => {
139
+ let ops = QueryDbStorage_Postgres$ReventlessPostgres.makeOperations(pool, name, [], undefined);
140
+ for (let i = 0, i_finish = rows.length; i < i_finish; ++i) {
141
+ let match = rows[i];
142
+ let id = match[0];
143
+ await ops.save(id, mk(id, match[1], match[2], match[3]), "Any", undefined);
144
+ }
145
+ });
146
+ globalThis.afterAll(() => {
147
+ PgDriver$ReventlessPostgres.endPool(pool);
148
+ });
149
+ let checkPushed = async (label, args) => {
150
+ let argsDict = Object.fromEntries(args);
151
+ let actual = await Eng.listPage(name, argsDict, capability, "name");
152
+ if (actual !== undefined) {
153
+ globalThis.expect(norm(actual)).toEqual(expectedFor(argsDict));
154
+ } else {
155
+ globalThis.expect("push-down for " + label).toBe("returned None");
156
+ }
157
+ };
158
+ let checkFallback = async args => {
159
+ let r = await Eng.listPage(name, Object.fromEntries(args), capability, "name");
160
+ globalThis.expect(Stdlib_Option.isSome(r)).toBe(false);
161
+ };
162
+ globalThis.describe("QueryDb list push-down parity (Postgres ≡ QueryDbListQuery spec)", () => {
163
+ globalThis.test("bare page", () => checkPushed("bare", []));
164
+ globalThis.test("first:2", () => checkPushed("first", [[
165
+ "first",
166
+ 2
167
+ ]]));
168
+ globalThis.test("first:2 + after", () => checkPushed("after", [
169
+ [
170
+ "first",
171
+ 2
172
+ ],
173
+ [
174
+ "after",
175
+ QueryDbListQuery$ReventlessCore.encodeCursor("p-2")
176
+ ]
177
+ ]));
178
+ globalThis.test("statusEq active", () => checkPushed("eq", [[
179
+ "filter",
180
+ Object.fromEntries([[
181
+ "statusEq",
182
+ "active"
183
+ ]])
184
+ ]]));
185
+ globalThis.test("statusEq active + first:2", () => checkPushed("eq+first", [
186
+ [
187
+ "filter",
188
+ Object.fromEntries([[
189
+ "statusEq",
190
+ "active"
191
+ ]])
192
+ ],
193
+ [
194
+ "first",
195
+ 2
196
+ ]
197
+ ]));
198
+ globalThis.test("orderBy name ASC", () => checkPushed("order-asc", [[
199
+ "orderBy",
200
+ orderBy("name", "ASC")
201
+ ]]));
202
+ globalThis.test("orderBy name DESC", () => checkPushed("order-desc", [[
203
+ "orderBy",
204
+ orderBy("name", "DESC")
205
+ ]]));
206
+ globalThis.test("orderBy name DESC + first:2 + after", () => checkPushed("order-desc-after", [
207
+ [
208
+ "orderBy",
209
+ orderBy("name", "DESC")
210
+ ],
211
+ [
212
+ "first",
213
+ 2
214
+ ],
215
+ [
216
+ "after",
217
+ QueryDbListQuery$ReventlessCore.encodeCursor("Delta")
218
+ ]
219
+ ]));
220
+ globalThis.test("orderBy status ASC (tiebreak by id)", () => checkPushed("order-tiebreak", [[
221
+ "orderBy",
222
+ orderBy("status", "ASC")
223
+ ]]));
224
+ globalThis.test("qty range From/To (numeric-as-string)", () => checkPushed("range", [[
225
+ "filter",
226
+ Object.fromEntries([
227
+ [
228
+ "qtyFrom",
229
+ "2"
230
+ ],
231
+ [
232
+ "qtyTo",
233
+ "4"
234
+ ]
235
+ ])
236
+ ]]));
237
+ globalThis.test("orderBy qty ASC (numeric-as-string sort)", () => checkPushed("order-qty", [[
238
+ "orderBy",
239
+ orderBy("qty", "ASC")
240
+ ]]));
241
+ globalThis.test("search → fallback", () => checkFallback([[
242
+ "filter",
243
+ Object.fromEntries([[
244
+ "search",
245
+ "alp"
246
+ ]])
247
+ ]]));
248
+ globalThis.test("searchPrefix → fallback", () => checkFallback([[
249
+ "filter",
250
+ Object.fromEntries([[
251
+ "searchPrefix",
252
+ "A"
253
+ ]])
254
+ ]]));
255
+ globalThis.test("ids → fallback", () => checkFallback([[
256
+ "filter",
257
+ Object.fromEntries([[
258
+ "ids",
259
+ ["p-1"]
260
+ ]])
261
+ ]]));
262
+ globalThis.test("backward (last/before) → fallback", () => checkFallback([
263
+ [
264
+ "last",
265
+ 2
266
+ ],
267
+ [
268
+ "before",
269
+ QueryDbListQuery$ReventlessCore.encodeCursor("p-4")
270
+ ]
271
+ ]));
272
+ });
273
+ let idsOf = items => Stdlib_Array.filterMap(items, i => str(i, "id")).toSorted(Primitive_string.compare);
274
+ globalThis.describe("QueryEnginePostgres index / batch push-downs", () => {
275
+ globalThis.test("indexLookup by status = active", async () => {
276
+ let items = await Eng.indexLookup(name, "status", "active");
277
+ globalThis.expect(idsOf(items)).toEqual([
278
+ "p-1",
279
+ "p-2",
280
+ "p-4"
281
+ ]);
282
+ });
283
+ globalThis.test("indexLookup miss → empty", async () => {
284
+ let items = await Eng.indexLookup(name, "status", "nope");
285
+ globalThis.expect(items.length).toBe(0);
286
+ });
287
+ globalThis.test("byIds returns matches, drops missing", async () => {
288
+ let items = await Eng.byIds(name, [
289
+ "p-1",
290
+ "p-3",
291
+ "absent"
292
+ ]);
293
+ globalThis.expect(idsOf(items)).toEqual([
294
+ "p-1",
295
+ "p-3"
296
+ ]);
297
+ });
298
+ globalThis.test("byIds [] → empty (no query)", async () => {
299
+ let items = await Eng.byIds(name, []);
300
+ globalThis.expect(items.length).toBe(0);
301
+ });
302
+ });
303
+ } else {
304
+ globalThis.test("Postgres list push-down parity (skipped — set PG_URL to run)", () => {
305
+ globalThis.expect(true).toBe(true);
306
+ });
307
+ }
308
+
309
+ let cur = QueryDbListQuery$ReventlessCore.encodeCursor;
310
+
311
+ export {
312
+ capability,
313
+ mk,
314
+ rows,
315
+ seededItems,
316
+ field,
317
+ str,
318
+ norm,
319
+ argsOf,
320
+ filterOf,
321
+ orderBy,
322
+ cur,
323
+ expectedFor,
324
+ }
325
+ /* seededItems Not a pure module */