@quillsql/react 2.12.46 → 2.12.48

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 (255) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +16 -7
  3. package/dist/cjs/ChartBuilder.d.ts +10 -11
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +78 -81
  6. package/dist/cjs/ChartEditor.d.ts +3 -1
  7. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  8. package/dist/cjs/ChartEditor.js +26 -10
  9. package/dist/cjs/Context.d.ts +2 -3
  10. package/dist/cjs/Context.d.ts.map +1 -1
  11. package/dist/cjs/Context.js +42 -28
  12. package/dist/cjs/Dashboard.d.ts +12 -12
  13. package/dist/cjs/Dashboard.d.ts.map +1 -1
  14. package/dist/cjs/Dashboard.js +61 -69
  15. package/dist/cjs/QuillProvider.d.ts +2 -0
  16. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  17. package/dist/cjs/QuillProvider.js +1 -15
  18. package/dist/cjs/ReportBuilder.d.ts +9 -9
  19. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  20. package/dist/cjs/ReportBuilder.js +116 -179
  21. package/dist/cjs/SQLEditor.d.ts +20 -11
  22. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  23. package/dist/cjs/SQLEditor.js +157 -90
  24. package/dist/cjs/Table.js +3 -3
  25. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  26. package/dist/cjs/components/Chart/BarChart.js +6 -25
  27. package/dist/cjs/components/Chart/BarList.js +1 -1
  28. package/dist/cjs/components/Chart/ChartError.d.ts +5 -2
  29. package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
  30. package/dist/cjs/components/Chart/ChartError.js +7 -10
  31. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  32. package/dist/cjs/components/Chart/LineChart.js +16 -1
  33. package/dist/cjs/components/Chart/PieChart.js +1 -1
  34. package/dist/cjs/components/Dashboard/ChartComponent.d.ts +1 -1
  35. package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
  36. package/dist/cjs/components/Dashboard/ChartComponent.js +46 -47
  37. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  38. package/dist/cjs/components/Dashboard/DashboardFilter.js +2 -1
  39. package/dist/cjs/components/Dashboard/DataLoader.d.ts +2 -2
  40. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  41. package/dist/cjs/components/Dashboard/DataLoader.js +19 -13
  42. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  43. package/dist/cjs/components/Dashboard/MetricComponent.js +16 -26
  44. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  45. package/dist/cjs/components/Dashboard/TableComponent.js +16 -25
  46. package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  47. package/dist/cjs/components/QuillMultiSelectWithCombo.js +31 -1
  48. package/dist/cjs/components/QuillSelect.js +1 -1
  49. package/dist/cjs/components/QuillTable.d.ts +1 -1
  50. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  51. package/dist/cjs/components/QuillTable.js +115 -105
  52. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts +3 -3
  53. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  54. package/dist/cjs/components/ReportBuilder/AddColumnModal.js +2 -2
  55. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +2 -2
  56. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  57. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +28 -9
  58. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +1 -1
  59. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -1
  60. package/dist/cjs/components/ReportBuilder/FilterModal.js +178 -114
  61. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  62. package/dist/cjs/components/ReportBuilder/convert.js +1 -2
  63. package/dist/cjs/components/ReportBuilder/ui.d.ts +9 -1
  64. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  65. package/dist/cjs/components/ReportBuilder/ui.js +37 -3
  66. package/dist/cjs/components/ReportBuilder/util.d.ts +5 -1
  67. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  68. package/dist/cjs/components/ReportBuilder/util.js +26 -12
  69. package/dist/cjs/components/UiComponents.d.ts +17 -3
  70. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  71. package/dist/cjs/components/UiComponents.js +160 -29
  72. package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -1
  73. package/dist/cjs/hooks/useAskQuill.js +7 -7
  74. package/dist/cjs/hooks/useAstToFilterTree.d.ts +4 -1
  75. package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -1
  76. package/dist/cjs/hooks/useAstToFilterTree.js +4 -1
  77. package/dist/cjs/hooks/useDashboard.d.ts +5 -1
  78. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  79. package/dist/cjs/hooks/useDashboard.js +28 -4
  80. package/dist/cjs/hooks/useOnClickOutside.js +2 -2
  81. package/dist/cjs/hooks/useQuill.js +4 -4
  82. package/dist/cjs/hooks/useVirtualTables.d.ts +10 -0
  83. package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -0
  84. package/dist/cjs/hooks/useVirtualTables.js +29 -0
  85. package/dist/cjs/index.d.ts +2 -1
  86. package/dist/cjs/index.d.ts.map +1 -1
  87. package/dist/cjs/index.js +4 -1
  88. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  89. package/dist/cjs/internals/ReportBuilder/PivotModal.js +45 -21
  90. package/dist/cjs/models/Client.d.ts +3 -0
  91. package/dist/cjs/models/Client.d.ts.map +1 -1
  92. package/dist/cjs/models/Report.d.ts +2 -0
  93. package/dist/cjs/models/Report.d.ts.map +1 -1
  94. package/dist/cjs/models/Schema.d.ts +7 -0
  95. package/dist/cjs/models/Schema.d.ts.map +1 -0
  96. package/dist/cjs/models/Schema.js +2 -0
  97. package/dist/cjs/models/Tables.d.ts +2 -0
  98. package/dist/cjs/models/Tables.d.ts.map +1 -1
  99. package/dist/cjs/utils/astFilterProcessing.d.ts +4 -0
  100. package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -1
  101. package/dist/cjs/utils/astFilterProcessing.js +47 -44
  102. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  103. package/dist/cjs/utils/astProcessing.js +8 -8
  104. package/dist/cjs/utils/client.d.ts.map +1 -1
  105. package/dist/cjs/utils/client.js +1 -0
  106. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
  107. package/dist/cjs/utils/columnProcessing.js +88 -5
  108. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  109. package/dist/cjs/utils/dataFetcher.js +7 -3
  110. package/dist/cjs/utils/filterProcessing.d.ts +25 -0
  111. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  112. package/dist/cjs/utils/filterProcessing.js +121 -1
  113. package/dist/cjs/utils/paginationProcessing.js +2 -2
  114. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  115. package/dist/cjs/utils/pivotConstructor.js +10 -6
  116. package/dist/cjs/utils/queryConstructor.d.ts +1 -0
  117. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  118. package/dist/cjs/utils/queryConstructor.js +37 -11
  119. package/dist/cjs/utils/report.d.ts +5 -0
  120. package/dist/cjs/utils/report.d.ts.map +1 -1
  121. package/dist/cjs/utils/report.js +63 -9
  122. package/dist/cjs/utils/schema.js +22 -20
  123. package/dist/cjs/utils/tableProcessing.d.ts +1 -0
  124. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  125. package/dist/cjs/utils/tableProcessing.js +22 -1
  126. package/dist/cjs/utils/validation.d.ts.map +1 -1
  127. package/dist/cjs/utils/validation.js +4 -0
  128. package/dist/esm/Chart.d.ts.map +1 -1
  129. package/dist/esm/Chart.js +17 -8
  130. package/dist/esm/ChartBuilder.d.ts +10 -11
  131. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  132. package/dist/esm/ChartBuilder.js +81 -84
  133. package/dist/esm/ChartEditor.d.ts +3 -1
  134. package/dist/esm/ChartEditor.d.ts.map +1 -1
  135. package/dist/esm/ChartEditor.js +27 -11
  136. package/dist/esm/Context.d.ts +2 -3
  137. package/dist/esm/Context.d.ts.map +1 -1
  138. package/dist/esm/Context.js +42 -28
  139. package/dist/esm/Dashboard.d.ts +12 -12
  140. package/dist/esm/Dashboard.d.ts.map +1 -1
  141. package/dist/esm/Dashboard.js +63 -71
  142. package/dist/esm/QuillProvider.d.ts +2 -0
  143. package/dist/esm/QuillProvider.d.ts.map +1 -1
  144. package/dist/esm/QuillProvider.js +2 -16
  145. package/dist/esm/ReportBuilder.d.ts +9 -9
  146. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  147. package/dist/esm/ReportBuilder.js +122 -185
  148. package/dist/esm/SQLEditor.d.ts +20 -11
  149. package/dist/esm/SQLEditor.d.ts.map +1 -1
  150. package/dist/esm/SQLEditor.js +160 -93
  151. package/dist/esm/Table.js +4 -4
  152. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  153. package/dist/esm/components/Chart/BarChart.js +7 -26
  154. package/dist/esm/components/Chart/BarList.js +1 -1
  155. package/dist/esm/components/Chart/ChartError.d.ts +5 -2
  156. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
  157. package/dist/esm/components/Chart/ChartError.js +7 -10
  158. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  159. package/dist/esm/components/Chart/LineChart.js +16 -1
  160. package/dist/esm/components/Chart/PieChart.js +1 -1
  161. package/dist/esm/components/Dashboard/ChartComponent.d.ts +1 -1
  162. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
  163. package/dist/esm/components/Dashboard/ChartComponent.js +46 -47
  164. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  165. package/dist/esm/components/Dashboard/DashboardFilter.js +2 -1
  166. package/dist/esm/components/Dashboard/DataLoader.d.ts +2 -2
  167. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  168. package/dist/esm/components/Dashboard/DataLoader.js +20 -14
  169. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  170. package/dist/esm/components/Dashboard/MetricComponent.js +16 -26
  171. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  172. package/dist/esm/components/Dashboard/TableComponent.js +16 -25
  173. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  174. package/dist/esm/components/QuillMultiSelectWithCombo.js +31 -1
  175. package/dist/esm/components/QuillSelect.js +1 -1
  176. package/dist/esm/components/QuillTable.d.ts +1 -1
  177. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  178. package/dist/esm/components/QuillTable.js +115 -105
  179. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +3 -3
  180. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  181. package/dist/esm/components/ReportBuilder/AddColumnModal.js +2 -2
  182. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +2 -2
  183. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  184. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +28 -9
  185. package/dist/esm/components/ReportBuilder/FilterModal.d.ts +1 -1
  186. package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -1
  187. package/dist/esm/components/ReportBuilder/FilterModal.js +178 -114
  188. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  189. package/dist/esm/components/ReportBuilder/convert.js +1 -2
  190. package/dist/esm/components/ReportBuilder/ui.d.ts +9 -1
  191. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  192. package/dist/esm/components/ReportBuilder/ui.js +38 -4
  193. package/dist/esm/components/ReportBuilder/util.d.ts +5 -1
  194. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  195. package/dist/esm/components/ReportBuilder/util.js +26 -12
  196. package/dist/esm/components/UiComponents.d.ts +17 -3
  197. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  198. package/dist/esm/components/UiComponents.js +158 -28
  199. package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
  200. package/dist/esm/hooks/useAskQuill.js +8 -8
  201. package/dist/esm/hooks/useAstToFilterTree.d.ts +4 -1
  202. package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -1
  203. package/dist/esm/hooks/useAstToFilterTree.js +4 -1
  204. package/dist/esm/hooks/useDashboard.d.ts +5 -1
  205. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  206. package/dist/esm/hooks/useDashboard.js +28 -5
  207. package/dist/esm/hooks/useOnClickOutside.js +2 -2
  208. package/dist/esm/hooks/useQuill.js +5 -5
  209. package/dist/esm/hooks/useVirtualTables.d.ts +10 -0
  210. package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -0
  211. package/dist/esm/hooks/useVirtualTables.js +25 -0
  212. package/dist/esm/index.d.ts +2 -1
  213. package/dist/esm/index.d.ts.map +1 -1
  214. package/dist/esm/index.js +2 -1
  215. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  216. package/dist/esm/internals/ReportBuilder/PivotModal.js +44 -23
  217. package/dist/esm/models/Client.d.ts +3 -0
  218. package/dist/esm/models/Client.d.ts.map +1 -1
  219. package/dist/esm/models/Report.d.ts +2 -0
  220. package/dist/esm/models/Report.d.ts.map +1 -1
  221. package/dist/esm/models/Schema.d.ts +7 -0
  222. package/dist/esm/models/Schema.d.ts.map +1 -0
  223. package/dist/esm/models/Schema.js +1 -0
  224. package/dist/esm/models/Tables.d.ts +2 -0
  225. package/dist/esm/models/Tables.d.ts.map +1 -1
  226. package/dist/esm/utils/astFilterProcessing.d.ts +4 -0
  227. package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -1
  228. package/dist/esm/utils/astFilterProcessing.js +45 -43
  229. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  230. package/dist/esm/utils/astProcessing.js +8 -8
  231. package/dist/esm/utils/client.d.ts.map +1 -1
  232. package/dist/esm/utils/client.js +1 -0
  233. package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
  234. package/dist/esm/utils/columnProcessing.js +88 -5
  235. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  236. package/dist/esm/utils/dataFetcher.js +7 -3
  237. package/dist/esm/utils/filterProcessing.d.ts +25 -0
  238. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  239. package/dist/esm/utils/filterProcessing.js +116 -0
  240. package/dist/esm/utils/paginationProcessing.js +2 -2
  241. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  242. package/dist/esm/utils/pivotConstructor.js +10 -6
  243. package/dist/esm/utils/queryConstructor.d.ts +1 -0
  244. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  245. package/dist/esm/utils/queryConstructor.js +35 -10
  246. package/dist/esm/utils/report.d.ts +5 -0
  247. package/dist/esm/utils/report.d.ts.map +1 -1
  248. package/dist/esm/utils/report.js +61 -8
  249. package/dist/esm/utils/schema.js +22 -20
  250. package/dist/esm/utils/tableProcessing.d.ts +1 -0
  251. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  252. package/dist/esm/utils/tableProcessing.js +21 -1
  253. package/dist/esm/utils/validation.d.ts.map +1 -1
  254. package/dist/esm/utils/validation.js +4 -0
  255. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/utils/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,eAAO,MAAM,YAAY,EAAE,MAS1B,CAAC;AAEF,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,eAAe,UAAQ,EACvB,YAAY,CAAC,EAAE,WAAW,GACzB,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/utils/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,eAAO,MAAM,YAAY,EAAE,MAU1B,CAAC;AAEF,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,eAAe,UAAQ,EACvB,YAAY,CAAC,EAAE,WAAW,GACzB,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
