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,33 +1,33 @@
1
- import { SelectQueryNode } from '../../ast/query.js';
2
- import { CompilerContext } from '../abstract.js';
3
-
4
- /**
5
- * Compiler for Common Table Expressions (CTEs).
6
- * Handles compilation of WITH and WITH RECURSIVE clauses.
7
- */
8
- export class CteCompiler {
9
- /**
10
- * Compiles CTEs (WITH clauses) including recursive CTEs.
11
- * @param ast - The SELECT query AST containing CTE definitions.
12
- * @param ctx - The compiler context for expression compilation.
13
- * @param quoteIdentifier - Function to quote identifiers according to dialect rules.
14
- * @param compileSelectAst - Function to recursively compile SELECT query ASTs.
15
- * @param normalizeSelectAst - Function to normalize SELECT query ASTs before compilation.
16
- * @param stripTrailingSemicolon - Function to remove trailing semicolons from SQL.
17
- * @returns SQL WITH clause string (e.g., "WITH cte_name AS (...) ") or empty string if no CTEs.
18
- */
19
- static compileCtes(ast: SelectQueryNode, ctx: CompilerContext, quoteIdentifier: (id: string) => string, compileSelectAst: (ast: SelectQueryNode, ctx: CompilerContext) => string, normalizeSelectAst: (ast: SelectQueryNode) => SelectQueryNode, stripTrailingSemicolon: (sql: string) => string): string {
20
- if (!ast.ctes || ast.ctes.length === 0) return '';
21
- const hasRecursive = ast.ctes.some(cte => cte.recursive);
22
- const prefix = hasRecursive ? 'WITH RECURSIVE ' : 'WITH ';
23
- const cteDefs = ast.ctes.map(cte => {
24
- const name = quoteIdentifier(cte.name);
25
- const cols = cte.columns && cte.columns.length
26
- ? `(${cte.columns.map(c => quoteIdentifier(c)).join(', ')})`
27
- : '';
28
- const query = stripTrailingSemicolon(compileSelectAst(normalizeSelectAst(cte.query), ctx));
29
- return `${name}${cols} AS (${query})`;
30
- }).join(', ');
31
- return `${prefix}${cteDefs} `;
32
- }
33
- }
1
+ import { SelectQueryNode } from '../../ast/query.js';
2
+ import { CompilerContext } from '../abstract.js';
3
+
4
+ /**
5
+ * Compiler for Common Table Expressions (CTEs).
6
+ * Handles compilation of WITH and WITH RECURSIVE clauses.
7
+ */
8
+ export class CteCompiler {
9
+ /**
10
+ * Compiles CTEs (WITH clauses) including recursive CTEs.
11
+ * @param ast - The SELECT query AST containing CTE definitions.
12
+ * @param ctx - The compiler context for expression compilation.
13
+ * @param quoteIdentifier - Function to quote identifiers according to dialect rules.
14
+ * @param compileSelectAst - Function to recursively compile SELECT query ASTs.
15
+ * @param normalizeSelectAst - Function to normalize SELECT query ASTs before compilation.
16
+ * @param stripTrailingSemicolon - Function to remove trailing semicolons from SQL.
17
+ * @returns SQL WITH clause string (e.g., "WITH cte_name AS (...) ") or empty string if no CTEs.
18
+ */
19
+ static compileCtes(ast: SelectQueryNode, ctx: CompilerContext, quoteIdentifier: (id: string) => string, compileSelectAst: (ast: SelectQueryNode, ctx: CompilerContext) => string, normalizeSelectAst: (ast: SelectQueryNode) => SelectQueryNode, stripTrailingSemicolon: (sql: string) => string): string {
20
+ if (!ast.ctes || ast.ctes.length === 0) return '';
21
+ const hasRecursive = ast.ctes.some(cte => cte.recursive);
22
+ const prefix = hasRecursive ? 'WITH RECURSIVE ' : 'WITH ';
23
+ const cteDefs = ast.ctes.map(cte => {
24
+ const name = quoteIdentifier(cte.name);
25
+ const cols = cte.columns && cte.columns.length
26
+ ? `(${cte.columns.map(c => quoteIdentifier(c)).join(', ')})`
27
+ : '';
28
+ const query = stripTrailingSemicolon(compileSelectAst(normalizeSelectAst(cte.query), ctx));
29
+ return `${name}${cols} AS (${query})`;
30
+ }).join(', ');
31
+ return `${prefix}${cteDefs} `;
32
+ }
33
+ }
@@ -1,112 +1,112 @@
1
- import { CompilerContext } from '../abstract.js';
1
+ import { CompilerContext } from '../abstract.js';
2
2
  import { OperandNode } from '../../ast/expression.js';
