durcno 1.0.0-alpha.10 → 1.0.0-alpha.11

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 (46) hide show
  1. package/dist/bin.cjs +1 -1
  2. package/dist/src/columns/common.d.mts +19 -21
  3. package/dist/src/columns/common.mjs +11 -8
  4. package/dist/src/constraints/check.d.mts +7 -2
  5. package/dist/src/constraints/check.mjs +8 -31
  6. package/dist/src/constraints/primary-key.mjs +1 -1
  7. package/dist/src/constraints/unique.mjs +1 -1
  8. package/dist/src/entity.mjs +1 -1
  9. package/dist/src/filters/array.d.mts +6 -6
  10. package/dist/src/filters/array.mjs +17 -10
  11. package/dist/src/filters/index.d.mts +10 -10
  12. package/dist/src/filters/index.mjs +25 -20
  13. package/dist/src/filters/postgis.d.mts +5 -5
  14. package/dist/src/filters/postgis.mjs +16 -8
  15. package/dist/src/filters/string.d.mts +5 -5
  16. package/dist/src/filters/string.mjs +13 -8
  17. package/dist/src/functions/aggregate.d.mts +8 -8
  18. package/dist/src/functions/aggregate.mjs +13 -13
  19. package/dist/src/functions/index.d.mts +2 -2
  20. package/dist/src/functions/numeric.d.mts +6 -6
  21. package/dist/src/functions/numeric.mjs +10 -10
  22. package/dist/src/functions/postgis.d.mts +2 -2
  23. package/dist/src/functions/postgis.mjs +4 -2
  24. package/dist/src/functions/string.d.mts +8 -8
  25. package/dist/src/functions/string.mjs +14 -14
  26. package/dist/src/index.d.mts +2 -2
  27. package/dist/src/indexes.mjs +1 -1
  28. package/dist/src/migration/ddl/indexes.mjs +0 -1
  29. package/dist/src/migration/snapshot.d.mts +0 -2
  30. package/dist/src/migration/snapshot.mjs +7 -8
  31. package/dist/src/query-builders/delete.mjs +2 -3
  32. package/dist/src/query-builders/insert.mjs +2 -2
  33. package/dist/src/query-builders/orderby-clause.d.mts +5 -5
  34. package/dist/src/query-builders/orderby-clause.mjs +7 -4
  35. package/dist/src/query-builders/query.d.mts +17 -1
  36. package/dist/src/query-builders/rq.d.mts +2 -2
  37. package/dist/src/query-builders/rq.mjs +10 -9
  38. package/dist/src/query-builders/select.d.mts +3 -3
  39. package/dist/src/query-builders/update.d.mts +1 -1
  40. package/dist/src/query-builders/update.mjs +2 -2
  41. package/dist/src/sql.d.mts +2 -2
  42. package/dist/src/sql.mjs +1 -1
  43. package/dist/src/table.d.mts +2 -2
  44. package/dist/src/validators/zod.d.mts +3 -13
  45. package/dist/src/validators/zod.mjs +14 -9
  46. package/package.json +1 -1
package/dist/bin.cjs CHANGED
@@ -10405,7 +10405,7 @@ async function status(options) {
10405
10405
  }
10406
10406
 
10407
10407
  // src/cli/index.ts
10408
- program.version("1.0.0-alpha.9");
10408
+ program.version("1.0.0-alpha.10");
10409
10409
  var Options = {
10410
10410
  config: ["--config <path>", "Path to the config file"]
10411
10411
  };
@@ -2,7 +2,7 @@ import { entityType } from "../symbols.mjs";
2
2
  import { Key } from "../types.mjs";
3
3
  import { StdTable, StdTableColumn, TableColumn } from "../table.mjs";
4
4
  import { Arg } from "../query-builders/pre.mjs";
5
- import { Query } from "../query-builders/query.mjs";
5
+ import { Query, QueryContext } from "../query-builders/query.mjs";
6
6
  import { Sql } from "../sql.mjs";
7
7
  import * as z from "zod";
8
8
 
@@ -105,36 +105,34 @@ declare abstract class Column<TConfig extends ColumnConfig, TColVal, TPgType ext
105
105
  /** Phantom discriminant id for this entity kind. */kind: "column"; /** The PostgreSQL type category for this column. */
106
106
  PgType: TPgType; /** The TypeScript type for this column's value. */
107
107
  TsType: TColVal;
108
- TsTypeScalar: TColVal;
109
- ValTypeBase: GetValueArray<TColVal, TConfig>;
110
108
  HasValTypeOverridde: {};
111
109
  ValTypeOverride: {};
112
110
  };
