kysely 0.22.0 → 0.23.1

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 (358) hide show
  1. package/CONTRIBUTING.md +70 -0
  2. package/README.md +25 -2
  3. package/dist/cjs/dialect/database-introspector.d.ts +4 -0
  4. package/dist/cjs/dialect/mysql/mysql-driver.js +6 -3
  5. package/dist/cjs/dialect/postgres/postgres-adapter.js +1 -1
  6. package/dist/cjs/dialect/postgres/postgres-driver.js +7 -2
  7. package/dist/cjs/dialect/postgres/postgres-introspector.js +8 -0
  8. package/dist/cjs/dialect/sqlite/sqlite-driver.js +4 -3
  9. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -0
  10. package/dist/cjs/driver/database-connection.d.ts +6 -2
  11. package/dist/cjs/dynamic/dynamic-reference-builder.d.ts +2 -3
  12. package/dist/cjs/dynamic/dynamic-reference-builder.js +1 -1
  13. package/dist/cjs/expression/expression.d.ts +100 -0
  14. package/dist/cjs/expression/expression.js +16 -0
  15. package/dist/cjs/index.d.ts +10 -6
  16. package/dist/cjs/index.js +8 -2
  17. package/dist/cjs/migration/file-migration-provider.js +5 -3
  18. package/dist/cjs/operation-node/aggregate-function-node.d.ts +7 -4
  19. package/dist/cjs/operation-node/aggregate-function-node.js +17 -0
  20. package/dist/cjs/operation-node/alias-node.d.ts +3 -11
  21. package/dist/cjs/operation-node/alter-column-node.d.ts +1 -2
  22. package/dist/cjs/operation-node/alter-table-node.d.ts +5 -7
  23. package/dist/cjs/operation-node/alter-table-node.js +9 -1
  24. package/dist/cjs/operation-node/and-node.d.ts +3 -4
  25. package/dist/cjs/operation-node/binary-operation-node.d.ts +14 -0
  26. package/dist/cjs/operation-node/binary-operation-node.js +20 -0
  27. package/dist/cjs/operation-node/check-constraint-node.d.ts +2 -3
  28. package/dist/cjs/operation-node/column-definition-node.d.ts +6 -5
  29. package/dist/cjs/operation-node/column-definition-node.js +16 -0
  30. package/dist/cjs/operation-node/column-update-node.d.ts +2 -3
  31. package/dist/cjs/operation-node/common-table-expression-node.d.ts +2 -4
  32. package/dist/cjs/operation-node/create-index-node.d.ts +1 -3
  33. package/dist/cjs/operation-node/create-table-node.d.ts +4 -5
  34. package/dist/cjs/operation-node/create-type-node.d.ts +1 -1
  35. package/dist/cjs/operation-node/create-type-node.js +1 -2
  36. package/dist/cjs/operation-node/default-value-node.d.ts +2 -4
  37. package/dist/cjs/operation-node/delete-query-node.d.ts +1 -2
  38. package/dist/cjs/operation-node/drop-type-node.d.ts +1 -1
  39. package/dist/cjs/operation-node/drop-type-node.js +1 -2
  40. package/dist/cjs/operation-node/explain-node.d.ts +2 -4
  41. package/dist/cjs/operation-node/explain-node.js +1 -1
  42. package/dist/cjs/operation-node/from-node.d.ts +3 -4
  43. package/dist/cjs/operation-node/generated-node.d.ts +2 -3
  44. package/dist/cjs/operation-node/group-by-item-node.d.ts +2 -3
  45. package/dist/cjs/operation-node/having-node.d.ts +3 -4
  46. package/dist/cjs/operation-node/having-node.js +4 -4
  47. package/dist/cjs/operation-node/insert-query-node.d.ts +1 -5
  48. package/dist/cjs/operation-node/join-node.d.ts +5 -9
  49. package/dist/cjs/operation-node/join-node.js +6 -6
  50. package/dist/cjs/operation-node/on-conflict-node.d.ts +5 -7
  51. package/dist/cjs/operation-node/on-conflict-node.js +12 -12
  52. package/dist/cjs/operation-node/on-node.d.ts +3 -4
  53. package/dist/cjs/operation-node/on-node.js +4 -4
  54. package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -2
  55. package/dist/cjs/operation-node/operation-node-transformer.js +22 -15
  56. package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -2
  57. package/dist/cjs/operation-node/operation-node-visitor.js +2 -1
  58. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  59. package/dist/cjs/operation-node/operator-node.d.ts +5 -3
  60. package/dist/cjs/operation-node/operator-node.js +3 -5
  61. package/dist/cjs/operation-node/or-node.d.ts +3 -4
  62. package/dist/cjs/operation-node/order-by-item-node.d.ts +3 -5
  63. package/dist/cjs/operation-node/parens-node.d.ts +2 -3
  64. package/dist/cjs/operation-node/partition-by-item-node.d.ts +3 -4
  65. package/dist/cjs/operation-node/query-node.d.ts +2 -3
  66. package/dist/cjs/operation-node/query-node.js +6 -6
  67. package/dist/cjs/operation-node/select-modifier-node.d.ts +2 -3
  68. package/dist/cjs/operation-node/select-modifier-node.js +1 -1
  69. package/dist/cjs/operation-node/select-query-node.d.ts +5 -6
  70. package/dist/cjs/operation-node/select-query-node.js +10 -10
  71. package/dist/cjs/operation-node/selection-node.d.ts +2 -3
  72. package/dist/cjs/operation-node/set-operation-node.d.ts +2 -5
  73. package/dist/cjs/operation-node/simple-reference-expression-node.d.ts +3 -0
  74. package/dist/cjs/operation-node/{operation-node-utils.js → simple-reference-expression-node.js} +0 -0
  75. package/dist/cjs/operation-node/unary-operation-node.d.ts +13 -0
  76. package/dist/cjs/operation-node/unary-operation-node.js +19 -0
  77. package/dist/cjs/operation-node/update-query-node.d.ts +3 -4
  78. package/dist/cjs/operation-node/value-list-node.d.ts +2 -9
  79. package/dist/cjs/operation-node/where-node.d.ts +3 -4
  80. package/dist/cjs/operation-node/where-node.js +4 -4
  81. package/dist/cjs/parser/binary-operation-parser.d.ts +20 -0
  82. package/dist/cjs/parser/binary-operation-parser.js +99 -0
  83. package/dist/cjs/parser/coalesce-parser.d.ts +4 -0
  84. package/dist/cjs/parser/coalesce-parser.js +11 -0
  85. package/dist/cjs/parser/data-type-parser.d.ts +5 -5
  86. package/dist/cjs/parser/default-value-parser.d.ts +4 -5
  87. package/dist/cjs/parser/default-value-parser.js +2 -2
  88. package/dist/cjs/parser/expression-parser.d.ts +10 -0
  89. package/dist/cjs/parser/{complex-expression-parser.js → expression-parser.js} +9 -8
  90. package/dist/cjs/parser/identifier-parser.d.ts +2 -0
  91. package/dist/cjs/parser/identifier-parser.js +23 -0
  92. package/dist/cjs/parser/insert-values-parser.d.ts +1 -1
  93. package/dist/cjs/parser/insert-values-parser.js +2 -2
  94. package/dist/cjs/parser/join-parser.js +2 -2
  95. package/dist/cjs/parser/order-by-parser.d.ts +2 -2
  96. package/dist/cjs/parser/reference-parser.d.ts +14 -14
  97. package/dist/cjs/parser/reference-parser.js +12 -9
  98. package/dist/cjs/parser/select-parser.d.ts +6 -7
  99. package/dist/cjs/parser/select-parser.js +2 -2
  100. package/dist/cjs/parser/set-operation-parser.d.ts +2 -4
  101. package/dist/cjs/parser/table-parser.d.ts +11 -12
  102. package/dist/cjs/parser/table-parser.js +2 -2
  103. package/dist/cjs/parser/unary-operation-parser.d.ts +5 -0
  104. package/dist/cjs/parser/unary-operation-parser.js +17 -0
  105. package/dist/cjs/parser/update-set-parser.d.ts +1 -1
  106. package/dist/cjs/parser/value-parser.d.ts +5 -9
  107. package/dist/cjs/parser/value-parser.js +4 -4
  108. package/dist/cjs/parser/with-parser.d.ts +3 -4
  109. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +1 -1
  110. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +245 -14
  111. package/dist/cjs/query-builder/aggregate-function-builder.js +164 -12
  112. package/dist/cjs/query-builder/delete-query-builder.d.ts +20 -20
  113. package/dist/cjs/query-builder/delete-query-builder.js +19 -16
  114. package/dist/cjs/query-builder/function-module.d.ts +123 -22
  115. package/dist/cjs/query-builder/function-module.js +91 -48
  116. package/dist/cjs/query-builder/having-interface.d.ts +9 -8
  117. package/dist/cjs/query-builder/insert-query-builder.d.ts +7 -6
  118. package/dist/cjs/query-builder/insert-query-builder.js +11 -9
  119. package/dist/cjs/query-builder/insert-result.d.ts +8 -1
  120. package/dist/cjs/query-builder/insert-result.js +12 -1
  121. package/dist/cjs/query-builder/join-builder.d.ts +9 -8
  122. package/dist/cjs/query-builder/join-builder.js +10 -9
  123. package/dist/cjs/query-builder/on-conflict-builder.d.ts +25 -24
  124. package/dist/cjs/query-builder/on-conflict-builder.js +18 -17
  125. package/dist/cjs/query-builder/select-query-builder.d.ts +82 -51
  126. package/dist/cjs/query-builder/select-query-builder.js +39 -37
  127. package/dist/cjs/query-builder/update-query-builder.d.ts +20 -20
  128. package/dist/cjs/query-builder/update-query-builder.js +19 -16
  129. package/dist/cjs/query-builder/where-interface.d.ts +12 -11
  130. package/dist/cjs/query-compiler/compiled-query.d.ts +1 -1
  131. package/dist/cjs/query-compiler/default-query-compiler.d.ts +5 -3
  132. package/dist/cjs/query-compiler/default-query-compiler.js +37 -33
  133. package/dist/cjs/query-executor/query-executor-base.js +16 -1
  134. package/dist/cjs/raw-builder/raw-builder.d.ts +49 -13
  135. package/dist/cjs/raw-builder/raw-builder.js +24 -14
  136. package/dist/cjs/raw-builder/sql.d.ts +4 -4
  137. package/dist/cjs/schema/alter-column-builder.d.ts +28 -0
  138. package/dist/cjs/schema/alter-column-builder.js +55 -0
  139. package/dist/cjs/schema/alter-table-builder.d.ts +39 -341
  140. package/dist/cjs/schema/alter-table-builder.js +63 -278
  141. package/dist/cjs/schema/column-definition-builder.d.ts +43 -155
  142. package/dist/cjs/schema/column-definition-builder.js +189 -0
  143. package/dist/cjs/schema/create-index-builder.d.ts +3 -3
  144. package/dist/cjs/schema/create-index-builder.js +7 -7
  145. package/dist/cjs/schema/create-schema-builder.d.ts +1 -1
  146. package/dist/cjs/schema/create-schema-builder.js +2 -2
  147. package/dist/cjs/schema/create-table-builder.d.ts +39 -6
  148. package/dist/cjs/schema/create-table-builder.js +47 -12
  149. package/dist/cjs/schema/create-type-builder.d.ts +1 -1
  150. package/dist/cjs/schema/create-type-builder.js +2 -2
  151. package/dist/cjs/schema/create-view-builder.d.ts +4 -3
  152. package/dist/cjs/schema/create-view-builder.js +7 -7
  153. package/dist/cjs/schema/drop-index-builder.d.ts +1 -1
  154. package/dist/cjs/schema/drop-index-builder.js +4 -4
  155. package/dist/cjs/schema/drop-schema-builder.d.ts +1 -1
  156. package/dist/cjs/schema/drop-schema-builder.js +3 -3
  157. package/dist/cjs/schema/drop-table-builder.d.ts +1 -1
  158. package/dist/cjs/schema/drop-table-builder.js +3 -3
  159. package/dist/cjs/schema/drop-type-builder.d.ts +1 -1
  160. package/dist/cjs/schema/drop-type-builder.js +2 -2
  161. package/dist/cjs/schema/drop-view-builder.d.ts +1 -1
  162. package/dist/cjs/schema/drop-view-builder.js +4 -4
  163. package/dist/cjs/schema/schema.d.ts +2 -2
  164. package/dist/cjs/schema/schema.js +14 -13
  165. package/dist/cjs/util/compilable.d.ts +2 -2
  166. package/dist/cjs/util/explainable.d.ts +2 -2
  167. package/dist/cjs/util/infer-result.d.ts +46 -0
  168. package/dist/cjs/util/infer-result.js +2 -0
  169. package/dist/cjs/util/log-once.d.ts +5 -0
  170. package/dist/cjs/util/log-once.js +16 -0
  171. package/dist/cjs/util/object-utils.d.ts +1 -0
  172. package/dist/cjs/util/object-utils.js +5 -1
  173. package/dist/cjs/util/type-utils.d.ts +3 -17
  174. package/dist/esm/dialect/database-introspector.d.ts +4 -0
  175. package/dist/esm/dialect/mysql/mysql-driver.js +6 -3
  176. package/dist/esm/dialect/postgres/postgres-adapter.js +1 -1
  177. package/dist/esm/dialect/postgres/postgres-driver.js +7 -2
  178. package/dist/esm/dialect/postgres/postgres-introspector.js +8 -0
  179. package/dist/esm/dialect/sqlite/sqlite-driver.js +4 -3
  180. package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
  181. package/dist/esm/driver/database-connection.d.ts +6 -2
  182. package/dist/esm/dynamic/dynamic-reference-builder.d.ts +2 -3
  183. package/dist/esm/dynamic/dynamic-reference-builder.js +2 -2
  184. package/dist/esm/expression/expression.d.ts +100 -0
  185. package/dist/esm/expression/expression.js +12 -0
  186. package/dist/esm/index.d.ts +10 -6
  187. package/dist/esm/index.js +6 -2
  188. package/dist/esm/migration/file-migration-provider.js +5 -3
  189. package/dist/esm/operation-node/aggregate-function-node.d.ts +7 -4
  190. package/dist/esm/operation-node/aggregate-function-node.js +17 -0
  191. package/dist/esm/operation-node/alias-node.d.ts +3 -11
  192. package/dist/esm/operation-node/alter-column-node.d.ts +1 -2
  193. package/dist/esm/operation-node/alter-table-node.d.ts +5 -7
  194. package/dist/esm/operation-node/alter-table-node.js +9 -1
  195. package/dist/esm/operation-node/and-node.d.ts +3 -4
  196. package/dist/esm/operation-node/binary-operation-node.d.ts +14 -0
  197. package/dist/esm/operation-node/binary-operation-node.js +18 -0
  198. package/dist/esm/operation-node/check-constraint-node.d.ts +2 -3
  199. package/dist/esm/operation-node/column-definition-node.d.ts +6 -5
  200. package/dist/esm/operation-node/column-definition-node.js +16 -0
  201. package/dist/esm/operation-node/column-update-node.d.ts +2 -3
  202. package/dist/esm/operation-node/common-table-expression-node.d.ts +2 -4
  203. package/dist/esm/operation-node/create-index-node.d.ts +1 -3
  204. package/dist/esm/operation-node/create-table-node.d.ts +4 -5
  205. package/dist/esm/operation-node/create-type-node.d.ts +1 -1
  206. package/dist/esm/operation-node/create-type-node.js +1 -2
  207. package/dist/esm/operation-node/default-value-node.d.ts +2 -4
  208. package/dist/esm/operation-node/delete-query-node.d.ts +1 -2
  209. package/dist/esm/operation-node/drop-type-node.d.ts +1 -1
  210. package/dist/esm/operation-node/drop-type-node.js +1 -2
  211. package/dist/esm/operation-node/explain-node.d.ts +2 -4
  212. package/dist/esm/operation-node/explain-node.js +1 -1
  213. package/dist/esm/operation-node/from-node.d.ts +3 -4
  214. package/dist/esm/operation-node/generated-node.d.ts +2 -3
  215. package/dist/esm/operation-node/group-by-item-node.d.ts +2 -3
  216. package/dist/esm/operation-node/having-node.d.ts +3 -4
  217. package/dist/esm/operation-node/having-node.js +4 -4
  218. package/dist/esm/operation-node/insert-query-node.d.ts +1 -5
  219. package/dist/esm/operation-node/join-node.d.ts +5 -9
  220. package/dist/esm/operation-node/join-node.js +6 -6
  221. package/dist/esm/operation-node/on-conflict-node.d.ts +5 -7
  222. package/dist/esm/operation-node/on-conflict-node.js +12 -12
  223. package/dist/esm/operation-node/on-node.d.ts +3 -4
  224. package/dist/esm/operation-node/on-node.js +4 -4
  225. package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -2
  226. package/dist/esm/operation-node/operation-node-transformer.js +22 -15
  227. package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -2
  228. package/dist/esm/operation-node/operation-node-visitor.js +2 -1
  229. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  230. package/dist/esm/operation-node/operator-node.d.ts +5 -3
  231. package/dist/esm/operation-node/operator-node.js +2 -4
  232. package/dist/esm/operation-node/or-node.d.ts +3 -4
  233. package/dist/esm/operation-node/order-by-item-node.d.ts +3 -5
  234. package/dist/esm/operation-node/parens-node.d.ts +2 -3
  235. package/dist/esm/operation-node/partition-by-item-node.d.ts +3 -4
  236. package/dist/esm/operation-node/query-node.d.ts +2 -3
  237. package/dist/esm/operation-node/query-node.js +6 -6
  238. package/dist/esm/operation-node/select-modifier-node.d.ts +2 -3
  239. package/dist/esm/operation-node/select-modifier-node.js +1 -1
  240. package/dist/esm/operation-node/select-query-node.d.ts +5 -6
  241. package/dist/esm/operation-node/select-query-node.js +10 -10
  242. package/dist/esm/operation-node/selection-node.d.ts +2 -3
  243. package/dist/esm/operation-node/set-operation-node.d.ts +2 -5
  244. package/dist/esm/operation-node/simple-reference-expression-node.d.ts +3 -0
  245. package/dist/esm/operation-node/simple-reference-expression-node.js +2 -0
  246. package/dist/esm/operation-node/unary-operation-node.d.ts +13 -0
  247. package/dist/esm/operation-node/unary-operation-node.js +17 -0
  248. package/dist/esm/operation-node/update-query-node.d.ts +3 -4
  249. package/dist/esm/operation-node/value-list-node.d.ts +2 -9
  250. package/dist/esm/operation-node/where-node.d.ts +3 -4
  251. package/dist/esm/operation-node/where-node.js +4 -4
  252. package/dist/esm/parser/binary-operation-parser.d.ts +20 -0
  253. package/dist/esm/parser/binary-operation-parser.js +92 -0
  254. package/dist/esm/parser/coalesce-parser.d.ts +4 -0
  255. package/dist/esm/parser/coalesce-parser.js +8 -0
  256. package/dist/esm/parser/data-type-parser.d.ts +5 -5
  257. package/dist/esm/parser/default-value-parser.d.ts +4 -5
  258. package/dist/esm/parser/default-value-parser.js +2 -2
  259. package/dist/esm/parser/expression-parser.d.ts +10 -0
  260. package/dist/esm/parser/{complex-expression-parser.js → expression-parser.js} +6 -5
  261. package/dist/esm/parser/identifier-parser.d.ts +2 -0
  262. package/dist/esm/parser/identifier-parser.js +20 -0
  263. package/dist/esm/parser/insert-values-parser.d.ts +1 -1
  264. package/dist/esm/parser/insert-values-parser.js +2 -2
  265. package/dist/esm/parser/join-parser.js +2 -2
  266. package/dist/esm/parser/order-by-parser.d.ts +2 -2
  267. package/dist/esm/parser/reference-parser.d.ts +14 -14
  268. package/dist/esm/parser/reference-parser.js +10 -8
  269. package/dist/esm/parser/select-parser.d.ts +6 -7
  270. package/dist/esm/parser/select-parser.js +2 -2
  271. package/dist/esm/parser/set-operation-parser.d.ts +2 -4
  272. package/dist/esm/parser/table-parser.d.ts +11 -12
  273. package/dist/esm/parser/table-parser.js +2 -2
  274. package/dist/esm/parser/unary-operation-parser.d.ts +5 -0
  275. package/dist/esm/parser/unary-operation-parser.js +13 -0
  276. package/dist/esm/parser/update-set-parser.d.ts +1 -1
  277. package/dist/esm/parser/value-parser.d.ts +5 -9
  278. package/dist/esm/parser/value-parser.js +4 -4
  279. package/dist/esm/parser/with-parser.d.ts +3 -4
  280. package/dist/esm/plugin/camel-case/camel-case-plugin.js +2 -2
  281. package/dist/esm/query-builder/aggregate-function-builder.d.ts +245 -14
  282. package/dist/esm/query-builder/aggregate-function-builder.js +164 -12
  283. package/dist/esm/query-builder/delete-query-builder.d.ts +20 -20
  284. package/dist/esm/query-builder/delete-query-builder.js +19 -16
  285. package/dist/esm/query-builder/function-module.d.ts +123 -22
  286. package/dist/esm/query-builder/function-module.js +92 -49
  287. package/dist/esm/query-builder/having-interface.d.ts +9 -8
  288. package/dist/esm/query-builder/insert-query-builder.d.ts +7 -6
  289. package/dist/esm/query-builder/insert-query-builder.js +11 -9
  290. package/dist/esm/query-builder/insert-result.d.ts +8 -1
  291. package/dist/esm/query-builder/insert-result.js +12 -1
  292. package/dist/esm/query-builder/join-builder.d.ts +9 -8
  293. package/dist/esm/query-builder/join-builder.js +10 -9
  294. package/dist/esm/query-builder/on-conflict-builder.d.ts +25 -24
  295. package/dist/esm/query-builder/on-conflict-builder.js +18 -17
  296. package/dist/esm/query-builder/select-query-builder.d.ts +82 -51
  297. package/dist/esm/query-builder/select-query-builder.js +38 -36
  298. package/dist/esm/query-builder/update-query-builder.d.ts +20 -20
  299. package/dist/esm/query-builder/update-query-builder.js +19 -16
  300. package/dist/esm/query-builder/where-interface.d.ts +12 -11
  301. package/dist/esm/query-compiler/compiled-query.d.ts +1 -1
  302. package/dist/esm/query-compiler/default-query-compiler.d.ts +5 -3
  303. package/dist/esm/query-compiler/default-query-compiler.js +38 -34
  304. package/dist/esm/query-executor/query-executor-base.js +16 -1
  305. package/dist/esm/raw-builder/raw-builder.d.ts +49 -13
  306. package/dist/esm/raw-builder/raw-builder.js +23 -14
  307. package/dist/esm/raw-builder/sql.d.ts +4 -4
  308. package/dist/esm/schema/alter-column-builder.d.ts +28 -0
  309. package/dist/esm/schema/alter-column-builder.js +51 -0
  310. package/dist/esm/schema/alter-table-builder.d.ts +39 -341
  311. package/dist/esm/schema/alter-table-builder.js +59 -272
  312. package/dist/esm/schema/column-definition-builder.d.ts +43 -155
  313. package/dist/esm/schema/column-definition-builder.js +189 -0
  314. package/dist/esm/schema/create-index-builder.d.ts +3 -3
  315. package/dist/esm/schema/create-index-builder.js +7 -7
  316. package/dist/esm/schema/create-schema-builder.d.ts +1 -1
  317. package/dist/esm/schema/create-schema-builder.js +2 -2
  318. package/dist/esm/schema/create-table-builder.d.ts +39 -6
  319. package/dist/esm/schema/create-table-builder.js +47 -12
  320. package/dist/esm/schema/create-type-builder.d.ts +1 -1
  321. package/dist/esm/schema/create-type-builder.js +2 -2
  322. package/dist/esm/schema/create-view-builder.d.ts +4 -3
  323. package/dist/esm/schema/create-view-builder.js +7 -7
  324. package/dist/esm/schema/drop-index-builder.d.ts +1 -1
  325. package/dist/esm/schema/drop-index-builder.js +4 -4
  326. package/dist/esm/schema/drop-schema-builder.d.ts +1 -1
  327. package/dist/esm/schema/drop-schema-builder.js +3 -3
  328. package/dist/esm/schema/drop-table-builder.d.ts +1 -1
  329. package/dist/esm/schema/drop-table-builder.js +3 -3
  330. package/dist/esm/schema/drop-type-builder.d.ts +1 -1
  331. package/dist/esm/schema/drop-type-builder.js +2 -2
  332. package/dist/esm/schema/drop-view-builder.d.ts +1 -1
  333. package/dist/esm/schema/drop-view-builder.js +4 -4
  334. package/dist/esm/schema/schema.d.ts +2 -2
  335. package/dist/esm/schema/schema.js +14 -13
  336. package/dist/esm/util/compilable.d.ts +2 -2
  337. package/dist/esm/util/explainable.d.ts +2 -2
  338. package/dist/esm/util/infer-result.d.ts +46 -0
  339. package/dist/esm/util/infer-result.js +2 -0
  340. package/dist/esm/util/log-once.d.ts +5 -0
  341. package/dist/esm/util/log-once.js +13 -0
  342. package/dist/esm/util/object-utils.d.ts +1 -0
  343. package/dist/esm/util/object-utils.js +3 -0
  344. package/dist/esm/util/type-utils.d.ts +3 -17
  345. package/package.json +1 -1
  346. package/dist/cjs/operation-node/filter-node.d.ts +0 -18
  347. package/dist/cjs/operation-node/filter-node.js +0 -20
  348. package/dist/cjs/operation-node/operation-node-utils.d.ts +0 -18
  349. package/dist/cjs/parser/complex-expression-parser.d.ts +0 -12
  350. package/dist/cjs/parser/filter-parser.d.ts +0 -24
  351. package/dist/cjs/parser/filter-parser.js +0 -109
  352. package/dist/esm/operation-node/filter-node.d.ts +0 -18
  353. package/dist/esm/operation-node/filter-node.js +0 -18
  354. package/dist/esm/operation-node/operation-node-utils.d.ts +0 -18
  355. package/dist/esm/operation-node/operation-node-utils.js +0 -2
  356. package/dist/esm/parser/complex-expression-parser.d.ts +0 -12
  357. package/dist/esm/parser/filter-parser.d.ts +0 -24
  358. package/dist/esm/parser/filter-parser.js +0 -100