3
3
  import { FunctionTableNode } from '../../ast/query.js';
4
4
  import { SqlDialectBase } from './sql-dialect.js';
5
-
6
- /**
7
- * Formatter for function table expressions (e.g., LATERAL unnest(...) WITH ORDINALITY).
8
- * Encapsulates logic for generating SQL function table syntax including LATERAL, aliases, and column lists.
9
- */
10
- export class FunctionTableFormatter {
11
- /**
12
- * Formats a function table node into SQL syntax.
13
- * @param fn - The function table node containing schema, name, args, and aliases.
14
- * @param ctx - Optional compiler context for operand compilation.
15
- * @param dialect - The dialect instance for compiling operands.
16
- * @returns SQL function table expression (e.g., "LATERAL schema.func(args) WITH ORDINALITY AS alias(col1, col2)").
17
- */
5
+
6
+ /**
7
+ * Formatter for function table expressions (e.g., LATERAL unnest(...) WITH ORDINALITY).
8
+ * Encapsulates logic for generating SQL function table syntax including LATERAL, aliases, and column lists.
9
+ */
10
+ export class FunctionTableFormatter {
11
+ /**
12
+ * Formats a function table node into SQL syntax.
13
+ * @param fn - The function table node containing schema, name, args, and aliases.
14
+ * @param ctx - Optional compiler context for operand compilation.
15
+ * @param dialect - The dialect instance for compiling operands.
16
+ * @returns SQL function table expression (e.g., "LATERAL schema.func(args) WITH ORDINALITY AS alias(col1, col2)").
17
+ */
18
18
  static format(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {
19
- const schemaPart = this.formatSchema(fn, dialect);
20
- const args = this.formatArgs(fn, ctx, dialect);
19
+ const schemaPart = this.formatSchema(fn, dialect);
20
+ const args = this.formatArgs(fn, ctx, dialect);
21
21
  const base = this.formatBase(fn, schemaPart, args);
22
- const lateral = this.formatLateral(fn);
23
- const alias = this.formatAlias(fn, dialect);
24
- const colAliases = this.formatColumnAliases(fn, dialect);
25
- return `${lateral}${base}${alias}${colAliases}`;
26
- }
27
-
28
- /**
29
- * Formats the schema prefix for the function name.
30
- * @param fn - The function table node.
31
- * @param dialect - The dialect instance for quoting identifiers.
32
- * @returns Schema prefix (e.g., "schema.") or empty string.
33
- * @internal
34
- */
35
- private static formatSchema(fn: FunctionTableNode, dialect?: SqlDialectBase): string {
36
- if (!fn.schema) return '';
37
- const quoted = dialect ? dialect.quoteIdentifier(fn.schema) : fn.schema;
38
- return `${quoted}.`;
39
- }
40
-
41
- /**
42
- * Formats function arguments into SQL syntax.
43
- * @param fn - The function table node containing arguments.
44
- * @param ctx - Optional compiler context for operand compilation.
45
- * @param dialect - The dialect instance for compiling operands.
46
- * @returns Comma-separated function arguments.
47
- * @internal
48
- */
49
- private static formatArgs(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {
50
- return (fn.args || [])
51
- .map((a: OperandNode) => {
52
- if (ctx && dialect) {
53
- return (dialect as unknown as { compileOperand(n: OperandNode, c: CompilerContext): string }).compileOperand(a, ctx);
54
- }
55
- return String(a);
56
- })
57
- .join(', ');
58
- }
59
-
60
- /**
61
- * Formats the base function call with WITH ORDINALITY if present.
62
- * @param fn - The function table node.
63
- * @param schemaPart - Formatted schema prefix.
64
- * @param args - Formatted function arguments.
65
- * @param dialect - The dialect instance for quoting identifiers.
66
- * @returns Base function call expression (e.g., "schema.func(args) WITH ORDINALITY").
67
- * @internal
68
- */
22
+ const lateral = this.formatLateral(fn);
23
+ const alias = this.formatAlias(fn, dialect);
24
+ const colAliases = this.formatColumnAliases(fn, dialect);
25
+ return `${lateral}${base}${alias}${colAliases}`;
26
+ }
27
+
28
+ /**
29
+ * Formats the schema prefix for the function name.
30
+ * @param fn - The function table node.
31
+ * @param dialect - The dialect instance for quoting identifiers.
32
+ * @returns Schema prefix (e.g., "schema.") or empty string.
33
+ * @internal
34
+ */
35
+ private static formatSchema(fn: FunctionTableNode, dialect?: SqlDialectBase): string {
36
+ if (!fn.schema) return '';
37
+ const quoted = dialect ? dialect.quoteIdentifier(fn.schema) : fn.schema;
38
+ return `${quoted}.`;
39
+ }
40
+
41
+ /**
42
+ * Formats function arguments into SQL syntax.
43
+ * @param fn - The function table node containing arguments.
44
+ * @param ctx - Optional compiler context for operand compilation.
45
+ * @param dialect - The dialect instance for compiling operands.
46
+ * @returns Comma-separated function arguments.
47
+ * @internal
48
+ */
49
+ private static formatArgs(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {
50
+ return (fn.args || [])
51
+ .map((a: OperandNode) => {
52
+ if (ctx && dialect) {
53
+ return (dialect as unknown as { compileOperand(n: OperandNode, c: CompilerContext): string }).compileOperand(a, ctx);
54
+ }
55
+ return String(a);
56
+ })
57
+ .join(', ');
58
+ }
59
+
60
+ /**
61
+ * Formats the base function call with WITH ORDINALITY if present.
62
+ * @param fn - The function table node.
63
+ * @param schemaPart - Formatted schema prefix.
64
+ * @param args - Formatted function arguments.
65
+ * @param dialect - The dialect instance for quoting identifiers.
66
+ * @returns Base function call expression (e.g., "schema.func(args) WITH ORDINALITY").
67
+ * @internal
68
+ */
69
69
  private static formatBase(fn: FunctionTableNode, schemaPart: string, args: string): string {
70
70
  const ordinality = fn.withOrdinality ? ' WITH ORDINALITY' : '';
71
71
  return `${schemaPart}${fn.name}(${args})${ordinality}`;
72
72
  }
73
-
74
- /**
75
- * Formats the LATERAL keyword if present.
76
- * @param fn - The function table node.
77
- * @returns "LATERAL " or empty string.
78
- * @internal
79
- */
80
- private static formatLateral(fn: FunctionTableNode): string {
81
- return fn.lateral ? 'LATERAL ' : '';
82
- }
83
-
84
- /**
85
- * Formats the table alias for the function table.
86
- * @param fn - The function table node.
87
- * @param dialect - The dialect instance for quoting identifiers.
88
- * @returns " AS alias" or empty string.
89
- * @internal
90
- */
91
- private static formatAlias(fn: FunctionTableNode, dialect?: SqlDialectBase): string {
92
- if (!fn.alias) return '';
93
- const quoted = dialect ? dialect.quoteIdentifier(fn.alias) : fn.alias;
94
- return ` AS ${quoted}`;
95
- }
96
-
97
- /**
98
- * Formats column aliases for the function table result columns.
99
- * @param fn - The function table node containing column aliases.
100
- * @param dialect - The dialect instance for quoting identifiers.
101
- * @returns "(col1, col2, ...)" or empty string.
102
- * @internal
103
- */
104
- private static formatColumnAliases(fn: FunctionTableNode, dialect?: SqlDialectBase): string {
105
- if (!fn.columnAliases || !fn.columnAliases.length) return '';
106
- const aliases = fn.columnAliases
107
- .map(col => dialect ? dialect.quoteIdentifier(col) : col)
108
- .join(', ');
109
- return `(${aliases})`;
110
- }
111
- }
112
-
73
+
74
+ /**
75
+ * Formats the LATERAL keyword if present.
76
+ * @param fn - The function table node.
77
+ * @returns "LATERAL " or empty string.
78
+ * @internal
79
+ */
80
+ private static formatLateral(fn: FunctionTableNode): string {
81
+ return fn.lateral ? 'LATERAL ' : '';
82
+ }
83
+
84
+ /**
85
+ * Formats the table alias for the function table.
86
+ * @param fn - The function table node.
87
+ * @param dialect - The dialect instance for quoting identifiers.
88
+ * @returns " AS alias" or empty string.
89
+ * @internal
90
+ */
91
+ private static formatAlias(fn: FunctionTableNode, dialect?: SqlDialectBase): string {
92
+ if (!fn.alias) return '';
93
+ const quoted = dialect ? dialect.quoteIdentifier(fn.alias) : fn.alias;
94
+ return ` AS ${quoted}`;
95
+ }
96
+
97
+ /**
98
+ * Formats column aliases for the function table result columns.
99
+ * @param fn - The function table node containing column aliases.
100
+ * @param dialect - The dialect instance for quoting identifiers.
101
+ * @returns "(col1, col2, ...)" or empty string.
102
+ * @internal
103
+ */
104
+ private static formatColumnAliases(fn: FunctionTableNode, dialect?: SqlDialectBase): string {
105
+ if (!fn.columnAliases || !fn.columnAliases.length) return '';
106
+ const aliases = fn.columnAliases
107
+ .map(col => dialect ? dialect.quoteIdentifier(col) : col)
108
+ .join(', ');
109
+ return `(${aliases})`;
110
+ }
111
+ }
112
+
@@ -1,21 +1,21 @@
1
- import { OrderingTerm, SelectQueryNode } from '../../ast/query.js';
2
-
3
- type TermRenderer = (term: OrderingTerm) => string;
4
-
5
- /**
6
- * Compiler for GROUP BY clauses in SELECT statements.
7
- * Handles compilation of column grouping expressions.
8
- */
9
- export class GroupByCompiler {
10
- /**
11
- * Compiles GROUP BY clause from a SELECT query AST.
12
- * @param ast - The SELECT query AST containing grouping columns.
13
- * @param renderTerm - Function to render a grouping term.
14
- * @returns SQL GROUP BY clause (e.g., " GROUP BY table.col1, table.col2") or empty string if no grouping.
15
- */
16
- static compileGroupBy(ast: SelectQueryNode, renderTerm: TermRenderer): string {
17
- if (!ast.groupBy || ast.groupBy.length === 0) return '';
18
- const cols = ast.groupBy.map(renderTerm).join(', ');
19
- return ` GROUP BY ${cols}`;
20
- }
21
- }
1
+ import { OrderingTerm, SelectQueryNode } from '../../ast/query.js';
2
+
3
+ type TermRenderer = (term: OrderingTerm) => string;
4
+
5
+ /**
6
+ * Compiler for GROUP BY clauses in SELECT statements.
7
+ * Handles compilation of column grouping expressions.
8
+ */
9
+ export class GroupByCompiler {
10
+ /**
11
+ * Compiles GROUP BY clause from a SELECT query AST.
12
+ * @param ast - The SELECT query AST containing grouping columns.
13
+ * @param renderTerm - Function to render a grouping term.
14
+ * @returns SQL GROUP BY clause (e.g., " GROUP BY table.col1, table.col2") or empty string if no grouping.
15
+ */
16
+ static compileGroupBy(ast: SelectQueryNode, renderTerm: TermRenderer): string {
17
+ if (!ast.groupBy || ast.groupBy.length === 0) return '';
18
+ const cols = ast.groupBy.map(renderTerm).join(', ');
19
+ return ` GROUP BY ${cols}`;
20
+ }
21
+ }
@@ -1,25 +1,25 @@
1
- import { CompilerContext } from '../abstract.js';
2
- import { JoinNode } from '../../ast/join.js';
3
- import { TableSourceNode } from '../../ast/query.js';
4
- import { ExpressionNode } from '../../ast/expression.js';
5
-
6
- /**
7
- * Compiler for JOIN clauses in SELECT statements.
8
- * Handles compilation of all join types (INNER, LEFT, RIGHT, FULL, CROSS).
9
- */
10
- export class JoinCompiler {
11
- static compileJoins(
12
- joins: JoinNode[] | undefined,
13
- ctx: CompilerContext,
14
- compileFrom: (from: TableSourceNode, ctx: CompilerContext) => string,
15
- compileExpression: (expr: ExpressionNode, ctx: CompilerContext) => string
16
- ): string {
17
- if (!joins || joins.length === 0) return '';
18
- const parts = joins.map(j => {
19
- const table = compileFrom(j.table, ctx);
20
- const cond = compileExpression(j.condition, ctx);
21
- return `${j.kind} JOIN ${table} ON ${cond}`;
22
- });
23
- return ` ${parts.join(' ')}`;
24
- }
25
- }
1
+ import { CompilerContext } from '../abstract.js';
2
+ import { JoinNode } from '../../ast/join.js';
3
+ import { TableSourceNode } from '../../ast/query.js';
4
+ import { ExpressionNode } from '../../ast/expression.js';
5
+
6
+ /**
7
+ * Compiler for JOIN clauses in SELECT statements.
8
+ * Handles compilation of all join types (INNER, LEFT, RIGHT, FULL, CROSS).
9
+ */
10
+ export class JoinCompiler {
11
+ static compileJoins(
12
+ joins: JoinNode[] | undefined,
13
+ ctx: CompilerContext,
14
+ compileFrom: (from: TableSourceNode, ctx: CompilerContext) => string,
15
+ compileExpression: (expr: ExpressionNode, ctx: CompilerContext) => string
16
+ ): string {
17
+ if (!joins || joins.length === 0) return '';
18
+ const parts = joins.map(j => {
19
+ const table = compileFrom(j.table, ctx);
20
+ const cond = compileExpression(j.condition, ctx);
21
+ return `${j.kind} JOIN ${table} ON ${cond}`;
22
+ });
23
+ return ` ${parts.join(' ')}`;
24
+ }
25
+ }
@@ -1,35 +1,35 @@
1
- import { OrderByNode, SelectQueryNode } from '../../ast/query.js';
2
-
3
- type NullsRenderer = (order: OrderByNode) => string | undefined;
4
- type CollationRenderer = (order: OrderByNode) => string | undefined;
5
- type TermRenderer = (term: OrderByNode['term']) => string;
6
-
7
- /**
8
- * Compiler for ORDER BY clauses in SELECT statements.
9
- * Handles compilation of sorting expressions with direction (ASC/DESC).
10
- */
11
- export class OrderByCompiler {
12
- /**
13
- * Compiles ORDER BY clause from a SELECT query AST.
14
- * @param ast - The SELECT query AST containing sort specifications.
15
- * @param renderTerm - Function to render an ordering term.
16
- * @param renderNulls - Optional function to render NULLS FIRST/LAST.
17
- * @param renderCollation - Optional function to render COLLATE clause.
18
- * @returns SQL ORDER BY clause (e.g., " ORDER BY table.col1 ASC, table.col2 DESC") or empty string if no ordering.
19
- */
20
- static compileOrderBy(
21
- ast: SelectQueryNode,
22
- renderTerm: TermRenderer,
23
- renderNulls?: NullsRenderer,
24
- renderCollation?: CollationRenderer
25
- ): string {
26
- if (!ast.orderBy || ast.orderBy.length === 0) return '';
27
- const parts = ast.orderBy.map(o => {
28
- const term = renderTerm(o.term);
29
- const collation = renderCollation ? renderCollation(o) : o.collation ? ` COLLATE ${o.collation}` : '';
30
- const nulls = renderNulls ? renderNulls(o) : o.nulls ? ` NULLS ${o.nulls}` : '';
31
- return `${term} ${o.direction}${collation}${nulls}`;
32
- }).join(', ');
33
- return ` ORDER BY ${parts}`;
34
- }
35
- }
1
+ import { OrderByNode, SelectQueryNode } from '../../ast/query.js';
2
+
3
+ type NullsRenderer = (order: OrderByNode) => string | undefined;
4
+ type CollationRenderer = (order: OrderByNode) => string | undefined;
5
+ type TermRenderer = (term: OrderByNode['term']) => string;
6
+
7
+ /**
8
+ * Compiler for ORDER BY clauses in SELECT statements.
9
+ * Handles compilation of sorting expressions with direction (ASC/DESC).
10
+ */
11
+ export class OrderByCompiler {
12
+ /**
13
+ * Compiles ORDER BY clause from a SELECT query AST.
14
+ * @param ast - The SELECT query AST containing sort specifications.
15
+ * @param renderTerm - Function to render an ordering term.
16
+ * @param renderNulls - Optional function to render NULLS FIRST/LAST.
17
+ * @param renderCollation - Optional function to render COLLATE clause.
18
+ * @returns SQL ORDER BY clause (e.g., " ORDER BY table.col1 ASC, table.col2 DESC") or empty string if no ordering.
19
+ */
20
+ static compileOrderBy(
21
+ ast: SelectQueryNode,
22
+ renderTerm: TermRenderer,
23
+ renderNulls?: NullsRenderer,
24
+ renderCollation?: CollationRenderer
25
+ ): string {
26
+ if (!ast.orderBy || ast.orderBy.length === 0) return '';
27
+ const parts = ast.orderBy.map(o => {
28
+ const term = renderTerm(o.term);
29
+ const collation = renderCollation ? renderCollation(o) : o.collation ? ` COLLATE ${o.collation}` : '';
30
+ const nulls = renderNulls ? renderNulls(o) : o.nulls ? ` NULLS ${o.nulls}` : '';
31
+ return `${term} ${o.direction}${collation}${nulls}`;
32
+ }).join(', ');
33
+ return ` ORDER BY ${parts}`;
34
+ }
35
+ }
@@ -1,32 +1,32 @@
1
- /**
2
- * Strategy interface for compiling pagination clauses.
3
- * Allows dialects to customize how pagination (LIMIT/OFFSET, ROWS FETCH, etc.) is generated.
4
- */
5
- export interface PaginationStrategy {
6
- /**
7
- * Compiles pagination logic into SQL clause.
8
- * @param limit - The limit value, if present.
9
- * @param offset - The offset value, if present.
10
- * @returns SQL pagination clause (e.g., " LIMIT 10 OFFSET 0") or empty string if no pagination.
11
- */
12
- compilePagination(limit?: number, offset?: number): string;
13
- }
14
-
15
- /**
16
- * Standard SQL pagination using LIMIT and OFFSET.
17
- * Implements the ANSI SQL-style pagination with LIMIT/OFFSET syntax.
18
- */
19
- export class StandardLimitOffsetPagination implements PaginationStrategy {
20
- /**
21
- * Compiles LIMIT/OFFSET pagination clause.
22
- * @param limit - The maximum number of rows to return.
23
- * @param offset - The number of rows to skip.
24
- * @returns SQL pagination clause with LIMIT and/or OFFSET.
25
- */
26
- compilePagination(limit?: number, offset?: number): string {
27
- const parts: string[] = [];
28
- if (limit !== undefined) parts.push(`LIMIT ${limit}`);
29
- if (offset !== undefined) parts.push(`OFFSET ${offset}`);
30
- return parts.length ? ` ${parts.join(' ')}` : '';
31
- }
32
- }
1
+ /**
2
+ * Strategy interface for compiling pagination clauses.
3
+ * Allows dialects to customize how pagination (LIMIT/OFFSET, ROWS FETCH, etc.) is generated.
4
+ */
5
+ export interface PaginationStrategy {
6
+ /**
7
+ * Compiles pagination logic into SQL clause.
8
+ * @param limit - The limit value, if present.
9
+ * @param offset - The offset value, if present.
10
+ * @returns SQL pagination clause (e.g., " LIMIT 10 OFFSET 0") or empty string if no pagination.
11
+ */
12
+ compilePagination(limit?: number, offset?: number): string;
13
+ }
14
+
15
+ /**
16
+ * Standard SQL pagination using LIMIT and OFFSET.
17
+ * Implements the ANSI SQL-style pagination with LIMIT/OFFSET syntax.
18
+ */
19
+ export class StandardLimitOffsetPagination implements PaginationStrategy {
20
+ /**
21
+ * Compiles LIMIT/OFFSET pagination clause.
22
+ * @param limit - The maximum number of rows to return.
23
+ * @param offset - The number of rows to skip.
24
+ * @returns SQL pagination clause with LIMIT and/or OFFSET.
25
+ */
26
+ compilePagination(limit?: number, offset?: number): string {
27
+ const parts: string[] = [];
28
+ if (limit !== undefined) parts.push(`LIMIT ${limit}`);
29
+ if (offset !== undefined) parts.push(`OFFSET ${offset}`);
30
+ return parts.length ? ` ${parts.join(' ')}` : '';
31
+ }
32
+ }
@@ -1,57 +1,57 @@
1
- import { ColumnNode } from '../../ast/expression.js';
2
- import { CompilerContext } from '../abstract.js';
3
-
4
- /**
5
- * Strategy interface for handling RETURNING clauses in DML statements (INSERT, UPDATE, DELETE).
6
- * Different SQL dialects have varying levels of support for RETURNING clauses.
7
- */
8
- export interface ReturningStrategy {
9
- /**
10
- * Compiles a RETURNING clause for DML statements.
11
- * @param returning - Array of columns to return, or undefined if none.
12
- * @param ctx - The compiler context for expression compilation.
13
- * @returns SQL RETURNING clause or empty string if not supported.
14
- * @throws Error if RETURNING is not supported by this dialect.
15
- */
16
- compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string;
17
- /**
18
- * Formats column list for RETURNING clause.
19
- * @param returning - Array of columns to format.
20
- * @param quoteIdentifier - Function to quote identifiers according to dialect rules.
21
- * @returns Formatted column list (e.g., "table.col1, table.col2").
22
- */
23
- formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string;
24
- }
25
-
26
- /**
27
- * Default RETURNING strategy that throws an error when RETURNING is used.
28
- * Use this for dialects that don't support RETURNING clauses.
29
- */
30
- export class NoReturningStrategy implements ReturningStrategy {
31
- /**
32
- * Throws an error as RETURNING is not supported.
33
- * @param returning - Columns to return (causes error if non-empty).
34
- * @param _ctx - Compiler context (unused).
35
- * @throws Error indicating RETURNING is not supported.
36
- */
37
- compileReturning(returning: ColumnNode[] | undefined, _ctx: CompilerContext): string {
38
- void _ctx;
39
- if (!returning || returning.length === 0) return '';
40
- throw new Error('RETURNING is not supported by this dialect.');
41
- }
42
- /**
43
- * Formats column names for RETURNING clause.
44
- * @param returning - Columns to format.
45
- * @param quoteIdentifier - Function to quote identifiers according to dialect rules.
46
- * @returns Simple comma-separated column names.
47
- */
48
- formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string {
49
- return returning
50
- .map(column => {
51
- const tablePart = column.table ? `${quoteIdentifier(column.table)}.` : '';
52
- const aliasPart = column.alias ? ` AS ${quoteIdentifier(column.alias)}` : '';
53
- return `${tablePart}${quoteIdentifier(column.name)}${aliasPart}`;
54
- })
55
- .join(', ');
56
- }
57
- }
1
+ import { ColumnNode } from '../../ast/expression.js';
2
+ import { CompilerContext } from '../abstract.js';
3
+
4
+ /**
5
+ * Strategy interface for handling RETURNING clauses in DML statements (INSERT, UPDATE, DELETE).
6
+ * Different SQL dialects have varying levels of support for RETURNING clauses.
7
+ */
8
+ export interface ReturningStrategy {
9
+ /**
10
+ * Compiles a RETURNING clause for DML statements.
11
+ * @param returning - Array of columns to return, or undefined if none.
12
+ * @param ctx - The compiler context for expression compilation.
13
+ * @returns SQL RETURNING clause or empty string if not supported.
14
+ * @throws Error if RETURNING is not supported by this dialect.
15
+ */
16
+ compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string;
17
+ /**
18
+ * Formats column list for RETURNING clause.
19
+ * @param returning - Array of columns to format.
20
+ * @param quoteIdentifier - Function to quote identifiers according to dialect rules.
21
+ * @returns Formatted column list (e.g., "table.col1, table.col2").
22
+ */
23
+ formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string;
24
+ }
25
+
26
+ /**
27
+ * Default RETURNING strategy that throws an error when RETURNING is used.
28
+ * Use this for dialects that don't support RETURNING clauses.
29
+ */
30
+ export class NoReturningStrategy implements ReturningStrategy {
31
+ /**
32
+ * Throws an error as RETURNING is not supported.
33
+ * @param returning - Columns to return (causes error if non-empty).
34
+ * @param _ctx - Compiler context (unused).
35
+ * @throws Error indicating RETURNING is not supported.
36
+ */
37
+ compileReturning(returning: ColumnNode[] | undefined, _ctx: CompilerContext): string {
38
+ void _ctx;
39
+ if (!returning || returning.length === 0) return '';
40
+ throw new Error('RETURNING is not supported by this dialect.');
41
+ }
42
+ /**
43
+ * Formats column names for RETURNING clause.
44
+ * @param returning - Columns to format.
45
+ * @param quoteIdentifier - Function to quote identifiers according to dialect rules.
46
+ * @returns Simple comma-separated column names.
47
+ */
48
+ formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string {
49
+ return returning
50
+ .map(column => {
51
+ const tablePart = column.table ? `${quoteIdentifier(column.table)}.` : '';
52
+ const aliasPart = column.alias ? ` AS ${quoteIdentifier(column.alias)}` : '';
53
+ return `${tablePart}${quoteIdentifier(column.name)}${aliasPart}`;
54
+ })
55
+ .join(', ');
56
+ }
57
+ }