113
- readonly ValType: this["$"]["HasValTypeOverridde"] extends true ? this["$"]["ValTypeOverride"] : this["$"]["ValTypeBase"];
111
+ readonly ValType: this["$"]["HasValTypeOverridde"] extends true ? GetValueArray<this["$"]["ValTypeOverride"], TConfig> : GetValueArray<TColVal, TConfig>;
114
112
  readonly ValTypeInsert: this extends {
115
113
  isGeneratedAlways: true;
116
114
  } ? never : this extends {
117
115
  isGeneratedByDefault: true;
118
116
  } ? this["ValType"] | undefined : this extends {
119
- hasDefault: true;
120
- } ? this["ValType"] | Sql | null | undefined : this extends {
117
+ isNotNull: true;
118
+ } ? this extends {
121
119
  hasInsertFn: true;
122
- } ? this["ValType"] | Sql | null | undefined : TConfig extends {
123
- notNull: true;
124
- } ? this["ValType"] | Sql : this["ValType"] | Sql | null | undefined;
125
- readonly ValTypeUpdate: TConfig extends {
126
- primaryKey: true;
127
- } ? never : TConfig extends {
128
- notNull: true;
129
- } ? this["ValType"] : this["ValType"] | null;
130
- readonly ValTypeSelect: TConfig extends {
120
+ } | {
121
+ hasDefault: true;
122
+ } ? this["ValType"] | Sql | undefined : this["ValType"] | Sql : this["ValType"] | Sql | null | undefined;
123
+ readonly ValTypeUpdate: this extends {
124
+ isPrimaryKey: true;
125
+ } ? never : this extends {
126
+ isNotNull: true;
127
+ } ? this["ValType"] | undefined : this["ValType"] | undefined | null;
128
+ readonly ValTypeSelect: this extends {
131
129
  isGeneratedAlways: true;
132
130
  } | {
133
131
  isGeneratedByDefault: true;
134
- } ? this["ValType"] : TConfig extends {
135
- primaryKey: true;
136
- } ? this["ValType"] : TConfig extends {
137
- notNull: true;
132
+ } | {
133
+ isPrimaryKey: true;
134
+ } | {
135
+ isNotNull: true;
138
136
  } ? this["ValType"] : this["ValType"] | null;
139
137
  constructor(config: TConfig);
140
138
  _: {
@@ -142,7 +140,7 @@ declare abstract class Column<TConfig extends ColumnConfig, TColVal, TPgType ext
142
140
  setTable: (table: StdTable) => void;
143
141
  };
144
142
  get name(): string | undefined;
145
- get nameSnake(): string | undefined;
143
+ get nameSql(): string | undefined;
146
144
  get table(): TableLike | undefined;
