@reventlessdev/reventless-postgres 3.0.0-alpha.3 → 3.0.0-alpha.30

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 (151) hide show
  1. package/CHANGELOG.md +213 -0
  2. package/README.md +83 -0
  3. package/lib/bs/.compiler.log +2 -2
  4. package/lib/bs/ReventlessPostgres.cmi +0 -0
  5. package/lib/bs/ReventlessPostgres.cmt +0 -0
  6. package/lib/bs/ReventlessPostgres.mlmap +4 -1
  7. package/lib/bs/compiler-info.json +2 -2
  8. package/lib/bs/src/DcbEventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  9. package/lib/bs/src/DcbEventLogStorage_Postgres-ReventlessPostgres.cmj +0 -0
  10. package/lib/bs/src/DcbEventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  11. package/lib/bs/src/DcbEventLogStorage_Postgres.ast +0 -0
  12. package/lib/bs/src/DcbEventLogStorage_Postgres.res +25 -340
  13. package/lib/bs/src/DcbEventLogStorage_Postgres.res.mjs +32 -348
  14. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  15. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
  16. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  17. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops.ast +0 -0
  18. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops.res +350 -0
  19. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops.res.mjs +380 -0
  20. package/lib/bs/src/EventLogChangeFeed-ReventlessPostgres.cmi +0 -0
  21. package/lib/bs/src/EventLogChangeFeed-ReventlessPostgres.cmj +0 -0
  22. package/lib/bs/src/EventLogChangeFeed-ReventlessPostgres.cmt +0 -0
  23. package/lib/bs/src/EventLogChangeFeed.ast +0 -0
  24. package/lib/bs/src/EventLogChangeFeed.res +184 -0
  25. package/lib/bs/src/EventLogChangeFeed.res.mjs +134 -0
  26. package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  27. package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmj +0 -0
  28. package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  29. package/lib/bs/src/EventLogStorage_Postgres.ast +0 -0
  30. package/lib/bs/src/EventLogStorage_Postgres.res +12 -170
  31. package/lib/bs/src/EventLogStorage_Postgres.res.mjs +20 -186
  32. package/lib/bs/src/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  33. package/lib/bs/src/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
  34. package/lib/bs/src/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  35. package/lib/bs/src/EventLogStorage_Postgres_Ops.ast +0 -0
  36. package/lib/bs/src/EventLogStorage_Postgres_Ops.res +180 -0
  37. package/lib/bs/src/EventLogStorage_Postgres_Ops.res.mjs +202 -0
  38. package/lib/bs/src/PgChangeFeed-ReventlessPostgres.cmi +0 -0
  39. package/lib/bs/src/PgChangeFeed-ReventlessPostgres.cmt +0 -0
  40. package/lib/bs/src/PgSchema-ReventlessPostgres.cmi +0 -0
  41. package/lib/bs/src/PgSchema-ReventlessPostgres.cmt +0 -0
  42. package/lib/bs/src/PgSchema.ast +0 -0
  43. package/lib/bs/src/PgSchema.res +36 -2
  44. package/lib/bs/src/PgSchema.res.mjs +9 -2
  45. package/lib/bs/src/QueryDbStorage_Postgres-ReventlessPostgres.cmi +0 -0
  46. package/lib/bs/src/QueryDbStorage_Postgres-ReventlessPostgres.cmj +0 -0
  47. package/lib/bs/src/QueryDbStorage_Postgres-ReventlessPostgres.cmt +0 -0
  48. package/lib/bs/src/QueryDbStorage_Postgres.ast +0 -0
  49. package/lib/bs/src/QueryDbStorage_Postgres.res +10 -212
  50. package/lib/bs/src/QueryDbStorage_Postgres.res.mjs +27 -191
  51. package/lib/bs/src/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  52. package/lib/bs/src/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
  53. package/lib/bs/src/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  54. package/lib/bs/src/QueryDbStorage_Postgres_Ops.ast +0 -0
  55. package/lib/bs/src/QueryDbStorage_Postgres_Ops.res +229 -0
  56. package/lib/bs/src/QueryDbStorage_Postgres_Ops.res.mjs +222 -0
  57. package/lib/bs/src/QueryEnginePostgres-ReventlessPostgres.cmi +0 -0
  58. package/lib/bs/src/QueryEnginePostgres-ReventlessPostgres.cmt +0 -0
  59. package/lib/bs/src/QueryEnginePostgres.ast +0 -0
  60. package/lib/bs/src/QueryEnginePostgres.res +259 -0
  61. package/lib/bs/src/QueryEnginePostgres.res.mjs +165 -0
  62. package/lib/bs/tests/PostgresIntegrationTest-ReventlessPostgres.cmi +0 -0
  63. package/lib/bs/tests/PostgresIntegrationTest-ReventlessPostgres.cmt +0 -0
  64. package/lib/bs/tests/PostgresIntegrationTest.ast +0 -0
  65. package/lib/bs/tests/PostgresIntegrationTest.res +68 -0
  66. package/lib/bs/tests/PostgresIntegrationTest.res.mjs +49 -0
  67. package/lib/bs/tests/QueryEnginePostgresListPageTest-ReventlessPostgres.cmi +0 -0
  68. package/lib/bs/tests/QueryEnginePostgresListPageTest-ReventlessPostgres.cmj +0 -0
  69. package/lib/bs/tests/QueryEnginePostgresListPageTest-ReventlessPostgres.cmt +0 -0
  70. package/lib/bs/tests/QueryEnginePostgresListPageTest.ast +0 -0
  71. package/lib/bs/tests/QueryEnginePostgresListPageTest.res +312 -0
  72. package/lib/bs/tests/QueryEnginePostgresListPageTest.res.mjs +461 -0
  73. package/lib/ocaml/.compiler.log +2 -2
  74. package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  75. package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmj +0 -0
  76. package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  77. package/lib/ocaml/DcbEventLogStorage_Postgres.ast +0 -0
  78. package/lib/ocaml/DcbEventLogStorage_Postgres.res +25 -340
  79. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  80. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
  81. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  82. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops.ast +0 -0
  83. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops.res +350 -0
  84. package/lib/ocaml/EventLogChangeFeed-ReventlessPostgres.cmi +0 -0
  85. package/lib/ocaml/EventLogChangeFeed-ReventlessPostgres.cmj +0 -0
  86. package/lib/ocaml/EventLogChangeFeed-ReventlessPostgres.cmt +0 -0
  87. package/lib/ocaml/EventLogChangeFeed.ast +0 -0
  88. package/lib/ocaml/EventLogChangeFeed.res +184 -0
  89. package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  90. package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmj +0 -0
  91. package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  92. package/lib/ocaml/EventLogStorage_Postgres.ast +0 -0
  93. package/lib/ocaml/EventLogStorage_Postgres.res +12 -170
  94. package/lib/ocaml/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  95. package/lib/ocaml/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
  96. package/lib/ocaml/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  97. package/lib/ocaml/EventLogStorage_Postgres_Ops.ast +0 -0
  98. package/lib/ocaml/EventLogStorage_Postgres_Ops.res +180 -0
  99. package/lib/ocaml/PgChangeFeed-ReventlessPostgres.cmi +0 -0
  100. package/lib/ocaml/PgChangeFeed-ReventlessPostgres.cmt +0 -0
  101. package/lib/ocaml/PgSchema-ReventlessPostgres.cmi +0 -0
  102. package/lib/ocaml/PgSchema-ReventlessPostgres.cmt +0 -0
  103. package/lib/ocaml/PgSchema.ast +0 -0
  104. package/lib/ocaml/PgSchema.res +36 -2
  105. package/lib/ocaml/PostgresIntegrationTest.res +68 -0
  106. package/lib/ocaml/QueryDbStorage_Postgres-ReventlessPostgres.cmi +0 -0
  107. package/lib/ocaml/QueryDbStorage_Postgres-ReventlessPostgres.cmj +0 -0
  108. package/lib/ocaml/QueryDbStorage_Postgres-ReventlessPostgres.cmt +0 -0
  109. package/lib/ocaml/QueryDbStorage_Postgres.ast +0 -0
  110. package/lib/ocaml/QueryDbStorage_Postgres.res +10 -212
  111. package/lib/ocaml/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  112. package/lib/ocaml/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
  113. package/lib/ocaml/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  114. package/lib/ocaml/QueryDbStorage_Postgres_Ops.ast +0 -0
  115. package/lib/ocaml/QueryDbStorage_Postgres_Ops.res +229 -0
  116. package/lib/ocaml/QueryEnginePostgres-ReventlessPostgres.cmi +0 -0
  117. package/lib/ocaml/QueryEnginePostgres-ReventlessPostgres.cmt +0 -0
  118. package/lib/ocaml/QueryEnginePostgres.ast +0 -0
  119. package/lib/ocaml/QueryEnginePostgres.res +259 -0
  120. package/lib/ocaml/QueryEnginePostgresListPageTest.res +312 -0
  121. package/lib/ocaml/ReventlessPostgres.cmi +0 -0
  122. package/lib/ocaml/ReventlessPostgres.cmt +0 -0
  123. package/lib/ocaml/ReventlessPostgres.mlmap +5 -0
  124. package/package.json +9 -9
  125. package/rescript.json +2 -1
  126. package/src/DcbEventLogStorage_Postgres.res +25 -340
  127. package/src/DcbEventLogStorage_Postgres.res.mjs +32 -348
  128. package/src/DcbEventLogStorage_Postgres_Ops.res +350 -0
  129. package/src/DcbEventLogStorage_Postgres_Ops.res.mjs +380 -0
  130. package/src/EventLogChangeFeed.res +184 -0
  131. package/src/EventLogChangeFeed.res.mjs +134 -0
  132. package/src/EventLogStorage_Postgres.res +12 -170
  133. package/src/EventLogStorage_Postgres.res.mjs +20 -186
  134. package/src/EventLogStorage_Postgres_Ops.res +180 -0
  135. package/src/EventLogStorage_Postgres_Ops.res.mjs +202 -0
  136. package/src/PgSchema.res +36 -2
  137. package/src/PgSchema.res.mjs +9 -2
  138. package/src/QueryDbStorage_Postgres.res +10 -212
  139. package/src/QueryDbStorage_Postgres.res.mjs +27 -191
  140. package/src/QueryDbStorage_Postgres_Ops.res +229 -0
  141. package/src/QueryDbStorage_Postgres_Ops.res.mjs +222 -0
  142. package/src/QueryEnginePostgres.res +259 -0
  143. package/src/QueryEnginePostgres.res.mjs +165 -0
  144. package/tests/PostgresIntegrationTest.res +68 -0
  145. package/tests/PostgresIntegrationTest.res.mjs +49 -0
  146. package/tests/QueryEnginePostgresListPageTest.res +312 -0
  147. package/tests/QueryEnginePostgresListPageTest.res.mjs +461 -0
  148. package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmi +0 -0
  149. package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmj +0 -0
  150. package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmt +0 -0
  151. package/lib/ocaml/PostgresIntegrationTest.ast +0 -0
