@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,10 +1,33 @@
1
+ function parseData(rows, queryType) {
2
+ if (!rows || rows.length === 0)
3
+ return [];
4
+ switch (queryType) {
5
+ case 'dateRange':
6
+ return {
7
+ start: new Date(rows[0]?.min_date),
8
+ end: new Date(rows[0]?.max_date),
9
+ };
10
+ case 'rowCount':
11
+ return parseInt(rows[0]?.row_count);
12
+ case 'distinctStrings':
13
+ return rows.map((row) => {
14
+ return row['column_field'];
15
+ });
16
+ default:
17
+ return rows;
18
+ }
19
+ }
1
20
  // this function gets the data either from the self hosted endpoint or
2
21
  // our cloud server
3
- export async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cloudRequestBody, method = 'POST') {
22
+ export async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cloudRequestBody, method = 'POST', queryParam) {
23
+ if (!client) {
24
+ return null;
25
+ }
4
26
  try {
5
27
  if (client.queryEndpoint) {
6
28
  // self hosted
7
- const resp = await fetch(client.queryEndpoint, {
29
+ const processedParam = queryParam ? `?${queryParam}` : '';
30
+ const resp = await fetch(`${client.queryEndpoint}${processedParam}`, {
8
31
  method: 'POST',
9
32
  headers: {
10
33
  ...client.queryHeaders,
@@ -18,21 +41,46 @@ export async function getData(client, cloudQueryEndpoint, noCred, hostedRequestB
18
41
  return { success: false, errorMessage: responseJson.error };
19
42
  }
20
43
  let result;
21
- if (responseJson.data?.data) {
22
- result = {
23
- fields: responseJson?.data.queries?.queryResults[0]?.fields,
24
- ...responseJson.data.data,
25
- rows: responseJson?.data.queries?.queryResults[0]?.rows,
26
- compareRows: responseJson?.data.queries?.queryResults[1]?.rows,
27
- };
44
+ if (hostedRequestBody &&
45
+ hostedRequestBody.metadata &&
46
+ (hostedRequestBody.metadata.task === 'report' ||
47
+ hostedRequestBody.metadata.useUpdatedDataGathering)) {
48
+ if (responseJson.data?.data) {
49
+ result = {
50
+ fields: responseJson?.data.queries?.queryResults[0]?.fields,
51
+ ...responseJson.data.data,
52
+ };
53
+ responseJson.data.data.queryOrder.forEach((queryKey, index) => {
54
+ result[queryKey] = parseData(responseJson.queries.queryResults[index].rows, queryKey);
55
+ });
56
+ }
57
+ else {
58
+ result = {
59
+ fields: responseJson?.queries?.queryResults[0]?.fields,
60
+ ...responseJson.data,
61
+ };
62
+ responseJson.data.queryOrder.forEach((queryKey, index) => {
63
+ result[queryKey] = parseData(responseJson.queries.queryResults[index].rows, queryKey);
64
+ });
65
+ }
28
66
  }
29
67
  else {
30
- result = {
31
- fields: responseJson?.queries?.queryResults[0]?.fields,
32
- ...responseJson.data,
33
- rows: responseJson?.queries?.queryResults[0]?.rows,
34
- compareRows: responseJson?.queries?.queryResults[1]?.rows,
35
- };
68
+ if (responseJson.data?.data) {
69
+ result = {
70
+ fields: responseJson?.data.queries?.queryResults[0]?.fields,
71
+ ...responseJson.data.data,
72
+ rows: responseJson?.data.queries?.queryResults[0]?.rows,
73
+ compareRows: responseJson?.data.queries?.queryResults[1]?.rows,
74
+ };
75
+ }
76
+ else {
77
+ result = {
78
+ fields: responseJson?.queries?.queryResults[0]?.fields,
79
+ ...responseJson.data,
80
+ rows: responseJson?.queries?.queryResults[0]?.rows,
81
+ compareRows: responseJson?.queries?.queryResults[1]?.rows,
82
+ };
83
+ }
36
84
  }
37
85
  if (responseJson.data.columns &&
38
86
  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,3 +1,4 @@
1
+ import { differenceInDays } from 'date-fns';
1
2
  import { COMPARISON_OPTIONS } from '../DateRangePicker/dateRangePickerUtils';
2
3
  /**
3
4
  * Converts the comparison range label to match the date filter range if the
@@ -23,6 +24,7 @@ export function convertComparisonRange(primaryRange, comparisonRange) {
23
24
  export function isDateFormat(xAxisFormat) {
24
25
  const DATE_FORMATS = [
25
26
  'yyyy',
27
+ 'MMM_dd',
26
28
  'MMM_yyyy',
27
29
  'MMM_dd_yyyy',
28
30
  'hh_ap_pm',
@@ -33,3 +35,40 @@ export function isDateFormat(xAxisFormat) {
33
35
  const isDate = DATE_FORMATS.includes(xAxisFormat);
34
36
  return isDate;
35
37
  }
38
+ export function getComparisonInterval(comparisonRange, dateBucket) {
39
+ const dayCount = differenceInDays(comparisonRange.endDate, comparisonRange.startDate);
40
+ if (!isNaN(dayCount)) {
41
+ if (dateBucket === 'month') {
42
+ return Math.floor(dayCount / 30) + ' month';
43
+ }
44
+ else if (dateBucket === 'year') {
45
+ return Math.floor(dayCount / 365) + ' year';
46
+ }
47
+ else {
48
+ return dayCount + ' day';
49
+ }
50
+ }
51
+ }
52
+ export function getDateBucketFromRange(dateRange) {
53
+ const difference = differenceInDays(dateRange.end, dateRange.start);
54
+ if (difference < 14) {
55
+ return 'day';
56
+ }
57
+ else if (difference < 60) {
58
+ return 'week';
59
+ }
60
+ else if (difference < 365 * 3) {
61
+ return 'month';
62
+ }
63
+ else {
64
+ return 'year';
65
+ }
66
+ }
67
+ export function parseDateByDatabaseType(date, databaseType) {
68
+ if (databaseType.toLowerCase() === 'bigquery') {
69
+ return new Date(date.value);
70
+ }
71
+ else {
72
+ return new Date(date);
73
+ }
74
+ }
@@ -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,6 @@
1
+ export function internalLog(message, ...optionalParams) {
2
+ if (process.env.QUILL_ENV === 'development') {
3
+ const completeMessage = `Quill: ${message}: ${optionalParams.join('\n')}`;
4
+ console.log(completeMessage);
5
+ }
6
+ }
@@ -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,140 @@
1
+ import { processColumnReference } from './queryConstructor';
2
+ const GENERIC_DATASOURCE_SUGGESTIONS = (monaco, range) => {
3
+ return [
4
+ {
5
+ label: 'SELECT',
6
+ kind: monaco.languages.CompletionItemKind.Keyword,
7
+ insertText: 'SELECT',
8
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
9
+ range,
10
+ },
11
+ {
12
+ label: 'FROM',
13
+ kind: monaco.languages.CompletionItemKind.Keyword,
14
+ insertText: 'FROM',
15
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
16
+ range,
17
+ },
18
+ {
19
+ label: 'JOIN',
20
+ kind: monaco.languages.CompletionItemKind.Keyword,
21
+ insertText: 'JOIN',
22
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
23
+ range,
24
+ },
25
+ {
26
+ label: 'LEFT JOIN',
27
+ kind: monaco.languages.CompletionItemKind.Keyword,
28
+ insertText: 'LEFT JOIN',
29
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
30
+ range,
31
+ },
32
+ {
33
+ label: 'INNER JOIN',
34
+ kind: monaco.languages.CompletionItemKind.Keyword,
35
+ insertText: 'INNER JOIN',
36
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
37
+ range,
38
+ },
39
+ {
40
+ label: 'MAX',
41
+ kind: monaco.languages.CompletionItemKind.Keyword,
42
+ insertText: 'MAX',
43
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
44
+ range,
45
+ },
46
+ {
47
+ label: 'MIN',
48
+ kind: monaco.languages.CompletionItemKind.Keyword,
49
+ insertText: 'MIN',
50
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
51
+ range,
52
+ },
53
+ {
54
+ label: 'ON',
55
+ kind: monaco.languages.CompletionItemKind.Keyword,
56
+ insertText: 'ON',
57
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
58
+ range,
59
+ },
60
+ {
61
+ label: 'WHERE',
62
+ kind: monaco.languages.CompletionItemKind.Keyword,
63
+ insertText: 'WHERE',
64
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
65
+ range,
66
+ },
67
+ {
68
+ label: 'LIMIT',
69
+ kind: monaco.languages.CompletionItemKind.Keyword,
70
+ insertText: 'LIMIT',
71
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
72
+ range,
73
+ },
74
+ {
75
+ label: 'GROUP BY',
76
+ kind: monaco.languages.CompletionItemKind.Keyword,
77
+ insertText: 'GROUP BY',
78
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
79
+ range,
80
+ },
81
+ {
82
+ label: 'ORDER BY',
83
+ kind: monaco.languages.CompletionItemKind.Keyword,
84
+ insertText: 'ORDER BY',
85
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
86
+ range,
87
+ },
88
+ ];
89
+ };
90
+ const POSTGRES_DATASOURCE_SUGGESTIONS = (monaco, range) => {
91
+ return [
92
+ {
93
+ label: 'SELECT',
94
+ kind: monaco.languages.CompletionItemKind.Keyword,
95
+ insertText: 'SELECT',
96
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
97
+ range,
98
+ },
99
+ {
100
+ label: 'FROM',
101
+ kind: monaco.languages.CompletionItemKind.Keyword,
102
+ insertText: 'FROM',
103
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
104
+ range,
105
+ },
106
+ ];
107
+ };
108
+ export function generateSuggestionsBySchema(schema, monaco, range, databaseType) {
109
+ console.log(databaseType);
110
+ const suggestions = [];
111
+ schema.forEach((table) => {
112
+ const curSuggestion = {
113
+ label: table.name,
114
+ kind: monaco.languages.CompletionItemKind.Field,
115
+ insertText: `${processColumnReference(table.name, databaseType).replaceAll('`', '')}`,
116
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
117
+ range,
118
+ };
119
+ suggestions.push(curSuggestion);
120
+ table.columns.forEach((column) => {
121
+ const insertText = `${processColumnReference(column.name, databaseType).replaceAll('`', '')}`;
122
+ const curSuggestion = {
123
+ label: column.name,
124
+ kind: monaco.languages.CompletionItemKind.Field,
125
+ insertText,
126
+ detail: table.name,
127
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
128
+ range,
129
+ };
130
+ suggestions.push(curSuggestion);
131
+ });
132
+ }, []);
133
+ return suggestions;
134
+ }
135
+ export function generateSuggestionsByDatasource(monaco, range, databaseType) {
136
+ return [
137
+ ...POSTGRES_DATASOURCE_SUGGESTIONS(monaco, range),
138
+ ...GENERIC_DATASOURCE_SUGGESTIONS(monaco, range),
139
+ ];
140
+ }
@@ -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,136 @@
1
+ import { dateFormatOptions } from '../ChartBuilder';
2
+ import { isNumericColumnType } from '../components/ReportBuilder/ast';
3
+ import { getDateString } from '../internals/ReportBuilder/PivotModal';
4
+ import { processColumnName } from './columnProcessing';
5
+ import { getData } from './dataFetcher';
6
+ import { getComparisonInterval } from './dates';
7
+ import { generatePivotQuery } from './queryConstructor';
8
+ import { snakeCaseToTitleCase } from './textProcessing';
9
+ export async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilter, distinctStrings) {
10
+ if (dateFilter && dateFilter.startDate) {
11
+ dateFilter.start = dateFilter.startDate;
12
+ dateFilter.end = dateFilter.endDate;
13
+ if (dateFilter.comparisonRange && dateFilter.comparisonRange.startDate) {
14
+ dateFilter.comparisonRange.start = dateFilter.comparisonRange.startDate;
15
+ dateFilter.comparisonRange.end = dateFilter.comparisonRange.endDate;
16
+ }
17
+ }
18
+ let comparisonInterval = undefined;
19
+ if (dateFilter && dateFilter.comparisonRange) {
20
+ comparisonInterval = getComparisonInterval({
21
+ startDate: dateFilter.comparisonRange.start,
22
+ endDate: dateFilter.comparisonRange.end,
23
+ }, dateBucket);
24
+ }
25
+ if (pivot.rowField && !pivot.rowFieldType) {
26
+ const rowColumn = report.columns.find((column) => column.field === pivot.rowField);
27
+ pivot.rowFieldType = rowColumn.format;
28
+ }
29
+ let distinctStringValues = undefined;
30
+ if (!distinctStrings && report.rows && pivot.columnField) {
31
+ const distinctValues = Array.from(new Set(report.rows.map((row) => row[pivot.columnField])));
32
+ distinctStringValues = distinctValues.map((value) => value.toString());
33
+ }
34
+ const sqlQuery = generatePivotQuery(pivot, report.itemQuery, client.databaseType, comparisonInterval, distinctStrings ? distinctStrings : distinctStringValues, dateBucket);
35
+ if (sqlQuery && report.rows.length > 0) {
36
+ const hostedBody = {
37
+ metadata: {
38
+ preQueries: [sqlQuery],
39
+ task: 'query',
40
+ orgId: client.customerId || '*',
41
+ clientId: client.publicKey,
42
+ databaseType: client?.databaseType,
43
+ getCustomFields: false,
44
+ runQueryConfig: {
45
+ overridePost: true,
46
+ convertDatatypes: true,
47
+ },
48
+ },
49
+ };
50
+ const cloudBody = { ...hostedBody };
51
+ const resp = await getData(client, 'query', 'same-origin', hostedBody, cloudBody, 'POST', 'fetch-pivot');
52
+ // With our current design we have to remove the second row field but leave the first for comparison purposes.
53
+ const rows = resp.queryResults[0].rows;
54
+ if (pivot.columnField && client.databaseType.toLowerCase() === 'bigquery') {
55
+ rows.forEach((row) => {
56
+ Object.keys(row).forEach((key) => {
57
+ const processedKey = processColumnName(key);
58
+ if (processedKey !== key) {
59
+ row[processedKey] = row[key];
60
+ delete row[key];
61
+ }
62
+ });
63
+ });
64
+ }
65
+ const columns = resp.queryResults[0].fields
66
+ .map((field) => ({
67
+ field: processColumnName(field.name),
68
+ label: snakeCaseToTitleCase(processColumnName(field.name.replace('comparison_', 'comparison '))),
69
+ }))
70
+ .filter((field, index) => field.field !== 'comparison_' + pivot.rowField || index === 0)
71
+ .sort((a, b) => {
72
+ if (a.field === pivot.rowField) {
73
+ return -1;
74
+ }
75
+ if (b.field === pivot.rowField) {
76
+ return 1;
77
+ }
78
+ return 0;
79
+ });
80
+ if (pivot.rowField && !['string', 'varchar'].includes(pivot.rowFieldType)) {
81
+ rows.forEach((row) => {
82
+ row[pivot.rowField] = getDateString(row[pivot.rowField], undefined, dateBucket);
83
+ });
84
+ // add a row for each date in the range that doesn't have a value
85
+ if (pivot.rowField &&
86
+ !['string', 'varchar'].includes(pivot.rowFieldType) &&
87
+ dateFilter) {
88
+ const dateSet = new Set(rows.map((row) => row[pivot.rowField]));
89
+ // create a loop that will go through each formatted date and add a row if it doesn't exist going to the current date
90
+ for (let date = dateFilter.start ?? dateFilter.startDate; date <= dateFilter.end; date = new Date(date.getTime() + 24 * 60 * 60 * 1000)) {
91
+ const formattedDate = getDateString(date.toDateString(), undefined, dateBucket);
92
+ if (!dateSet.has(formattedDate)) {
93
+ const newRow = {};
94
+ newRow[pivot.rowField] = formattedDate;
95
+ rows.push(newRow);
96
+ dateSet.add(formattedDate);
97
+ }
98
+ // order the rows by the date field
99
+ rows.sort((a, b) => {
100
+ return new Date(a[pivot.rowField]) < new Date(b[pivot.rowField])
101
+ ? -1
102
+ : 1;
103
+ });
104
+ }
105
+ }
106
+ }
107
+ if (pivot.sort) {
108
+ rows.sort((a, b) => {
109
+ if (pivot.sortDirection === 'ASC') {
110
+ if (dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
111
+ // @ts-ignore
112
+ return new Date(a[pivot.sortField]) - new Date(b[pivot.sortField]);
113
+ }
114
+ else if (isNumericColumnType(pivot.sortFieldType)) {
115
+ return a[pivot.sortField] - b[pivot.sortField];
116
+ }
117
+ return a[pivot.sortField].localeCompare(b[pivot.sortField]);
118
+ }
119
+ else {
120
+ if (dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
121
+ // @ts-ignore
122
+ return new Date(b[pivot.sortField]) - new Date(a[pivot.sortField]);
123
+ }
124
+ else if (isNumericColumnType(pivot.sortFieldType)) {
125
+ return b[pivot.sortField] - a[pivot.sortField];
126
+ }
127
+ return b[pivot.sortField].localeCompare(a[pivot.sortField]);
128
+ }
129
+ });
130
+ }
131
+ return {
132
+ rows: rows,
133
+ columns: columns,
134
+ };
135
+ }
136
+ }
@@ -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"}