@quillsql/react 2.12.29 → 2.12.30

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 (483) hide show
  1. package/dist/cjs/Chart.d.ts +24 -10
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +143 -183
  4. package/dist/cjs/ChartBuilder.d.ts +18 -12
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +125 -98
  7. package/dist/cjs/ChartEditor.d.ts +13 -1
  8. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  9. package/dist/cjs/ChartEditor.js +62 -121
  10. package/dist/cjs/Context.d.ts.map +1 -1
  11. package/dist/cjs/Context.js +42 -2
  12. package/dist/cjs/Dashboard.d.ts +16 -7
  13. package/dist/cjs/Dashboard.d.ts.map +1 -1
  14. package/dist/cjs/Dashboard.js +17 -22
  15. package/dist/cjs/DateRangePicker/Calendar.d.ts.map +1 -1
  16. package/dist/cjs/DateRangePicker/Calendar.js +3 -6
  17. package/dist/cjs/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  18. package/dist/cjs/DateRangePicker/DateRangePicker.js +2 -3
  19. package/dist/cjs/DateRangePicker/DateRangePickerButton.d.ts +1 -2
  20. package/dist/cjs/DateRangePicker/DateRangePickerButton.d.ts.map +1 -1
  21. package/dist/cjs/DateRangePicker/DateRangePickerButton.js +2 -4
  22. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  23. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  24. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -4
  25. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +1 -1
  26. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  27. package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +1 -15
  28. package/dist/cjs/ReportBuilder.d.ts +17 -5
  29. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  30. package/dist/cjs/ReportBuilder.js +510 -487
  31. package/dist/cjs/SQLEditor.d.ts +2 -9
  32. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  33. package/dist/cjs/SQLEditor.js +69 -86
  34. package/dist/cjs/Table.d.ts +19 -3
  35. package/dist/cjs/Table.d.ts.map +1 -1
  36. package/dist/cjs/Table.js +105 -87
  37. package/dist/cjs/TableChart.d.ts.map +1 -1
  38. package/dist/cjs/TableChart.js +0 -1
  39. package/dist/cjs/assets/ArrowDownHeadIcon.d.ts.map +1 -1
  40. package/dist/cjs/assets/ArrowDownIcon.d.ts.map +1 -1
  41. package/dist/cjs/assets/ArrowDownRightIcon.d.ts.map +1 -1
  42. package/dist/cjs/assets/ArrowLeftHeadIcon.d.ts.map +1 -1
  43. package/dist/cjs/assets/ArrowRightHeadIcon.d.ts.map +1 -1
  44. package/dist/cjs/assets/ArrowRightIcon.d.ts.map +1 -1
  45. package/dist/cjs/assets/ArrowUpHeadIcon.d.ts.map +1 -1
  46. package/dist/cjs/assets/ArrowUpIcon.d.ts.map +1 -1
  47. package/dist/cjs/assets/ArrowUpRightIcon.d.ts.map +1 -1
  48. package/dist/cjs/assets/CalendarIcon.d.ts.map +1 -1
  49. package/dist/cjs/assets/DoubleArrowLeftHeadIcon.d.ts.map +1 -1
  50. package/dist/cjs/assets/DoubleArrowRightHeadIcon.d.ts.map +1 -1
  51. package/dist/cjs/assets/ExclamationFilledIcon.d.ts.map +1 -1
  52. package/dist/cjs/assets/LoadingSpinner.d.ts.map +1 -1
  53. package/dist/cjs/assets/SearchIcon.d.ts.map +1 -1
  54. package/dist/cjs/assets/XCircleIcon.d.ts.map +1 -1
  55. package/dist/cjs/components/Banner/index.d.ts +1 -1
  56. package/dist/cjs/components/Banner/index.d.ts.map +1 -1
  57. package/dist/cjs/components/Banner/index.js +1 -1
  58. package/dist/cjs/components/BigModal/BigModal.d.ts.map +1 -1
  59. package/dist/cjs/components/BigModal/BigModal.js +6 -12
  60. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
  61. package/dist/cjs/components/Chart/BarList.js +21 -14
  62. package/dist/cjs/components/Chart/ChartError.d.ts +8 -1
  63. package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
  64. package/dist/cjs/components/Chart/ChartError.js +40 -5
  65. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  66. package/dist/cjs/components/Chart/ChartTooltip.js +8 -2
  67. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  68. package/dist/cjs/components/Chart/LineChart.js +2 -2
  69. package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -1
  70. package/dist/cjs/components/Chart/PieChart.js +1 -3
  71. package/dist/cjs/components/Dashboard/ChartComponent.d.ts +1 -1
  72. package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
  73. package/dist/cjs/components/Dashboard/ChartComponent.js +1 -1
  74. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +5 -1
  75. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  76. package/dist/cjs/components/Dashboard/DashboardFilter.js +10 -5
  77. package/dist/cjs/components/Dashboard/DataLoader.d.ts +2 -6
  78. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  79. package/dist/cjs/components/Dashboard/DataLoader.js +88 -181
  80. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  81. package/dist/cjs/components/Dashboard/MetricComponent.js +1 -1
  82. package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -4
  83. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  84. package/dist/cjs/components/Dashboard/TableComponent.js +3 -3
  85. package/dist/cjs/components/Dropdown/Dropdown.d.ts.map +1 -1
  86. package/dist/cjs/components/Dropdown/Dropdown.js +1 -3
  87. package/dist/cjs/components/Dropdown/DropdownItem.d.ts.map +1 -1
  88. package/dist/cjs/components/Dropdown/DropdownItem.js +3 -8
  89. package/dist/cjs/components/Dropdown/index.d.ts +2 -2
  90. package/dist/cjs/components/Modal/Modal.d.ts.map +1 -1
  91. package/dist/cjs/components/Modal/Modal.js +2 -3
  92. package/dist/cjs/components/Modal/index.d.ts +1 -1
  93. package/dist/cjs/components/QuillMultiSelect.d.ts.map +1 -1
  94. package/dist/cjs/components/QuillMultiSelect.js +18 -3
  95. package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  96. package/dist/cjs/components/QuillMultiSelectWithCombo.js +2 -2
  97. package/dist/cjs/components/QuillSelect.js +1 -1
  98. package/dist/cjs/components/QuillSelectWithCombo.js +2 -2
  99. package/dist/cjs/components/QuillTable.d.ts +1 -4
  100. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  101. package/dist/cjs/components/QuillTable.js +5 -11
  102. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts +3 -1
  103. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  104. package/dist/cjs/components/ReportBuilder/AddColumnModal.js +5 -8
  105. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  106. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -3
  107. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  108. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +12 -1
  109. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +22 -0
  110. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -0
  111. package/dist/cjs/components/ReportBuilder/FilterModal.js +555 -0
  112. package/dist/cjs/components/ReportBuilder/ast.d.ts +2 -1
  113. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  114. package/dist/cjs/components/ReportBuilder/ast.js +33 -6
  115. package/dist/cjs/components/ReportBuilder/constants.d.ts +18 -3
  116. package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
  117. package/dist/cjs/components/ReportBuilder/constants.js +24 -3
  118. package/dist/cjs/components/ReportBuilder/convert.d.ts +12 -15
  119. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  120. package/dist/cjs/components/ReportBuilder/convert.js +326 -494
  121. package/dist/cjs/components/ReportBuilder/operators.d.ts +24 -4
  122. package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
  123. package/dist/cjs/components/ReportBuilder/operators.js +32 -4
  124. package/dist/cjs/components/ReportBuilder/ui.d.ts +20 -0
  125. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  126. package/dist/cjs/components/ReportBuilder/ui.js +30 -4
  127. package/dist/cjs/components/ReportBuilder/util.d.ts +3 -11
  128. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  129. package/dist/cjs/components/ReportBuilder/util.js +15 -18
  130. package/dist/cjs/components/UiComponents.d.ts +10 -7
  131. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  132. package/dist/cjs/components/UiComponents.js +9 -8
  133. package/dist/cjs/components/selectUtils.d.ts +0 -1
  134. package/dist/cjs/components/selectUtils.d.ts.map +1 -1
  135. package/dist/cjs/components/selectUtils.js +1 -22
  136. package/dist/cjs/hooks/index.d.ts +4 -4
  137. package/dist/cjs/hooks/useAstToFilterTree.d.ts +11 -0
  138. package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -0
  139. package/dist/cjs/hooks/useAstToFilterTree.js +26 -0
  140. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  141. package/dist/cjs/hooks/useDashboard.js +5 -1
  142. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  143. package/dist/cjs/hooks/useExport.js +3 -1
  144. package/dist/cjs/hooks/useOnClickOutside.js +4 -4
  145. package/dist/cjs/hooks/useOnWindowResize.d.ts.map +1 -1
  146. package/dist/cjs/hooks/useOnWindowResize.js +2 -2
  147. package/dist/cjs/hooks/useQuill.d.ts +10 -27
  148. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  149. package/dist/cjs/hooks/useQuill.js +114 -82
  150. package/dist/cjs/hooks/useSelectOnKeyDown.d.ts.map +1 -1
  151. package/dist/cjs/hooks/useSelectOnKeyDown.js +4 -4
  152. package/dist/cjs/hooks/useTheme.js +1 -1
  153. package/dist/cjs/index.d.ts +1 -0
  154. package/dist/cjs/index.d.ts.map +1 -1
  155. package/dist/cjs/index.js +3 -1
  156. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  157. package/dist/cjs/internals/ReportBuilder/PivotForm.js +8 -1
  158. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +2 -2
  159. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  160. package/dist/cjs/internals/ReportBuilder/PivotList.js +2 -2
  161. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +1 -1
  162. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  163. package/dist/cjs/internals/ReportBuilder/PivotModal.js +8 -21
  164. package/dist/cjs/lib/utils.js +2 -2
  165. package/dist/cjs/models/Filter.d.ts +104 -4
  166. package/dist/cjs/models/Filter.d.ts.map +1 -1
  167. package/dist/cjs/models/Filter.js +91 -0
  168. package/dist/cjs/models/Pagination.d.ts +10 -0
  169. package/dist/cjs/models/Pagination.d.ts.map +1 -0
  170. package/dist/cjs/models/Pagination.js +2 -0
  171. package/dist/cjs/models/Report.d.ts +116 -0
  172. package/dist/cjs/models/Report.d.ts.map +1 -0
  173. package/dist/cjs/models/Report.js +2 -0
  174. package/dist/cjs/utils/aggregate.js +1 -1
  175. package/dist/cjs/utils/astFilterProcessing.d.ts +36 -0
  176. package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -0
  177. package/dist/cjs/utils/astFilterProcessing.js +8056 -0
  178. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  179. package/dist/cjs/utils/astProcessing.js +4 -3
  180. package/dist/cjs/utils/axisFormatter.js +0 -71
  181. package/dist/cjs/utils/color.js +9 -87
  182. package/dist/cjs/utils/csv.d.ts.map +1 -1
  183. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  184. package/dist/cjs/utils/dashboard.js +3 -3
  185. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  186. package/dist/cjs/utils/dataFetcher.js +63 -1
  187. package/dist/cjs/utils/dataProcessing.d.ts +8 -0
  188. package/dist/cjs/utils/dataProcessing.d.ts.map +1 -0
  189. package/dist/cjs/utils/dataProcessing.js +127 -0
  190. package/dist/cjs/utils/dates.d.ts +1 -1
  191. package/dist/cjs/utils/error.d.ts +5 -0
  192. package/dist/cjs/utils/error.d.ts.map +1 -0
  193. package/dist/cjs/utils/error.js +12 -0
  194. package/dist/cjs/utils/filterConstants.d.ts +34 -0
  195. package/dist/cjs/utils/filterConstants.d.ts.map +1 -0
  196. package/dist/cjs/utils/filterConstants.js +36 -0
  197. package/dist/cjs/utils/filterProcessing.js +4 -4
  198. package/dist/cjs/utils/logging.d.ts.map +1 -1
  199. package/dist/cjs/utils/logging.js +1 -0
  200. package/dist/cjs/utils/merge.js +0 -21
  201. package/dist/cjs/utils/{monacoAutocomplete.d.ts → monacoConfig.d.ts} +3 -2
  202. package/dist/cjs/utils/monacoConfig.d.ts.map +1 -0
  203. package/dist/cjs/utils/monacoConfig.js +324 -0
  204. package/dist/cjs/utils/paginationProcessing.d.ts +5 -0
  205. package/dist/cjs/utils/paginationProcessing.d.ts.map +1 -0
  206. package/dist/cjs/utils/paginationProcessing.js +30 -0
  207. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  208. package/dist/cjs/utils/pivotConstructor.js +9 -0
  209. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  210. package/dist/cjs/utils/pivotProcessing.js +12 -6
  211. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  212. package/dist/cjs/utils/queryConstructor.js +4 -3
  213. package/dist/cjs/utils/report.d.ts +7 -0
  214. package/dist/cjs/utils/report.d.ts.map +1 -0
  215. package/dist/cjs/utils/report.js +93 -0
  216. package/dist/cjs/utils/schema.d.ts.map +1 -1
  217. package/dist/cjs/utils/schema.js +35 -6
  218. package/dist/cjs/utils/styles.d.ts +1 -1
  219. package/dist/cjs/utils/styles.d.ts.map +1 -1
  220. package/dist/cjs/utils/tableProcessing.d.ts +22 -8
  221. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  222. package/dist/cjs/utils/tableProcessing.js +116 -35
  223. package/dist/cjs/utils/textProcessing.js +3 -3
  224. package/dist/cjs/utils/validation.d.ts +9 -0
  225. package/dist/cjs/utils/validation.d.ts.map +1 -0
  226. package/dist/cjs/utils/validation.js +24 -0
  227. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  228. package/dist/cjs/utils/valueFormatter.js +8 -4
  229. package/dist/esm/Chart.d.ts +24 -10
  230. package/dist/esm/Chart.d.ts.map +1 -1
  231. package/dist/esm/Chart.js +146 -186
  232. package/dist/esm/ChartBuilder.d.ts +18 -12
  233. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  234. package/dist/esm/ChartBuilder.js +126 -99
  235. package/dist/esm/ChartEditor.d.ts +13 -1
  236. package/dist/esm/ChartEditor.d.ts.map +1 -1
  237. package/dist/esm/ChartEditor.js +63 -122
  238. package/dist/esm/Context.d.ts.map +1 -1
  239. package/dist/esm/Context.js +42 -2
  240. package/dist/esm/Dashboard.d.ts +16 -7
  241. package/dist/esm/Dashboard.d.ts.map +1 -1
  242. package/dist/esm/Dashboard.js +17 -22
  243. package/dist/esm/DateRangePicker/Calendar.d.ts.map +1 -1
  244. package/dist/esm/DateRangePicker/Calendar.js +5 -8
  245. package/dist/esm/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  246. package/dist/esm/DateRangePicker/DateRangePicker.js +2 -3
  247. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts +1 -2
  248. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts.map +1 -1
  249. package/dist/esm/DateRangePicker/DateRangePickerButton.js +2 -4
  250. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  251. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  252. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -4
  253. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +1 -1
  254. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  255. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +1 -15
  256. package/dist/esm/ReportBuilder.d.ts +17 -5
  257. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  258. package/dist/esm/ReportBuilder.js +516 -493
  259. package/dist/esm/SQLEditor.d.ts +2 -9
  260. package/dist/esm/SQLEditor.d.ts.map +1 -1
  261. package/dist/esm/SQLEditor.js +68 -85
  262. package/dist/esm/Table.d.ts +19 -3
  263. package/dist/esm/Table.d.ts.map +1 -1
  264. package/dist/esm/Table.js +107 -89
  265. package/dist/esm/TableChart.d.ts.map +1 -1
  266. package/dist/esm/TableChart.js +0 -1
  267. package/dist/esm/assets/ArrowDownHeadIcon.d.ts.map +1 -1
  268. package/dist/esm/assets/ArrowDownIcon.d.ts.map +1 -1
  269. package/dist/esm/assets/ArrowDownRightIcon.d.ts.map +1 -1
  270. package/dist/esm/assets/ArrowLeftHeadIcon.d.ts.map +1 -1
  271. package/dist/esm/assets/ArrowRightHeadIcon.d.ts.map +1 -1
  272. package/dist/esm/assets/ArrowRightIcon.d.ts.map +1 -1
  273. package/dist/esm/assets/ArrowUpHeadIcon.d.ts.map +1 -1
  274. package/dist/esm/assets/ArrowUpIcon.d.ts.map +1 -1
  275. package/dist/esm/assets/ArrowUpRightIcon.d.ts.map +1 -1
  276. package/dist/esm/assets/CalendarIcon.d.ts.map +1 -1
  277. package/dist/esm/assets/DoubleArrowLeftHeadIcon.d.ts.map +1 -1
  278. package/dist/esm/assets/DoubleArrowRightHeadIcon.d.ts.map +1 -1
  279. package/dist/esm/assets/ExclamationFilledIcon.d.ts.map +1 -1
  280. package/dist/esm/assets/LoadingSpinner.d.ts.map +1 -1
  281. package/dist/esm/assets/SearchIcon.d.ts.map +1 -1
  282. package/dist/esm/assets/XCircleIcon.d.ts.map +1 -1
  283. package/dist/esm/components/Banner/index.d.ts +1 -1
  284. package/dist/esm/components/Banner/index.d.ts.map +1 -1
  285. package/dist/esm/components/Banner/index.js +1 -1
  286. package/dist/esm/components/BigModal/BigModal.d.ts.map +1 -1
  287. package/dist/esm/components/BigModal/BigModal.js +7 -13
  288. package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
  289. package/dist/esm/components/Chart/BarList.js +21 -14
  290. package/dist/esm/components/Chart/ChartError.d.ts +8 -1
  291. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
  292. package/dist/esm/components/Chart/ChartError.js +39 -6
  293. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  294. package/dist/esm/components/Chart/ChartTooltip.js +8 -2
  295. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  296. package/dist/esm/components/Chart/LineChart.js +2 -2
  297. package/dist/esm/components/Chart/PieChart.d.ts.map +1 -1
  298. package/dist/esm/components/Chart/PieChart.js +1 -3
  299. package/dist/esm/components/Dashboard/ChartComponent.d.ts +1 -1
  300. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
  301. package/dist/esm/components/Dashboard/ChartComponent.js +1 -1
  302. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +5 -1
  303. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  304. package/dist/esm/components/Dashboard/DashboardFilter.js +10 -5
  305. package/dist/esm/components/Dashboard/DataLoader.d.ts +2 -6
  306. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  307. package/dist/esm/components/Dashboard/DataLoader.js +88 -181
  308. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  309. package/dist/esm/components/Dashboard/MetricComponent.js +1 -1
  310. package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -4
  311. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  312. package/dist/esm/components/Dashboard/TableComponent.js +3 -3
  313. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -1
  314. package/dist/esm/components/Dropdown/Dropdown.js +2 -4
  315. package/dist/esm/components/Dropdown/DropdownItem.d.ts.map +1 -1
  316. package/dist/esm/components/Dropdown/DropdownItem.js +4 -9
  317. package/dist/esm/components/Dropdown/index.d.ts +2 -2
  318. package/dist/esm/components/Dropdown/index.js +2 -2
  319. package/dist/esm/components/Modal/Modal.d.ts.map +1 -1
  320. package/dist/esm/components/Modal/Modal.js +2 -3
  321. package/dist/esm/components/Modal/index.d.ts +1 -1
  322. package/dist/esm/components/Modal/index.js +1 -1
  323. package/dist/esm/components/QuillMultiSelect.d.ts.map +1 -1
  324. package/dist/esm/components/QuillMultiSelect.js +18 -3
  325. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  326. package/dist/esm/components/QuillMultiSelectWithCombo.js +2 -2
  327. package/dist/esm/components/QuillSelect.js +1 -1
  328. package/dist/esm/components/QuillSelectWithCombo.js +2 -2
  329. package/dist/esm/components/QuillTable.d.ts +1 -4
  330. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  331. package/dist/esm/components/QuillTable.js +5 -11
  332. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +3 -1
  333. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  334. package/dist/esm/components/ReportBuilder/AddColumnModal.js +8 -11
  335. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  336. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +2 -4
  337. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  338. package/dist/esm/components/ReportBuilder/AddSortPopover.js +12 -1
  339. package/dist/esm/components/ReportBuilder/FilterModal.d.ts +22 -0
  340. package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -0
  341. package/dist/esm/components/ReportBuilder/FilterModal.js +552 -0
  342. package/dist/esm/components/ReportBuilder/ast.d.ts +2 -1
  343. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  344. package/dist/esm/components/ReportBuilder/ast.js +31 -5
  345. package/dist/esm/components/ReportBuilder/constants.d.ts +18 -3
  346. package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
  347. package/dist/esm/components/ReportBuilder/constants.js +24 -3
  348. package/dist/esm/components/ReportBuilder/convert.d.ts +12 -15
  349. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  350. package/dist/esm/components/ReportBuilder/convert.js +324 -493
  351. package/dist/esm/components/ReportBuilder/convert.uspec.d.ts +2 -0
  352. package/dist/esm/components/ReportBuilder/convert.uspec.d.ts.map +1 -0
  353. package/dist/esm/components/ReportBuilder/convert.uspec.js +1152 -0
  354. package/dist/esm/components/ReportBuilder/operators.d.ts +24 -4
  355. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
  356. package/dist/esm/components/ReportBuilder/operators.js +32 -4
  357. package/dist/esm/components/ReportBuilder/ui.d.ts +20 -0
  358. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  359. package/dist/esm/components/ReportBuilder/ui.js +28 -3
  360. package/dist/esm/components/ReportBuilder/util.d.ts +3 -11
  361. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  362. package/dist/esm/components/ReportBuilder/util.js +16 -19
  363. package/dist/esm/components/UiComponents.d.ts +10 -7
  364. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  365. package/dist/esm/components/UiComponents.js +9 -8
  366. package/dist/esm/components/selectUtils.d.ts +0 -1
  367. package/dist/esm/components/selectUtils.d.ts.map +1 -1
  368. package/dist/esm/components/selectUtils.js +0 -20
  369. package/dist/esm/hooks/index.d.ts +4 -4
  370. package/dist/esm/hooks/index.js +4 -4
  371. package/dist/esm/hooks/useAstToFilterTree.d.ts +11 -0
  372. package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -0
  373. package/dist/esm/hooks/useAstToFilterTree.js +24 -0
  374. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  375. package/dist/esm/hooks/useDashboard.js +5 -1
  376. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  377. package/dist/esm/hooks/useExport.js +4 -2
  378. package/dist/esm/hooks/useOnClickOutside.js +5 -5
  379. package/dist/esm/hooks/useOnWindowResize.d.ts.map +1 -1
  380. package/dist/esm/hooks/useOnWindowResize.js +3 -3
  381. package/dist/esm/hooks/useQuill.d.ts +10 -27
  382. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  383. package/dist/esm/hooks/useQuill.js +114 -82
  384. package/dist/esm/hooks/useSelectOnKeyDown.d.ts.map +1 -1
  385. package/dist/esm/hooks/useSelectOnKeyDown.js +5 -5
  386. package/dist/esm/hooks/useTheme.js +1 -1
  387. package/dist/esm/index.d.ts +1 -0
  388. package/dist/esm/index.d.ts.map +1 -1
  389. package/dist/esm/index.js +1 -0
  390. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  391. package/dist/esm/internals/ReportBuilder/PivotForm.js +9 -2
  392. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +2 -2
  393. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  394. package/dist/esm/internals/ReportBuilder/PivotList.js +3 -3
  395. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +1 -1
  396. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  397. package/dist/esm/internals/ReportBuilder/PivotModal.js +11 -24
  398. package/dist/esm/lib/utils.js +2 -2
  399. package/dist/esm/models/Filter.d.ts +104 -4
  400. package/dist/esm/models/Filter.d.ts.map +1 -1
  401. package/dist/esm/models/Filter.js +90 -1
  402. package/dist/esm/models/Pagination.d.ts +10 -0
  403. package/dist/esm/models/Pagination.d.ts.map +1 -0
  404. package/dist/esm/models/Pagination.js +1 -0
  405. package/dist/esm/models/Report.d.ts +116 -0
  406. package/dist/esm/models/Report.d.ts.map +1 -0
  407. package/dist/esm/models/Report.js +1 -0
  408. package/dist/esm/utils/aggregate.js +1 -1
  409. package/dist/esm/utils/astFilterProcessing.d.ts +36 -0
  410. package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -0
  411. package/dist/esm/utils/astFilterProcessing.js +8049 -0
  412. package/dist/esm/utils/astFilterProcessing.uspec.d.ts +2 -0
  413. package/dist/esm/utils/astFilterProcessing.uspec.d.ts.map +1 -0
  414. package/dist/esm/utils/astFilterProcessing.uspec.js +2729 -0
  415. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  416. package/dist/esm/utils/astProcessing.js +4 -3
  417. package/dist/esm/utils/axisFormatter.js +0 -71
  418. package/dist/esm/utils/color.js +9 -87
  419. package/dist/esm/utils/csv.d.ts.map +1 -1
  420. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  421. package/dist/esm/utils/dashboard.js +3 -3
  422. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  423. package/dist/esm/utils/dataFetcher.js +63 -1
  424. package/dist/esm/utils/dataProcessing.d.ts +8 -0
  425. package/dist/esm/utils/dataProcessing.d.ts.map +1 -0
  426. package/dist/esm/utils/dataProcessing.js +122 -0
  427. package/dist/esm/utils/dataProcessing.uspec.d.ts +2 -0
  428. package/dist/esm/utils/dataProcessing.uspec.d.ts.map +1 -0
  429. package/dist/esm/utils/dataProcessing.uspec.js +204 -0
  430. package/dist/esm/utils/dates.d.ts +1 -1
  431. package/dist/esm/utils/error.d.ts +5 -0
  432. package/dist/esm/utils/error.d.ts.map +1 -0
  433. package/dist/esm/utils/error.js +8 -0
  434. package/dist/esm/utils/filterConstants.d.ts +34 -0
  435. package/dist/esm/utils/filterConstants.d.ts.map +1 -0
  436. package/dist/esm/utils/filterConstants.js +33 -0
  437. package/dist/esm/utils/filterProcessing.js +4 -4
  438. package/dist/esm/utils/logging.d.ts.map +1 -1
  439. package/dist/esm/utils/logging.js +1 -0
  440. package/dist/esm/utils/merge.js +0 -21
  441. package/dist/esm/utils/{monacoAutocomplete.d.ts → monacoConfig.d.ts} +3 -2
  442. package/dist/esm/utils/monacoConfig.d.ts.map +1 -0
  443. package/dist/esm/utils/monacoConfig.js +319 -0
  444. package/dist/esm/utils/paginationProcessing.d.ts +5 -0
  445. package/dist/esm/utils/paginationProcessing.d.ts.map +1 -0
  446. package/dist/esm/utils/paginationProcessing.js +25 -0
  447. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  448. package/dist/esm/utils/pivotConstructor.js +9 -0
  449. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  450. package/dist/esm/utils/pivotProcessing.js +12 -6
  451. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  452. package/dist/esm/utils/queryConstructor.js +4 -3
  453. package/dist/esm/utils/queryConstructor.uspec.js +21 -21
  454. package/dist/esm/utils/report.d.ts +7 -0
  455. package/dist/esm/utils/report.d.ts.map +1 -0
  456. package/dist/esm/utils/report.ispec.d.ts +2 -0
  457. package/dist/esm/utils/report.ispec.d.ts.map +1 -0
  458. package/dist/esm/utils/report.ispec.js +46 -0
  459. package/dist/esm/utils/report.js +88 -0
  460. package/dist/esm/utils/schema.d.ts.map +1 -1
  461. package/dist/esm/utils/schema.js +35 -6
  462. package/dist/esm/utils/styles.d.ts +1 -1
  463. package/dist/esm/utils/styles.d.ts.map +1 -1
  464. package/dist/esm/utils/tableProcessing.d.ts +22 -8
  465. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  466. package/dist/esm/utils/tableProcessing.ispec.d.ts +2 -0
  467. package/dist/esm/utils/tableProcessing.ispec.d.ts.map +1 -0
  468. package/dist/esm/utils/tableProcessing.ispec.js +61 -0
  469. package/dist/esm/utils/tableProcessing.js +112 -33
  470. package/dist/esm/utils/textProcessing.js +3 -3
  471. package/dist/esm/utils/validation.d.ts +9 -0
  472. package/dist/esm/utils/validation.d.ts.map +1 -0
  473. package/dist/esm/utils/validation.js +20 -0
  474. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  475. package/dist/esm/utils/valueFormatter.js +8 -4
  476. package/package.json +1 -1
  477. package/dist/cjs/utils/monacoAutocomplete.d.ts.map +0 -1
  478. package/dist/cjs/utils/monacoAutocomplete.js +0 -145
  479. package/dist/cjs/utils/queryConstructor.uspec.d.ts +0 -2
  480. package/dist/cjs/utils/queryConstructor.uspec.d.ts.map +0 -1
  481. package/dist/cjs/utils/queryConstructor.uspec.js +0 -225
  482. package/dist/esm/utils/monacoAutocomplete.d.ts.map +0 -1
  483. package/dist/esm/utils/monacoAutocomplete.js +0 -140
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.convertRemoveSimpleParentheses = exports.convertStringComparison = exports.applyPivot = exports.convertGroupBy = exports.convertWildcardColumns = exports.convertBigQuery = exports.recursiveSearchAndReplaceByKey = exports.recursiveSearchAndReplace = exports.convertDateComparison = void 0;
3
+ exports.convertRemoveSimpleParentheses = exports.convertStringComparison = exports.convertGroupBy = exports.convertASTToPivotData = exports.convertColumnToGenericColumns = exports.convertWildcardColumns = exports.convertBigQuery = exports.recursiveSearchAndReplaceByKey = exports.recursiveSearchAndReplace = exports.convertDateComparison = void 0;
4
+ const date_fns_1 = require("date-fns");
4
5
  const PivotModal_1 = require("../../internals/ReportBuilder/PivotModal");