147
145
  get isPrimaryKey(): TConfig extends {
148
146
  primaryKey: true;
@@ -166,7 +164,7 @@ declare abstract class Column<TConfig extends ColumnConfig, TColVal, TPgType ext
166
164
  * @returns string `"table"."column"`
167
165
  */
168
166
  get fullName(): string;
169
- toQuery(query: Query): void;
167
+ toQuery(query: Query, ctx?: QueryContext): void;
170
168
  abstract toDriverScalar(value: TColVal | Sql | null): string | number | null;
171
169
  abstract toSQLScalar(value: TColVal | Sql | null): string;
172
170
  abstract fromDriverScalar(value: unknown): TColVal | null;
@@ -27,7 +27,7 @@ var Column = class {
27
27
  #generatedAs;
28
28
  #references;
29
29
  #name;
30
- #nameSnake;
30
+ #nameSql;
31
31
  #table;
32
32
  constructor(config) {
33
33
  this.config = config;
@@ -38,7 +38,7 @@ var Column = class {
38
38
  _ = {
39
39
  setName: (name) => {
40
40
  this.#name = name;
41
- this.#nameSnake = camelToSnake(name);
41
+ this.#nameSql = camelToSnake(name);
42
42
  },
43
43
  setTable: (table) => {
44
44
  this.#table = table;
@@ -47,8 +47,8 @@ var Column = class {
47
47
  get name() {
48
48
  return this.#name;
49
49
  }
50
- get nameSnake() {
51
- return this.#nameSnake;
50
+ get nameSql() {
51
+ return this.#nameSql;
52
52
  }
53
53
  get table() {
54
54
  return this.#table;
@@ -77,7 +77,7 @@ var Column = class {
77
77
  get zodType() {
78
78
  let schema = this.zodTypeScaler;
79
79
  if (!this.config.dimension) return schema;
80
- for (const dim of this.config.dimension) if (typeof dim === "number") schema = z.tuple(Array(dim).map(() => schema));
80
+ for (const dim of this.config.dimension) if (typeof dim === "number") schema = z.tuple(Array.from({ length: dim }, () => schema));
81
81
  else schema = z.array(schema);
82
82
  return schema;
83
83
  }
@@ -86,10 +86,13 @@ var Column = class {
86
86
  * @returns string `"table"."column"`
87
87
  */
88
88
  get fullName() {
89
- return `"${this.table?._.name}"."${this.nameSnake}"`;
89
+ return `"${this.table?._.name}"."${this.nameSql}"`;
90
90
  }
91
- toQuery(query) {
92
- query.sql += this.fullName;
91
+ toQuery(query, ctx) {
92
+ const alias = ctx?.tableAliases?.get(`${this.table?._.schema}.${this.table?._.name}`);
93
+ if (alias === void 0) query.sql += this.fullName;
94
+ else if (alias === null) query.sql += `"${this.nameSql}"`;
95
+ else query.sql += `"${alias}"."${this.nameSql}"`;
93
96
  }
94
97
  /**
95
98
  * Converts a JavaScript value to the PostgreSQL driver format.
@@ -1,5 +1,6 @@
1
1
  import { TableAnyColumn } from "../table.mjs";
2
2
  import { AnyFilter, Filter } from "../filters/index.mjs";
3
+ import { QueryContext } from "../query-builders/query.mjs";
3
4
  import { Sql } from "../sql.mjs";
4
5
 
5
6
  //#region src/constraints/check.d.ts
@@ -14,8 +15,12 @@ declare class Check {
14
15
  constructor(name: string, expr: AnyFilter | Sql);
15
16
  /** Returns the constraint name, appending `_check` suffix if not already present. */
16
17
  getName(): string;
17
- /** Renders the constraint expression to a SQL string. */
18
- toSQL(): string;
18
+ /**
19
+ * Renders the constraint expression to a SQL string.
20
+ * Pass a {@link QueryContext} with `null` alias entries to suppress table qualifiers
21
+ * on specific tables (used by the snapshot builder for CHECK constraint SQL).
22
+ */
23
+ toSQL(ctx?: QueryContext): string;
19
24
  }
20
25
  //#endregion
21
26
  export { Check, CheckExpression };
@@ -1,5 +1,4 @@
1
1
  import { Query } from "../query-builders/query.mjs";
2
- import { isTableCol } from "../entity.mjs";
3
2
  import { Sql } from "../sql.mjs";
4
3
  //#region src/constraints/check.ts
5
4
  /** A CHECK constraint for a table, storing its name and filter/SQL expression. */
@@ -14,11 +13,15 @@ var Check = class {
14
13
  getName() {
15
14
  return this.#name.includes("check") ? this.#name : `${this.#name}_check`;
16
15
  }
17
- /** Renders the constraint expression to a SQL string. */
18
- toSQL() {
16
+ /**
17
+ * Renders the constraint expression to a SQL string.
18
+ * Pass a {@link QueryContext} with `null` alias entries to suppress table qualifiers
19
+ * on specific tables (used by the snapshot builder for CHECK constraint SQL).
20
+ */
21
+ toSQL(ctx) {
19
22
  if (this.#expr instanceof Sql) return this.#expr.string;
20
23
  const query = new Query("", () => []);
21
- this.#expr.toQuery(query);
24
+ this.#expr.toQuery(query, ctx);
22
25
  return query.sql;
23
26
  }
24
27
  };
@@ -26,31 +29,5 @@ var Check = class {
26
29
  function check(name, expr) {
27
30
  return new Check(name, expr);
28
31
  }
29
- /**
30
- * Wraps a column proxy so that `fullName` returns the unqualified quoted name,
31
- * e.g. `"price"` instead of `"public"."price"`.
32
- * Required so filter conditions in check constraints emit unqualified column names.
33
- */
34
- function proxyColumnForCheck(col) {
35
- return new Proxy(col, { get(target, prop) {
36
- if (prop === "fullName") return `"${target.nameSnake}"`;
37
- if (prop === "toQuery") return (val) => val.sql += `"${target.nameSnake}"`;
38
- const val = Reflect.get(target, prop, target);
39
- if (typeof val === "function") return val.bind(target);
40
- return val;
41
- } });
42
- }
43
- /**
44
- * Wraps a table so that any column access returns a check-safe column proxy.
45
- * Pass the result to the `checkConstraints` callback so filters produce correct SQL.
46
- */
47
- function createCheckTableProxy(table) {
48
- return new Proxy(table, { get(target, prop) {
49
- const val = Reflect.get(target, prop, target);
50
- if (isTableCol(val)) return proxyColumnForCheck(val);
51
- if (typeof val === "function") return val.bind(target);
52
- return val;
53
- } });
54
- }
55
32
  //#endregion
56
- export { check, createCheckTableProxy };
33
+ export { check };
@@ -11,7 +11,7 @@ var PrimaryKeyConstraint = class {
11
11
  return this.#name.startsWith(`${table._.name}_`) ? this.#name : `${table._.name}_${this.#name}`;
12
12
  }
13
13
  getColumns() {
14
- return this.#columns.map((col) => col.nameSnake);
14
+ return this.#columns.map((col) => col.nameSql);
15
15
  }
16
16
  };
17
17
  /**
@@ -11,7 +11,7 @@ var UniqueConstraint = class {
11
11
  return this.#name.startsWith(`${table._.name}_`) ? this.#name : `${table._.name}_${this.#name}`;
12
12
  }
13
13
  getColumns() {
14
- return this.#columns.map((col) => col.nameSnake);
14
+ return this.#columns.map((col) => col.nameSql);
15
15
  }
16
16
  };
17
17
  /**
@@ -20,4 +20,4 @@ function isTableCol(value) {
20
20
  }
21
21
  const isTCol = isTableCol;
22
22
  //#endregion
23
- export { is, isCol, isTCol, isTableCol };
23
+ export { is, isCol, isTCol };
@@ -1,7 +1,7 @@
1
1
  import { TableAnyColumn } from "../table.mjs";
2
2
  import { Filter } from "./index.mjs";
3
3
  import { Arg, IsArg } from "../query-builders/pre.mjs";
4
- import { Query } from "../query-builders/query.mjs";
4
+ import { Query, QueryContext } from "../query-builders/query.mjs";
5
5
 
6
6
  //#region src/filters/array.d.ts
7
7
  /**
@@ -17,7 +17,7 @@ declare class ArrayContainsFilter<TCol extends TableAnyColumn, TValues extends A
17
17
  readonly left: TCol;
18
18
  readonly values: TValues;
19
19
  constructor(column: TCol, values: TValues);
20
- toQuery(query: Query): void;
20
+ toQuery(query: Query, ctx?: QueryContext): void;
21
21
  }
22
22
  /**
23
23
  * Creates a condition that checks if an array column contains all specified values.
@@ -36,7 +36,7 @@ declare class ArrayContainedByFilter<TCol extends TableAnyColumn, TValues extend
36
36
  readonly left: TCol;
37
37
  readonly values: TValues;
38
38
  constructor(column: TCol, values: TValues);
39
- toQuery(query: Query): void;
39
+ toQuery(query: Query, ctx?: QueryContext): void;
40
40
  }
41
41
  /**
42
42
  * Creates a condition that checks if an array column is contained by the specified values.
@@ -52,7 +52,7 @@ declare class ArrayOverlapsFilter<TCol extends TableAnyColumn, TValues extends A
52
52
  readonly left: TCol;
53
53
  readonly right: TValues;
54
54
  constructor(column: TCol, values: TValues);
55
- toQuery(query: Query): void;
55
+ toQuery(query: Query, ctx?: QueryContext): void;
56
56
  }
57
57
  /**
58
58
  * Creates a condition that checks if an array column overlaps with the specified values.
@@ -68,7 +68,7 @@ declare class ArrayHasFilter<TCol extends TableAnyColumn, TRight extends ArrayEl
68
68
  readonly left: TCol;
69
69
  readonly value: TRight;
70
70
  constructor(column: TCol, value: TRight);
71
- toQuery(query: Query): void;
71
+ toQuery(query: Query, ctx?: QueryContext): void;
72
72
  }
73
73
  /**
74
74
  * Creates a condition that checks if a value exists in an array column.
@@ -84,7 +84,7 @@ declare class ArrayAllFilter<TCol extends TableAnyColumn, TRight extends ArrayEl
84
84
  readonly left: TCol;
85
85
  readonly value: TRight;
86
86
  constructor(column: TCol, value: TRight);
87
- toQuery(query: Query): void;
87
+ toQuery(query: Query, ctx?: QueryContext): void;
88
88
  }
89
89
  /**
90
90
  * Creates a condition that checks if all elements in an array column equal a value.
@@ -24,8 +24,9 @@ var ArrayContainsFilter = class extends Filter {
24
24
  this.left = column;
25
25
  this.values = values;
26
26
  }
27
- toQuery(query) {
28
- query.sql += `${this.left.fullName} @> `;
27
+ toQuery(query, ctx) {
28
+ this.left.toQuery(query, ctx);
29
+ query.sql += " @> ";
29
30
  if (is(this.values, Arg)) query.addArg(this.values);
30
31
  else query.sql += `${this.left.toSQL(this.values)}::${this.left.sqlType}`;
31
32
  }
@@ -45,8 +46,9 @@ var ArrayContainedByFilter = class extends Filter {
45
46
  this.left = column;
46
47
  this.values = values;
47
48
  }
48
- toQuery(query) {
49
- query.sql += `${this.left.fullName} <@ `;
49
+ toQuery(query, ctx) {
50
+ this.left.toQuery(query, ctx);
51
+ query.sql += " <@ ";
50
52
  if (is(this.values, Arg)) query.addArg(this.values);
51
53
  else query.sql += `${this.left.toSQL(this.values)}::${this.left.sqlType}`;
52
54
  }
@@ -66,8 +68,9 @@ var ArrayOverlapsFilter = class extends Filter {
66
68
  this.left = column;
67
69
  this.right = values;
68
70
  }
69
- toQuery(query) {
70
- query.sql += `${this.left.fullName} && `;
71
+ toQuery(query, ctx) {
72
+ this.left.toQuery(query, ctx);
73
+ query.sql += " && ";
71
74
  if (is(this.right, Arg)) query.addArg(this.right);
72
75
  else query.sql += `${this.left.toSQL(this.right)}::${this.left.sqlType}`;
73
76
  }
@@ -87,10 +90,12 @@ var ArrayHasFilter = class extends Filter {
87
90
  this.left = column;
88
91
  this.value = value;
89
92
  }
90
- toQuery(query) {
93
+ toQuery(query, ctx) {
91
94
  if (is(this.value, Arg)) query.addArg(this.value);
92
95
  else query.sql += this.left.toSQLScalar(this.value);
93
- query.sql += ` = ANY(${this.left.fullName})`;
96
+ query.sql += " = ANY(";
97
+ this.left.toQuery(query, ctx);
98
+ query.sql += ")";
94
99
  }
95
100
  };
96
101
  function arrayHas(column, value) {
@@ -108,10 +113,12 @@ var ArrayAllFilter = class extends Filter {
108
113
  this.left = column;
109
114
  this.value = value;
110
115
  }
111
- toQuery(query) {
116
+ toQuery(query, ctx) {
112
117
  if (is(this.value, Arg)) query.addArg(this.value);
113
118
  else query.sql += this.left.toSQLScalar(this.value);
114
- query.sql += ` = ALL(${this.left.fullName})`;
119
+ query.sql += " = ALL(";
120
+ this.left.toQuery(query, ctx);
121
+ query.sql += ")";
115
122
  }
116
123
  };
117
124
  function arrayAll(column, value) {
@@ -3,7 +3,7 @@ import { TableAnyColumn } from "../table.mjs";
3
3
  import { AnyScalarSqlFn } from "../functions/index.mjs";
4
4
  import { SelectQuery } from "../query-builders/select.mjs";
5
5
  import { Arg, IsArg } from "../query-builders/pre.mjs";
6
- import { Query } from "../query-builders/query.mjs";
6
+ import { Query, QueryContext } from "../query-builders/query.mjs";
7
7
  import { Sql } from "../sql.mjs";
8
8
 
9
9
  //#region src/filters/index.d.ts
@@ -13,7 +13,7 @@ declare abstract class Filter<TColumns extends TableAnyColumn = TableAnyColumn,
13
13
  readonly $Columns: TColumns;
14
14
  /** Phantom field: `true` when this filter embeds at least one `Arg` placeholder. */
15
15
  readonly $HasArg: THasArg;
16
- abstract toQuery(query: Query): void;
16
+ abstract toQuery(query: Query, ctx?: QueryContext): void;
17
17
  }
18
18
  /** Convenience alias for a `Filter` with all type parameters widened to `any`. */
19
19
  type AnyFilter = Filter<any, any>;
@@ -33,14 +33,14 @@ declare class ComparisonLeftIsColumn<TLeft extends TableAnyColumn, TOp extends s
33
33
  readonly op: TOp;
34
34
  readonly right: TRight;
35
35
  constructor(field: TLeft, op: TOp, right: TRight);
36
- toQuery(query: Query): void;
36
+ toQuery(query: Query, ctx?: QueryContext): void;
37
37
  }
38
38
  declare class ComparisonLeftIsSqlFn<TLeft extends AnyScalarSqlFn, TOp extends string, TRight extends BasicTypes | AnyScalarSqlFn> extends Filter<TLeft["$Columns"] | (TRight extends AnyScalarSqlFn ? TRight["$Columns"] : never), HasArg<TLeft> extends true ? true : HasArg<TRight>> {
39
39
  readonly left: TLeft;
40
40
  readonly op: TOp;
41
41
  readonly right: TRight;
42
42
  constructor(field: TLeft, op: TOp, right: TRight);
43
- toQuery(query: Query): void;
43
+ toQuery(query: Query, ctx?: QueryContext): void;
44
44
  }
45
45
  declare function eq<TLeft extends TableAnyColumn, TRight extends TLeft["ValType"]>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, "=", TRight>;
46
46
  declare function eq<TLeft extends TableAnyColumn, TRight extends Arg<TLeft["ValType"]> | TableAnyColumn | AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, "=", TRight>;
@@ -69,13 +69,13 @@ declare function lte<TLeft extends AnyScalarSqlFn, TRight extends AnyScalarSqlFn
69
69
  declare class IsNullCondition<TCol extends TableAnyColumn> extends Filter<TCol, false> {
70
70
  readonly field: TCol;
71
71
  constructor(field: TCol);
72
- toQuery(query: Query): void;
72
+ toQuery(query: Query, ctx?: QueryContext): void;
73
73
  }
74
74
  declare function isNull<TCol extends TableAnyColumn>(field: TCol): IsNullCondition<TCol>;
75
75
  declare class IsNotNullCondition<TCol extends TableAnyColumn> extends Filter<TCol, false> {
76
76
  readonly field: TCol;
77
77
  constructor(field: TCol);
78
- toQuery(query: Query): void;
78
+ toQuery(query: Query, ctx?: QueryContext): void;
79
79
  }
80
80
  declare function isNotNull<TCol extends TableAnyColumn>(field: TCol): IsNotNullCondition<TCol>;
81
81
  type InSelectQuery<TArg extends boolean, TReturn> = SelectQuery<any, any, any, any, any, TArg, any, any, Record<string, TReturn>[]>;
@@ -83,26 +83,26 @@ declare class InCondition<TCol extends TableAnyColumn, TArg extends boolean> ext
83
83
  readonly field: TCol;
84
84
  readonly values: TCol["ValType"][] | InSelectQuery<TArg, TCol["ValType"]>;
85
85
  constructor(field: TCol, values: TCol["ValType"][] | InSelectQuery<TArg, TCol["ValType"]>);
86
- toQuery(query: Query): void;
86
+ toQuery(query: Query, ctx?: QueryContext): void;
87
87
  }
88
88
  declare function isIn<TCol extends TableAnyColumn>(field: TCol, values: TCol["ValType"][] | InSelectQuery<boolean, TCol["ValType"]>): InCondition<TCol, false>;
89
89
  declare class NotInCondition<TCol extends TableAnyColumn> extends Filter<TCol, false> {
90
90
  readonly field: TCol;
91
91
  readonly values: TCol["ValType"][];
92
92
  constructor(field: TCol, values: TCol["ValType"][]);
93
- toQuery(query: Query): void;
93
+ toQuery(query: Query, ctx?: QueryContext): void;
94
94
  }
95
95
  declare function notIn<TCol extends TableAnyColumn>(field: TCol, values: TCol["ValType"][]): NotInCondition<TCol>;
96
96
  declare class AndCondition<TConditions extends (AnyFilter | Sql)[]> extends Filter<ExtractCols<TConditions[number]>, HasArgOf<TConditions>> {
97
97
  readonly conditions: TConditions;
98
98
  constructor(...conditions: TConditions);
99
- toQuery(query: Query): void;
99
+ toQuery(query: Query, ctx?: QueryContext): void;
100
100
  }
101
101
  declare function and<TConditions extends (AnyFilter | Sql)[]>(...conditions: TConditions): AndCondition<TConditions>;
102
102
  declare class OrCondition<TConditions extends (AnyFilter | Sql)[]> extends Filter<ExtractCols<TConditions[number]>, HasArgOf<TConditions>> {
103
103
  readonly conditions: TConditions;
104
104
  constructor(...conditions: TConditions);
105
- toQuery(query: Query): void;
105
+ toQuery(query: Query, ctx?: QueryContext): void;
106
106
  }
107
107
  declare function or<TConditions extends (AnyFilter | Sql)[]>(...conditions: TConditions): OrCondition<TConditions>;
108
108
  //#endregion
@@ -20,12 +20,12 @@ var ComparisonLeftIsColumn = class extends Filter {
20
20
  this.op = op;
21
21
  this.right = right;
22
22
  }
23
- toQuery(query) {
24
- this.left.toQuery(query);
23
+ toQuery(query, ctx) {
24
+ this.left.toQuery(query, ctx);
25
25
  query.sql += ` ${this.op} `;
26
26
  if (is(this.right, Arg)) query.addArg(this.right);
27
- else if (isTCol(this.right)) this.right.toQuery(query);
28
- else if (this.right instanceof SqlFn) this.right.toQuery(query);
27
+ else if (isTCol(this.right)) this.right.toQuery(query, ctx);
28
+ else if (this.right instanceof SqlFn) this.right.toQuery(query, ctx);
29
29
  else query.sql += this.left.toSQL(this.right);
30
30
  }
31
31
  };
@@ -39,10 +39,10 @@ var ComparisonLeftIsSqlFn = class extends Filter {
39
39
  this.op = op;
40
40
  this.right = right;
41
41
  }
42
- toQuery(query) {
43
- this.left.toQuery(query);
42
+ toQuery(query, ctx) {
43
+ this.left.toQuery(query, ctx);
44
44
  query.sql += ` ${this.op} `;
45
- if (this.right instanceof SqlFn) this.right.toQuery(query);
45
+ if (this.right instanceof SqlFn) this.right.toQuery(query, ctx);
46
46
  else query.sql += toSqlValue(this.right);
47
47
  }
48
48
  };
@@ -76,8 +76,9 @@ var IsNullCondition = class extends Filter {
76
76
  super();
77
77
  this.field = field;
78
78
  }
79
- toQuery(query) {
80
- query.sql += `${this.field.fullName} IS NULL`;
79
+ toQuery(query, ctx) {
80
+ this.field.toQuery(query, ctx);
81
+ query.sql += " IS NULL";
81
82
  }
82
83
  };
83
84
  function isNull(field) {
@@ -89,8 +90,9 @@ var IsNotNullCondition = class extends Filter {
89
90
  super();
90
91
  this.field = field;
91
92
  }
92
- toQuery(query) {
93
- query.sql += `${this.field.fullName} IS NOT NULL`;
93
+ toQuery(query, ctx) {
94
+ this.field.toQuery(query, ctx);
95
+ query.sql += " IS NOT NULL";
94
96
  }
95
97
  };
96
98
  function isNotNull(field) {
@@ -104,17 +106,19 @@ var InCondition = class extends Filter {
104
106
  this.field = field;
105
107
  this.values = values;
106
108
  }
107
- toQuery(query) {
109
+ toQuery(query, ctx) {
108
110
  if (Array.isArray(this.values)) {
109
111
  if (this.values.length === 0) {
110
112
  query.sql += "FALSE";
111
113
  return;
112
114
  }
113
- query.sql += `${this.field.fullName} IN (`;
115
+ this.field.toQuery(query, ctx);
116
+ query.sql += " IN (";
114
117
  query.sql += this.values.map((v) => this.field.toSQL(v)).join(", ");
115
118
  query.sql += ")";
116
119
  } else {
117
- query.sql += `${this.field.fullName} IN (`;
120
+ this.field.toQuery(query, ctx);
121
+ query.sql += " IN (";
118
122
  query.sql += this.values.toQuery();
119
123
  query.sql += ")";
120
124
  }
@@ -131,12 +135,13 @@ var NotInCondition = class extends Filter {
131
135
  this.field = field;
132
136
  this.values = values;
133
137
  }
134
- toQuery(query) {
138
+ toQuery(query, ctx) {
135
139
  if (this.values.length === 0) {
136
140
  query.sql += "TRUE";
137
141
  return;
138
142
  }
139
- query.sql += `${this.field.fullName} NOT IN (`;
143
+ this.field.toQuery(query, ctx);
144
+ query.sql += " NOT IN (";
140
145
  query.sql += this.values.map((v) => this.field.toSQL(v)).join(", ");
141
146
  query.sql += ")";
142
147
  }
@@ -150,10 +155,10 @@ var AndCondition = class extends Filter {
150
155
  super();
151
156
  this.conditions = conditions;
152
157
  }
153
- toQuery(query) {
158
+ toQuery(query, ctx) {
154
159
  query.sql += "(";
155
160
  for (let i = 0; i < this.conditions.length; i++) {
156
- this.conditions[i].toQuery(query);
161
+ this.conditions[i].toQuery(query, ctx);
157
162
  if (i < this.conditions.length - 1) query.sql += " AND ";
158
163
  }
159
164
  query.sql += ")";
@@ -168,10 +173,10 @@ var OrCondition = class extends Filter {
168
173
  super();
169
174
  this.conditions = conditions;
170
175
  }
171
- toQuery(query) {
176
+ toQuery(query, ctx) {
172
177
  query.sql += "(";
173
178
  for (let i = 0; i < this.conditions.length; i++) {
174
- this.conditions[i].toQuery(query);
179
+ this.conditions[i].toQuery(query, ctx);
175
180
  if (i < this.conditions.length - 1) query.sql += " OR ";
176
181
  }
177
182
  query.sql += ")";
@@ -3,7 +3,7 @@ import { TableColumn } from "../table.mjs";
3
3
  import { Filter } from "./index.mjs";
4
4
  import { PointColumn } from "../columns/postgis/geography/point.mjs";
5
5
  import { Arg, IsArg } from "../query-builders/pre.mjs";
6
- import { Query } from "../query-builders/query.mjs";
6
+ import { Query, QueryContext } from "../query-builders/query.mjs";
7
7
 
8
8
  //#region src/filters/postgis.d.ts
9
9
  /** Constrains `TCol` to geography point columns only. */
@@ -22,7 +22,7 @@ declare class StDWithinFilter<TCol extends GeographyPointCol, TPoint extends TCo
22
22
  private readonly point;
23
23
  private readonly radius;
24
24
  constructor(col: TCol, point: TPoint, radius: TRadius);
25
- toQuery(query: Query): void;
25
+ toQuery(query: Query, ctx?: QueryContext): void;
26
26
  }
27
27
  /**
28
28
  * Creates a condition that checks if a geography column is within `radius` meters
@@ -50,7 +50,7 @@ declare class StIntersectsFilter<TCol extends GeographyPointCol, TPoint extends
50
50
  private readonly col;
51
51
  private readonly point;
52
52
  constructor(col: TCol, point: TPoint);
53
- toQuery(query: Query): void;
53
+ toQuery(query: Query, ctx?: QueryContext): void;
54
54
  }
55
55
  /**
56
56
  * Creates a condition that checks if a geography column intersects the given point.
@@ -73,7 +73,7 @@ declare class StContainsFilter<TCol extends GeographyPointCol, TPoint extends TC
73
73
  private readonly col;
74
74
  private readonly point;
75
75
  constructor(col: TCol, point: TPoint);
76
- toQuery(query: Query): void;
76
+ toQuery(query: Query, ctx?: QueryContext): void;
77
77
  }
78
78
  /**
79
79
  * Creates a condition that checks if a geography column contains the given point.
@@ -96,7 +96,7 @@ declare class StWithinFilter<TCol extends GeographyPointCol, TPoint extends TCol
96
96
  private readonly col;
97
97
  private readonly point;
98
98
  constructor(col: TCol, point: TPoint);
99
- toQuery(query: Query): void;
99
+ toQuery(query: Query, ctx?: QueryContext): void;
100
100
  }
101
101
  /**
102
102
  * Creates a condition that checks if a geography column is within the given point geometry.
@@ -25,8 +25,10 @@ var StDWithinFilter = class extends Filter {
25
25
  this.point = point;
26
26
  this.radius = radius;
27
27
  }
28
- toQuery(query) {
29
- query.sql += `ST_DWithin(${this.col.fullName}, `;
28
+ toQuery(query, ctx) {
29
+ query.sql += "ST_DWithin(";
30
+ this.col.toQuery(query, ctx);
31
+ query.sql += ", ";
30
32
  pointToQuery(query, this.point, this.col.toSQL.bind(this.col));
31
33
  query.sql += ", ";
32
34
  if (is(this.radius, Arg)) query.addArg(this.radius);
@@ -64,8 +66,10 @@ var StIntersectsFilter = class extends Filter {
64
66
  this.col = col;
65
67
  this.point = point;
66
68
  }
67
- toQuery(query) {
68
- query.sql += `ST_Intersects(${this.col.fullName}, `;
69
+ toQuery(query, ctx) {
70
+ query.sql += "ST_Intersects(";
71
+ this.col.toQuery(query, ctx);
72
+ query.sql += ", ";
69
73
  pointToQuery(query, this.point, this.col.toSQL.bind(this.col));
70
74
  query.sql += ")";
71
75
  }
@@ -95,8 +99,10 @@ var StContainsFilter = class extends Filter {
95
99
  this.col = col;
96
100
  this.point = point;
97
101
  }
98
- toQuery(query) {
99
- query.sql += `ST_Contains(${this.col.fullName}, `;
102
+ toQuery(query, ctx) {
103
+ query.sql += "ST_Contains(";
104
+ this.col.toQuery(query, ctx);
105
+ query.sql += ", ";
100
106
  pointToQuery(query, this.point, this.col.toSQL.bind(this.col));
101
107
  query.sql += ")";
102
108
  }
@@ -126,8 +132,10 @@ var StWithinFilter = class extends Filter {
126
132
  this.col = col;
127
133
  this.point = point;
128
134
  }
129
- toQuery(query) {
130
- query.sql += `ST_Within(${this.col.fullName}, `;
135
+ toQuery(query, ctx) {
136
+ query.sql += "ST_Within(";
137
+ this.col.toQuery(query, ctx);
138
+ query.sql += ", ";
131
139
  pointToQuery(query, this.point, this.col.toSQL.bind(this.col));
132
140
  query.sql += ")";
133
141
  }