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

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 (125) hide show
  1. package/CHANGELOG.md +14 -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 +3 -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.cmj +0 -0
  9. package/lib/bs/src/DcbEventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  10. package/lib/bs/src/DcbEventLogStorage_Postgres.ast +0 -0
  11. package/lib/bs/src/DcbEventLogStorage_Postgres.res +25 -340
  12. package/lib/bs/src/DcbEventLogStorage_Postgres.res.mjs +32 -348
  13. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  14. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
  15. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  16. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops.ast +0 -0
  17. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops.res +350 -0
  18. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops.res.mjs +380 -0
  19. package/lib/bs/src/EventLogChangeFeed-ReventlessPostgres.cmi +0 -0
  20. package/lib/bs/src/EventLogChangeFeed-ReventlessPostgres.cmt +0 -0
  21. package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  22. package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmj +0 -0
  23. package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  24. package/lib/bs/src/EventLogStorage_Postgres.ast +0 -0
  25. package/lib/bs/src/EventLogStorage_Postgres.res +12 -170
  26. package/lib/bs/src/EventLogStorage_Postgres.res.mjs +20 -186
  27. package/lib/bs/src/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  28. package/lib/bs/src/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
  29. package/lib/bs/src/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  30. package/lib/bs/src/EventLogStorage_Postgres_Ops.ast +0 -0
  31. package/lib/bs/src/EventLogStorage_Postgres_Ops.res +180 -0
  32. package/lib/bs/src/EventLogStorage_Postgres_Ops.res.mjs +202 -0
  33. package/lib/bs/src/PgChangeFeed-ReventlessPostgres.cmi +0 -0
  34. package/lib/bs/src/PgChangeFeed-ReventlessPostgres.cmt +0 -0
  35. package/lib/bs/src/PgSchema-ReventlessPostgres.cmi +0 -0
  36. package/lib/bs/src/PgSchema-ReventlessPostgres.cmt +0 -0
  37. package/lib/bs/src/QueryDbStorage_Postgres-ReventlessPostgres.cmi +0 -0
  38. package/lib/bs/src/QueryDbStorage_Postgres-ReventlessPostgres.cmt +0 -0
  39. package/lib/bs/src/QueryDbStorage_Postgres.ast +0 -0
  40. package/lib/bs/src/QueryDbStorage_Postgres.res +9 -232
  41. package/lib/bs/src/QueryDbStorage_Postgres.res.mjs +25 -204
  42. package/lib/bs/src/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  43. package/lib/bs/src/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
  44. package/lib/bs/src/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  45. package/lib/bs/src/QueryDbStorage_Postgres_Ops.ast +0 -0
  46. package/lib/bs/src/QueryDbStorage_Postgres_Ops.res +229 -0
  47. package/lib/bs/src/QueryDbStorage_Postgres_Ops.res.mjs +222 -0
  48. package/lib/bs/src/QueryEnginePostgres-ReventlessPostgres.cmi +0 -0
  49. package/lib/bs/src/QueryEnginePostgres-ReventlessPostgres.cmt +0 -0
  50. package/lib/bs/src/QueryEnginePostgres.ast +0 -0
  51. package/lib/bs/src/QueryEnginePostgres.res +84 -0
  52. package/lib/bs/src/QueryEnginePostgres.res.mjs +74 -0
  53. package/lib/bs/tests/PostgresIntegrationTest-ReventlessPostgres.cmi +0 -0
  54. package/lib/bs/tests/PostgresIntegrationTest-ReventlessPostgres.cmt +0 -0
  55. package/lib/bs/tests/QueryEnginePostgresListPageTest-ReventlessPostgres.cmi +0 -0
  56. package/lib/bs/tests/QueryEnginePostgresListPageTest-ReventlessPostgres.cmt +0 -0
  57. package/lib/bs/tests/QueryEnginePostgresListPageTest.ast +0 -0
  58. package/lib/bs/tests/QueryEnginePostgresListPageTest.res +76 -0
  59. package/lib/bs/tests/QueryEnginePostgresListPageTest.res.mjs +136 -0
  60. package/lib/ocaml/.compiler.log +2 -2
  61. package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  62. package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmj +0 -0
  63. package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  64. package/lib/ocaml/DcbEventLogStorage_Postgres.ast +0 -0
  65. package/lib/ocaml/DcbEventLogStorage_Postgres.res +25 -340
  66. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  67. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
  68. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  69. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops.ast +0 -0
  70. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops.res +350 -0
  71. package/lib/ocaml/EventLogChangeFeed-ReventlessPostgres.cmi +0 -0
  72. package/lib/ocaml/EventLogChangeFeed-ReventlessPostgres.cmt +0 -0
  73. package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  74. package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmj +0 -0
  75. package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  76. package/lib/ocaml/EventLogStorage_Postgres.ast +0 -0
  77. package/lib/ocaml/EventLogStorage_Postgres.res +12 -170
  78. package/lib/ocaml/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  79. package/lib/ocaml/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
  80. package/lib/ocaml/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  81. package/lib/ocaml/EventLogStorage_Postgres_Ops.ast +0 -0
  82. package/lib/ocaml/EventLogStorage_Postgres_Ops.res +180 -0
  83. package/lib/ocaml/PgChangeFeed-ReventlessPostgres.cmi +0 -0
  84. package/lib/ocaml/PgChangeFeed-ReventlessPostgres.cmt +0 -0
  85. package/lib/ocaml/PgSchema-ReventlessPostgres.cmi +0 -0
  86. package/lib/ocaml/PgSchema-ReventlessPostgres.cmt +0 -0
  87. package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmi +0 -0
  88. package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmt +0 -0
  89. package/lib/ocaml/QueryDbStorage_Postgres-ReventlessPostgres.cmi +0 -0
  90. package/lib/ocaml/QueryDbStorage_Postgres-ReventlessPostgres.cmt +0 -0
  91. package/lib/ocaml/QueryDbStorage_Postgres.ast +0 -0
  92. package/lib/ocaml/QueryDbStorage_Postgres.res +9 -232
  93. package/lib/ocaml/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  94. package/lib/ocaml/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
  95. package/lib/ocaml/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  96. package/lib/ocaml/QueryDbStorage_Postgres_Ops.ast +0 -0
  97. package/lib/ocaml/QueryDbStorage_Postgres_Ops.res +229 -0
  98. package/lib/ocaml/QueryEnginePostgres-ReventlessPostgres.cmi +0 -0
  99. package/lib/ocaml/QueryEnginePostgres-ReventlessPostgres.cmt +0 -0
  100. package/lib/ocaml/QueryEnginePostgres.ast +0 -0
  101. package/lib/ocaml/QueryEnginePostgres.res +84 -0
  102. package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmi +0 -0
  103. package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmt +0 -0
  104. package/lib/ocaml/QueryEnginePostgresListPageTest.ast +0 -0
  105. package/lib/ocaml/QueryEnginePostgresListPageTest.res +76 -0
  106. package/lib/ocaml/ReventlessPostgres.cmi +0 -0
  107. package/lib/ocaml/ReventlessPostgres.cmt +0 -0
  108. package/lib/ocaml/ReventlessPostgres.mlmap +3 -0
  109. package/package.json +2 -2
  110. package/src/DcbEventLogStorage_Postgres.res +25 -340
  111. package/src/DcbEventLogStorage_Postgres.res.mjs +32 -348
  112. package/src/DcbEventLogStorage_Postgres_Ops.res +350 -0
  113. package/src/DcbEventLogStorage_Postgres_Ops.res.mjs +380 -0
  114. package/src/EventLogStorage_Postgres.res +12 -170
  115. package/src/EventLogStorage_Postgres.res.mjs +20 -186
  116. package/src/EventLogStorage_Postgres_Ops.res +180 -0
  117. package/src/EventLogStorage_Postgres_Ops.res.mjs +202 -0
  118. package/src/QueryDbStorage_Postgres.res +9 -232
  119. package/src/QueryDbStorage_Postgres.res.mjs +25 -204
  120. package/src/QueryDbStorage_Postgres_Ops.res +229 -0
  121. package/src/QueryDbStorage_Postgres_Ops.res.mjs +222 -0
  122. package/src/QueryEnginePostgres.res +84 -0
  123. package/src/QueryEnginePostgres.res.mjs +74 -0
  124. package/tests/QueryEnginePostgresListPageTest.res +76 -0
  125. package/tests/QueryEnginePostgresListPageTest.res.mjs +136 -0
