@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
@@ -0,0 +1,1419 @@
1
+ import { convertASTToPivotData, convertGroupBy, convertUnaryToBinary, } from './convert';
2
+ import { convertColumnInfoToColumnInternal } from '../../utils/columnProcessing';
3
+ function generateCaseWhenColumnAst(columnField, valueField, caseValue) {
4
+ const defaultCaseWhen = {
5
+ type: 'expr',
6
+ expr: {
7
+ type: 'aggr_func',
8
+ name: 'SUM',
9
+ args: {
10
+ expr: {
11
+ type: 'case',
12
+ expr: null,
13
+ args: [
14
+ {
15
+ type: 'when',
16
+ cond: {
17
+ type: 'binary_expr',
18
+ operator: '=',
19
+ left: {
20
+ type: 'column_ref',
21
+ table: null,
22
+ column: 'category',
23
+ },
24
+ right: {
25
+ type: 'single_quote_string',
26
+ value: 'Food',
27
+ },
28
+ },
29
+ result: {
30
+ type: 'column_ref',
31
+ table: null,
32
+ column: 'amount',
33
+ },
34
+ },
35
+ {
36
+ type: 'else',
37
+ result: {
38
+ type: 'number',
39
+ value: 0,
40
+ },
41
+ },
42
+ ],
43
+ },
44
+ },
45
+ over: null,
46
+ },
47
+ as: 'total_food_spend',
48
+ };
49
+ defaultCaseWhen.expr.args.expr.args[0].cond.left.column = columnField;
50
+ defaultCaseWhen.expr.args.expr.args[0].result.column = valueField;
51
+ defaultCaseWhen.expr.args.expr.args[0].cond.right.value = caseValue;
52
+ return defaultCaseWhen;
53
+ }
54
+ describe('convert', () => {
55
+ const emptySelect = {
56
+ with: null,
57
+ type: 'select',
58
+ options: null,
59
+ distinct: null,
60
+ columns: [],
61
+ from: [
62
+ {
63
+ db: null,
64
+ table: 'transactions',
65
+ as: null,
66
+ },
67
+ ],
68
+ where: null,
69
+ groupby: null,
70
+ having: null,
71
+ orderby: null,
72
+ limit: null,
73
+ };
74
+ const schema = [
75
+ {
76
+ viewQuery: 'SELECT * FROM transactions',
77
+ name: 'transactions',
78
+ isVisible: true,
79
+ _id: '1',
80
+ clientId: 'dummy',
81
+ displayName: 'transactions',
82
+ columns: [
83
+ {
84
+ name: 'created_at',
85
+ fieldType: 'date',
86
+ displayName: 'created_at',
87
+ isVisible: true,
88
+ _id: '1',
89
+ },
90
+ {
91
+ name: 'amount',
92
+ fieldType: 'int4',
93
+ displayName: 'amount',
94
+ isVisible: true,
95
+ _id: '2',
96
+ },
97
+ {
98
+ name: 'merchant',
99
+ fieldType: 'text',
100
+ displayName: 'merchant',
101
+ isVisible: true,
102
+ _id: '3',
103
+ },
104
+ {
105
+ name: 'user_name',
106
+ fieldType: 'text',
107
+ displayName: 'user_name',
108
+ isVisible: true,
109
+ _id: '4',
110
+ },
111
+ ],
112
+ },
113
+ ];
114
+ describe('convertGroupBy', () => {
115
+ const defaultSelectAST = {
116
+ with: null,
117
+ type: 'select',
118
+ options: null,
119
+ distinct: null,
120
+ columns: [
121
+ {
122
+ type: 'expr',
123
+ expr: {
124
+ type: 'column_ref',
125
+ table: null,
126
+ column: 'created_at',
127
+ },
128
+ as: null,
129
+ },
130
+ {
131
+ type: 'expr',
132
+ expr: {
133
+ type: 'column_ref',
134
+ table: null,
135
+ column: 'amount',
136
+ },
137
+ as: null,
138
+ },
139
+ {
140
+ type: 'expr',
141
+ expr: {
142
+ type: 'column_ref',
143
+ table: null,
144
+ column: 'merchant',
145
+ },
146
+ as: null,
147
+ },
148
+ ],
149
+ from: [
150
+ {
151
+ db: null,
152
+ table: 'transactions',
153
+ as: null,
154
+ },
155
+ ],
156
+ where: null,
157
+ groupby: null,
158
+ having: null,
159
+ orderby: null,
160
+ limit: null,
161
+ };
162
+ const sumAggAST = {
163
+ type: 'expr',
164
+ expr: {
165
+ type: 'aggr_func',
166
+ name: 'SUM',
167
+ args: {
168
+ expr: {
169
+ type: 'column_ref',
170
+ table: null,
171
+ column: 'amount',
172
+ },
173
+ },
174
+ over: null,
175
+ },
176
+ as: 'amount',
177
+ };
178
+ it('should process the aggregation, value and row fields from the ast', () => {
179
+ const pivotAST = { ...defaultSelectAST };
180
+ pivotAST.columns = [...pivotAST.columns, sumAggAST];
181
+ pivotAST.groupby = [
182
+ {
183
+ type: 'column_ref',
184
+ table: null,
185
+ column: {
186
+ expr: {
187
+ type: 'default',
188
+ value: 'created_at',
189
+ },
190
+ },
191
+ },
192
+ ];
193
+ const result = convertGroupBy(pivotAST, null, schema);
194
+ expect(result).toBeDefined();
195
+ expect(result.pivot?.rowField).toEqual('created_at');
196
+ expect(result.pivot?.valueField).toEqual('amount');
197
+ expect(result.ast).toBeDefined();
198
+ // @ts-ignore
199
+ expect(result.ast.columns.length).toEqual(3);
200
+ });
201
+ it('should process an ast with 2 group by columns for the 2d pivot information from the ast and modify the ast to only have basic column selections', () => {
202
+ const pivotAST = { ...defaultSelectAST };
203
+ pivotAST.columns = [...pivotAST.columns, sumAggAST];
204
+ pivotAST.groupby = [
205
+ {
206
+ type: 'double_quote_string',
207
+ value: 'merchant',
208
+ },
209
+ {
210
+ type: 'double_quote_string',
211
+ value: 'created_at',
212
+ },
213
+ ];
214
+ const result = convertGroupBy(pivotAST, null, schema);
215
+ expect(result?.pivot?.rowField).toEqual('created_at');
216
+ expect(result?.pivot?.columnField).toEqual('merchant');
217
+ expect(result?.pivot?.valueField).toEqual('amount');
218
+ // @ts-ignore
219
+ expect(result.ast.groupby).toEqual(null);
220
+ // @ts-ignore
221
+ expect(result.ast.columns.length).toEqual(3);
222
+ });
223
+ it('should process an ast with case when columns for the 2d pivot information from the ast and modify the ast to only have basic column selections', () => {
224
+ const pivotAST = { ...defaultSelectAST };
225
+ pivotAST.columns = [
226
+ ...pivotAST.columns,
227
+ generateCaseWhenColumnAst('merchant', 'amount', 'Food'),
228
+ generateCaseWhenColumnAst('merchant', 'amount', 'Clothing'),
229
+ ];
230
+ pivotAST.groupby = [
231
+ {
232
+ type: 'double_quote_string',
233
+ value: 'created_at',
234
+ },
235
+ ];
236
+ const result = convertGroupBy(pivotAST, null, schema);
237
+ expect(result?.pivot?.rowField).toEqual('created_at');
238
+ expect(result?.pivot?.columnField).toEqual('merchant');
239
+ expect(result?.pivot?.valueField).toEqual('amount');
240
+ // @ts-ignore
241
+ expect(result.ast.groupby).toEqual(null);
242
+ // @ts-ignore
243
+ expect(result.ast.columns.length).toEqual(3);
244
+ });
245
+ it('should maintain columns that are in the schema but convert them to a basic ast column select format', () => {
246
+ const dateTruncAst = { ...defaultSelectAST };
247
+ const schemaInfo = [...schema];
248
+ // @ts-ignore
249
+ schemaInfo[0].columns.push({
250
+ name: 'updated_at',
251
+ fieldType: 'date',
252
+ displayName: 'updated_at',
253
+ isVisible: true,
254
+ _id: '3',
255
+ });
256
+ dateTruncAst.columns = [
257
+ ...defaultSelectAST.columns,
258
+ {
259
+ type: 'expr',
260
+ expr: {
261
+ type: 'function',
262
+ name: 'DATE_TRUNC',
263
+ args: {
264
+ type: 'expr_list',
265
+ value: [
266
+ {
267
+ type: 'single_quote_string',
268
+ value: 'month',
269
+ },
270
+ {
271
+ type: 'column_ref',
272
+ table: null,
273
+ column: 'updated_at',
274
+ },
275
+ ],
276
+ },
277
+ },
278
+ as: 'month',
279
+ },
280
+ ];
281
+ const result = convertGroupBy(dateTruncAst, null, schemaInfo);
282
+ // @ts-ignore
283
+ expect(result.ast.columns.length).toEqual(4);
284
+ });
285
+ it('should parse out extract columns from the ast column list and replace them with the basic column select', () => {
286
+ const extractAst = { ...defaultSelectAST };
287
+ const schemaInfo = [...schema];
288
+ schemaInfo[0] &&
289
+ schemaInfo[0].columns.push({
290
+ name: 'updated_at',
291
+ fieldType: 'date',
292
+ displayName: 'updated_at',
293
+ isVisible: true,
294
+ _id: '3',
295
+ });
296
+ extractAst.columns = [
297
+ ...defaultSelectAST.columns,
298
+ {
299
+ expr: {
300
+ type: 'extract',
301
+ args: {
302
+ field: 'month',
303
+ source: {
304
+ type: 'column_ref',
305
+ table: null,
306
+ column: 'updated_at',
307
+ },
308
+ },
309
+ },
310
+ as: 'month',
311
+ },
312
+ ];
313
+ extractAst.groupby = [
314
+ {
315
+ type: 'column_ref',
316
+ table: null,
317
+ column: 'user_name',
318
+ },
319
+ {
320
+ type: 'column_ref',
321
+ table: null,
322
+ column: 'updated_at',
323
+ },
324
+ ];
325
+ const result = convertGroupBy(extractAst, null, schemaInfo);
326
+ // @ts-ignore
327
+ expect(result.ast.columns.length).toEqual(5);
328
+ });
329
+ it('should take field type into account and apply a numeric value field if it is present', () => {
330
+ const extractAst = emptySelect;
331
+ extractAst.columns = [
332
+ {
333
+ type: 'expr',
334
+ expr: {
335
+ type: 'double_quote_string',
336
+ column: 'created_at',
337
+ },
338
+ as: 'created_at',
339
+ },
340
+ {
341
+ type: 'expr',
342
+ expr: {
343
+ type: 'double_quote_string',
344
+ column: 'amount',
345
+ },
346
+ as: 'amount',
347
+ },
348
+ {
349
+ type: 'expr',
350
+ expr: {
351
+ type: 'double_quote_string',
352
+ column: 'user_name',
353
+ },
354
+ as: 'user_name',
355
+ },
356
+ ];
357
+ extractAst.groupby = [
358
+ {
359
+ type: 'column_ref',
360
+ table: null,
361
+ column: 'created_at',
362
+ },
363
+ {
364
+ type: 'column_ref',
365
+ table: null,
366
+ column: 'amount',
367
+ },
368
+ {
369
+ type: 'column_ref',
370
+ table: null,
371
+ column: 'user_name',
372
+ },
373
+ ];
374
+ const result = convertGroupBy(extractAst, null, schema);
375
+ // @ts-ignore
376
+ expect(result.pivot.valueField).toEqual('amount');
377
+ // @ts-ignore
378
+ expect(result.pivot.rowField).toEqual('created_at');
379
+ });
380
+ it('should set aggregation type to count if there is no numeric field', () => {
381
+ const extractAst = emptySelect;
382
+ extractAst.columns = [
383
+ {
384
+ type: 'expr',
385
+ expr: {
386
+ type: 'double_quote_string',
387
+ column: 'created_at',
388
+ },
389
+ as: 'created_at',
390
+ },
391
+ {
392
+ type: 'expr',
393
+ expr: {
394
+ type: 'double_quote_string',
395
+ column: 'user_name',
396
+ },
397
+ as: 'user_name',
398
+ },
399
+ ];
400
+ extractAst.groupby = [
401
+ {
402
+ type: 'column_ref',
403
+ table: null,
404
+ column: 'created_at',
405
+ },
406
+ {
407
+ type: 'column_ref',
408
+ table: null,
409
+ column: 'amount',
410
+ },
411
+ {
412
+ type: 'column_ref',
413
+ table: null,
414
+ column: 'user_name',
415
+ },
416
+ ];
417
+ const result = convertGroupBy(extractAst, null, schema);
418
+ // @ts-ignore
419
+ expect(result.pivot.aggregationType).toEqual('count');
420
+ // @ts-ignore
421
+ expect(result.pivot.rowField).toEqual('created_at');
422
+ });
423
+ it('should extract out non numeric value fields and replace it with null and set the aggregation type to count', () => {
424
+ const extractAst = {
425
+ with: null,
426
+ type: 'select',
427
+ options: null,
428
+ distinct: null,
429
+ columns: [
430
+ {
431
+ type: 'expr',
432
+ expr: {
433
+ type: 'column_ref',
434
+ table: null,
435
+ column: 'user_name',
436
+ },
437
+ as: null,
438
+ },
439
+ {
440
+ type: 'expr',
441
+ expr: {
442
+ type: 'aggr_func',
443
+ name: 'SUM',
444
+ args: {
445
+ expr: {
446
+ type: 'case',
447
+ expr: null,
448
+ args: [
449
+ {
450
+ type: 'when',
451
+ cond: {
452
+ type: 'binary_expr',
453
+ operator: '=',
454
+ left: {
455
+ type: 'column_ref',
456
+ table: null,
457
+ column: 'category',
458
+ },
459
+ right: {
460
+ type: 'single_quote_string',
461
+ value: 'Food',
462
+ },
463
+ },
464
+ result: {
465
+ type: 'number',
466
+ value: 1,
467
+ },
468
+ },
469
+ {
470
+ type: 'else',
471
+ result: {
472
+ type: 'number',
473
+ value: 0,
474
+ },
475
+ },
476
+ ],
477
+ },
478
+ },
479
+ over: null,
480
+ },
481
+ as: 'total_food_spend',
482
+ },
483
+ {
484
+ type: 'expr',
485
+ expr: {
486
+ type: 'aggr_func',
487
+ name: 'SUM',
488
+ args: {
489
+ expr: {
490
+ type: 'case',
491
+ expr: null,
492
+ args: [
493
+ {
494
+ type: 'when',
495
+ cond: {
496
+ type: 'binary_expr',
497
+ operator: '=',
498
+ left: {
499
+ type: 'column_ref',
500
+ table: null,
501
+ column: 'category',
502
+ },
503
+ right: {
504
+ type: 'single_quote_string',
505
+ value: 'Fuel',
506
+ },
507
+ },
508
+ result: {
509
+ type: 'number',
510
+ value: 1,
511
+ },
512
+ },
513
+ {
514
+ type: 'else',
515
+ result: {
516
+ type: 'number',
517
+ value: 0,
518
+ },
519
+ },
520
+ ],
521
+ },
522
+ },
523
+ over: null,
524
+ },
525
+ as: 'total_fuel_spend',
526
+ },
527
+ {
528
+ type: 'expr',
529
+ expr: {
530
+ type: 'function',
531
+ name: 'DATE_TRUNC',
532
+ args: {
533
+ type: 'expr_list',
534
+ value: [
535
+ {
536
+ type: 'single_quote_string',
537
+ value: 'month',
538
+ },
539
+ {
540
+ type: 'column_ref',
541
+ table: null,
542
+ column: 'created_at',
543
+ },
544
+ ],
545
+ },
546
+ },
547
+ as: 'month',
548
+ },
549
+ ],
550
+ from: [
551
+ {
552
+ db: null,
553
+ table: 'transactions',
554
+ as: null,
555
+ },
556
+ ],
557
+ where: null,
558
+ groupby: [
559
+ {
560
+ type: 'column_ref',
561
+ table: null,
562
+ column: 'user_name',
563
+ },
564
+ {
565
+ type: 'function',
566
+ name: 'DATE_TRUNC',
567
+ args: {
568
+ type: 'expr_list',
569
+ value: [
570
+ {
571
+ type: 'single_quote_string',
572
+ value: 'month',
573
+ },
574
+ {
575
+ type: 'column_ref',
576
+ table: null,
577
+ column: 'created_at',
578
+ },
579
+ ],
580
+ },
581
+ },
582
+ ],
583
+ having: null,
584
+ orderby: [
585
+ {
586
+ expr: {
587
+ type: 'column_ref',
588
+ table: null,
589
+ column: 'user_name',
590
+ },
591
+ type: 'ASC',
592
+ },
593
+ {
594
+ expr: {
595
+ type: 'function',
596
+ name: 'DATE_TRUNC',
597
+ args: {
598
+ type: 'expr_list',
599
+ value: [
600
+ {
601
+ type: 'single_quote_string',
602
+ value: 'month',
603
+ },
604
+ {
605
+ type: 'column_ref',
606
+ table: null,
607
+ column: 'created_at',
608
+ },
609
+ ],
610
+ },
611
+ },
612
+ type: 'ASC',
613
+ },
614
+ ],
615
+ limit: null,
616
+ };
617
+ const result = convertGroupBy(extractAst, null, schema);
618
+ // @ts-ignore
619
+ expect(result.pivot.aggregationType).toEqual('count');
620
+ // @ts-ignore
621
+ expect(result.pivot.rowField).toEqual('created_at');
622
+ });
623
+ it('should be able to handle this case', () => {
624
+ const newAST = {
625
+ with: null,
626
+ type: 'select',
627
+ options: null,
628
+ distinct: {
629
+ type: null,
630
+ },
631
+ columns: [
632
+ {
633
+ type: 'expr',
634
+ expr: {
635
+ type: 'function',
636
+ name: 'DATE_TRUNC',
637
+ args: {
638
+ type: 'expr_list',
639
+ value: [
640
+ {
641
+ type: 'single_quote_string',
642
+ value: 'week',
643
+ },
644
+ {
645
+ type: 'double_quote_string',
646
+ value: 'created_at',
647
+ },
648
+ ],
649
+ },
650
+ },
651
+ as: 'week_start',
652
+ },
653
+ {
654
+ type: 'expr',
655
+ expr: {
656
+ type: 'aggr_func',
657
+ name: 'SUM',
658
+ args: {
659
+ expr: {
660
+ type: 'double_quote_string',
661
+ value: 'amount',
662
+ },
663
+ },
664
+ over: null,
665
+ },
666
+ as: 'total_amount',
667
+ },
668
+ {
669
+ type: 'expr',
670
+ expr: {
671
+ type: 'aggr_func',
672
+ name: 'COUNT',
673
+ args: {
674
+ expr: {
675
+ type: 'star',
676
+ value: '*',
677
+ },
678
+ },
679
+ over: null,
680
+ },
681
+ as: 'transaction_count',
682
+ },
683
+ ],
684
+ from: [
685
+ {
686
+ db: null,
687
+ table: 'transactions',
688
+ as: null,
689
+ },
690
+ ],
691
+ where: null,
692
+ groupby: [
693
+ {
694
+ type: 'function',
695
+ name: 'DATE_TRUNC',
696
+ args: {
697
+ type: 'expr_list',
698
+ value: [
699
+ {
700
+ type: 'single_quote_string',
701
+ value: 'week',
702
+ },
703
+ {
704
+ type: 'double_quote_string',
705
+ value: 'created_at',
706
+ },
707
+ ],
708
+ },
709
+ },
710
+ ],
711
+ having: null,
712
+ orderby: null,
713
+ limit: null,
714
+ window: null,
715
+ };
716
+ // @ts-ignore
717
+ const result = convertGroupBy(newAST, null, schema);
718
+ // @ts-ignore
719
+ expect(result.pivot.aggregationType).toEqual('sum');
720
+ // @ts-ignore
721
+ expect(result.pivot.rowField).toEqual('created_at');
722
+ });
723
+ it('should extract any date_trunc, timestamp_trunc and date_part to row field', () => {
724
+ const extractAst = {
725
+ with: null,
726
+ type: 'select',
727
+ options: null,
728
+ distinct: null,
729
+ columns: [
730
+ {
731
+ type: 'expr',
732
+ expr: {
733
+ type: 'function',
734
+ name: {
735
+ name: [
736
+ {
737
+ type: 'default',
738
+ value: 'date_trunc',
739
+ },
740
+ ],
741
+ },
742
+ args: {
743
+ type: 'expr_list',
744
+ value: [
745
+ {
746
+ type: 'single_quote_string',
747
+ value: 'year',
748
+ },
749
+ {
750
+ type: 'column_ref',
751
+ table: null,
752
+ column: {
753
+ expr: {
754
+ type: 'double_quote_string',
755
+ value: 'created_at',
756
+ },
757
+ },
758
+ },
759
+ ],
760
+ },
761
+ },
762
+ as: 'year',
763
+ },
764
+ {
765
+ type: 'expr',
766
+ expr: {
767
+ type: 'column_ref',
768
+ table: null,
769
+ column: {
770
+ expr: {
771
+ type: 'double_quote_string',
772
+ value: 'id',
773
+ },
774
+ },
775
+ },
776
+ as: null,
777
+ },
778
+ {
779
+ type: 'expr',
780
+ expr: {
781
+ type: 'column_ref',
782
+ table: null,
783
+ column: {
784
+ expr: {
785
+ type: 'double_quote_string',
786
+ value: 'amount',
787
+ },
788
+ },
789
+ },
790
+ as: null,
791
+ },
792
+ {
793
+ type: 'expr',
794
+ expr: {
795
+ type: 'column_ref',
796
+ table: null,
797
+ column: {
798
+ expr: {
799
+ type: 'double_quote_string',
800
+ value: 'merchant',
801
+ },
802
+ },
803
+ },
804
+ as: null,
805
+ },
806
+ {
807
+ type: 'expr',
808
+ expr: {
809
+ type: 'column_ref',
810
+ table: null,
811
+ column: {
812
+ expr: {
813
+ type: 'double_quote_string',
814
+ value: 'user_name',
815
+ },
816
+ },
817
+ },
818
+ as: null,
819
+ },
820
+ {
821
+ type: 'expr',
822
+ expr: {
823
+ type: 'column_ref',
824
+ table: null,
825
+ column: {
826
+ expr: {
827
+ type: 'double_quote_string',
828
+ value: 'category',
829
+ },
830
+ },
831
+ },
832
+ as: null,
833
+ },
834
+ ],
835
+ from: [
836
+ {
837
+ db: null,
838
+ table: 'transactions',
839
+ as: null,
840
+ },
841
+ ],
842
+ where: null,
843
+ groupby: null,
844
+ having: null,
845
+ orderby: null,
846
+ limit: {
847
+ seperator: '',
848
+ value: [],
849
+ },
850
+ };
851
+ const result = convertGroupBy(extractAst, null, schema);
852
+ // @ts-ignore
853
+ expect(result.pivot.aggregationType).toEqual('sum');
854
+ // @ts-ignore
855
+ expect(result.pivot.valueField).toEqual('amount');
856
+ // @ts-ignore
857
+ expect(result.pivot.rowField).toEqual('created_at');
858
+ });
859
+ });
860
+ describe('convertASTToPivotData', () => {
861
+ it('should convert an aggregate function to a value field only pivot', () => {
862
+ const extractAst = emptySelect;
863
+ extractAst.columns = [
864
+ {
865
+ type: 'expr',
866
+ expr: {
867
+ type: 'aggr_func',
868
+ name: 'SUM',
869
+ args: {
870
+ expr: {
871
+ type: 'column_ref',
872
+ table: null,
873
+ column: 'amount',
874
+ },
875
+ },
876
+ over: null,
877
+ },
878
+ as: null,
879
+ },
880
+ ];
881
+ // @ts-ignore
882
+ const columnInteralArray = schema[0].columns.map((column) => {
883
+ return convertColumnInfoToColumnInternal(column);
884
+ });
885
+ const result = convertASTToPivotData(extractAst, columnInteralArray);
886
+ expect(result).toBeDefined();
887
+ expect(result?.valueField).toEqual('amount');
888
+ });
889
+ it('should convert a CASE WHEN function to the right pivot', () => {
890
+ const extractAst = emptySelect;
891
+ extractAst.columns = [
892
+ {
893
+ type: 'expr',
894
+ expr: {
895
+ type: 'double_quote_string',
896
+ column: 'user_name',
897
+ },
898
+ as: null,
899
+ },
900
+ generateCaseWhenColumnAst('merchant', 'amount', 'Food'),
901
+ ];
902
+ extractAst.groupby = [
903
+ {
904
+ type: 'column_ref',
905
+ table: null,
906
+ column: 'user_name',
907
+ },
908
+ ];
909
+ // @ts-ignore
910
+ const columnInteralArray = schema[0].columns.map((column) => {
911
+ return convertColumnInfoToColumnInternal(column);
912
+ });
913
+ const result = convertASTToPivotData(extractAst, columnInteralArray);
914
+ expect(result).toBeDefined();
915
+ expect(result?.valueField).toEqual('amount');
916
+ expect(result?.rowField).toEqual('user_name');
917
+ expect(result?.columnField).toEqual('merchant');
918
+ });
919
+ it('should use the first two group by fields as the pivot row field and column field', () => {
920
+ const extractAst = emptySelect;
921
+ extractAst.columns = [
922
+ {
923
+ type: 'expr',
924
+ expr: {
925
+ type: 'aggr_func',
926
+ name: 'SUM',
927
+ args: {
928
+ expr: {
929
+ type: 'column_ref',
930
+ table: null,
931
+ column: 'amount',
932
+ },
933
+ },
934
+ over: null,
935
+ },
936
+ as: null,
937
+ },
938
+ {
939
+ type: 'expr',
940
+ expr: {
941
+ type: 'double_quote_string',
942
+ column: 'user_name',
943
+ },
944
+ as: null,
945
+ },
946
+ {
947
+ type: 'expr',
948
+ expr: {
949
+ type: 'double_quote_string',
950
+ column: 'merchant',
951
+ },
952
+ as: null,
953
+ },
954
+ ];
955
+ extractAst.groupby = [
956
+ {
957
+ type: 'column_ref',
958
+ table: null,
959
+ column: 'user_name',
960
+ },
961
+ {
962
+ type: 'column_ref',
963
+ table: null,
964
+ column: 'merchant',
965
+ },
966
+ ];
967
+ // @ts-ignore
968
+ const columnInteralArray = schema[0].columns.map((column) => {
969
+ return convertColumnInfoToColumnInternal(column);
970
+ });
971
+ const result = convertASTToPivotData(extractAst, columnInteralArray);
972
+ expect(result).toBeDefined();
973
+ expect(result?.valueField).toEqual('amount');
974
+ expect(result?.rowField).toEqual('user_name');
975
+ expect(result?.columnField).toEqual('merchant');
976
+ });
977
+ it('should always use date_trunc columns as the row field', () => {
978
+ const extractAst = emptySelect;
979
+ extractAst.columns = [
980
+ {
981
+ type: 'expr',
982
+ expr: {
983
+ type: 'aggr_func',
984
+ name: 'SUM',
985
+ args: {
986
+ expr: {
987
+ type: 'column_ref',
988
+ table: null,
989
+ column: 'amount',
990
+ },
991
+ },
992
+ over: null,
993
+ },
994
+ as: null,
995
+ },
996
+ {
997
+ type: 'expr',
998
+ expr: {
999
+ type: 'double_quote_string',
1000
+ column: 'user_name',
1001
+ },
1002
+ as: null,
1003
+ },
1004
+ {
1005
+ type: 'expr',
1006
+ expr: {
1007
+ type: 'double_quote_string',
1008
+ column: 'created_at',
1009
+ },
1010
+ as: null,
1011
+ },
1012
+ ];
1013
+ extractAst.groupby = [
1014
+ {
1015
+ type: 'column_ref',
1016
+ table: null,
1017
+ column: 'user_name',
1018
+ },
1019
+ {
1020
+ type: 'function',
1021
+ name: 'date_trunct',
1022
+ args: {
1023
+ type: 'expr_list',
1024
+ value: [
1025
+ {
1026
+ type: 'single_quote_string',
1027
+ value: 'month',
1028
+ },
1029
+ {
1030
+ type: 'column_ref',
1031
+ table: null,
1032
+ column: 'created_at',
1033
+ },
1034
+ ],
1035
+ },
1036
+ },
1037
+ ];
1038
+ // @ts-ignore
1039
+ const columnInteralArray = schema[0].columns.map((column) => {
1040
+ return convertColumnInfoToColumnInternal(column);
1041
+ });
1042
+ const result = convertASTToPivotData(extractAst, columnInteralArray);
1043
+ expect(result).toBeDefined();
1044
+ expect(result?.valueField).toEqual('amount');
1045
+ expect(result?.rowField).toEqual('created_at');
1046
+ expect(result?.columnField).toEqual('user_name');
1047
+ });
1048
+ it('should process aliasing properly for pivots', () => {
1049
+ const extractAst = emptySelect;
1050
+ extractAst.columns = [
1051
+ {
1052
+ type: 'expr',
1053
+ expr: {
1054
+ type: 'aggr_func',
1055
+ name: 'SUM',
1056
+ args: {
1057
+ expr: {
1058
+ type: 'column_ref',
1059
+ table: null,
1060
+ column: 'amount',
1061
+ },
1062
+ },
1063
+ over: null,
1064
+ },
1065
+ as: 'total_sum',
1066
+ },
1067
+ {
1068
+ type: 'expr',
1069
+ expr: {
1070
+ type: 'double_quote_string',
1071
+ column: 'created_at',
1072
+ },
1073
+ as: 'date_info',
1074
+ },
1075
+ ];
1076
+ extractAst.groupby = [
1077
+ {
1078
+ type: 'column_ref',
1079
+ table: null,
1080
+ column: 'date_info',
1081
+ },
1082
+ ];
1083
+ // @ts-ignore
1084
+ const columnInteralArray = schema[0].columns.map((column) => {
1085
+ return convertColumnInfoToColumnInternal(column);
1086
+ });
1087
+ const result = convertASTToPivotData(extractAst, columnInteralArray);
1088
+ expect(result).toBeDefined();
1089
+ expect(result?.valueField).toEqual('amount');
1090
+ expect(result?.rowField).toEqual('created_at');
1091
+ expect(result?.aggregationType).toEqual('sum');
1092
+ expect(result?.rowFieldType).toEqual('date');
1093
+ expect(result?.sortFieldType).toEqual('date');
1094
+ });
1095
+ it('should not sign a numeric type to row or column field', () => {
1096
+ const extractAst = emptySelect;
1097
+ extractAst.columns = [
1098
+ {
1099
+ type: 'expr',
1100
+ expr: {
1101
+ type: 'double_quote_string',
1102
+ column: 'created_at',
1103
+ },
1104
+ as: 'created_at',
1105
+ },
1106
+ {
1107
+ type: 'expr',
1108
+ expr: {
1109
+ type: 'double_quote_string',
1110
+ column: 'amount',
1111
+ },
1112
+ as: 'amount',
1113
+ },
1114
+ {
1115
+ type: 'expr',
1116
+ expr: {
1117
+ type: 'double_quote_string',
1118
+ column: 'user_name',
1119
+ },
1120
+ as: 'user_name',
1121
+ },
1122
+ ];
1123
+ extractAst.groupby = [
1124
+ {
1125
+ type: 'column_ref',
1126
+ table: null,
1127
+ column: 'created_at',
1128
+ },
1129
+ {
1130
+ type: 'column_ref',
1131
+ table: null,
1132
+ column: 'amount',
1133
+ },
1134
+ {
1135
+ type: 'column_ref',
1136
+ table: null,
1137
+ column: 'user_name',
1138
+ },
1139
+ ];
1140
+ // @ts-ignore
1141
+ const columnInteralArray = schema[0].columns.map((column) => {
1142
+ return convertColumnInfoToColumnInternal(column);
1143
+ });
1144
+ const result = convertASTToPivotData(extractAst, columnInteralArray);
1145
+ expect(result).toBeDefined();
1146
+ expect(result?.rowField).toEqual('created_at');
1147
+ expect(result?.aggregationType).toEqual(undefined);
1148
+ expect(result?.rowFieldType).toEqual('date');
1149
+ expect(result?.columnField).toEqual('user_name');
1150
+ });
1151
+ });
1152
+ describe('convertUnaryToBinary', () => {
1153
+ const defaultSelectAST = {
1154
+ with: null,
1155
+ type: 'select',
1156
+ options: null,
1157
+ distinct: null,
1158
+ columns: [
1159
+ {
1160
+ type: 'expr',
1161
+ expr: {
1162
+ type: 'column_ref',
1163
+ table: null,
1164
+ column: 'created_at',
1165
+ },
1166
+ as: null,
1167
+ },
1168
+ {
1169
+ type: 'expr',
1170
+ expr: {
1171
+ type: 'column_ref',
1172
+ table: null,
1173
+ column: 'amount',
1174
+ },
1175
+ as: null,
1176
+ },
1177
+ {
1178
+ type: 'expr',
1179
+ expr: {
1180
+ type: 'column_ref',
1181
+ table: null,
1182
+ column: 'merchant',
1183
+ },
1184
+ as: null,
1185
+ },
1186
+ ],
1187
+ from: [
1188
+ {
1189
+ db: null,
1190
+ table: 'transactions',
1191
+ as: null,
1192
+ },
1193
+ ],
1194
+ where: null,
1195
+ groupby: null,
1196
+ having: null,
1197
+ orderby: null,
1198
+ limit: null,
1199
+ };
1200
+ it('should not change a binary_expr where node', () => {
1201
+ const ast = {
1202
+ ...defaultSelectAST,
1203
+ where: {
1204
+ type: 'binary_expr',
1205
+ operator: 'AND',
1206
+ left: {
1207
+ type: 'binary_expr',
1208
+ operator: '>',
1209
+ left: {
1210
+ type: 'column_ref',
1211
+ table: null,
1212
+ column: 'amount',
1213
+ },
1214
+ right: {
1215
+ type: 'number',
1216
+ value: 100,
1217
+ },
1218
+ },
1219
+ right: {
1220
+ type: 'binary_expr',
1221
+ operator: '<',
1222
+ left: {
1223
+ type: 'column_ref',
1224
+ table: null,
1225
+ column: 'created_at',
1226
+ },
1227
+ right: {
1228
+ type: 'function',
1229
+ name: {
1230
+ name: [],
1231
+ schema: {
1232
+ type: 'default',
1233
+ value: 'DATE_SUB',
1234
+ },
1235
+ },
1236
+ args: {
1237
+ type: 'expr_list',
1238
+ value: [
1239
+ {
1240
+ type: 'function',
1241
+ name: {
1242
+ name: [],
1243
+ schema: {
1244
+ type: 'default',
1245
+ value: 'CURDATE',
1246
+ },
1247
+ },
1248
+ args: {
1249
+ type: 'expr_list',
1250
+ value: [],
1251
+ },
1252
+ over: null,
1253
+ },
1254
+ {
1255
+ type: 'interval',
1256
+ expr: {
1257
+ type: 'number',
1258
+ value: 1,
1259
+ },
1260
+ unit: 'month',
1261
+ },
1262
+ ],
1263
+ },
1264
+ over: null,
1265
+ },
1266
+ },
1267
+ },
1268
+ };
1269
+ const result = convertUnaryToBinary(ast);
1270
+ expect(result).toBeDefined();
1271
+ expect(result).toEqual(ast);
1272
+ });
1273
+ it('should replace a unary_expr where node', () => {
1274
+ const astWithUnary = {
1275
+ ...defaultSelectAST,
1276
+ where: {
1277
+ type: 'unary_expr',
1278
+ operator: 'NOT',
1279
+ expr: {
1280
+ type: 'column_ref',
1281
+ table: null,
1282
+ column: 'is_something',
1283
+ },
1284
+ },
1285
+ };
1286
+ const result = convertUnaryToBinary(astWithUnary);
1287
+ expect(result).toBeDefined();
1288
+ expect(result?.where?.type).toEqual('binary_expr');
1289
+ });
1290
+ it('should replace a direct column_ref where node', () => {
1291
+ const astWithDirectRef = {
1292
+ ...defaultSelectAST,
1293
+ where: {
1294
+ type: 'column_ref',
1295
+ table: null,
1296
+ column: 'something',
1297
+ },
1298
+ };
1299
+ const result = convertUnaryToBinary(astWithDirectRef);
1300
+ expect(result).toBeDefined();
1301
+ expect(result?.where?.type).toEqual('binary_expr');
1302
+ });
1303
+ it('should replace a unary_expr nested in a where node', () => {
1304
+ const astWithNestedUnary = {
1305
+ ...defaultSelectAST,
1306
+ where: {
1307
+ type: 'binary_expr',
1308
+ operator: 'AND',
1309
+ left: {
1310
+ type: 'binary_expr',
1311
+ operator: '>',
1312
+ left: {
1313
+ type: 'column_ref',
1314
+ table: null,
1315
+ column: 'amount',
1316
+ },
1317
+ right: {
1318
+ type: 'number',
1319
+ value: 100,
1320
+ },
1321
+ },
1322
+ right: {
1323
+ type: 'unary_expr',
1324
+ operator: 'NOT',
1325
+ expr: {
1326
+ type: 'column_ref',
1327
+ table: null,
1328
+ column: 'something',
1329
+ },
1330
+ },
1331
+ },
1332
+ };
1333
+ const result = convertUnaryToBinary(astWithNestedUnary);
1334
+ expect(result).toBeDefined();
1335
+ expect(result?.where?.type).toEqual('binary_expr');
1336
+ expect(result?.where?.left?.type).toEqual('binary_expr');
1337
+ expect(result?.where?.right?.type).toEqual('binary_expr');
1338
+ });
1339
+ it('should replace a direct column_ref nested in a where node', () => {
1340
+ const astWithNestedRef = {
1341
+ ...defaultSelectAST,
1342
+ where: {
1343
+ type: 'binary_expr',
1344
+ operator: 'AND',
1345
+ left: {
1346
+ type: 'binary_expr',
1347
+ operator: '>',
1348
+ left: {
1349
+ type: 'column_ref',
1350
+ table: null,
1351
+ column: 'amount',
1352
+ },
1353
+ right: {
1354
+ type: 'number',
1355
+ value: 100,
1356
+ },
1357
+ },
1358
+ right: {
1359
+ type: 'column_ref',
1360
+ table: null,
1361
+ column: 'something',
1362
+ },
1363
+ },
1364
+ };
1365
+ const result = convertUnaryToBinary(astWithNestedRef);
1366
+ expect(result).toBeDefined();
1367
+ expect(result?.where?.type).toEqual('binary_expr');
1368
+ expect(result?.where?.left?.type).toEqual('binary_expr');
1369
+ expect(result?.where?.right?.type).toEqual('binary_expr');
1370
+ });
1371
+ it('should replace all unary and direct column_ref in a where node', () => {
1372
+ const astWithUnaryAndRef = {
1373
+ ...defaultSelectAST,
1374
+ where: {
1375
+ type: 'binary_expr',
1376
+ operator: 'OR',
1377
+ left: {
1378
+ type: 'binary_expr',
1379
+ operator: 'AND',
1380
+ left: {
1381
+ type: 'unary_expr',
1382
+ operator: 'NOT',
1383
+ expr: {
1384
+ type: 'column_ref',
1385
+ table: null,
1386
+ column: 'is_something',
1387
+ },
1388
+ },
1389
+ right: {
1390
+ type: 'column_ref',
1391
+ table: null,
1392
+ column: 'something_else',
1393
+ },
1394
+ },
1395
+ right: {
1396
+ type: 'binary_expr',
1397
+ operator: '=',
1398
+ left: {
1399
+ type: 'column_ref',
1400
+ table: null,
1401
+ column: 'this',
1402
+ },
1403
+ right: {
1404
+ type: 'bool',
1405
+ value: true,
1406
+ },
1407
+ },
1408
+ },
1409
+ };
1410
+ const result = convertUnaryToBinary(astWithUnaryAndRef);
1411
+ expect(result).toBeDefined();
1412
+ expect(result?.where?.type).toEqual('binary_expr');
1413
+ expect(result?.where?.left?.type).toEqual('binary_expr');
1414
+ expect(result?.where?.right?.type).toEqual('binary_expr');
1415
+ expect(result?.where?.left?.left?.type).toEqual('binary_expr');
1416
+ expect(result?.where?.left?.right?.type).toEqual('binary_expr');
1417
+ });
1418
+ });
1419
+ });