@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.
- package/CHANGELOG.md +14 -0
- package/lib/bs/.compiler.log +2 -2
- package/lib/bs/ReventlessPostgres.cmi +0 -0
- package/lib/bs/ReventlessPostgres.cmt +0 -0
- package/lib/bs/ReventlessPostgres.mlmap +3 -0
- package/lib/bs/compiler-info.json +1 -1
- package/lib/bs/src/DcbEventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
- package/lib/bs/src/DcbEventLogStorage_Postgres-ReventlessPostgres.cmj +0 -0
- package/lib/bs/src/DcbEventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
- package/lib/bs/src/DcbEventLogStorage_Postgres.ast +0 -0
- package/lib/bs/src/DcbEventLogStorage_Postgres.res +25 -340
- package/lib/bs/src/DcbEventLogStorage_Postgres.res.mjs +32 -348
- package/lib/bs/src/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
- package/lib/bs/src/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
- package/lib/bs/src/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
- package/lib/bs/src/DcbEventLogStorage_Postgres_Ops.ast +0 -0
- package/lib/bs/src/DcbEventLogStorage_Postgres_Ops.res +350 -0
- package/lib/bs/src/DcbEventLogStorage_Postgres_Ops.res.mjs +380 -0
- package/lib/bs/src/EventLogChangeFeed-ReventlessPostgres.cmi +0 -0
- package/lib/bs/src/EventLogChangeFeed-ReventlessPostgres.cmt +0 -0
- package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
- package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmj +0 -0
- package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
- package/lib/bs/src/EventLogStorage_Postgres.ast +0 -0
- package/lib/bs/src/EventLogStorage_Postgres.res +12 -170
- package/lib/bs/src/EventLogStorage_Postgres.res.mjs +20 -186
- package/lib/bs/src/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
- package/lib/bs/src/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
- package/lib/bs/src/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
- package/lib/bs/src/EventLogStorage_Postgres_Ops.ast +0 -0
- package/lib/bs/src/EventLogStorage_Postgres_Ops.res +180 -0
- package/lib/bs/src/EventLogStorage_Postgres_Ops.res.mjs +202 -0
- package/lib/bs/src/PgChangeFeed-ReventlessPostgres.cmi +0 -0
- package/lib/bs/src/PgChangeFeed-ReventlessPostgres.cmt +0 -0
- package/lib/bs/src/PgSchema-ReventlessPostgres.cmi +0 -0
- package/lib/bs/src/PgSchema-ReventlessPostgres.cmt +0 -0
- package/lib/bs/src/QueryDbStorage_Postgres-ReventlessPostgres.cmi +0 -0
- package/lib/bs/src/QueryDbStorage_Postgres-ReventlessPostgres.cmt +0 -0
- package/lib/bs/src/QueryDbStorage_Postgres.ast +0 -0
- package/lib/bs/src/QueryDbStorage_Postgres.res +9 -232
- package/lib/bs/src/QueryDbStorage_Postgres.res.mjs +25 -204
- package/lib/bs/src/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
- package/lib/bs/src/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
- package/lib/bs/src/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
- package/lib/bs/src/QueryDbStorage_Postgres_Ops.ast +0 -0
- package/lib/bs/src/QueryDbStorage_Postgres_Ops.res +229 -0
- package/lib/bs/src/QueryDbStorage_Postgres_Ops.res.mjs +222 -0
- package/lib/bs/src/QueryEnginePostgres-ReventlessPostgres.cmi +0 -0
- package/lib/bs/src/QueryEnginePostgres-ReventlessPostgres.cmt +0 -0
- package/lib/bs/src/QueryEnginePostgres.ast +0 -0
- package/lib/bs/src/QueryEnginePostgres.res +84 -0
- package/lib/bs/src/QueryEnginePostgres.res.mjs +74 -0
- package/lib/bs/tests/PostgresIntegrationTest-ReventlessPostgres.cmi +0 -0
- package/lib/bs/tests/PostgresIntegrationTest-ReventlessPostgres.cmt +0 -0
- package/lib/bs/tests/QueryEnginePostgresListPageTest-ReventlessPostgres.cmi +0 -0
- package/lib/bs/tests/QueryEnginePostgresListPageTest-ReventlessPostgres.cmt +0 -0
- package/lib/bs/tests/QueryEnginePostgresListPageTest.ast +0 -0
- package/lib/bs/tests/QueryEnginePostgresListPageTest.res +76 -0
- package/lib/bs/tests/QueryEnginePostgresListPageTest.res.mjs +136 -0
- package/lib/ocaml/.compiler.log +2 -2
- package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmj +0 -0
- package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/DcbEventLogStorage_Postgres.ast +0 -0
- package/lib/ocaml/DcbEventLogStorage_Postgres.res +25 -340
- package/lib/ocaml/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
- package/lib/ocaml/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/DcbEventLogStorage_Postgres_Ops.ast +0 -0
- package/lib/ocaml/DcbEventLogStorage_Postgres_Ops.res +350 -0
- package/lib/ocaml/EventLogChangeFeed-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/EventLogChangeFeed-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmj +0 -0
- package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/EventLogStorage_Postgres.ast +0 -0
- package/lib/ocaml/EventLogStorage_Postgres.res +12 -170
- package/lib/ocaml/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
- package/lib/ocaml/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/EventLogStorage_Postgres_Ops.ast +0 -0
- package/lib/ocaml/EventLogStorage_Postgres_Ops.res +180 -0
- package/lib/ocaml/PgChangeFeed-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/PgChangeFeed-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/PgSchema-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/PgSchema-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/QueryDbStorage_Postgres-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/QueryDbStorage_Postgres-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/QueryDbStorage_Postgres.ast +0 -0
- package/lib/ocaml/QueryDbStorage_Postgres.res +9 -232
- package/lib/ocaml/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmj +0 -0
- package/lib/ocaml/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/QueryDbStorage_Postgres_Ops.ast +0 -0
- package/lib/ocaml/QueryDbStorage_Postgres_Ops.res +229 -0
- package/lib/ocaml/QueryEnginePostgres-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/QueryEnginePostgres-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/QueryEnginePostgres.ast +0 -0
- package/lib/ocaml/QueryEnginePostgres.res +84 -0
- package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/QueryEnginePostgresListPageTest.ast +0 -0
- package/lib/ocaml/QueryEnginePostgresListPageTest.res +76 -0
- package/lib/ocaml/ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/ReventlessPostgres.mlmap +3 -0
- package/package.json +2 -2
- package/src/DcbEventLogStorage_Postgres.res +25 -340
- package/src/DcbEventLogStorage_Postgres.res.mjs +32 -348
- package/src/DcbEventLogStorage_Postgres_Ops.res +350 -0
- package/src/DcbEventLogStorage_Postgres_Ops.res.mjs +380 -0
- package/src/EventLogStorage_Postgres.res +12 -170
- package/src/EventLogStorage_Postgres.res.mjs +20 -186
- package/src/EventLogStorage_Postgres_Ops.res +180 -0
- package/src/EventLogStorage_Postgres_Ops.res.mjs +202 -0
- package/src/QueryDbStorage_Postgres.res +9 -232
- package/src/QueryDbStorage_Postgres.res.mjs +25 -204
- package/src/QueryDbStorage_Postgres_Ops.res +229 -0
- package/src/QueryDbStorage_Postgres_Ops.res.mjs +222 -0
- package/src/QueryEnginePostgres.res +84 -0
- package/src/QueryEnginePostgres.res.mjs +74 -0
- package/tests/QueryEnginePostgresListPageTest.res +76 -0
- 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);
|