@effect-app/infra 4.0.0-beta.89 → 4.0.0-beta.90

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 CHANGED
@@ -1,5 +1,12 @@
1
1
  # @effect-app/infra
2
2
 
3
+ ## 4.0.0-beta.90
4
+
5
+ ### Patch Changes
6
+
7
+ - d786b91: Fix SQL `whereSome`/`whereEvery` array relation queries using `EXISTS` with `json_each` (SQLite) / `jsonb_array_elements` (Pg).
8
+ - effect-app@4.0.0-beta.90
9
+
3
10
  ## 4.0.0-beta.89
4
11
 
5
12
  ### Patch Changes
@@ -14,6 +14,8 @@ export interface SQLDialect {
14
14
  readonly caseInsensitiveNotLike: (expr: string, valPlaceholder: string) => string;
15
15
  readonly jsonColumnType: "JSON" | "JSONB";
16
16
  readonly arrayLength: (path: string) => string;
17
+ readonly jsonEachFrom: (arrPath: string, alias: string) => string;
18
+ readonly jsonExtractElement: (alias: string, subPath: string) => string;
17
19
  }
18
20
  export declare const sqliteDialect: SQLDialect;
19
21
  export declare const pgDialect: SQLDialect;
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/Store/SQL/query.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAG/D,OAAO,KAAK,EAAW,YAAY,EAAO,MAAM,iCAAiC,CAAA;AAGjF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9C,QAAQ,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAClD,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/C,QAAQ,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/E,QAAQ,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,MAAM,CAAA;IAClF,QAAQ,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAA;IAC9F,QAAQ,CAAC,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAA;IACjG,QAAQ,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAA;IAC9F,QAAQ,CAAC,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAA;IACjG,QAAQ,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9E,QAAQ,CAAC,sBAAsB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,MAAM,CAAA;IACjF,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAA;IACzC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;CAC/C;AAED,eAAO,MAAM,aAAa,EAAE,UAqB3B,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,UA2DvB,CAAA;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,qCAO7D;AAQD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,MAAM,CAAC,EAAE,qBAAqB,CAAC,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,EACpF,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,CAAC,EACzE,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM;;;EAoQf"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/Store/SQL/query.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAG/D,OAAO,KAAK,EAAW,YAAY,EAAO,MAAM,iCAAiC,CAAA;AAGjF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9C,QAAQ,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAClD,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/C,QAAQ,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/E,QAAQ,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,MAAM,CAAA;IAClF,QAAQ,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAA;IAC9F,QAAQ,CAAC,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAA;IACjG,QAAQ,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAA;IAC9F,QAAQ,CAAC,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAA;IACjG,QAAQ,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9E,QAAQ,CAAC,sBAAsB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,MAAM,CAAA;IACjF,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAA;IACzC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9C,QAAQ,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACjE,QAAQ,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAA;CACxE;AAED,eAAO,MAAM,aAAa,EAAE,UAuB3B,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,UAwEvB,CAAA;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,qCAO7D;AAQD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,MAAM,CAAC,EAAE,qBAAqB,CAAC,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,EACpF,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,CAAC,EACzE,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM;;;EAyRf"}
@@ -16,7 +16,9 @@ export const sqliteDialect = {
16
16
  caseInsensitiveLike: (expr, val) => `LOWER(${expr}) LIKE LOWER(${val})`,
17
17
  caseInsensitiveNotLike: (expr, val) => `LOWER(${expr}) NOT LIKE LOWER(${val})`,
18
18
  jsonColumnType: "JSON",
19
- arrayLength: (path) => `json_array_length(data, '$.${path}')`
19
+ arrayLength: (path) => `json_array_length(data, '$.${path}')`,
20
+ jsonEachFrom: (arrPath, alias) => `json_each(data, '$.${arrPath}') AS ${alias}`,
21
+ jsonExtractElement: (alias, subPath) => `json_extract(${alias}.value, '$.${subPath}')`
20
22
  };
