@quillsql/react 2.12.29 → 2.12.31

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