@@ -1,10 +1,6 @@
1
- import { ValueExpressionNode } from '../operation-node/operation-node-utils.js';
2
- import { ValueNode } from '../operation-node/value-node.js';
3
- import { SelectQueryNode } from '../operation-node/select-query-node.js';
4
- import { RawNode } from '../operation-node/raw-node.js';
5
- import { ComplexExpression } from './complex-expression-parser.js';
6
- import { AggregateFunctionNode } from '../operation-node/aggregate-function-node.js';
7
- export declare type ValueExpression<DB, TB extends keyof DB, V> = V | ComplexExpression<DB, TB, V>;
1
+ import { ExpressionOrFactory } from './expression-parser.js';
2
+ import { OperationNode } from '../operation-node/operation-node.js';
3
+ export declare type ValueExpression<DB, TB extends keyof DB, V> = V | ExpressionOrFactory<DB, TB, V>;
8
4
  export declare type ValueExpressionOrList<DB, TB extends keyof DB, V> = ValueExpression<DB, TB, V> | ReadonlyArray<ValueExpression<DB, TB, V>>;
9
- export declare function parseValueExpressionOrList(arg: ValueExpressionOrList<any, any, unknown>): ValueExpressionNode;
10
- export declare function parseValueExpression(exp: ValueExpression<any, any, unknown>): ValueNode | SelectQueryNode | RawNode | AggregateFunctionNode;
5
+ export declare function parseValueExpressionOrList(arg: ValueExpressionOrList<any, any, unknown>): OperationNode;
6
+ export declare function parseValueExpression(exp: ValueExpression<any, any, unknown>): OperationNode;
@@ -3,7 +3,7 @@ import { PrimitiveValueListNode } from '../operation-node/primitive-value-list-n
3
3
  import { ValueListNode } from '../operation-node/value-list-node.js';