@@ -233,4 +233,80 @@ switch processEnv->Dict.get("PG_URL") {
233
233
  expect(items->Array.length)->toBe(0)
234
234
  })
235
235
  })
236
+
237
+ // ── itemsPage (sub-id connection) ─────────────────────────────────────────
238
+ // A sub-id read model: partition "order-1" holds 5 lines keyed by `seq`.
239
+ let itemsName = "itemsparity"
240
+ let mkLine = seq => {
241
+ let o = Dict.make()
242
+ o->Dict.set("id", JSON.Encode.string("order-1"))
243
+ o->Dict.set("seq", JSON.Encode.string(seq))
244
+ JSON.Encode.object(o)
245
+ }
246
+ let seqs = ["a", "b", "c", "d", "e"]
247
+ beforeAllAsync(async () => {
248
+ let ops = QueryDbStorage_Postgres.makeOperations(
249
+ ~pool,
250
+ ~name=itemsName,
251
+ ~indexes=[],
252
+ ~subIdField=Some("seq"),
253
+ )
254
+ for i in 0 to seqs->Array.length - 1 {
255
+ let _ = await ops.save("order-1", mkLine(seqs->Array.getUnsafe(i)), QueryDb.Any, None)
256
+ }
257
+ })
258
+
259
+ // Extract node `seq` values in edge order.
260
+ let itemSeqs = (conn: JSON.t) =>
261
+ conn
262
+ ->field("edges")
263
+ ->Option.flatMap(JSON.Decode.array)
264
+ ->Option.getOr([])
265
+ ->Array.filterMap(e => e->field("node")->Option.flatMap(n => n->str("seq")))
266
+
267
+ let pageInfoBool = (conn, key) =>
268
+ conn->field("pageInfo")->Option.getOr(JSON.Encode.null)->field(key)->Option.flatMap(JSON.Decode.bool)->Option.getOr(false)
269
+
270
+ let itemsPage = args =>
271
+ Eng.itemsPage(~readModelName=itemsName, ~subIdField="seq", ~id="order-1", ~argsDict=argsOf(args))
272
+
273
+ describe("QueryEnginePostgres itemsPage (sub-id keyset)", () => {
274
+ testPromise("bare → all lines ASC, no next page", async () => {
275
+ let r = await itemsPage([])
276
+ expect(r->itemSeqs)->toEqual(["a", "b", "c", "d", "e"])
277
+ expect(pageInfoBool(r, "hasNextPage"))->toBe(false)
278
+ })
279
+ testPromise("first:2 → [a,b], hasNextPage", async () => {
280
+ let r = await itemsPage([("first", JSON.Encode.int(2))])
281
+ expect(r->itemSeqs)->toEqual(["a", "b"])
282
+ expect(pageInfoBool(r, "hasNextPage"))->toBe(true)
283
+ })
284
+ testPromise("first:2 after b → [c,d]", async () => {
285
+ let r = await itemsPage([("first", JSON.Encode.int(2)), ("after", JSON.Encode.string(cur("b")))])
286
+ expect(r->itemSeqs)->toEqual(["c", "d"])
287
+ })
288
+ testPromise("order DESC → [e..a]", async () => {
289
+ let r = await itemsPage([("filter", filterOf([("order", JSON.Encode.string("DESC"))]))])
290
+ expect(r->itemSeqs)->toEqual(["e", "d", "c", "b", "a"])
291
+ })
292
+ testPromise("filter eq c → [c]", async () => {
293
+ let r = await itemsPage([("filter", filterOf([("eq", JSON.Encode.string("c"))]))])
294
+ expect(r->itemSeqs)->toEqual(["c"])
295
+ })
296
+ testPromise("filter from b to d → [b,c,d]", async () => {
297
+ let r = await itemsPage([
298
+ ("filter", filterOf([("from", JSON.Encode.string("b")), ("to", JSON.Encode.string("d"))])),
299
+ ])
300
+ expect(r->itemSeqs)->toEqual(["b", "c", "d"])
301
+ })
302
+ testPromise("prefix c → [c]", async () => {
303
+ let r = await itemsPage([("filter", filterOf([("prefix", JSON.Encode.string("c"))]))])
304
+ expect(r->itemSeqs)->toEqual(["c"])
305
+ })
306
+ testPromise("backward last:2 before d → [b,c] (logical ASC)", async () => {
307
+ let r = await itemsPage([("last", JSON.Encode.int(2)), ("before", JSON.Encode.string(cur("d")))])
308
+ expect(r->itemSeqs)->toEqual(["b", "c"])
309
+ expect(pageInfoBool(r, "hasPreviousPage"))->toBe(true)
310
+ })
311
+ })
236
312
  }
@@ -300,6 +300,142 @@ if (url !== undefined) {
300
300
  globalThis.expect(items.length).toBe(0);
301
301
  });
302
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
+ });
303
439
  } else {
304
440
  globalThis.test("Postgres list push-down parity (skipped — set PG_URL to run)", () => {
305
441
  globalThis.expect(true).toBe(true);