kysely 0.21.5 → 0.22.0

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 (133) hide show
  1. package/README.md +3 -2
  2. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +2 -0
  3. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +4 -0
  4. package/dist/cjs/index.d.ts +10 -4
  5. package/dist/cjs/index.js +8 -2
  6. package/dist/cjs/kysely.d.ts +3 -3
  7. package/dist/cjs/kysely.js +3 -3
  8. package/dist/cjs/migration/file-migration-provider.js +7 -2
  9. package/dist/cjs/operation-node/aggregate-function-node.d.ts +22 -0
  10. package/dist/cjs/operation-node/aggregate-function-node.js +31 -0
  11. package/dist/cjs/operation-node/alias-node.d.ts +2 -1
  12. package/dist/cjs/operation-node/default-insert-value-node.d.ts +11 -0
  13. package/dist/cjs/operation-node/{union-node.js → default-insert-value-node.js} +5 -7
  14. package/dist/cjs/operation-node/group-by-node.d.ts +1 -1
  15. package/dist/cjs/operation-node/group-by-node.js +3 -3
  16. package/dist/cjs/operation-node/insert-query-node.d.ts +2 -1
  17. package/dist/cjs/operation-node/operation-node-transformer.d.ts +12 -2
  18. package/dist/cjs/operation-node/operation-node-transformer.js +43 -5
  19. package/dist/cjs/operation-node/operation-node-utils.d.ts +2 -1
  20. package/dist/cjs/operation-node/operation-node-visitor.d.ts +12 -2
  21. package/dist/cjs/operation-node/operation-node-visitor.js +6 -1
  22. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  23. package/dist/cjs/operation-node/over-node.d.ts +19 -0
  24. package/dist/cjs/operation-node/over-node.js +35 -0
  25. package/dist/cjs/operation-node/partition-by-item-node.d.ts +14 -0
  26. package/dist/cjs/operation-node/partition-by-item-node.js +18 -0
  27. package/dist/cjs/operation-node/partition-by-node.d.ts +14 -0
  28. package/dist/cjs/operation-node/partition-by-node.js +24 -0
  29. package/dist/cjs/operation-node/select-query-node.d.ts +3 -3
  30. package/dist/cjs/operation-node/select-query-node.js +4 -4
  31. package/dist/cjs/operation-node/set-operation-node.d.ts +18 -0
  32. package/dist/cjs/operation-node/set-operation-node.js +20 -0
  33. package/dist/cjs/operation-node/value-list-node.d.ts +3 -1
  34. package/dist/cjs/parser/complex-expression-parser.d.ts +6 -4
  35. package/dist/cjs/parser/group-by-parser.d.ts +1 -1
  36. package/dist/cjs/parser/group-by-parser.js +2 -2
  37. package/dist/cjs/parser/insert-values-parser.js +13 -4
  38. package/dist/cjs/parser/parse-utils.d.ts +2 -0
  39. package/dist/cjs/parser/parse-utils.js +9 -1
  40. package/dist/cjs/parser/partition-by-parser.d.ts +6 -0
  41. package/dist/cjs/parser/partition-by-parser.js +9 -0
  42. package/dist/cjs/parser/reference-parser.d.ts +2 -1
  43. package/dist/cjs/parser/select-parser.d.ts +4 -3
  44. package/dist/cjs/parser/set-operation-parser.d.ts +5 -0
  45. package/dist/cjs/parser/set-operation-parser.js +8 -0
  46. package/dist/cjs/parser/value-parser.d.ts +2 -1
  47. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +117 -0
  48. package/dist/cjs/query-builder/aggregate-function-builder.js +146 -0
  49. package/dist/cjs/query-builder/expression-builder.d.ts +3 -3
  50. package/dist/cjs/query-builder/expression-builder.js +3 -3
  51. package/dist/cjs/query-builder/{function-builder.d.ts → function-module.d.ts} +49 -42
  52. package/dist/cjs/query-builder/{function-builder.js → function-module.js} +70 -59
  53. package/dist/cjs/query-builder/over-builder.d.ts +59 -0
  54. package/dist/cjs/query-builder/over-builder.js +50 -0
  55. package/dist/cjs/query-builder/select-query-builder.d.ts +63 -3
  56. package/dist/cjs/query-builder/select-query-builder.js +83 -3
  57. package/dist/cjs/query-compiler/default-query-compiler.d.ts +12 -2
  58. package/dist/cjs/query-compiler/default-query-compiler.js +44 -14
  59. package/dist/cjs/raw-builder/sql.d.ts +13 -5
  60. package/dist/cjs/raw-builder/sql.js +6 -0
  61. package/dist/cjs/util/object-utils.d.ts +1 -0
  62. package/dist/cjs/util/object-utils.js +5 -1
  63. package/dist/cjs/util/type-utils.d.ts +5 -1
  64. package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +2 -0
  65. package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +4 -0
  66. package/dist/esm/index.d.ts +10 -4
  67. package/dist/esm/index.js +8 -2
  68. package/dist/esm/kysely.d.ts +3 -3
  69. package/dist/esm/kysely.js +3 -3
  70. package/dist/esm/migration/file-migration-provider.js +7 -2
  71. package/dist/esm/operation-node/aggregate-function-node.d.ts +22 -0
  72. package/dist/esm/operation-node/aggregate-function-node.js +29 -0
  73. package/dist/esm/operation-node/alias-node.d.ts +2 -1
  74. package/dist/esm/operation-node/default-insert-value-node.d.ts +11 -0
  75. package/dist/esm/operation-node/default-insert-value-node.js +15 -0
  76. package/dist/esm/operation-node/group-by-node.d.ts +1 -1
  77. package/dist/esm/operation-node/group-by-node.js +3 -3
  78. package/dist/esm/operation-node/insert-query-node.d.ts +2 -1
  79. package/dist/esm/operation-node/operation-node-transformer.d.ts +12 -2
  80. package/dist/esm/operation-node/operation-node-transformer.js +43 -5
  81. package/dist/esm/operation-node/operation-node-utils.d.ts +2 -1
  82. package/dist/esm/operation-node/operation-node-visitor.d.ts +12 -2
  83. package/dist/esm/operation-node/operation-node-visitor.js +6 -1
  84. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  85. package/dist/esm/operation-node/over-node.d.ts +19 -0
  86. package/dist/esm/operation-node/over-node.js +33 -0
  87. package/dist/esm/operation-node/partition-by-item-node.d.ts +14 -0
  88. package/dist/esm/operation-node/partition-by-item-node.js +16 -0
  89. package/dist/esm/operation-node/partition-by-node.d.ts +14 -0
  90. package/dist/esm/operation-node/partition-by-node.js +22 -0
  91. package/dist/esm/operation-node/select-query-node.d.ts +3 -3
  92. package/dist/esm/operation-node/select-query-node.js +4 -4
  93. package/dist/esm/operation-node/set-operation-node.d.ts +18 -0
  94. package/dist/esm/operation-node/set-operation-node.js +18 -0
  95. package/dist/esm/operation-node/value-list-node.d.ts +3 -1
  96. package/dist/esm/parser/complex-expression-parser.d.ts +6 -4
  97. package/dist/esm/parser/group-by-parser.d.ts +1 -1
  98. package/dist/esm/parser/group-by-parser.js +2 -2
  99. package/dist/esm/parser/insert-values-parser.js +14 -5
  100. package/dist/esm/parser/parse-utils.d.ts +2 -0
  101. package/dist/esm/parser/parse-utils.js +7 -0
  102. package/dist/esm/parser/partition-by-parser.d.ts +6 -0
  103. package/dist/esm/parser/partition-by-parser.js +6 -0
  104. package/dist/esm/parser/reference-parser.d.ts +2 -1
  105. package/dist/esm/parser/select-parser.d.ts +4 -3
  106. package/dist/esm/parser/set-operation-parser.d.ts +5 -0
  107. package/dist/esm/parser/set-operation-parser.js +5 -0
  108. package/dist/esm/parser/value-parser.d.ts +2 -1
  109. package/dist/esm/query-builder/aggregate-function-builder.d.ts +117 -0
  110. package/dist/esm/query-builder/aggregate-function-builder.js +142 -0
  111. package/dist/esm/query-builder/expression-builder.d.ts +3 -3
  112. package/dist/esm/query-builder/expression-builder.js +3 -3
  113. package/dist/esm/query-builder/{function-builder.d.ts → function-module.d.ts} +49 -42
  114. package/dist/esm/query-builder/{function-builder.js → function-module.js} +69 -58
  115. package/dist/esm/query-builder/over-builder.d.ts +59 -0
  116. package/dist/esm/query-builder/over-builder.js +47 -0
  117. package/dist/esm/query-builder/select-query-builder.d.ts +63 -3
  118. package/dist/esm/query-builder/select-query-builder.js +83 -3
  119. package/dist/esm/query-compiler/default-query-compiler.d.ts +12 -2
  120. package/dist/esm/query-compiler/default-query-compiler.js +44 -14
  121. package/dist/esm/raw-builder/sql.d.ts +13 -5
  122. package/dist/esm/raw-builder/sql.js +6 -0
  123. package/dist/esm/util/object-utils.d.ts +1 -0
  124. package/dist/esm/util/object-utils.js +3 -0
  125. package/dist/esm/util/type-utils.d.ts +5 -1
  126. package/package.json +4 -1
  127. package/dist/cjs/operation-node/union-node.d.ts +0 -16
  128. package/dist/cjs/parser/union-parser.d.ts +0 -5
  129. package/dist/cjs/parser/union-parser.js +0 -8
  130. package/dist/esm/operation-node/union-node.d.ts +0 -16
  131. package/dist/esm/operation-node/union-node.js +0 -17
  132. package/dist/esm/parser/union-parser.d.ts +0 -5
  133. package/dist/esm/parser/union-parser.js +0 -5