@@ -1,4 +1,5 @@
1
1
  export const EMPTY_CLIENT = {
2
+ name: '',
2
3
  customerId: '',
3
4
  clientId: '',
4
5
  userId: '',
@@ -1 +1 @@
1
- {"version":3,"file":"columnProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/columnProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,UAAU,6CAA6C;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,oCAAoC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,2BAA2B,GAC5B,6CAA6C,GAC7C,oCAAoC,CAAC;AAEzC,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,2BAA2B,GACjC,cAAc,CAyGhB;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,UAAU,GACrB,cAAc,CAShB;AA0DD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAsBlE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAY5D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,eAAO,MAAM,cAAc,WAAY,mBAAmB,UAsDzD,CAAC"}
1
+ {"version":3,"file":"columnProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/columnProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAQvD,UAAU,6CAA6C;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,oCAAoC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,2BAA2B,GAC5B,6CAA6C,GAC7C,oCAAoC,CAAC;AAEzC,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,2BAA2B,GACjC,cAAc,CAgJhB;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,UAAU,GACrB,cAAc,CAShB;AAsED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwDlE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAY5D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,eAAO,MAAM,cAAc,WAAY,mBAAmB,UAsDzD,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { findAndProcessDateFilter } from './filterProcessing';
2
+ import { snakeAndCamelCaseToTitleCase } from './textProcessing';
2
3
  function removeBigQuerySpecialChars(columnName) {
3
4
  return columnName.replaceAll('quill_forward_slash', '/');
4
5
  }
@@ -26,8 +27,12 @@ export function convertPostgresColumn(field) {
26
27
  case 1114: // timestamp
27
28
  format = 'MMM_dd_yyyy';
28
29
  break;
30
+ case 114: // json
31
+ case 199: // json[]
29
32
  case 1186: // interval
30
33
  case 1043: // varchar
34
+ case 3802: // jsonb
35
+ case 3807: // jsonb[]
31
36
  default:
32
37
  format = 'string';
33
38
  }
@@ -44,6 +49,12 @@ export function convertPostgresColumn(field) {
44
49
  case 23: // int4
45
50
  fieldType = 'int4';
46
51
  break;
52
+ case 114: // json
53
+ fieldType = 'json';
54
+ break;
55
+ case 199: // json[]
56
+ fieldType = 'json[]';
57
+ break;
47
58
  case 700: // float4
48
59
  fieldType = 'float4';
49
60
  break;
@@ -68,6 +79,18 @@ export function convertPostgresColumn(field) {
68
79
  case 1114: // timestamp
69
80
  fieldType = 'timestamp';
70
81
  break;
82
+ case 2950: // uuid
83
+ fieldType = 'uuid';
84
+ break;
85
+ case 2951: // uuid[]
86
+ fieldType = 'uuid[]';
87
+ break;
88
+ case 3802: // jsonb
89
+ fieldType = 'jsonb';
90
+ break;
91
+ case 3807: // jsonb[]
92
+ fieldType = 'jsonb[]';
93
+ break;
71
94
  case 1043: // varchar
72
95
  default:
73
96
  fieldType = 'varchar';
@@ -84,6 +107,14 @@ export function convertPostgresColumn(field) {
84
107
  case 1700: // numeric
85
108
  jsType = 'number';
86
109
  break;
110
+ case 114: // json
111
+ case 3802: // jsonb
112
+ jsType = 'object';
113
+ break;
114
+ case 199:
115
+ case 3807:
116
+ jsType = 'object[]';
117
+ break;
87
118
  case 1082: // date
88
119
  case 1083: // time
89
120
  case 1184: // timestamptz
@@ -92,11 +123,19 @@ export function convertPostgresColumn(field) {
92
123
  jsType = 'date';
93
124
  break;
94
125
  case 1043: // varchar
126
+ case 2950: // uuid
127
+ jsType = 'string';
128
+ break;
129
+ case 2951: // uuid[]
130
+ jsType = 'string[]';
131
+ break;
95
132
  default:
96
133
  jsType = 'string';
97
134
  }
98
135
  return {
99
- label: 'field' in field ? field.field : field.name,
136
+ label: 'field' in field
137
+ ? snakeAndCamelCaseToTitleCase(field.field)
138
+ : snakeAndCamelCaseToTitleCase(field.name),
100
139
  field: 'field' in field ? field.field : field.name,
101
140
  format,
102
141
  fieldType,
@@ -147,6 +186,10 @@ function fieldTypeToDataTypeID(fieldType) {
147
186
  return 21;
148
187
  case 'int4':
149
188
  return 23;
189
+ case 'json':
190
+ return 114;
191
+ case 'json[]':
192
+ return 199;
150
193
  case 'float4':
151
194
  return 700;
152
195
  case 'float8':
@@ -163,33 +206,73 @@ function fieldTypeToDataTypeID(fieldType) {
163
206
  return 1114;
164
207
  case 'interval':
165
208
  return 1186;
209
+ case 'uuid':
210
+ return 2950;
211
+ case 'uuid[]':
212
+ return 2951;
213
+ case 'jsonb':
214
+ return 3802;
215
+ case 'jsonb[]':
216
+ return 3807;
166
217
  case 'varchar':
167
218
  default:
168
219
  return 1043;
169
220
  }
170
221
  }
171
222
  export function convertFieldTypeToJSType(fieldType) {
223
+ let jsType = '';
172
224
  switch (fieldType) {
173
225
  case 'bool':
174
- return 'bool';
226
+ jsType = 'bool';
227
+ break;
175
228
  case 'int8':
176
229
  case 'int2':
177
230
  case 'int4':
178
231
  case 'float4':
179
232
  case 'float8':
180
233
  case 'numeric':
181
- return 'number';
234
+ jsType = 'number';
235
+ break;
182
236
  case 'date':
183
237
  case 'time':
184
238
  case 'timestamptz':
185
239
  case 'timestamp':
186
- return 'date';
240
+ jsType = 'date';
241
+ break;
242
+ case 'json':
243
+ case 'jsonb':
244
+ case 'json[]':
245
+ case 'jsonb[]':
246
+ case 'int2[]':
247
+ case 'int4[]':
248
+ case 'int8[]':
249
+ case 'float4[]':
250
+ case 'float8[]':
251
+ case 'text[]':
252
+ case 'char[]':
253
+ case 'bool[]':
254
+ case 'uuid[]':
255
+ case 'varchar[]':
256
+ case 'interval[]':
257
+ case 'numeric[]':
258
+ case 'bytea[]':
259
+ case 'cidr[]':
260
+ case 'inet[]':
261
+ case 'macaddr[]':
262
+ case 'date[]':
263
+ case 'timestamp[]':
264
+ case 'timestamptz[]':
265
+ case 'timetz[]':
266
+ jsType = 'object';
267
+ break;
187
268
  case 'interval':
188
269
  case 'varchar':
189
270
  case 'text':
271
+ case 'uuid':
190
272
  default:
191
- return 'string';
273
+ jsType = 'string';
192
274
  }
275
+ return jsType;
193
276
  }
194
277
  export function convertFormatToJsType(column) {
195
278
  switch (column.format) {
@@ -1 +1 @@
1
- {"version":3,"file":"dataFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/dataFetcher.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AA8E1C,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,GAAG,EACtB,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,EACf,UAAU,CAAC,EAAE,MAAM,gBA6IpB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBA6BhB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,GAAG,GACb,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB5C"}
1
+ {"version":3,"file":"dataFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/dataFetcher.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AA8E1C,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,GAAG,EACtB,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,EACf,UAAU,CAAC,EAAE,MAAM,gBAgJpB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBA6BhB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,GAAG,GACb,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB5C"}
@@ -54,7 +54,7 @@ async function testSqlViewState(hostedRequestBody, client, referencedTables) {
54
54
  },
55
55
  };
56
56
  getData(client, 'test-view', 'same-origin', brokenBody, cloudBody);
57
- errorMessage = `SQL View Error: '${table}' is out of sync with datasource.`;
57
+ errorMessage = `Virtual Table Error: '${table}' is out of sync with datasource.`;
58
58
  }
59
59
  }));
60
60
  return errorMessage;
@@ -83,18 +83,22 @@ export async function getData(client, cloudQueryEndpoint, noCred, hostedRequestB
83
83
  ['query', 'patterns', 'item'].includes(hostedRequestBody.metadata.task)) {
84
84
  const brokenReport = { ...responseJson };
85
85
  let errorPrefix = 'Error: ';
86
- let errorMessage = 'Failed to fetch chart';
86
+ let errorMessage = 'Failed to fetch report: ' + responseJson.error;
87
87
  if (hostedRequestBody.metadata.task === 'query' ||
88
88
  hostedRequestBody.metadata.task === 'patterns') {
89
89
  errorPrefix = 'SQL Error: ';
90
90
  errorMessage = errorPrefix + responseJson.error;
91
91
  }
92
+ else if (responseJson.error?.includes('Virtual Table Error')) {
93
+ errorMessage = responseJson.error;
94
+ }
92
95
  let adminErrorMessage = undefined;
93
96
  const processedData = fetchQuillData(brokenReport);
94
97
  if (processedData &&
95
98
  processedData.data &&
96
99
  processedData.data.referencedTables) {
97
- adminErrorMessage = await testSqlViewState(hostedRequestBody, client, processedData.data.referencedTables);
100
+ adminErrorMessage =
101
+ (await testSqlViewState(hostedRequestBody, client, processedData.data.referencedTables)) ?? undefined;
98
102
  }
99
103
  return {
100
104
  success: false,
@@ -1,4 +1,6 @@
1
1
  import { FieldTypes, Filter } from '../models/Filter';
2
+ import { UniqueValuesByColumn } from '../models/Tables';
3
+ import { FilterTreeNode } from './astFilterProcessing';
2
4
  export declare function findAndProcessDateFilter(filters: any[]): any;
3
5
  export declare function processFilterFromBackend(filter: any): any;
4
6
  export declare function updateFilter(filter: any, value?: any, comparison?: any): any;
@@ -7,4 +9,27 @@ export declare const getType: (t: string) => FieldTypes.String | FieldTypes.Numb
7
9
  * Returns a sentence to describe a Filter
8
10
  */
9
11
  export declare function filterSentence(filter: Filter): string;
12
+ /**
13
+ * Function that flattens a tree of filters into an array
14
+ */
15
+ export declare function generateFilterStack(filterTree: any): FilterTreeNode[];
16
+ /**
17
+ * Given an array of Filters (presumed to be in in-order state), generate
18
+ * the corresponding Filter tree. Essentially the reverse of what traverseTree does
19
+ */
20
+ export declare function filterStackToFilterTree(stack: any[]): FilterTreeNode | null;
21
+ /**
22
+ * This function uses the baseAst and forms a SQL query using the a filters array
23
+ */
24
+ export declare function buildQueryFromFilters(baseAst: any, filters: FilterTreeNode[], endpoint: string, client: any): Promise<{
25
+ success: boolean;
26
+ query?: string;
27
+ error?: string;
28
+ }>;
29
+ /**
30
+ * Helper function that converts a UniqueValuesByColumn interface to a string map
31
+ */
32
+ export declare function uniqueValuesToStringMap(uniqueValues: UniqueValuesByColumn): {
33
+ [key: string]: string[];
34
+ };
10
35
  //# sourceMappingURL=filterProcessing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filterProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/filterProcessing.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,UAAU,EACV,MAAM,EAEP,MAAM,kBAAkB,CAAC;AAG1B,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAoB5D;AAMD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,GAAG,OAkBnD;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,GAAG,EACX,KAAK,GAAE,GAAU,EACjB,UAAU,GAAE,GAAU,OAuGvB;AAGD,eAAO,MAAM,OAAO,MAAO,MAAM,iFAwDhC,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAwBrD"}
1
+ {"version":3,"file":"filterProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/filterProcessing.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,UAAU,EACV,MAAM,EAEP,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAmB,MAAM,uBAAuB,CAAC;AAGxE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAoB5D;AAMD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,GAAG,OAkBnD;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,GAAG,EACX,KAAK,GAAE,GAAU,EACjB,UAAU,GAAE,GAAU,OAuGvB;AAGD,eAAO,MAAM,OAAO,MAAO,MAAM,iFAwDhC,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAwBrD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,GAAG,GAAG,cAAc,EAAE,CAoCrE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,GAAG,EAAE,yBAgCnD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE,cAAc,EAAE,EACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,GAAG,GACV,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B/D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,oBAAoB,GAAG;IAC3E,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACzB,CASA"}
@@ -1,5 +1,6 @@
1
1
  import { COMPARISON_RANGE, PRIMARY_RANGE, defaultOptionsV2, getRangeFromPresetOptions, } from '../DateRangePicker/dateRangePickerUtils';
2
2
  import { DateOperator, FieldTypes, FilterNames, } from '../models/Filter';
3
+ import { filterTreeToAst } from './astFilterProcessing';
3
4
  import { snakeAndCamelCaseToTitleCase } from './textProcessing';
4
5
  export function findAndProcessDateFilter(filters) {
5
6
  let dateFilter = filters.find((filter) => filter.filterType === 'date_range');
@@ -230,3 +231,118 @@ export function filterSentence(filter) {
230
231
  }
231
232
  return `${snakeAndCamelCaseToTitleCase(filter.field)} ${filter.operator}${filter.operator === 'is' || filter.operator === 'is not' ? ' one of' : ''} ${value}`;
232
233
  }
234
+ /**
235
+ * Function that flattens a tree of filters into an array
236
+ */
237
+ export function generateFilterStack(filterTree) {
238
+ if (!filterTree) {
239
+ return [];
240
+ }
241
+ const tree = filterTree;
242
+ let filterStack = [];
243
+ /**
244
+ * Function that takes in a FilterTree and flattens it into an array using in order traversal
245
+ */
246
+ function traverseTree(node) {
247
+ if (!node) {
248
+ return;
249
+ }
250
+ if (node.leaf) {
251
+ filterStack.push(node);
252
+ }
253
+ else {
254
+ traverseTree(node.leftNode);
255
+ filterStack.push(node);
256
+ traverseTree(node.rightNode);
257
+ }
258
+ }
259
+ traverseTree(tree);
260
+ // Remove null (invalid) filters from filter stack
261
+ filterStack = filterStack.filter((filter) => {
262
+ return ((!filter.leaf &&
263
+ filter.rightNode &&
264
+ (!filter.rightNode.leaf || filter.rightNode.value)) ||
265
+ (filter.leaf && filter.value));
266
+ });
267
+ return filterStack;
268
+ }
269
+ /**
270
+ * Given an array of Filters (presumed to be in in-order state), generate
271
+ * the corresponding Filter tree. Essentially the reverse of what traverseTree does
272
+ */
273
+ export function filterStackToFilterTree(stack) {
274
+ function buildTree(i) {
275
+ const newNode = {
276
+ leaf: false,
277
+ operator: null,
278
+ leftNode: null,
279
+ rightNode: null,
280
+ };
281
+ if (i >= stack.length) {
282
+ return null;
283
+ }
284
+ else if (stack[i].leaf) {
285
+ if (i < stack.length - 1) {
286
+ // more nodes later
287
+ newNode.operator = stack[i + 1].operator;
288
+ newNode.leftNode = {
289
+ leaf: true,
290
+ leftNode: null,
291
+ rightNode: null,
292
+ operator: null,
293
+ value: stack[i].value,
294
+ };
295
+ newNode.rightNode = buildTree(i + 2);
296
+ }
297
+ else {
298
+ newNode.leaf = true;
299
+ newNode.value = stack[i].value;
300
+ }
301
+ }
302
+ return newNode;
303
+ }
304
+ return buildTree(0);
305
+ }
306
+ /**
307
+ * This function uses the baseAst and forms a SQL query using the a filters array
308
+ */
309
+ export async function buildQueryFromFilters(baseAst, filters, endpoint, client) {
310
+ const subTree = filterStackToFilterTree(filters);
311
+ let whereNode = null;
312
+ if (subTree) {
313
+ whereNode = filterTreeToAst(subTree, client.databaseType.toLowerCase());
314
+ }
315
+ const queryAst = { ...baseAst, where: whereNode };
316
+ try {
317
+ const response = await fetch(`${endpoint}/sqlify`, {
318
+ method: 'POST',
319
+ headers: {
320
+ 'Content-Type': 'application/json',
321
+ },
322
+ body: JSON.stringify({
323
+ ast: queryAst,
324
+ publicKey: client.publicKey,
325
+ useNewNodeSql: true,
326
+ }),
327
+ });
328
+ const data = await response.json();
329
+ const query = data.query;
330
+ return { success: true, query };
331
+ }
332
+ catch (error) {
333
+ return { success: false, error: `error: ${error.message}` };
334
+ }
335
+ }
336
+ /**
337
+ * Helper function that converts a UniqueValuesByColumn interface to a string map
338
+ */
339
+ export function uniqueValuesToStringMap(uniqueValues) {
340
+ const fieldValues = {};
341
+ for (const field of Object.keys(uniqueValues)) {
342
+ fieldValues[field] = [];
343
+ for (const value of Object.keys(uniqueValues[field] ?? {})) {
344
+ fieldValues[field].push(value);
345
+ }
346
+ }
347
+ return fieldValues;
348
+ }
@@ -1,7 +1,7 @@
1
1
  export const DEFAULT_PAGINATION = {
2
2
  page: 0,
3
- rowsPerPage: 20,
4
- rowsPerRequest: 500,
3
+ rowsPerPage: 10,
4
+ rowsPerRequest: 1000,
5
5
  };
6
6
  export function shouldFetchMore(pagination, page, maxPage) {
7
7
  if (!pagination) {
@@ -1 +1 @@
1
- {"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,GAAG,EAChB,eAAe,CAAC,EAAE,GAAG;;;eAmMtB"}
1
+ {"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,GAAG,EAChB,eAAe,CAAC,EAAE,GAAG;;;eAuMtB"}
@@ -53,8 +53,11 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
53
53
  };
54
54
  const cloudBody = { ...hostedBody };
55
55
  const resp = await getData(client, 'query', 'same-origin', hostedBody, cloudBody, 'POST', 'fetch-pivot');
56
+ if (resp.success === false) {
57
+ console.error('Error:', resp.errorMessage); // surface to devs
58
+ }
56
59
  // With our current design we have to remove the second row field but leave the first for comparison purposes.
57
- const rows = resp.queryResults[0].rows;
60
+ const rows = resp?.queryResults?.[0]?.rows || [];
58
61
  if (pivot.columnField &&
59
62
  client.databaseType?.toLowerCase() === 'bigquery') {
60
63
  rows.forEach((row) => {
@@ -67,8 +70,8 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
67
70
  });
68
71
  });
69
72
  }
70
- const columns = resp.queryResults[0].fields
71
- .map((field) => ({
73
+ const columns = resp?.queryResults?.[0]?.fields
74
+ ?.map((field) => ({
72
75
  field: processColumnName(field.name),
73
76
  label: snakeCaseToTitleCase(processColumnName(field.name.replace('comparison_', 'comparison '))),
74
77
  format: field.name === pivot.rowField
@@ -140,8 +143,9 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
140
143
  });
141
144
  }
142
145
  // for the case of count agg on no value field
143
- columns.forEach((column) => {
144
- if (['null', 'undefined'].includes(column.label.toLowerCase()) &&
146
+ columns?.forEach((column) => {
147
+ if (column.label &&
148
+ ['null', 'undefined'].includes(column.label.toLowerCase()) &&
145
149
  !pivot.valueField &&
146
150
  pivot.aggregationType === 'count') {
147
151
  column.label = 'Count';
@@ -149,7 +153,7 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
149
153
  });
150
154
  return {
151
155
  rows: rows,
152
- columns: columns,
156
+ columns: columns ?? [],
153
157
  };
154
158
  }
155
159
  }
@@ -1,5 +1,6 @@
1
1
  import { Pivot } from '../models/Pivot';
2
2
  export declare function processColumnReference(column: string, databaseType: string, fallbackOnNull?: string, isPivotFieldAlias?: boolean): string;
3
+ export declare function replaceSpacesWithUnderscores(column: string): string;
3
4
  export declare function generateCountQuery(fields: string[], query: string, databaseType: string): string;
4
5
  export declare function generateDistinctQuery(stringFields: string[], query: string, databaseType: string): string;
5
6
  export declare function generateMinMaxRangeQueries(columnFields: string[], query: string, databaseType: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAmBxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,EAEvB,iBAAiB,CAAC,EAAE,OAAO,UA+B5B;AAgDD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAUrB;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAUrB;AAsDD,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAcrB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EACpB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAyBpB"}
1
+ {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAmBxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,EAEvB,iBAAiB,CAAC,EAAE,OAAO,UAmC5B;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,UAE1D;AAwDD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAmBrB;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAUrB;AAsDD,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAcrB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EACpB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAyBpB"}
@@ -37,6 +37,10 @@ isPivotFieldAlias) {
37
37
  if (column === '' && fallbackOnNull) {
38
38
  return `${fallbackOnNull}`;
39
39
  }
40
+ // Wrap in single quotes if contains whitespace or special characters and no single quotes
41
+ if (column.match(/[^a-zA-Z0-9_]/) && !column.includes("'")) {
42
+ return `'${column}'`;
43
+ }
40
44
  return `${column}`;
41
45
  }
42
46
  const columnParts = column.split('.');
@@ -45,23 +49,35 @@ isPivotFieldAlias) {
45
49
  }
46
50
  return `\`${replaceBigQuerySpecialCharacters(column)}\``;
47
51
  }
52
+ export function replaceSpacesWithUnderscores(column) {
53
+ return column.replaceAll(' ', '_');
54
+ }
48
55
  function processInterval(interval, rowField, databaseType) {
49
56
  if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
50
57
  return `(${processColumnReference(rowField, databaseType)} + INTERVAL '${interval}')`;
51
58
  }
59
+ else if (databaseType.toLowerCase() === 'mysql') {
60
+ return `(${processColumnReference(rowField, databaseType)} + INTERVAL ${interval})`;
61
+ }
52
62
  return `TIMESTAMP_ADD(${processColumnReference(rowField, databaseType)}, INTERVAL ${interval} )`;
53
63
  }
54
64
  function processDateTrunc(dateBucket, rowField, databaseType, comparisonInterval) {
55
65
  if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
56
- const date = comparisonInterval
66
+ const dateField = comparisonInterval
67
+ ? processInterval(comparisonInterval, rowField, databaseType)
68
+ : processColumnReference(rowField, databaseType);
69
+ return `date_trunc('${dateBucket}', ${dateField})`;
70
+ }
71
+ if (['mysql'].includes(databaseType.toLowerCase())) {
72
+ const dateField = comparisonInterval
57
73
  ? processInterval(comparisonInterval, rowField, databaseType)
58
74
  : processColumnReference(rowField, databaseType);
59
- return `date_trunc('${dateBucket}', ${date})`;
75
+ return `extract(${dateBucket} from ${dateField})`;
60
76
  }
61
- const date = comparisonInterval
77
+ const dateField = comparisonInterval
62
78
  ? processInterval(comparisonInterval, rowField, databaseType)
63
79
  : processColumnReference(rowField, databaseType);
64
- return `TIMESTAMP_TRUNC(${date}, ${dateBucket})`;
80
+ return `TIMESTAMP_TRUNC(${dateField}, ${dateBucket})`;
65
81
  }
66
82
  function processValueField(aggType, databaseType, valueField) {
67
83
  if (aggType === 'min' ||
@@ -75,9 +91,18 @@ function processValueField(aggType, databaseType, valueField) {
75
91
  : `1 ELSE 0`;
76
92
  }
77
93
  export function generateCountQuery(fields, query, databaseType) {
78
- const countQuery = fields.map((field) => {
79
- return `SELECT '${field}' AS ${processColumnReference('field', databaseType)}, COUNT(DISTINCT ${processColumnReference(field, databaseType)}) AS ${processColumnReference('count', databaseType)} FROM querytable`;
80
- });
94
+ let countQuery = [];
95
+ switch (databaseType.toLowerCase()) {
96
+ case 'mysql':
97
+ countQuery = fields.map((field) => {
98
+ return `SELECT '${field}' AS ${processColumnReference('field', databaseType)}, COUNT(DISTINCT ${processColumnReference(field, databaseType)}) AS ${processColumnReference('count', databaseType)} FROM querytable`;
99
+ });
100
+ break;
101
+ default:
102
+ countQuery = fields.map((field) => {
103
+ return `SELECT '${field}' AS ${processColumnReference('field', databaseType)}, COUNT(DISTINCT ${processColumnReference(field, databaseType)}) AS ${processColumnReference('count', databaseType)} FROM querytable`;
104
+ });
105
+ }
81
106
  return (`WITH querytable AS (${query.replace(';', '')}) ` +
82
107
  countQuery.join(' UNION ALL '));
83
108
  }
@@ -117,15 +142,15 @@ function generateDistinctQueryMySQL(stringFields, query) {
117
142
  const distinctQueries = stringFields.map((field) => {
118
143
  return `
119
144
  SELECT '${field}' AS ${processColumnReference('field', 'mysql')},
120
- JSON_ARRAYAGG(${field}) AS ${processColumnReference('string_values', 'mysql')}
121
- FROM (SELECT DISTINCT ${field} FROM querytable) AS distinct_${field}`;
145
+ JSON_ARRAYAGG(\`${field}\`) AS ${processColumnReference('string_values', 'mysql')}
146
+ FROM (SELECT DISTINCT \`${field}\` FROM querytable) AS distinct_${replaceSpacesWithUnderscores(field)}`;
122
147
  });
123
148
  const distinctQuery = distinctQueries.join(' UNION ALL ');
124
149
  return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
125
150
  }
126
151
  function generateDistinctQueryPostgres(stringFields, query) {
127
152
  const distinctQueries = stringFields.map((field) => {
128
- return `SELECT '${field}' AS ${processColumnReference('field', 'postgresql')}, ARRAY_AGG(DISTINCT ${field}) AS ${processColumnReference('string_values', 'postgresql')} FROM querytable`;
153
+ return `SELECT '${field}' AS ${processColumnReference('field', 'postgresql')}, to_json(ARRAY_AGG(DISTINCT ${field})) AS ${processColumnReference('string_values', 'postgresql')} FROM querytable`;
129
154
  });
130
155
  const distinctQuery = distinctQueries.join(' UNION ALL ');
131
156
  return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
@@ -27,6 +27,11 @@ export declare function fetchReport(reportId: string, client: Client, useReportT
27
27
  report: QuillReportInternal;
28
28
  error?: string;
29
29
  }>;
30
+ export declare function saveReport({ report, dashboardItemId, client, }: {
31
+ report: any;
32
+ dashboardItemId?: string;
33
+ client: Client;
34
+ }): Promise<any>;
30
35
  export declare const formatRowsFromReport: (report: any) => any;
31
36
  export declare function convertInternalReportToReport(report: QuillReportInternal): QuillReport;
32
37
  export declare const fetchReportBuilderDataFromAST: (baseAst: any, formData: any, schema: Table[], client: Client, pivot?: Pivot, previousFormData?: any, currentTable?: string, previousRelevant?: {
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/utils/report.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,KAAK,EACL,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAa1B,OAAO,EACL,oBAAoB,EAGrB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,OAAO,EAAE,cAAc,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7D,aAAa,EAAE,GAAG,EAAE,CAAC;IACrB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,mBAAmB,CAAC;IAClC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,WAkB1B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,mBAGnC,CAAC;AA0BF,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,aAAa,UAAO,EACpB,OAAO,GAAE,GAAG,EAAO,EACnB,oBAAoB,CAAC,EAAE,oBAAoB,EAC3C,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,GAAG,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0G1D;AAED,eAAO,MAAM,oBAAoB,WAAY,GAAG,QAkB/C,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,mBAAmB,GAC1B,WAAW,CAsDb;AAED,eAAO,MAAM,6BAA6B,YAC/B,GAAG,YACF,GAAG,UACL,KAAK,EAAE,UACP,MAAM,UACN,KAAK,qBACM,GAAG,iBACP,MAAM,qBACF;IACjB,aAAa,EAAE,mBAAmB,CAAC;IACnC,UAAU,EAAE,kBAAkB,CAAC;CAChC,WACQ,mBAAmB,iBACb,GAAG,KACjB,QAAQ,iBAAiB,CAqI3B,CAAC"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/utils/report.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,KAAK,EACL,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAa1B,OAAO,EACL,oBAAoB,EAGrB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,OAAO,EAAE,cAAc,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7D,aAAa,EAAE,GAAG,EAAE,CAAC;IACrB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,mBAAmB,CAAC;IAClC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,WAkB1B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,mBAGnC,CAAC;AA2BF,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,aAAa,UAAO,EACpB,OAAO,GAAE,GAAG,EAAO,EACnB,oBAAoB,CAAC,EAAE,oBAAoB,EAC3C,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,GAAG,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA4H1D;AAED,wBAAsB,UAAU,CAAC,EAC/B,MAAM,EACN,eAAe,EACf,MAAM,GACP,EAAE;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,GAAG,CAAC,CA4Cf;AAED,eAAO,MAAM,oBAAoB,WAAY,GAAG,QAkB/C,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,mBAAmB,GAC1B,WAAW,CAsDb;AAED,eAAO,MAAM,6BAA6B,YAC/B,GAAG,YACF,GAAG,UACL,KAAK,EAAE,UACP,MAAM,UACN,KAAK,qBACM,GAAG,iBACP,MAAM,qBACF;IACjB,aAAa,EAAE,mBAAmB,CAAC;IACnC,UAAU,EAAE,kBAAkB,CAAC;CAChC,WACQ,mBAAmB,iBACb,GAAG,KACjB,QAAQ,iBAAiB,CAyI3B,CAAC"}