@quillsql/react 2.12.27 → 2.12.29

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 (155) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +40 -21
  3. package/dist/cjs/ChartBuilder.d.ts +38 -4
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +66 -25
  6. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  7. package/dist/cjs/ChartEditor.js +66 -26
  8. package/dist/cjs/Context.d.ts +1 -19
  9. package/dist/cjs/Context.d.ts.map +1 -1
  10. package/dist/cjs/Context.js +32 -83
  11. package/dist/cjs/Dashboard.d.ts +6 -1
  12. package/dist/cjs/Dashboard.d.ts.map +1 -1
  13. package/dist/cjs/Dashboard.js +79 -50
  14. package/dist/cjs/ReportBuilder.d.ts +10 -1
  15. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  16. package/dist/cjs/ReportBuilder.js +331 -99
  17. package/dist/cjs/SQLEditor.d.ts +10 -1
  18. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  19. package/dist/cjs/SQLEditor.js +122 -29
  20. package/dist/cjs/Table.d.ts.map +1 -1
  21. package/dist/cjs/Table.js +21 -11
  22. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  23. package/dist/cjs/components/Chart/ChartTooltip.js +5 -4
  24. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  25. package/dist/cjs/components/Dashboard/DataLoader.js +61 -20
  26. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  27. package/dist/cjs/components/Dashboard/MetricComponent.js +7 -1
  28. package/dist/cjs/components/Dashboard/TableComponent.d.ts +16 -2
  29. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  30. package/dist/cjs/components/Dashboard/TableComponent.js +2 -14
  31. package/dist/cjs/components/QuillTable.d.ts +2 -2
  32. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  33. package/dist/cjs/components/QuillTable.js +7 -5
  34. package/dist/cjs/components/UiComponents.d.ts +3 -3
  35. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  36. package/dist/cjs/components/UiComponents.js +4 -4
  37. package/dist/cjs/hooks/useDashboard.d.ts +1 -1
  38. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  39. package/dist/cjs/hooks/useDashboard.js +18 -4
  40. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +16 -1
  41. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  42. package/dist/cjs/internals/ReportBuilder/PivotModal.js +179 -105
  43. package/dist/cjs/utils/columnProcessing.d.ts +1 -0
  44. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
  45. package/dist/cjs/utils/columnProcessing.js +8 -1
  46. package/dist/cjs/utils/constants.d.ts +2 -0
  47. package/dist/cjs/utils/constants.d.ts.map +1 -0
  48. package/dist/cjs/utils/constants.js +4 -0
  49. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  50. package/dist/cjs/utils/dashboard.js +26 -96
  51. package/dist/cjs/utils/dataFetcher.d.ts +1 -1
  52. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  53. package/dist/cjs/utils/dataFetcher.js +63 -15
  54. package/dist/cjs/utils/dates.d.ts +9 -0
  55. package/dist/cjs/utils/dates.d.ts.map +1 -1
  56. package/dist/cjs/utils/dates.js +43 -1
  57. package/dist/cjs/utils/logging.d.ts +2 -0
  58. package/dist/cjs/utils/logging.d.ts.map +1 -0
  59. package/dist/cjs/utils/logging.js +10 -0
  60. package/dist/cjs/utils/monacoAutocomplete.d.ts +20 -0
  61. package/dist/cjs/utils/monacoAutocomplete.d.ts.map +1 -0
  62. package/dist/cjs/utils/monacoAutocomplete.js +145 -0
  63. package/dist/cjs/utils/pivotConstructor.d.ts +6 -0
  64. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -0
  65. package/dist/cjs/utils/pivotConstructor.js +140 -0
  66. package/dist/cjs/utils/queryConstructor.d.ts +5 -2
  67. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  68. package/dist/cjs/utils/queryConstructor.js +149 -53
  69. package/dist/cjs/utils/queryConstructor.uspec.d.ts +2 -0
  70. package/dist/cjs/utils/queryConstructor.uspec.d.ts.map +1 -0
  71. package/dist/cjs/utils/queryConstructor.uspec.js +225 -0
  72. package/dist/cjs/utils/tableProcessing.d.ts +23 -0
  73. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  74. package/dist/cjs/utils/tableProcessing.js +125 -2
  75. package/dist/esm/Chart.d.ts.map +1 -1
  76. package/dist/esm/Chart.js +40 -21
  77. package/dist/esm/ChartBuilder.d.ts +38 -4
  78. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  79. package/dist/esm/ChartBuilder.js +64 -24
  80. package/dist/esm/ChartEditor.d.ts.map +1 -1
  81. package/dist/esm/ChartEditor.js +66 -26
  82. package/dist/esm/Context.d.ts +1 -19
  83. package/dist/esm/Context.d.ts.map +1 -1
  84. package/dist/esm/Context.js +32 -82
  85. package/dist/esm/Dashboard.d.ts +6 -1
  86. package/dist/esm/Dashboard.d.ts.map +1 -1
  87. package/dist/esm/Dashboard.js +80 -51
  88. package/dist/esm/ReportBuilder.d.ts +10 -1
  89. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  90. package/dist/esm/ReportBuilder.js +333 -101
  91. package/dist/esm/SQLEditor.d.ts +10 -1
  92. package/dist/esm/SQLEditor.d.ts.map +1 -1
  93. package/dist/esm/SQLEditor.js +123 -30
  94. package/dist/esm/Table.d.ts.map +1 -1
  95. package/dist/esm/Table.js +21 -11
  96. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  97. package/dist/esm/components/Chart/ChartTooltip.js +5 -4
  98. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  99. package/dist/esm/components/Dashboard/DataLoader.js +61 -20
  100. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  101. package/dist/esm/components/Dashboard/MetricComponent.js +7 -1
  102. package/dist/esm/components/Dashboard/TableComponent.d.ts +16 -2
  103. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  104. package/dist/esm/components/Dashboard/TableComponent.js +2 -14
  105. package/dist/esm/components/QuillTable.d.ts +2 -2
  106. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  107. package/dist/esm/components/QuillTable.js +7 -5
  108. package/dist/esm/components/UiComponents.d.ts +3 -3
  109. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  110. package/dist/esm/components/UiComponents.js +4 -4
  111. package/dist/esm/hooks/useDashboard.d.ts +1 -1
  112. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  113. package/dist/esm/hooks/useDashboard.js +19 -5
  114. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +16 -1
  115. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  116. package/dist/esm/internals/ReportBuilder/PivotModal.js +177 -105
  117. package/dist/esm/utils/columnProcessing.d.ts +1 -0
  118. package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
  119. package/dist/esm/utils/columnProcessing.js +6 -0
  120. package/dist/esm/utils/constants.d.ts +2 -0
  121. package/dist/esm/utils/constants.d.ts.map +1 -0
  122. package/dist/esm/utils/constants.js +1 -0
  123. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  124. package/dist/esm/utils/dashboard.js +27 -97
  125. package/dist/esm/utils/dataFetcher.d.ts +1 -1
  126. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  127. package/dist/esm/utils/dataFetcher.js +63 -15
  128. package/dist/esm/utils/dates.d.ts +9 -0
  129. package/dist/esm/utils/dates.d.ts.map +1 -1
  130. package/dist/esm/utils/dates.js +39 -0
  131. package/dist/esm/utils/logging.d.ts +2 -0
  132. package/dist/esm/utils/logging.d.ts.map +1 -0
  133. package/dist/esm/utils/logging.js +6 -0
  134. package/dist/esm/utils/monacoAutocomplete.d.ts +20 -0
  135. package/dist/esm/utils/monacoAutocomplete.d.ts.map +1 -0
  136. package/dist/esm/utils/monacoAutocomplete.js +140 -0
  137. package/dist/esm/utils/pivotConstructor.d.ts +6 -0
  138. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -0
  139. package/dist/esm/utils/pivotConstructor.js +136 -0
  140. package/dist/esm/utils/queryConstructor.d.ts +5 -2
  141. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  142. package/dist/esm/utils/queryConstructor.js +145 -52
  143. package/dist/esm/utils/queryConstructor.uspec.d.ts +2 -0
  144. package/dist/esm/utils/queryConstructor.uspec.d.ts.map +1 -0
  145. package/dist/esm/utils/queryConstructor.uspec.js +223 -0
  146. package/dist/esm/utils/tableProcessing.d.ts +23 -0
  147. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  148. package/dist/esm/utils/tableProcessing.js +122 -2
  149. package/package.json +1 -1
  150. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
  151. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
  152. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.js +0 -213
  153. package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
  154. package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
  155. package/dist/esm/internals/ReportBuilder/PivotModal.spec.js +0 -211
