metal-orm 1.1.10 → 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 +106 -43
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +106 -43
- package/dist/index.js.map +1 -1
- package/package.json +100 -96
- package/scripts/generate-entities/render.mjs +21 -12
- package/scripts/generate-entities/schema.mjs +209 -195
- package/scripts/generate-entities/tree-detection.mjs +159 -153
- 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/bulk/bulk-delete-executor.ts +3 -5
- package/src/bulk/bulk-insert-executor.ts +7 -7
- package/src/bulk/bulk-update-executor.ts +2 -2
- package/src/bulk/bulk-upsert-executor.ts +5 -7
- 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/mysql.ts +113 -36
- 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 +94 -94
- 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
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
import { SelectQueryNode } from '../../core/ast/query.js';
|
|
2
|
-
import { OperandNode } from '../../core/ast/expression.js';
|
|
3
|
-
import { derivedTable, fnTable } from '../../core/ast/builders.js';
|
|
4
|
-
import { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from '../select-query-builder-deps.js';
|
|
5
|
-
import { QueryAstService } from '../query-ast-service.js';
|
|
6
|
-
import { SelectQueryState } from '../select-query-state.js';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Facet responsible for FROM clause operations
|
|
10
|
-
*/
|
|
11
|
-
export class SelectFromFacet {
|
|
12
|
-
/**
|
|
13
|
-
* Creates a new SelectFromFacet instance
|
|
14
|
-
* @param env - Query builder environment
|
|
15
|
-
* @param createAstService - Function to create AST service
|
|
16
|
-
*/
|
|
17
|
-
constructor(
|
|
18
|
-
private readonly env: SelectQueryBuilderEnvironment,
|
|
19
|
-
private readonly createAstService: (state: SelectQueryState) => QueryAstService
|
|
20
|
-
) { }
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Applies an alias to the FROM table
|
|
24
|
-
* @param context - Current query context
|
|
25
|
-
* @param alias - Alias to apply
|
|
26
|
-
* @returns Updated query context with aliased FROM
|
|
27
|
-
*/
|
|
28
|
-
as(context: SelectQueryBuilderContext, alias: string): SelectQueryBuilderContext {
|
|
29
|
-
const from = context.state.ast.from;
|
|
30
|
-
if (from.type !== 'Table') {
|
|
31
|
-
throw new Error('Cannot alias non-table FROM sources');
|
|
32
|
-
}
|
|
33
|
-
const nextFrom = { ...from, alias };
|
|
34
|
-
const astService = this.createAstService(context.state);
|
|
35
|
-
const nextState = astService.withFrom(nextFrom);
|
|
36
|
-
return { state: nextState, hydration: context.hydration };
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Sets the FROM clause to a subquery
|
|
41
|
-
* @param context - Current query context
|
|
42
|
-
* @param subAst - Subquery AST
|
|
43
|
-
* @param alias - Alias for the subquery
|
|
44
|
-
* @param columnAliases - Optional column aliases
|
|
45
|
-
* @returns Updated query context with subquery FROM
|
|
46
|
-
*/
|
|
47
|
-
fromSubquery(
|
|
48
|
-
context: SelectQueryBuilderContext,
|
|
49
|
-
subAst: SelectQueryNode,
|
|
50
|
-
alias: string,
|
|
51
|
-
columnAliases?: string[]
|
|
52
|
-
): SelectQueryBuilderContext {
|
|
53
|
-
const fromNode = derivedTable(subAst, alias, columnAliases);
|
|
54
|
-
const astService = this.createAstService(context.state);
|
|
55
|
-
const nextState = astService.withFrom(fromNode);
|
|
56
|
-
return { state: nextState, hydration: context.hydration };
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Sets the FROM clause to a function table
|
|
61
|
-
* @param context - Current query context
|
|
62
|
-
* @param name - Function name
|
|
63
|
-
* @param args - Function arguments
|
|
64
|
-
* @param alias - Optional alias for the function table
|
|
65
|
-
* @param options - Optional function table options
|
|
66
|
-
* @returns Updated query context with function table FROM
|
|
67
|
-
*/
|
|
68
|
-
fromFunctionTable(
|
|
69
|
-
context: SelectQueryBuilderContext,
|
|
70
|
-
name: string,
|
|
71
|
-
args: OperandNode[],
|
|
72
|
-
alias?: string,
|
|
73
|
-
options?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }
|
|
74
|
-
): SelectQueryBuilderContext {
|
|
75
|
-
const functionTable = fnTable(name, args, alias, options);
|
|
76
|
-
const astService = this.createAstService(context.state);
|
|
77
|
-
const nextState = astService.withFrom(functionTable);
|
|
78
|
-
return { state: nextState, hydration: context.hydration };
|
|
79
|
-
}
|
|
80
|
-
}
|
|
1
|
+
import { SelectQueryNode } from '../../core/ast/query.js';
|
|
2
|
+
import { OperandNode } from '../../core/ast/expression.js';
|
|
3
|
+
import { derivedTable, fnTable } from '../../core/ast/builders.js';
|
|
4
|
+
import { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from '../select-query-builder-deps.js';
|
|
5
|
+
import { QueryAstService } from '../query-ast-service.js';
|
|
6
|
+
import { SelectQueryState } from '../select-query-state.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Facet responsible for FROM clause operations
|
|
10
|
+
*/
|
|
11
|
+
export class SelectFromFacet {
|
|
12
|
+
/**
|
|
13
|
+
* Creates a new SelectFromFacet instance
|
|
14
|
+
* @param env - Query builder environment
|
|
15
|
+
* @param createAstService - Function to create AST service
|
|
16
|
+
*/
|
|
17
|
+
constructor(
|
|
18
|
+
private readonly env: SelectQueryBuilderEnvironment,
|
|
19
|
+
private readonly createAstService: (state: SelectQueryState) => QueryAstService
|
|
20
|
+
) { }
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Applies an alias to the FROM table
|
|
24
|
+
* @param context - Current query context
|
|
25
|
+
* @param alias - Alias to apply
|
|
26
|
+
* @returns Updated query context with aliased FROM
|
|
27
|
+
*/
|
|
28
|
+
as(context: SelectQueryBuilderContext, alias: string): SelectQueryBuilderContext {
|
|
29
|
+
const from = context.state.ast.from;
|
|
30
|
+
if (from.type !== 'Table') {
|
|
31
|
+
throw new Error('Cannot alias non-table FROM sources');
|
|
32
|
+
}
|
|
33
|
+
const nextFrom = { ...from, alias };
|
|
34
|
+
const astService = this.createAstService(context.state);
|
|
35
|
+
const nextState = astService.withFrom(nextFrom);
|
|
36
|
+
return { state: nextState, hydration: context.hydration };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Sets the FROM clause to a subquery
|
|
41
|
+
* @param context - Current query context
|
|
42
|
+
* @param subAst - Subquery AST
|
|
43
|
+
* @param alias - Alias for the subquery
|
|
44
|
+
* @param columnAliases - Optional column aliases
|
|
45
|
+
* @returns Updated query context with subquery FROM
|
|
46
|
+
*/
|
|
47
|
+
fromSubquery(
|
|
48
|
+
context: SelectQueryBuilderContext,
|
|
49
|
+
subAst: SelectQueryNode,
|
|
50
|
+
alias: string,
|
|
51
|
+
columnAliases?: string[]
|
|
52
|
+
): SelectQueryBuilderContext {
|
|
53
|
+
const fromNode = derivedTable(subAst, alias, columnAliases);
|
|
54
|
+
const astService = this.createAstService(context.state);
|
|
55
|
+
const nextState = astService.withFrom(fromNode);
|
|
56
|
+
return { state: nextState, hydration: context.hydration };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Sets the FROM clause to a function table
|
|
61
|
+
* @param context - Current query context
|
|
62
|
+
* @param name - Function name
|
|
63
|
+
* @param args - Function arguments
|
|
64
|
+
* @param alias - Optional alias for the function table
|
|
65
|
+
* @param options - Optional function table options
|
|
66
|
+
* @returns Updated query context with function table FROM
|
|
67
|
+
*/
|
|
68
|
+
fromFunctionTable(
|
|
69
|
+
context: SelectQueryBuilderContext,
|
|
70
|
+
name: string,
|
|
71
|
+
args: OperandNode[],
|
|
72
|
+
alias?: string,
|
|
73
|
+
options?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }
|
|
74
|
+
): SelectQueryBuilderContext {
|
|
75
|
+
const functionTable = fnTable(name, args, alias, options);
|
|
76
|
+
const astService = this.createAstService(context.state);
|
|
77
|
+
const nextState = astService.withFrom(functionTable);
|
|
78
|
+
return { state: nextState, hydration: context.hydration };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
import { TableDef } from '../../schema/table.js';
|
|
2
|
-
import { BinaryExpressionNode } from '../../core/ast/expression.js';
|
|
3
|
-
import { SelectQueryNode } from '../../core/ast/query.js';
|
|
4
|
-
import { JoinKind } from '../../core/sql/sql.js';
|
|
5
|
-
import { derivedTable, fnTable } from '../../core/ast/builders.js';
|
|
6
|
-
import { createJoinNode } from '../../core/ast/join-node.js';
|
|
7
|
-
import { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from '../select-query-builder-deps.js';
|
|
8
|
-
import { QueryAstService } from '../query-ast-service.js';
|
|
9
|
-
import { OperandNode } from '../../core/ast/expression.js';
|
|
10
|
-
import { SelectQueryState } from '../select-query-state.js';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Facet responsible for JOIN operations
|
|
14
|
-
*/
|
|
15
|
-
export class SelectJoinFacet {
|
|
16
|
-
constructor(
|
|
17
|
-
private readonly env: SelectQueryBuilderEnvironment,
|
|
18
|
-
private readonly createAstService: (state: SelectQueryState) => QueryAstService
|
|
19
|
-
) { }
|
|
20
|
-
|
|
21
|
-
applyJoin(
|
|
22
|
-
context: SelectQueryBuilderContext,
|
|
23
|
-
table: TableDef,
|
|
24
|
-
condition: BinaryExpressionNode,
|
|
25
|
-
kind: JoinKind
|
|
26
|
-
): SelectQueryBuilderContext {
|
|
27
|
-
const joinNode = createJoinNode(kind, { type: 'Table', name: table.name, schema: table.schema }, condition);
|
|
28
|
-
const astService = this.createAstService(context.state);
|
|
29
|
-
const nextState = astService.withJoin(joinNode);
|
|
30
|
-
return { state: nextState, hydration: context.hydration };
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
joinSubquery(
|
|
34
|
-
context: SelectQueryBuilderContext,
|
|
35
|
-
subAst: SelectQueryNode,
|
|
36
|
-
alias: string,
|
|
37
|
-
condition: BinaryExpressionNode,
|
|
38
|
-
joinKind: JoinKind,
|
|
39
|
-
columnAliases?: string[]
|
|
40
|
-
): SelectQueryBuilderContext {
|
|
41
|
-
const joinNode = createJoinNode(joinKind, derivedTable(subAst, alias, columnAliases), condition);
|
|
42
|
-
const astService = this.createAstService(context.state);
|
|
43
|
-
const nextState = astService.withJoin(joinNode);
|
|
44
|
-
return { state: nextState, hydration: context.hydration };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
joinFunctionTable(
|
|
48
|
-
context: SelectQueryBuilderContext,
|
|
49
|
-
name: string,
|
|
50
|
-
args: OperandNode[],
|
|
51
|
-
alias: string,
|
|
52
|
-
condition: BinaryExpressionNode,
|
|
53
|
-
joinKind: JoinKind,
|
|
54
|
-
options?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }
|
|
55
|
-
): SelectQueryBuilderContext {
|
|
56
|
-
const functionTable = fnTable(name, args, alias, options);
|
|
57
|
-
const joinNode = createJoinNode(joinKind, functionTable, condition);
|
|
58
|
-
const astService = this.createAstService(context.state);
|
|
59
|
-
const nextState = astService.withJoin(joinNode);
|
|
60
|
-
return { state: nextState, hydration: context.hydration };
|
|
61
|
-
}
|
|
62
|
-
}
|
|
1
|
+
import { TableDef } from '../../schema/table.js';
|
|
2
|
+
import { BinaryExpressionNode } from '../../core/ast/expression.js';
|
|
3
|
+
import { SelectQueryNode } from '../../core/ast/query.js';
|
|
4
|
+
import { JoinKind } from '../../core/sql/sql.js';
|
|
5
|
+
import { derivedTable, fnTable } from '../../core/ast/builders.js';
|
|
6
|
+
import { createJoinNode } from '../../core/ast/join-node.js';
|
|
7
|
+
import { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from '../select-query-builder-deps.js';
|
|
8
|
+
import { QueryAstService } from '../query-ast-service.js';
|
|
9
|
+
import { OperandNode } from '../../core/ast/expression.js';
|
|
10
|
+
import { SelectQueryState } from '../select-query-state.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Facet responsible for JOIN operations
|
|
14
|
+
*/
|
|
15
|
+
export class SelectJoinFacet {
|
|
16
|
+
constructor(
|
|
17
|
+
private readonly env: SelectQueryBuilderEnvironment,
|
|
18
|
+
private readonly createAstService: (state: SelectQueryState) => QueryAstService
|
|
19
|
+
) { }
|
|
20
|
+
|
|
21
|
+
applyJoin(
|
|
22
|
+
context: SelectQueryBuilderContext,
|
|
23
|
+
table: TableDef,
|
|
24
|
+
condition: BinaryExpressionNode,
|
|
25
|
+
kind: JoinKind
|
|
26
|
+
): SelectQueryBuilderContext {
|
|
27
|
+
const joinNode = createJoinNode(kind, { type: 'Table', name: table.name, schema: table.schema }, condition);
|
|
28
|
+
const astService = this.createAstService(context.state);
|
|
29
|
+
const nextState = astService.withJoin(joinNode);
|
|
30
|
+
return { state: nextState, hydration: context.hydration };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
joinSubquery(
|
|
34
|
+
context: SelectQueryBuilderContext,
|
|
35
|
+
subAst: SelectQueryNode,
|
|
36
|
+
alias: string,
|
|
37
|
+
condition: BinaryExpressionNode,
|
|
38
|
+
joinKind: JoinKind,
|
|
39
|
+
columnAliases?: string[]
|
|
40
|
+
): SelectQueryBuilderContext {
|
|
41
|
+
const joinNode = createJoinNode(joinKind, derivedTable(subAst, alias, columnAliases), condition);
|
|
42
|
+
const astService = this.createAstService(context.state);
|
|
43
|
+
const nextState = astService.withJoin(joinNode);
|
|
44
|
+
return { state: nextState, hydration: context.hydration };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
joinFunctionTable(
|
|
48
|
+
context: SelectQueryBuilderContext,
|
|
49
|
+
name: string,
|
|
50
|
+
args: OperandNode[],
|
|
51
|
+
alias: string,
|
|
52
|
+
condition: BinaryExpressionNode,
|
|
53
|
+
joinKind: JoinKind,
|
|
54
|
+
options?: { lateral?: boolean; withOrdinality?: boolean; columnAliases?: string[]; schema?: string }
|
|
55
|
+
): SelectQueryBuilderContext {
|
|
56
|
+
const functionTable = fnTable(name, args, alias, options);
|
|
57
|
+
const joinNode = createJoinNode(joinKind, functionTable, condition);
|
|
58
|
+
const astService = this.createAstService(context.state);
|
|
59
|
+
const nextState = astService.withJoin(joinNode);
|
|
60
|
+
return { state: nextState, hydration: context.hydration };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
import { ColumnDef } from '../../schema/column-types.js';
|
|
2
|
-
import { ExpressionNode } from '../../core/ast/expression.js';
|
|
3
|
-
import { OrderingTerm } from '../../core/ast/query.js';
|
|
4
|
-
import { OrderDirection } from '../../core/sql/sql.js';
|
|
5
|
-
import { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from '../select-query-builder-deps.js';
|
|
6
|
-
import { QueryAstService } from '../query-ast-service.js';
|
|
7
|
-
import { SelectQueryState } from '../select-query-state.js';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Facet responsible for filtering and ordering operations
|
|
11
|
-
*/
|
|
12
|
-
export class SelectPredicateFacet {
|
|
13
|
-
/**
|
|
14
|
-
* Creates a new SelectPredicateFacet instance
|
|
15
|
-
* @param env - Query builder environment
|
|
16
|
-
* @param createAstService - Function to create AST service
|
|
17
|
-
*/
|
|
18
|
-
constructor(
|
|
19
|
-
private readonly env: SelectQueryBuilderEnvironment,
|
|
20
|
-
private readonly createAstService: (state: SelectQueryState) => QueryAstService
|
|
21
|
-
) { }
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Adds a WHERE condition to the query
|
|
25
|
-
* @param context - Current query context
|
|
26
|
-
* @param expr - WHERE expression
|
|
27
|
-
* @returns Updated query context with WHERE condition
|
|
28
|
-
*/
|
|
29
|
-
where(context: SelectQueryBuilderContext, expr: ExpressionNode): SelectQueryBuilderContext {
|
|
30
|
-
const astService = this.createAstService(context.state);
|
|
31
|
-
const nextState = astService.withWhere(expr);
|
|
32
|
-
return { state: nextState, hydration: context.hydration };
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Adds a GROUP BY clause to the query
|
|
37
|
-
* @param context - Current query context
|
|
38
|
-
* @param term - Column or ordering term to group by
|
|
39
|
-
* @returns Updated query context with GROUP BY clause
|
|
40
|
-
*/
|
|
41
|
-
groupBy(context: SelectQueryBuilderContext, term: ColumnDef | OrderingTerm): SelectQueryBuilderContext {
|
|
42
|
-
const astService = this.createAstService(context.state);
|
|
43
|
-
const nextState = astService.withGroupBy(term);
|
|
44
|
-
return { state: nextState, hydration: context.hydration };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Adds a HAVING condition to the query
|
|
49
|
-
* @param context - Current query context
|
|
50
|
-
* @param expr - HAVING expression
|
|
51
|
-
* @returns Updated query context with HAVING condition
|
|
52
|
-
*/
|
|
53
|
-
having(context: SelectQueryBuilderContext, expr: ExpressionNode): SelectQueryBuilderContext {
|
|
54
|
-
const astService = this.createAstService(context.state);
|
|
55
|
-
const nextState = astService.withHaving(expr);
|
|
56
|
-
return { state: nextState, hydration: context.hydration };
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Adds an ORDER BY clause to the query
|
|
61
|
-
* @param context - Current query context
|
|
62
|
-
* @param term - Column or ordering term to order by
|
|
63
|
-
* @param direction - Order direction
|
|
64
|
-
* @param nulls - Nulls ordering
|
|
65
|
-
* @param collation - Collation
|
|
66
|
-
* @returns Updated query context with ORDER BY clause
|
|
67
|
-
*/
|
|
68
|
-
orderBy(
|
|
69
|
-
context: SelectQueryBuilderContext,
|
|
70
|
-
term: ColumnDef | OrderingTerm,
|
|
71
|
-
direction: OrderDirection,
|
|
72
|
-
nulls?: 'FIRST' | 'LAST',
|
|
73
|
-
collation?: string
|
|
74
|
-
): SelectQueryBuilderContext {
|
|
75
|
-
const astService = this.createAstService(context.state);
|
|
76
|
-
const nextState = astService.withOrderBy(term, direction, nulls, collation);
|
|
77
|
-
return { state: nextState, hydration: context.hydration };
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Adds a LIMIT clause to the query
|
|
82
|
-
* @param context - Current query context
|
|
83
|
-
* @param n - Maximum number of rows
|
|
84
|
-
* @returns Updated query context with LIMIT clause
|
|
85
|
-
*/
|
|
86
|
-
limit(context: SelectQueryBuilderContext, n: number): SelectQueryBuilderContext {
|
|
87
|
-
const astService = this.createAstService(context.state);
|
|
88
|
-
const nextState = astService.withLimit(n);
|
|
89
|
-
return { state: nextState, hydration: context.hydration };
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Adds an OFFSET clause to the query
|
|
94
|
-
* @param context - Current query context
|
|
95
|
-
* @param n - Number of rows to skip
|
|
96
|
-
* @returns Updated query context with OFFSET clause
|
|
97
|
-
*/
|
|
98
|
-
offset(context: SelectQueryBuilderContext, n: number): SelectQueryBuilderContext {
|
|
99
|
-
const astService = this.createAstService(context.state);
|
|
100
|
-
const nextState = astService.withOffset(n);
|
|
101
|
-
return { state: nextState, hydration: context.hydration };
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
1
|
+
import { ColumnDef } from '../../schema/column-types.js';
|
|
2
|
+
import { ExpressionNode } from '../../core/ast/expression.js';
|
|
3
|
+
import { OrderingTerm } from '../../core/ast/query.js';
|
|
4
|
+
import { OrderDirection } from '../../core/sql/sql.js';
|
|
5
|
+
import { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from '../select-query-builder-deps.js';
|
|
6
|
+
import { QueryAstService } from '../query-ast-service.js';
|
|
7
|
+
import { SelectQueryState } from '../select-query-state.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Facet responsible for filtering and ordering operations
|
|
11
|
+
*/
|
|
12
|
+
export class SelectPredicateFacet {
|
|
13
|
+
/**
|
|
14
|
+
* Creates a new SelectPredicateFacet instance
|
|
15
|
+
* @param env - Query builder environment
|
|
16
|
+
* @param createAstService - Function to create AST service
|
|
17
|
+
*/
|
|
18
|
+
constructor(
|
|
19
|
+
private readonly env: SelectQueryBuilderEnvironment,
|
|
20
|
+
private readonly createAstService: (state: SelectQueryState) => QueryAstService
|
|
21
|
+
) { }
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Adds a WHERE condition to the query
|
|
25
|
+
* @param context - Current query context
|
|
26
|
+
* @param expr - WHERE expression
|
|
27
|
+
* @returns Updated query context with WHERE condition
|
|
28
|
+
*/
|
|
29
|
+
where(context: SelectQueryBuilderContext, expr: ExpressionNode): SelectQueryBuilderContext {
|
|
30
|
+
const astService = this.createAstService(context.state);
|
|
31
|
+
const nextState = astService.withWhere(expr);
|
|
32
|
+
return { state: nextState, hydration: context.hydration };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Adds a GROUP BY clause to the query
|
|
37
|
+
* @param context - Current query context
|
|
38
|
+
* @param term - Column or ordering term to group by
|
|
39
|
+
* @returns Updated query context with GROUP BY clause
|
|
40
|
+
*/
|
|
41
|
+
groupBy(context: SelectQueryBuilderContext, term: ColumnDef | OrderingTerm): SelectQueryBuilderContext {
|
|
42
|
+
const astService = this.createAstService(context.state);
|
|
43
|
+
const nextState = astService.withGroupBy(term);
|
|
44
|
+
return { state: nextState, hydration: context.hydration };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Adds a HAVING condition to the query
|
|
49
|
+
* @param context - Current query context
|
|
50
|
+
* @param expr - HAVING expression
|
|
51
|
+
* @returns Updated query context with HAVING condition
|
|
52
|
+
*/
|
|
53
|
+
having(context: SelectQueryBuilderContext, expr: ExpressionNode): SelectQueryBuilderContext {
|
|
54
|
+
const astService = this.createAstService(context.state);
|
|
55
|
+
const nextState = astService.withHaving(expr);
|
|
56
|
+
return { state: nextState, hydration: context.hydration };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Adds an ORDER BY clause to the query
|
|
61
|
+
* @param context - Current query context
|
|
62
|
+
* @param term - Column or ordering term to order by
|
|
63
|
+
* @param direction - Order direction
|
|
64
|
+
* @param nulls - Nulls ordering
|
|
65
|
+
* @param collation - Collation
|
|
66
|
+
* @returns Updated query context with ORDER BY clause
|
|
67
|
+
*/
|
|
68
|
+
orderBy(
|
|
69
|
+
context: SelectQueryBuilderContext,
|
|
70
|
+
term: ColumnDef | OrderingTerm,
|
|
71
|
+
direction: OrderDirection,
|
|
72
|
+
nulls?: 'FIRST' | 'LAST',
|
|
73
|
+
collation?: string
|
|
74
|
+
): SelectQueryBuilderContext {
|
|
75
|
+
const astService = this.createAstService(context.state);
|
|
76
|
+
const nextState = astService.withOrderBy(term, direction, nulls, collation);
|
|
77
|
+
return { state: nextState, hydration: context.hydration };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Adds a LIMIT clause to the query
|
|
82
|
+
* @param context - Current query context
|
|
83
|
+
* @param n - Maximum number of rows
|
|
84
|
+
* @returns Updated query context with LIMIT clause
|
|
85
|
+
*/
|
|
86
|
+
limit(context: SelectQueryBuilderContext, n: number): SelectQueryBuilderContext {
|
|
87
|
+
const astService = this.createAstService(context.state);
|
|
88
|
+
const nextState = astService.withLimit(n);
|
|
89
|
+
return { state: nextState, hydration: context.hydration };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Adds an OFFSET clause to the query
|
|
94
|
+
* @param context - Current query context
|
|
95
|
+
* @param n - Number of rows to skip
|
|
96
|
+
* @returns Updated query context with OFFSET clause
|
|
97
|
+
*/
|
|
98
|
+
offset(context: SelectQueryBuilderContext, n: number): SelectQueryBuilderContext {
|
|
99
|
+
const astService = this.createAstService(context.state);
|
|
100
|
+
const nextState = astService.withOffset(n);
|
|
101
|
+
return { state: nextState, hydration: context.hydration };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
import { ColumnDef } from '../../schema/column-types.js';
|
|
2
|
-
import { ColumnNode, FunctionNode, CaseExpressionNode, WindowFunctionNode } from '../../core/ast/expression.js';
|
|
3
|
-
import { SelectQueryBuilderContext } from '../select-query-builder-deps.js';
|
|
4
|
-
import { ColumnSelector } from '../column-selector.js';
|
|
5
|
-
import { SelectQueryNode } from '../../core/ast/query.js';
|
|
6
|
-
|
|
7
|
-
type ColumnSelectionValue = ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode;
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Facet responsible for projection operations (SELECT, DISTINCT, etc.)
|
|
11
|
-
*/
|
|
12
|
-
export class SelectProjectionFacet {
|
|
13
|
-
/**
|
|
14
|
-
* Creates a new SelectProjectionFacet instance
|
|
15
|
-
* @param columnSelector - Column selector dependency
|
|
16
|
-
*/
|
|
17
|
-
constructor(private readonly columnSelector: ColumnSelector) { }
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Selects columns for the query
|
|
21
|
-
* @param context - Current query context
|
|
22
|
-
* @param columns - Columns to select
|
|
23
|
-
* @returns Updated query context with selected columns
|
|
24
|
-
*/
|
|
25
|
-
select(
|
|
26
|
-
context: SelectQueryBuilderContext,
|
|
27
|
-
columns: Record<string, ColumnSelectionValue>
|
|
28
|
-
): SelectQueryBuilderContext {
|
|
29
|
-
return this.columnSelector.select(context, columns);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Selects raw column expressions
|
|
34
|
-
* @param context - Current query context
|
|
35
|
-
* @param cols - Raw column expressions
|
|
36
|
-
* @returns Updated query context with raw column selections
|
|
37
|
-
*/
|
|
38
|
-
selectRaw(context: SelectQueryBuilderContext, cols: string[]): SelectQueryBuilderContext {
|
|
39
|
-
return this.columnSelector.selectRaw(context, cols);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Selects a subquery as a column
|
|
44
|
-
* @param context - Current query context
|
|
45
|
-
* @param alias - Alias for the subquery
|
|
46
|
-
* @param query - Subquery to select
|
|
47
|
-
* @returns Updated query context with subquery selection
|
|
48
|
-
*/
|
|
49
|
-
selectSubquery(
|
|
50
|
-
context: SelectQueryBuilderContext,
|
|
51
|
-
alias: string,
|
|
52
|
-
query: SelectQueryNode
|
|
53
|
-
): SelectQueryBuilderContext {
|
|
54
|
-
return this.columnSelector.selectSubquery(context, alias, query);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Adds DISTINCT clause to the query
|
|
59
|
-
* @param context - Current query context
|
|
60
|
-
* @param cols - Columns to make distinct
|
|
61
|
-
* @returns Updated query context with DISTINCT clause
|
|
62
|
-
*/
|
|
63
|
-
distinct(
|
|
64
|
-
context: SelectQueryBuilderContext,
|
|
65
|
-
cols: (ColumnDef | ColumnNode)[]
|
|
66
|
-
): SelectQueryBuilderContext {
|
|
67
|
-
return this.columnSelector.distinct(context, cols);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
1
|
+
import { ColumnDef } from '../../schema/column-types.js';
|
|
2
|
+
import { ColumnNode, FunctionNode, CaseExpressionNode, WindowFunctionNode } from '../../core/ast/expression.js';
|
|
3
|
+
import { SelectQueryBuilderContext } from '../select-query-builder-deps.js';
|
|
4
|
+
import { ColumnSelector } from '../column-selector.js';
|
|
5
|
+
import { SelectQueryNode } from '../../core/ast/query.js';
|
|
6
|
+
|
|
7
|
+
type ColumnSelectionValue = ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Facet responsible for projection operations (SELECT, DISTINCT, etc.)
|
|
11
|
+
*/
|
|
12
|
+
export class SelectProjectionFacet {
|
|
13
|
+
/**
|
|
14
|
+
* Creates a new SelectProjectionFacet instance
|
|
15
|
+
* @param columnSelector - Column selector dependency
|
|
16
|
+
*/
|
|
17
|
+
constructor(private readonly columnSelector: ColumnSelector) { }
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Selects columns for the query
|
|
21
|
+
* @param context - Current query context
|
|
22
|
+
* @param columns - Columns to select
|
|
23
|
+
* @returns Updated query context with selected columns
|
|
24
|
+
*/
|
|
25
|
+
select(
|
|
26
|
+
context: SelectQueryBuilderContext,
|
|
27
|
+
columns: Record<string, ColumnSelectionValue>
|
|
28
|
+
): SelectQueryBuilderContext {
|
|
29
|
+
return this.columnSelector.select(context, columns);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Selects raw column expressions
|
|
34
|
+
* @param context - Current query context
|
|
35
|
+
* @param cols - Raw column expressions
|
|
36
|
+
* @returns Updated query context with raw column selections
|
|
37
|
+
*/
|
|
38
|
+
selectRaw(context: SelectQueryBuilderContext, cols: string[]): SelectQueryBuilderContext {
|
|
39
|
+
return this.columnSelector.selectRaw(context, cols);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Selects a subquery as a column
|
|
44
|
+
* @param context - Current query context
|
|
45
|
+
* @param alias - Alias for the subquery
|
|
46
|
+
* @param query - Subquery to select
|
|
47
|
+
* @returns Updated query context with subquery selection
|
|
48
|
+
*/
|
|
49
|
+
selectSubquery(
|
|
50
|
+
context: SelectQueryBuilderContext,
|
|
51
|
+
alias: string,
|
|
52
|
+
query: SelectQueryNode
|
|
53
|
+
): SelectQueryBuilderContext {
|
|
54
|
+
return this.columnSelector.selectSubquery(context, alias, query);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Adds DISTINCT clause to the query
|
|
59
|
+
* @param context - Current query context
|
|
60
|
+
* @param cols - Columns to make distinct
|
|
61
|
+
* @returns Updated query context with DISTINCT clause
|
|
62
|
+
*/
|
|
63
|
+
distinct(
|
|
64
|
+
context: SelectQueryBuilderContext,
|
|
65
|
+
cols: (ColumnDef | ColumnNode)[]
|
|
66
|
+
): SelectQueryBuilderContext {
|
|
67
|
+
return this.columnSelector.distinct(context, cols);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|