4
4
  import { ValueNode } from '../operation-node/value-node.js';
5
5
  import { isReadonlyArray } from '../util/object-utils.js';
6
- import { parseComplexExpression, isComplexExpression, } from './complex-expression-parser.js';
6
+ import { parseExpression, isExpressionOrFactory, } from './expression-parser.js';
7
7
  export function parseValueExpressionOrList(arg) {
8
8
  if (isReadonlyArray(arg)) {
9
9
  return parseValueExpressionList(arg);
@@ -13,13 +13,13 @@ export function parseValueExpressionOrList(arg) {
13
13
  }
14
14
  }
15
15
  export function parseValueExpression(exp) {
16
- if (isComplexExpression(exp)) {
17
- return parseComplexExpression(exp);
16
+ if (isExpressionOrFactory(exp)) {
17
+ return parseExpression(exp);
18
18
  }
19
19
  return ValueNode.create(exp);
20
20
  }
21
21
  function parseValueExpressionList(arg) {
22
- if (arg.some(isComplexExpression)) {
22
+ if (arg.some(isExpressionOrFactory)) {
23
23
  return ValueListNode.create(arg.map((it) => parseValueExpression(it)));
24
24
  }
25
25
  return PrimitiveValueListNode.create(arg);
@@ -1,21 +1,20 @@
1
- import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
2
1
  import { UpdateQueryBuilder } from '../query-builder/update-query-builder.js';
3
2
  import { DeleteQueryBuilder } from '../query-builder/delete-query-builder.js';
4
3
  import { InsertQueryBuilder } from '../query-builder/insert-query-builder.js';
5
4
  import { CommonTableExpressionNode } from '../operation-node/common-table-expression-node.js';
6
5
  import { QueryCreator } from '../query-creator.js';
7
- import { RawBuilder } from '../raw-builder/raw-builder.js';
6
+ import { Expression } from '../expression/expression.js';
8
7
  export declare type CommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB>) => CommonTableExpressionOutput<DB, CN>;
9
8
  export declare type RecursiveCommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB & Record<ExtractTableFromCommonTableExpressionName<CN>, ExtractRowFromCommonTableExpressionName<CN>>>) => CommonTableExpressionOutput<DB, CN>;
10
9
  export declare type QueryCreatorWithCommonTableExpression<DB, CN extends string, CTE> = QueryCreator<DB & Record<ExtractTableFromCommonTableExpressionName<CN>, ExtractRowFromCommonTableExpression<CTE>>>;
11
- declare type CommonTableExpressionOutput<DB, CN extends string> = SelectQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | InsertQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | UpdateQueryBuilder<DB, any, any, ExtractRowFromCommonTableExpressionName<CN>> | DeleteQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | RawBuilder<ExtractRowFromCommonTableExpressionName<CN>>;
10
+ declare type CommonTableExpressionOutput<DB, CN extends string> = Expression<ExtractRowFromCommonTableExpressionName<CN>> | InsertQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | UpdateQueryBuilder<DB, any, any, ExtractRowFromCommonTableExpressionName<CN>> | DeleteQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>>;
12
11
  /**
13
12
  * Given a common CommonTableExpression CTE extracts the row type from it.
14
13
  *
15
14
  * For example a CTE `(db) => db.selectFrom('person').select(['id', 'first_name'])`
16
15
  * would result in `Pick<Person, 'id' | 'first_name'>`.
17
16
  */
18
- declare type ExtractRowFromCommonTableExpression<CTE> = CTE extends (creator: QueryCreator<any>) => infer Q ? Q extends SelectQueryBuilder<any, any, infer QO> ? QO : Q extends InsertQueryBuilder<any, any, infer QO> ? QO : Q extends UpdateQueryBuilder<any, any, any, infer QO> ? QO : Q extends DeleteQueryBuilder<any, any, infer QO> ? QO : Q extends RawBuilder<infer RO> ? RO : never : never;
17
+ declare type ExtractRowFromCommonTableExpression<CTE> = CTE extends (creator: QueryCreator<any>) => infer Q ? Q extends Expression<infer QO> ? QO : Q extends InsertQueryBuilder<any, any, infer QO> ? QO : Q extends UpdateQueryBuilder<any, any, any, infer QO> ? QO : Q extends DeleteQueryBuilder<any, any, infer QO> ? QO : never : never;
19
18
  /**
20
19
  * Extracts 'person' from a string like 'person(id, first_name)'.
21
20
  */
@@ -1,5 +1,5 @@
1
1
  /// <reference types="./camel-case-plugin.d.ts" />
2
- import { isBuffer, isDate, isObject } from '../../util/object-utils.js';
2
+ import { isArrayBufferOrView, isBuffer, isDate, isObject, } from '../../util/object-utils.js';
3
3
  import { SnakeCaseTransformer } from './camel-case-transformer.js';
4
4
  import { createCamelCaseMapper, createSnakeCaseMapper, } from './camel-case.js';
5
5
  /**
@@ -108,5 +108,5 @@ export class CamelCasePlugin {
108
108
  }
109
109
  }
110
110
  function canMap(obj) {
111
- return isObject(obj) && !isDate(obj) && !isBuffer(obj);
111
+ return (isObject(obj) && !isDate(obj) && !isBuffer(obj) && !isArrayBufferOrView(obj));
112
112
  }
@@ -1,10 +1,31 @@
1
1
  import { AggregateFunctionNode } from '../operation-node/aggregate-function-node.js';
2
- import { OperationNodeSource } from '../operation-node/operation-node-source.js';
3
2
  import { AliasNode } from '../operation-node/alias-node.js';
4
3
  import { OverBuilder } from './over-builder.js';
5
- export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unknown> implements OperationNodeSource {
4
+ import { AliasedExpression, Expression } from '../expression/expression.js';
5
+ import { ReferenceExpression } from '../parser/reference-parser.js';
6
+ import { ComparisonOperatorExpression, OperandValueExpressionOrList, WhereGrouper } from '../parser/binary-operation-parser.js';
7
+ import { ExistsExpression } from '../parser/unary-operation-parser.js';
8
+ export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unknown> implements Expression<O> {
6
9
  #private;
7
10
  constructor(props: AggregateFunctionBuilderProps);
11
+ /** @private */
12
+ /**
13
+ * All expressions need to have this getter for complicated type-related reasons.
14
+ * Simply add this getter for your expression and always return `undefined` from it:
15
+ *
16
+ * ```ts
17
+ * class SomeExpression<T> implements Expression<T> {
18
+ * get expressionType(): T | undefined {
19
+ * return undefined
20
+ * }
21
+ * }
22
+ * ```
23
+ *
24
+ * The getter is needed to make the expression assignable to another expression only
25
+ * if the types `T` are assignable. Without this property (or some other property
26
+ * that references `T`), you could assing `Expression<string>` to `Expression<number>`.
27
+ */
28
+ get expressionType(): O | undefined;
8
29
  /**
9
30
  * Returns an aliased version of the function.
10
31
  *
@@ -32,13 +53,15 @@ export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unkno
32
53
  */
33
54
  as<A extends string>(alias: A): AliasedAggregateFunctionBuilder<DB, TB, O, A>;
34
55
  /**
35
- * Adds a distinct clause inside the function.
56
+ * Adds a `distinct` clause inside the function.
57
+ *
58
+ * ### Examples
36
59
  *
37
60
  * ```ts
38
61
  * const result = await db
39
62
  * .selectFrom('person')
40
- * .select(
41
- * eb => eb.fn.count<number>('first_name').distinct().as('first_name_count')
63
+ * .select((eb) =>
64
+ * eb.fn.count<number>('first_name').distinct().as('first_name_count')
42
65
  * )
43
66
  * .executeTakeFirstOrThrow()
44
67
  * ```
@@ -52,7 +75,197 @@ export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unkno
52
75
  */
53
76
  distinct(): AggregateFunctionBuilder<DB, TB, O>;
54
77
  /**
55
- * Adds an over clause (window functions) after the function.
78
+ * Adds a `filter` clause with a nested `where` clause after the function.
79
+ *
80
+ * Similar to {@link WhereInterface}'s `where` method.
81
+ *
82
+ * Also see {@link orFilterWhere}, {@link filterWhereExists} and {@link filterWhereRef}.
83
+ *
84
+ * ### Examples
85
+ *
86
+ * Count by gender:
87
+ *
88
+ * ```ts
89
+ * const result = await db
90
+ * .selectFrom('person')
91
+ * .select([
92
+ * (eb) =>
93
+ * eb.fn
94
+ * .count<number>('id')
95
+ * .filterWhere('gender', '=', 'female')
96
+ * .as('female_count'),
97
+ * (eb) =>
98
+ * eb.fn
99
+ * .count<number>('id')
100
+ * .filterWhere('gender', '=', 'male')
101
+ * .as('male_count'),
102
+ * (eb) =>
103
+ * eb.fn
104
+ * .count<number>('id')
105
+ * .filterWhere('gender', '=', 'other')
106
+ * .as('other_count'),
107
+ * ])
108
+ * .executeTakeFirstOrThrow()
109
+ * ```
110
+ *
111
+ * The generated SQL (PostgreSQL):
112
+ *
113
+ * ```sql
114
+ * select
115
+ * count("id") filter(where "gender" = $1) as "female_count",
116
+ * count("id") filter(where "gender" = $2) as "male_count",
117
+ * count("id") filter(where "gender" = $3) as "other_count"
118
+ * from "person"
119
+ * ```
120
+ */
121
+ filterWhere<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): AggregateFunctionBuilder<DB, TB, O>;
122
+ filterWhere(grouper: WhereGrouper<DB, TB>): AggregateFunctionBuilder<DB, TB, O>;
123
+ filterWhere(expression: Expression<any>): AggregateFunctionBuilder<DB, TB, O>;
124
+ /**
125
+ * Adds a `filter` clause with a nested `where exists` clause after the function.
126
+ *
127
+ * Similar to {@link WhereInterface}'s `whereExists` method.
128
+ *
129
+ * ### Examples
130
+ *
131
+ * Count pet owners versus general public:
132
+ *
133
+ * ```ts
134
+ * const result = await db
135
+ * .selectFrom('person')
136
+ * .select([
137
+ * (eb) =>
138
+ * eb.fn
139
+ * .count<number>('person.id')
140
+ * .filterWhereExists((qb) =>
141
+ * qb
142
+ * .selectFrom('pet')
143
+ * .select('pet.id')
144
+ * .whereRef('pet.owner_id', '=', 'person.id')
145
+ * )
146
+ * .as('pet_owner_count'),
147
+ * (eb) => eb.fn.count<number>('person.id').as('total_count'),
148
+ * ])
149
+ * .executeTakeFirstOrThrow()
150
+ * ```
151
+ *
152
+ * The generated SQL (PostgreSQL):
153
+ *
154
+ * ```sql
155
+ * select count("person"."id") filter(where exists (
156
+ * select "pet"."id"
157
+ * from "pet"
158
+ * where "pet"."owner_id" = "person"."id"
159
+ * )) as "pet_ower_count",
160
+ * count("person"."id") as "total_count"
161
+ * from "person"
162
+ * ```
163
+ */
164
+ filterWhereExists(arg: ExistsExpression<DB, TB>): AggregateFunctionBuilder<DB, TB, O>;
165
+ /**
166
+ * Just like {@link filterWhereExists} but creates a `not exists` clause inside
167
+ * the `filter` clause.
168
+ */
169
+ filterWhereNotExists(arg: ExistsExpression<DB, TB>): AggregateFunctionBuilder<DB, TB, O>;
170
+ /**
171
+ * Adds a `filter` clause with a nested `where` clause after the function, where
172
+ * both sides of the operator are references to columns.
173
+ *
174
+ * Similar to {@link WhereInterface}'s `whereRef` method.
175
+ *
176
+ * ### Examples
177
+ *
178
+ * Count people with same first and last names versus general public:
179
+ *
180
+ * ```ts
181
+ * const result = await db
182
+ * .selectFrom('person')
183
+ * .select([
184
+ * (eb) =>
185
+ * eb.fn
186
+ * .count<number>('id')
187
+ * .filterWhereRef('first_name', '=', 'last_name')
188
+ * .as('repeat_name_count'),
189
+ * (eb) => eb.fn.count<number>('id').as('total_count'),
190
+ * ])
191
+ * .executeTakeFirstOrThrow()
192
+ * ```
193
+ *
194
+ * The generated SQL (PostgreSQL):
195
+ *
196
+ * ```sql
197
+ * select
198
+ * count("id") filter(where "first_name" = "last_name") as "repeat_name_count",
199
+ * count("id") as "total_count"
200
+ * from "person"
201
+ * ```
202
+ */
203
+ filterWhereRef(lhs: ReferenceExpression<DB, TB>, op: ComparisonOperatorExpression, rhs: ReferenceExpression<DB, TB>): AggregateFunctionBuilder<DB, TB, O>;
204
+ /**
205
+ * Adds a `filter` clause with a nested `or where` clause after the function.
206
+ * Otherwise works just like {@link filterWhere}.
207
+ *
208
+ * Similar to {@link WhereInterface}'s `orWhere` method.
209
+ *
210
+ * ### Examples
211
+ *
212
+ * For some reason you're tasked with counting adults (18+) or people called
213
+ * "Bob" versus general public:
214
+ *
215
+ * ```ts
216
+ * const result = await db
217
+ * .selectFrom('person')
218
+ * .select([
219
+ * (eb) =>
220
+ * eb.fn
221
+ * .count<number>('id')
222
+ * .filterWhere('age', '>=', '18')
223
+ * .orFilterWhere('first_name', '=', 'Bob')
224
+ * .as('adult_or_bob_count'),
225
+ * (eb) => eb.fn.count<number>('id').as('total_count'),
226
+ * ])
227
+ * .executeTakeFirstOrThrow()
228
+ * ```
229
+ *
230
+ * The generated SQL (PostgreSQL):
231
+ *
232
+ * ```sql
233
+ * select
234
+ * count("id") filter(where "age" >= $1 or "first_name" = $2) as "adult_or_bob_count",
235
+ * count("id") as "total_count"
236
+ * from "person"
237
+ * ```
238
+ */
239
+ orFilterWhere<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): AggregateFunctionBuilder<DB, TB, O>;
240
+ orFilterWhere(grouper: WhereGrouper<DB, TB>): AggregateFunctionBuilder<DB, TB, O>;
241
+ orFilterWhere(expression: Expression<any>): AggregateFunctionBuilder<DB, TB, O>;
242
+ /**
243
+ * Just like {@link filterWhereExists} but creates an `or exists` clause inside
244
+ * the `filter` clause.
245
+ *
246
+ * Similar to {@link WhereInterface}'s `orWhereExists` method.
247
+ */
248
+ orFilterWhereExists(arg: ExistsExpression<DB, TB>): AggregateFunctionBuilder<DB, TB, O>;
249
+ /**
250
+ * Just like {@link filterWhereExists} but creates an `or not exists` clause inside
251
+ * the `filter` clause.
252
+ *
253
+ * Similar to {@link WhereInterface}'s `orWhereNotExists` method.
254
+ */
255
+ orFilterWhereNotExists(arg: ExistsExpression<DB, TB>): AggregateFunctionBuilder<DB, TB, O>;
256
+ /**
257
+ * Adds an `or where` clause inside the `filter` clause. Otherwise works just
258
+ * like {@link filterWhereRef}.
259
+ *
260
+ * Also see {@link orFilterWhere} and {@link filterWhere}.
261
+ *
262
+ * Similar to {@link WhereInterface}'s `orWhereRef` method.
263
+ */
264
+ orFilterWhereRef(lhs: ReferenceExpression<DB, TB>, op: ComparisonOperatorExpression, rhs: ReferenceExpression<DB, TB>): AggregateFunctionBuilder<DB, TB, O>;
265
+ /**
266
+ * Adds an `over` clause (window functions) after the function.
267
+ *
268
+ * ### Examples
56
269
  *
57
270
  * ```ts
58
271
  * const result = await db
@@ -92,23 +305,41 @@ export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unkno
92
305
  * ```
93
306
  */
