@quillsql/react 2.12.28 → 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 +10 -8
- package/dist/cjs/ChartBuilder.d.ts +35 -1
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +38 -4
- 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.map +1 -1
- package/dist/cjs/Dashboard.js +76 -49
- package/dist/cjs/ReportBuilder.d.ts +9 -0
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +330 -100
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +98 -29
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +8 -8
- package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +20 -16
- 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.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +56 -57
- 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/dashboard.js +1 -1
- 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 +9 -4
- package/dist/cjs/utils/dates.d.ts +1 -0
- package/dist/cjs/utils/dates.d.ts.map +1 -1
- package/dist/cjs/utils/dates.js +12 -3
- 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.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +58 -5
- package/dist/cjs/utils/queryConstructor.d.ts +4 -2
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +118 -57
- 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 +1 -0
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +42 -5
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +10 -8
- package/dist/esm/ChartBuilder.d.ts +35 -1
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +36 -3
- 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.map +1 -1
- package/dist/esm/Dashboard.js +77 -50
- package/dist/esm/ReportBuilder.d.ts +9 -0
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +333 -103
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +99 -30
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +8 -8
- package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +20 -16
- 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.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +57 -58
- 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/dashboard.js +1 -1
- 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 +9 -4
- package/dist/esm/utils/dates.d.ts +1 -0
- package/dist/esm/utils/dates.d.ts.map +1 -1
- package/dist/esm/utils/dates.js +10 -2
- 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.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +58 -5
- package/dist/esm/utils/queryConstructor.d.ts +4 -2
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +115 -56
- 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 +1 -0
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +41 -5
- 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
|
@@ -57,9 +57,10 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
57
57
|
setAllowedRowFields(possibleColumns.rowFields);
|
|
58
58
|
setAllowedColumnFields(possibleColumns.columnFields);
|
|
59
59
|
setAllowedValueFields(possibleColumns.valueFields);
|
|
60
|
-
return possibleColumns;
|
|
60
|
+
return { possibleColumns, uniqueValues: {} };
|
|
61
61
|
}
|
|
62
|
-
const
|
|
62
|
+
const smallStringColumns = await (0, tableProcessing_1.getCountsByColumns)(stringColumns, query || '', client, customFields);
|
|
63
|
+
const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(smallStringColumns, query || '', data.rows || [], client, customFields);
|
|
63
64
|
if (!uniqueValues ||
|
|
64
65
|
(0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
|
|
65
66
|
const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(columns, newUniqueValues || {});
|
|
@@ -67,17 +68,16 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
67
68
|
setAllowedColumnFields(possibleColumns.columnFields);
|
|
68
69
|
setAllowedValueFields(possibleColumns.valueFields);
|
|
69
70
|
setUniqueValues(newUniqueValues);
|
|
70
|
-
return possibleColumns;
|
|
71
|
+
return { possibleColumns, uniqueValues: newUniqueValues };
|
|
71
72
|
}
|
|
72
73
|
}
|
|
73
|
-
return {
|
|
74
|
+
return {
|
|
75
|
+
possibleColumns: { rowFields: [], columnFields: [], valueFields: [] },
|
|
76
|
+
uniqueValues: {},
|
|
77
|
+
};
|
|
74
78
|
};
|
|
75
79
|
const getAllDateRangesByColumn = async () => {
|
|
76
80
|
// Don't reprocess dateRanges if they are already gathered
|
|
77
|
-
if (Object.keys(dateRanges).length > 0 ||
|
|
78
|
-
(client && client.databaseType !== 'postgresql')) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
81
|
if (columns) {
|
|
82
82
|
const dateColumns = columns.filter((column) => {
|
|
83
83
|
return column.jsType === 'date';
|
|
@@ -154,7 +154,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
154
154
|
});
|
|
155
155
|
}
|
|
156
156
|
else {
|
|
157
|
-
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
|
|
157
|
+
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
|
|
158
158
|
setSamplePivotTable({ pivot: pivot, rows, columns });
|
|
159
159
|
}
|
|
160
160
|
}
|
|
@@ -170,30 +170,6 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
170
170
|
getDistinctValues();
|
|
171
171
|
}
|
|
172
172
|
}, [initialSelectedPivotTable, columns, data, pivotRowField]);
|
|
173
|
-
(0, react_1.useEffect)(() => {
|
|
174
|
-
const fetchPivotTables = async () => {
|
|
175
|
-
const pivot = {
|
|
176
|
-
rowField: pivotRowField || '',
|
|
177
|
-
rowFieldType: columnsToShow[pivotRowField || ''],
|
|
178
|
-
columnField: pivotColumnField,
|
|
179
|
-
columnFieldType: columnsToShow[pivotColumnField || ''],
|
|
180
|
-
valueField: pivotValueField || '',
|
|
181
|
-
aggregationType: pivotAggregation || '',
|
|
182
|
-
};
|
|
183
|
-
if ((0, pivotProcessing_1.isValidPivot)(pivot) && data && columns) {
|
|
184
|
-
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
|
|
185
|
-
setSamplePivotTable({ pivot: pivot, rows, columns });
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
fetchPivotTables();
|
|
189
|
-
}, [
|
|
190
|
-
data,
|
|
191
|
-
columns,
|
|
192
|
-
pivotRowField,
|
|
193
|
-
pivotColumnField,
|
|
194
|
-
pivotValueField,
|
|
195
|
-
pivotAggregation,
|
|
196
|
-
]);
|
|
197
173
|
(0, react_1.useEffect)(() => {
|
|
198
174
|
if (!initialUniqueValues) {
|
|
199
175
|
return;
|
|
@@ -221,7 +197,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
221
197
|
return null;
|
|
222
198
|
}
|
|
223
199
|
const pivot = createdPivots[selectedPivotIndex];
|
|
224
|
-
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
|
|
200
|
+
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
|
|
225
201
|
setSelectedPivotTable({
|
|
226
202
|
pivot: pivot,
|
|
227
203
|
rows: rows,
|
|
@@ -232,7 +208,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
232
208
|
}, [selectedPivotIndex, data, dateRange, createdPivots]);
|
|
233
209
|
const onSelectRecommendedPivot = (pivot, index) => {
|
|
234
210
|
if (showEditOnPivotClick) {
|
|
235
|
-
onEditPivot(pivot, index);
|
|
211
|
+
onEditPivot(pivot, index, 'recommended');
|
|
236
212
|
return;
|
|
237
213
|
}
|
|
238
214
|
if (index === selectedPivotIndex && selectedPivotType === 'recommended') {
|
|
@@ -245,18 +221,24 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
245
221
|
setIsOpen(false);
|
|
246
222
|
};
|
|
247
223
|
const onSelectCreatedPivot = (pivot, index) => {
|
|
248
|
-
selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField]?.dateRange);
|
|
224
|
+
selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField]?.dateRange, samplePivotTable);
|
|
249
225
|
setSelectedPivotType('created');
|
|
250
226
|
setIsOpen(false);
|
|
251
227
|
setPopUpTitle('Add pivot');
|
|
252
228
|
};
|
|
253
|
-
const onEditPivot = async (pivot, index) => {
|
|
229
|
+
const onEditPivot = async (pivot, index, pivotType) => {
|
|
254
230
|
setIsLoading(false);
|
|
255
231
|
setPivotRowField(pivot.rowField);
|
|
256
232
|
setPivotColumnField(pivot.columnField);
|
|
257
233
|
setPivotValueField(pivot.valueField);
|
|
258
234
|
setPivotAggregation(pivot.aggregationType);
|
|
259
235
|
setShowUpdatePivot(true);
|
|
236
|
+
if (pivotType === 'recommended' &&
|
|
237
|
+
index !== null &&
|
|
238
|
+
recommendedPivotTables[index]) {
|
|
239
|
+
setSamplePivotTable(recommendedPivotTables[index]);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
260
242
|
if ((0, pivotProcessing_1.isValidPivot)(pivot)) {
|
|
261
243
|
let dateBucket = undefined;
|
|
262
244
|
if (pivotRowField && dateRanges[pivotRowField]) {
|
|
@@ -278,6 +260,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
278
260
|
return;
|
|
279
261
|
}
|
|
280
262
|
setIsLoading(true);
|
|
263
|
+
let tempUniqueValues = uniqueValues;
|
|
281
264
|
let possibleColumns = {
|
|
282
265
|
rowFields: allowedRowFields,
|
|
283
266
|
columnFields: allowedColumnFields,
|
|
@@ -287,7 +270,9 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
287
270
|
allowedColumnFields.length === 0 &&
|
|
288
271
|
allowedValueFields.length === 0) ||
|
|
289
272
|
!uniqueValues) {
|
|
290
|
-
|
|
273
|
+
const distinctValues = await getDistinctValues();
|
|
274
|
+
possibleColumns = distinctValues.possibleColumns;
|
|
275
|
+
tempUniqueValues = distinctValues.uniqueValues;
|
|
291
276
|
}
|
|
292
277
|
const cloudBody = {
|
|
293
278
|
pivotCountRequest,
|
|
@@ -307,9 +292,8 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
307
292
|
try {
|
|
308
293
|
const resp = await (0, dataFetcher_1.getDataFromCloud)(client, 'pivotai', cloudBody);
|
|
309
294
|
const recommendedPivots = resp?.data?.pivotTables.map((pivot) => (0, pivotProcessing_1.cleanPivot)(pivot, possibleColumns)) || [];
|
|
310
|
-
|
|
311
|
-
if (pivot.columnField &&
|
|
312
|
-
columnsToShow[pivot.columnField] === 'date') {
|
|
295
|
+
const cleanedPivots = recommendedPivots.map((pivot) => {
|
|
296
|
+
if (pivot.columnField && columnsToShow[pivot.columnField] === 'date') {
|
|
313
297
|
const columnField = pivot.columnField;
|
|
314
298
|
pivot.columnField = pivot.rowField;
|
|
315
299
|
pivot.rowField = columnField;
|
|
@@ -322,7 +306,13 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
322
306
|
: undefined,
|
|
323
307
|
title: generatePivotTitle(pivot),
|
|
324
308
|
};
|
|
309
|
+
});
|
|
310
|
+
setRecommendedPivots(cleanedPivots);
|
|
311
|
+
const pts = await Promise.all(cleanedPivots.map(async (p) => {
|
|
312
|
+
const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6, undefined, undefined, report, client, tempUniqueValues);
|
|
313
|
+
return { pivot: p, rows, columns };
|
|
325
314
|
}));
|
|
315
|
+
setRecommendedPivotTables(pts);
|
|
326
316
|
setSelectedPivotIndex(-1);
|
|
327
317
|
}
|
|
328
318
|
catch (e) {
|
|
@@ -375,21 +365,34 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
375
365
|
}, 500);
|
|
376
366
|
};
|
|
377
367
|
const [recommendedPivotTables, setRecommendedPivotTables] = (0, react_1.useState)([]);
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
368
|
+
// useEffect(() => {
|
|
369
|
+
// const fetchPivotTables = async () => {
|
|
370
|
+
// const pts = await Promise.all(
|
|
371
|
+
// recommendedPivots.map(async (p: Pivot) => {
|
|
372
|
+
// const { rows, columns } = await generatePivotTable(
|
|
373
|
+
// p,
|
|
374
|
+
// data,
|
|
375
|
+
// dateRange,
|
|
376
|
+
// false,
|
|
377
|
+
// 6,
|
|
378
|
+
// undefined,
|
|
379
|
+
// undefined,
|
|
380
|
+
// report,
|
|
381
|
+
// client,
|
|
382
|
+
// uniqueValues,
|
|
383
|
+
// );
|
|
384
|
+
// return { pivot: p, rows, columns };
|
|
385
|
+
// }),
|
|
386
|
+
// );
|
|
387
|
+
// setRecommendedPivotTables(pts);
|
|
388
|
+
// };
|
|
389
|
+
// fetchPivotTables();
|
|
390
|
+
// }, [recommendedPivots, dateRange]);
|
|
388
391
|
const [createdPivotTables, setCreatedPivotTables] = (0, react_1.useState)([]);
|
|
389
392
|
(0, react_1.useEffect)(() => {
|
|
390
393
|
const fetchPivotTables = async () => {
|
|
391
394
|
const pts = await Promise.all(createdPivots.map(async (p) => {
|
|
392
|
-
const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6);
|
|
395
|
+
const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6, undefined, undefined, report, client, uniqueValues);
|
|
393
396
|
return { pivot: p, rows, columns };
|
|
394
397
|
}));
|
|
395
398
|
setCreatedPivotTables(pts);
|
|
@@ -798,11 +801,7 @@ const fixBigQueryData = (data = []) => {
|
|
|
798
801
|
};
|
|
799
802
|
async function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket, report, client, uniqueValues) {
|
|
800
803
|
try {
|
|
801
|
-
if (report &&
|
|
802
|
-
report.rowCount &&
|
|
803
|
-
report.rowCount !== data.length &&
|
|
804
|
-
client &&
|
|
805
|
-
client.databaseType.toLowerCase() === 'postgresql') {
|
|
804
|
+
if (report && report.rowCount && report.rowCount !== data.length) {
|
|
806
805
|
let dateFilter = report
|
|
807
806
|
? report.filtersApplied.find((f) => f.filterType === 'date_range')
|
|
808
807
|
: undefined;
|
|
@@ -7,4 +7,5 @@ export declare function convertPostgresColumn(field: {
|
|
|
7
7
|
export declare function convertColumnInfoToColumnInternal(columnInfo: ColumnInfo): ColumnInternal;
|
|
8
8
|
export declare function convertFieldTypeToJSType(fieldType: string): string;
|
|
9
9
|
export declare function convertFormatToJsType(column: Column): string;
|
|
10
|
+
export declare function processColumnName(columnName: string): string;
|
|
10
11
|
//# sourceMappingURL=columnProcessing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columnProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/columnProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"columnProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/columnProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAM3D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,cAAc,CAyGjB;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,UAAU,GACrB,cAAc,CAShB;AA0DD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAsBlE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAY5D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.convertFormatToJsType = exports.convertFieldTypeToJSType = exports.convertColumnInfoToColumnInternal = exports.convertPostgresColumn = void 0;
|
|
3
|
+
exports.processColumnName = exports.convertFormatToJsType = exports.convertFieldTypeToJSType = exports.convertColumnInfoToColumnInternal = exports.convertPostgresColumn = void 0;
|
|
4
|
+
function removeBigQuerySpecialChars(columnName) {
|
|
5
|
+
return columnName.replaceAll('quill_forward_slash', '/');
|
|
6
|
+
}
|
|
4
7
|
function convertPostgresColumn(field) {
|
|
5
8
|
let format;
|
|
6
9
|
let fieldType;
|
|
@@ -207,3 +210,7 @@ function convertFormatToJsType(column) {
|
|
|
207
210
|
}
|
|
208
211
|
}
|
|
209
212
|
exports.convertFormatToJsType = convertFormatToJsType;
|
|
213
|
+
function processColumnName(columnName) {
|
|
214
|
+
return removeBigQuerySpecialChars(columnName);
|
|
215
|
+
}
|
|
216
|
+
exports.processColumnName = processColumnName;
|
|
@@ -124,7 +124,7 @@ async function getPivotTable(report, dashboardFilters, client, dateBucketInitial
|
|
|
124
124
|
}
|
|
125
125
|
const pivot = report?.pivot;
|
|
126
126
|
const data = report || {};
|
|
127
|
-
if (pivot && client
|
|
127
|
+
if (pivot && client) {
|
|
128
128
|
if (report.rowCount === 0) {
|
|
129
129
|
return { rows: [], columns: [] };
|
|
130
130
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare function getData(client: any, cloudQueryEndpoint: string, noCred: RequestCredentials, hostedRequestBody: any, cloudRequestBody: any, method?: string): Promise<any>;
|
|
1
|
+
export declare function getData(client: any, cloudQueryEndpoint: string, noCred: RequestCredentials, hostedRequestBody: any, cloudRequestBody: any, method?: string, queryParam?: string): Promise<any>;
|
|
2
2
|
export declare function getDataFromCloud(client: any, cloudQueryEndpoint: string, cloudRequestBody: any, method?: string): Promise<any>;
|
|
3
3
|
//# sourceMappingURL=dataFetcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/dataFetcher.tsx"],"names":[],"mappings":"AAqBA,wBAAsB,OAAO,CAC3B,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,GAAG,EACtB,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"dataFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/dataFetcher.tsx"],"names":[],"mappings":"AAqBA,wBAAsB,OAAO,CAC3B,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,GAAG,EACtB,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,EACf,UAAU,CAAC,EAAE,MAAM,gBAwGpB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBAgChB"}
|
|
@@ -11,7 +11,7 @@ function parseData(rows, queryType) {
|
|
|
11
11
|
end: new Date(rows[0]?.max_date),
|
|
12
12
|
};
|
|
13
13
|
case 'rowCount':
|
|
14
|
-
return parseInt(rows[0]?.
|
|
14
|
+
return parseInt(rows[0]?.row_count);
|
|
15
15
|
case 'distinctStrings':
|
|
16
16
|
return rows.map((row) => {
|
|
17
17
|
return row['column_field'];
|
|
@@ -22,11 +22,15 @@ function parseData(rows, queryType) {
|
|
|
22
22
|
}
|
|
23
23
|
// this function gets the data either from the self hosted endpoint or
|
|
24
24
|
// our cloud server
|
|
25
|
-
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
|
+
}
|
|
26
29
|
try {
|
|
27
30
|
if (client.queryEndpoint) {
|
|
28
31
|
// self hosted
|
|
29
|
-
const
|
|
32
|
+
const processedParam = queryParam ? `?${queryParam}` : '';
|
|
33
|
+
const resp = await fetch(`${client.queryEndpoint}${processedParam}`, {
|
|
30
34
|
method: 'POST',
|
|
31
35
|
headers: {
|
|
32
36
|
...client.queryHeaders,
|
|
@@ -42,7 +46,8 @@ async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cl
|
|
|
42
46
|
let result;
|
|
43
47
|
if (hostedRequestBody &&
|
|
44
48
|
hostedRequestBody.metadata &&
|
|
45
|
-
hostedRequestBody.metadata.task === 'report'
|
|
49
|
+
(hostedRequestBody.metadata.task === 'report' ||
|
|
50
|
+
hostedRequestBody.metadata.useUpdatedDataGathering)) {
|
|
46
51
|
if (responseJson.data?.data) {
|
|
47
52
|
result = {
|
|
48
53
|
fields: responseJson?.data.queries?.queryResults[0]?.fields,
|
|
@@ -1 +1 @@
|
|
|
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"}
|
|
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,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getDateBucketFromRange = exports.getComparisonInterval = exports.isDateFormat = exports.convertComparisonRange = void 0;
|
|
3
|
+
exports.parseDateByDatabaseType = exports.getDateBucketFromRange = exports.getComparisonInterval = exports.isDateFormat = exports.convertComparisonRange = void 0;
|
|
4
4
|
const date_fns_1 = require("date-fns");
|
|
5
5
|
const dateRangePickerUtils_1 = require("../DateRangePicker/dateRangePickerUtils");
|
|
6
6
|
/**
|
|
@@ -44,10 +44,10 @@ function getComparisonInterval(comparisonRange, dateBucket) {
|
|
|
44
44
|
const dayCount = (0, date_fns_1.differenceInDays)(comparisonRange.endDate, comparisonRange.startDate);
|
|
45
45
|
if (!isNaN(dayCount)) {
|
|
46
46
|
if (dateBucket === 'month') {
|
|
47
|
-
return dayCount / 30 + ' month';
|
|
47
|
+
return Math.floor(dayCount / 30) + ' month';
|
|
48
48
|
}
|
|
49
49
|
else if (dateBucket === 'year') {
|
|
50
|
-
return dayCount / 365 + ' year';
|
|
50
|
+
return Math.floor(dayCount / 365) + ' year';
|
|
51
51
|
}
|
|
52
52
|
else {
|
|
53
53
|
return dayCount + ' day';
|
|
@@ -71,3 +71,12 @@ function getDateBucketFromRange(dateRange) {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
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,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;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generatePivotWithSQL = void 0;
|
|
4
|
+
const ChartBuilder_1 = require("../ChartBuilder");
|
|
5
|
+
const ast_1 = require("../components/ReportBuilder/ast");
|
|
4
6
|
const PivotModal_1 = require("../internals/ReportBuilder/PivotModal");
|
|
7
|
+
const columnProcessing_1 = require("./columnProcessing");
|
|
5
8
|
const dataFetcher_1 = require("./dataFetcher");
|
|
6
9
|
const dates_1 = require("./dates");
|
|
7
10
|
const queryConstructor_1 = require("./queryConstructor");
|
|
11
|
+
const textProcessing_1 = require("./textProcessing");
|
|
8
12
|
async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilter, distinctStrings) {
|
|
9
13
|
if (dateFilter && dateFilter.startDate) {
|
|
10
14
|
dateFilter.start = dateFilter.startDate;
|
|
@@ -25,7 +29,12 @@ async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilte
|
|
|
25
29
|
const rowColumn = report.columns.find((column) => column.field === pivot.rowField);
|
|
26
30
|
pivot.rowFieldType = rowColumn.format;
|
|
27
31
|
}
|
|
28
|
-
|
|
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);
|
|
29
38
|
if (sqlQuery && report.rows.length > 0) {
|
|
30
39
|
const hostedBody = {
|
|
31
40
|
metadata: {
|
|
@@ -42,15 +51,35 @@ async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilte
|
|
|
42
51
|
},
|
|
43
52
|
};
|
|
44
53
|
const cloudBody = { ...hostedBody };
|
|
45
|
-
const resp = await (0, dataFetcher_1.getData)(client, 'query', 'same-origin', hostedBody, cloudBody);
|
|
54
|
+
const resp = await (0, dataFetcher_1.getData)(client, 'query', 'same-origin', hostedBody, cloudBody, 'POST', 'fetch-pivot');
|
|
46
55
|
// With our current design we have to remove the second row field but leave the first for comparison purposes.
|
|
47
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
|
+
}
|
|
48
68
|
const columns = resp.queryResults[0].fields
|
|
49
69
|
.map((field) => ({
|
|
50
|
-
field: field.name,
|
|
51
|
-
label: field.name.replace('comparison_', 'comparison '),
|
|
70
|
+
field: (0, columnProcessing_1.processColumnName)(field.name),
|
|
71
|
+
label: (0, textProcessing_1.snakeCaseToTitleCase)((0, columnProcessing_1.processColumnName)(field.name.replace('comparison_', 'comparison '))),
|
|
52
72
|
}))
|
|
53
|
-
.filter((field, index) => field.field !== 'comparison_' + pivot.rowField || index === 0)
|
|
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
|
+
});
|
|
54
83
|
if (pivot.rowField && !['string', 'varchar'].includes(pivot.rowFieldType)) {
|
|
55
84
|
rows.forEach((row) => {
|
|
56
85
|
row[pivot.rowField] = (0, PivotModal_1.getDateString)(row[pivot.rowField], undefined, dateBucket);
|
|
@@ -78,6 +107,30 @@ async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilte
|
|
|
78
107
|
}
|
|
79
108
|
}
|
|
80
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
|
+
}
|
|
81
134
|
return {
|
|
82
135
|
rows: rows,
|
|
83
136
|
columns: columns,
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Pivot } from '../internals/ReportBuilder/PivotModal';
|
|
2
|
-
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;
|
|
3
5
|
export declare function generateMinMaxRangeQueries(columnFields: string[], query: string, databaseType: string): string;
|
|
4
|
-
export declare function generatePivotQuery(pivot: Pivot, itemQueries: string[],
|
|
6
|
+
export declare function generatePivotQuery(pivot: Pivot, itemQueries: string[], databaseType: string, comparisonInterval?: string, distinctStrings?: string[], dateBucket?: string): string | undefined;
|
|
5
7
|
//# sourceMappingURL=queryConstructor.d.ts.map
|