@@ -2,10 +2,11 @@
2
2
  import { ColumnNode } from '../operation-node/column-node.js';
3
3
  import { PrimitiveValueListNode } from '../operation-node/primitive-value-list-node.js';
4
4
  import { ValueListNode } from '../operation-node/value-list-node.js';
5
- import { freeze } from '../util/object-utils.js';
5
+ import { freeze, isUndefined } from '../util/object-utils.js';
6
6
  import { parseValueExpression } from './value-parser.js';
7
7
  import { ValuesNode } from '../operation-node/values-node.js';
8
8
  import { isComplexExpression } from './complex-expression-parser.js';
9
+ import { DefaultInsertValueNode } from '../operation-node/default-insert-value-node.js';
9
10
  export function parseInsertObjectOrList(args) {
10
11
  return parseInsertColumnsAndValues(Array.isArray(args) ? args : [args]);
11
12
  }
@@ -30,16 +31,24 @@ function parseColumnNamesAndIndexes(rows) {
30
31
  }
31
32
  function parseRowValues(row, columns) {
32
33
  const rowColumns = Object.keys(row);
33
- const rowValues = new Array(columns.size).fill(null);
34
+ const rowValues = Array.from({
35
+ length: columns.size,
36
+ });
37
+ let complexColumn = false;
34
38
  for (const col of rowColumns) {
35
39
  const columnIdx = columns.get(col);
36
- const value = row[col];
37
40
  if (columnIdx !== undefined) {
41
+ const value = row[col];
42
+ if (isComplexExpression(value)) {
43
+ complexColumn = true;
44
+ }
38
45
  rowValues[columnIdx] = value;
39
46
  }
40
47
  }
41
- if (rowValues.some(isComplexExpression)) {
42
- return ValueListNode.create(rowValues.map((it) => parseValueExpression(it)));
48
+ const columnMissing = rowColumns.length < columns.size;
49
+ if (columnMissing || complexColumn) {
50
+ const defaultValue = DefaultInsertValueNode.create();
51
+ return ValueListNode.create(rowValues.map((it) => isUndefined(it) ? defaultValue : parseValueExpression(it)));
43
52
  }
44
53
  return PrimitiveValueListNode.create(rowValues);
45
54
  }
@@ -1,6 +1,7 @@
1
1
  import { JoinType } from '../operation-node/join-node.js';
2
2
  import { ExpressionBuilder } from '../query-builder/expression-builder.js';
3
3
  import { JoinBuilder } from '../query-builder/join-builder.js';
4
+ import { OverBuilder } from '../query-builder/over-builder.js';
4
5
  import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
5
6
  import { QueryCreator } from '../query-creator.js';
6
7
  import { TableExpression } from './table-parser.js';
@@ -8,3 +9,4 @@ export declare function createSelectQueryBuilder(): SelectQueryBuilder<any, any,
8
9
  export declare function createExpressionBuilder(): ExpressionBuilder<any, any>;
9
10
  export declare function createQueryCreator(): QueryCreator<any>;
10
11
  export declare function createJoinBuilder(joinType: JoinType, table: TableExpression<any, any>): JoinBuilder<any, any>;
12
+ export declare function createOverBuilder(): OverBuilder<any, any>;
@@ -1,8 +1,10 @@
1
1
  /// <reference types="./parse-utils.d.ts" />
2
2
  import { JoinNode } from '../operation-node/join-node.js';
3
+ import { OverNode } from '../operation-node/over-node.js';
3
4
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
4
5
  import { ExpressionBuilder } from '../query-builder/expression-builder.js';
5
6
  import { JoinBuilder } from '../query-builder/join-builder.js';
7
+ import { OverBuilder } from '../query-builder/over-builder.js';
6
8
  import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
7
9
  import { QueryCreator } from '../query-creator.js';
8
10
  import { NOOP_QUERY_EXECUTOR } from '../query-executor/noop-query-executor.js';
@@ -30,3 +32,8 @@ export function createJoinBuilder(joinType, table) {
30
32
  joinNode: JoinNode.create(joinType, parseTableExpression(table)),
31
33
  });