94
307
  over(over?: OverBuilderCallback<DB, TB>): AggregateFunctionBuilder<DB, TB, O>;
308
+ /**
309
+ * Creates the OperationNode that describes how to compile this expression into SQL.
310
+ *
311
+ * If you are creating a custom expression, it's often easiest to use the {@link sql}
312
+ * template tag to build the node:
313
+ *
314
+ * ```ts
315
+ * class SomeExpression<T> implements Expression<T> {
316
+ * toOperationNode(): OperationNode {
317
+ * return sql`some sql here`.toOperationNode()
318
+ * }
319
+ * }
320
+ * ```
321
+ */
95
322
  toOperationNode(): AggregateFunctionNode;
96
323
  }
97
324
  /**
98
325
  * {@link AggregateFunctionBuilder} with an alias. The result of calling {@link AggregateFunctionBuilder.as}.
99
326
  */
100
- export declare class AliasedAggregateFunctionBuilder<DB, TB extends keyof DB, O = unknown, A extends string = never> implements OperationNodeSource {
327
+ export declare class AliasedAggregateFunctionBuilder<DB, TB extends keyof DB, O = unknown, A extends string = never> implements AliasedExpression<O, A> {
101
328
  #private;
102
329
  constructor(aggregateFunctionBuilder: AggregateFunctionBuilder<DB, TB, O>, alias: A);
330
+ /** @private */
103
331
  /**
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.
332
+ * Returns the aliased expression.
333
+ */
334
+ get expression(): Expression<O>;
335
+ /** @private */
336
+ /**
337
+ * Returns the alias.
338
+ */
339
+ get alias(): A;
340
+ /**
341
+ * Creates the OperationNode that describes how to compile this expression into SQL.
110
342
  */
111
- protected get alias(): A;
112
343
  toOperationNode(): AliasNode;
113
344
  }
114
345
  export interface AggregateFunctionBuilderProps {
@@ -5,11 +5,17 @@ import { AliasNode } from '../operation-node/alias-node.js';
5
5
  import { IdentifierNode } from '../operation-node/identifier-node.js';
6
6
  import { preventAwait } from '../util/prevent-await.js';
7
7
  import { createOverBuilder } from '../parser/parse-utils.js';
8
+ import { parseReferentialFilter, parseWhere, } from '../parser/binary-operation-parser.js';
9
+ import { parseExists, parseNotExists, } from '../parser/unary-operation-parser.js';
8
10
  export class AggregateFunctionBuilder {
9
11
  #props;
10
12
  constructor(props) {
11
13
  this.#props = freeze(props);
12
14
  }
15
+ /** @private */
16
+ get expressionType() {
17
+ return undefined;
18
+ }
13
19
  /**
14
20
  * Returns an aliased version of the function.
15
21
  *
@@ -39,13 +45,15 @@ export class AggregateFunctionBuilder {
39
45
  return new AliasedAggregateFunctionBuilder(this, alias);
40
46
  }
41
47
  /**
42
- * Adds a distinct clause inside the function.
48
+ * Adds a `distinct` clause inside the function.
49
+ *
50
+ * ### Examples
43
51
  *
44
52
  * ```ts
45
53
  * const result = await db
46
54
  * .selectFrom('person')
47
- * .select(
48
- * eb => eb.fn.count<number>('first_name').distinct().as('first_name_count')
55
+ * .select((eb) =>
56
+ * eb.fn.count<number>('first_name').distinct().as('first_name_count')
49
57
  * )
50
58
  * .executeTakeFirstOrThrow()
51
59
  * ```
@@ -63,8 +71,155 @@ export class AggregateFunctionBuilder {
63
71
  aggregateFunctionNode: AggregateFunctionNode.cloneWithDistinct(this.#props.aggregateFunctionNode),
64
72
  });
65
73
  }
74
+ filterWhere(...args) {
75
+ return new AggregateFunctionBuilder({
76
+ ...this.#props,
77
+ aggregateFunctionNode: AggregateFunctionNode.cloneWithFilter(this.#props.aggregateFunctionNode, parseWhere(args)),
78
+ });
79
+ }
80
+ /**
81
+ * Adds a `filter` clause with a nested `where exists` clause after the function.
82
+ *
83
+ * Similar to {@link WhereInterface}'s `whereExists` method.
84
+ *
85
+ * ### Examples
86
+ *
87
+ * Count pet owners versus general public:
88
+ *
89
+ * ```ts
90
+ * const result = await db
91
+ * .selectFrom('person')
92
+ * .select([
93
+ * (eb) =>
94
+ * eb.fn
95
+ * .count<number>('person.id')
96
+ * .filterWhereExists((qb) =>
97
+ * qb
98
+ * .selectFrom('pet')
99
+ * .select('pet.id')
100
+ * .whereRef('pet.owner_id', '=', 'person.id')
101
+ * )
102
+ * .as('pet_owner_count'),
103
+ * (eb) => eb.fn.count<number>('person.id').as('total_count'),
104
+ * ])
105
+ * .executeTakeFirstOrThrow()
106
+ * ```
107
+ *
108
+ * The generated SQL (PostgreSQL):
109
+ *
110
+ * ```sql
111
+ * select count("person"."id") filter(where exists (
112
+ * select "pet"."id"
113
+ * from "pet"
114
+ * where "pet"."owner_id" = "person"."id"
115
+ * )) as "pet_ower_count",
116
+ * count("person"."id") as "total_count"
117
+ * from "person"
118
+ * ```
119
+ */
120
+ filterWhereExists(arg) {
121
+ return new AggregateFunctionBuilder({
122
+ ...this.#props,
123
+ aggregateFunctionNode: AggregateFunctionNode.cloneWithFilter(this.#props.aggregateFunctionNode, parseExists(arg)),
124
+ });
125
+ }
126
+ /**
127
+ * Just like {@link filterWhereExists} but creates a `not exists` clause inside
128
+ * the `filter` clause.
129
+ */
130
+ filterWhereNotExists(arg) {
131
+ return new AggregateFunctionBuilder({
132
+ ...this.#props,
133
+ aggregateFunctionNode: AggregateFunctionNode.cloneWithFilter(this.#props.aggregateFunctionNode, parseNotExists(arg)),
134
+ });
135
+ }
136
+ /**
137
+ * Adds a `filter` clause with a nested `where` clause after the function, where
138
+ * both sides of the operator are references to columns.
139
+ *
140
+ * Similar to {@link WhereInterface}'s `whereRef` method.
141
+ *
142
+ * ### Examples
143
+ *
144
+ * Count people with same first and last names versus general public:
145
+ *
146
+ * ```ts
147
+ * const result = await db
148
+ * .selectFrom('person')
149
+ * .select([
150
+ * (eb) =>
151
+ * eb.fn
152
+ * .count<number>('id')
153
+ * .filterWhereRef('first_name', '=', 'last_name')
154
+ * .as('repeat_name_count'),
155
+ * (eb) => eb.fn.count<number>('id').as('total_count'),
156
+ * ])
157
+ * .executeTakeFirstOrThrow()
158
+ * ```
159
+ *
160
+ * The generated SQL (PostgreSQL):
161
+ *
162
+ * ```sql
163
+ * select
164
+ * count("id") filter(where "first_name" = "last_name") as "repeat_name_count",
165
+ * count("id") as "total_count"
166
+ * from "person"
167
+ * ```
168
+ */
169
+ filterWhereRef(lhs, op, rhs) {
170
+ return new AggregateFunctionBuilder({
171
+ ...this.#props,
172
+ aggregateFunctionNode: AggregateFunctionNode.cloneWithFilter(this.#props.aggregateFunctionNode, parseReferentialFilter(lhs, op, rhs)),
173
+ });
174
+ }
175
+ orFilterWhere(...args) {
176
+ return new AggregateFunctionBuilder({
177
+ ...this.#props,
178
+ aggregateFunctionNode: AggregateFunctionNode.cloneWithOrFilter(this.#props.aggregateFunctionNode, parseWhere(args)),
179
+ });
180
+ }
66
181
  /**
67
- * Adds an over clause (window functions) after the function.
182
+ * Just like {@link filterWhereExists} but creates an `or exists` clause inside
183
+ * the `filter` clause.
184
+ *
185
+ * Similar to {@link WhereInterface}'s `orWhereExists` method.
186
+ */
187
+ orFilterWhereExists(arg) {
188
+ return new AggregateFunctionBuilder({
189
+ ...this.#props,
190
+ aggregateFunctionNode: AggregateFunctionNode.cloneWithOrFilter(this.#props.aggregateFunctionNode, parseExists(arg)),
191
+ });
192
+ }
193
+ /**
194
+ * Just like {@link filterWhereExists} but creates an `or not exists` clause inside
195
+ * the `filter` clause.
196
+ *
197
+ * Similar to {@link WhereInterface}'s `orWhereNotExists` method.
198
+ */
199
+ orFilterWhereNotExists(arg) {
200
+ return new AggregateFunctionBuilder({
201
+ ...this.#props,
202
+ aggregateFunctionNode: AggregateFunctionNode.cloneWithOrFilter(this.#props.aggregateFunctionNode, parseNotExists(arg)),
203
+ });
204
+ }
205
+ /**
206
+ * Adds an `or where` clause inside the `filter` clause. Otherwise works just
207
+ * like {@link filterWhereRef}.
208
+ *
209
+ * Also see {@link orFilterWhere} and {@link filterWhere}.
210
+ *
211
+ * Similar to {@link WhereInterface}'s `orWhereRef` method.
212
+ */
213
+ orFilterWhereRef(lhs, op, rhs) {
214
+ return new AggregateFunctionBuilder({
215
+ ...this.#props,
216
+ aggregateFunctionNode: AggregateFunctionNode.cloneWithOrFilter(this.#props.aggregateFunctionNode, parseReferentialFilter(lhs, op, rhs)),
217
+ });
218
+ }
219
+ /**
220
+ * Adds an `over` clause (window functions) after the function.
221
+ *
222
+ * ### Examples
68
223
  *
69
224
  * ```ts
70
225
  * const result = await db
@@ -125,14 +280,11 @@ export class AliasedAggregateFunctionBuilder {
125
280
  this.#aggregateFunctionBuilder = aggregateFunctionBuilder;
126
281
  this.#alias = alias;
127
282
  }
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
- */
283
+ /** @private */
284
+ get expression() {
285
+ return this.#aggregateFunctionBuilder;
286
+ }
287
+ /** @private */
136
288
  get alias() {
137
289
  return this.#alias;
138
290
  }