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