metal-orm 1.1.11 → 1.1.16
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/README.md +758 -769
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +100 -96
- package/scripts/generate-entities/schema.mjs +122 -122
- package/scripts/generate-entities/tree-detection.mjs +92 -92
- package/scripts/inflection/pt-br.mjs +468 -468
- package/scripts/run-eslint.mjs +33 -34
- package/scripts/show-sql-seed.sql +102 -0
- package/scripts/show-sql.mjs +321 -325
- package/src/codegen/naming-strategy.ts +54 -54
- package/src/codegen/typescript.ts +482 -482
- package/src/core/ast/adapters.ts +1 -1
- package/src/core/ast/builders.ts +123 -123
- package/src/core/ast/expression-builders.ts +745 -745
- package/src/core/ast/expression-nodes.ts +304 -304
- package/src/core/ast/expression-visitor.ts +212 -212
- package/src/core/ast/expression.ts +20 -20
- package/src/core/ast/helpers.ts +14 -14
- package/src/core/ast/join.ts +18 -18
- package/src/core/ast/query.ts +200 -200
- package/src/core/ddl/dialects/base-schema-dialect.ts +1 -1
- package/src/core/ddl/dialects/mssql-schema-dialect.ts +1 -1
- package/src/core/ddl/dialects/mysql-schema-dialect.ts +1 -1
- package/src/core/ddl/dialects/postgres-schema-dialect.ts +1 -1
- package/src/core/ddl/dialects/render-reference.test.ts +70 -70
- package/src/core/ddl/dialects/sqlite-schema-dialect.ts +1 -1
- package/src/core/ddl/introspect/catalogs/index.ts +5 -5
- package/src/core/ddl/introspect/catalogs/postgres.ts +146 -146
- package/src/core/ddl/introspect/context.ts +15 -15
- package/src/core/ddl/introspect/functions/postgres.ts +35 -35
- package/src/core/ddl/introspect/registry.ts +40 -40
- package/src/core/ddl/introspect/run-select.ts +35 -35
- package/src/core/ddl/introspect/utils.ts +56 -56
- package/src/core/ddl/naming-strategy.ts +16 -16
- package/src/core/ddl/schema-dialect.ts +56 -56
- package/src/core/ddl/schema-diff.ts +234 -234
- package/src/core/ddl/schema-generator.ts +1 -1
- package/src/core/ddl/schema-introspect.ts +25 -25
- package/src/core/ddl/sql-writing.ts +171 -171
- package/src/core/dialect/abstract.ts +541 -541
- package/src/core/dialect/base/cte-compiler.ts +33 -33
- package/src/core/dialect/base/function-table-formatter.ts +103 -103
- package/src/core/dialect/base/groupby-compiler.ts +21 -21
- package/src/core/dialect/base/join-compiler.ts +25 -25
- package/src/core/dialect/base/orderby-compiler.ts +35 -35
- package/src/core/dialect/base/pagination-strategy.ts +32 -32
- package/src/core/dialect/base/returning-strategy.ts +57 -57
- package/src/core/dialect/base/sql-dialect.ts +294 -294
- package/src/core/dialect/dialect-factory.ts +91 -91
- package/src/core/dialect/mssql/functions.ts +120 -120
- package/src/core/dialect/mssql/index.ts +317 -317
- package/src/core/dialect/mysql/functions.ts +103 -103
- package/src/core/dialect/mysql/index.ts +105 -105
- package/src/core/dialect/postgres/functions.ts +108 -108
- package/src/core/dialect/postgres/index.ts +91 -91
- package/src/core/dialect/sqlite/functions.ts +129 -129
- package/src/core/dialect/sqlite/index.ts +67 -67
- package/src/core/driver/database-driver.ts +19 -19
- package/src/core/driver/mssql-driver.ts +23 -23
- package/src/core/driver/mysql-driver.ts +23 -23
- package/src/core/driver/postgres-driver.ts +23 -23
- package/src/core/driver/sqlite-driver.ts +23 -23
- package/src/core/execution/db-executor.ts +92 -92
- package/src/core/execution/executors/better-sqlite3-executor.ts +90 -90
- package/src/core/execution/executors/mssql-executor.ts +184 -184
- package/src/core/execution/executors/mysql-executor.ts +88 -88
- package/src/core/execution/executors/postgres-executor.ts +26 -26
- package/src/core/execution/executors/sqlite-executor.ts +42 -42
- package/src/core/execution/pooling/pool-types.ts +30 -30
- package/src/core/execution/pooling/pool.ts +275 -275
- package/src/core/functions/array.ts +35 -35
- package/src/core/functions/control-flow.ts +79 -79
- package/src/core/functions/datetime.ts +237 -237
- package/src/core/functions/json.ts +70 -70
- package/src/core/functions/numeric.ts +297 -297
- package/src/core/functions/text.ts +334 -334
- package/src/core/functions/types.ts +33 -33
- package/src/core/hydration/types.ts +51 -51
- package/src/core/sql/sql-operator-config.ts +39 -39
- package/src/core/sql/sql.ts +152 -152
- package/src/decorators/column-decorator.ts +87 -87
- package/src/decorators/decorator-metadata.ts +143 -143
- package/src/decorators/entity.ts +93 -93
- package/src/decorators/index.ts +39 -39
- package/src/decorators/relations.ts +231 -231
- package/src/decorators/transformers/built-in/string-transformers.ts +231 -231
- package/src/decorators/transformers/transformer-decorators.ts +134 -134
- package/src/decorators/transformers/transformer-executor.ts +171 -171
- package/src/decorators/transformers/transformer-metadata.ts +73 -73
- package/src/decorators/validators/built-in/br-cep-validator.ts +55 -55
- package/src/decorators/validators/built-in/br-cnpj-validator.ts +105 -105
- package/src/decorators/validators/built-in/br-cpf-validator.ts +103 -103
- package/src/decorators/validators/country-validator-registry.ts +64 -64
- package/src/decorators/validators/country-validators-decorators.ts +203 -203
- package/src/decorators/validators/country-validators.ts +105 -105
- package/src/decorators/validators/validator-metadata.ts +59 -59
- package/src/dto/dto-types.ts +226 -226
- package/src/dto/filter-types.ts +141 -141
- package/src/dto/index.ts +95 -95
- package/src/dto/openapi/generators/base.ts +29 -29
- package/src/dto/openapi/generators/column.ts +37 -37
- package/src/dto/openapi/generators/dto.ts +91 -91
- package/src/dto/openapi/generators/filter.ts +75 -75
- package/src/dto/openapi/generators/nested-dto.ts +618 -618
- package/src/dto/openapi/generators/pagination.ts +111 -111
- package/src/dto/openapi/generators/relation-filter.ts +228 -228
- package/src/dto/openapi/index.ts +12 -12
- package/src/dto/openapi/types.ts +101 -101
- package/src/dto/openapi/utilities.ts +95 -95
- package/src/dto/pagination-utils.ts +150 -150
- package/src/dto/transform.ts +197 -197
- package/src/index.ts +86 -86
- package/src/orm/als.ts +58 -58
- package/src/orm/domain-event-bus.ts +119 -119
- package/src/orm/entity-context.ts +86 -86
- package/src/orm/entity-materializer.ts +159 -159
- package/src/orm/entity-meta.ts +97 -97
- package/src/orm/entity-registry.ts +39 -39
- package/src/orm/entity-relation-cache.ts +39 -39
- package/src/orm/execute.ts +194 -194
- package/src/orm/execution-context.ts +18 -18
- package/src/orm/hydration-context.ts +26 -26
- package/src/orm/hydration.ts +112 -112
- package/src/orm/identity-map.ts +61 -61
- package/src/orm/interceptor-pipeline.ts +16 -16
- package/src/orm/lazy-batch/belongs-to-many.ts +119 -119
- package/src/orm/lazy-batch/belongs-to.ts +108 -108
- package/src/orm/lazy-batch/has-many.ts +69 -69
- package/src/orm/lazy-batch/has-one.ts +68 -68
- package/src/orm/lazy-batch/shared.ts +125 -125
- package/src/orm/orm-session.ts +620 -620
- package/src/orm/orm.ts +34 -34
- package/src/orm/pooled-executor-factory.ts +121 -121
- package/src/orm/query-logger.ts +40 -40
- package/src/orm/relation-change-processor.ts +420 -420
- package/src/orm/relations/belongs-to.ts +143 -143
- package/src/orm/relations/has-many.ts +204 -204
- package/src/orm/relations/has-one.ts +174 -174
- package/src/orm/relations/many-to-many.ts +288 -288
- package/src/orm/relations/morph-many.ts +156 -156
- package/src/orm/relations/morph-one.ts +151 -151
- package/src/orm/relations/morph-to.ts +162 -162
- package/src/orm/runtime-types.ts +92 -92
- package/src/orm/save-graph.ts +561 -561
- package/src/orm/transaction-runner.ts +24 -24
- package/src/orm/unit-of-work.ts +426 -426
- package/src/query/index.ts +69 -69
- package/src/query/target.ts +46 -46
- package/src/query-builder/column-selector.ts +81 -81
- package/src/query-builder/delete.ts +141 -141
- package/src/query-builder/insert-query-state.ts +149 -149
- package/src/query-builder/insert.ts +117 -117
- package/src/query-builder/query-ast-service.ts +287 -287
- package/src/query-builder/query-resolution.ts +78 -78
- package/src/query-builder/raw-column-parser.ts +38 -38
- package/src/query-builder/relation-filter-utils.ts +153 -153
- package/src/query-builder/relation-join-planner.ts +10 -10
- package/src/query-builder/relation-manager.ts +87 -87
- package/src/query-builder/relation-projection-helper.ts +102 -102
- package/src/query-builder/relation-types.ts +9 -9
- package/src/query-builder/relation-utils.ts +15 -15
- package/src/query-builder/select/cte-facet.ts +40 -40
- package/src/query-builder/select/from-facet.ts +80 -80
- package/src/query-builder/select/join-facet.ts +62 -62
- package/src/query-builder/select/predicate-facet.ts +104 -104
- package/src/query-builder/select/projection-facet.ts +70 -70
- package/src/query-builder/select/relation-facet.ts +81 -81
- package/src/query-builder/select/setop-facet.ts +36 -36
- package/src/query-builder/select-helpers.ts +1 -1
- package/src/query-builder/select-query-builder-deps.ts +130 -130
- package/src/query-builder/select-query-state.ts +207 -207
- package/src/query-builder/update.ts +151 -151
- package/src/schema/column-types.ts +322 -322
- package/src/schema/table-guards.ts +37 -37
- package/src/schema/table.ts +281 -281
- package/src/tree/index.ts +13 -13
- package/src/tree/nested-set-strategy.ts +545 -545
- package/src/tree/tree-decorator.ts +397 -397
- package/src/tree/tree-manager.ts +754 -754
- package/src/tree/tree-query.ts +427 -427
- package/src/tree/tree-types.ts +299 -299
package/src/query/index.ts
CHANGED
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
import { TableDef } from '../schema/table.js';
|
|
2
|
-
import { SelectQueryBuilder } from '../query-builder/select.js';
|
|
3
|
-
import { InsertQueryBuilder } from '../query-builder/insert.js';
|
|
4
|
-
import { UpdateQueryBuilder } from '../query-builder/update.js';
|
|
1
|
+
import { TableDef } from '../schema/table.js';
|
|
2
|
+
import { SelectQueryBuilder } from '../query-builder/select.js';
|
|
3
|
+
import { InsertQueryBuilder } from '../query-builder/insert.js';
|
|
4
|
+
import { UpdateQueryBuilder } from '../query-builder/update.js';
|
|
5
5
|
import { DeleteQueryBuilder } from '../query-builder/delete.js';
|
|
6
6
|
import { callProcedure } from '../query-builder/procedure-call.js';
|
|
7
|
-
import { QueryTarget, resolveTable } from './target.js';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Creates a SELECT query builder for the specified table or entity.
|
|
11
|
-
*
|
|
12
|
-
* @template TTable - The table definition type
|
|
13
|
-
* @param target - The table definition or entity constructor to query from
|
|
14
|
-
* @returns A new SelectQueryBuilder instance for building SELECT queries
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* const query = selectFrom(UserTable).select('id', 'name');
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
|
-
export const selectFrom = <TTable extends TableDef>(target: QueryTarget<TTable>): SelectQueryBuilder<unknown, TTable> => {
|
|
22
|
-
const table = resolveTable(target);
|
|
23
|
-
return new SelectQueryBuilder(table);
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Creates an INSERT query builder for the specified table or entity.
|
|
28
|
-
*
|
|
29
|
-
* @template TTable - The table definition type
|
|
30
|
-
* @param target - The table definition or entity constructor to insert into
|
|
31
|
-
* @returns A new InsertQueryBuilder instance for building INSERT queries
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```typescript
|
|
35
|
-
* const query = insertInto(UserTable).values({ name: 'John', email: 'john@example.com' });
|
|
36
|
-
* ```
|
|
37
|
-
*/
|
|
38
|
-
export const insertInto = <TTable extends TableDef>(target: QueryTarget<TTable>): InsertQueryBuilder<unknown> => {
|
|
39
|
-
const table = resolveTable(target);
|
|
40
|
-
return new InsertQueryBuilder(table);
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Creates an UPDATE query builder for the specified table or entity.
|
|
45
|
-
*
|
|
46
|
-
* @template TTable - The table definition type
|
|
47
|
-
* @param target - The table definition or entity constructor to update
|
|
48
|
-
* @returns A new UpdateQueryBuilder instance for building UPDATE queries
|
|
49
|
-
*
|
|
50
|
-
* @example
|
|
51
|
-
* ```typescript
|
|
52
|
-
* const query = update(UserTable).set({ name: 'Jane' }).where(eq(UserTable.id, 1));
|
|
53
|
-
* ```
|
|
54
|
-
*/
|
|
55
|
-
export const update = <TTable extends TableDef>(target: QueryTarget<TTable>): UpdateQueryBuilder<unknown> => {
|
|
56
|
-
const table = resolveTable(target);
|
|
57
|
-
return new UpdateQueryBuilder(table);
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Creates a DELETE query builder for the specified table or entity.
|
|
62
|
-
*
|
|
63
|
-
* @template TTable - The table definition type
|
|
64
|
-
* @param target - The table definition or entity constructor to delete from
|
|
65
|
-
* @returns A new DeleteQueryBuilder instance for building DELETE queries
|
|
66
|
-
*
|
|
67
|
-
* @example
|
|
68
|
-
* ```typescript
|
|
69
|
-
* const query = deleteFrom(UserTable).where(eq(UserTable.id, 1));
|
|
70
|
-
* ```
|
|
71
|
-
*/
|
|
7
|
+
import { QueryTarget, resolveTable } from './target.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Creates a SELECT query builder for the specified table or entity.
|
|
11
|
+
*
|
|
12
|
+
* @template TTable - The table definition type
|
|
13
|
+
* @param target - The table definition or entity constructor to query from
|
|
14
|
+
* @returns A new SelectQueryBuilder instance for building SELECT queries
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const query = selectFrom(UserTable).select('id', 'name');
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export const selectFrom = <TTable extends TableDef>(target: QueryTarget<TTable>): SelectQueryBuilder<unknown, TTable> => {
|
|
22
|
+
const table = resolveTable(target);
|
|
23
|
+
return new SelectQueryBuilder(table);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Creates an INSERT query builder for the specified table or entity.
|
|
28
|
+
*
|
|
29
|
+
* @template TTable - The table definition type
|
|
30
|
+
* @param target - The table definition or entity constructor to insert into
|
|
31
|
+
* @returns A new InsertQueryBuilder instance for building INSERT queries
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const query = insertInto(UserTable).values({ name: 'John', email: 'john@example.com' });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export const insertInto = <TTable extends TableDef>(target: QueryTarget<TTable>): InsertQueryBuilder<unknown> => {
|
|
39
|
+
const table = resolveTable(target);
|
|
40
|
+
return new InsertQueryBuilder(table);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Creates an UPDATE query builder for the specified table or entity.
|
|
45
|
+
*
|
|
46
|
+
* @template TTable - The table definition type
|
|
47
|
+
* @param target - The table definition or entity constructor to update
|
|
48
|
+
* @returns A new UpdateQueryBuilder instance for building UPDATE queries
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const query = update(UserTable).set({ name: 'Jane' }).where(eq(UserTable.id, 1));
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export const update = <TTable extends TableDef>(target: QueryTarget<TTable>): UpdateQueryBuilder<unknown> => {
|
|
56
|
+
const table = resolveTable(target);
|
|
57
|
+
return new UpdateQueryBuilder(table);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Creates a DELETE query builder for the specified table or entity.
|
|
62
|
+
*
|
|
63
|
+
* @template TTable - The table definition type
|
|
64
|
+
* @param target - The table definition or entity constructor to delete from
|
|
65
|
+
* @returns A new DeleteQueryBuilder instance for building DELETE queries
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const query = deleteFrom(UserTable).where(eq(UserTable.id, 1));
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
72
|
export const deleteFrom = <TTable extends TableDef>(target: QueryTarget<TTable>): DeleteQueryBuilder<unknown> => {
|
|
73
73
|
const table = resolveTable(target);
|
|
74
74
|
return new DeleteQueryBuilder(table);
|
package/src/query/target.ts
CHANGED
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import { TableDef } from '../schema/table.js';
|
|
2
|
-
import { isTableDef } from '../schema/table-guards.js';
|
|
3
|
-
import { EntityConstructor } from '../orm/entity-metadata.js';
|
|
4
|
-
import { getTableDefFromEntity } from '../decorators/bootstrap.js';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Represents a target for query operations, which can be either a table definition
|
|
8
|
-
* or an entity constructor. This type allows flexible targeting of database tables
|
|
9
|
-
* through either direct table definitions or entity classes decorated with ORM metadata.
|
|
10
|
-
*
|
|
11
|
-
* @template TTable - The table definition type, defaults to TableDef
|
|
12
|
-
*/
|
|
13
|
-
export type QueryTarget<TTable extends TableDef = TableDef> = TTable | EntityConstructor;
|
|
14
|
-
|
|
15
|
-
const resolveEntityTarget = <TTable extends TableDef>(ctor: EntityConstructor): TTable => {
|
|
16
|
-
const table = getTableDefFromEntity(ctor);
|
|
17
|
-
if (!table) {
|
|
18
|
-
throw new Error(`Entity '${ctor.name}' is not registered with decorators`);
|
|
19
|
-
}
|
|
20
|
-
return table as TTable;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Resolves a QueryTarget to its corresponding table definition.
|
|
25
|
-
*
|
|
26
|
-
* If the target is already a TableDef, it returns it directly.
|
|
27
|
-
* If the target is an EntityConstructor, it retrieves the associated table definition
|
|
28
|
-
* from the entity's metadata.
|
|
29
|
-
*
|
|
30
|
-
* @template TTable - The table definition type
|
|
31
|
-
* @param target - The query target to resolve
|
|
32
|
-
* @returns The resolved table definition
|
|
33
|
-
* @throws Error if the entity constructor is not registered with decorators
|
|
34
|
-
*
|
|
35
|
-
* @example
|
|
36
|
-
* ```typescript
|
|
37
|
-
* const table = resolveTable(UserTable); // Returns UserTable directly
|
|
38
|
-
* const table2 = resolveTable(UserEntity); // Returns table def from UserEntity metadata
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
export const resolveTable = <TTable extends TableDef>(target: QueryTarget<TTable>): TTable => {
|
|
42
|
-
if (isTableDef(target)) {
|
|
43
|
-
return target as TTable;
|
|
44
|
-
}
|
|
45
|
-
return resolveEntityTarget(target as EntityConstructor);
|
|
46
|
-
};
|
|
1
|
+
import { TableDef } from '../schema/table.js';
|
|
2
|
+
import { isTableDef } from '../schema/table-guards.js';
|
|
3
|
+
import { EntityConstructor } from '../orm/entity-metadata.js';
|
|
4
|
+
import { getTableDefFromEntity } from '../decorators/bootstrap.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Represents a target for query operations, which can be either a table definition
|
|
8
|
+
* or an entity constructor. This type allows flexible targeting of database tables
|
|
9
|
+
* through either direct table definitions or entity classes decorated with ORM metadata.
|
|
10
|
+
*
|
|
11
|
+
* @template TTable - The table definition type, defaults to TableDef
|
|
12
|
+
*/
|
|
13
|
+
export type QueryTarget<TTable extends TableDef = TableDef> = TTable | EntityConstructor;
|
|
14
|
+
|
|
15
|
+
const resolveEntityTarget = <TTable extends TableDef>(ctor: EntityConstructor): TTable => {
|
|
16
|
+
const table = getTableDefFromEntity(ctor);
|
|
17
|
+
if (!table) {
|
|
18
|
+
throw new Error(`Entity '${ctor.name}' is not registered with decorators`);
|
|
19
|
+
}
|
|
20
|
+
return table as TTable;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Resolves a QueryTarget to its corresponding table definition.
|
|
25
|
+
*
|
|
26
|
+
* If the target is already a TableDef, it returns it directly.
|
|
27
|
+
* If the target is an EntityConstructor, it retrieves the associated table definition
|
|
28
|
+
* from the entity's metadata.
|
|
29
|
+
*
|
|
30
|
+
* @template TTable - The table definition type
|
|
31
|
+
* @param target - The query target to resolve
|
|
32
|
+
* @returns The resolved table definition
|
|
33
|
+
* @throws Error if the entity constructor is not registered with decorators
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const table = resolveTable(UserTable); // Returns UserTable directly
|
|
38
|
+
* const table2 = resolveTable(UserEntity); // Returns table def from UserEntity metadata
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export const resolveTable = <TTable extends TableDef>(target: QueryTarget<TTable>): TTable => {
|
|
42
|
+
if (isTableDef(target)) {
|
|
43
|
+
return target as TTable;
|
|
44
|
+
}
|
|
45
|
+
return resolveEntityTarget(target as EntityConstructor);
|
|
46
|
+
};
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
import { ColumnDef } from '../schema/column-types.js';
|
|
2
|
-
import { CaseExpressionNode, ColumnNode, FunctionNode, WindowFunctionNode } from '../core/ast/expression.js';
|
|
3
|
-
import { SelectQueryNode } from '../core/ast/query.js';
|
|
4
|
-
import { buildColumnNode } from '../core/ast/builders.js';
|
|
5
|
-
import { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Type for column selection input
|
|
9
|
-
*/
|
|
10
|
-
type ColumnSelectionInput = Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>;
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Handles column selection operations for the query builder
|
|
14
|
-
*/
|
|
15
|
-
export class ColumnSelector {
|
|
16
|
-
/**
|
|
17
|
-
* Creates a new ColumnSelector instance
|
|
18
|
-
* @param env - Query builder environment
|
|
19
|
-
*/
|
|
20
|
-
constructor(private readonly env: SelectQueryBuilderEnvironment) {}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Selects columns for the query
|
|
24
|
-
* @param context - Current query context
|
|
25
|
-
* @param columns - Columns to select
|
|
26
|
-
* @returns Updated query context with selected columns
|
|
27
|
-
*/
|
|
28
|
-
select(context: SelectQueryBuilderContext, columns: ColumnSelectionInput): SelectQueryBuilderContext {
|
|
29
|
-
const astService = this.env.deps.createQueryAstService(this.env.table, context.state);
|
|
30
|
-
const { state: nextState, addedColumns } = astService.select(columns);
|
|
31
|
-
return {
|
|
32
|
-
state: nextState,
|
|
33
|
-
hydration: context.hydration.onColumnsSelected(nextState, addedColumns)
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Selects raw column expressions
|
|
39
|
-
* @param context - Current query context
|
|
40
|
-
* @param columns - Raw column expressions
|
|
41
|
-
* @returns Updated query context with raw column selections
|
|
42
|
-
*/
|
|
43
|
-
selectRaw(context: SelectQueryBuilderContext, columns: string[]): SelectQueryBuilderContext {
|
|
44
|
-
const astService = this.env.deps.createQueryAstService(this.env.table, context.state);
|
|
45
|
-
const nextState = astService.selectRaw(columns).state;
|
|
46
|
-
return { state: nextState, hydration: context.hydration };
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Selects a subquery as a column
|
|
51
|
-
* @param context - Current query context
|
|
52
|
-
* @param alias - Alias for the subquery
|
|
53
|
-
* @param query - Subquery to select
|
|
54
|
-
* @returns Updated query context with subquery selection
|
|
55
|
-
*/
|
|
56
|
-
selectSubquery(
|
|
57
|
-
context: SelectQueryBuilderContext,
|
|
58
|
-
alias: string,
|
|
59
|
-
query: SelectQueryNode
|
|
60
|
-
): SelectQueryBuilderContext {
|
|
61
|
-
const astService = this.env.deps.createQueryAstService(this.env.table, context.state);
|
|
62
|
-
const nextState = astService.selectSubquery(alias, query);
|
|
63
|
-
return { state: nextState, hydration: context.hydration };
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Adds DISTINCT clause to the query
|
|
68
|
-
* @param context - Current query context
|
|
69
|
-
* @param columns - Columns to make distinct
|
|
70
|
-
* @returns Updated query context with DISTINCT clause
|
|
71
|
-
*/
|
|
72
|
-
distinct(context: SelectQueryBuilderContext, columns: (ColumnDef | ColumnNode)[]): SelectQueryBuilderContext {
|
|
73
|
-
const from = context.state.ast.from;
|
|
74
|
-
const tableRef = from.type === 'Table' && from.alias ? { ...this.env.table, alias: from.alias } : this.env.table;
|
|
75
|
-
const nodes = columns.map(col => buildColumnNode(tableRef, col));
|
|
76
|
-
const astService = this.env.deps.createQueryAstService(this.env.table, context.state);
|
|
77
|
-
const nextState = astService.withDistinct(nodes);
|
|
78
|
-
return { state: nextState, hydration: context.hydration };
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
1
|
+
import { ColumnDef } from '../schema/column-types.js';
|
|
2
|
+
import { CaseExpressionNode, ColumnNode, FunctionNode, WindowFunctionNode } from '../core/ast/expression.js';
|
|
3
|
+
import { SelectQueryNode } from '../core/ast/query.js';
|
|
4
|
+
import { buildColumnNode } from '../core/ast/builders.js';
|
|
5
|
+
import { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Type for column selection input
|
|
9
|
+
*/
|
|
10
|
+
type ColumnSelectionInput = Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Handles column selection operations for the query builder
|
|
14
|
+
*/
|
|
15
|
+
export class ColumnSelector {
|
|
16
|
+
/**
|
|
17
|
+
* Creates a new ColumnSelector instance
|
|
18
|
+
* @param env - Query builder environment
|
|
19
|
+
*/
|
|
20
|
+
constructor(private readonly env: SelectQueryBuilderEnvironment) {}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Selects columns for the query
|
|
24
|
+
* @param context - Current query context
|
|
25
|
+
* @param columns - Columns to select
|
|
26
|
+
* @returns Updated query context with selected columns
|
|
27
|
+
*/
|
|
28
|
+
select(context: SelectQueryBuilderContext, columns: ColumnSelectionInput): SelectQueryBuilderContext {
|
|
29
|
+
const astService = this.env.deps.createQueryAstService(this.env.table, context.state);
|
|
30
|
+
const { state: nextState, addedColumns } = astService.select(columns);
|
|
31
|
+
return {
|
|
32
|
+
state: nextState,
|
|
33
|
+
hydration: context.hydration.onColumnsSelected(nextState, addedColumns)
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Selects raw column expressions
|
|
39
|
+
* @param context - Current query context
|
|
40
|
+
* @param columns - Raw column expressions
|
|
41
|
+
* @returns Updated query context with raw column selections
|
|
42
|
+
*/
|
|
43
|
+
selectRaw(context: SelectQueryBuilderContext, columns: string[]): SelectQueryBuilderContext {
|
|
44
|
+
const astService = this.env.deps.createQueryAstService(this.env.table, context.state);
|
|
45
|
+
const nextState = astService.selectRaw(columns).state;
|
|
46
|
+
return { state: nextState, hydration: context.hydration };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Selects a subquery as a column
|
|
51
|
+
* @param context - Current query context
|
|
52
|
+
* @param alias - Alias for the subquery
|
|
53
|
+
* @param query - Subquery to select
|
|
54
|
+
* @returns Updated query context with subquery selection
|
|
55
|
+
*/
|
|
56
|
+
selectSubquery(
|
|
57
|
+
context: SelectQueryBuilderContext,
|
|
58
|
+
alias: string,
|
|
59
|
+
query: SelectQueryNode
|
|
60
|
+
): SelectQueryBuilderContext {
|
|
61
|
+
const astService = this.env.deps.createQueryAstService(this.env.table, context.state);
|
|
62
|
+
const nextState = astService.selectSubquery(alias, query);
|
|
63
|
+
return { state: nextState, hydration: context.hydration };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Adds DISTINCT clause to the query
|
|
68
|
+
* @param context - Current query context
|
|
69
|
+
* @param columns - Columns to make distinct
|
|
70
|
+
* @returns Updated query context with DISTINCT clause
|
|
71
|
+
*/
|
|
72
|
+
distinct(context: SelectQueryBuilderContext, columns: (ColumnDef | ColumnNode)[]): SelectQueryBuilderContext {
|
|
73
|
+
const from = context.state.ast.from;
|
|
74
|
+
const tableRef = from.type === 'Table' && from.alias ? { ...this.env.table, alias: from.alias } : this.env.table;
|
|
75
|
+
const nodes = columns.map(col => buildColumnNode(tableRef, col));
|
|
76
|
+
const astService = this.env.deps.createQueryAstService(this.env.table, context.state);
|
|
77
|
+
const nextState = astService.withDistinct(nodes);
|
|
78
|
+
return { state: nextState, hydration: context.hydration };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|