@reventlessdev/reventless-postgres 3.0.0-alpha.5 → 3.0.0-alpha.51
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 +369 -0
- package/README.md +83 -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 -2
- package/lib/bs/compiler-info.json +2 -2
- 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/EventLogChangeFeed.ast +0 -0
- package/lib/bs/src/EventLogChangeFeed.res +5 -2
- package/lib/bs/src/EventLogChangeFeed.res.mjs +3 -3
- 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/PgChangeFeed.ast +0 -0
- package/lib/bs/src/PgChangeFeed.res +6 -1
- package/lib/bs/src/PgChangeFeed.res.mjs +6 -6
- package/lib/bs/src/PgDriver-ReventlessPostgres.cmi +0 -0
- package/lib/bs/src/PgDriver-ReventlessPostgres.cmt +0 -0
- package/lib/bs/src/PgDriver-ReventlessPostgres.cmti +0 -0
- package/lib/bs/src/PgDriver.ast +0 -0
- package/lib/bs/src/PgDriver.iast +0 -0
- package/lib/bs/src/PgSchema-ReventlessPostgres.cmi +0 -0
- package/lib/bs/src/PgSchema-ReventlessPostgres.cmt +0 -0
- package/lib/bs/src/PgSchema.ast +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 +10 -233
- 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 +91 -10
- package/lib/bs/src/QueryEnginePostgres.res.mjs +89 -21
- package/lib/bs/tests/PostgresIntegrationTest-ReventlessPostgres.cmi +0 -0
- package/lib/bs/tests/PostgresIntegrationTest-ReventlessPostgres.cmt +0 -0
- package/lib/bs/tests/PostgresIntegrationTest.ast +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/EventLogChangeFeed.ast +0 -0
- package/lib/ocaml/EventLogChangeFeed.res +5 -2
- 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/PgChangeFeed.ast +0 -0
- package/lib/ocaml/PgChangeFeed.res +6 -1
- package/lib/ocaml/PgDriver-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/PgDriver-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/PgDriver-ReventlessPostgres.cmti +0 -0
- package/lib/ocaml/PgDriver.ast +0 -0
- package/lib/ocaml/PgDriver.iast +0 -0
- package/lib/ocaml/PgSchema-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/PgSchema-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/PgSchema.ast +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 +10 -233
- 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 +91 -10
- 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 +11 -11
- package/rescript.json +2 -1
- 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/EventLogChangeFeed.res +5 -2
- package/src/EventLogChangeFeed.res.mjs +3 -3
- 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/PgChangeFeed.res +6 -1
- package/src/PgChangeFeed.res.mjs +6 -6
- package/src/QueryDbStorage_Postgres.res +10 -233
- 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 +91 -10
- package/src/QueryEnginePostgres.res.mjs +89 -21
- package/tests/QueryEnginePostgresListPageTest.res +76 -0
- package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmj +0 -0
- package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/PostgresIntegrationTest.ast +0 -0
- package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmi +0 -0
- package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmj +0 -0
- package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmt +0 -0
- package/lib/ocaml/QueryEnginePostgresListPageTest.ast +0 -0
- package/tests/PostgresIntegrationTest.res.mjs +0 -377
- package/tests/QueryEnginePostgresListPageTest.res.mjs +0 -325
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
|
|
4
4
|
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
5
|
-
import * as
|
|
5
|
+
import * as Stdlib_Nullable from "@rescript/runtime/lib/es6/Stdlib_Nullable.js";
|
|
6
6
|
import * as PgDriver$ReventlessPostgres from "./PgDriver.res.mjs";
|
|
7
7
|
import * as QueryDbListQuery$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/QueryDbListQuery.res.mjs";
|
|
8
|
-
import * as
|
|
8
|
+
import * as QueryDbStorage_Postgres_Ops$ReventlessPostgres from "./QueryDbStorage_Postgres_Ops.res.mjs";
|
|
9
9
|
|
|
10
10
|
function valueToText(v) {
|
|
11
11
|
switch (v.TAG) {
|
|
@@ -104,25 +104,25 @@ function subIdSql(b, field, cmp, v) {
|
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
function decodeRow(withId, row) {
|
|
107
|
-
let item =
|
|
107
|
+
let item = QueryDbStorage_Postgres_Ops$ReventlessPostgres.decodeItem(row);
|
|
108
108
|
if (!withId) {
|
|
109
109
|
return item;
|
|
110
110
|
}
|
|
111
111
|
let match = row["partition_key"];
|
|
112
112
|
let pk = typeof match === "string" ? match : "";
|
|
113
|
-
return
|
|
113
|
+
return QueryDbStorage_Postgres_Ops$ReventlessPostgres.withId(item, pk);
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
function Make(P) {
|
|
117
117
|
let query = async (readModelName, key, id, subIdConfig, filterConfigs, ascending, limit) => {
|
|
118
|
-
let table =
|
|
118
|
+
let table = QueryDbStorage_Postgres_Ops$ReventlessPostgres.tableName(readModelName);
|
|
119
119
|
let keyStr = key !== undefined ? key : valueToText(id);
|
|
120
120
|
let b = {
|
|
121
121
|
params: []
|
|
122
122
|
};
|
|
123
123
|
let where = [
|
|
124
124
|
`partition_key = ` + param(b, keyStr),
|
|
125
|
-
|
|
125
|
+
QueryDbStorage_Postgres_Ops$ReventlessPostgres.notExpiredClause
|
|
126
126
|
];
|
|
127
127
|
if (subIdConfig !== undefined) {
|
|
128
128
|
where.push(subIdSql(b, subIdConfig[0], subIdConfig[1], subIdConfig[2]));
|
|
@@ -136,11 +136,11 @@ function Make(P) {
|
|
|
136
136
|
return (await PgDriver$ReventlessPostgres.query(P.pool, sql, b.params)).map(extra => decodeRow(false, extra));
|
|
137
137
|
};
|
|
138
138
|
let scan = async (readModelName, filterConfigs, limit) => {
|
|
139
|
-
let table =
|
|
139
|
+
let table = QueryDbStorage_Postgres_Ops$ReventlessPostgres.tableName(readModelName);
|
|
140
140
|
let b = {
|
|
141
141
|
params: []
|
|
142
142
|
};
|
|
143
|
-
let where = [
|
|
143
|
+
let where = [QueryDbStorage_Postgres_Ops$ReventlessPostgres.notExpiredClause];
|
|
144
144
|
filterConfigs.forEach(param => {
|
|
145
145
|
where.push(filterSql(b, param[0], param[1], param[2]));
|
|
146
146
|
});
|
|
@@ -148,29 +148,29 @@ function Make(P) {
|
|
|
148
148
|
return (await PgDriver$ReventlessPostgres.query(P.pool, sql, b.params)).map(extra => decodeRow(true, extra));
|
|
149
149
|
};
|
|
150
150
|
let indexLookup = async (readModelName, field, value) => {
|
|
151
|
-
let table =
|
|
151
|
+
let table = QueryDbStorage_Postgres_Ops$ReventlessPostgres.tableName(readModelName);
|
|
152
152
|
let b = {
|
|
153
153
|
params: []
|
|
154
154
|
};
|
|
155
|
-
let sql = `SELECT partition_key, item FROM ` + table + ` WHERE ` + col(field) + ` = ` + param(b, value) + ` AND ` +
|
|
155
|
+
let sql = `SELECT partition_key, item FROM ` + table + ` WHERE ` + col(field) + ` = ` + param(b, value) + ` AND ` + QueryDbStorage_Postgres_Ops$ReventlessPostgres.notExpiredClause;
|
|
156
156
|
return (await PgDriver$ReventlessPostgres.query(P.pool, sql, b.params)).map(extra => decodeRow(true, extra));
|
|
157
157
|
};
|
|
158
158
|
let byIds = async (readModelName, ids) => {
|
|
159
159
|
if (ids.length === 0) {
|
|
160
160
|
return [];
|
|
161
161
|
}
|
|
162
|
-
let table =
|
|
162
|
+
let table = QueryDbStorage_Postgres_Ops$ReventlessPostgres.tableName(readModelName);
|
|
163
163
|
let b = {
|
|
164
164
|
params: []
|
|
165
165
|
};
|
|
166
166
|
let idsJson = ids.map(prim => prim);
|
|
167
|
-
let sql = `SELECT partition_key, item FROM ` + table + ` WHERE partition_key = ANY(` + param(b, idsJson) + `::text[]) AND ` +
|
|
167
|
+
let sql = `SELECT partition_key, item FROM ` + table + ` WHERE partition_key = ANY(` + param(b, idsJson) + `::text[]) AND ` + QueryDbStorage_Postgres_Ops$ReventlessPostgres.notExpiredClause;
|
|
168
168
|
return (await PgDriver$ReventlessPostgres.query(P.pool, sql, b.params)).map(extra => decodeRow(true, extra));
|
|
169
169
|
};
|
|
170
170
|
let idExprC = `COALESCE(item->>'id', partition_key) COLLATE "C"`;
|
|
171
171
|
let jsonTextC = field => col(field) + ` COLLATE "C"`;
|
|
172
172
|
let listPage = async (readModelName, argsDict, capability, param$1) => {
|
|
173
|
-
let table =
|
|
173
|
+
let table = QueryDbStorage_Postgres_Ops$ReventlessPostgres.tableName(readModelName);
|
|
174
174
|
let filterDict = Stdlib_Option.getOr(Stdlib_Option.flatMap(argsDict["filter"], Stdlib_JSON.Decode.object), {});
|
|
175
175
|
let strNonEmpty = k => Stdlib_Option.mapOr(Stdlib_Option.flatMap(filterDict[k], Stdlib_JSON.Decode.string), false, s => s.length > 0);
|
|
176
176
|
let hasIds = Stdlib_Option.mapOr(Stdlib_Option.flatMap(filterDict["ids"], Stdlib_JSON.Decode.array), false, a => a.length !== 0);
|
|
@@ -182,7 +182,7 @@ function Make(P) {
|
|
|
182
182
|
let b = {
|
|
183
183
|
params: []
|
|
184
184
|
};
|
|
185
|
-
let whereParts = [
|
|
185
|
+
let whereParts = [QueryDbStorage_Postgres_Ops$ReventlessPostgres.notExpiredClause];
|
|
186
186
|
let valString = v => {
|
|
187
187
|
let s = Stdlib_JSON.Decode.string(v);
|
|
188
188
|
if (s !== undefined) {
|
|
@@ -231,10 +231,78 @@ function Make(P) {
|
|
|
231
231
|
let cursorValueOf = item => Stdlib_Option.getOr(QueryDbListQuery$ReventlessCore.getFieldString(item, cursorField), QueryDbListQuery$ReventlessCore.getId(item));
|
|
232
232
|
return QueryDbListQuery$ReventlessCore.buildConnection(pageItems, hasMore, false, cursorValueOf);
|
|
233
233
|
};
|
|
234
|
-
let
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
234
|
+
let itemsPage = async (readModelName, param$1, id, argsDict) => {
|
|
235
|
+
let table = QueryDbStorage_Postgres_Ops$ReventlessPostgres.tableName(readModelName);
|
|
236
|
+
let filterDict = Stdlib_Option.getOr(Stdlib_Option.flatMap(argsDict["filter"], Stdlib_JSON.Decode.object), {});
|
|
237
|
+
let fstr = k => Stdlib_Option.flatMap(filterDict[k], Stdlib_JSON.Decode.string);
|
|
238
|
+
let orderDesc = Stdlib_Option.mapOr(fstr("order"), false, o => o === "DESC");
|
|
239
|
+
let last = Stdlib_Option.map(Stdlib_Option.flatMap(argsDict["last"], Stdlib_JSON.Decode.float), prim => prim | 0);
|
|
240
|
+
let first = Stdlib_Option.map(Stdlib_Option.flatMap(argsDict["first"], Stdlib_JSON.Decode.float), prim => prim | 0);
|
|
241
|
+
let after = Stdlib_Option.flatMap(argsDict["after"], Stdlib_JSON.Decode.string);
|
|
242
|
+
let before = Stdlib_Option.flatMap(argsDict["before"], Stdlib_JSON.Decode.string);
|
|
243
|
+
let isBackward = Stdlib_Option.isSome(last);
|
|
244
|
+
let sk = `sub_key COLLATE "C"`;
|
|
245
|
+
let b = {
|
|
246
|
+
params: []
|
|
247
|
+
};
|
|
248
|
+
let where = [
|
|
249
|
+
`partition_key = ` + param(b, id),
|
|
250
|
+
QueryDbStorage_Postgres_Ops$ReventlessPostgres.notExpiredClause
|
|
251
|
+
];
|
|
252
|
+
Stdlib_Option.forEach(fstr("prefix"), p => {
|
|
253
|
+
where.push(`starts_with(sub_key, ` + param(b, p) + `)`);
|
|
254
|
+
});
|
|
255
|
+
Stdlib_Option.forEach(fstr("from"), f => {
|
|
256
|
+
where.push(sk + ` >= ` + param(b, f));
|
|
257
|
+
});
|
|
258
|
+
Stdlib_Option.forEach(fstr("to"), t => {
|
|
259
|
+
where.push(sk + ` <= ` + param(b, t));
|
|
260
|
+
});
|
|
261
|
+
Stdlib_Option.forEach(fstr("eq"), e => {
|
|
262
|
+
where.push(sk + ` = ` + param(b, e));
|
|
263
|
+
});
|
|
264
|
+
if (isBackward) {
|
|
265
|
+
if (before !== undefined) {
|
|
266
|
+
where.push(sk + ` < ` + param(b, QueryDbListQuery$ReventlessCore.decodeCursor(before)));
|
|
267
|
+
}
|
|
268
|
+
} else if (after !== undefined) {
|
|
269
|
+
where.push(sk + ` > ` + param(b, QueryDbListQuery$ReventlessCore.decodeCursor(after)));
|
|
270
|
+
}
|
|
271
|
+
let fetchDesc = isBackward ? !orderDesc : orderDesc;
|
|
272
|
+
let pageSize = Stdlib_Option.getOr(isBackward ? last : first, QueryDbListQuery$ReventlessCore.defaultListPageSize);
|
|
273
|
+
let sql = `SELECT partition_key, sub_key, item FROM ` + table + ` WHERE ` + where.join(" AND ") + ` ORDER BY ` + sk + ` ` + (
|
|
274
|
+
fetchDesc ? "DESC" : "ASC"
|
|
275
|
+
) + ` LIMIT ` + param(b, pageSize + 1 | 0);
|
|
276
|
+
let rows = await PgDriver$ReventlessPostgres.query(P.pool, sql, b.params);
|
|
277
|
+
let hasMore = rows.length > pageSize;
|
|
278
|
+
let taken = rows.slice(0, pageSize);
|
|
279
|
+
let logical = isBackward ? taken.toReversed() : taken;
|
|
280
|
+
let pageItems = logical.map(extra => decodeRow(false, extra));
|
|
281
|
+
let subKeyOf = row => {
|
|
282
|
+
let match = row["sub_key"];
|
|
283
|
+
if (typeof match === "string") {
|
|
284
|
+
return match;
|
|
285
|
+
} else {
|
|
286
|
+
return "";
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
let cursors = logical.map(subKeyOf);
|
|
290
|
+
let edges = pageItems.map((item, i) => ({
|
|
291
|
+
node: item,
|
|
292
|
+
cursor: QueryDbListQuery$ReventlessCore.encodeCursor(cursors[i])
|
|
293
|
+
}));
|
|
294
|
+
let startCursor = Stdlib_Option.map(cursors[0], QueryDbListQuery$ReventlessCore.encodeCursor);
|
|
295
|
+
let endCursor = Stdlib_Option.map(cursors[cursors.length - 1 | 0], QueryDbListQuery$ReventlessCore.encodeCursor);
|
|
296
|
+
return {
|
|
297
|
+
edges: edges,
|
|
298
|
+
pageInfo: {
|
|
299
|
+
hasNextPage: !isBackward && hasMore,
|
|
300
|
+
hasPreviousPage: isBackward && hasMore,
|
|
301
|
+
startCursor: Stdlib_Nullable.fromOption(startCursor),
|
|
302
|
+
endCursor: Stdlib_Nullable.fromOption(endCursor)
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
};
|
|
238
306
|
return {
|
|
239
307
|
query: query,
|
|
240
308
|
scan: scan,
|
|
@@ -243,11 +311,11 @@ function Make(P) {
|
|
|
243
311
|
idExprC: idExprC,
|
|
244
312
|
jsonTextC: jsonTextC,
|
|
245
313
|
listPage: listPage,
|
|
246
|
-
|
|
314
|
+
itemsPage: itemsPage
|
|
247
315
|
};
|
|
248
316
|
}
|
|
249
317
|
|
|
250
|
-
let notExpired =
|
|
318
|
+
let notExpired = QueryDbStorage_Postgres_Ops$ReventlessPostgres.notExpiredClause;
|
|
251
319
|
|
|
252
320
|
export {
|
|
253
321
|
valueToText,
|
|
@@ -260,4 +328,4 @@ export {
|
|
|
260
328
|
decodeRow,
|
|
261
329
|
Make,
|
|
262
330
|
}
|
|
263
|
-
/*
|
|
331
|
+
/* PgDriver-ReventlessPostgres Not a pure module */
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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);
|
package/lib/ocaml/.compiler.log
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
#Start(
|
|
2
|
-
#Done(
|
|
1
|
+
#Start(1785245385791)
|
|
2
|
+
#Done(1785245389698)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|