32
34
  }
35
+ export function createOverBuilder() {
36
+ return new OverBuilder({
37
+ overNode: OverNode.create(),
38
+ });
39
+ }
@@ -0,0 +1,6 @@
1
+ import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
2
+ import { PartitionByItemNode } from '../operation-node/partition-by-item-node.js';
3
+ import { StringReference } from './reference-parser.js';
4
+ export declare type PartitionByExpression<DB, TB extends keyof DB> = StringReference<DB, TB> | DynamicReferenceBuilder<any>;
5
+ export declare type PartitionByExpressionOrList<DB, TB extends keyof DB> = ReadonlyArray<PartitionByExpression<DB, TB>> | PartitionByExpression<DB, TB>;
6
+ export declare function parsePartitionBy(partitionBy: PartitionByExpressionOrList<any, any>): PartitionByItemNode[];
@@ -0,0 +1,6 @@
1
+ /// <reference types="./partition-by-parser.d.ts" />
2
+ import { PartitionByItemNode } from '../operation-node/partition-by-item-node.js';
3
+ import { parseReferenceExpressionOrList, } from './reference-parser.js';
4
+ export function parsePartitionBy(partitionBy) {
5
+ return parseReferenceExpressionOrList(partitionBy).map(PartitionByItemNode.create);
6
+ }
@@ -8,10 +8,11 @@ import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
8
8
  import { ComplexExpression } from './complex-expression-parser.js';
9
9
  import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
10
10
  import { SelectType } from '../util/column-type.js';
11
+ import { AggregateFunctionBuilder } from '../query-builder/aggregate-function-builder.js';
11
12
  export declare type ReferenceExpression<DB, TB extends keyof DB> = StringReference<DB, TB> | DynamicReferenceBuilder<any> | ComplexExpression<DB, TB>;
12
13
  export declare type ReferenceExpressionOrList<DB, TB extends keyof DB> = ReferenceExpression<DB, TB> | ReadonlyArray<ReferenceExpression<DB, TB>>;
13
14
  export declare type StringReference<DB, TB extends keyof DB> = AnyColumn<DB, TB> | AnyColumnWithTable<DB, TB>;