@@ -1,13 +1,36 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getDataFromCloud = exports.getData = void 0;
4
+ function parseData(rows, queryType) {
5
+ if (!rows || rows.length === 0)
6
+ return [];
7
+ switch (queryType) {
8
+ case 'dateRange':
9
+ return {
10
+ start: new Date(rows[0]?.min_date),
11
+ end: new Date(rows[0]?.max_date),
12
+ };
13
+ case 'rowCount':
14
+ return parseInt(rows[0]?.row_count);
15
+ case 'distinctStrings':
16
+ return rows.map((row) => {
17
+ return row['column_field'];
18
+ });
19
+ default:
20
+ return rows;
21
+ }
22
+ }
4
23
  // this function gets the data either from the self hosted endpoint or
5
24
  // our cloud server
6
- async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cloudRequestBody, method = 'POST') {
25
+ async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cloudRequestBody, method = 'POST', queryParam) {
26
+ if (!client) {
27
+ return null;
28
+ }
7
29
  try {
8
30
  if (client.queryEndpoint) {
9
31
  // self hosted
10
- const resp = await fetch(client.queryEndpoint, {
32
+ const processedParam = queryParam ? `?${queryParam}` : '';
33
+ const resp = await fetch(`${client.queryEndpoint}${processedParam}`, {
11
34
  method: 'POST',
12
35
  headers: {
13
36
  ...client.queryHeaders,
@@ -21,21 +44,46 @@ async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cl
21
44
  return { success: false, errorMessage: responseJson.error };
22
45
  }
23
46
  let result;
24
- if (responseJson.data?.data) {
25
- result = {
26
- fields: responseJson?.data.queries?.queryResults[0]?.fields,
27
- ...responseJson.data.data,
28
- rows: responseJson?.data.queries?.queryResults[0]?.rows,
29
- compareRows: responseJson?.data.queries?.queryResults[1]?.rows,
30
- };
47
+ if (hostedRequestBody &&
48
+ hostedRequestBody.metadata &&
49
+ (hostedRequestBody.metadata.task === 'report' ||
50
+ hostedRequestBody.metadata.useUpdatedDataGathering)) {
51
+ if (responseJson.data?.data) {
52
+ result = {
53
+ fields: responseJson?.data.queries?.queryResults[0]?.fields,
54
+ ...responseJson.data.data,
55
+ };
56
+ responseJson.data.data.queryOrder.forEach((queryKey, index) => {
57
+ result[queryKey] = parseData(responseJson.queries.queryResults[index].rows, queryKey);
58
+ });
59
+ }
60
+ else {
61
+ result = {
62
+ fields: responseJson?.queries?.queryResults[0]?.fields,
63
+ ...responseJson.data,
64
+ };
65
+ responseJson.data.queryOrder.forEach((queryKey, index) => {
66
+ result[queryKey] = parseData(responseJson.queries.queryResults[index].rows, queryKey);
67
+ });
68
+ }
31
69
  }
32
70
  else {
33
- result = {
34
- fields: responseJson?.queries?.queryResults[0]?.fields,
35
- ...responseJson.data,
36
- rows: responseJson?.queries?.queryResults[0]?.rows,
37
- compareRows: responseJson?.queries?.queryResults[1]?.rows,
38
- };
71
+ if (responseJson.data?.data) {
72
+ result = {
73
+ fields: responseJson?.data.queries?.queryResults[0]?.fields,
74
+ ...responseJson.data.data,
75
+ rows: responseJson?.data.queries?.queryResults[0]?.rows,
76
+ compareRows: responseJson?.data.queries?.queryResults[1]?.rows,
77
+ };
78
+ }
79
+ else {
80
+ result = {
81
+ fields: responseJson?.queries?.queryResults[0]?.fields,
82
+ ...responseJson.data,
83
+ rows: responseJson?.queries?.queryResults[0]?.rows,
84
+ compareRows: responseJson?.queries?.queryResults[1]?.rows,
85
+ };
86
+ }
39
87
  }
40
88
  if (responseJson.data.columns &&
41
89
  responseJson.data.fields &&
@@ -7,4 +7,13 @@ export declare function convertComparisonRange(primaryRange: string, comparisonR
7
7
  * Returns whether the xAxisFormat is a date format.
8
8
  */
9
9
  export declare function isDateFormat(xAxisFormat: string): boolean;
10
+ export declare function getComparisonInterval(comparisonRange: {
11
+ startDate: Date;
12
+ endDate: Date;
13
+ }, dateBucket?: string): string | undefined;
14
+ export declare function getDateBucketFromRange(dateRange: {
15
+ start: Date;
16
+ end: Date;
17
+ }): "month" | "week" | "day" | "year";
18
+ export declare function parseDateByDatabaseType(date: any, databaseType: string): Date;
10
19
  //# sourceMappingURL=dates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../../src/utils/dates.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,UAYxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,WAY/C"}
1
+ {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../../src/utils/dates.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,UAYxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,WAa/C;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;CACf,EACD,UAAU,CAAC,EAAE,MAAM,sBAepB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,qCAW3E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,QAMtE"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isDateFormat = exports.convertComparisonRange = void 0;
3
+ exports.parseDateByDatabaseType = exports.getDateBucketFromRange = exports.getComparisonInterval = exports.isDateFormat = exports.convertComparisonRange = void 0;
4
+ const date_fns_1 = require("date-fns");
4
5
  const dateRangePickerUtils_1 = require("../DateRangePicker/dateRangePickerUtils");
5
6
  /**
6
7
  * Converts the comparison range label to match the date filter range if the
@@ -27,6 +28,7 @@ exports.convertComparisonRange = convertComparisonRange;
27
28
  function isDateFormat(xAxisFormat) {
28
29
  const DATE_FORMATS = [
29
30
  'yyyy',
31
+ 'MMM_dd',
30
32
  'MMM_yyyy',
31
33
  'MMM_dd_yyyy',
32
34
  'hh_ap_pm',
@@ -38,3 +40,43 @@ function isDateFormat(xAxisFormat) {
38
40
  return isDate;
39
41
  }
40
42
  exports.isDateFormat = isDateFormat;
43
+ function getComparisonInterval(comparisonRange, dateBucket) {
44
+ const dayCount = (0, date_fns_1.differenceInDays)(comparisonRange.endDate, comparisonRange.startDate);
45
+ if (!isNaN(dayCount)) {
46
+ if (dateBucket === 'month') {
47
+ return Math.floor(dayCount / 30) + ' month';
48
+ }
49
+ else if (dateBucket === 'year') {
50
+ return Math.floor(dayCount / 365) + ' year';
51
+ }
52
+ else {
53
+ return dayCount + ' day';
54
+ }
55
+ }
56
+ }
57
+ exports.getComparisonInterval = getComparisonInterval;
58
+ function getDateBucketFromRange(dateRange) {
59
+ const difference = (0, date_fns_1.differenceInDays)(dateRange.end, dateRange.start);
60
+ if (difference < 14) {
61
+ return 'day';
62
+ }
63
+ else if (difference < 60) {
64
+ return 'week';
65
+ }
66
+ else if (difference < 365 * 3) {
67
+ return 'month';
68
+ }
69
+ else {
70
+ return 'year';
71
+ }
72
+ }
73
+ exports.getDateBucketFromRange = getDateBucketFromRange;
74
+ function parseDateByDatabaseType(date, databaseType) {
75
+ if (databaseType.toLowerCase() === 'bigquery') {
76
+ return new Date(date.value);
77
+ }
78
+ else {
79
+ return new Date(date);
80
+ }
81
+ }
82
+ exports.parseDateByDatabaseType = parseDateByDatabaseType;
@@ -0,0 +1,2 @@
1
+ export declare function internalLog(message: string, ...optionalParams: any[]): void;
2
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../src/utils/logging.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,QAKpE"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.internalLog = void 0;
4
+ function internalLog(message, ...optionalParams) {
5
+ if (process.env.QUILL_ENV === 'development') {
6
+ const completeMessage = `Quill: ${message}: ${optionalParams.join('\n')}`;
7
+ console.log(completeMessage);
8
+ }
9
+ }
10
+ exports.internalLog = internalLog;
@@ -0,0 +1,20 @@
1
+ import { Monaco } from '@monaco-editor/react';
2
+ import { Range } from 'monaco-editor';
3
+ interface CompletionItem {
4
+ label: string;
5
+ kind: number;
6
+ insertText: string;
7
+ insertTextRules: number;
8
+ range: any;
9
+ detail?: string;
10
+ }
11
+ export declare function generateSuggestionsBySchema(schema: any[], monaco: Monaco, range: Range, databaseType: string): CompletionItem[];
12
+ export declare function generateSuggestionsByDatasource(monaco: Monaco, range: Range, databaseType: string): {
13
+ label: string;
14
+ kind: import("monaco-editor").languages.CompletionItemKind;
15
+ insertText: string;
16
+ insertTextRules: import("monaco-editor").languages.CompletionItemInsertTextRule;
17
+ range: Range;
18
+ }[];
19
+ export {};
20
+ //# sourceMappingURL=monacoAutocomplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monacoAutocomplete.d.ts","sourceRoot":"","sources":["../../../src/utils/monacoAutocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAY,KAAK,EAAE,MAAM,eAAe,CAAC;AAGhD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4HD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,GAAG,EAAE,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,MAAM,GACnB,cAAc,EAAE,CA4BlB;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,MAAM;;;;;;IAMrB"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateSuggestionsByDatasource = exports.generateSuggestionsBySchema = void 0;
4
+ const queryConstructor_1 = require("./queryConstructor");
5
+ const GENERIC_DATASOURCE_SUGGESTIONS = (monaco, range) => {
6
+ return [
7
+ {
8
+ label: 'SELECT',
9
+ kind: monaco.languages.CompletionItemKind.Keyword,
10
+ insertText: 'SELECT',
11
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
12
+ range,
13
+ },
14
+ {
15
+ label: 'FROM',
16
+ kind: monaco.languages.CompletionItemKind.Keyword,
17
+ insertText: 'FROM',
18
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
19
+ range,
20
+ },
21
+ {
22
+ label: 'JOIN',
23
+ kind: monaco.languages.CompletionItemKind.Keyword,
24
+ insertText: 'JOIN',
25
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
26
+ range,
27
+ },
28
+ {
29
+ label: 'LEFT JOIN',
30
+ kind: monaco.languages.CompletionItemKind.Keyword,
31
+ insertText: 'LEFT JOIN',
32
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
33
+ range,
34
+ },
35
+ {
36
+ label: 'INNER JOIN',
37
+ kind: monaco.languages.CompletionItemKind.Keyword,
38
+ insertText: 'INNER JOIN',
39
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
40
+ range,
41
+ },
42
+ {
43
+ label: 'MAX',
44
+ kind: monaco.languages.CompletionItemKind.Keyword,
45
+ insertText: 'MAX',
46
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
47
+ range,
48
+ },
49
+ {
50
+ label: 'MIN',
51
+ kind: monaco.languages.CompletionItemKind.Keyword,
52
+ insertText: 'MIN',
53
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
54
+ range,
55
+ },
56
+ {
57
+ label: 'ON',
58
+ kind: monaco.languages.CompletionItemKind.Keyword,
59
+ insertText: 'ON',
60
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
61
+ range,
62
+ },
63
+ {
64
+ label: 'WHERE',
65
+ kind: monaco.languages.CompletionItemKind.Keyword,
66
+ insertText: 'WHERE',
67
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
68
+ range,
69
+ },
70
+ {
71
+ label: 'LIMIT',
72
+ kind: monaco.languages.CompletionItemKind.Keyword,
73
+ insertText: 'LIMIT',
74
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
75
+ range,
76
+ },
77
+ {
78
+ label: 'GROUP BY',
79
+ kind: monaco.languages.CompletionItemKind.Keyword,
80
+ insertText: 'GROUP BY',
81
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
82
+ range,
83
+ },
84
+ {
85
+ label: 'ORDER BY',
86
+ kind: monaco.languages.CompletionItemKind.Keyword,
87
+ insertText: 'ORDER BY',
88
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
89
+ range,
90
+ },
91
+ ];
92
+ };
93
+ const POSTGRES_DATASOURCE_SUGGESTIONS = (monaco, range) => {
94
+ return [
95
+ {
96
+ label: 'SELECT',
97
+ kind: monaco.languages.CompletionItemKind.Keyword,
98
+ insertText: 'SELECT',
99
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
100
+ range,
101
+ },
102
+ {
103
+ label: 'FROM',
104
+ kind: monaco.languages.CompletionItemKind.Keyword,
105
+ insertText: 'FROM',
106
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
107
+ range,
108
+ },
109
+ ];
110
+ };
111
+ function generateSuggestionsBySchema(schema, monaco, range, databaseType) {
112
+ console.log(databaseType);
113
+ const suggestions = [];
114
+ schema.forEach((table) => {
115
+ const curSuggestion = {
116
+ label: table.name,
117
+ kind: monaco.languages.CompletionItemKind.Field,
118
+ insertText: `${(0, queryConstructor_1.processColumnReference)(table.name, databaseType).replaceAll('`', '')}`,
119
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
120
+ range,
121
+ };
122
+ suggestions.push(curSuggestion);
123
+ table.columns.forEach((column) => {
124
+ const insertText = `${(0, queryConstructor_1.processColumnReference)(column.name, databaseType).replaceAll('`', '')}`;
125
+ const curSuggestion = {
126
+ label: column.name,
127
+ kind: monaco.languages.CompletionItemKind.Field,
128
+ insertText,
129
+ detail: table.name,
130
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
131
+ range,
132
+ };
133
+ suggestions.push(curSuggestion);
134
+ });
135
+ }, []);
136
+ return suggestions;
137
+ }
138
+ exports.generateSuggestionsBySchema = generateSuggestionsBySchema;
139
+ function generateSuggestionsByDatasource(monaco, range, databaseType) {
140
+ return [
141
+ ...POSTGRES_DATASOURCE_SUGGESTIONS(monaco, range),
142
+ ...GENERIC_DATASOURCE_SUGGESTIONS(monaco, range),
143
+ ];
144
+ }
145
+ exports.generateSuggestionsByDatasource = generateSuggestionsByDatasource;
@@ -0,0 +1,6 @@
1
+ import { Pivot } from '../internals/ReportBuilder/PivotModal';
2
+ export declare function generatePivotWithSQL(pivot: Pivot, report: any, client: any, dateBucket?: string, dateFilter?: any, distinctStrings?: any): Promise<{
3
+ rows: any;
4
+ columns: any;
5
+ } | undefined>;
6
+ //# sourceMappingURL=pivotConstructor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAiB,MAAM,uCAAuC,CAAC;AAO7E,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,GAAG,EAChB,eAAe,CAAC,EAAE,GAAG;;;eAsKtB"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generatePivotWithSQL = void 0;
4
+ const ChartBuilder_1 = require("../ChartBuilder");
5
+ const ast_1 = require("../components/ReportBuilder/ast");
6
+ const PivotModal_1 = require("../internals/ReportBuilder/PivotModal");
7
+ const columnProcessing_1 = require("./columnProcessing");
8
+ const dataFetcher_1 = require("./dataFetcher");
9
+ const dates_1 = require("./dates");
10
+ const queryConstructor_1 = require("./queryConstructor");
11
+ const textProcessing_1 = require("./textProcessing");
12
+ async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilter, distinctStrings) {
13
+ if (dateFilter && dateFilter.startDate) {
14
+ dateFilter.start = dateFilter.startDate;
15
+ dateFilter.end = dateFilter.endDate;
16
+ if (dateFilter.comparisonRange && dateFilter.comparisonRange.startDate) {
17
+ dateFilter.comparisonRange.start = dateFilter.comparisonRange.startDate;
18
+ dateFilter.comparisonRange.end = dateFilter.comparisonRange.endDate;
19
+ }
20
+ }
21
+ let comparisonInterval = undefined;
22
+ if (dateFilter && dateFilter.comparisonRange) {
23
+ comparisonInterval = (0, dates_1.getComparisonInterval)({
24
+ startDate: dateFilter.comparisonRange.start,
25
+ endDate: dateFilter.comparisonRange.end,
26
+ }, dateBucket);
27
+ }
28
+ if (pivot.rowField && !pivot.rowFieldType) {
29
+ const rowColumn = report.columns.find((column) => column.field === pivot.rowField);
30
+ pivot.rowFieldType = rowColumn.format;
31
+ }
32
+ let distinctStringValues = undefined;
33
+ if (!distinctStrings && report.rows && pivot.columnField) {
34
+ const distinctValues = Array.from(new Set(report.rows.map((row) => row[pivot.columnField])));
35
+ distinctStringValues = distinctValues.map((value) => value.toString());
36
+ }
37
+ const sqlQuery = (0, queryConstructor_1.generatePivotQuery)(pivot, report.itemQuery, client.databaseType, comparisonInterval, distinctStrings ? distinctStrings : distinctStringValues, dateBucket);
38
+ if (sqlQuery && report.rows.length > 0) {
39
+ const hostedBody = {
40
+ metadata: {
41
+ preQueries: [sqlQuery],
42
+ task: 'query',
43
+ orgId: client.customerId || '*',
44
+ clientId: client.publicKey,
45
+ databaseType: client?.databaseType,
46
+ getCustomFields: false,
47
+ runQueryConfig: {
48
+ overridePost: true,
49
+ convertDatatypes: true,
50
+ },
51
+ },
52
+ };
53
+ const cloudBody = { ...hostedBody };
54
+ const resp = await (0, dataFetcher_1.getData)(client, 'query', 'same-origin', hostedBody, cloudBody, 'POST', 'fetch-pivot');
55
+ // With our current design we have to remove the second row field but leave the first for comparison purposes.
56
+ const rows = resp.queryResults[0].rows;
57
+ if (pivot.columnField && client.databaseType.toLowerCase() === 'bigquery') {
58
+ rows.forEach((row) => {
59
+ Object.keys(row).forEach((key) => {
60
+ const processedKey = (0, columnProcessing_1.processColumnName)(key);
61
+ if (processedKey !== key) {
62
+ row[processedKey] = row[key];
63
+ delete row[key];
64
+ }
65
+ });
66
+ });
67
+ }
68
+ const columns = resp.queryResults[0].fields
69
+ .map((field) => ({
70
+ field: (0, columnProcessing_1.processColumnName)(field.name),
71
+ label: (0, textProcessing_1.snakeCaseToTitleCase)((0, columnProcessing_1.processColumnName)(field.name.replace('comparison_', 'comparison '))),
72
+ }))
73
+ .filter((field, index) => field.field !== 'comparison_' + pivot.rowField || index === 0)
74
+ .sort((a, b) => {
75
+ if (a.field === pivot.rowField) {
76
+ return -1;
77
+ }
78
+ if (b.field === pivot.rowField) {
79
+ return 1;
80
+ }
81
+ return 0;
82
+ });
83
+ if (pivot.rowField && !['string', 'varchar'].includes(pivot.rowFieldType)) {
84
+ rows.forEach((row) => {
85
+ row[pivot.rowField] = (0, PivotModal_1.getDateString)(row[pivot.rowField], undefined, dateBucket);
86
+ });
87
+ // add a row for each date in the range that doesn't have a value
88
+ if (pivot.rowField &&
89
+ !['string', 'varchar'].includes(pivot.rowFieldType) &&
90
+ dateFilter) {
91
+ const dateSet = new Set(rows.map((row) => row[pivot.rowField]));
92
+ // create a loop that will go through each formatted date and add a row if it doesn't exist going to the current date
93
+ for (let date = dateFilter.start ?? dateFilter.startDate; date <= dateFilter.end; date = new Date(date.getTime() + 24 * 60 * 60 * 1000)) {
94
+ const formattedDate = (0, PivotModal_1.getDateString)(date.toDateString(), undefined, dateBucket);
95
+ if (!dateSet.has(formattedDate)) {
96
+ const newRow = {};
97
+ newRow[pivot.rowField] = formattedDate;
98
+ rows.push(newRow);
99
+ dateSet.add(formattedDate);
100
+ }
101
+ // order the rows by the date field
102
+ rows.sort((a, b) => {
103
+ return new Date(a[pivot.rowField]) < new Date(b[pivot.rowField])
104
+ ? -1
105
+ : 1;
106
+ });
107
+ }
108
+ }
109
+ }
110
+ if (pivot.sort) {
111
+ rows.sort((a, b) => {
112
+ if (pivot.sortDirection === 'ASC') {
113
+ if (ChartBuilder_1.dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
114
+ // @ts-ignore
115
+ return new Date(a[pivot.sortField]) - new Date(b[pivot.sortField]);
116
+ }
117
+ else if ((0, ast_1.isNumericColumnType)(pivot.sortFieldType)) {
118
+ return a[pivot.sortField] - b[pivot.sortField];
119
+ }
120
+ return a[pivot.sortField].localeCompare(b[pivot.sortField]);
121
+ }
122
+ else {
123
+ if (ChartBuilder_1.dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
124
+ // @ts-ignore
125
+ return new Date(b[pivot.sortField]) - new Date(a[pivot.sortField]);
126
+ }
127
+ else if ((0, ast_1.isNumericColumnType)(pivot.sortFieldType)) {
128
+ return b[pivot.sortField] - a[pivot.sortField];
129
+ }
130
+ return b[pivot.sortField].localeCompare(a[pivot.sortField]);
131
+ }
132
+ });
133
+ }
134
+ return {
135
+ rows: rows,
136
+ columns: columns,
137
+ };
138
+ }
139
+ }
140
+ exports.generatePivotWithSQL = generatePivotWithSQL;
@@ -1,4 +1,7 @@
1
1
  import { Pivot } from '../internals/ReportBuilder/PivotModal';
2
- export declare function generateDistinctQuery(stringFields: string[], query: string): string;
3
- export declare function generatePivotQuery(pivot: Pivot, itemQueries: string[], rows: any[], dateBucket?: string, comparisonInterval?: string): string | undefined;
2
+ export declare function processColumnReference(column: string, databaseType: string): string;
3
+ export declare function generateCountQuery(fields: string[], query: string, databaseType: string): string;
4
+ export declare function generateDistinctQuery(stringFields: string[], query: string, databaseType: string): string;
5
+ export declare function generateMinMaxRangeQueries(columnFields: string[], query: string, databaseType: string): string;
6
+ export declare function generatePivotQuery(pivot: Pivot, itemQueries: string[], databaseType: string, comparisonInterval?: string, distinctStrings?: string[], dateBucket?: string): string | undefined;
4
7
  //# sourceMappingURL=queryConstructor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAe9D,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,UAQ1E;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,EAAE,GAAG,EAAE,EACX,UAAU,CAAC,EAAE,MAAM,EACnB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,GAAG,SAAS,CAiBpB"}
1
+ {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAmB9D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,UAa1E;AA4CD,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,UASrB;AAED,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,CAwBpB"}