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.
- package/dist/bin.cjs +1 -1
- package/dist/src/columns/common.d.mts +19 -21
- package/dist/src/columns/common.mjs +11 -8
- package/dist/src/constraints/check.d.mts +7 -2
- package/dist/src/constraints/check.mjs +8 -31
- package/dist/src/constraints/primary-key.mjs +1 -1
- package/dist/src/constraints/unique.mjs +1 -1
- package/dist/src/entity.mjs +1 -1
- package/dist/src/filters/array.d.mts +6 -6
- package/dist/src/filters/array.mjs +17 -10
- package/dist/src/filters/index.d.mts +10 -10
- package/dist/src/filters/index.mjs +25 -20
- package/dist/src/filters/postgis.d.mts +5 -5
- package/dist/src/filters/postgis.mjs +16 -8
- package/dist/src/filters/string.d.mts +5 -5
- package/dist/src/filters/string.mjs +13 -8
- package/dist/src/functions/aggregate.d.mts +8 -8
- package/dist/src/functions/aggregate.mjs +13 -13
- package/dist/src/functions/index.d.mts +2 -2
- package/dist/src/functions/numeric.d.mts +6 -6
- package/dist/src/functions/numeric.mjs +10 -10
- package/dist/src/functions/postgis.d.mts +2 -2
- package/dist/src/functions/postgis.mjs +4 -2
- package/dist/src/functions/string.d.mts +8 -8
- package/dist/src/functions/string.mjs +14 -14
- package/dist/src/index.d.mts +2 -2
- package/dist/src/indexes.mjs +1 -1
- package/dist/src/migration/ddl/indexes.mjs +0 -1
- package/dist/src/migration/snapshot.d.mts +0 -2
- package/dist/src/migration/snapshot.mjs +7 -8
- package/dist/src/query-builders/delete.mjs +2 -3
- package/dist/src/query-builders/insert.mjs +2 -2
- package/dist/src/query-builders/orderby-clause.d.mts +5 -5
- package/dist/src/query-builders/orderby-clause.mjs +7 -4
- package/dist/src/query-builders/query.d.mts +17 -1
- package/dist/src/query-builders/rq.d.mts +2 -2
- package/dist/src/query-builders/rq.mjs +10 -9
- package/dist/src/query-builders/select.d.mts +3 -3
- package/dist/src/query-builders/update.d.mts +1 -1
- package/dist/src/query-builders/update.mjs +2 -2
- package/dist/src/sql.d.mts +2 -2
- package/dist/src/sql.mjs +1 -1
- package/dist/src/table.d.mts +2 -2
- package/dist/src/validators/zod.d.mts +3 -13
- package/dist/src/validators/zod.mjs +14 -9
- 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.
|
|
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"] :
|
|
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
|
-
|
|
120
|
-
} ? this
|
|
117
|
+
isNotNull: true;
|
|
118
|
+
} ? this extends {
|
|
121
119
|
hasInsertFn: true;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
} ? this["ValType"] | Sql : this["ValType"] | Sql | null | undefined;
|
|
125
|
-
readonly ValTypeUpdate:
|
|
126
|
-
|
|
127
|
-
} ? never :
|
|
128
|
-
|
|
129
|
-
} ? this["ValType"] : this["ValType"] | null;
|
|
130
|
-
readonly ValTypeSelect:
|
|
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
|
-
}
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
|
|
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
|
|
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
|
-
#
|
|
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.#
|
|
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
|
|
51
|
-
return this.#
|
|
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
|
|
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.
|
|
89
|
+
return `"${this.table?._.name}"."${this.nameSql}"`;
|
|
90
90
|
}
|
|
91
|
-
toQuery(query) {
|
|
92
|
-
|
|
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
|
-
/**
|
|
18
|
-
|
|
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
|
-
/**
|
|
18
|
-
|
|
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
|
|
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.
|
|
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.
|
|
14
|
+
return this.#columns.map((col) => col.nameSql);
|
|
15
15
|
}
|
|
16
16
|
};
|
|
17
17
|
/**
|
package/dist/src/entity.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 +=
|
|
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 +=
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 +=
|
|
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 +=
|
|
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 +=
|
|
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 +=
|
|
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
|
}
|