@quillsql/react 2.12.20 → 2.12.22
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 +28 -18
- package/dist/cjs/ChartBuilder.js +2 -2
- package/dist/cjs/ChartEditor.js +4 -4
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +5 -5
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarChart.js +4 -2
- package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartTooltip.js +1 -1
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +17 -22
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +3 -0
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +11 -0
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +11 -1
- package/dist/cjs/utils/dashboard.d.ts +1 -1
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +112 -4
- package/dist/cjs/utils/errorProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/errorProcessing.js +0 -3
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/pivotProcessing.js +0 -42
- package/dist/cjs/utils/queryConstructor.d.ts +2 -0
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +119 -1
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +28 -18
- package/dist/esm/ChartBuilder.js +2 -2
- package/dist/esm/ChartEditor.js +4 -4
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +5 -5
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarChart.js +4 -2
- package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartTooltip.js +1 -1
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +17 -22
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +3 -0
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +11 -0
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +10 -2
- package/dist/esm/utils/dashboard.d.ts +1 -1
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +113 -5
- package/dist/esm/utils/errorProcessing.d.ts.map +1 -1
- package/dist/esm/utils/errorProcessing.js +0 -3
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/esm/utils/pivotProcessing.js +0 -42
- package/dist/esm/utils/queryConstructor.d.ts +2 -0
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +117 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PivotModal.d.ts","sourceRoot":"","sources":["../../../../src/internals/ReportBuilder/PivotModal.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PivotModal.d.ts","sourceRoot":"","sources":["../../../../src/internals/ReportBuilder/PivotModal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -544,7 +544,7 @@ function getLatestDate(a, b) {
|
|
|
544
544
|
function getEarliestDate(a, b) {
|
|
545
545
|
return a < b ? a : b;
|
|
546
546
|
}
|
|
547
|
-
function getDateRange(dateRange, column, data) {
|
|
547
|
+
export function getDateRange(dateRange, column, data) {
|
|
548
548
|
const currentTime = new Date().getTime();
|
|
549
549
|
const ONE_CENTURY_IN_MILLISECONDS = 100 * 365 * 24 * 60 * 60 * 1000;
|
|
550
550
|
const maxDate = new Date(currentTime + ONE_CENTURY_IN_MILLISECONDS);
|
|
@@ -648,7 +648,7 @@ function dayDifferenceToInterval(dayDifference, dateRange) {
|
|
|
648
648
|
return eachYearOfInterval(dateRange);
|
|
649
649
|
}
|
|
650
650
|
}
|
|
651
|
-
function getDateString(value, dateRange, dateBucket) {
|
|
651
|
+
export function getDateString(value, dateRange, dateBucket) {
|
|
652
652
|
let format;
|
|
653
653
|
if (dateBucket) {
|
|
654
654
|
switch (dateBucket) {
|
|
@@ -1082,6 +1082,14 @@ export function generatePivotTable(pivot, data, dateRange, isComparison, rowLimi
|
|
|
1082
1082
|
return { rows: pivotRows, columns };
|
|
1083
1083
|
}
|
|
1084
1084
|
function valueFieldAggregation(data, valueField, aggregationType, isComparison) {
|
|
1085
|
+
if (!data || data.length === 0) {
|
|
1086
|
+
return {
|
|
1087
|
+
rows: [],
|
|
1088
|
+
columns: [
|
|
1089
|
+
{ label: snakeAndCamelCaseToTitleCase(valueField), field: valueField },
|
|
1090
|
+
],
|
|
1091
|
+
};
|
|
1092
|
+
}
|
|
1085
1093
|
let value = 0;
|
|
1086
1094
|
let comparisonValue = 0;
|
|
1087
1095
|
switch (aggregationType) {
|
|
@@ -8,5 +8,5 @@ import { QuillReportInternal } from '../Dashboard';
|
|
|
8
8
|
*/
|
|
9
9
|
export declare function cleanDashboardItem(item: {
|
|
10
10
|
[key: string]: any;
|
|
11
|
-
} | undefined, dashboardFilters: any): QuillReportInternal
|
|
11
|
+
} | undefined, dashboardFilters: any, client?: any, dateBucket?: string): Promise<QuillReportInternal>;
|
|
12
12
|
//# sourceMappingURL=dashboard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAkC5E;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,EACrB,MAAM,CAAC,EAAE,GAAG,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CA+C9B"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { valueFormatter } from './valueFormatter';
|
|
2
|
-
import { generatePivotTable, generatePivotTableYAxis, } from '../internals/ReportBuilder/PivotModal';
|
|
2
|
+
import { generatePivotTable, generatePivotTableYAxis, getDateRange, getDateString, } from '../internals/ReportBuilder/PivotModal';
|
|
3
3
|
import { snakeAndCamelCaseToTitleCase } from './textProcessing';
|
|
4
|
+
import { generatePivotQuery } from './queryConstructor';
|
|
5
|
+
import { getData } from './dataFetcher';
|
|
6
|
+
import { differenceInDays } from 'date-fns';
|
|
4
7
|
const defaultDashboardItem = {
|
|
5
8
|
id: '',
|
|
6
9
|
name: '',
|
|
@@ -28,7 +31,7 @@ const defaultDashboardItem = {
|
|
|
28
31
|
* interface to build amazing dashboards on top of.
|
|
29
32
|
* @param item
|
|
30
33
|
*/
|
|
31
|
-
export function cleanDashboardItem(item, dashboardFilters) {
|
|
34
|
+
export async function cleanDashboardItem(item, dashboardFilters, client, dateBucket) {
|
|
32
35
|
if (!item)
|
|
33
36
|
return defaultDashboardItem;
|
|
34
37
|
if (!item.rows)
|
|
@@ -37,7 +40,7 @@ export function cleanDashboardItem(item, dashboardFilters) {
|
|
|
37
40
|
id: item._id,
|
|
38
41
|
name: item.name,
|
|
39
42
|
};
|
|
40
|
-
const pivotTable = getPivotTable(item, dashboardFilters);
|
|
43
|
+
const pivotTable = await getPivotTable(item, dashboardFilters, client, dateBucket);
|
|
41
44
|
const { primaryAggregation, comparisonAggregation, aggregationPercentChange, } = getAggragations(pivotTable, item);
|
|
42
45
|
return {
|
|
43
46
|
id: item._id,
|
|
@@ -105,12 +108,117 @@ function formatAggragation(item, value) {
|
|
|
105
108
|
/**
|
|
106
109
|
* Extract and transform the data from itemInfo.
|
|
107
110
|
*/
|
|
108
|
-
function getPivotTable(report, dashboardFilters) {
|
|
111
|
+
async function getPivotTable(report, dashboardFilters, client, dateBucketInitial) {
|
|
109
112
|
if (!report)
|
|
110
113
|
return undefined;
|
|
111
|
-
|
|
114
|
+
let dateFilter = Object.values(dashboardFilters ?? {}).find((filter) => filter.filterType === 'date_range' || filter.opterator === 'BETWEEN');
|
|
115
|
+
if (dateFilter?.opterator === 'BETWEEN') {
|
|
116
|
+
dateFilter.startDate = dateFilter.value[0];
|
|
117
|
+
dateFilter.endDate = dateFilter.value[1];
|
|
118
|
+
}
|
|
112
119
|
const pivot = report?.pivot;
|
|
113
120
|
const data = report || {};
|
|
121
|
+
if (client && client.databaseType.toLowerCase() === 'postgresql') {
|
|
122
|
+
try {
|
|
123
|
+
let dateRange = undefined;
|
|
124
|
+
let comparisonInterval = undefined;
|
|
125
|
+
let dateBucket = dateBucketInitial;
|
|
126
|
+
if (!dateBucket && pivot.rowFieldType !== 'string' && pivot.rowField) {
|
|
127
|
+
let filterDateRange = undefined;
|
|
128
|
+
if (dateFilter) {
|
|
129
|
+
filterDateRange = {
|
|
130
|
+
start: dateFilter.startDate,
|
|
131
|
+
end: dateFilter.endDate,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
dateRange = getDateRange(filterDateRange, pivot.rowField, data.rows);
|
|
135
|
+
const difference = differenceInDays(dateRange.end, dateRange.start);
|
|
136
|
+
if (difference < 14) {
|
|
137
|
+
dateBucket = 'day';
|
|
138
|
+
}
|
|
139
|
+
else if (difference < 60) {
|
|
140
|
+
dateBucket = 'week';
|
|
141
|
+
}
|
|
142
|
+
else if (difference < 365 * 3) {
|
|
143
|
+
dateBucket = 'month';
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
dateBucket = 'year';
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (dateFilter && dateFilter && dateFilter.comparisonRange) {
|
|
150
|
+
const comparisonRange = differenceInDays(dateFilter?.comparisonRange.endDate, dateFilter?.comparisonRange.startDate);
|
|
151
|
+
if (!isNaN(comparisonRange)) {
|
|
152
|
+
if (dateBucket === 'month') {
|
|
153
|
+
comparisonInterval = comparisonRange / 30 + ' month';
|
|
154
|
+
}
|
|
155
|
+
else if (dateBucket === 'year') {
|
|
156
|
+
comparisonInterval = comparisonRange / 365 + ' year';
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
comparisonInterval = comparisonRange + ' day';
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const sqlQuery = generatePivotQuery(pivot, report.itemQuery, report.rows, dateBucket, comparisonInterval);
|
|
164
|
+
if (sqlQuery && report.rows.length > 0) {
|
|
165
|
+
const hostedBody = {
|
|
166
|
+
metadata: {
|
|
167
|
+
preQueries: [sqlQuery],
|
|
168
|
+
task: 'query',
|
|
169
|
+
orgId: client.customerId || '*',
|
|
170
|
+
clientId: client.publicKey,
|
|
171
|
+
databaseType: client?.databaseType,
|
|
172
|
+
getCustomFields: false,
|
|
173
|
+
runQueryConfig: {
|
|
174
|
+
overridePost: true,
|
|
175
|
+
convertDatatypes: true,
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
const cloudBody = { ...hostedBody };
|
|
180
|
+
const resp = await getData(client, 'query', 'same-origin', hostedBody, cloudBody);
|
|
181
|
+
// With our current design we have to remove the second row field but leave the first for comparison purposes.
|
|
182
|
+
const rows = resp.queryResults[0].rows;
|
|
183
|
+
const columns = resp.queryResults[0].fields
|
|
184
|
+
.map((field) => ({
|
|
185
|
+
field: field.name,
|
|
186
|
+
label: field.name.replace('comparison_', 'comparison '),
|
|
187
|
+
}))
|
|
188
|
+
.filter((field, index) => field.field !== 'comparison_' + pivot.rowField || index === 0);
|
|
189
|
+
if (pivot.rowFieldType !== 'string') {
|
|
190
|
+
rows.forEach((row) => {
|
|
191
|
+
row[pivot.rowField] = getDateString(row[pivot.rowField], undefined, dateBucket);
|
|
192
|
+
});
|
|
193
|
+
// add a row for each date in the range that doesn't have a value
|
|
194
|
+
if (pivot.rowFieldType !== 'string') {
|
|
195
|
+
const dateSet = new Set(rows.map((row) => row[pivot.rowField]));
|
|
196
|
+
// create a loop that will go through each formatted date and add a row if it doesn't exist going to the current date
|
|
197
|
+
for (let date = dateFilter.startDate; date <= new Date(); date = new Date(date.getTime() + 24 * 60 * 60 * 1000)) {
|
|
198
|
+
const formattedDate = getDateString(date.toDateString(), undefined, dateBucket);
|
|
199
|
+
if (!dateSet.has(formattedDate)) {
|
|
200
|
+
const newRow = {};
|
|
201
|
+
newRow[pivot.rowField] = formattedDate;
|
|
202
|
+
rows.push(newRow);
|
|
203
|
+
dateSet.add(formattedDate);
|
|
204
|
+
}
|
|
205
|
+
// order the rows by the date field
|
|
206
|
+
rows.sort((a, b) => {
|
|
207
|
+
return new Date(a[pivot.rowField]) < new Date(b[pivot.rowField])
|
|
208
|
+
? -1
|
|
209
|
+
: 1;
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
rows: rows,
|
|
216
|
+
columns: columns,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch (e) { }
|
|
221
|
+
}
|
|
114
222
|
return pivot && data.rows
|
|
115
223
|
? generatePivotTable(pivot, JSON.parse(JSON.stringify(data.rows)), // deep copy
|
|
116
224
|
dateFilter?.startDate && dateFilter?.endDate
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/errorProcessing.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"errorProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/errorProcessing.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,QAI/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG3D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,EAAE,GACxB,MAAM,CAsCR;
|
|
1
|
+
{"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG3D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,EAAE,GACxB,MAAM,CAsCR;AAkBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,WAgBxC;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,cAAc,EAAE,EACzB,YAAY,EAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE;;;;EAsCvC;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE;IACf,SAAS,EAAE,GAAG,CAAC;IACf,YAAY,EAAE,GAAG,CAAC;IAClB,WAAW,EAAE,GAAG,CAAC;CAClB,GACA,KAAK,CAqCP"}
|
|
@@ -30,48 +30,6 @@ export function pivotToSql(pivot, query, columns) {
|
|
|
30
30
|
}
|
|
31
31
|
return query;
|
|
32
32
|
}
|
|
33
|
-
function createPivotSqlQuery(rowField, columnField, valueField, aggregationType, query) {
|
|
34
|
-
// const sqlAggregationType = convertToSqlAggregationType(aggregationType);
|
|
35
|
-
return `with query_table as (${query}),
|
|
36
|
-
distinct_column_fields as (
|
|
37
|
-
select distinct
|
|
38
|
-
${columnField}
|
|
39
|
-
from
|
|
40
|
-
query_table
|
|
41
|
-
),
|
|
42
|
-
case_when_query as (
|
|
43
|
-
select
|
|
44
|
-
string_agg(
|
|
45
|
-
concat(
|
|
46
|
-
'${aggregationType}(CASE WHEN ${columnField} = ''',
|
|
47
|
-
replace(${columnField}, '''', ''''''),
|
|
48
|
-
''' THEN ${valueField} ELSE 0 END) AS ',
|
|
49
|
-
concat(concat('"', replace(${columnField}, ' ', '_')), '"')
|
|
50
|
-
),
|
|
51
|
-
',
|
|
52
|
-
'
|
|
53
|
-
) as sql_part
|
|
54
|
-
from
|
|
55
|
-
distinct_column_fields
|
|
56
|
-
),
|
|
57
|
-
joined_queries as (
|
|
58
|
-
select
|
|
59
|
-
concat(
|
|
60
|
-
'WITH query_table as (${query}) SELECT ${rowField}, ',
|
|
61
|
-
sql_part,
|
|
62
|
-
'
|
|
63
|
-
FROM query_table
|
|
64
|
-
GROUP BY ${rowField}
|
|
65
|
-
ORDER BY ${rowField}'
|
|
66
|
-
) as query
|
|
67
|
-
from
|
|
68
|
-
case_when_query
|
|
69
|
-
)
|
|
70
|
-
select
|
|
71
|
-
query
|
|
72
|
-
from
|
|
73
|
-
joined_queries;`;
|
|
74
|
-
}
|
|
75
33
|
function generateTwoDPivotQuery(pivot, query, columns) {
|
|
76
34
|
const caseWhens = columns.map((column) => {
|
|
77
35
|
return `${pivot.aggregationType}(
|
|
@@ -1,2 +1,4 @@
|
|
|
1
|
+
import { Pivot } from '../internals/ReportBuilder/PivotModal';
|
|
1
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
4
|
//# sourceMappingURL=queryConstructor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,UAQ1E"}
|
|
1
|
+
{"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAa9D,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,CAcpB"}
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
import { isValidPivot } from './pivotProcessing';
|
|
2
|
+
function processAggType(aggType) {
|
|
3
|
+
if (aggType === 'count')
|
|
4
|
+
return 'SUM';
|
|
5
|
+
return aggType?.toLowerCase() === 'average' ? 'AVG' : aggType?.toLowerCase();
|
|
6
|
+
}
|
|
7
|
+
function processValueField(aggType, valueField) {
|
|
8
|
+
if (aggType === 'count')
|
|
9
|
+
return 1;
|
|
10
|
+
return valueField ? `"${valueField}"` : 1;
|
|
11
|
+
}
|
|
1
12
|
export function generateDistinctQuery(stringFields, query) {
|
|
2
13
|
const distinctQueries = stringFields.map((field) => {
|
|
3
14
|
return `SELECT '${field}' AS field, ARRAY_AGG(DISTINCT ${field}) AS string_values FROM querytable`;
|
|
@@ -5,3 +16,109 @@ export function generateDistinctQuery(stringFields, query) {
|
|
|
5
16
|
const distinctQuery = distinctQueries.join(' UNION ALL ');
|
|
6
17
|
return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
|
|
7
18
|
}
|
|
19
|
+
export function generatePivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval) {
|
|
20
|
+
if (!isValidPivot(pivot)) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
if (pivot.columnField) {
|
|
24
|
+
return create2DPivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval);
|
|
25
|
+
}
|
|
26
|
+
return create1DPivotQuery(pivot, itemQueries, dateBucket, comparisonInterval);
|
|
27
|
+
}
|
|
28
|
+
function create2DPivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval) {
|
|
29
|
+
if (!pivot || !pivot.columnField) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
// @ts-ignore
|
|
33
|
+
const columnValues = rows.map((row) => row[pivot.columnField]);
|
|
34
|
+
const distinctColumnValues = Array.from(new Set(columnValues)).filter((value) => value !== undefined && value !== null);
|
|
35
|
+
if (distinctColumnValues.length === 0) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
if (pivot.rowFieldType === 'string') {
|
|
39
|
+
return create2DStringPivotQuery(pivot, itemQueries, distinctColumnValues);
|
|
40
|
+
}
|
|
41
|
+
return create2DDatePivotQuery(pivot, itemQueries, distinctColumnValues, dateBucket, comparisonInterval);
|
|
42
|
+
}
|
|
43
|
+
function create2DStringPivotQuery(pivot, itemQueries, distinctColumnValues) {
|
|
44
|
+
const caseWhens = distinctColumnValues.map((column) => {
|
|
45
|
+
return `${processAggType(pivot.aggregationType)}(CASE WHEN "${pivot.columnField}" = '${column.replaceAll("'", "''")}' THEN ${processValueField(pivot.aggregationType, pivot.valueField)} ELSE 0 END) AS "${column}"`;
|
|
46
|
+
});
|
|
47
|
+
const caseWhensCompare = distinctColumnValues.map((column) => {
|
|
48
|
+
return `${processAggType(pivot.aggregationType)}(CASE WHEN "${pivot.columnField}" = '${column.replaceAll("'", "''")}' THEN ${processValueField(pivot.aggregationType, pivot.valueField)} ELSE 0 END) AS "comparison_${column}"`;
|
|
49
|
+
});
|
|
50
|
+
const compareCTE = itemQueries[1]
|
|
51
|
+
? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
|
|
52
|
+
: '';
|
|
53
|
+
const compareCaseWhenCTE = itemQueries[1]
|
|
54
|
+
? `, quill_ct_cw as (SELECT ${pivot.rowField}, ${caseWhensCompare.join(', ')} FROM quill_ct GROUP BY ${pivot.rowField})`
|
|
55
|
+
: '';
|
|
56
|
+
const joinQuery = itemQueries[1]
|
|
57
|
+
? `JOIN quill_ct_cw ct ON ct."${pivot.rowField}" = qt."${pivot.rowField}"`
|
|
58
|
+
: '';
|
|
59
|
+
return `WITH quill_qt AS (${itemQueries[0]?.replaceAll(';', '')}),
|
|
60
|
+
quill_qt_cw AS (SELECT ${pivot.rowField}, ${caseWhens.join(', ')} FROM quill_qt GROUP BY ${pivot.rowField})
|
|
61
|
+
${compareCTE} ${compareCaseWhenCTE}
|
|
62
|
+
SELECT * FROM quill_qt_cw qt
|
|
63
|
+
${joinQuery}`;
|
|
64
|
+
}
|
|
65
|
+
function create2DDatePivotQuery(pivot, itemQueries, distinctColumnValues, dateBucket = 'month', comparisonInterval) {
|
|
66
|
+
const caseWhens = distinctColumnValues.map((column) => {
|
|
67
|
+
return `${processAggType(pivot.aggregationType)}(CASE WHEN qt."${pivot.columnField}" = '${column.replaceAll("'", "''")}' THEN ${processValueField(pivot.aggregationType, pivot.valueField)} ELSE 0 END) AS "${column}"`;
|
|
68
|
+
});
|
|
69
|
+
const caseWhensCompare = distinctColumnValues.map((column) => {
|
|
70
|
+
return `${processAggType(pivot.aggregationType)}(CASE WHEN "${pivot.columnField}" = '${column.replaceAll("'", "''")}' THEN ${processValueField(pivot.aggregationType, pivot.valueField)} ELSE 0 END) AS "comparison_${column}"`;
|
|
71
|
+
});
|
|
72
|
+
const compareCTE = itemQueries[1] && comparisonInterval
|
|
73
|
+
? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
|
|
74
|
+
: '';
|
|
75
|
+
const compareCaseWhenCTE = itemQueries[1] && comparisonInterval
|
|
76
|
+
? `, quill_ct_cw as (SELECT date_trunc('${dateBucket}', ${pivot.rowField}) as comparison_${pivot.rowField}, ${caseWhensCompare.join(', ')} FROM quill_ct GROUP BY date_trunc('${dateBucket}', ${pivot.rowField}))`
|
|
77
|
+
: '';
|
|
78
|
+
const joinQuery = itemQueries[1] && comparisonInterval
|
|
79
|
+
? `LEFT JOIN quill_ct_cw ct ON qt."${pivot.rowField}" = date_trunc('${dateBucket}', (ct."comparison_${pivot.rowField}" + INTERVAL '${comparisonInterval} day'))`
|
|
80
|
+
: '';
|
|
81
|
+
return `WITH quill_query_table AS (${itemQueries[0]?.replaceAll(';', '')}),
|
|
82
|
+
quill_qt_agg as (SELECT date_trunc('${dateBucket}', ${pivot.rowField}) as ${pivot.rowField}, ${caseWhens.join(', ')} FROM quill_query_table qt GROUP BY date_trunc('${dateBucket}', ${pivot.rowField}))
|
|
83
|
+
${compareCTE} ${compareCaseWhenCTE}
|
|
84
|
+
SELECT * FROM quill_qt_agg qt
|
|
85
|
+
${joinQuery} ORDER BY qt."${pivot.rowField}"`;
|
|
86
|
+
}
|
|
87
|
+
function create1DPivotQuery(pivot, itemQueries, dateBucket = 'month', comparisonInterval) {
|
|
88
|
+
if (pivot.rowFieldType === 'string') {
|
|
89
|
+
return create1DStringPivotQuery(pivot, itemQueries);
|
|
90
|
+
}
|
|
91
|
+
return create1DDatePivotQuery(pivot, itemQueries, dateBucket, comparisonInterval);
|
|
92
|
+
}
|
|
93
|
+
function create1DStringPivotQuery(pivot, itemQueries) {
|
|
94
|
+
const compareCTE = itemQueries[1]
|
|
95
|
+
? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
|
|
96
|
+
: '';
|
|
97
|
+
const compareCaseWhenCTE = itemQueries[1]
|
|
98
|
+
? `, quill_ct_cw as (SELECT ${pivot.rowField}, ${processAggType(pivot.aggregationType)}(${pivot.valueField}) as comparison_${pivot.valueField} FROM quill_ct GROUP BY ${pivot.rowField})`
|
|
99
|
+
: '';
|
|
100
|
+
const joinQuery = itemQueries[1]
|
|
101
|
+
? `JOIN quill_ct_cw ct ON ct."${pivot.rowField}" = qt."${pivot.rowField}"`
|
|
102
|
+
: '';
|
|
103
|
+
return `WITH quill_qt AS (${itemQueries[0]?.replaceAll(';', '')}),
|
|
104
|
+
quill_qt_cw AS (SELECT ${pivot.rowField}, ${processAggType(pivot.aggregationType)}(${pivot.valueField}) as ${pivot.valueField} FROM quill_qt GROUP BY ${pivot.rowField})
|
|
105
|
+
${compareCTE} ${compareCaseWhenCTE}
|
|
106
|
+
SELECT * FROM quill_qt_cw qt
|
|
107
|
+
${joinQuery}`;
|
|
108
|
+
}
|
|
109
|
+
function create1DDatePivotQuery(pivot, itemQueries, dateBucket = 'month', comparisonInterval) {
|
|
110
|
+
const compareCTE = itemQueries[1] && comparisonInterval
|
|
111
|
+
? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
|
|
112
|
+
: '';
|
|
113
|
+
const compareCaseWhenCTE = itemQueries[1] && comparisonInterval
|
|
114
|
+
? `, quill_ct_cw as (SELECT date_trunc('${dateBucket}', ${pivot.rowField}) as comparison_${pivot.rowField}, ${processAggType(pivot.aggregationType)}(${pivot.valueField}) as comparison_${pivot.valueField} FROM quill_ct GROUP BY date_trunc('${dateBucket}', ${pivot.rowField}))`
|
|
115
|
+
: '';
|
|
116
|
+
const joinQuery = itemQueries[1] && comparisonInterval
|
|
117
|
+
? `LEFT JOIN quill_ct_cw ct ON qt."${pivot.rowField}" = date_trunc('${dateBucket}', (ct."comparison_${pivot.rowField}" + INTERVAL '${comparisonInterval}'))`
|
|
118
|
+
: '';
|
|
119
|
+
return `WITH quill_qt AS (${itemQueries[0]?.replaceAll(';', '')}),
|
|
120
|
+
quill_qt_agg AS (SELECT date_trunc('${dateBucket}', ${pivot.rowField}) as ${pivot.rowField}, ${processAggType(pivot.aggregationType)}(${pivot.valueField}) as ${pivot.valueField} FROM quill_qt GROUP BY date_trunc('${dateBucket}', ${pivot.rowField}))
|
|
121
|
+
${compareCTE} ${compareCaseWhenCTE}
|
|
122
|
+
SELECT * FROM quill_qt_agg qt
|
|
123
|
+
${joinQuery} ORDER BY qt."${pivot.rowField}"`;
|
|
124
|
+
}
|