@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.
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +40 -21
- package/dist/cjs/ChartBuilder.d.ts +38 -4
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +66 -25
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +66 -26
- package/dist/cjs/Context.d.ts +1 -19
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +32 -83
- package/dist/cjs/Dashboard.d.ts +6 -1
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +79 -50
- package/dist/cjs/ReportBuilder.d.ts +10 -1
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +331 -99
- package/dist/cjs/SQLEditor.d.ts +10 -1
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +122 -29
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +21 -11
- package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartTooltip.js +5 -4
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +61 -20
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +7 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +16 -2
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +2 -14
- package/dist/cjs/components/QuillTable.d.ts +2 -2
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +7 -5
- package/dist/cjs/components/UiComponents.d.ts +3 -3
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +4 -4
- package/dist/cjs/hooks/useDashboard.d.ts +1 -1
- package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +18 -4
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +16 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +179 -105
- package/dist/cjs/utils/columnProcessing.d.ts +1 -0
- package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/columnProcessing.js +8 -1
- package/dist/cjs/utils/constants.d.ts +2 -0
- package/dist/cjs/utils/constants.d.ts.map +1 -0
- package/dist/cjs/utils/constants.js +4 -0
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +26 -96
- package/dist/cjs/utils/dataFetcher.d.ts +1 -1
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +63 -15
- package/dist/cjs/utils/dates.d.ts +9 -0
- package/dist/cjs/utils/dates.d.ts.map +1 -1
- package/dist/cjs/utils/dates.js +43 -1
- package/dist/cjs/utils/logging.d.ts +2 -0
- package/dist/cjs/utils/logging.d.ts.map +1 -0
- package/dist/cjs/utils/logging.js +10 -0
- package/dist/cjs/utils/monacoAutocomplete.d.ts +20 -0
- package/dist/cjs/utils/monacoAutocomplete.d.ts.map +1 -0
- package/dist/cjs/utils/monacoAutocomplete.js +145 -0
- package/dist/cjs/utils/pivotConstructor.d.ts +6 -0
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -0
- package/dist/cjs/utils/pivotConstructor.js +140 -0
- package/dist/cjs/utils/queryConstructor.d.ts +5 -2
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +149 -53
- package/dist/cjs/utils/queryConstructor.uspec.d.ts +2 -0
- package/dist/cjs/utils/queryConstructor.uspec.d.ts.map +1 -0
- package/dist/cjs/utils/queryConstructor.uspec.js +225 -0
- package/dist/cjs/utils/tableProcessing.d.ts +23 -0
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +125 -2
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +40 -21
- package/dist/esm/ChartBuilder.d.ts +38 -4
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +64 -24
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +66 -26
- package/dist/esm/Context.d.ts +1 -19
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +32 -82
- package/dist/esm/Dashboard.d.ts +6 -1
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +80 -51
- package/dist/esm/ReportBuilder.d.ts +10 -1
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +333 -101
- package/dist/esm/SQLEditor.d.ts +10 -1
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +123 -30
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +21 -11
- package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartTooltip.js +5 -4
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +61 -20
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +7 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts +16 -2
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +2 -14
- package/dist/esm/components/QuillTable.d.ts +2 -2
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +7 -5
- package/dist/esm/components/UiComponents.d.ts +3 -3
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +4 -4
- package/dist/esm/hooks/useDashboard.d.ts +1 -1
- package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.js +19 -5
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +16 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +177 -105
- package/dist/esm/utils/columnProcessing.d.ts +1 -0
- package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
- package/dist/esm/utils/columnProcessing.js +6 -0
- package/dist/esm/utils/constants.d.ts +2 -0
- package/dist/esm/utils/constants.d.ts.map +1 -0
- package/dist/esm/utils/constants.js +1 -0
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +27 -97
- package/dist/esm/utils/dataFetcher.d.ts +1 -1
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +63 -15
- package/dist/esm/utils/dates.d.ts +9 -0
- package/dist/esm/utils/dates.d.ts.map +1 -1
- package/dist/esm/utils/dates.js +39 -0
- package/dist/esm/utils/logging.d.ts +2 -0
- package/dist/esm/utils/logging.d.ts.map +1 -0
- package/dist/esm/utils/logging.js +6 -0
- package/dist/esm/utils/monacoAutocomplete.d.ts +20 -0
- package/dist/esm/utils/monacoAutocomplete.d.ts.map +1 -0
- package/dist/esm/utils/monacoAutocomplete.js +140 -0
- package/dist/esm/utils/pivotConstructor.d.ts +6 -0
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -0
- package/dist/esm/utils/pivotConstructor.js +136 -0
- package/dist/esm/utils/queryConstructor.d.ts +5 -2
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +145 -52
- package/dist/esm/utils/queryConstructor.uspec.d.ts +2 -0
- package/dist/esm/utils/queryConstructor.uspec.d.ts.map +1 -0
- package/dist/esm/utils/queryConstructor.uspec.js +223 -0
- package/dist/esm/utils/tableProcessing.d.ts +23 -0
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +122 -2
- package/package.json +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
- package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.spec.js +0 -213
- package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
- package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
- 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
|
|
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 (
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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":"
|
|
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"}
|
package/dist/cjs/utils/dates.js
CHANGED
|
@@ -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 @@
|
|
|
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
|
|
3
|
-
export declare function
|
|
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;
|
|
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"}
|