14
- export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE> = RE extends string ? SelectType<ExtractTypeFromStringReference<DB, TB, RE>> : RE extends RawBuilder<infer O> ? O : RE extends (qb: any) => RawBuilder<infer O> ? O : RE extends SelectQueryBuilder<any, any, infer O> ? ValueType<O> : RE extends (qb: any) => SelectQueryBuilder<any, any, infer O> ? ValueType<O> : unknown;
15
+ export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE> = RE extends string ? SelectType<ExtractTypeFromStringReference<DB, TB, RE>> : RE extends RawBuilder<infer O> ? O : RE extends (qb: any) => RawBuilder<infer O> ? O : RE extends SelectQueryBuilder<any, any, infer O> ? ValueType<O> : RE extends (qb: any) => SelectQueryBuilder<any, any, infer O> ? ValueType<O> : RE extends AggregateFunctionBuilder<any, any, infer O> ? O : RE extends (qb: any) => AggregateFunctionBuilder<any, any, infer O> ? O : unknown;
15
16
  declare type ExtractTypeFromStringReference<DB, TB extends keyof DB, RE extends string> = RE extends `${infer SC}.${infer T}.${infer C}` ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : RE extends `${infer T}.${infer C}` ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : RE extends AnyColumn<DB, TB> ? ExtractColumnType<DB, TB, RE> : unknown;
16
17
  export declare function parseReferenceExpressionOrList(arg: ReferenceExpressionOrList<any, any>): ReferenceExpressionNode[];
17
18
  export declare function parseReferenceExpression(exp: ReferenceExpression<any, any>): ReferenceExpressionNode;
