@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
|
@@ -12,7 +12,7 @@ import { isNumericColumnType, } from '../../components/ReportBuilder/ast';
|
|
|
12
12
|
import { QuillCard } from '../../components/QuillCard';
|
|
13
13
|
import { cleanPivot, getPossiblePivotFieldOptions, isValidPivot, } from '../../utils/pivotProcessing';
|
|
14
14
|
import { hashCode } from '../../utils/crypto';
|
|
15
|
-
import { getDateRangeByColumns, getUniqueValuesByColumns, } from '../../utils/tableProcessing';
|
|
15
|
+
import { getCountsByColumns, getDateRangeByColumns, getUniqueValuesByColumns, } from '../../utils/tableProcessing';
|
|
16
16
|
import { generatePivotWithSQL } from '../../utils/pivotConstructor';
|
|
17
17
|
import { getDateBucketFromRange, } from '../../utils/dates';
|
|
18
18
|
const QuillHover = () => {
|
|
@@ -54,9 +54,10 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
54
54
|
setAllowedRowFields(possibleColumns.rowFields);
|
|
55
55
|
setAllowedColumnFields(possibleColumns.columnFields);
|
|
56
56
|
setAllowedValueFields(possibleColumns.valueFields);
|
|
57
|
-
return possibleColumns;
|
|
57
|
+
return { possibleColumns, uniqueValues: {} };
|
|
58
58
|
}
|
|
59
|
-
const
|
|
59
|
+
const smallStringColumns = await getCountsByColumns(stringColumns, query || '', client, customFields);
|
|
60
|
+
const newUniqueValues = await getUniqueValuesByColumns(smallStringColumns, query || '', data.rows || [], client, customFields);
|
|
60
61
|
if (!uniqueValues ||
|
|
61
62
|
hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
62
63
|
const possibleColumns = getPossiblePivotFieldOptions(columns, newUniqueValues || {});
|
|
@@ -64,17 +65,16 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
64
65
|
setAllowedColumnFields(possibleColumns.columnFields);
|
|
65
66
|
setAllowedValueFields(possibleColumns.valueFields);
|
|
66
67
|
setUniqueValues(newUniqueValues);
|
|
67
|
-
return possibleColumns;
|
|
68
|
+
return { possibleColumns, uniqueValues: newUniqueValues };
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
|
-
return {
|
|
71
|
+
return {
|
|
72
|
+
possibleColumns: { rowFields: [], columnFields: [], valueFields: [] },
|
|
73
|
+
uniqueValues: {},
|
|
74
|
+
};
|
|
71
75
|
};
|
|
72
76
|
const getAllDateRangesByColumn = async () => {
|
|
73
77
|
// Don't reprocess dateRanges if they are already gathered
|
|
74
|
-
if (Object.keys(dateRanges).length > 0 ||
|
|
75
|
-
(client && client.databaseType !== 'postgresql')) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
78
|
if (columns) {
|
|
79
79
|
const dateColumns = columns.filter((column) => {
|
|
80
80
|
return column.jsType === 'date';
|
|
@@ -151,7 +151,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
151
151
|
});
|
|
152
152
|
}
|
|
153
153
|
else {
|
|
154
|
-
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
|
|
154
|
+
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
|
|
155
155
|
setSamplePivotTable({ pivot: pivot, rows, columns });
|
|
156
156
|
}
|
|
157
157
|
}
|
|
@@ -167,30 +167,6 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
167
167
|
getDistinctValues();
|
|
168
168
|
}
|
|
169
169
|
}, [initialSelectedPivotTable, columns, data, pivotRowField]);
|
|
170
|
-
useEffect(() => {
|
|
171
|
-
const fetchPivotTables = async () => {
|
|
172
|
-
const pivot = {
|
|
173
|
-
rowField: pivotRowField || '',
|
|
174
|
-
rowFieldType: columnsToShow[pivotRowField || ''],
|
|
175
|
-
columnField: pivotColumnField,
|
|
176
|
-
columnFieldType: columnsToShow[pivotColumnField || ''],
|
|
177
|
-
valueField: pivotValueField || '',
|
|
178
|
-
aggregationType: pivotAggregation || '',
|
|
179
|
-
};
|
|
180
|
-
if (isValidPivot(pivot) && data && columns) {
|
|
181
|
-
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
|
|
182
|
-
setSamplePivotTable({ pivot: pivot, rows, columns });
|
|
183
|
-
}
|
|
184
|
-
};
|
|
185
|
-
fetchPivotTables();
|
|
186
|
-
}, [
|
|
187
|
-
data,
|
|
188
|
-
columns,
|
|
189
|
-
pivotRowField,
|
|
190
|
-
pivotColumnField,
|
|
191
|
-
pivotValueField,
|
|
192
|
-
pivotAggregation,
|
|
193
|
-
]);
|
|
194
170
|
useEffect(() => {
|
|
195
171
|
if (!initialUniqueValues) {
|
|
196
172
|
return;
|
|
@@ -218,7 +194,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
218
194
|
return null;
|
|
219
195
|
}
|
|
220
196
|
const pivot = createdPivots[selectedPivotIndex];
|
|
221
|
-
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
|
|
197
|
+
const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
|
|
222
198
|
setSelectedPivotTable({
|
|
223
199
|
pivot: pivot,
|
|
224
200
|
rows: rows,
|
|
@@ -229,7 +205,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
229
205
|
}, [selectedPivotIndex, data, dateRange, createdPivots]);
|
|
230
206
|
const onSelectRecommendedPivot = (pivot, index) => {
|
|
231
207
|
if (showEditOnPivotClick) {
|
|
232
|
-
onEditPivot(pivot, index);
|
|
208
|
+
onEditPivot(pivot, index, 'recommended');
|
|
233
209
|
return;
|
|
234
210
|
}
|
|
235
211
|
if (index === selectedPivotIndex && selectedPivotType === 'recommended') {
|
|
@@ -242,18 +218,24 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
242
218
|
setIsOpen(false);
|
|
243
219
|
};
|
|
244
220
|
const onSelectCreatedPivot = (pivot, index) => {
|
|
245
|
-
selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField]?.dateRange);
|
|
221
|
+
selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField]?.dateRange, samplePivotTable);
|
|
246
222
|
setSelectedPivotType('created');
|
|
247
223
|
setIsOpen(false);
|
|
248
224
|
setPopUpTitle('Add pivot');
|
|
249
225
|
};
|
|
250
|
-
const onEditPivot = async (pivot, index) => {
|
|
226
|
+
const onEditPivot = async (pivot, index, pivotType) => {
|
|
251
227
|
setIsLoading(false);
|
|
252
228
|
setPivotRowField(pivot.rowField);
|
|
253
229
|
setPivotColumnField(pivot.columnField);
|
|
254
230
|
setPivotValueField(pivot.valueField);
|
|
255
231
|
setPivotAggregation(pivot.aggregationType);
|
|
256
232
|
setShowUpdatePivot(true);
|
|
233
|
+
if (pivotType === 'recommended' &&
|
|
234
|
+
index !== null &&
|
|
235
|
+
recommendedPivotTables[index]) {
|
|
236
|
+
setSamplePivotTable(recommendedPivotTables[index]);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
257
239
|
if (isValidPivot(pivot)) {
|
|
258
240
|
let dateBucket = undefined;
|
|
259
241
|
if (pivotRowField && dateRanges[pivotRowField]) {
|
|
@@ -275,6 +257,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
275
257
|
return;
|
|
276
258
|
}
|
|
277
259
|
setIsLoading(true);
|
|
260
|
+
let tempUniqueValues = uniqueValues;
|
|
278
261
|
let possibleColumns = {
|
|
279
262
|
rowFields: allowedRowFields,
|
|
280
263
|
columnFields: allowedColumnFields,
|
|
@@ -284,7 +267,9 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
284
267
|
allowedColumnFields.length === 0 &&
|
|
285
268
|
allowedValueFields.length === 0) ||
|
|
286
269
|
!uniqueValues) {
|
|
287
|
-
|
|
270
|
+
const distinctValues = await getDistinctValues();
|
|
271
|
+
possibleColumns = distinctValues.possibleColumns;
|
|
272
|
+
tempUniqueValues = distinctValues.uniqueValues;
|
|
288
273
|
}
|
|
289
274
|
const cloudBody = {
|
|
290
275
|
pivotCountRequest,
|
|
@@ -304,9 +289,8 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
304
289
|
try {
|
|
305
290
|
const resp = await getDataFromCloud(client, 'pivotai', cloudBody);
|
|
306
291
|
const recommendedPivots = resp?.data?.pivotTables.map((pivot) => cleanPivot(pivot, possibleColumns)) || [];
|
|
307
|
-
|
|
308
|
-
if (pivot.columnField &&
|
|
309
|
-
columnsToShow[pivot.columnField] === 'date') {
|
|
292
|
+
const cleanedPivots = recommendedPivots.map((pivot) => {
|
|
293
|
+
if (pivot.columnField && columnsToShow[pivot.columnField] === 'date') {
|
|
310
294
|
const columnField = pivot.columnField;
|
|
311
295
|
pivot.columnField = pivot.rowField;
|
|
312
296
|
pivot.rowField = columnField;
|
|
@@ -319,7 +303,13 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
319
303
|
: undefined,
|
|
320
304
|
title: generatePivotTitle(pivot),
|
|
321
305
|
};
|
|
306
|
+
});
|
|
307
|
+
setRecommendedPivots(cleanedPivots);
|
|
308
|
+
const pts = await Promise.all(cleanedPivots.map(async (p) => {
|
|
309
|
+
const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6, undefined, undefined, report, client, tempUniqueValues);
|
|
310
|
+
return { pivot: p, rows, columns };
|
|
322
311
|
}));
|
|
312
|
+
setRecommendedPivotTables(pts);
|
|
323
313
|
setSelectedPivotIndex(-1);
|
|
324
314
|
}
|
|
325
315
|
catch (e) {
|
|
@@ -372,21 +362,34 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
372
362
|
}, 500);
|
|
373
363
|
};
|
|
374
364
|
const [recommendedPivotTables, setRecommendedPivotTables] = useState([]);
|
|
375
|
-
useEffect(() => {
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
365
|
+
// useEffect(() => {
|
|
366
|
+
// const fetchPivotTables = async () => {
|
|
367
|
+
// const pts = await Promise.all(
|
|
368
|
+
// recommendedPivots.map(async (p: Pivot) => {
|
|
369
|
+
// const { rows, columns } = await generatePivotTable(
|
|
370
|
+
// p,
|
|
371
|
+
// data,
|
|
372
|
+
// dateRange,
|
|
373
|
+
// false,
|
|
374
|
+
// 6,
|
|
375
|
+
// undefined,
|
|
376
|
+
// undefined,
|
|
377
|
+
// report,
|
|
378
|
+
// client,
|
|
379
|
+
// uniqueValues,
|
|
380
|
+
// );
|
|
381
|
+
// return { pivot: p, rows, columns };
|
|
382
|
+
// }),
|
|
383
|
+
// );
|
|
384
|
+
// setRecommendedPivotTables(pts);
|
|
385
|
+
// };
|
|
386
|
+
// fetchPivotTables();
|
|
387
|
+
// }, [recommendedPivots, dateRange]);
|
|
385
388
|
const [createdPivotTables, setCreatedPivotTables] = useState([]);
|
|
386
389
|
useEffect(() => {
|
|
387
390
|
const fetchPivotTables = async () => {
|
|
388
391
|
const pts = await Promise.all(createdPivots.map(async (p) => {
|
|
389
|
-
const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6);
|
|
392
|
+
const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6, undefined, undefined, report, client, uniqueValues);
|
|
390
393
|
return { pivot: p, rows, columns };
|
|
391
394
|
}));
|
|
392
395
|
setCreatedPivotTables(pts);
|
|
@@ -788,11 +791,7 @@ const fixBigQueryData = (data = []) => {
|
|
|
788
791
|
};
|
|
789
792
|
export async function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket, report, client, uniqueValues) {
|
|
790
793
|
try {
|
|
791
|
-
if (report &&
|
|
792
|
-
report.rowCount &&
|
|
793
|
-
report.rowCount !== data.length &&
|
|
794
|
-
client &&
|
|
795
|
-
client.databaseType.toLowerCase() === 'postgresql') {
|
|
794
|
+
if (report && report.rowCount && report.rowCount !== data.length) {
|
|
796
795
|
let dateFilter = report
|
|
797
796
|
? report.filtersApplied.find((f) => f.filterType === 'date_range')
|
|
798
797
|
: 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,3 +1,6 @@
|
|
|
1
|
+
function removeBigQuerySpecialChars(columnName) {
|
|
2
|
+
return columnName.replaceAll('quill_forward_slash', '/');
|
|
3
|
+
}
|
|
1
4
|
export function convertPostgresColumn(field) {
|
|
2
5
|
let format;
|
|
3
6
|
let fieldType;
|
|
@@ -200,3 +203,6 @@ export function convertFormatToJsType(column) {
|
|
|
200
203
|
return 'string';
|
|
201
204
|
}
|
|
202
205
|
}
|
|
206
|
+
export function processColumnName(columnName) {
|
|
207
|
+
return removeBigQuerySpecialChars(columnName);
|
|
208
|
+
}
|
|
@@ -120,7 +120,7 @@ async function getPivotTable(report, dashboardFilters, client, dateBucketInitial
|
|
|
120
120
|
}
|
|
121
121
|
const pivot = report?.pivot;
|
|
122
122
|
const data = report || {};
|
|
123
|
-
if (pivot && client
|
|
123
|
+
if (pivot && client) {
|
|
124
124
|
if (report.rowCount === 0) {
|
|
125
125
|
return { rows: [], columns: [] };
|
|
126
126
|
}
|
|
@@ -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"}
|
|
@@ -8,7 +8,7 @@ function parseData(rows, queryType) {
|
|
|
8
8
|
end: new Date(rows[0]?.max_date),
|
|
9
9
|
};
|
|
10
10
|
case 'rowCount':
|
|
11
|
-
return parseInt(rows[0]?.
|
|
11
|
+
return parseInt(rows[0]?.row_count);
|
|
12
12
|
case 'distinctStrings':
|
|
13
13
|
return rows.map((row) => {
|
|
14
14
|
return row['column_field'];
|
|
@@ -19,11 +19,15 @@ function parseData(rows, queryType) {
|
|
|
19
19
|
}
|
|
20
20
|
// this function gets the data either from the self hosted endpoint or
|
|
21
21
|
// our cloud server
|
|
22
|
-
export async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cloudRequestBody, method = 'POST') {
|
|
22
|
+
export async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cloudRequestBody, method = 'POST', queryParam) {
|
|
23
|
+
if (!client) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
23
26
|
try {
|
|
24
27
|
if (client.queryEndpoint) {
|
|
25
28
|
// self hosted
|
|
26
|
-
const
|
|
29
|
+
const processedParam = queryParam ? `?${queryParam}` : '';
|
|
30
|
+
const resp = await fetch(`${client.queryEndpoint}${processedParam}`, {
|
|
27
31
|
method: 'POST',
|
|
28
32
|
headers: {
|
|
29
33
|
...client.queryHeaders,
|
|
@@ -39,7 +43,8 @@ export async function getData(client, cloudQueryEndpoint, noCred, hostedRequestB
|
|
|
39
43
|
let result;
|
|
40
44
|
if (hostedRequestBody &&
|
|
41
45
|
hostedRequestBody.metadata &&
|
|
42
|
-
hostedRequestBody.metadata.task === 'report'
|
|
46
|
+
(hostedRequestBody.metadata.task === 'report' ||
|
|
47
|
+
hostedRequestBody.metadata.useUpdatedDataGathering)) {
|
|
43
48
|
if (responseJson.data?.data) {
|
|
44
49
|
result = {
|
|
45
50
|
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/esm/utils/dates.js
CHANGED
|
@@ -39,10 +39,10 @@ export function getComparisonInterval(comparisonRange, dateBucket) {
|
|
|
39
39
|
const dayCount = differenceInDays(comparisonRange.endDate, comparisonRange.startDate);
|
|
40
40
|
if (!isNaN(dayCount)) {
|
|
41
41
|
if (dateBucket === 'month') {
|
|
42
|
-
return dayCount / 30 + ' month';
|
|
42
|
+
return Math.floor(dayCount / 30) + ' month';
|
|
43
43
|
}
|
|
44
44
|
else if (dateBucket === 'year') {
|
|
45
|
-
return dayCount / 365 + ' year';
|
|
45
|
+
return Math.floor(dayCount / 365) + ' year';
|
|
46
46
|
}
|
|
47
47
|
else {
|
|
48
48
|
return dayCount + ' day';
|
|
@@ -64,3 +64,11 @@ export function getDateBucketFromRange(dateRange) {
|
|
|
64
64
|
return 'year';
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
+
export function parseDateByDatabaseType(date, databaseType) {
|
|
68
|
+
if (databaseType.toLowerCase() === 'bigquery') {
|
|
69
|
+
return new Date(date.value);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
return new Date(date);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Monaco } from '@monaco-editor/react';
|
|
2
|
+
import { Range } from 'monaco-editor';
|
|
3
|
+
interface CompletionItem {
|
|
4
|
+
label: string;
|
|
5
|
+
kind: number;
|
|
6
|
+
insertText: string;
|
|
7
|
+
insertTextRules: number;
|
|
8
|
+
range: any;
|
|
9
|
+
detail?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function generateSuggestionsBySchema(schema: any[], monaco: Monaco, range: Range, databaseType: string): CompletionItem[];
|
|
12
|
+
export declare function generateSuggestionsByDatasource(monaco: Monaco, range: Range, databaseType: string): {
|
|
13
|
+
label: string;
|
|
14
|
+
kind: import("monaco-editor").languages.CompletionItemKind;
|
|
15
|
+
insertText: string;
|
|
16
|
+
insertTextRules: import("monaco-editor").languages.CompletionItemInsertTextRule;
|
|
17
|
+
range: Range;
|
|
18
|
+
}[];
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=monacoAutocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monacoAutocomplete.d.ts","sourceRoot":"","sources":["../../../src/utils/monacoAutocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAY,KAAK,EAAE,MAAM,eAAe,CAAC;AAGhD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4HD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,GAAG,EAAE,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,MAAM,GACnB,cAAc,EAAE,CA4BlB;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,MAAM;;;;;;IAMrB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { processColumnReference } from './queryConstructor';
|
|
2
|
+
const GENERIC_DATASOURCE_SUGGESTIONS = (monaco, range) => {
|
|
3
|
+
return [
|
|
4
|
+
{
|
|
5
|
+
label: 'SELECT',
|
|
6
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
7
|
+
insertText: 'SELECT',
|
|
8
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
9
|
+
range,
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
label: 'FROM',
|
|
13
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
14
|
+
insertText: 'FROM',
|
|
15
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
16
|
+
range,
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
label: 'JOIN',
|
|
20
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
21
|
+
insertText: 'JOIN',
|
|
22
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
23
|
+
range,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
label: 'LEFT JOIN',
|
|
27
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
28
|
+
insertText: 'LEFT JOIN',
|
|
29
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
30
|
+
range,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
label: 'INNER JOIN',
|
|
34
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
35
|
+
insertText: 'INNER JOIN',
|
|
36
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
37
|
+
range,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
label: 'MAX',
|
|
41
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
42
|
+
insertText: 'MAX',
|
|
43
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
44
|
+
range,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
label: 'MIN',
|
|
48
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
49
|
+
insertText: 'MIN',
|
|
50
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
51
|
+
range,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
label: 'ON',
|
|
55
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
56
|
+
insertText: 'ON',
|
|
57
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
58
|
+
range,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
label: 'WHERE',
|
|
62
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
63
|
+
insertText: 'WHERE',
|
|
64
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
65
|
+
range,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
label: 'LIMIT',
|
|
69
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
70
|
+
insertText: 'LIMIT',
|
|
71
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
72
|
+
range,
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
label: 'GROUP BY',
|
|
76
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
77
|
+
insertText: 'GROUP BY',
|
|
78
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
79
|
+
range,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
label: 'ORDER BY',
|
|
83
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
84
|
+
insertText: 'ORDER BY',
|
|
85
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
86
|
+
range,
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
};
|
|
90
|
+
const POSTGRES_DATASOURCE_SUGGESTIONS = (monaco, range) => {
|
|
91
|
+
return [
|
|
92
|
+
{
|
|
93
|
+
label: 'SELECT',
|
|
94
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
95
|
+
insertText: 'SELECT',
|
|
96
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
97
|
+
range,
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
label: 'FROM',
|
|
101
|
+
kind: monaco.languages.CompletionItemKind.Keyword,
|
|
102
|
+
insertText: 'FROM',
|
|
103
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
104
|
+
range,
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
};
|
|
108
|
+
export function generateSuggestionsBySchema(schema, monaco, range, databaseType) {
|
|
109
|
+
console.log(databaseType);
|
|
110
|
+
const suggestions = [];
|
|
111
|
+
schema.forEach((table) => {
|
|
112
|
+
const curSuggestion = {
|
|
113
|
+
label: table.name,
|
|
114
|
+
kind: monaco.languages.CompletionItemKind.Field,
|
|
115
|
+
insertText: `${processColumnReference(table.name, databaseType).replaceAll('`', '')}`,
|
|
116
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
117
|
+
range,
|
|
118
|
+
};
|
|
119
|
+
suggestions.push(curSuggestion);
|
|
120
|
+
table.columns.forEach((column) => {
|
|
121
|
+
const insertText = `${processColumnReference(column.name, databaseType).replaceAll('`', '')}`;
|
|
122
|
+
const curSuggestion = {
|
|
123
|
+
label: column.name,
|
|
124
|
+
kind: monaco.languages.CompletionItemKind.Field,
|
|
125
|
+
insertText,
|
|
126
|
+
detail: table.name,
|
|
127
|
+
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
|
128
|
+
range,
|
|
129
|
+
};
|
|
130
|
+
suggestions.push(curSuggestion);
|
|
131
|
+
});
|
|
132
|
+
}, []);
|
|
133
|
+
return suggestions;
|
|
134
|
+
}
|
|
135
|
+
export function generateSuggestionsByDatasource(monaco, range, databaseType) {
|
|
136
|
+
return [
|
|
137
|
+
...POSTGRES_DATASOURCE_SUGGESTIONS(monaco, range),
|
|
138
|
+
...GENERIC_DATASOURCE_SUGGESTIONS(monaco, range),
|
|
139
|
+
];
|
|
140
|
+
}
|
|
@@ -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,7 +1,11 @@
|
|
|
1
|
+
import { dateFormatOptions } from '../ChartBuilder';
|
|
2
|
+
import { isNumericColumnType } from '../components/ReportBuilder/ast';
|
|
1
3
|
import { getDateString } from '../internals/ReportBuilder/PivotModal';
|
|
4
|
+
import { processColumnName } from './columnProcessing';
|
|
2
5
|
import { getData } from './dataFetcher';
|
|
3
6
|
import { getComparisonInterval } from './dates';
|
|
4
7
|
import { generatePivotQuery } from './queryConstructor';
|
|
8
|
+
import { snakeCaseToTitleCase } from './textProcessing';
|
|
5
9
|
export async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilter, distinctStrings) {
|
|
6
10
|
if (dateFilter && dateFilter.startDate) {
|
|
7
11
|
dateFilter.start = dateFilter.startDate;
|
|
@@ -22,7 +26,12 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
|
|
|
22
26
|
const rowColumn = report.columns.find((column) => column.field === pivot.rowField);
|
|
23
27
|
pivot.rowFieldType = rowColumn.format;
|
|
24
28
|
}
|
|
25
|
-
|
|
29
|
+
let distinctStringValues = undefined;
|
|
30
|
+
if (!distinctStrings && report.rows && pivot.columnField) {
|
|
31
|
+
const distinctValues = Array.from(new Set(report.rows.map((row) => row[pivot.columnField])));
|
|
32
|
+
distinctStringValues = distinctValues.map((value) => value.toString());
|
|
33
|
+
}
|
|
34
|
+
const sqlQuery = generatePivotQuery(pivot, report.itemQuery, client.databaseType, comparisonInterval, distinctStrings ? distinctStrings : distinctStringValues, dateBucket);
|
|
26
35
|
if (sqlQuery && report.rows.length > 0) {
|
|
27
36
|
const hostedBody = {
|
|
28
37
|
metadata: {
|
|
@@ -39,15 +48,35 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
|
|
|
39
48
|
},
|
|
40
49
|
};
|
|
41
50
|
const cloudBody = { ...hostedBody };
|
|
42
|
-
const resp = await getData(client, 'query', 'same-origin', hostedBody, cloudBody);
|
|
51
|
+
const resp = await getData(client, 'query', 'same-origin', hostedBody, cloudBody, 'POST', 'fetch-pivot');
|
|
43
52
|
// With our current design we have to remove the second row field but leave the first for comparison purposes.
|
|
44
53
|
const rows = resp.queryResults[0].rows;
|
|
54
|
+
if (pivot.columnField && client.databaseType.toLowerCase() === 'bigquery') {
|
|
55
|
+
rows.forEach((row) => {
|
|
56
|
+
Object.keys(row).forEach((key) => {
|
|
57
|
+
const processedKey = processColumnName(key);
|
|
58
|
+
if (processedKey !== key) {
|
|
59
|
+
row[processedKey] = row[key];
|
|
60
|
+
delete row[key];
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
45
65
|
const columns = resp.queryResults[0].fields
|
|
46
66
|
.map((field) => ({
|
|
47
|
-
field: field.name,
|
|
48
|
-
label: field.name.replace('comparison_', 'comparison '),
|
|
67
|
+
field: processColumnName(field.name),
|
|
68
|
+
label: snakeCaseToTitleCase(processColumnName(field.name.replace('comparison_', 'comparison '))),
|
|
49
69
|
}))
|
|
50
|
-
.filter((field, index) => field.field !== 'comparison_' + pivot.rowField || index === 0)
|
|
70
|
+
.filter((field, index) => field.field !== 'comparison_' + pivot.rowField || index === 0)
|
|
71
|
+
.sort((a, b) => {
|
|
72
|
+
if (a.field === pivot.rowField) {
|
|
73
|
+
return -1;
|
|
74
|
+
}
|
|
75
|
+
if (b.field === pivot.rowField) {
|
|
76
|
+
return 1;
|
|
77
|
+
}
|
|
78
|
+
return 0;
|
|
79
|
+
});
|
|
51
80
|
if (pivot.rowField && !['string', 'varchar'].includes(pivot.rowFieldType)) {
|
|
52
81
|
rows.forEach((row) => {
|
|
53
82
|
row[pivot.rowField] = getDateString(row[pivot.rowField], undefined, dateBucket);
|
|
@@ -75,6 +104,30 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
|
|
|
75
104
|
}
|
|
76
105
|
}
|
|
77
106
|
}
|
|
107
|
+
if (pivot.sort) {
|
|
108
|
+
rows.sort((a, b) => {
|
|
109
|
+
if (pivot.sortDirection === 'ASC') {
|
|
110
|
+
if (dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
|
|
111
|
+
// @ts-ignore
|
|
112
|
+
return new Date(a[pivot.sortField]) - new Date(b[pivot.sortField]);
|
|
113
|
+
}
|
|
114
|
+
else if (isNumericColumnType(pivot.sortFieldType)) {
|
|
115
|
+
return a[pivot.sortField] - b[pivot.sortField];
|
|
116
|
+
}
|
|
117
|
+
return a[pivot.sortField].localeCompare(b[pivot.sortField]);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
if (dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
|
|
121
|
+
// @ts-ignore
|
|
122
|
+
return new Date(b[pivot.sortField]) - new Date(a[pivot.sortField]);
|
|
123
|
+
}
|
|
124
|
+
else if (isNumericColumnType(pivot.sortFieldType)) {
|
|
125
|
+
return b[pivot.sortField] - a[pivot.sortField];
|
|
126
|
+
}
|
|
127
|
+
return b[pivot.sortField].localeCompare(a[pivot.sortField]);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
78
131
|
return {
|
|
79
132
|
rows: rows,
|
|
80
133
|
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
|
|
@@ -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"}
|