21
23
  export const pgDialect = {
22
24
  jsonExtract: (path) => {
@@ -78,7 +80,21 @@ export const pgDialect = {
78
80
  caseInsensitiveLike: (expr, val) => `${expr} ILIKE ${val}`,
79
81
  caseInsensitiveNotLike: (expr, val) => `${expr} NOT ILIKE ${val}`,
80
82
  jsonColumnType: "JSONB",
81
- arrayLength: (path) => `jsonb_array_length(data->'${path}')`
83
+ arrayLength: (path) => `jsonb_array_length(data->'${path}')`,
84
+ jsonEachFrom: (arrPath, alias) => {
85
+ const parts = arrPath.split(".");
86
+ const jsonPath = parts.length === 1
87
+ ? `data->'${parts[0]}'`
88
+ : `data${parts.map((p) => `->'${p}'`).join("")}`;
89
+ return `jsonb_array_elements(${jsonPath}) AS ${alias}`;
90
+ },
91
+ jsonExtractElement: (alias, subPath) => {
92
+ const parts = subPath.split(".");
93
+ if (parts.length === 1)
94
+ return `${alias}->>'${parts[0]}'`;
95
+ const last = parts.pop();
96
+ return `${alias}${parts.map((p) => `->'${p}'`).join("")}->>'${last}'`;
97
+ }
82
98
  };
83
99
  export function logQuery(q) {
84
100
  return InfraLogger
@@ -99,9 +115,17 @@ export function buildWhereSQLQuery(dialect, idKey, filter, tableName, defaultVal
99
115
  params.push(value);
100
116
  return dialect.placeholder(paramIndex++);
101
117
  };
102
- const fieldExpr = (path) => {
118
+ const fieldExpr = (path, relation) => {
103
119
  if (path === idKey || path === "id")
104
120
  return "id";
121
+ if (relation && path.includes(".-1.")) {
122
+ const subPath = path.split(".-1.")[1];
123
+ if (subPath.endsWith(".length")) {
124
+ // TODO: array length inside relation element
125
+ return dialect.jsonExtractElement(`_${relation}`, subPath.slice(0, -".length".length));
126
+ }
127
+ return dialect.jsonExtractElement(`_${relation}`, subPath);
128
+ }
105
129
  if (path.endsWith(".length")) {
106
130
  const arrPath = dottedToJsonPath(path.slice(0, -".length".length));
107
131
  return dialect.arrayLength(arrPath);
@@ -114,9 +138,9 @@ export function buildWhereSQLQuery(dialect, idKey, filter, tableName, defaultVal
114
138
  }
115
139
  return expr;
116
140
  };
117
- const statement = (x) => {
141
+ const statement = (x, relation) => {
118
142
  const resolvedPath = x.path === idKey ? "id" : x.path;
119
- const k = fieldExpr(resolvedPath);
143
+ const k = fieldExpr(resolvedPath, relation);
120
144
  switch (x.op) {
121
145
  case "in": {
122
146
  const vals = x.value;
@@ -266,25 +290,33 @@ export function buildWhereSQLQuery(dialect, idKey, filter, tableName, defaultVal
266
290
  ? { ..._, t: _.t === "where" ? _.t : flippies[_.t], op: flipOps[_.op] }
267
291
  : _
268
292
  : _;
293
+ const wrapRelation = (rel, inner, every) => {
294
+ const from = dialect.jsonEachFrom(rel, `_${rel}`);
295
+ return every
296
+ ? `NOT EXISTS(SELECT 1 FROM ${from} WHERE NOT (${inner}))`
297
+ : `EXISTS(SELECT 1 FROM ${from} WHERE ${inner})`;
298
+ };
269
299
  const print = (state, isRelation, every) => {
270
300
  let s = "";
271
301
  for (const e of state) {
272
302
  switch (e.t) {
273
303
  case "where":
274
- s += statement(e);
304
+ s += statement(e, isRelation ?? undefined);
275
305
  break;
276
306
  case "or":
277
- s += ` OR ${statement(e)}`;
307
+ s += ` OR ${statement(e, isRelation ?? undefined)}`;
278
308
  break;
279
309
  case "and":
280
- s += ` AND ${statement(e)}`;
310
+ s += ` AND ${statement(e, isRelation ?? undefined)}`;
281
311
  break;
282
312
  case "or-scope": {
283
313
  if (!every)
284
314
  every = e.relation === "every";
285
315
  const rel = isRelationCheck(e.result, isRelation);
286
316
  if (rel) {
287
- s += ` OR (${print(e.result.map(flip(every)), rel, every)})`;
317
+ s += isRelation
318
+ ? ` OR (${print(e.result.map(flip(every)), rel, every)})`
319
+ : ` OR ${wrapRelation(rel, print(e.result.map(flip(every)), rel, every), every)}`;
288
320
  }
289
321
  else {
290
322
  s += ` OR (${print(e.result, null, every)})`;
@@ -296,7 +328,9 @@ export function buildWhereSQLQuery(dialect, idKey, filter, tableName, defaultVal
296
328
  every = e.relation === "every";
297
329
  const rel = isRelationCheck(e.result, isRelation);
298
330
  if (rel) {
299
- s += ` AND (${print(e.result.map(flip(every)), rel, every)})`;
331
+ s += isRelation
332
+ ? ` AND (${print(e.result.map(flip(every)), rel, every)})`
333
+ : ` AND ${wrapRelation(rel, print(e.result.map(flip(every)), rel, every), every)}`;
300
334
  }
301
335
  else {
302
336
  s += ` AND (${print(e.result, null, every)})`;
@@ -308,7 +342,9 @@ export function buildWhereSQLQuery(dialect, idKey, filter, tableName, defaultVal
308
342
  every = e.relation === "every";
309
343
  const rel = isRelationCheck(e.result, isRelation);
310
344
  if (rel) {
311
- s += `(${print(e.result.map(flip(every)), rel, every)})`;
345
+ s += isRelation
346
+ ? `(${print(e.result.map(flip(every)), rel, every)})`
347
+ : wrapRelation(rel, print(e.result.map(flip(every)), rel, every), every);
312
348
  }
313
349
  else {
314
350
  s += `(${print(e.result, null, every)})`;
@@ -346,4 +382,4 @@ export function buildWhereSQLQuery(dialect, idKey, filter, tableName, defaultVal
346
382
  const sql = `SELECT ${getSelectExpr()} FROM "${tableName}" ${whereClause} ${orderClause} ${limitClause}`.trim();
347
383
  return { sql, params };
348
384
  }
349
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvU3RvcmUvU1FML3F1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUE4QixNQUFNLFlBQVksQ0FBQTtBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBa0JsRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyx5QkFBeUIsSUFBSSxJQUFJO0lBQ3hELGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsb0NBQW9DLElBQUksS0FBSztJQUN4RSxXQUFXLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUc7SUFDNUIsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQywyQ0FBMkMsT0FBTyxvQkFBb0IsR0FBRyxHQUFHO0lBQ2pILG9CQUFvQixFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQ3JDLCtDQUErQyxPQUFPLG9CQUFvQixHQUFHLEdBQUc7SUFDbEYsb0JBQW9CLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FDdEMsMkNBQTJDLE9BQU8sc0JBQXNCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7SUFDN0YsdUJBQXVCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FDekMsK0NBQStDLE9BQU8sc0JBQXNCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7SUFDakcsb0JBQW9CLEVBQUUsQ0FBQyxP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
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvU3RvcmUvU1FML3F1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUE4QixNQUFNLFlBQVksQ0FBQTtBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBb0JsRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyx5QkFBeUIsSUFBSSxJQUFJO0lBQ3hELGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsb0NBQW9DLElBQUksS0FBSztJQUN4RSxXQUFXLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUc7SUFDNUIsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQywyQ0FBMkMsT0FBTyxvQkFBb0IsR0FBRyxHQUFHO0lBQ2pILG9CQUFvQixFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQ3JDLCtDQUErQyxPQUFPLG9CQUFvQixHQUFHLEdBQUc7SUFDbEYsb0JBQW9CLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FDdEMsMkNBQTJDLE9BQU8sc0JBQXNCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7SUFDN0YsdUJBQXVCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FDekMsK0NBQStDLE9BQU8sc0JBQXNCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7SUFDakcsb0JBQW9CLEVBQUUsQ0FBQyxP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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/infra",
3
- "version": "4.0.0-beta.89",
3
+ "version": "4.0.0-beta.90",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -13,7 +13,7 @@
13
13
  "proper-lockfile": "^4.1.2",
14
14
  "pure-rand": "7.0.1",
15
15
  "query-string": "^9.3.1",
16
- "effect-app": "4.0.0-beta.89"
16
+ "effect-app": "4.0.0-beta.90"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@azure/cosmos": "^4.9.2",
@@ -19,6 +19,8 @@ export interface SQLDialect {
19
19
  readonly caseInsensitiveNotLike: (expr: string, valPlaceholder: string) => string
20
20
  readonly jsonColumnType: "JSON" | "JSONB"
21
21
  readonly arrayLength: (path: string) => string
22
+ readonly jsonEachFrom: (arrPath: string, alias: string) => string
23
+ readonly jsonExtractElement: (alias: string, subPath: string) => string
22
24
  }
23
25
 
24
26
  export const sqliteDialect: SQLDialect = {
@@ -41,7 +43,9 @@ export const sqliteDialect: SQLDialect = {
41
43
  caseInsensitiveLike: (expr, val) => `LOWER(${expr}) LIKE LOWER(${val})`,
42
44
  caseInsensitiveNotLike: (expr, val) => `LOWER(${expr}) NOT LIKE LOWER(${val})`,
43
45
  jsonColumnType: "JSON",
44
- arrayLength: (path) => `json_array_length(data, '$.${path}')`
46
+ arrayLength: (path) => `json_array_length(data, '$.${path}')`,
47
+ jsonEachFrom: (arrPath, alias) => `json_each(data, '$.${arrPath}') AS ${alias}`,
48
+ jsonExtractElement: (alias, subPath) => `json_extract(${alias}.value, '$.${subPath}')`
45
49
  }
46
50
 
47
51
  export const pgDialect: SQLDialect = {
@@ -102,7 +106,20 @@ export const pgDialect: SQLDialect = {
102
106
  caseInsensitiveLike: (expr, val) => `${expr} ILIKE ${val}`,
103
107
  caseInsensitiveNotLike: (expr, val) => `${expr} NOT ILIKE ${val}`,
104
108
  jsonColumnType: "JSONB",
105
- arrayLength: (path) => `jsonb_array_length(data->'${path}')`
109
+ arrayLength: (path) => `jsonb_array_length(data->'${path}')`,
110
+ jsonEachFrom: (arrPath, alias) => {
111
+ const parts = arrPath.split(".")
112
+ const jsonPath = parts.length === 1
113
+ ? `data->'${parts[0]}'`
114
+ : `data${parts.map((p) => `->'${p}'`).join("")}`
115
+ return `jsonb_array_elements(${jsonPath}) AS ${alias}`
116
+ },
117
+ jsonExtractElement: (alias, subPath) => {
118
+ const parts = subPath.split(".")
119
+ if (parts.length === 1) return `${alias}->>'${parts[0]}'`
120
+ const last = parts.pop()!
121
+ return `${alias}${parts.map((p) => `->'${p}'`).join("")}->>'${last}'`
122
+ }
106
123
  }
107
124
 
108
125
  export function logQuery(q: { sql: string; params: unknown[] }) {
@@ -139,8 +156,16 @@ export function buildWhereSQLQuery(
139
156
  return dialect.placeholder(paramIndex++)
140
157
  }
141
158
 
142
- const fieldExpr = (path: string): string => {
159
+ const fieldExpr = (path: string, relation?: string): string => {
143
160
  if (path === idKey || path === "id") return "id"
161
+ if (relation && path.includes(".-1.")) {
162
+ const subPath = path.split(".-1.")[1]!
163
+ if (subPath.endsWith(".length")) {
164
+ // TODO: array length inside relation element
165
+ return dialect.jsonExtractElement(`_${relation}`, subPath.slice(0, -".length".length))
166
+ }
167
+ return dialect.jsonExtractElement(`_${relation}`, subPath)
168
+ }
144
169
  if (path.endsWith(".length")) {
145
170
  const arrPath = dottedToJsonPath(path.slice(0, -".length".length))
146
171
  return dialect.arrayLength(arrPath)
@@ -154,9 +179,9 @@ export function buildWhereSQLQuery(
154
179
  return expr
155
180
  }
156
181
 
157
- const statement = (x: FilterR): string => {
182
+ const statement = (x: FilterR, relation?: string): string => {
158
183
  const resolvedPath = x.path === idKey ? "id" : x.path
159
- const k = fieldExpr(resolvedPath)
184
+ const k = fieldExpr(resolvedPath, relation)
160
185
 
161
186
  switch (x.op) {
162
187
  case "in": {
@@ -313,24 +338,33 @@ export function buildWhereSQLQuery(
313
338
  : _
314
339
  : _
315
340
 
341
+ const wrapRelation = (rel: string, inner: string, every: boolean): string => {
342
+ const from = dialect.jsonEachFrom(rel, `_${rel}`)
343
+ return every
344
+ ? `NOT EXISTS(SELECT 1 FROM ${from} WHERE NOT (${inner}))`
345
+ : `EXISTS(SELECT 1 FROM ${from} WHERE ${inner})`
346
+ }
347
+
316
348
  const print = (state: readonly FilterResult[], isRelation: string | null, every: boolean): string => {
317
349
  let s = ""
318
350
  for (const e of state) {
319
351
  switch (e.t) {
320
352
  case "where":
321
- s += statement(e)
353
+ s += statement(e, isRelation ?? undefined)
322
354
  break
323
355
  case "or":
324
- s += ` OR ${statement(e)}`
356
+ s += ` OR ${statement(e, isRelation ?? undefined)}`
325
357
  break
326
358
  case "and":
327
- s += ` AND ${statement(e)}`
359
+ s += ` AND ${statement(e, isRelation ?? undefined)}`
328
360
  break
329
361
  case "or-scope": {
330
362
  if (!every) every = e.relation === "every"
331
363
  const rel = isRelationCheck(e.result, isRelation)
332
364
  if (rel) {
333
- s += ` OR (${print(e.result.map(flip(every)), rel, every)})`
365
+ s += isRelation
366
+ ? ` OR (${print(e.result.map(flip(every)), rel, every)})`
367
+ : ` OR ${wrapRelation(rel, print(e.result.map(flip(every)), rel, every), every)}`
334
368
  } else {
335
369
  s += ` OR (${print(e.result, null, every)})`
336
370
  }
@@ -340,7 +374,9 @@ export function buildWhereSQLQuery(
340
374
  if (!every) every = e.relation === "every"
341
375
  const rel = isRelationCheck(e.result, isRelation)
342
376
  if (rel) {
343
- s += ` AND (${print(e.result.map(flip(every)), rel, every)})`
377
+ s += isRelation
378
+ ? ` AND (${print(e.result.map(flip(every)), rel, every)})`
379
+ : ` AND ${wrapRelation(rel, print(e.result.map(flip(every)), rel, every), every)}`
344
380
  } else {
345
381
  s += ` AND (${print(e.result, null, every)})`
346
382
  }
@@ -350,7 +386,9 @@ export function buildWhereSQLQuery(
350
386
  if (!every) every = e.relation === "every"
351
387
  const rel = isRelationCheck(e.result, isRelation)
352
388
  if (rel) {
353
- s += `(${print(e.result.map(flip(every)), rel, every)})`
389
+ s += isRelation
390
+ ? `(${print(e.result.map(flip(every)), rel, every)})`
391
+ : wrapRelation(rel, print(e.result.map(flip(every)), rel, every), every)
354
392
  } else {
355
393
  s += `(${print(e.result, null, every)})`
356
394
  }