@quillsql/react 2.13.37 → 2.13.39
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 +2 -1
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +1 -2
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +68 -57
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +69 -51
- package/dist/cjs/components/Chart/ChartTooltip.d.ts +1 -1
- package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartTooltip.js +3 -3
- package/dist/cjs/components/Chart/InternalChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/InternalChart.js +7 -1
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +4 -4
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +3 -3
- package/dist/cjs/components/ReportBuilder/convert.d.ts +1 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +73 -21
- package/dist/cjs/components/UiComponents.d.ts +2 -1
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +11 -4
- package/dist/cjs/hooks/useExport.d.ts.map +1 -1
- package/dist/cjs/hooks/useExport.js +4 -5
- package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts +19 -11
- package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotForm.js +62 -48
- package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -4
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +28 -31
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +315 -633
- package/dist/cjs/models/Pivot.d.ts +27 -7
- package/dist/cjs/models/Pivot.d.ts.map +1 -1
- package/dist/cjs/utils/astProcessing.js +2 -2
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +36 -11
- package/dist/cjs/utils/merge.d.ts.map +1 -1
- package/dist/cjs/utils/merge.js +2 -1
- package/dist/cjs/utils/pivotConstructor.d.ts +1 -0
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +37 -7
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/pivotProcessing.js +10 -14
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +421 -134
- package/dist/cjs/utils/report.d.ts.map +1 -1
- package/dist/cjs/utils/report.js +2 -2
- package/dist/cjs/utils/textProcessing.d.ts +1 -1
- package/dist/cjs/utils/textProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/textProcessing.js +3 -0
- package/dist/esm/Chart.d.ts +2 -1
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +1 -2
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +68 -57
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +69 -51
- package/dist/esm/components/Chart/ChartTooltip.d.ts +1 -1
- package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartTooltip.js +3 -3
- package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/InternalChart.js +7 -1
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +4 -4
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +3 -3
- package/dist/esm/components/ReportBuilder/convert.d.ts +1 -1
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +74 -22
- package/dist/esm/components/UiComponents.d.ts +2 -1
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +11 -4
- package/dist/esm/hooks/useExport.d.ts.map +1 -1
- package/dist/esm/hooks/useExport.js +4 -5
- package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +19 -11
- package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotForm.js +63 -49
- package/dist/esm/internals/ReportBuilder/PivotList.js +5 -4
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +28 -31
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +327 -635
- package/dist/esm/models/Pivot.d.ts +27 -7
- package/dist/esm/models/Pivot.d.ts.map +1 -1
- package/dist/esm/utils/astProcessing.js +2 -2
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +36 -11
- package/dist/esm/utils/merge.d.ts.map +1 -1
- package/dist/esm/utils/merge.js +2 -1
- package/dist/esm/utils/pivotConstructor.d.ts +1 -0
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +37 -8
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/esm/utils/pivotProcessing.js +10 -14
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +421 -134
- package/dist/esm/utils/report.d.ts.map +1 -1
- package/dist/esm/utils/report.js +2 -2
- package/dist/esm/utils/textProcessing.d.ts +1 -1
- package/dist/esm/utils/textProcessing.d.ts.map +1 -1
- package/dist/esm/utils/textProcessing.js +3 -0
- package/package.json +1 -1
|
@@ -2,12 +2,8 @@ import { ColumnInternal } from './Columns';
|
|
|
2
2
|
/**
|
|
3
3
|
* Represents the metadata of a pivot table.
|
|
4
4
|
*/
|
|
5
|
-
export type Pivot =
|
|
6
|
-
|
|
7
|
-
valueField: string;
|
|
8
|
-
valueField2?: string;
|
|
9
|
-
valueField2Type?: string;
|
|
10
|
-
valueFieldType?: string;
|
|
5
|
+
export type Pivot = SingleAggregationPivot | MultiAggregationPivot;
|
|
6
|
+
interface BasePivot {
|
|
11
7
|
rowField?: string;
|
|
12
8
|
rowFieldType?: string;
|
|
13
9
|
columnField?: string;
|
|
@@ -20,7 +16,30 @@ export type Pivot = {
|
|
|
20
16
|
triggerButtonText?: string;
|
|
21
17
|
rowLimit?: number;
|
|
22
18
|
columnValues?: string[];
|
|
23
|
-
}
|
|
19
|
+
}
|
|
20
|
+
interface SingleAggregationPivot extends BasePivot {
|
|
21
|
+
aggregationType: AggregationType;
|
|
22
|
+
valueField?: string;
|
|
23
|
+
valueField2?: string;
|
|
24
|
+
valueField2Type?: string;
|
|
25
|
+
valueFieldType?: string;
|
|
26
|
+
aggregations?: never;
|
|
27
|
+
}
|
|
28
|
+
interface MultiAggregationPivot extends BasePivot {
|
|
29
|
+
aggregationType?: never;
|
|
30
|
+
valueField?: never;
|
|
31
|
+
valueField2?: never;
|
|
32
|
+
valueField2Type?: never;
|
|
33
|
+
valueFieldType?: never;
|
|
34
|
+
aggregations: {
|
|
35
|
+
valueField?: string;
|
|
36
|
+
valueFieldType?: string;
|
|
37
|
+
valueField2?: string;
|
|
38
|
+
valueField2Type?: string;
|
|
39
|
+
aggregationType: AggregationType;
|
|
40
|
+
}[];
|
|
41
|
+
}
|
|
42
|
+
export type AggregationType = 'sum' | 'average' | 'min' | 'max' | 'count' | 'avg' | 'percentage';
|
|
24
43
|
export type PivotInfo = {
|
|
25
44
|
pivot: Pivot;
|
|
26
45
|
possibleRowFields: string[];
|
|
@@ -34,4 +53,5 @@ export type PivotData = {
|
|
|
34
53
|
pivotQuery: string;
|
|
35
54
|
comparisonPivotQuery?: string;
|
|
36
55
|
};
|
|
56
|
+
export {};
|
|
37
57
|
//# sourceMappingURL=Pivot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pivot.d.ts","sourceRoot":"","sources":["../../../src/models/Pivot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,
|
|
1
|
+
{"version":3,"file":"Pivot.d.ts","sourceRoot":"","sources":["../../../src/models/Pivot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,sBAAsB,GAAG,qBAAqB,CAAC;AAGnE,UAAU,SAAS;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AACD,UAAU,sBAAuB,SAAQ,SAAS;IAChD,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB;AACD,UAAU,qBAAsB,SAAQ,SAAS;IAC/C,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,cAAc,CAAC,EAAE,KAAK,CAAC;IACvB,YAAY,EAAE;QACZ,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,eAAe,CAAC;KAClC,EAAE,CAAC;CACL;AAED,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,YAAY,CAAC;AAEjG,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC"}
|
|
@@ -171,7 +171,7 @@ export function getColumnAndTableInfo(tableAliasMap, column, schemaInfo) {
|
|
|
171
171
|
}
|
|
172
172
|
export function getColumnsByTableFromASTAndSchema(ast, tables, tableAliasMap) {
|
|
173
173
|
const referencedColumns = {};
|
|
174
|
-
if (ast
|
|
174
|
+
if (ast?.columns === '*' || ast?.columns?.[0]?.expr?.column === '*') {
|
|
175
175
|
// Be sure to select everything from stars
|
|
176
176
|
const tableList = ast.from.map((table) => recursiveSearchByKey(table, 'table'));
|
|
177
177
|
tableList.forEach((table) => {
|
|
@@ -510,7 +510,7 @@ export function getTablesHelper(ast, allTables) {
|
|
|
510
510
|
for (const table in referencedColumns) {
|
|
511
511
|
referencedColumns[table] = Array.from(new Set(referencedColumns[table]));
|
|
512
512
|
}
|
|
513
|
-
const referencedTablesAndColumns =
|
|
513
|
+
const referencedTablesAndColumns = onlyReferenceTables.map((tableName) => {
|
|
514
514
|
return {
|
|
515
515
|
name: tableName,
|
|
516
516
|
columns: referencedColumns[tableName]?.map((column) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAcvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AA2BzD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,EACrB,MAAM,EAAE,mBAAmB,EAC3B,UAAU,CAAC,EAAE,MAAM,EACnB,oBAAoB,CAAC,EAAE,oBAAoB,GAC1C,OAAO,CAAC,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAcvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AA2BzD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,EACrB,MAAM,EAAE,mBAAmB,EAC3B,UAAU,CAAC,EAAE,MAAM,EACnB,oBAAoB,CAAC,EAAE,oBAAoB,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CA+F9B;AA0ID,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,mBAAmB,EAC3B,OAAO,CAAC,EACJ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,EAAE,GACzD,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EACvB,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,GAAG,CAAC,CA6Bd"}
|
|
@@ -46,7 +46,19 @@ export async function cleanDashboardItem(item, dashboardFilters, client, dateBuc
|
|
|
46
46
|
let pivotTable;
|
|
47
47
|
let pivotError;
|
|
48
48
|
try {
|
|
49
|
-
pivotTable = await getPivotTable(
|
|
49
|
+
pivotTable = await getPivotTable({
|
|
50
|
+
...item,
|
|
51
|
+
pivot: item.pivot ? {
|
|
52
|
+
...item.pivot,
|
|
53
|
+
aggregations: item.pivot.aggregations ?? [{
|
|
54
|
+
valueField: item.pivot.valueField,
|
|
55
|
+
valueFieldType: item.pivot.valueFieldType,
|
|
56
|
+
valueField2: item.pivot.valueField2,
|
|
57
|
+
valueField2Type: item.pivot.valueField2Type,
|
|
58
|
+
aggregationType: item.pivot.aggregationType,
|
|
59
|
+
}]
|
|
60
|
+
} : undefined,
|
|
61
|
+
}, dashboardFilters, client, dateBucket, additionalProcessing, item.dashboardName);
|
|
50
62
|
}
|
|
51
63
|
catch (e) {
|
|
52
64
|
pivotTable = undefined;
|
|
@@ -74,7 +86,17 @@ export async function cleanDashboardItem(item, dashboardFilters, client, dateBuc
|
|
|
74
86
|
pivot: pivotError
|
|
75
87
|
? undefined
|
|
76
88
|
: item.pivot
|
|
77
|
-
? {
|
|
89
|
+
? {
|
|
90
|
+
...item.pivot,
|
|
91
|
+
aggregations: item.pivot.aggregations ?? [{
|
|
92
|
+
valueField: item.pivot.valueField,
|
|
93
|
+
valueFieldType: item.pivot.valueFieldType,
|
|
94
|
+
valueField2: item.pivot.valueField2,
|
|
95
|
+
valueField2Type: item.pivot.valueField2Type,
|
|
96
|
+
aggregationType: item.pivot.aggregationType,
|
|
97
|
+
}],
|
|
98
|
+
columnValues: item.distinctStrings
|
|
99
|
+
}
|
|
78
100
|
: undefined,
|
|
79
101
|
yAxisFields: pivotTable
|
|
80
102
|
? extractPivotedYAxis(pivotTable, item)
|
|
@@ -125,15 +147,18 @@ async function getPivotTable(report, dashboardFilters, client, dateBucketInitial
|
|
|
125
147
|
dataTypeID: fieldTypeToDataTypeID(pivot.rowFieldType || 'string'),
|
|
126
148
|
});
|
|
127
149
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
150
|
+
for (const agg of pivot.aggregations ?? []) {
|
|
151
|
+
if (agg.valueField) {
|
|
152
|
+
columns.push({
|
|
153
|
+
field: agg.valueField,
|
|
154
|
+
label: snakeCaseToTitleCase(processColumnName(agg.valueField)),
|
|
155
|
+
//FIXME: valueFieldType is not always the same as the format
|
|
156
|
+
format: agg.valueFieldType ?? 'whole_number',
|
|
157
|
+
jsType: agg.valueFieldType ?? 'number',
|
|
158
|
+
fieldType: agg.valueFieldType ?? 'number',
|
|
159
|
+
dataTypeID: fieldTypeToDataTypeID(agg.valueFieldType ?? 'number'),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
137
162
|
}
|
|
138
163
|
return {
|
|
139
164
|
rows: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/utils/merge.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/utils/merge.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAMxC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAgBnD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAsBrE;AAyBD,wBAAgB,2BAA2B,CAAC,EAC1C,KAAK,EACL,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,GAAG,EAAE,CAAC;CACjB,GAAG,GAAG,EAAE,CAMR;AAED,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,iBAAiB,GAClB,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,GAAG,GAAG,EAAE,CAyBR"}
|
package/dist/esm/utils/merge.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { add, startOfDay, startOfMonth, startOfWeek, startOfYear, } from 'date-fns';
|
|
2
2
|
import { isStringType } from './columnProcessing';
|
|
3
3
|
import { utcToZonedTime } from 'date-fns-tz';
|
|
4
|
+
// FIXME: Update all of this as part of restoring date comparisons
|
|
4
5
|
export function mergeComparisonRange(resp) {
|
|
5
6
|
if (resp.chartType === 'table')
|
|
6
7
|
return resp;
|
|
@@ -88,7 +89,7 @@ function merge2DPivotRows(pivot, rows, compRows, columnFieldValues, databaseType
|
|
|
88
89
|
return merge2DDatePivotRows(pivot, rows, compRows, columnFieldValues, databaseType, dateBucket, comparisonInterval);
|
|
89
90
|
}
|
|
90
91
|
function merge2DStringPivotRows(pivot, rows, compRows, columnFieldValues) {
|
|
91
|
-
if (!pivot.rowField || !pivot.valueField) {
|
|
92
|
+
if (!pivot.rowField || !pivot.aggregations?.some((agg) => agg.valueField)) {
|
|
92
93
|
return rows;
|
|
93
94
|
}
|
|
94
95
|
return rows.map((row) => {
|
|
@@ -19,4 +19,5 @@ export declare function generatePivotWithSQL({ pivot, report, client, dateBucket
|
|
|
19
19
|
comparisonPivotQuery?: string;
|
|
20
20
|
getPivotRowCount?: boolean;
|
|
21
21
|
}): Promise<PivotData>;
|
|
22
|
+
export declare function disambiguatedValueField(pivot: Pivot): string | undefined;
|
|
22
23
|
//# sourceMappingURL=pivotConstructor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAYvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,wBAAsB,oBAAoB,CAAC,EACzC,KAAK,EACL,MAAM,EACN,MAAM,EACN,UAAU,EACV,UAAU,EACV,eAAe,EACf,aAAa,EACb,OAAO,EACP,oBAAoB,EACpB,UAAU,EACV,oBAAoB,EACpB,gBAAuB,GACxB,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EACJ;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;KAAE,EAAE,GACzD,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAYvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,wBAAsB,oBAAoB,CAAC,EACzC,KAAK,EACL,MAAM,EACN,MAAM,EACN,UAAU,EACV,UAAU,EACV,eAAe,EACf,aAAa,EACb,OAAO,EACP,oBAAoB,EACpB,UAAU,EACV,oBAAoB,EACpB,gBAAuB,GACxB,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EACJ;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;KAAE,EAAE,GACzD,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAAC,SAAS,CAAC,CAkWrB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,sBAUnD"}
|
|
@@ -6,7 +6,7 @@ import { parseValueFromBigQueryDates } from './dataProcessing';
|
|
|
6
6
|
import { getComparisonInterval } from './dates';
|
|
7
7
|
import { mergeComparisonPivotColumns, mergeComparisonPivotRows } from './merge';
|
|
8
8
|
import { additionalProcessingOnPivotQuery, generatePivotQuery, generateRowCountQuery, } from './queryConstructor';
|
|
9
|
-
import { snakeCaseToTitleCase } from './textProcessing';
|
|
9
|
+
import { matchCasing, snakeCaseToTitleCase } from './textProcessing';
|
|
10
10
|
export async function generatePivotWithSQL({ pivot, report, client, dateBucket, dateFilter, distinctStrings, dashboardName, tenants, additionalProcessing, pivotQuery, comparisonPivotQuery, getPivotRowCount = true, }) {
|
|
11
11
|
let sqlQuery = pivotQuery;
|
|
12
12
|
let comparisonPivotSql = comparisonPivotQuery;
|
|
@@ -15,7 +15,23 @@ export async function generatePivotWithSQL({ pivot, report, client, dateBucket,
|
|
|
15
15
|
pivot.columnField &&
|
|
16
16
|
!pivot.columnValues &&
|
|
17
17
|
!distinctStrings) {
|
|
18
|
-
|
|
18
|
+
if (!report?.rows) {
|
|
19
|
+
throw new Error('No distinct strings provided for column field');
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
distinctStrings = Array.from(new Set(report.rows
|
|
23
|
+
.map((row) => row[pivot.columnField])
|
|
24
|
+
.filter((value) => value !== null && value !== undefined)));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (!pivot.aggregations?.length && pivot.aggregationType) {
|
|
28
|
+
pivot.aggregations = [{
|
|
29
|
+
aggregationType: pivot.aggregationType,
|
|
30
|
+
valueField: pivot.valueField,
|
|
31
|
+
valueFieldType: pivot.valueFieldType,
|
|
32
|
+
valueField2: pivot.valueField2,
|
|
33
|
+
valueField2Type: pivot.valueField2Type,
|
|
34
|
+
}];
|
|
19
35
|
}
|
|
20
36
|
let comparisonInterval = undefined;
|
|
21
37
|
if (dateFilter && dateFilter.comparisonRange) {
|
|
@@ -28,7 +44,7 @@ export async function generatePivotWithSQL({ pivot, report, client, dateBucket,
|
|
|
28
44
|
const rowColumn = report?.columns.find((column) => column.field === pivot.rowField);
|
|
29
45
|
pivot.rowFieldType = rowColumn?.format || 'string';
|
|
30
46
|
}
|
|
31
|
-
const filteredDistinctStrings = distinctStrings?.filter((value) => value !== null && value !== undefined);
|
|
47
|
+
const filteredDistinctStrings = distinctStrings?.filter((value) => value !== null && value !== undefined && value !== '');
|
|
32
48
|
const pivotColumnFields = filteredDistinctStrings?.slice(0, MAX_PIVOT_UNIQUE_VALUES);
|
|
33
49
|
if (!pivotQuery && report) {
|
|
34
50
|
if (!report.itemQuery) {
|
|
@@ -121,12 +137,12 @@ export async function generatePivotWithSQL({ pivot, report, client, dateBucket,
|
|
|
121
137
|
});
|
|
122
138
|
}
|
|
123
139
|
const columns = responseFields
|
|
124
|
-
?.map((field) => ({
|
|
140
|
+
?.map((field, index) => ({
|
|
125
141
|
field: processColumnName(field.name),
|
|
126
142
|
label: snakeCaseToTitleCase(processColumnName(field.name.replace('comparison_', 'comparison '))),
|
|
127
143
|
format: field.name === pivot.rowField
|
|
128
144
|
? 'string'
|
|
129
|
-
: (pivot.
|
|
145
|
+
: (pivot.aggregations?.[index]?.aggregationType === 'percentage')
|
|
130
146
|
? 'percent'
|
|
131
147
|
: 'whole_number',
|
|
132
148
|
fieldType: field.fieldType,
|
|
@@ -214,11 +230,12 @@ export async function generatePivotWithSQL({ pivot, report, client, dateBucket,
|
|
|
214
230
|
// });
|
|
215
231
|
// }
|
|
216
232
|
// for the case of count agg on no value field
|
|
217
|
-
columns?.forEach((column) => {
|
|
233
|
+
columns?.forEach((column, index) => {
|
|
218
234
|
if (column.label &&
|
|
219
235
|
['null', 'undefined'].includes(column.label.toLowerCase()) &&
|
|
220
|
-
!pivot.
|
|
221
|
-
pivot.
|
|
236
|
+
!pivot.columnField &&
|
|
237
|
+
!pivot.aggregations?.[index]?.valueField &&
|
|
238
|
+
pivot.aggregations?.[index]?.aggregationType === 'count') {
|
|
222
239
|
column.label = 'Count';
|
|
223
240
|
}
|
|
224
241
|
});
|
|
@@ -240,3 +257,15 @@ export async function generatePivotWithSQL({ pivot, report, client, dateBucket,
|
|
|
240
257
|
comparisonPivotQuery: comparisonPivotSql,
|
|
241
258
|
};
|
|
242
259
|
}
|
|
260
|
+
export function disambiguatedValueField(pivot) {
|
|
261
|
+
// console.log(pivot);
|
|
262
|
+
if (pivot.aggregations && pivot.aggregations.length > 0) {
|
|
263
|
+
if (pivot.aggregations.length === 1) {
|
|
264
|
+
return pivot.aggregations[0]?.valueField ?? pivot.valueField;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
return `${pivot.aggregations[0].valueField}_${matchCasing(pivot.aggregations[0].aggregationType, pivot.aggregations[0].valueField)}`;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return pivot.valueField;
|
|
271
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIxC,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,EAAE,GACxB,MAAM,CAuCR;AAkBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIxC,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,EAAE,GACxB,MAAM,CAuCR;AAkBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAmB7E;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,cAAc,EAAE,EACzB,YAAY,EAAE;IAAE,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAA;CAAE;;;;EAsDjE;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,CAoCP;AAED,eAAO,MAAM,eAAe,WAAY,GAAG,SAAS,KAAK,YA8BxD,CAAC"}
|
|
@@ -45,7 +45,7 @@ function generateTwoDPivotQuery(pivot, query, columns) {
|
|
|
45
45
|
FROM original_query GROUP BY ${pivot.rowField}`;
|
|
46
46
|
}
|
|
47
47
|
export function isValidPivot(pivot) {
|
|
48
|
-
if (!pivot.rowField && !pivot.valueField) {
|
|
48
|
+
if (!pivot.rowField && !pivot.aggregations?.[0]?.valueField) {
|
|
49
49
|
return {
|
|
50
50
|
valid: false,
|
|
51
51
|
reason: 'Row field cannot be empty without a value field',
|
|
@@ -57,17 +57,7 @@ export function isValidPivot(pivot) {
|
|
|
57
57
|
reason: 'Row field cannot be empty when column field is present',
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
|
-
else if (
|
|
61
|
-
return { valid: false, reason: 'Aggregation type cannot be empty' };
|
|
62
|
-
}
|
|
63
|
-
else if (pivot.aggregationType === 'percentage' &&
|
|
64
|
-
(!pivot.valueField2 || !pivot.valueField)) {
|
|
65
|
-
return {
|
|
66
|
-
valid: false,
|
|
67
|
-
reason: 'Percentage aggregation requires two value fields',
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
else if (!pivot.valueField && pivot.aggregationType !== 'count') {
|
|
60
|
+
else if (pivot.aggregations?.some((a) => a.aggregationType !== 'count' && !a.valueField)) {
|
|
71
61
|
return {
|
|
72
62
|
valid: false,
|
|
73
63
|
reason: 'Value field cannot be empty when aggregation is not "count"',
|
|
@@ -105,9 +95,9 @@ export function getPossiblePivotFieldOptions(columns, uniqueValues) {
|
|
|
105
95
|
rowFields.push(column.field);
|
|
106
96
|
}
|
|
107
97
|
}
|
|
108
|
-
// value fields can be numbers
|
|
98
|
+
// value fields can be numbers or bools
|
|
109
99
|
// TODO: should "format" be used as the indicator, or fieldType?
|
|
110
|
-
if (NUMBER_FORMAT_TYPES.includes(column.format)) {
|
|
100
|
+
if (NUMBER_FORMAT_TYPES.includes(column.format) || column.jsType === 'bool') {
|
|
111
101
|
if (!isIdColumn(column.field)) {
|
|
112
102
|
valueFields.push(column.field);
|
|
113
103
|
}
|
|
@@ -142,6 +132,12 @@ export function cleanPivot(pivot, possibleColumns) {
|
|
|
142
132
|
!possibleColumns.columnFields.includes(pivot.columnField)) {
|
|
143
133
|
pivot.columnField = undefined;
|
|
144
134
|
}
|
|
135
|
+
if (pivot.aggregationType) {
|
|
136
|
+
pivot.aggregations = [{
|
|
137
|
+
valueField: pivot.valueField,
|
|
138
|
+
aggregationType: pivot.aggregationType,
|
|
139
|
+
}];
|
|
140
|
+
}
|
|
145
141
|
return pivot;
|
|
146
142
|
}
|
|
147
143
|
export const isPivotPossible = (fields, pivot) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,UAStE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,UAAQ,UAGrE;AAMD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,EAEvB,uBAAuB,CAAC,EAAE,OAAO,EACjC,sBAAsB,CAAC,EAAE,OAAO,UAkGjC;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,UAE1D;AAmBD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,kBAAkB,CAAC,EAAE,MAAM,UA8B5B;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,UAYnB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAsBrB;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAcrB;AAmFD,wBAAgB,8BAA8B,CAC5C,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAkBrB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAkBpB;
|
|
1
|
+
{"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,UAStE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,UAAQ,UAGrE;AAMD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,EAEvB,uBAAuB,CAAC,EAAE,OAAO,EACjC,sBAAsB,CAAC,EAAE,OAAO,UAkGjC;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,UAE1D;AAmBD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,kBAAkB,CAAC,EAAE,MAAM,UA8B5B;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,UAYnB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAsBrB;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAcrB;AAmFD,wBAAgB,8BAA8B,CAC5C,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAkBrB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAkBpB;AA8uBD,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,KAAK,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,oBAAoB,CAAC,EAAE,oBAAoB,EAC3C,YAAY,SAAe,sBAgE5B;AAED,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,sBAqB1E"}
|