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.
Files changed (182) hide show
  1. package/README.md +758 -769
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/package.json +100 -96
  5. package/scripts/generate-entities/schema.mjs +122 -122
  6. package/scripts/generate-entities/tree-detection.mjs +92 -92
  7. package/scripts/inflection/pt-br.mjs +468 -468
  8. package/scripts/run-eslint.mjs +33 -34
  9. package/scripts/show-sql-seed.sql +102 -0
  10. package/scripts/show-sql.mjs +321 -325
  11. package/src/codegen/naming-strategy.ts +54 -54
  12. package/src/codegen/typescript.ts +482 -482
  13. package/src/core/ast/adapters.ts +1 -1
  14. package/src/core/ast/builders.ts +123 -123
  15. package/src/core/ast/expression-builders.ts +745 -745
  16. package/src/core/ast/expression-nodes.ts +304 -304
  17. package/src/core/ast/expression-visitor.ts +212 -212
  18. package/src/core/ast/expression.ts +20 -20
  19. package/src/core/ast/helpers.ts +14 -14
  20. package/src/core/ast/join.ts +18 -18
  21. package/src/core/ast/query.ts +200 -200
  22. package/src/core/ddl/dialects/base-schema-dialect.ts +1 -1
  23. package/src/core/ddl/dialects/mssql-schema-dialect.ts +1 -1
  24. package/src/core/ddl/dialects/mysql-schema-dialect.ts +1 -1
  25. package/src/core/ddl/dialects/postgres-schema-dialect.ts +1 -1
  26. package/src/core/ddl/dialects/render-reference.test.ts +70 -70
  27. package/src/core/ddl/dialects/sqlite-schema-dialect.ts +1 -1
  28. package/src/core/ddl/introspect/catalogs/index.ts +5 -5
  29. package/src/core/ddl/introspect/catalogs/postgres.ts +146 -146
  30. package/src/core/ddl/introspect/context.ts +15 -15
  31. package/src/core/ddl/introspect/functions/postgres.ts +35 -35
  32. package/src/core/ddl/introspect/registry.ts +40 -40
  33. package/src/core/ddl/introspect/run-select.ts +35 -35
  34. package/src/core/ddl/introspect/utils.ts +56 -56
  35. package/src/core/ddl/naming-strategy.ts +16 -16
  36. package/src/core/ddl/schema-dialect.ts +56 -56
  37. package/src/core/ddl/schema-diff.ts +234 -234
  38. package/src/core/ddl/schema-generator.ts +1 -1
  39. package/src/core/ddl/schema-introspect.ts +25 -25
  40. package/src/core/ddl/sql-writing.ts +171 -171
  41. package/src/core/dialect/abstract.ts +541 -541
  42. package/src/core/dialect/base/cte-compiler.ts +33 -33
  43. package/src/core/dialect/base/function-table-formatter.ts +103 -103
  44. package/src/core/dialect/base/groupby-compiler.ts +21 -21
  45. package/src/core/dialect/base/join-compiler.ts +25 -25
  46. package/src/core/dialect/base/orderby-compiler.ts +35 -35
  47. package/src/core/dialect/base/pagination-strategy.ts +32 -32
  48. package/src/core/dialect/base/returning-strategy.ts +57 -57
  49. package/src/core/dialect/base/sql-dialect.ts +294 -294
  50. package/src/core/dialect/dialect-factory.ts +91 -91
  51. package/src/core/dialect/mssql/functions.ts +120 -120
  52. package/src/core/dialect/mssql/index.ts +317 -317
  53. package/src/core/dialect/mysql/functions.ts +103 -103
  54. package/src/core/dialect/mysql/index.ts +105 -105
  55. package/src/core/dialect/postgres/functions.ts +108 -108
  56. package/src/core/dialect/postgres/index.ts +91 -91
  57. package/src/core/dialect/sqlite/functions.ts +129 -129
  58. package/src/core/dialect/sqlite/index.ts +67 -67
  59. package/src/core/driver/database-driver.ts +19 -19
  60. package/src/core/driver/mssql-driver.ts +23 -23
  61. package/src/core/driver/mysql-driver.ts +23 -23
  62. package/src/core/driver/postgres-driver.ts +23 -23
  63. package/src/core/driver/sqlite-driver.ts +23 -23
  64. package/src/core/execution/db-executor.ts +92 -92
  65. package/src/core/execution/executors/better-sqlite3-executor.ts +90 -90
  66. package/src/core/execution/executors/mssql-executor.ts +184 -184
  67. package/src/core/execution/executors/mysql-executor.ts +88 -88
  68. package/src/core/execution/executors/postgres-executor.ts +26 -26
  69. package/src/core/execution/executors/sqlite-executor.ts +42 -42
  70. package/src/core/execution/pooling/pool-types.ts +30 -30
  71. package/src/core/execution/pooling/pool.ts +275 -275
  72. package/src/core/functions/array.ts +35 -35
  73. package/src/core/functions/control-flow.ts +79 -79
  74. package/src/core/functions/datetime.ts +237 -237
  75. package/src/core/functions/json.ts +70 -70
  76. package/src/core/functions/numeric.ts +297 -297
  77. package/src/core/functions/text.ts +334 -334
  78. package/src/core/functions/types.ts +33 -33
  79. package/src/core/hydration/types.ts +51 -51
  80. package/src/core/sql/sql-operator-config.ts +39 -39
  81. package/src/core/sql/sql.ts +152 -152
  82. package/src/decorators/column-decorator.ts +87 -87
  83. package/src/decorators/decorator-metadata.ts +143 -143
  84. package/src/decorators/entity.ts +93 -93
  85. package/src/decorators/index.ts +39 -39
  86. package/src/decorators/relations.ts +231 -231
  87. package/src/decorators/transformers/built-in/string-transformers.ts +231 -231
  88. package/src/decorators/transformers/transformer-decorators.ts +134 -134
  89. package/src/decorators/transformers/transformer-executor.ts +171 -171
  90. package/src/decorators/transformers/transformer-metadata.ts +73 -73
  91. package/src/decorators/validators/built-in/br-cep-validator.ts +55 -55
  92. package/src/decorators/validators/built-in/br-cnpj-validator.ts +105 -105
  93. package/src/decorators/validators/built-in/br-cpf-validator.ts +103 -103
  94. package/src/decorators/validators/country-validator-registry.ts +64 -64
  95. package/src/decorators/validators/country-validators-decorators.ts +203 -203
  96. package/src/decorators/validators/country-validators.ts +105 -105
  97. package/src/decorators/validators/validator-metadata.ts +59 -59
  98. package/src/dto/dto-types.ts +226 -226
  99. package/src/dto/filter-types.ts +141 -141
  100. package/src/dto/index.ts +95 -95
  101. package/src/dto/openapi/generators/base.ts +29 -29
  102. package/src/dto/openapi/generators/column.ts +37 -37
  103. package/src/dto/openapi/generators/dto.ts +91 -91
  104. package/src/dto/openapi/generators/filter.ts +75 -75
  105. package/src/dto/openapi/generators/nested-dto.ts +618 -618
  106. package/src/dto/openapi/generators/pagination.ts +111 -111
  107. package/src/dto/openapi/generators/relation-filter.ts +228 -228
  108. package/src/dto/openapi/index.ts +12 -12
  109. package/src/dto/openapi/types.ts +101 -101
  110. package/src/dto/openapi/utilities.ts +95 -95
  111. package/src/dto/pagination-utils.ts +150 -150
  112. package/src/dto/transform.ts +197 -197
  113. package/src/index.ts +86 -86
  114. package/src/orm/als.ts +58 -58
  115. package/src/orm/domain-event-bus.ts +119 -119
  116. package/src/orm/entity-context.ts +86 -86
  117. package/src/orm/entity-materializer.ts +159 -159
  118. package/src/orm/entity-meta.ts +97 -97
  119. package/src/orm/entity-registry.ts +39 -39
  120. package/src/orm/entity-relation-cache.ts +39 -39
  121. package/src/orm/execute.ts +194 -194
  122. package/src/orm/execution-context.ts +18 -18
  123. package/src/orm/hydration-context.ts +26 -26
  124. package/src/orm/hydration.ts +112 -112
  125. package/src/orm/identity-map.ts +61 -61
  126. package/src/orm/interceptor-pipeline.ts +16 -16
  127. package/src/orm/lazy-batch/belongs-to-many.ts +119 -119
  128. package/src/orm/lazy-batch/belongs-to.ts +108 -108
  129. package/src/orm/lazy-batch/has-many.ts +69 -69
  130. package/src/orm/lazy-batch/has-one.ts +68 -68
  131. package/src/orm/lazy-batch/shared.ts +125 -125
  132. package/src/orm/orm-session.ts +620 -620
  133. package/src/orm/orm.ts +34 -34
  134. package/src/orm/pooled-executor-factory.ts +121 -121
  135. package/src/orm/query-logger.ts +40 -40
  136. package/src/orm/relation-change-processor.ts +420 -420
  137. package/src/orm/relations/belongs-to.ts +143 -143
  138. package/src/orm/relations/has-many.ts +204 -204
  139. package/src/orm/relations/has-one.ts +174 -174
  140. package/src/orm/relations/many-to-many.ts +288 -288
  141. package/src/orm/relations/morph-many.ts +156 -156
  142. package/src/orm/relations/morph-one.ts +151 -151
  143. package/src/orm/relations/morph-to.ts +162 -162
  144. package/src/orm/runtime-types.ts +92 -92
  145. package/src/orm/save-graph.ts +561 -561
  146. package/src/orm/transaction-runner.ts +24 -24
  147. package/src/orm/unit-of-work.ts +426 -426
  148. package/src/query/index.ts +69 -69
  149. package/src/query/target.ts +46 -46
  150. package/src/query-builder/column-selector.ts +81 -81
  151. package/src/query-builder/delete.ts +141 -141
  152. package/src/query-builder/insert-query-state.ts +149 -149
  153. package/src/query-builder/insert.ts +117 -117
  154. package/src/query-builder/query-ast-service.ts +287 -287
  155. package/src/query-builder/query-resolution.ts +78 -78
  156. package/src/query-builder/raw-column-parser.ts +38 -38
  157. package/src/query-builder/relation-filter-utils.ts +153 -153
  158. package/src/query-builder/relation-join-planner.ts +10 -10
  159. package/src/query-builder/relation-manager.ts +87 -87
  160. package/src/query-builder/relation-projection-helper.ts +102 -102
  161. package/src/query-builder/relation-types.ts +9 -9
  162. package/src/query-builder/relation-utils.ts +15 -15
  163. package/src/query-builder/select/cte-facet.ts +40 -40
  164. package/src/query-builder/select/from-facet.ts +80 -80
  165. package/src/query-builder/select/join-facet.ts +62 -62
  166. package/src/query-builder/select/predicate-facet.ts +104 -104
  167. package/src/query-builder/select/projection-facet.ts +70 -70
  168. package/src/query-builder/select/relation-facet.ts +81 -81
  169. package/src/query-builder/select/setop-facet.ts +36 -36
  170. package/src/query-builder/select-helpers.ts +1 -1
  171. package/src/query-builder/select-query-builder-deps.ts +130 -130
  172. package/src/query-builder/select-query-state.ts +207 -207
  173. package/src/query-builder/update.ts +151 -151
  174. package/src/schema/column-types.ts +322 -322
  175. package/src/schema/table-guards.ts +37 -37
  176. package/src/schema/table.ts +281 -281
  177. package/src/tree/index.ts +13 -13
  178. package/src/tree/nested-set-strategy.ts +545 -545
  179. package/src/tree/tree-decorator.ts +397 -397
  180. package/src/tree/tree-manager.ts +754 -754
  181. package/src/tree/tree-query.ts +427 -427
  182. 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
+