@@ -5,7 +5,8 @@ import { AnyAliasedColumn, AnyAliasedColumnWithTable, AnyColumn, AnyColumnWithTa
5
5
  import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
6
6
  import { AliasedComplexExpression } from './complex-expression-parser.js';
7
7
  import { Selectable, SelectType } from '../util/column-type.js';
8
- export declare type SelectExpression<DB, TB extends keyof DB> = AnyAliasedColumnWithTable<DB, TB> | AnyAliasedColumn<DB, TB> | AnyColumnWithTable<DB, TB> | AnyColumn<DB, TB> | DynamicReferenceBuilder<any> | AliasedComplexExpression<DB, TB>;
8
+ import { AliasedAggregateFunctionBuilder } from '../query-builder/aggregate-function-builder.js';
9
+ export declare type SelectExpression<DB, TB extends keyof DB> = AnyAliasedColumnWithTable<DB, TB> | AnyAliasedColumn<DB, TB> | AnyColumnWithTable<DB, TB> | AnyColumn<DB, TB> | DynamicReferenceBuilder<any> | AliasedComplexExpression<DB, TB> | AliasedAggregateFunctionBuilder<DB, TB>;
9
10
  export declare type SelectExpressionOrList<DB, TB extends keyof DB> = SelectExpression<DB, TB> | ReadonlyArray<SelectExpression<DB, TB>>;
10
11
  /**
11
12
  * Given a selection expression returns a query builder type that
@@ -19,9 +20,9 @@ export declare type SelectAllQueryBuilder<DB, TB extends keyof DB, O, S extends
19
20
  export declare type Selection<DB, TB extends keyof DB, SE> = {
20
21
  [A in ExtractAliasFromSelectExpression<SE>]: SelectType<ExtractTypeFromSelectExpression<DB, TB, SE, A>>;
21
22
  };
22
- declare type ExtractAliasFromSelectExpression<SE> = SE extends string ? ExtractAliasFromStringSelectExpression<SE> : SE extends AliasedRawBuilder<any, infer RA> ? RA : SE extends (qb: any) => AliasedRawBuilder<any, infer RA> ? RA : SE extends AliasedQueryBuilder<any, any, any, infer QA> ? QA : SE extends (qb: any) => AliasedQueryBuilder<any, any, any, infer QA> ? QA : SE extends DynamicReferenceBuilder<infer RA> ? ExtractAliasFromStringSelectExpression<RA> : never;
23
+ declare type ExtractAliasFromSelectExpression<SE> = SE extends string ? ExtractAliasFromStringSelectExpression<SE> : SE extends AliasedRawBuilder<any, infer RA> ? RA : SE extends (qb: any) => AliasedRawBuilder<any, infer RA> ? RA : SE extends AliasedQueryBuilder<any, any, any, infer QA> ? QA : SE extends (qb: any) => AliasedQueryBuilder<any, any, any, infer QA> ? QA : SE extends DynamicReferenceBuilder<infer RA> ? ExtractAliasFromStringSelectExpression<RA> : SE extends AliasedAggregateFunctionBuilder<any, any, any, infer QA> ? QA : SE extends (qb: any) => AliasedAggregateFunctionBuilder<any, any, any, infer QA> ? QA : never;
23
24
  declare type ExtractAliasFromStringSelectExpression<SE extends string> = SE extends `${string}.${string}.${string} as ${infer A}` ? A : SE extends `${string}.${string} as ${infer A}` ? A : SE extends `${string} as ${infer A}` ? A : SE extends `${string}.${string}.${infer C}` ? C : SE extends `${string}.${infer C}` ? C : SE;
24
- declare type ExtractTypeFromSelectExpression<DB, TB extends keyof DB, SE, A extends keyof any> = SE extends string ? ExtractTypeFromStringSelectExpression<DB, TB, SE, A> : SE extends AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : SE extends (qb: any) => AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : SE extends AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? ValueType<O> : never : SE extends (qb: any) => AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? ValueType<O> : never : SE extends DynamicReferenceBuilder<infer RA> ? A extends ExtractAliasFromStringSelectExpression<RA> ? ExtractTypeFromStringSelectExpression<DB, TB, RA, A> | undefined : never : never;
25
+ declare type ExtractTypeFromSelectExpression<DB, TB extends keyof DB, SE, A extends keyof any> = SE extends string ? ExtractTypeFromStringSelectExpression<DB, TB, SE, A> : SE extends AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : SE extends (qb: any) => AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : SE extends AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? ValueType<O> : never : SE extends (qb: any) => AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? ValueType<O> : never : SE extends DynamicReferenceBuilder<infer RA> ? A extends ExtractAliasFromStringSelectExpression<RA> ? ExtractTypeFromStringSelectExpression<DB, TB, RA, A> | undefined : never : SE extends AliasedAggregateFunctionBuilder<any, any, infer O, infer FA> ? FA extends A ? O : never : SE extends (qb: any) => AliasedAggregateFunctionBuilder<any, any, infer O, infer FA> ? FA extends A ? O : never : never;
25
26
  declare type ExtractTypeFromStringSelectExpression<DB, TB extends keyof DB, SE extends string, A extends keyof any> = SE extends `${infer SC}.${infer T}.${infer C} as ${infer RA}` ? RA extends A ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : never : SE extends `${infer T}.${infer C} as ${infer RA}` ? RA extends A ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : never : SE extends `${infer C} as ${infer RA}` ? RA extends A ? C extends AnyColumn<DB, TB> ? ExtractColumnType<DB, TB, C> : never : never : SE extends `${infer SC}.${infer T}.${infer C}` ? C extends A ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : never : SE extends `${infer T}.${infer C}` ? C extends A ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : never : SE extends A ? SE extends AnyColumn<DB, TB> ? ExtractColumnType<DB, TB, SE> : never : never;
26
27
  declare type AllSelection<DB, TB extends keyof DB> = Selectable<{
27
28
  [C in AnyColumn<DB, TB>]: {
@@ -0,0 +1,5 @@
1
+ import { SetOperator, SetOperationNode } from '../operation-node/set-operation-node.js';
2
+ import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
3
+ import { RawBuilder } from '../raw-builder/raw-builder.js';
4
+ export declare type SetOperationExpression<DB, O> = SelectQueryBuilder<DB, any, O> | RawBuilder<O>;
5
+ export declare function parseSetOperation(operator: SetOperator, expression: SetOperationExpression<any, any>, all: boolean): SetOperationNode;
@@ -0,0 +1,5 @@
1
+ /// <reference types="./set-operation-parser.d.ts" />
2
+ import { SetOperationNode, } from '../operation-node/set-operation-node.js';
3
+ export function parseSetOperation(operator, expression, all) {
4
+ return SetOperationNode.create(operator, expression.toOperationNode(), all);
5
+ }
@@ -3,7 +3,8 @@ import { ValueNode } from '../operation-node/value-node.js';
3
3
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
4
4
  import { RawNode } from '../operation-node/raw-node.js';
5
5
  import { ComplexExpression } from './complex-expression-parser.js';
6
+ import { AggregateFunctionNode } from '../operation-node/aggregate-function-node.js';
6
7
  export declare type ValueExpression<DB, TB extends keyof DB, V> = V | ComplexExpression<DB, TB, V>;
7
8
  export declare type ValueExpressionOrList<DB, TB extends keyof DB, V> = ValueExpression<DB, TB, V> | ReadonlyArray<ValueExpression<DB, TB, V>>;
8
9
  export declare function parseValueExpressionOrList(arg: ValueExpressionOrList<any, any, unknown>): ValueExpressionNode;
9
- export declare function parseValueExpression(exp: ValueExpression<any, any, unknown>): ValueNode | SelectQueryNode | RawNode;
10
+ export declare function parseValueExpression(exp: ValueExpression<any, any, unknown>): ValueNode | SelectQueryNode | RawNode | AggregateFunctionNode;
@@ -0,0 +1,117 @@
1
+ import { AggregateFunctionNode } from '../operation-node/aggregate-function-node.js';
2
+ import { OperationNodeSource } from '../operation-node/operation-node-source.js';
3
+ import { AliasNode } from '../operation-node/alias-node.js';
4
+ import { OverBuilder } from './over-builder.js';
5
+ export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unknown> implements OperationNodeSource {
6
+ #private;
7
+ constructor(props: AggregateFunctionBuilderProps);
8
+ /**
9
+ * Returns an aliased version of the function.
10
+ *
11
+ * In addition to slapping `as "the_alias"` to the end of the SQL,
12
+ * this method also provides strict typing:
13
+ *
14
+ * ```ts
15
+ * const result = await db
16
+ * .selectFrom('person')
17
+ * .select(
18
+ * eb => eb.fn.count<number>('id').as('person_count')
19
+ * )
20
+ * .executeTakeFirstOrThrow()
21
+ *
22
+ * // `person_count: number` field exists in the result type.
23
+ * console.log(result.person_count)
24
+ * ```
25
+ *
26
+ * The generated SQL (PostgreSQL):
27
+ *
28
+ * ```sql
29
+ * select count("id") as "person_count"
30
+ * from "person"
31
+ * ```
32
+ */
33
+ as<A extends string>(alias: A): AliasedAggregateFunctionBuilder<DB, TB, O, A>;
34
+ /**
35
+ * Adds a distinct clause inside the function.
36
+ *
37
+ * ```ts
38
+ * const result = await db
39
+ * .selectFrom('person')
40
+ * .select(
41
+ * eb => eb.fn.count<number>('first_name').distinct().as('first_name_count')
42
+ * )
43
+ * .executeTakeFirstOrThrow()
44
+ * ```
45
+ *
46
+ * The generated SQL (PostgreSQL):
47
+ *
48
+ * ```sql
49
+ * select count(distinct "first_name") as "first_name_count"
50
+ * from "person"
51
+ * ```
52
+ */
53
+ distinct(): AggregateFunctionBuilder<DB, TB, O>;
54
+ /**
55
+ * Adds an over clause (window functions) after the function.
56
+ *
57
+ * ```ts
58
+ * const result = await db
59
+ * .selectFrom('person')
60
+ * .select(
61
+ * eb => eb.fn.avg<number>('age').over().as('average_age')
62
+ * )
63
+ * .execute()
64
+ * ```
65
+ *
66
+ * The generated SQL (PostgreSQL):
67
+ *
68
+ * ```sql
69
+ * select avg("age") over() as "average_age"
70
+ * from "person"
71
+ * ```
72
+ *
73
+ * Also supports passing a callback that returns an over builder,
74
+ * allowing to add partition by and sort by clauses inside over.
75
+ *
76
+ * ```ts
77
+ * const result = await db
78
+ * .selectFrom('person')
79
+ * .select(
80
+ * eb => eb.fn.avg<number>('age').over(
81
+ * ob => ob.partitionBy('last_name').orderBy('first_name', 'asc')
82
+ * ).as('average_age')
83
+ * )
84
+ * .execute()
85
+ * ```
86
+ *
87
+ * The generated SQL (PostgreSQL):
88
+ *
89
+ * ```sql
90
+ * select avg("age") over(partition by "last_name" order by "first_name" asc) as "average_age"
91
+ * from "person"
92
+ * ```
93
+ */
94
+ over(over?: OverBuilderCallback<DB, TB>): AggregateFunctionBuilder<DB, TB, O>;
95
+ toOperationNode(): AggregateFunctionNode;
96
+ }
97
+ /**
98
+ * {@link AggregateFunctionBuilder} with an alias. The result of calling {@link AggregateFunctionBuilder.as}.
99
+ */
100
+ export declare class AliasedAggregateFunctionBuilder<DB, TB extends keyof DB, O = unknown, A extends string = never> implements OperationNodeSource {
101
+ #private;
102
+ constructor(aggregateFunctionBuilder: AggregateFunctionBuilder<DB, TB, O>, alias: A);
103
+ /**
104
+ * @private
105
+ *
106
+ * This needs to be here just so that the typings work. Without this
107
+ * the generated .d.ts file contains no reference to the type param A
108
+ * which causes this type to be equal to AliasedAggregateFunctionBuilder with any A
109
+ * as long as O is the same.
110
+ */
111
+ protected get alias(): A;
112
+ toOperationNode(): AliasNode;
113
+ }
114
+ export interface AggregateFunctionBuilderProps {
115
+ aggregateFunctionNode: AggregateFunctionNode;
116
+ }
117
+ export declare type OverBuilderCallback<DB, TB extends keyof DB> = (builder: OverBuilder<DB, TB>) => OverBuilder<DB, TB>;
@@ -0,0 +1,142 @@
1
+ /// <reference types="./aggregate-function-builder.d.ts" />
2
+ import { freeze } from '../util/object-utils.js';
3
+ import { AggregateFunctionNode } from '../operation-node/aggregate-function-node.js';
4
+ import { AliasNode } from '../operation-node/alias-node.js';
5
+ import { IdentifierNode } from '../operation-node/identifier-node.js';
6
+ import { preventAwait } from '../util/prevent-await.js';
7
+ import { createOverBuilder } from '../parser/parse-utils.js';
8
+ export class AggregateFunctionBuilder {
9
+ #props;
10
+ constructor(props) {
11
+ this.#props = freeze(props);
12
+ }
13
+ /**
14
+ * Returns an aliased version of the function.
15
+ *
16
+ * In addition to slapping `as "the_alias"` to the end of the SQL,
17
+ * this method also provides strict typing:
18
+ *
19
+ * ```ts
20
+ * const result = await db
21
+ * .selectFrom('person')
22
+ * .select(
23
+ * eb => eb.fn.count<number>('id').as('person_count')
24
+ * )
25
+ * .executeTakeFirstOrThrow()
26
+ *
27
+ * // `person_count: number` field exists in the result type.
28
+ * console.log(result.person_count)
29
+ * ```
30
+ *
31
+ * The generated SQL (PostgreSQL):
32
+ *
33
+ * ```sql
34
+ * select count("id") as "person_count"
35
+ * from "person"
36
+ * ```
37
+ */
38
+ as(alias) {
39
+ return new AliasedAggregateFunctionBuilder(this, alias);
40
+ }
41
+ /**
42
+ * Adds a distinct clause inside the function.
43
+ *
44
+ * ```ts
45
+ * const result = await db
46
+ * .selectFrom('person')
47
+ * .select(
48
+ * eb => eb.fn.count<number>('first_name').distinct().as('first_name_count')
49
+ * )
50
+ * .executeTakeFirstOrThrow()
51
+ * ```
52
+ *
53
+ * The generated SQL (PostgreSQL):
54
+ *
55
+ * ```sql
56
+ * select count(distinct "first_name") as "first_name_count"
57
+ * from "person"
58
+ * ```
59
+ */
60
+ distinct() {
61
+ return new AggregateFunctionBuilder({
62
+ ...this.#props,
63
+ aggregateFunctionNode: AggregateFunctionNode.cloneWithDistinct(this.#props.aggregateFunctionNode),
64
+ });
65
+ }
66
+ /**
67
+ * Adds an over clause (window functions) after the function.
68
+ *
69
+ * ```ts
70
+ * const result = await db
71
+ * .selectFrom('person')
72
+ * .select(
73
+ * eb => eb.fn.avg<number>('age').over().as('average_age')
74
+ * )
75
+ * .execute()
76
+ * ```
77
+ *
78
+ * The generated SQL (PostgreSQL):
79
+ *
80
+ * ```sql
81
+ * select avg("age") over() as "average_age"
82
+ * from "person"
83
+ * ```
84
+ *
85
+ * Also supports passing a callback that returns an over builder,
86
+ * allowing to add partition by and sort by clauses inside over.
87
+ *
88
+ * ```ts
89
+ * const result = await db
90
+ * .selectFrom('person')
91
+ * .select(
92
+ * eb => eb.fn.avg<number>('age').over(
93
+ * ob => ob.partitionBy('last_name').orderBy('first_name', 'asc')
94
+ * ).as('average_age')
95
+ * )
96
+ * .execute()
97
+ * ```
98
+ *
99
+ * The generated SQL (PostgreSQL):
100
+ *
101
+ * ```sql
102
+ * select avg("age") over(partition by "last_name" order by "first_name" asc) as "average_age"
103
+ * from "person"
104
+ * ```
105
+ */
106
+ over(over) {
107
+ const builder = createOverBuilder();
108
+ return new AggregateFunctionBuilder({
109
+ ...this.#props,
110
+ aggregateFunctionNode: AggregateFunctionNode.cloneWithOver(this.#props.aggregateFunctionNode, (over ? over(builder) : builder).toOperationNode()),
111
+ });
112
+ }
113
+ toOperationNode() {
114
+ return this.#props.aggregateFunctionNode;
115
+ }
116
+ }
117
+ preventAwait(AggregateFunctionBuilder, "don't await AggregateFunctionBuilder instances. They are never executed directly and are always just a part of a query.");
118
+ /**
119
+ * {@link AggregateFunctionBuilder} with an alias. The result of calling {@link AggregateFunctionBuilder.as}.
120
+ */
121
+ export class AliasedAggregateFunctionBuilder {
122
+ #aggregateFunctionBuilder;
123
+ #alias;
124
+ constructor(aggregateFunctionBuilder, alias) {
125
+ this.#aggregateFunctionBuilder = aggregateFunctionBuilder;
126
+ this.#alias = alias;
127
+ }
128
+ /**
129
+ * @private
130
+ *
131
+ * This needs to be here just so that the typings work. Without this
132
+ * the generated .d.ts file contains no reference to the type param A
133
+ * which causes this type to be equal to AliasedAggregateFunctionBuilder with any A
134
+ * as long as O is the same.
135
+ */
136
+ get alias() {
137
+ return this.#alias;
138
+ }
139
+ toOperationNode() {
140
+ return AliasNode.create(this.#aggregateFunctionBuilder.toOperationNode(), IdentifierNode.create(this.#alias));
141
+ }
142
+ }
@@ -1,6 +1,6 @@
1
1
  import { SelectQueryBuilder } from './select-query-builder.js';
2
2
  import { TableExpression, From, FromTables } from '../parser/table-parser.js';
3
- import { FunctionBuilder } from './function-builder.js';
3
+ import { FunctionModule } from './function-module.js';
4
4
  import { ExtractTypeFromReferenceExpression, StringReference } from '../parser/reference-parser.js';
5
5
  import { RawBuilder } from '../raw-builder/raw-builder.js';
6
6
  import { QueryExecutor } from '../query-executor/query-executor.js';
@@ -8,7 +8,7 @@ export declare class ExpressionBuilder<DB, TB extends keyof DB> {
8
8
  #private;
9
9
  constructor(props: ExpressionBuilderProps);
10
10
  /**
11
- * Returns a {@link FunctionBuilder} that can be used to write type safe function
11
+ * Returns a {@link FunctionModule} that can be used to write type safe function
12
12
  * calls.
13
13
  *
14
14
  * The difference between this and {@link Kysely.fn} is that this one is more
@@ -38,7 +38,7 @@ export declare class ExpressionBuilder<DB, TB extends keyof DB> {
38
38
  * having count("pet"."id") > $1
39
39
  * ```
40
40
  */
41
- get fn(): FunctionBuilder<DB, TB>;
41
+ get fn(): FunctionModule<DB, TB>;
42
42
  /**
43
43
  * Creates a subquery.
44
44
  *
@@ -4,7 +4,7 @@ import { SelectQueryNode } from '../operation-node/select-query-node.js';
4
4
  import { parseTableExpressionOrList, } from '../parser/table-parser.js';
5
5
  import { WithSchemaPlugin } from '../plugin/with-schema/with-schema-plugin.js';
6
6
  import { createQueryId } from '../util/query-id.js';
7
- import { FunctionBuilder } from './function-builder.js';
7
+ import { FunctionModule } from './function-module.js';
8
8
  import { parseStringReference, } from '../parser/reference-parser.js';
9
9
  import { RawBuilder } from '../raw-builder/raw-builder.js';
10
10
  import { freeze } from '../util/object-utils.js';
@@ -15,7 +15,7 @@ export class ExpressionBuilder {
15
15
  this.#props = freeze(props);
16
16
  }
17
17
  /**
18
- * Returns a {@link FunctionBuilder} that can be used to write type safe function
18
+ * Returns a {@link FunctionModule} that can be used to write type safe function
19
19
  * calls.
20
20
  *
21
21
  * The difference between this and {@link Kysely.fn} is that this one is more
@@ -46,7 +46,7 @@ export class ExpressionBuilder {
46
46
  * ```
47
47
  */
48
48
  get fn() {
49
- return new FunctionBuilder();
49
+ return new FunctionModule();
50
50
  }
51
51
  selectFrom(table) {
52
52
  return new SelectQueryBuilder({
@@ -1,5 +1,5 @@
1
1
  import { StringReference, ExtractTypeFromReferenceExpression } from '../parser/reference-parser.js';
2
- import { RawBuilder } from '../raw-builder/raw-builder.js';
2
+ import { AggregateFunctionBuilder } from './aggregate-function-builder.js';
3
3
  /**
4
4
  * Helpers for type safe SQL function calls.
5
5
  *
@@ -32,38 +32,8 @@ import { RawBuilder } from '../raw-builder/raw-builder.js';
32
32
  * having count("pet"."id") > $1
33
33
  * ```
34
34
  */
35
- export declare class FunctionBuilder<DB, TB extends keyof DB> {
36
- #private;
35
+ export declare class FunctionModule<DB, TB extends keyof DB> {
37
36
  constructor();
38
- /**
39
- * Calls the `max` function for the column given as the argument.
40
- *
41
- * ### Examples
42
- *
43
- * ```ts
44
- * const { max } = db.fn
45
- *
46
- * db.selectFrom('toy')
47
- * .select(max('price').as('max_price'))
48
- * .execute()
49
- * ```
50
- */
51
- max<C extends StringReference<DB, TB>>(column: C): RawBuilder<ExtractTypeFromReferenceExpression<DB, TB, C>>;
52
- /**
53
- * Calls the `min` function for the column given as the argument.
54
- *
55
- * ### Examples
56
- *
57
- * ```ts
58
- * const { min } = db.fn
59
- *
60
- * db.selectFrom('toy')
61
- * .select(min('price').as('min_price'))
62
- * .execute()
63
- * ```
64
- *
65
- */
66
- min<C extends StringReference<DB, TB>>(column: C): RawBuilder<ExtractTypeFromReferenceExpression<DB, TB, C>>;
67
37
  /**
68
38
  * Calls the `avg` function for the column given as the argument.
69
39
  *
@@ -85,9 +55,9 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
85
55
  * .execute()
86
56
  * ```
87
57
  */
88
- avg<O extends number | string, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): RawBuilder<O>;
58
+ avg<O extends number | string, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, O>;
89
59
  /**
90
- * Calls the `sum` function for the column given as the argument.
60
+ * Calls the `count` function for the column given as the argument.
91
61
  *
92
62
  * If this is used in a `select` statement the type of the selected expression
93
63
  * will be `number | string | bigint` by default. This is because Kysely can't
@@ -100,19 +70,56 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
100
70
  * the type as the first type argument:
101
71
  *
102
72
  * ```ts
103
- * const { sum } = db.fn
73
+ * const { count } = db.fn
104
74
  *
105
75
  * db.selectFrom('toy')
106
- * .select(sum<number>('price').as('total_price'))
76
+ * .select(count<number>('id').as('num_toys'))
77
+ * .execute()
78
+ * ```
79
+ *
80
+ * You can limit column range:
81
+ *
82
+ * ```ts
83
+ * db.selectFrom('toy')
84
+ * .select(qb => qb.fn.count<number>('id').as('num_toys'))
107
85
  * .execute()
108
86
  * ```
109
87
  */
110
- sum<O extends number | string | bigint, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): RawBuilder<O>;
88
+ count<O extends number | string | bigint, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, O>;
111
89
  /**
112
- * Calls the `count` function for the column given as the argument.
90
+ * Calls the `max` function for the column given as the argument.
91
+ *
92
+ * ### Examples
93
+ *
94
+ * ```ts
95
+ * const { max } = db.fn
96
+ *
97
+ * db.selectFrom('toy')
98
+ * .select(max('price').as('max_price'))
99
+ * .execute()
100
+ * ```
101
+ */
102
+ max<C extends StringReference<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, C>>;
103
+ /**
104
+ * Calls the `min` function for the column given as the argument.
105
+ *
106
+ * ### Examples
107
+ *
108
+ * ```ts
109
+ * const { min } = db.fn
110
+ *
111
+ * db.selectFrom('toy')
112
+ * .select(min('price').as('min_price'))
113
+ * .execute()
114
+ * ```
115
+ *
116
+ */
117
+ min<C extends StringReference<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, C>>;
118
+ /**
119
+ * Calls the `sum` function for the column given as the argument.
113
120
  *
114
121
  * If this is used in a `select` statement the type of the selected expression
115
- * will be `number | string |bigint` by default. This is because Kysely can't
122
+ * will be `number | string | bigint` by default. This is because Kysely can't
116
123
  * know the type the db driver outputs. Sometimes the output can be larger than
117
124
  * the largest javascript number and a string is returned instead. Most drivers
118
125
  * allow you to configure the output type of large numbers and Kysely can't
@@ -122,12 +129,12 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
122
129
  * the type as the first type argument:
123
130
  *
124
131
  * ```ts
125
- * const { count } = db.fn
132
+ * const { sum } = db.fn
126
133
  *
127
134
  * db.selectFrom('toy')
128
- * .select(count<number>('id').as('num_toys'))
135
+ * .select(sum<number>('price').as('total_price'))
129
136
  * .execute()
130
137
  * ```
131
138
  */
132
- count<O extends number | string | bigint, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): RawBuilder<O>;
139
+ sum<O extends number | string | bigint, C extends StringReference<DB, TB> = StringReference<DB, TB>>(column: C): AggregateFunctionBuilder<DB, TB, O>;
133
140
  }