5
6
  const ast_1 = require("./ast");
6
7
  const util_1 = require("./util");
8
+ const columnProcessing_1 = require("../../utils/columnProcessing");
7
9
  // Helper functions that preprocess the AST.
8
10
  // Find and replace certain pre-set date comparison queries with their
9
11
  // more stable counterparts.
@@ -71,7 +73,7 @@ exports.recursiveSearchAndReplaceByKey = recursiveSearchAndReplaceByKey;
71
73
  function convertBigQuery(ast) {
72
74
  // For BigQuery, the info we want is nested inside the 'select' key
73
75
  if ((0, ast_1.isBigQuery)(ast)) {
74
- let newAst = ast.select;
76
+ const newAst = ast.select;
75
77
  newAst.from?.forEach((tbl) => {
76
78
  tbl.table = tbl.table.replaceAll('`', '');
77
79
  });
@@ -92,7 +94,7 @@ function convertBigQuery(ast) {
92
94
  recursiveSearchAndReplaceByKey(newAst.where, 'week', '* 7 DAY', 'unit');
93
95
  recursiveSearchAndReplaceByKey(newAst.where, 'month', '* 30 DAY', 'unit');
94
96
  // TODO: handle joins nicely
95
- if (newAst.from?.length > 1) {
97
+ if (newAst.from && newAst.from.length > 1) {
96
98
  newAst.from = [newAst.from[0]];
97
99
  }
98
100
  // TODO: handle UNION ALL joins
@@ -103,7 +105,7 @@ function convertBigQuery(ast) {
103
105
  }
104
106
  else {
105
107
  // TODO: handle joins nicely
106
- if (ast.from?.length > 1) {
108
+ if (ast.from && ast.from.length > 1) {
107
109
  ast.from = [ast.from[0]];
108
110
  }
109
111
  // TODO: handle UNION ALL joins
@@ -114,12 +116,18 @@ function convertBigQuery(ast) {
114
116
  }
115
117
  }
116
118
  exports.convertBigQuery = convertBigQuery;
119
+ function columnExistsInNewColumns(columns, col) {
120
+ return columns.find((c) => [c.expr?.value, c.expr?.column, c.expr?.column?.expr?.value, c.as].includes(col));
121
+ }
117
122
  /**
118
123
  * Replaces the wildcard column selector with their literal column names.
119
124
  */
120
125
  function convertWildcardColumns(ast, schemaTables) {
121
- if (ast.columns !== '*' && ast.columns.length !== 0)
126
+ if (ast.columns !== '*' &&
127
+ ast.columns.length !== 0 &&
128
+ (!ast.columns[0].expr || ast.columns[0].expr.column !== '*')) {
122
129
  return ast;
130
+ }
123
131
  if (!ast.from)
124
132
  return ast;
125
133
  // Map SELECT(*) to their actual columns
@@ -142,348 +150,64 @@ function convertWildcardColumns(ast, schemaTables) {
142
150
  }
143
151
  exports.convertWildcardColumns = convertWildcardColumns;
144
152
  /**
145
- * Processes the AST and builds up a new pivot, given the old AST, the old pivot
146
- * and a list of tables in the schema.
153
+ * Take a list of AST column objects of any form and turn them into the generic select form
147
154
  */
148
- function convertGroupBy(ast, prevPivot = null, schemaTables) {
149
- if (!(0, ast_1.isSelect)(ast))
150
- return { ast, pivot: prevPivot };
151
- let newAst = {};
152
- let pivot = {};
153
- let newColumns = [];
154
- let aliasMap = {};
155
- const tableNamesInQuery = (ast.from ?? []).map((tbl) => {
156
- // This assumes that all the entries in the from clause are BaseFrom.
157
- // TODO: Handle Join, TableExpr, and Dual (maybe not the last one).
158
- return tbl.table;
155
+ function convertColumnToGenericColumns(astColumns) {
156
+ const genericColumnReferences = [];
157
+ astColumns.forEach((column) => {
158
+ const columnName = (0, ast_1.getColumnName)(column);
159
+ if (!columnName) {
160
+ return;
161
+ }
162
+ genericColumnReferences.push({
163
+ type: 'expr',
164
+ expr: {
165
+ type: 'column_ref',
166
+ table: null,
167
+ column: columnName,
168
+ },
169
+ as: columnName,
170
+ });
159
171
  });
160
- const columns = schemaTables
161
- .filter((t) => tableNamesInQuery.includes(t.displayName))
162
- .flatMap((table) => table.columns)
163
- .map((column) => ({
164
- field: column.displayName,
165
- fieldType: column.fieldType,
166
- }));
167
- // If there is not GROUP BY clause in the AST, we still need to process the
168
- // AST but it should pass-through in nature.
169
- if (!ast.groupby) {
170
- // If there was a pivot before, evaluate the pivot.
171
- if (prevPivot) {
172
- // Make sure that the AST includes all the columns on the prevPivot
173
- const columnAlreadyExists = (col) => ast.columns.find((c) => [c.expr?.value, c.expr?.column, c.as].includes(col));
174
- if (prevPivot.valueField) {
175
- const existingCol = columnAlreadyExists(prevPivot.valueField);
176
- newColumns.push(existingCol ?? (0, util_1.generateColumnExpr)(prevPivot.valueField));
177
- }
178
- if (prevPivot.rowField) {
179
- const existingCol = columnAlreadyExists(prevPivot.rowField);
180
- newColumns.push(existingCol ?? (0, util_1.generateColumnExpr)(prevPivot.rowField));
181
- }
182
- if (prevPivot.columnField) {
183
- const existingCol = columnAlreadyExists(prevPivot.columnField);
184
- newColumns.push(existingCol ?? (0, util_1.generateColumnExpr)(prevPivot.columnField));
185
- }
186
- ast.columns = newColumns;
187
- return { pivot: prevPivot, ast };
172
+ return genericColumnReferences;
173
+ }
174
+ exports.convertColumnToGenericColumns = convertColumnToGenericColumns;
175
+ function cleanASTColumns(ast, columns) {
176
+ let newColumns = convertColumnToGenericColumns(ast.columns);
177
+ const columnNames = [];
178
+ newColumns = newColumns.filter((col) => {
179
+ if (!columnNames.includes(col.as)) {
180
+ columnNames.push(col.as);
181
+ return true;
188
182
  }
189
- for (let i = 0; i < ast.columns.length; i++) {
190
- const column = ast.columns[i];
191
- // Extract out the column name, note that there are several ways
192
- // that a column node could be structured so we need to check.
193
- let columnName;
194
- let columnAs = null;
195
- let columnTable = null;
196
- if (column.type === 'expr') {
197
- columnAs = column.as;
198
- columnTable = column.expr.table;
199
- if (column.expr.type === 'column_ref') {
200
- columnName = column.expr.column;
201
- }
202
- else if (column.expr.type === 'string') {
203
- columnName = column.expr.value;
204
- }
205
- else if (column.expr.type === 'double_quote_string') {
206
- columnName = column.expr?.value;
207
- }
208
- else if (column.expr?.args?.expr) {
209
- columnName = column.expr?.args?.expr?.value;
210
- }
211
- if (column.expr.type === 'aggr_func' && !(0, util_1.isIdColumn)(columnName)) {
212
- pivot.aggregationType = column.expr.name.toLowerCase();
213
- if (pivot.aggregationType === 'avg') {
214
- pivot.aggregationType = 'average';
215
- }
216
- pivot.valueField =
217
- column.expr.args?.expr?.value || column.expr.args?.expr?.column;
218
- if (column.expr.args.expr.type === 'column_ref') {
219
- columnTable = column.expr.args.expr.table;
220
- columnName = column.expr.args.expr.column;
221
- }
222
- else if (column.expr.args.expr.type === 'double_quote_string') {
223
- columnName = column.expr.args.expr?.value;
224
- }
225
- else if (column.expr?.args?.expr) {
226
- columnName = column.expr?.args?.expr?.value;
227
- }
228
- }
229
- }
230
- if (columnName === '*') {
231
- // Use the first numeric column found, if none found, use the first column
232
- let columnForValueField = columns.find((c) => {
233
- return (0, ast_1.isNumericColumnType)(c.fieldType) && !(0, util_1.isIdColumn)(c.field);
234
- });
235
- if (!columnForValueField) {
236
- columnForValueField = columns[0];
237
- }
238
- for (let i = 0; i < columns.length; i++) {
239
- if (!(0, util_1.isIdColumn)(columns[i]?.field) &&
240
- (0, ast_1.isNumericColumnType)(columns[i]?.fieldType)) {
241
- columnForValueField = columns[i];
242
- break;
243
- }
244
- }
245
- pivot.valueField = columnForValueField.field;
246
- // pivot.valueFieldType = 'number';
247
- columnName = columnForValueField.field;
248
- }
249
- newColumns.push({
250
- type: 'expr',
251
- expr: {
252
- type: 'column_ref',
253
- table: columnTable,
254
- column: columnName,
255
- },
256
- as: columnName,
257
- });
183
+ else {
184
+ return false;
258
185
  }
259
- newAst = { ...ast };
260
- newAst.columns = newColumns;
261
- const newPivot = Object.keys(pivot).length === 0 ? null : pivot;
262
- return { pivot: newPivot, ast: newAst };
186
+ });
187
+ newColumns = newColumns.filter((col) => columns.find((c) => c.field === col.as));
188
+ return newColumns;
189
+ }
190
+ function addAllPivotColumnsToColumnAST(astColumns, pivot) {
191
+ if (!pivot) {
192
+ return;
263
193
  }
264
- // Iterate over columns to find aggr_func -> set pivot.aggregationType and pivot.valueField
265
- for (let i = 0; i < ast.columns.length; i++) {
266
- const column = ast.columns[i];
267
- const field = columns.find((c) => c.field === column.expr?.args?.expr?.column ||
268
- c.field === column.expr?.args?.expr?.value);
269
- if (column?.expr?.type === 'aggr_func') {
270
- // CASE WHEN
271
- if (column.expr?.args?.expr?.type.toLowerCase() === 'case' &&
272
- ['double_quote_string', 'column_ref'].includes(column.expr?.args?.expr?.args[0]?.result?.type)) {
273
- // The result of the CASE is the column to use
274
- const columnNode = column.expr?.args?.expr?.args[0]?.result;
275
- const columnName = columnNode?.value ?? columnNode?.column;
276
- if (!(0, util_1.isIdColumn)(columnName)) {
277
- pivot.valueField = columnName;
278
- pivot.aggregationType = column?.expr?.name?.toLowerCase();
279
- if (pivot.aggregationType === 'avg') {
280
- pivot.aggregationType = 'average';
281
- }
282
- }
283
- const findByName = (x) => [x.expr?.value, x.expr?.column].includes(columnName);
284
- if (!newColumns.find(findByName)) {
285
- newColumns.push({
286
- type: 'expr',
287
- expr: {
288
- type: 'column_ref',
289
- table: null,
290
- column: columnName,
291
- },
292
- as: null,
293
- });
294
- }
295
- // We need to extract a column name from the condition expression of
296
- // the CASE and we'll use that as the columnField in our pivot.
297
- const condNode = column.expr?.args?.expr?.args[0]?.cond;
298
- const condColumnName = condNode.left?.column ?? condNode.left?.value;
299
- if (!(0, util_1.isIdColumn)(condColumnName)) {
300
- pivot.columnField = condColumnName;
301
- }
302
- const findByColName = (x) => [x.expr?.value, x.expr?.column].includes(condColumnName);
303
- if (!newColumns.find(findByColName)) {
304
- // Make sure the column we extracted is in our column list.
305
- newColumns.push({
306
- type: 'expr',
307
- expr: {
308
- type: 'column_ref',
309
- table: null,
310
- column: condColumnName,
311
- },
312
- as: null,
313
- });
314
- }
315
- // REGULAR
316
- }
317
- else if (
318
- // sum("amount")
319
- column.expr?.args?.expr?.type === 'double_quote_string' ||
320
- // sum(amount)
321
- column.expr?.args?.expr?.type === 'column_ref' ||
322
- // count(*)
323
- column.expr?.args?.expr?.type === 'star') {
324
- const columnNode = column.expr?.args?.expr;
325
- const columnName = columnNode?.value || columnNode?.column;
326
- // if count(*), make the value field an actual column
327
- if (columnName === '*') {
328
- let columnForValueField = columns.find((c) => {
329
- return (0, ast_1.isNumericColumnType)(c.fieldType) && !(0, util_1.isIdColumn)(c.field);
330
- });
331
- // if there aren't any numeric columns use the first column
332
- if (!column) {
333
- columnForValueField = columns[0];
334
- }
335
- pivot.valueField = columnForValueField?.field;
336
- // pivot.valueFieldType = 'number';
337
- pivot.aggregationType = column?.expr?.name.toLowerCase();
338
- if (pivot.aggregationType === 'avg') {
339
- pivot.aggregationType = 'average';
340
- }
341
- const findByName = (x) => [x.expr?.value, x.expr?.column].includes(columnForValueField.field);
342
- if (!newColumns.find(findByName)) {
343
- newColumns.push({
344
- type: 'expr',
345
- expr: {
346
- type: 'column_ref',
347
- table: null,
348
- column: columnForValueField?.field || '',
349
- },
350
- as: null,
351
- });
352
- }
353
- }
354
- else {
355
- // ONLY SET VALUE FIELD IF THE FIELD TYPE IS A NUMBER
356
- if ((0, ast_1.isNumericColumnType)(field?.fieldType) &&
357
- !(0, util_1.isIdColumn)(columnName)) {
358
- pivot.valueField = columnName;
359
- pivot.aggregationType = column?.expr?.name.toLowerCase();
360
- if (pivot.aggregationType === 'avg') {
361
- pivot.aggregationType = 'average';
362
- }
363
- }
364
- const findByName = (x) => [x.expr?.value, x.expr?.column].includes(columnName);
365
- if (!newColumns.find(findByName)) {
366
- newColumns.push({
367
- type: 'expr',
368
- expr: {
369
- type: 'column_ref',
370
- table: null,
371
- column: columnName,
372
- },
373
- as: null,
374
- });
375
- }
376
- }
377
- }
378
- else {
379
- // normal column?
380
- const columnName = column.expr?.column || column.expr?.value;
381
- const findByName = (x) => [x.expr?.value, x.expr?.column].includes(columnName);
382
- if (!newColumns.find(findByName)) {
383
- newColumns.push(column);
384
- }
385
- }
194
+ [pivot.valueField, pivot.rowField, pivot.columnField].forEach((field) => {
195
+ if (!field || columnExistsInNewColumns(astColumns, field)) {
196
+ return;
386
197
  }
387
- else if (column.expr?.type === 'function') {
388
- // date_trunc("month", "created_at") as month
389
- if (column.type === 'expr' &&
390
- column.expr?.type.toLowerCase() === 'function' &&
391
- column.expr?.name.toLowerCase() === 'date_trunc' &&
392
- column.expr?.args?.type === 'expr_list' &&
393
- column.as) {
394
- const columnObj = column.expr?.args?.value[1];
395
- const periodObj = column.expr?.args?.value[0];
396
- aliasMap[column.as] = columnObj?.value ?? columnObj.column;
397
- newColumns.push({
398
- type: 'expr',
399
- expr: {
400
- type: 'function',
401
- name: 'DATE_TRUNC',
402
- args: {
403
- type: 'expr_list',
404
- value: [
405
- { type: 'single_quote_string', value: periodObj?.value },
406
- {
407
- type: 'column_ref',
408
- table: null,
409
- column: columnObj?.value ?? columnObj.column,
410
- },
411
- ],
412
- },
413
- },
414
- as: columnObj?.value ?? columnObj.column,
415
- });
416
- }
417
- else if (column.type === 'expr' &&
418
- column.expr?.type.toLowerCase() === 'function' &&
419
- column.expr?.name.toLowerCase() === 'date' &&
420
- column.expr?.args?.type === 'expr_list' &&
421
- column.as) {
422
- const columnObj = column.expr?.args?.value[0];
423
- aliasMap[column.as] = columnObj?.value ?? columnObj.column;
424
- newColumns.push({
425
- type: 'expr',
426
- expr: {
427
- type: 'function',
428
- name: 'DATE_TRUNC',
429
- args: {
430
- type: 'expr_list',
431
- value: [
432
- { type: 'single_quote_string', value: 'day' },
433
- {
434
- type: 'column_ref',
435
- table: null,
436
- column: columnObj?.value ?? columnObj.column,
437
- },
438
- ],
439
- },
440
- },
441
- as: columnObj?.value ?? columnObj.column,
442
- });
443
- }
444
- else {
445
- newColumns.push(column);
446
- }
447
- }
448
- else if (column.type === 'expr' &&
449
- column.expr?.type.toLowerCase() === 'extract' &&
450
- column.as) {
451
- const cast_type = column.expr?.args.cast_type;
452
- const source = column.expr?.args.source;
453
- const field = column.expr?.args.field;
454
- aliasMap[column.as] = source?.value ?? source.column;
455
- newColumns.push({
456
- type: 'expr',
457
- expr: {
458
- type: 'extract',
459
- args: { field, cast_type, source },
460
- },
461
- as: source?.value ?? source.column,
462
- });
463
- }
464
- else {
465
- const columnNode = column.expr;
466
- newColumns.push({
467
- type: 'expr',
468
- expr: {
469
- type: 'column_ref',
470
- table: columnNode.table,
471
- column: columnNode.args?.length
472
- ? columnNode.args?.value.find((elem) => ['double_quote_string', 'column_ref'].includes(elem.type))?.value
473
- : columnNode.column ?? columnNode?.value,
474
- },
475
- as: null,
476
- });
198
+ if (field && !astColumns.find((col) => col.as === field)) {
199
+ astColumns.push((0, util_1.generateColumnExpr)(field));
477
200
  }
201
+ });
202
+ }
203
+ function convertGroupByToPivotData(ast, columns, aliasMap) {
204
+ if (!ast.groupby) {
205
+ return {};
478
206
  }
479
- // Look for a date_trunc in the GROUP BY and set it to the rowField.
480
- // If there are no date_trunc in the GROUP BY, we also need to check
481
- // to see if there was a date_trunc column that was given an alias and
482
- // that alias is used in the GROUP BY (which is also set to rowField).
207
+ const pivot = {};
483
208
  const isDateTrunc = (item) => ['function', 'date_trunc'].includes(item.type);
484
209
  const isExtract = (item) => 'extract' === item.type;
485
210
  const isCol = (x) => ['double_quote_string', 'column_ref'].includes(x.type);
486
- const isAlias = (x) => isCol(x) && aliasMap[(0, ast_1.extractColumnish)(x)];
487
211
  const dateTruncGroup = ast.groupby.find(isDateTrunc);
488
212
  const extractGroup = ast.groupby.find(isExtract);
489
213
  if (dateTruncGroup) {
@@ -498,15 +222,6 @@ function convertGroupBy(ast, prevPivot = null, schemaTables) {
498
222
  pivot.rowField = columnName;
499
223
  pivot.rowFieldType = columns.find((c) => c.field === columnName)?.fieldType;
500
224
  }
501
- else if (aliasMap) {
502
- const match = ast.groupby.find(isAlias);
503
- const matchColumnish = (0, ast_1.extractColumnish)(match);
504
- if (matchColumnish) {
505
- const actualColumnName = aliasMap[matchColumnish];
506
- pivot.rowField = actualColumnName;
507
- pivot.rowFieldType = columns.find((c) => c.field === actualColumnName)?.fieldType;
508
- }
509
- }
510
225
  // Otherwise, set the first groupby to rowField then set
511
226
  // next field to columnField (if there is one)
512
227
  for (let j = 0; j < ast.groupby.length; j++) {
@@ -520,6 +235,12 @@ function convertGroupBy(ast, prevPivot = null, schemaTables) {
520
235
  groupValue = aliasMap[groupValue];
521
236
  }
522
237
  // Try to set the rowField and columnField.
238
+ const column = columns.find((c) => c.field === groupValue);
239
+ if (!column ||
240
+ (0, ast_1.isNumericColumnType)(column.fieldType) ||
241
+ (0, util_1.isIdColumn)(column.field)) {
242
+ continue;
243
+ }
523
244
  if (!pivot.rowField) {
524
245
  pivot.rowField = groupValue;
525
246
  pivot.rowFieldType = columns.find((c) => c.field === groupValue)?.fieldType;
@@ -528,157 +249,210 @@ function convertGroupBy(ast, prevPivot = null, schemaTables) {
528
249
  pivot.columnField = groupValue;
529
250
  }
530
251
  }
531
- newAst = { ...ast };
532
- newAst.groupby = null;
533
- newAst.columns = newColumns;
534
- const isColumnDate = columns.find((column) => column.field === pivot?.columnField)?.fieldType ===
535
- 'date';
536
- if (pivot && pivot.columnField && isColumnDate) {
537
- [pivot.rowField, pivot.columnField] = [pivot.columnField, pivot.rowField];
538
- pivot.rowFieldType = 'date';
539
- }
540
- // Automatically order by the rowField if this is a 1D pivot (ie. no columnField)
541
- // we also want to automatically order by rowField if the rowField is date-ish.
542
- // TODO: dateish check breaks for plain date-type columns (ie. non date_trunc/extract)
543
- const isPivot1D = pivot.rowField && !pivot.columnField;
544
- const isRowFieldDateish = (0, util_1.isColumnDateish)(newAst.columns.find((c) => c.as === pivot?.rowField));
545
- const isAutoOrderBy = isPivot1D || isRowFieldDateish;
546
- newAst.orderby = isAutoOrderBy
547
- ? [
548
- {
549
- expr: { type: 'column_ref', table: null, column: pivot.rowField },
550
- type: newAst.orderby !== null
551
- ? newAst.orderby[0]?.type ?? 'DESC'
552
- : 'DESC',
553
- },
554
- ]
555
- : null;
556
- // If the AI didn't generate an aggregate, add one. DO NOT ADD ID FOR VALUE FIELD
557
- if (!pivot.valueField) {
558
- for (let i = 0; i < newAst.columns.length; i++) {
559
- const columnName = newAst.columns[i].expr?.column ||
560
- newAst.columns[i].expr?.value ||
561
- undefined;
562
- if (columnName &&
563
- !(0, util_1.isIdColumn)(columnName) &&
564
- (0, ast_1.isNumericColumnType)(columns.find((c) => c.field === columnName)?.fieldType)) {
565
- pivot.valueField = columnName;
566
- pivot.aggregationType = 'sum';
252
+ return pivot;
253
+ }
254
+ function convertCaseWhenToPivotData(column) {
255
+ const pivot = {};
256
+ const columnNode = column.expr?.args?.expr?.args[0]?.result;
257
+ const columnName = columnNode?.value ?? columnNode?.column?.expr?.value ?? columnNode?.column;
258
+ if (columnName && typeof columnName === 'string') {
259
+ if (!(0, util_1.isIdColumn)(columnName)) {
260
+ pivot.valueField = columnName;
261
+ pivot.aggregationType = column?.expr?.name?.toLowerCase();
262
+ if (pivot.aggregationType === 'avg') {
263
+ pivot.aggregationType = 'average';
567
264
  }
568
265
  }
569
266
  }
570
- if (pivot.rowFieldType === 'date') {
571
- pivot.sort = true;
572
- pivot.sortDirection = 'ASC';
573
- pivot.sortField = pivot.rowField;
574
- pivot.sortFieldType = pivot.rowFieldType;
267
+ // We need to extract a column name from the condition expression of
268
+ // the CASE and we'll use that as the columnField in our pivot.
269
+ const condNode = column.expr?.args?.expr?.args[0]?.cond;
270
+ const condColumnName = condNode.left?.column?.expr?.value ??
271
+ condNode.left?.column ??
272
+ condNode.left?.value;
273
+ if (!(0, util_1.isIdColumn)(condColumnName)) {
274
+ pivot.columnField = condColumnName;
575
275
  }
576
- // @ts-ignore
577
- const title = (0, PivotModal_1.generatePivotTitle)(pivot);
578
- return { pivot: { ...pivot, title }, ast: newAst };
276
+ return pivot;
579
277
  }
580
- exports.convertGroupBy = convertGroupBy;
581
- /**
582
- * Applies a pivot to an object with {rows, fields} keys, returning
583
- * a new object with the aggragation applied to the rows and the
584
- * corresponding fields updated to reflect the accurate types.
585
- */
586
- function applyPivot(data, pivot, schema) {
587
- const newRows = [];
588
- const { rows, fields } = data;
589
- const { aggregationType, valueField, rowField, columnField } = pivot;
590
- if (rows.length === 0)
591
- return { rows, fields };
592
- if ((rowField || columnField) && !valueField)
593
- return { rows, fields };
594
- if (columnField && !Object.keys(schema).includes(columnField))
595
- return { rows, fields };
596
- const AGGREGATORS = {
597
- sum: (prev, next, _count = 0) => Number(prev) + Number(next),
598
- max: (prev, next, _count = 0) => Math.max(Number(prev), Number(next)),
599
- min: (prev, next, _count = 0) => Math.min(Number(prev), Number(next)),
600
- count: (_prev, _next, count = 0) => Number(count) + 1,
601
- avg: (prev, next, count = 0) => (Number(prev) * count + Number(next)) / (count + 1),
602
- };
603
- if (!columnField) {
604
- // Simple 1D pivot
605
- const keys = Object.keys(rows[0]);
606
- for (const row of rows) {
607
- let newRow = newRows.find((r) => r[rowField] === row[rowField]);
608
- if (newRow) {
609
- // Aggregate the existing row with this row
610
- newRow[valueField] = AGGREGATORS[aggregationType](newRow[valueField], row[valueField], newRow.count ?? 0);
611
- newRow.count = (newRow.count ?? 0) + 1;
278
+ function convertASTToPivotData(ast, columnInfo) {
279
+ const newPivot = {};
280
+ const aliasMap = {};
281
+ if (ast.columns === '*') {
282
+ return null;
283
+ }
284
+ ast.columns.forEach((column) => {
285
+ const columnName = (0, ast_1.getColumnName)(column);
286
+ if (!columnName) {
287
+ return;
288
+ }
289
+ const alias = column.as || columnName;
290
+ aliasMap[alias] = columnName;
291
+ if (column.expr?.args?.expr?.type.toLowerCase() === 'case' &&
292
+ ['double_quote_string', 'column_ref'].includes(column.expr?.args?.expr?.args[0]?.result?.type)) {
293
+ const caseWhenPivot = convertCaseWhenToPivotData(column);
294
+ newPivot.valueField = caseWhenPivot.valueField;
295
+ newPivot.aggregationType = caseWhenPivot.aggregationType;
296
+ newPivot.columnField = caseWhenPivot.columnField;
297
+ }
298
+ else if (column.expr.type === 'aggr_func' && !(0, util_1.isIdColumn)(columnName)) {
299
+ const aggObj = column.expr;
300
+ newPivot.aggregationType = aggObj.name.toLowerCase();
301
+ if (newPivot.aggregationType === 'avg') {
302
+ newPivot.aggregationType = 'average';
612
303
  }
613
- else {
614
- // Build up a new row and add it to our new rows array.
615
- newRow = keys.reduce((obj, key) => {
616
- obj[key] = row[key];
617
- return obj;
618
- }, {});
619
- newRow.count = 1;
620
- newRows.push(newRow);
304
+ newPivot.valueField = columnName;
305
+ }
306
+ else if (column.expr.type === 'function') {
307
+ const functionInfo = column.expr.name;
308
+ if (Array.isArray(functionInfo.name) &&
309
+ functionInfo.name[0].value &&
310
+ ['timestamp_trunc', 'date_trunc', 'date_part'].includes(functionInfo.name[0].value.toLowerCase())) {
311
+ newPivot.rowField = columnName;
621
312
  }
622
313
  }
623
- // Remove the count property before returning
624
- for (const row of newRows) {
625
- delete row.count;
314
+ });
315
+ const pivotData = convertGroupByToPivotData(ast, columnInfo, aliasMap);
316
+ const finalPivot = { ...pivotData, ...newPivot };
317
+ const isColumnDate = columnInfo.find((column) => column.field === finalPivot?.columnField)
318
+ ?.fieldType === 'date';
319
+ if (finalPivot) {
320
+ // Make sure date fields are set to the rowField
321
+ const isPivot1D = finalPivot.rowField && !finalPivot.columnField;
322
+ if (finalPivot.columnField && isColumnDate) {
323
+ [finalPivot.rowField, finalPivot.columnField] = [
324
+ finalPivot.columnField,
325
+ finalPivot.rowField,
326
+ ];
327
+ finalPivot.rowFieldType = 'date';
626
328
  }
627
- return { rows: newRows, fields };
628
- }
629
- else {
630
- // 2D Pivot with rowField and columnField
631
- const columnVariants = Object.keys(schema[columnField]);
632
- const rowFieldColumnType = fields.find((f) => f.name === rowField);
633
- const valueFieldColumnType = fields.find((f) => f.name === valueField);
634
- const newFields = [
635
- rowFieldColumnType,
636
- ...columnVariants.map((name) => {
637
- return { ...valueFieldColumnType, name, label: name };
638
- }),
639
- ];
640
- for (const row of rows) {
641
- let newRow = newRows.find((r) => r[rowField] === row[rowField]);
642
- if (newRow) {
643
- // Aggregate the existing row with this row
644
- newRow[row[columnField]] = AGGREGATORS[aggregationType](newRow[row[columnField]], row[valueField], newRow[`${row[columnField]}_count`] ?? 0);
645
- newRow[`${row[columnField]}_count`] += 1;
329
+ // Make sure pivot value field is of numeric type
330
+ if (finalPivot.valueField) {
331
+ const column = columnInfo.find((c) => c.field === finalPivot.valueField);
332
+ if (!column || !(0, ast_1.isNumericColumnType)(column.fieldType)) {
333
+ // @ts-ignore
334
+ finalPivot.valueField = null;
335
+ finalPivot.aggregationType = 'count';
646
336
  }
647
- else {
648
- // Build up a new row and add it to our new rows array.
649
- const defaultAllColumnVariants = columnVariants.reduce((obj, key) => {
650
- // set each variant to the default value (eg. 0)
651
- obj[key] = aggregationType === 'min' ? Number.MAX_VALUE : 0;
652
- obj[`${key}_count`] = 0;
653
- return obj;
654
- }, {});
655
- newRow = {
656
- [rowField]: row[rowField],
657
- ...defaultAllColumnVariants,
658
- };
659
- newRow[row[columnField]] =
660
- aggregationType === 'count' ? 1 : row[valueField];
661
- newRow[`${row[columnField]}_count`] = 1;
662
- newRows.push(newRow);
337
+ }
338
+ if (finalPivot.rowFieldType === 'date') {
339
+ finalPivot.sort = true;
340
+ finalPivot.sortDirection = 'ASC';
341
+ finalPivot.sortField = finalPivot.rowField;
342
+ finalPivot.sortFieldType = finalPivot.rowFieldType;
343
+ }
344
+ else if (isPivot1D) {
345
+ finalPivot.sort = true;
346
+ finalPivot.sortDirection = 'ASC';
347
+ finalPivot.sortField = finalPivot.rowField;
348
+ finalPivot.sortFieldType = finalPivot.rowFieldType;
349
+ }
350
+ }
351
+ return finalPivot;
352
+ }
353
+ exports.convertASTToPivotData = convertASTToPivotData;
354
+ function addValueFieldToPivot(newAst, pivot, columns) {
355
+ if (!pivot) {
356
+ return;
357
+ }
358
+ if (!pivot.valueField) {
359
+ let firstNumericNonIdColumn = undefined;
360
+ newAst.columns.forEach((col) => {
361
+ if (!(0, util_1.isIdColumn)(col.as) &&
362
+ (0, ast_1.isNumericColumnType)(columns.find((c) => c.field === col.as)?.fieldType)) {
363
+ firstNumericNonIdColumn = { ...col };
663
364
  }
365
+ });
366
+ if (firstNumericNonIdColumn) {
367
+ pivot.valueField = firstNumericNonIdColumn.as;
368
+ pivot.aggregationType = 'sum';
664
369
  }
665
- // Remove the _count properties before returning
666
- for (const row of newRows) {
667
- for (const key in row) {
668
- if (key.endsWith('_count')) {
669
- // Show a special output for no entries so that we
670
- // don't show our dummy defaults like 0 or Number.MAX_VALUE
671
- if (row[key] === 0) {
672
- row[key.replace('_count', '')] = '-';
673
- }
674
- delete row[key];
675
- }
370
+ else {
371
+ pivot.aggregationType = 'count';
372
+ }
373
+ }
374
+ }
375
+ /**
376
+ * Processes the AST and builds up a new pivot, given the old AST, the old pivot
377
+ * and a list of tables in the schema.
378
+ */
379
+ function convertGroupBy(ast, prevPivot = null, schemaTables) {
380
+ if (!(0, ast_1.isSelect)(ast))
381
+ return { ast, pivot: prevPivot };
382
+ let newAst = {};
383
+ let pivot;
384
+ const newColumns = [];
385
+ const tableNamesInQuery = (ast.from ?? []).map((tbl) => {
386
+ // This assumes that all the entries in the from clause are BaseFrom.
387
+ // TODO: Handle Join, TableExpr, and Dual (maybe not the last one).
388
+ return tbl.table;
389
+ });
390
+ const columns = schemaTables
391
+ .filter((t) => tableNamesInQuery.includes(t.displayName))
392
+ .flatMap((table) => table.columns)
393
+ .map((column) => {
394
+ return (0, columnProcessing_1.convertColumnInfoToColumnInternal)(column);
395
+ });
396
+ // If there is not GROUP BY clause in the AST, we still need to process the
397
+ // AST but it should pass-through in nature.
398
+ if (!ast.groupby) {
399
+ // If there was a pivot before, evaluate the pivot.
400
+ if (prevPivot) {
401
+ // Make sure that the AST includes all the columns on the prevPivot
402
+ const columnAlreadyExists = (col) => ast.columns.find((c) => [
403
+ c.expr?.value,
404
+ c.expr?.column,
405
+ c.expr?.column?.expr?.value,
406
+ c.as,
407
+ ].includes(col));
408
+ if (prevPivot.valueField) {
409
+ const existingCol = columnAlreadyExists(prevPivot.valueField);
410
+ newColumns.push(existingCol ?? (0, util_1.generateColumnExpr)(prevPivot.valueField));
411
+ }
412
+ if (prevPivot.rowField) {
413
+ const existingCol = columnAlreadyExists(prevPivot.rowField);
414
+ newColumns.push(existingCol ?? (0, util_1.generateColumnExpr)(prevPivot.rowField));
415
+ }
416
+ if (prevPivot.columnField) {
417
+ const existingCol = columnAlreadyExists(prevPivot.columnField);
418
+ newColumns.push(existingCol ?? (0, util_1.generateColumnExpr)(prevPivot.columnField));
676
419
  }
420
+ ast.columns = newColumns;
421
+ return { pivot: prevPivot, ast };
677
422
  }
678
- return { rows: newRows, fields: newFields };
423
+ pivot = convertASTToPivotData(ast, columns);
424
+ if (pivot && Object.keys(pivot).length === 0) {
425
+ pivot = null;
426
+ }
427
+ addAllPivotColumnsToColumnAST(ast.columns, pivot);
428
+ newAst = { ...ast };
429
+ newAst.columns = cleanASTColumns(ast, columns);
430
+ addValueFieldToPivot(newAst, pivot, columns);
431
+ return { pivot, ast: newAst };
432
+ }
433
+ pivot = convertASTToPivotData(ast, columns);
434
+ if (!pivot || pivot == null) {
435
+ throw new Error('Pivot is null');
436
+ }
437
+ addAllPivotColumnsToColumnAST(ast.columns, pivot);
438
+ newAst = { ...ast };
439
+ newAst.groupby = null;
440
+ newAst.columns = cleanASTColumns(ast, columns);
441
+ // ADD sort if pivot has sort
442
+ if (pivot.sort) {
443
+ newAst.orderby = [
444
+ {
445
+ expr: { type: 'column_ref', table: null, column: pivot.rowField },
446
+ type: newAst.orderby !== null ? newAst.orderby[0]?.type ?? 'DESC' : 'DESC',
447
+ },
448
+ ];
679
449
  }
450
+ addValueFieldToPivot(newAst, pivot, columns);
451
+ // @ts-ignore
452
+ const title = (0, PivotModal_1.generatePivotTitle)(pivot);
453
+ return { pivot: { ...pivot, title }, ast: newAst };
680
454
  }
681
- exports.applyPivot = applyPivot;
455
+ exports.convertGroupBy = convertGroupBy;
682
456
  function convertStringComparison(node, databaseType) {
683
457
  // Function to recursively search and replace the pattern in the object
684
458
  function searchAndReplace(obj) {
@@ -691,7 +465,7 @@ function convertStringComparison(node, databaseType) {
691
465
  else if (typeof obj === 'object' && obj !== null) {
692
466
  // If the current node is an object, check for the pattern
693
467
  if (obj.type === 'binary_expr' &&
694
- (obj.operator === '=' ||
468
+ ((obj.operator === '=' && !(0, date_fns_1.isValid)((0, date_fns_1.parseISO)(obj.right.value))) || // don't do it on date objects
695
469
  obj.operator === 'LIKE' ||
696
470
  obj.operator === 'ILIKE') &&
697
471
  obj.left &&
@@ -703,25 +477,49 @@ function convertStringComparison(node, databaseType) {
703
477
  obj.operator = 'LIKE';
704
478
  obj.left = {
705
479
  type: 'function',
706
- name: 'LOWER',
480
+ name: {
481
+ name: [
482
+ {
483
+ type: 'default',
484
+ value: 'LOWER',
485
+ },
486
+ ],
487
+ },
707
488
  args: {
708
489
  type: 'expr_list',
709
490
  value: [
710
491
  databaseType === 'BigQuery'
711
492
  ? {
712
493
  type: 'column_ref',
713
- value: obj.left.column || obj.left.value,
494
+ value: obj.left.column?.expr?.value ||
495
+ obj.left.column ||
496
+ obj.left.value,
714
497
  }
715
498
  : {
716
- type: 'double_quote_string',
717
- value: obj.left.column || obj.left.value,
499
+ type: 'column_ref',
500
+ table: null,
501
+ column: {
502
+ expr: {
503
+ type: 'default',
504
+ value: obj.left.column?.expr?.value ||
505
+ obj.left.column ||
506
+ obj.left.value,
507
+ },
508
+ },
718
509
  },
719
510
  ],
720
511
  },
721
512
  };
722
513
  obj.right = {
723
514
  type: 'function',
724
- name: 'LOWER',
515
+ name: {
516
+ name: [
517
+ {
518
+ type: 'default',
519
+ value: 'LOWER',
520
+ },
521
+ ],
522
+ },
725
523
  args: {
726
524
  type: 'expr_list',
727
525
  value: [
@@ -747,25 +545,43 @@ function convertStringComparison(node, databaseType) {
747
545
  obj.operator = 'NOT LIKE';
748
546
  obj.left = {
749
547
  type: 'function',
750
- name: 'LOWER',
548
+ name: {
549
+ name: [
550
+ {
551
+ type: 'default',
552
+ value: 'LOWER',
553
+ },
554
+ ],
555
+ },
751
556
  args: {
752
557
  type: 'expr_list',
753
558
  value: [
754
559
  databaseType === 'BigQuery'
755
560
  ? {
756
561
  type: 'column_ref',
757
- value: obj.left.column || obj.left.value,
562
+ value: obj.left.column?.expr?.value ||
563
+ obj.left.column ||
564
+ obj.left.value,
758
565
  }
759
566
  : {
760
567
  type: 'double_quote_string',
761
- value: obj.left.column || obj.left.value,
568
+ value: obj.left.column?.expr?.value ||
569
+ obj.left.column ||
570
+ obj.left.value,
762
571
  },
763
572
  ],
764
573
  },
765
574
  };
766
575
  obj.right = {
767
576
  type: 'function',
768
- name: 'LOWER',
577
+ name: {
578
+ name: [
579
+ {
580
+ type: 'default',
581
+ value: 'LOWER',
582
+ },
583
+ ],
584
+ },
769
585
  args: {
770
586
  type: 'expr_list',
771
587
  value: [
@@ -789,18 +605,28 @@ function convertStringComparison(node, databaseType) {
789
605
  obj.right.value[0].type === 'single_quote_string') {
790
606
  obj.left = {
791
607
  type: 'function',
792
- name: 'LOWER',
608
+ name: {
609
+ name: [],
610
+ schema: {
611
+ type: 'default',
612
+ value: 'LOWER',
613
+ },
614
+ },
793
615
  args: {
794
616
  type: 'expr_list',
795
617
  value: [
796
618
  databaseType === 'BigQuery'
797
619
  ? {
798
620
  type: 'column_ref',
799
- value: obj.left.column || obj.left.value,
621
+ value: obj.left.column?.expr?.value ||
622
+ obj.left.column ||
623
+ obj.left.value,
800
624
  }
801
625
  : {
802
626
  type: 'double_quote_string',
803
- value: obj.left.column || obj.left.value,
627
+ value: obj.left.column?.expr?.value ||
628
+ obj.left.column ||
629
+ obj.left.value,
804
630
  },
805
631
  ],
806
632
  },
@@ -810,7 +636,13 @@ function convertStringComparison(node, databaseType) {
810
636
  // convert NOT IN ('fuel', 'food') to NOT IN (LOWER('fuel'), LOWER('food'))
811
637
  value: obj.right.value.map((elem) => ({
812
638
  type: 'function',
813
- name: 'LOWER',
639
+ name: {
640
+ name: [],
641
+ schema: {
642
+ type: 'default',
643
+ value: 'LOWER',
644
+ },
645
+ },
814
646
  args: {
815
647
  type: 'expr_list',
816
648
  value: [{ type: 'single_quote_string', value: elem.value }],