@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
@@ -5,7 +5,7 @@ const ast_1 = require("../components/ReportBuilder/ast");
5
5
  const convert_1 = require("../components/ReportBuilder/convert");
6
6
  const util_1 = require("../components/ReportBuilder/util");
7
7
  const constants_1 = require("./constants");
8
- const schema_1 = require("./schema");
8
+ const tableProcessing_1 = require("./tableProcessing");
9
9
  function getSelectFromAST(ast) {
10
10
  if (Array.isArray(ast)) {
11
11
  return ast[0];
@@ -246,12 +246,15 @@ function getColumnsByTableFromASTAndSchema(ast, tables, tableAliasMap) {
246
246
  const tableInfo = tables.find((tableInfo) => tableInfo.name === table);
247
247
  if (!tableInfo)
248
248
  continue;
249
- const columnNames = tableInfo.columns.map((column) => column.name);
249
+ const columnNames = tableInfo.columns.map((column) => column.field);
250
250
  if (columnNames.includes(column.value)) {
251
251
  tableName = table;
252
252
  break;
253
253
  }
254
254
  }
255
+ if (tableName === '') {
256
+ return;
257
+ }
255
258
  if (!referencedColumns[tableName]) {
256
259
  referencedColumns[tableName] = [];
257
260
  }
@@ -400,8 +403,9 @@ const fetchAndProcessASTFromPrompt = async (aiPrompt, schema, client, prevPivot,
400
403
  if (!tableInfo) {
401
404
  throw new Error('Table info not found');
402
405
  }
406
+ const uniqueValues = await (0, tableProcessing_1.getUniqueStringValues)(tableInfo.columns, processedName, client);
403
407
  newAst = (0, convert_1.convertUnaryToBinary)(newAst);
404
- newAst = (0, util_1.removeNonSelectedTableReferences)(newAst, processedName, tableInfo.columns.map((col) => col.field));
408
+ newAst = (0, util_1.removeNonSelectedTableReferences)(newAst, processedName, tableInfo.columns.map((col) => col.field), uniqueValues);
405
409
  if (pivot) {
406
410
  newAst = (0, util_1.deepCopy)({ ...newAst, orderby: null, limit: null });
407
411
  }
@@ -455,14 +459,10 @@ const fetchASTFromQuillReport = async (report, client, schema) => {
455
459
  convertedAst = (0, convert_1.convertWildcardColumns)(convertedAst, schema); // must go before groupby
456
460
  convertedAst = (0, convert_1.convertBigQuery)(convertedAst);
457
461
  schemaInfo = schema;
458
- if (!schemaInfo) {
459
- const { schemaData } = await (0, schema_1.getSchemaInfoWithCustomFields)(client, 'rb');
460
- schemaInfo = schemaData;
461
- }
462
462
  processApostrophe(convertedAst, ['type', 'value']);
463
463
  convertedAst = (0, convert_1.convertBigQuery)(convertedAst);
464
464
  ({ ast: newAst, pivot: groupByPivot } = (0, convert_1.convertGroupBy)(convertedAst, schemaInfo, report.pivot ? report.pivot : undefined));
465
- newAst = groupByPivot ? newAst : convertedAst;
465
+ newAst = convertedAst;
466
466
  }
467
467
  catch (e) {
468
468
  console.log(e);
@@ -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"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.fetchClient = exports.EMPTY_CLIENT = void 0;
4
4
  exports.EMPTY_CLIENT = {
5
+ name: '',
5
6
  customerId: '',
6
7
  clientId: '',
7
8
  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"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getYAxisFields = exports.processColumnName = exports.convertFormatToJsType = exports.convertFieldTypeToJSType = exports.convertColumnInfoToColumnInternal = exports.convertPostgresColumn = void 0;
4
4
  const filterProcessing_1 = require("./filterProcessing");
5
+ const textProcessing_1 = require("./textProcessing");
5
6
  function removeBigQuerySpecialChars(columnName) {
6
7
  return columnName.replaceAll('quill_forward_slash', '/');
7
8
  }
@@ -29,8 +30,12 @@ function convertPostgresColumn(field) {
29
30
  case 1114: // timestamp
30
31
  format = 'MMM_dd_yyyy';
31
32
  break;
33
+ case 114: // json
34
+ case 199: // json[]
32
35
  case 1186: // interval
33
36
  case 1043: // varchar
37
+ case 3802: // jsonb
38
+ case 3807: // jsonb[]
34
39
  default:
35
40
  format = 'string';
36
41
  }
@@ -47,6 +52,12 @@ function convertPostgresColumn(field) {
47
52
  case 23: // int4
48
53
  fieldType = 'int4';
49
54
  break;
55
+ case 114: // json
56
+ fieldType = 'json';
57
+ break;
58
+ case 199: // json[]
59
+ fieldType = 'json[]';
60
+ break;
50
61
  case 700: // float4
51
62
  fieldType = 'float4';
52
63
  break;
@@ -71,6 +82,18 @@ function convertPostgresColumn(field) {
71
82
  case 1114: // timestamp
72
83
  fieldType = 'timestamp';
73
84
  break;
85
+ case 2950: // uuid
86
+ fieldType = 'uuid';
87
+ break;
88
+ case 2951: // uuid[]
89
+ fieldType = 'uuid[]';
90
+ break;
91
+ case 3802: // jsonb
92
+ fieldType = 'jsonb';
93
+ break;
94
+ case 3807: // jsonb[]
95
+ fieldType = 'jsonb[]';
96
+ break;
74
97
  case 1043: // varchar
75
98
  default:
76
99
  fieldType = 'varchar';
@@ -87,6 +110,14 @@ function convertPostgresColumn(field) {
87
110
  case 1700: // numeric
88
111
  jsType = 'number';
89
112
  break;
113
+ case 114: // json
114
+ case 3802: // jsonb
115
+ jsType = 'object';
116
+ break;
117
+ case 199:
118
+ case 3807:
119
+ jsType = 'object[]';
120
+ break;
90
121
  case 1082: // date
91
122
  case 1083: // time
92
123
  case 1184: // timestamptz
@@ -95,11 +126,19 @@ function convertPostgresColumn(field) {
95
126
  jsType = 'date';
96
127
  break;
97
128
  case 1043: // varchar
129
+ case 2950: // uuid
130
+ jsType = 'string';
131
+ break;
132
+ case 2951: // uuid[]
133
+ jsType = 'string[]';
134
+ break;
98
135
  default:
99
136
  jsType = 'string';
100
137
  }
101
138
  return {
102
- label: 'field' in field ? field.field : field.name,
139
+ label: 'field' in field
140
+ ? (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field.field)
141
+ : (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field.name),
103
142
  field: 'field' in field ? field.field : field.name,
104
143
  format,
105
144
  fieldType,
@@ -152,6 +191,10 @@ function fieldTypeToDataTypeID(fieldType) {
152
191
  return 21;
153
192
  case 'int4':
154
193
  return 23;
194
+ case 'json':
195
+ return 114;
196
+ case 'json[]':
197
+ return 199;
155
198
  case 'float4':
156
199
  return 700;
157
200
  case 'float8':
@@ -168,33 +211,73 @@ function fieldTypeToDataTypeID(fieldType) {
168
211
  return 1114;
169
212
  case 'interval':
170
213
  return 1186;
214
+ case 'uuid':
215
+ return 2950;
216
+ case 'uuid[]':
217
+ return 2951;
218
+ case 'jsonb':
219
+ return 3802;
220
+ case 'jsonb[]':
221
+ return 3807;
171
222
  case 'varchar':
172
223
  default:
173
224
  return 1043;
174
225
  }
175
226
  }
176
227
  function convertFieldTypeToJSType(fieldType) {
228
+ let jsType = '';
177
229
  switch (fieldType) {
178
230
  case 'bool':
179
- return 'bool';
231
+ jsType = 'bool';
232
+ break;
180
233
  case 'int8':
181
234
  case 'int2':
182
235
  case 'int4':
183
236
  case 'float4':
184
237
  case 'float8':
185
238
  case 'numeric':
186
- return 'number';
239
+ jsType = 'number';
240
+ break;
187
241
  case 'date':
188
242
  case 'time':
189
243
  case 'timestamptz':
190
244
  case 'timestamp':
191
- return 'date';
245
+ jsType = 'date';
246
+ break;
247
+ case 'json':
248
+ case 'jsonb':
249
+ case 'json[]':
250
+ case 'jsonb[]':
251
+ case 'int2[]':
252
+ case 'int4[]':
253
+ case 'int8[]':
254
+ case 'float4[]':
255
+ case 'float8[]':
256
+ case 'text[]':
257
+ case 'char[]':
258
+ case 'bool[]':
259
+ case 'uuid[]':
260
+ case 'varchar[]':
261
+ case 'interval[]':
262
+ case 'numeric[]':
263
+ case 'bytea[]':
264
+ case 'cidr[]':
265
+ case 'inet[]':
266
+ case 'macaddr[]':
267
+ case 'date[]':
268
+ case 'timestamp[]':
269
+ case 'timestamptz[]':
270
+ case 'timetz[]':
271
+ jsType = 'object';
272
+ break;
192
273
  case 'interval':
193
274
  case 'varchar':
194
275
  case 'text':
276
+ case 'uuid':
195
277
  default:
196
- return 'string';
278
+ jsType = 'string';
197
279
  }
280
+ return jsType;
198
281
  }
199
282
  exports.convertFieldTypeToJSType = convertFieldTypeToJSType;
200
283
  function convertFormatToJsType(column) {
@@ -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"}
@@ -57,7 +57,7 @@ async function testSqlViewState(hostedRequestBody, client, referencedTables) {
57
57
  },
58
58
  };
59
59
  getData(client, 'test-view', 'same-origin', brokenBody, cloudBody);
60
- errorMessage = `SQL View Error: '${table}' is out of sync with datasource.`;
60
+ errorMessage = `Virtual Table Error: '${table}' is out of sync with datasource.`;
61
61
  }
62
62
  }));
63
63
  return errorMessage;
@@ -86,18 +86,22 @@ async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cl
86
86
  ['query', 'patterns', 'item'].includes(hostedRequestBody.metadata.task)) {
87
87
  const brokenReport = { ...responseJson };
88
88
  let errorPrefix = 'Error: ';
89
- let errorMessage = 'Failed to fetch chart';
89
+ let errorMessage = 'Failed to fetch report: ' + responseJson.error;
90
90
  if (hostedRequestBody.metadata.task === 'query' ||
91
91
  hostedRequestBody.metadata.task === 'patterns') {
92
92
  errorPrefix = 'SQL Error: ';
93
93
  errorMessage = errorPrefix + responseJson.error;
94
94
  }
95
+ else if (responseJson.error?.includes('Virtual Table Error')) {
96
+ errorMessage = responseJson.error;
97
+ }
95
98
  let adminErrorMessage = undefined;
96
99
  const processedData = fetchQuillData(brokenReport);
97
100
  if (processedData &&
98
101
  processedData.data &&
99
102
  processedData.data.referencedTables) {
100
- adminErrorMessage = await testSqlViewState(hostedRequestBody, client, processedData.data.referencedTables);
103
+ adminErrorMessage =
104
+ (await testSqlViewState(hostedRequestBody, client, processedData.data.referencedTables)) ?? undefined;
101
105
  }
102
106
  return {
103
107
  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,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.filterSentence = exports.getType = exports.updateFilter = exports.processFilterFromBackend = exports.findAndProcessDateFilter = void 0;
3
+ exports.uniqueValuesToStringMap = exports.buildQueryFromFilters = exports.filterStackToFilterTree = exports.generateFilterStack = exports.filterSentence = exports.getType = exports.updateFilter = exports.processFilterFromBackend = exports.findAndProcessDateFilter = void 0;
4
4
  const dateRangePickerUtils_1 = require("../DateRangePicker/dateRangePickerUtils");
5
5
  const Filter_1 = require("../models/Filter");
6
+ const astFilterProcessing_1 = require("./astFilterProcessing");
6
7
  const textProcessing_1 = require("./textProcessing");
7
8
  function findAndProcessDateFilter(filters) {
8
9
  let dateFilter = filters.find((filter) => filter.filterType === 'date_range');
@@ -238,3 +239,122 @@ function filterSentence(filter) {
238
239
  return `${(0, textProcessing_1.snakeAndCamelCaseToTitleCase)(filter.field)} ${filter.operator}${filter.operator === 'is' || filter.operator === 'is not' ? ' one of' : ''} ${value}`;
239
240
  }
240
241
  exports.filterSentence = filterSentence;
242
+ /**
243
+ * Function that flattens a tree of filters into an array
244
+ */
245
+ function generateFilterStack(filterTree) {
246
+ if (!filterTree) {
247
+ return [];
248
+ }
249
+ const tree = filterTree;
250
+ let filterStack = [];
251
+ /**
252
+ * Function that takes in a FilterTree and flattens it into an array using in order traversal
253
+ */
254
+ function traverseTree(node) {
255
+ if (!node) {
256
+ return;
257
+ }
258
+ if (node.leaf) {
259
+ filterStack.push(node);
260
+ }
261
+ else {
262
+ traverseTree(node.leftNode);
263
+ filterStack.push(node);
264
+ traverseTree(node.rightNode);
265
+ }
266
+ }
267
+ traverseTree(tree);
268
+ // Remove null (invalid) filters from filter stack
269
+ filterStack = filterStack.filter((filter) => {
270
+ return ((!filter.leaf &&
271
+ filter.rightNode &&
272
+ (!filter.rightNode.leaf || filter.rightNode.value)) ||
273
+ (filter.leaf && filter.value));
274
+ });
275
+ return filterStack;
276
+ }
277
+ exports.generateFilterStack = generateFilterStack;
278
+ /**
279
+ * Given an array of Filters (presumed to be in in-order state), generate
280
+ * the corresponding Filter tree. Essentially the reverse of what traverseTree does
281
+ */
282
+ function filterStackToFilterTree(stack) {
283
+ function buildTree(i) {
284
+ const newNode = {
285
+ leaf: false,
286
+ operator: null,
287
+ leftNode: null,
288
+ rightNode: null,
289
+ };
290
+ if (i >= stack.length) {
291
+ return null;
292
+ }
293
+ else if (stack[i].leaf) {
294
+ if (i < stack.length - 1) {
295
+ // more nodes later
296
+ newNode.operator = stack[i + 1].operator;
297
+ newNode.leftNode = {
298
+ leaf: true,
299
+ leftNode: null,
300
+ rightNode: null,
301
+ operator: null,
302
+ value: stack[i].value,
303
+ };
304
+ newNode.rightNode = buildTree(i + 2);
305
+ }
306
+ else {
307
+ newNode.leaf = true;
308
+ newNode.value = stack[i].value;
309
+ }
310
+ }
311
+ return newNode;
312
+ }
313
+ return buildTree(0);
314
+ }
315
+ exports.filterStackToFilterTree = filterStackToFilterTree;
316
+ /**
317
+ * This function uses the baseAst and forms a SQL query using the a filters array
318
+ */
319
+ async function buildQueryFromFilters(baseAst, filters, endpoint, client) {
320
+ const subTree = filterStackToFilterTree(filters);
321
+ let whereNode = null;
322
+ if (subTree) {
323
+ whereNode = (0, astFilterProcessing_1.filterTreeToAst)(subTree, client.databaseType.toLowerCase());
324
+ }
325
+ const queryAst = { ...baseAst, where: whereNode };
326
+ try {
327
+ const response = await fetch(`${endpoint}/sqlify`, {
328
+ method: 'POST',
329
+ headers: {
330
+ 'Content-Type': 'application/json',
331
+ },
332
+ body: JSON.stringify({
333
+ ast: queryAst,
334
+ publicKey: client.publicKey,
335
+ useNewNodeSql: true,
336
+ }),
337
+ });
338
+ const data = await response.json();
339
+ const query = data.query;
340
+ return { success: true, query };
341
+ }
342
+ catch (error) {
343
+ return { success: false, error: `error: ${error.message}` };
344
+ }
345
+ }
346
+ exports.buildQueryFromFilters = buildQueryFromFilters;
347
+ /**
348
+ * Helper function that converts a UniqueValuesByColumn interface to a string map
349
+ */
350
+ function uniqueValuesToStringMap(uniqueValues) {
351
+ const fieldValues = {};
352
+ for (const field of Object.keys(uniqueValues)) {
353
+ fieldValues[field] = [];
354
+ for (const value of Object.keys(uniqueValues[field] ?? {})) {
355
+ fieldValues[field].push(value);
356
+ }
357
+ }
358
+ return fieldValues;
359
+ }
360
+ exports.uniqueValuesToStringMap = uniqueValuesToStringMap;
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.shouldSortInMemory = exports.shouldFetchMore = exports.DEFAULT_PAGINATION = void 0;
4
4
  exports.DEFAULT_PAGINATION = {
5
5
  page: 0,
6
- rowsPerPage: 20,
7
- rowsPerRequest: 500,
6
+ rowsPerPage: 10,
7
+ rowsPerRequest: 1000,
8
8
  };
9
9
  function shouldFetchMore(pagination, page, maxPage) {
10
10
  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"}
@@ -56,8 +56,11 @@ async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilte
56
56
  };
57
57
  const cloudBody = { ...hostedBody };
58
58
  const resp = await (0, dataFetcher_1.getData)(client, 'query', 'same-origin', hostedBody, cloudBody, 'POST', 'fetch-pivot');
59
+ if (resp.success === false) {
60
+ console.error('Error:', resp.errorMessage); // surface to devs
61
+ }
59
62
  // With our current design we have to remove the second row field but leave the first for comparison purposes.
60
- const rows = resp.queryResults[0].rows;
63
+ const rows = resp?.queryResults?.[0]?.rows || [];
61
64
  if (pivot.columnField &&
62
65
  client.databaseType?.toLowerCase() === 'bigquery') {
63
66
  rows.forEach((row) => {
@@ -70,8 +73,8 @@ async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilte
70
73
  });
71
74
  });
72
75
  }
73
- const columns = resp.queryResults[0].fields
74
- .map((field) => ({
76
+ const columns = resp?.queryResults?.[0]?.fields
77
+ ?.map((field) => ({
75
78
  field: (0, columnProcessing_1.processColumnName)(field.name),
76
79
  label: (0, textProcessing_1.snakeCaseToTitleCase)((0, columnProcessing_1.processColumnName)(field.name.replace('comparison_', 'comparison '))),
77
80
  format: field.name === pivot.rowField
@@ -143,8 +146,9 @@ async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilte
143
146
  });
144
147
  }
145
148
  // for the case of count agg on no value field
146
- columns.forEach((column) => {
147
- if (['null', 'undefined'].includes(column.label.toLowerCase()) &&
149
+ columns?.forEach((column) => {
150
+ if (column.label &&
151
+ ['null', 'undefined'].includes(column.label.toLowerCase()) &&
148
152
  !pivot.valueField &&
149
153
  pivot.aggregationType === 'count') {
150
154
  column.label = 'Count';
@@ -152,7 +156,7 @@ async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilte
152
156
  });
153
157
  return {
154
158
  rows: rows,
155
- columns: columns,
159
+ columns: columns ?? [],
156
160
  };
157
161
  }
158
162
  }
@@ -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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generatePivotQuery = exports.generateMinMaxRangeQueries = exports.generateDistinctQuery = exports.generateCountQuery = exports.processColumnReference = void 0;
3
+ exports.generatePivotQuery = exports.generateMinMaxRangeQueries = exports.generateDistinctQuery = exports.generateCountQuery = exports.replaceSpacesWithUnderscores = exports.processColumnReference = void 0;
4
4
  const pivotProcessing_1 = require("./pivotProcessing");
5
5
  function processSingleQuotes(value, databaseType) {
6
6
  if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
@@ -40,6 +40,10 @@ isPivotFieldAlias) {
40
40
  if (column === '' && fallbackOnNull) {
41
41
  return `${fallbackOnNull}`;
42
42
  }
43
+ // Wrap in single quotes if contains whitespace or special characters and no single quotes
44
+ if (column.match(/[^a-zA-Z0-9_]/) && !column.includes("'")) {
45
+ return `'${column}'`;
46
+ }
43
47
  return `${column}`;
44
48
  }
45
49
  const columnParts = column.split('.');
@@ -49,23 +53,36 @@ isPivotFieldAlias) {
49
53
  return `\`${replaceBigQuerySpecialCharacters(column)}\``;
50
54
  }
51
55
  exports.processColumnReference = processColumnReference;
56
+ function replaceSpacesWithUnderscores(column) {
57
+ return column.replaceAll(' ', '_');
58
+ }
59
+ exports.replaceSpacesWithUnderscores = replaceSpacesWithUnderscores;
52
60
  function processInterval(interval, rowField, databaseType) {
53
61
  if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
54
62
  return `(${processColumnReference(rowField, databaseType)} + INTERVAL '${interval}')`;
55
63
  }
64
+ else if (databaseType.toLowerCase() === 'mysql') {
65
+ return `(${processColumnReference(rowField, databaseType)} + INTERVAL ${interval})`;
66
+ }
56
67
  return `TIMESTAMP_ADD(${processColumnReference(rowField, databaseType)}, INTERVAL ${interval} )`;
57
68
  }
58
69
  function processDateTrunc(dateBucket, rowField, databaseType, comparisonInterval) {
59
70
  if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
60
- const date = comparisonInterval
71
+ const dateField = comparisonInterval
72
+ ? processInterval(comparisonInterval, rowField, databaseType)
73
+ : processColumnReference(rowField, databaseType);
74
+ return `date_trunc('${dateBucket}', ${dateField})`;
75
+ }
76
+ if (['mysql'].includes(databaseType.toLowerCase())) {
77
+ const dateField = comparisonInterval
61
78
  ? processInterval(comparisonInterval, rowField, databaseType)
62
79
  : processColumnReference(rowField, databaseType);
63
- return `date_trunc('${dateBucket}', ${date})`;
80
+ return `extract(${dateBucket} from ${dateField})`;
64
81
  }
65
- const date = comparisonInterval
82
+ const dateField = comparisonInterval
66
83
  ? processInterval(comparisonInterval, rowField, databaseType)
67
84
  : processColumnReference(rowField, databaseType);
68
- return `TIMESTAMP_TRUNC(${date}, ${dateBucket})`;
85
+ return `TIMESTAMP_TRUNC(${dateField}, ${dateBucket})`;
69
86
  }
70
87
  function processValueField(aggType, databaseType, valueField) {
71
88
  if (aggType === 'min' ||
@@ -79,9 +96,18 @@ function processValueField(aggType, databaseType, valueField) {
79
96
  : `1 ELSE 0`;
80
97
  }
81
98
  function generateCountQuery(fields, query, databaseType) {
82
- const countQuery = fields.map((field) => {
83
- return `SELECT '${field}' AS ${processColumnReference('field', databaseType)}, COUNT(DISTINCT ${processColumnReference(field, databaseType)}) AS ${processColumnReference('count', databaseType)} FROM querytable`;
84
- });
99
+ let countQuery = [];
100
+ switch (databaseType.toLowerCase()) {
101
+ case 'mysql':
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
+ break;
106
+ default:
107
+ countQuery = fields.map((field) => {
108
+ return `SELECT '${field}' AS ${processColumnReference('field', databaseType)}, COUNT(DISTINCT ${processColumnReference(field, databaseType)}) AS ${processColumnReference('count', databaseType)} FROM querytable`;
109
+ });
110
+ }
85
111
  return (`WITH querytable AS (${query.replace(';', '')}) ` +
86
112
  countQuery.join(' UNION ALL '));
87
113
  }
@@ -123,15 +149,15 @@ function generateDistinctQueryMySQL(stringFields, query) {
123
149
  const distinctQueries = stringFields.map((field) => {
124
150
  return `
125
151
  SELECT '${field}' AS ${processColumnReference('field', 'mysql')},
126
- JSON_ARRAYAGG(${field}) AS ${processColumnReference('string_values', 'mysql')}
127
- FROM (SELECT DISTINCT ${field} FROM querytable) AS distinct_${field}`;
152
+ JSON_ARRAYAGG(\`${field}\`) AS ${processColumnReference('string_values', 'mysql')}
153
+ FROM (SELECT DISTINCT \`${field}\` FROM querytable) AS distinct_${replaceSpacesWithUnderscores(field)}`;
128
154
  });
129
155
  const distinctQuery = distinctQueries.join(' UNION ALL ');
130
156
  return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
131
157
  }
132
158
  function generateDistinctQueryPostgres(stringFields, query) {
133
159
  const distinctQueries = stringFields.map((field) => {
134
- return `SELECT '${field}' AS ${processColumnReference('field', 'postgresql')}, ARRAY_AGG(DISTINCT ${field}) AS ${processColumnReference('string_values', 'postgresql')} FROM querytable`;
160
+ return `SELECT '${field}' AS ${processColumnReference('field', 'postgresql')}, to_json(ARRAY_AGG(DISTINCT ${field})) AS ${processColumnReference('string_values', 'postgresql')} FROM querytable`;
135
161
  });
136
162
  const distinctQuery = distinctQueries.join(' UNION ALL ');
137
163
  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?: {