@@ -0,0 +1,461 @@
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
+ let itemsName = "itemsparity";
304
+ let mkLine = seq => {
305
+ let o = {};
306
+ o["id"] = "order-1";
307
+ o["seq"] = seq;
308
+ return o;
309
+ };
310
+ let seqs = [
311
+ "a",
312
+ "b",
313
+ "c",
314
+ "d",
315
+ "e"
316
+ ];
317
+ globalThis.beforeAll(async () => {
318
+ let ops = QueryDbStorage_Postgres$ReventlessPostgres.makeOperations(pool, itemsName, [], "seq");
319
+ for (let i = 0, i_finish = seqs.length; i < i_finish; ++i) {
320
+ await ops.save("order-1", mkLine(seqs[i]), "Any", undefined);
321
+ }
322
+ });
323
+ let itemSeqs = conn => Stdlib_Array.filterMap(Stdlib_Option.getOr(Stdlib_Option.flatMap(field(conn, "edges"), Stdlib_JSON.Decode.array), []), e => Stdlib_Option.flatMap(field(e, "node"), n => str(n, "seq")));
324
+ let pageInfoBool = (conn, key) => Stdlib_Option.getOr(Stdlib_Option.flatMap(field(Stdlib_Option.getOr(field(conn, "pageInfo"), null), key), Stdlib_JSON.Decode.bool), false);
325
+ let itemsPage = args => Eng.itemsPage(itemsName, "seq", "order-1", Object.fromEntries(args));
326
+ globalThis.describe("QueryEnginePostgres itemsPage (sub-id keyset)", () => {
327
+ globalThis.test("bare → all lines ASC, no next page", async () => {
328
+ let r = await itemsPage([]);
329
+ globalThis.expect(itemSeqs(r)).toEqual([
330
+ "a",
331
+ "b",
332
+ "c",
333
+ "d",
334
+ "e"
335
+ ]);
336
+ globalThis.expect(pageInfoBool(r, "hasNextPage")).toBe(false);
337
+ });
338
+ globalThis.test("first:2 → [a,b], hasNextPage", async () => {
339
+ let r = await itemsPage([[
340
+ "first",
341
+ 2
342
+ ]]);
343
+ globalThis.expect(itemSeqs(r)).toEqual([
344
+ "a",
345
+ "b"
346
+ ]);
347
+ globalThis.expect(pageInfoBool(r, "hasNextPage")).toBe(true);
348
+ });
349
+ globalThis.test("first:2 after b → [c,d]", async () => {
350
+ let r = await itemsPage([
351
+ [
352
+ "first",
353
+ 2
354
+ ],
355
+ [
356
+ "after",
357
+ QueryDbListQuery$ReventlessCore.encodeCursor("b")
358
+ ]
359
+ ]);
360
+ globalThis.expect(itemSeqs(r)).toEqual([
361
+ "c",
362
+ "d"
363
+ ]);
364
+ });
365
+ globalThis.test("order DESC → [e..a]", async () => {
366
+ let r = await itemsPage([[
367
+ "filter",
368
+ Object.fromEntries([[
369
+ "order",
370
+ "DESC"
371
+ ]])
372
+ ]]);
373
+ globalThis.expect(itemSeqs(r)).toEqual([
374
+ "e",
375
+ "d",
376
+ "c",
377
+ "b",
378
+ "a"
379
+ ]);
380
+ });
381
+ globalThis.test("filter eq c → [c]", async () => {
382
+ let r = await itemsPage([[
383
+ "filter",
384
+ Object.fromEntries([[
385
+ "eq",
386
+ "c"
387
+ ]])
388
+ ]]);
389
+ globalThis.expect(itemSeqs(r)).toEqual(["c"]);
390
+ });
391
+ globalThis.test("filter from b to d → [b,c,d]", async () => {
392
+ let r = await itemsPage([[
393
+ "filter",
394
+ Object.fromEntries([
395
+ [
396
+ "from",
397
+ "b"
398
+ ],
399
+ [
400
+ "to",
401
+ "d"
402
+ ]
403
+ ])
404
+ ]]);
405
+ globalThis.expect(itemSeqs(r)).toEqual([
406
+ "b",
407
+ "c",
408
+ "d"
409
+ ]);
410
+ });
411
+ globalThis.test("prefix c → [c]", async () => {
412
+ let r = await itemsPage([[
413
+ "filter",
414
+ Object.fromEntries([[
415
+ "prefix",
416
+ "c"
417
+ ]])
418
+ ]]);
419
+ globalThis.expect(itemSeqs(r)).toEqual(["c"]);
420
+ });
421
+ globalThis.test("backward last:2 before d → [b,c] (logical ASC)", async () => {
422
+ let r = await itemsPage([
423
+ [
424
+ "last",
425
+ 2
426
+ ],
427
+ [
428
+ "before",
429
+ QueryDbListQuery$ReventlessCore.encodeCursor("d")
430
+ ]
431
+ ]);
432
+ globalThis.expect(itemSeqs(r)).toEqual([
433
+ "b",
434
+ "c"
435
+ ]);
436
+ globalThis.expect(pageInfoBool(r, "hasPreviousPage")).toBe(true);
437
+ });
438
+ });
439
+ } else {
440
+ globalThis.test("Postgres list push-down parity (skipped — set PG_URL to run)", () => {
441
+ globalThis.expect(true).toBe(true);
442
+ });
443
+ }
444
+
445
+ let cur = QueryDbListQuery$ReventlessCore.encodeCursor;
446
+
447
+ export {
448
+ capability,
449
+ mk,
450
+ rows,
451
+ seededItems,
452
+ field,
453
+ str,
454
+ norm,
455
+ argsOf,
456
+ filterOf,
457
+ orderBy,
458
+ cur,
459
+ expectedFor,
460
+ }
461
+ /* seededItems Not a pure module */