@quillsql/react 2.12.30 → 2.12.31
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 +6 -37
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +86 -327
- package/dist/cjs/ChartBuilder.d.ts +12 -49
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +68 -36
- package/dist/cjs/ChartEditor.d.ts +1 -1
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +11 -7
- package/dist/cjs/Context.d.ts +4 -1
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +10 -4
- package/dist/cjs/Dashboard.d.ts +61 -114
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +261 -30
- package/dist/cjs/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/DateRangePicker.js +0 -26
- package/dist/cjs/ReportBuilder.d.ts +1 -1
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +62 -97
- package/dist/cjs/SQLEditor.d.ts +2 -2
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +10 -5
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +41 -43
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarChart.js +12 -1
- package/dist/cjs/components/Chart/LineChart.d.ts +2 -1
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +25 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +7 -7
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +64 -28
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +11 -45
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +1 -30
- package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.js +16 -1
- package/dist/cjs/components/QuillSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillSelectWithCombo.js +4 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +10 -2
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.js +94 -70
- package/dist/cjs/components/ReportBuilder/convert.d.ts +7 -2
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +53 -1
- package/dist/cjs/components/ReportBuilder/ui.d.ts +6 -6
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +6 -22
- package/dist/cjs/components/UiComponents.d.ts +26 -1
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +97 -4
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useQuill.js +19 -3
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +1 -0
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/models/Columns.d.ts +2 -1
- package/dist/cjs/models/Columns.d.ts.map +1 -1
- package/dist/cjs/models/Filter.d.ts +15 -4
- package/dist/cjs/models/Filter.d.ts.map +1 -1
- package/dist/cjs/models/Filter.js +9 -1
- package/dist/cjs/models/Report.d.ts +10 -23
- package/dist/cjs/models/Report.d.ts.map +1 -1
- package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astFilterProcessing.js +37 -2
- package/dist/cjs/utils/columnProcessing.d.ts +2 -0
- package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/columnProcessing.js +54 -1
- package/dist/cjs/utils/dashboard.d.ts +1 -1
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +3 -56
- package/dist/cjs/utils/dataProcessing.d.ts +4 -2
- package/dist/cjs/utils/dataProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/dataProcessing.js +18 -1
- package/dist/cjs/utils/dates.d.ts +2 -1
- package/dist/cjs/utils/dates.d.ts.map +1 -1
- package/dist/cjs/utils/dates.js +23 -1
- package/dist/cjs/utils/filterProcessing.d.ts +7 -1
- package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/filterProcessing.js +100 -13
- package/dist/cjs/utils/pivotConstructor.d.ts +2 -1
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +7 -1
- package/dist/cjs/utils/report.d.ts +4 -1
- package/dist/cjs/utils/report.d.ts.map +1 -1
- package/dist/cjs/utils/report.js +94 -7
- package/dist/cjs/utils/tableProcessing.d.ts +1 -1
- package/dist/esm/Chart.d.ts +6 -37
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +87 -329
- package/dist/esm/ChartBuilder.d.ts +12 -49
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +68 -33
- package/dist/esm/ChartEditor.d.ts +1 -1
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +11 -7
- package/dist/esm/Context.d.ts +4 -1
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +9 -3
- package/dist/esm/Dashboard.d.ts +61 -114
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +263 -32
- package/dist/esm/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/DateRangePicker.js +0 -26
- package/dist/esm/ReportBuilder.d.ts +1 -1
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +64 -99
- package/dist/esm/SQLEditor.d.ts +2 -2
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +11 -6
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +42 -44
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarChart.js +13 -2
- package/dist/esm/components/Chart/LineChart.d.ts +2 -1
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +26 -2
- package/dist/esm/components/Dashboard/DataLoader.d.ts +7 -7
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +65 -29
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +11 -45
- package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +1 -30
- package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.js +16 -1
- package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillSelectWithCombo.js +5 -2
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts +10 -2
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/FilterModal.js +94 -70
- package/dist/esm/components/ReportBuilder/convert.d.ts +7 -2
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +51 -0
- package/dist/esm/components/ReportBuilder/convert.uspec.js +280 -13
- package/dist/esm/components/ReportBuilder/ui.d.ts +6 -6
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +6 -22
- package/dist/esm/components/UiComponents.d.ts +26 -1
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +95 -3
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useQuill.js +19 -3
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +1 -0
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/models/Columns.d.ts +2 -1
- package/dist/esm/models/Columns.d.ts.map +1 -1
- package/dist/esm/models/Filter.d.ts +15 -4
- package/dist/esm/models/Filter.d.ts.map +1 -1
- package/dist/esm/models/Filter.js +8 -0
- package/dist/esm/models/Report.d.ts +10 -23
- package/dist/esm/models/Report.d.ts.map +1 -1
- package/dist/esm/test-utils/constants.d.ts +56 -0
- package/dist/esm/test-utils/constants.d.ts.map +1 -0
- package/dist/esm/test-utils/constants.js +271 -0
- package/dist/esm/test-utils/generators.d.ts +4 -0
- package/dist/esm/test-utils/generators.d.ts.map +1 -0
- package/dist/esm/test-utils/generators.js +37 -0
- package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astFilterProcessing.js +38 -3
- package/dist/esm/utils/astFilterProcessing.uspec.js +153 -5
- package/dist/esm/utils/columnProcessing.d.ts +2 -0
- package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
- package/dist/esm/utils/columnProcessing.js +52 -0
- package/dist/esm/utils/columnProcessing.uspec.d.ts +2 -0
- package/dist/esm/utils/columnProcessing.uspec.d.ts.map +1 -0
- package/dist/esm/utils/columnProcessing.uspec.js +65 -0
- package/dist/esm/utils/dashboard.d.ts +1 -1
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +3 -56
- package/dist/esm/utils/dataProcessing.d.ts +4 -2
- package/dist/esm/utils/dataProcessing.d.ts.map +1 -1
- package/dist/esm/utils/dataProcessing.js +16 -0
- package/dist/esm/utils/dataProcessing.uspec.js +1 -0
- package/dist/esm/utils/dates.d.ts +2 -1
- package/dist/esm/utils/dates.d.ts.map +1 -1
- package/dist/esm/utils/dates.js +21 -0
- package/dist/esm/utils/filterProcessing.d.ts +7 -1
- package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/filterProcessing.js +97 -12
- package/dist/esm/utils/filterProcessing.uspec.d.ts +2 -0
- package/dist/esm/utils/filterProcessing.uspec.d.ts.map +1 -0
- package/dist/esm/utils/filterProcessing.uspec.js +245 -0
- package/dist/esm/utils/pivotConstructor.d.ts +2 -1
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +7 -1
- package/dist/esm/utils/report.d.ts +4 -1
- package/dist/esm/utils/report.d.ts.map +1 -1
- package/dist/esm/utils/report.js +92 -6
- package/dist/esm/utils/report.uspec.d.ts +2 -0
- package/dist/esm/utils/report.uspec.d.ts.map +1 -0
- package/dist/esm/utils/report.uspec.js +66 -0
- package/dist/esm/utils/tableProcessing.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
function createRandomDate() {
|
|
2
|
+
const start = new Date(2020, 0, 1);
|
|
3
|
+
const end = new Date();
|
|
4
|
+
return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
|
|
5
|
+
}
|
|
6
|
+
function createRandomString() {
|
|
7
|
+
return Math.random().toString(36).substring(7);
|
|
8
|
+
}
|
|
9
|
+
function createRandomNumber() {
|
|
10
|
+
return Math.floor(Math.random() * 1000);
|
|
11
|
+
}
|
|
12
|
+
export function createRows(columns, rowCount) {
|
|
13
|
+
const rows = [];
|
|
14
|
+
for (let i = 0; i < rowCount; i++) {
|
|
15
|
+
rows.push(columns.reduce((row, column) => {
|
|
16
|
+
if (column.format === 'MMM_dd_yyyy') {
|
|
17
|
+
row[column.field] = createRandomDate().toDateString();
|
|
18
|
+
}
|
|
19
|
+
else if (column.format === 'whole_number') {
|
|
20
|
+
row[column.field] = createRandomNumber().toString();
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
row[column.field] = createRandomString();
|
|
24
|
+
}
|
|
25
|
+
return row;
|
|
26
|
+
}, {}));
|
|
27
|
+
}
|
|
28
|
+
return rows;
|
|
29
|
+
}
|
|
30
|
+
export function createComparisonColumnsFromColumns(columns) {
|
|
31
|
+
const comparisons = columns.map((column) => ({
|
|
32
|
+
...column,
|
|
33
|
+
field: `comparison_${column.field}`,
|
|
34
|
+
label: `comparison ${column.label}`,
|
|
35
|
+
}));
|
|
36
|
+
return [...columns, ...comparisons];
|
|
37
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"astFilterProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/astFilterProcessing.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"astFilterProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/astFilterProcessing.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,MAAM,EAOP,MAAM,kBAAkB,CAAC;AAozI1B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,QACrB,GAAG,MACJ,MAAM,KACT,cAAc,GAAG,IAuGnB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,QAAS,GAAG,MAAM,MAAM,KAAG,MAAM,GAAG,IA+V3D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,eAAgB,cAAc,MAAM,MAAM,QAuBrE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,WAAY,MAAM,MAAM,MAAM,KAAG,GA2nHxD,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
/* eslint-disable no-case-declarations */
|
|
3
3
|
/* eslint-disable no-fallthrough */
|
|
4
|
-
import { DateOperator, FieldTypes, FilterNames, NullOperator, NumberOperator, StringOperator, TimeUnit, } from '../models/Filter';
|
|
4
|
+
import { BoolOperator, DateOperator, FieldTypes, FilterNames, NullOperator, NumberOperator, StringOperator, TimeUnit, } from '../models/Filter';
|
|
5
5
|
import { format, isValid, parse, subDays, subHours, subMonths, subWeeks, subYears, } from 'date-fns';
|
|
6
6
|
// Map SQL string operators to corresponding StringOperator enums
|
|
7
7
|
const stringOperatorMap = {
|
|
@@ -33,10 +33,15 @@ const numberOperatorMap = {
|
|
|
33
33
|
[NumberOperator.GreaterThanOrEqualTo]: ['>='],
|
|
34
34
|
[NumberOperator.LessThanOrEqualTo]: ['<='],
|
|
35
35
|
};
|
|
36
|
+
// Map SQL boolean operators to corresponding BooleanOperator enums
|
|
37
|
+
const boolOperatorMap = {
|
|
38
|
+
[BoolOperator.EqualTo]: ['=', 'IS'],
|
|
39
|
+
[BoolOperator.NotEqualTo]: ['<>', '!=', 'IS NOT'],
|
|
40
|
+
};
|
|
36
41
|
// Map SQL null operators to corresponding NullOperator enums
|
|
37
42
|
const nullOperatorMap = {
|
|
38
|
-
[NullOperator.IsNull]: ['IS'],
|
|
39
|
-
[NullOperator.IsNotNull]: ['IS NOT'],
|
|
43
|
+
[NullOperator.IsNull]: ['IS', '='],
|
|
44
|
+
[NullOperator.IsNotNull]: ['IS NOT', '!=', '<>'],
|
|
40
45
|
};
|
|
41
46
|
// Combine all individual operator maps into a single map for easy lookup
|
|
42
47
|
const operatorMap = {
|
|
@@ -44,6 +49,7 @@ const operatorMap = {
|
|
|
44
49
|
...dateOperatorMap,
|
|
45
50
|
...numberOperatorMap,
|
|
46
51
|
...nullOperatorMap,
|
|
52
|
+
...boolOperatorMap,
|
|
47
53
|
};
|
|
48
54
|
/**
|
|
49
55
|
* Helper function to reverse map SQL operators back to Filter Operators based on field type
|
|
@@ -58,6 +64,8 @@ const reverseOperatorMap = (operator, fieldType) => {
|
|
|
58
64
|
return (Object.keys(numberOperatorMap).find((key) => numberOperatorMap[key].includes(operator)) ?? null);
|
|
59
65
|
case FieldTypes.Null:
|
|
60
66
|
return (Object.keys(nullOperatorMap).find((key) => nullOperatorMap[key].includes(operator)) ?? null);
|
|
67
|
+
case FieldTypes.Boolean:
|
|
68
|
+
return (Object.keys(boolOperatorMap).find((key) => boolOperatorMap[key].includes(operator)) ?? null);
|
|
61
69
|
default:
|
|
62
70
|
return null;
|
|
63
71
|
}
|
|
@@ -112,6 +120,8 @@ function mapOperatorToFilterName(operator, fieldType) {
|
|
|
112
120
|
return FilterNames.NumericFilter;
|
|
113
121
|
case FieldTypes.Null:
|
|
114
122
|
return FilterNames.NullFilter;
|
|
123
|
+
case FieldTypes.Boolean:
|
|
124
|
+
return FilterNames.BooleanFilter;
|
|
115
125
|
default:
|
|
116
126
|
console.error(`Could not determine filter name: {operator: ${operator}, fieldType: ${fieldType}}`);
|
|
117
127
|
return null;
|
|
@@ -4322,6 +4332,9 @@ export const astToFilter = (ast, db) => {
|
|
|
4322
4332
|
fieldType = FieldTypes.String;
|
|
4323
4333
|
}
|
|
4324
4334
|
break;
|
|
4335
|
+
case 'bool':
|
|
4336
|
+
fieldType = FieldTypes.Boolean;
|
|
4337
|
+
break;
|
|
4325
4338
|
default:
|
|
4326
4339
|
fieldType = FieldTypes.String;
|
|
4327
4340
|
}
|
|
@@ -4490,6 +4503,14 @@ export const astToFilter = (ast, db) => {
|
|
|
4490
4503
|
value: value.value,
|
|
4491
4504
|
};
|
|
4492
4505
|
}
|
|
4506
|
+
case FilterNames.BooleanFilter:
|
|
4507
|
+
return {
|
|
4508
|
+
field: field,
|
|
4509
|
+
name: filterName,
|
|
4510
|
+
type: FieldTypes.Boolean,
|
|
4511
|
+
operator: mappedOperator,
|
|
4512
|
+
value: Boolean(right.value),
|
|
4513
|
+
};
|
|
4493
4514
|
}
|
|
4494
4515
|
return null;
|
|
4495
4516
|
};
|
|
@@ -8043,6 +8064,20 @@ export const filterToAst = (filter, db) => {
|
|
|
8043
8064
|
left: { type: 'column_ref', table: null, column: field },
|
|
8044
8065
|
right: { type: 'null', value: null },
|
|
8045
8066
|
};
|
|
8067
|
+
case FieldTypes.Boolean:
|
|
8068
|
+
return {
|
|
8069
|
+
type: 'binary_expr',
|
|
8070
|
+
operator: mappedOperator,
|
|
8071
|
+
left: {
|
|
8072
|
+
type: 'column_ref',
|
|
8073
|
+
table: null,
|
|
8074
|
+
column: field,
|
|
8075
|
+
},
|
|
8076
|
+
right: {
|
|
8077
|
+
type: 'bool',
|
|
8078
|
+
value: value,
|
|
8079
|
+
},
|
|
8080
|
+
};
|
|
8046
8081
|
default:
|
|
8047
8082
|
return null;
|
|
8048
8083
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable no-undef */
|
|
2
|
-
import { DateOperator, FieldTypes, FilterNames, NullOperator, NumberOperator, StringOperator, TimeUnit, } from '../models/Filter';
|
|
2
|
+
import { BoolOperator, DateOperator, FieldTypes, FilterNames, NullOperator, NumberOperator, StringOperator, TimeUnit, } from '../models/Filter';
|
|
3
3
|
import { astToFilter, filterToAst } from './astFilterProcessing';
|
|
4
4
|
import { format, subDays, subMonths, subYears } from 'date-fns';
|
|
5
5
|
import * as fs from 'fs';
|
|
@@ -20,7 +20,7 @@ describe('Filter to AST - String', () => {
|
|
|
20
20
|
value: ['value 1', 'value 2'],
|
|
21
21
|
};
|
|
22
22
|
const ast = filterToAst(filter, 'mysql');
|
|
23
|
-
const sql = "SELECT * FROM t WHERE field IN ('value 1', 'value 2')";
|
|
23
|
+
const sql = "SELECT * FROM t WHERE LOWER(field) IN (LOWER('value 1'), LOWER('value 2'))";
|
|
24
24
|
const expectedAst = parseSelectSQL(sql).where;
|
|
25
25
|
expect(ast).toEqual(expectedAst);
|
|
26
26
|
});
|
|
@@ -33,7 +33,7 @@ describe('Filter to AST - String', () => {
|
|
|
33
33
|
value: ['value 1', 'value 2'],
|
|
34
34
|
};
|
|
35
35
|
const ast = filterToAst(filter, 'mysql');
|
|
36
|
-
const sql = "SELECT * FROM t WHERE field NOT IN ('value 1', 'value 2')";
|
|
36
|
+
const sql = "SELECT * FROM t WHERE LOWER(field) NOT IN (LOWER('value 1'), LOWER('value 2'))";
|
|
37
37
|
const expectedAst = parseSelectSQL(sql).where;
|
|
38
38
|
expect(ast).toEqual(expectedAst);
|
|
39
39
|
});
|
|
@@ -261,7 +261,7 @@ describe('Filter to AST - String', () => {
|
|
|
261
261
|
});
|
|
262
262
|
describe('AST to Filter - String', () => {
|
|
263
263
|
it('should convert AST to Filter for string field - Is', () => {
|
|
264
|
-
const sql = "SELECT * FROM t WHERE field IN ('value 1', 'value 2')";
|
|
264
|
+
const sql = "SELECT * FROM t WHERE LOWER(field) IN (LOWER('value 1'), LOWER('value 2'))";
|
|
265
265
|
const ast = parseSelectSQL(sql);
|
|
266
266
|
const filter = astToFilter(ast.where, 'mysql');
|
|
267
267
|
const expectedFilter = {
|
|
@@ -274,7 +274,7 @@ describe('AST to Filter - String', () => {
|
|
|
274
274
|
expect(filter).toEqual(expectedFilter);
|
|
275
275
|
});
|
|
276
276
|
it('should convert AST to Filter for string field - IsNot', () => {
|
|
277
|
-
const sql = "SELECT * FROM t WHERE field NOT IN ('value 1', 'value 2')";
|
|
277
|
+
const sql = "SELECT * FROM t WHERE LOWER(field) NOT IN (LOWER('value 1'), LOWER('value 2'))";
|
|
278
278
|
const ast = parseSelectSQL(sql);
|
|
279
279
|
const filter = astToFilter(ast.where, 'mysql');
|
|
280
280
|
const expectedFilter = {
|
|
@@ -2727,3 +2727,151 @@ describe('AST to Filter - Date (Date Comparison Operators)', () => {
|
|
|
2727
2727
|
expect(filter).toEqual(expectedFilter);
|
|
2728
2728
|
});
|
|
2729
2729
|
});
|
|
2730
|
+
describe('Filter to AST - Bool', () => {
|
|
2731
|
+
it('should convert Filter to AST for boolean field - IsTrue', () => {
|
|
2732
|
+
const filter = {
|
|
2733
|
+
field: 'is_something',
|
|
2734
|
+
name: FilterNames.BooleanFilter,
|
|
2735
|
+
type: FieldTypes.Boolean,
|
|
2736
|
+
operator: BoolOperator.EqualTo,
|
|
2737
|
+
value: true,
|
|
2738
|
+
};
|
|
2739
|
+
const ast = filterToAst(filter, 'mysql');
|
|
2740
|
+
const sql = `
|
|
2741
|
+
SELECT * FROM transactions
|
|
2742
|
+
WHERE is_something = TRUE
|
|
2743
|
+
`
|
|
2744
|
+
.replace(/\s+/g, ' ')
|
|
2745
|
+
.trim();
|
|
2746
|
+
const expectedAst = parseSelectSQL(sql).where;
|
|
2747
|
+
expect(ast).toEqual(expectedAst);
|
|
2748
|
+
});
|
|
2749
|
+
it('should convert Filter to AST for boolean field - IsFalse', () => {
|
|
2750
|
+
const filter = {
|
|
2751
|
+
field: 'is_something',
|
|
2752
|
+
name: FilterNames.BooleanFilter,
|
|
2753
|
+
type: FieldTypes.Boolean,
|
|
2754
|
+
operator: BoolOperator.EqualTo,
|
|
2755
|
+
value: false,
|
|
2756
|
+
};
|
|
2757
|
+
const ast = filterToAst(filter, 'mysql');
|
|
2758
|
+
const sql = `
|
|
2759
|
+
SELECT * FROM transactions
|
|
2760
|
+
WHERE is_something = FALSE
|
|
2761
|
+
`
|
|
2762
|
+
.replace(/\s+/g, ' ')
|
|
2763
|
+
.trim();
|
|
2764
|
+
const expectedAst = parseSelectSQL(sql).where;
|
|
2765
|
+
expect(ast).toEqual(expectedAst);
|
|
2766
|
+
});
|
|
2767
|
+
it('should convert Filter to AST for boolean field - IsNotTrue', () => {
|
|
2768
|
+
const filter = {
|
|
2769
|
+
field: 'is_something',
|
|
2770
|
+
name: FilterNames.BooleanFilter,
|
|
2771
|
+
type: FieldTypes.Boolean,
|
|
2772
|
+
operator: BoolOperator.NotEqualTo,
|
|
2773
|
+
value: true,
|
|
2774
|
+
};
|
|
2775
|
+
const ast = filterToAst(filter, 'mysql');
|
|
2776
|
+
const sql = `
|
|
2777
|
+
SELECT * FROM transactions
|
|
2778
|
+
WHERE is_something <> TRUE
|
|
2779
|
+
`
|
|
2780
|
+
.replace(/\s+/g, ' ')
|
|
2781
|
+
.trim();
|
|
2782
|
+
const expectedAst = parseSelectSQL(sql).where;
|
|
2783
|
+
expect(ast).toEqual(expectedAst);
|
|
2784
|
+
});
|
|
2785
|
+
it('should convert Filter to AST for boolean field - IsNotFalse', () => {
|
|
2786
|
+
const filter = {
|
|
2787
|
+
field: 'is_something',
|
|
2788
|
+
name: FilterNames.BooleanFilter,
|
|
2789
|
+
type: FieldTypes.Boolean,
|
|
2790
|
+
operator: BoolOperator.NotEqualTo,
|
|
2791
|
+
value: false,
|
|
2792
|
+
};
|
|
2793
|
+
const ast = filterToAst(filter, 'mysql');
|
|
2794
|
+
const sql = `
|
|
2795
|
+
SELECT * FROM transactions
|
|
2796
|
+
WHERE is_something <> FALSE
|
|
2797
|
+
`
|
|
2798
|
+
.replace(/\s+/g, ' ')
|
|
2799
|
+
.trim();
|
|
2800
|
+
const expectedAst = parseSelectSQL(sql).where;
|
|
2801
|
+
expect(ast).toEqual(expectedAst);
|
|
2802
|
+
});
|
|
2803
|
+
});
|
|
2804
|
+
describe('AST to Filter - Bool', () => {
|
|
2805
|
+
it('should convert AST to Filter for boolean field - IsTrue', () => {
|
|
2806
|
+
const sql = `
|
|
2807
|
+
SELECT * FROM transactions
|
|
2808
|
+
WHERE is_something = TRUE
|
|
2809
|
+
`
|
|
2810
|
+
.replace(/\s+/g, ' ')
|
|
2811
|
+
.trim();
|
|
2812
|
+
const ast = parseSelectSQL(sql);
|
|
2813
|
+
const filter = astToFilter(ast.where, 'postgresql');
|
|
2814
|
+
const expectedFilter = {
|
|
2815
|
+
field: 'is_something',
|
|
2816
|
+
name: FilterNames.BooleanFilter,
|
|
2817
|
+
type: FieldTypes.Boolean,
|
|
2818
|
+
operator: BoolOperator.EqualTo,
|
|
2819
|
+
value: true,
|
|
2820
|
+
};
|
|
2821
|
+
expect(filter).toEqual(expectedFilter);
|
|
2822
|
+
});
|
|
2823
|
+
it('should convert AST to Filter for boolean field - IsFalse', () => {
|
|
2824
|
+
const sql = `
|
|
2825
|
+
SELECT * FROM transactions
|
|
2826
|
+
WHERE is_something = FALSE
|
|
2827
|
+
`
|
|
2828
|
+
.replace(/\s+/g, ' ')
|
|
2829
|
+
.trim();
|
|
2830
|
+
const ast = parseSelectSQL(sql);
|
|
2831
|
+
const filter = astToFilter(ast.where, 'postgresql');
|
|
2832
|
+
const expectedFilter = {
|
|
2833
|
+
field: 'is_something',
|
|
2834
|
+
name: FilterNames.BooleanFilter,
|
|
2835
|
+
type: FieldTypes.Boolean,
|
|
2836
|
+
operator: BoolOperator.EqualTo,
|
|
2837
|
+
value: false,
|
|
2838
|
+
};
|
|
2839
|
+
expect(filter).toEqual(expectedFilter);
|
|
2840
|
+
});
|
|
2841
|
+
it('should convert AST to Filter for boolean field - IsNotTrue', () => {
|
|
2842
|
+
const sql = `
|
|
2843
|
+
SELECT * FROM transactions
|
|
2844
|
+
WHERE is_something <> TRUE
|
|
2845
|
+
`
|
|
2846
|
+
.replace(/\s+/g, ' ')
|
|
2847
|
+
.trim();
|
|
2848
|
+
const ast = parseSelectSQL(sql);
|
|
2849
|
+
const filter = astToFilter(ast.where, 'postgresql');
|
|
2850
|
+
const expectedFilter = {
|
|
2851
|
+
field: 'is_something',
|
|
2852
|
+
name: FilterNames.BooleanFilter,
|
|
2853
|
+
type: FieldTypes.Boolean,
|
|
2854
|
+
operator: BoolOperator.NotEqualTo,
|
|
2855
|
+
value: true,
|
|
2856
|
+
};
|
|
2857
|
+
expect(filter).toEqual(expectedFilter);
|
|
2858
|
+
});
|
|
2859
|
+
it('should convert AST to Filter for boolean field - IsNotFalse', () => {
|
|
2860
|
+
const sql = `
|
|
2861
|
+
SELECT * FROM transactions
|
|
2862
|
+
WHERE is_something <> FALSE
|
|
2863
|
+
`
|
|
2864
|
+
.replace(/\s+/g, ' ')
|
|
2865
|
+
.trim();
|
|
2866
|
+
const ast = parseSelectSQL(sql);
|
|
2867
|
+
const filter = astToFilter(ast.where, 'postgresql');
|
|
2868
|
+
const expectedFilter = {
|
|
2869
|
+
field: 'is_something',
|
|
2870
|
+
name: FilterNames.BooleanFilter,
|
|
2871
|
+
type: FieldTypes.Boolean,
|
|
2872
|
+
operator: BoolOperator.NotEqualTo,
|
|
2873
|
+
value: false,
|
|
2874
|
+
};
|
|
2875
|
+
expect(filter).toEqual(expectedFilter);
|
|
2876
|
+
});
|
|
2877
|
+
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ColumnInfo } from '../components/ReportBuilder/schema';
|
|
2
2
|
import { Column, ColumnInternal } from '../models/Columns';
|
|
3
|
+
import { QuillReportInternal } from '../models/Report';
|
|
3
4
|
export declare function convertPostgresColumn(field: {
|
|
4
5
|
name: string;
|
|
5
6
|
dataTypeID: number;
|
|
@@ -8,4 +9,5 @@ export declare function convertColumnInfoToColumnInternal(columnInfo: ColumnInfo
|
|
|
8
9
|
export declare function convertFieldTypeToJSType(fieldType: string): string;
|
|
9
10
|
export declare function convertFormatToJsType(column: Column): string;
|
|
10
11
|
export declare function processColumnName(columnName: string): string;
|
|
12
|
+
export declare const getYAxisFields: (report: QuillReportInternal) => any[];
|
|
11
13
|
//# 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;
|
|
1
|
+
{"version":3,"file":"columnProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/columnProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,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;AAED,eAAO,MAAM,cAAc,WAAY,mBAAmB,UAsDzD,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { findAndProcessDateFilter } from './filterProcessing';
|
|
1
2
|
function removeBigQuerySpecialChars(columnName) {
|
|
2
3
|
return columnName.replaceAll('quill_forward_slash', '/');
|
|
3
4
|
}
|
|
@@ -206,3 +207,54 @@ export function convertFormatToJsType(column) {
|
|
|
206
207
|
export function processColumnName(columnName) {
|
|
207
208
|
return removeBigQuerySpecialChars(columnName);
|
|
208
209
|
}
|
|
210
|
+
export const getYAxisFields = (report) => {
|
|
211
|
+
try {
|
|
212
|
+
const curDateFilter = findAndProcessDateFilter(Object.values(report.filtersApplied));
|
|
213
|
+
if (report.pivot && report.pivotColumns && report.pivot.columnField) {
|
|
214
|
+
return (report.pivotColumns
|
|
215
|
+
.slice(1)
|
|
216
|
+
.map((column) => {
|
|
217
|
+
// @ts-ignore
|
|
218
|
+
return { ...column, format: report.yAxisFields[0].format };
|
|
219
|
+
}) ?? []);
|
|
220
|
+
}
|
|
221
|
+
else if (report.pivot && report.pivotColumns) {
|
|
222
|
+
return (report.pivotColumns
|
|
223
|
+
.slice(1)
|
|
224
|
+
.map((column) => {
|
|
225
|
+
return {
|
|
226
|
+
...column,
|
|
227
|
+
// @ts-ignore
|
|
228
|
+
label: report?.yAxisFields[0].label,
|
|
229
|
+
// @ts-ignore
|
|
230
|
+
format: report?.yAxisFields[0].format,
|
|
231
|
+
};
|
|
232
|
+
}) ?? []);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
if (curDateFilter?.comparison &&
|
|
236
|
+
curDateFilter.comparisonRange.value !== 'NO_COMPARISON') {
|
|
237
|
+
const comparisonYAxisFields = report.yAxisFields?.map((field) => {
|
|
238
|
+
return {
|
|
239
|
+
...field,
|
|
240
|
+
field: `comparison_${field.field}`,
|
|
241
|
+
label: `comparison ${field.label ?? field.field}`,
|
|
242
|
+
};
|
|
243
|
+
});
|
|
244
|
+
if (report.pivotColumns) {
|
|
245
|
+
return report.pivotColumns;
|
|
246
|
+
}
|
|
247
|
+
else if (comparisonYAxisFields || report.yAxisFields) {
|
|
248
|
+
const yAxisFields = report.yAxisFields ?? [];
|
|
249
|
+
const compYAxisFields = comparisonYAxisFields ?? [];
|
|
250
|
+
return [...yAxisFields, ...compYAxisFields];
|
|
251
|
+
}
|
|
252
|
+
return [];
|
|
253
|
+
}
|
|
254
|
+
return report.pivotColumns ?? report.yAxisFields ?? [];
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
catch (e) {
|
|
258
|
+
return report.yAxisFields;
|
|
259
|
+
}
|
|
260
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columnProcessing.uspec.d.ts","sourceRoot":"","sources":["../../../src/utils/columnProcessing.uspec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { DEFAULT_COMPARISON_DATE_FILTER, TWO_D_PIVOT, GENERIC_REPORT_INTERNAL, ONE_D_PIVOT, } from '../test-utils/constants';
|
|
2
|
+
import { createRows } from '../test-utils/generators';
|
|
3
|
+
import { getYAxisFields } from './columnProcessing';
|
|
4
|
+
describe('columnProcessing', () => {
|
|
5
|
+
describe('getYAxisFields', () => {
|
|
6
|
+
it('should return an array of fields for generic reports', () => {
|
|
7
|
+
const internalReport = {
|
|
8
|
+
...GENERIC_REPORT_INTERNAL,
|
|
9
|
+
rows: createRows(GENERIC_REPORT_INTERNAL.columns, 10),
|
|
10
|
+
};
|
|
11
|
+
const result = getYAxisFields(internalReport);
|
|
12
|
+
expect(result).toEqual([
|
|
13
|
+
{ field: 'id', format: 'whole_number', label: 'ID' },
|
|
14
|
+
]);
|
|
15
|
+
});
|
|
16
|
+
it('should return an array of fields for comparison reports', () => {
|
|
17
|
+
const internalReport = {
|
|
18
|
+
...GENERIC_REPORT_INTERNAL,
|
|
19
|
+
rows: createRows(GENERIC_REPORT_INTERNAL.columns, 10),
|
|
20
|
+
compareRows: createRows(GENERIC_REPORT_INTERNAL.columns, 10),
|
|
21
|
+
filtersApplied: [DEFAULT_COMPARISON_DATE_FILTER],
|
|
22
|
+
};
|
|
23
|
+
const result = getYAxisFields(internalReport);
|
|
24
|
+
expect(result).toEqual([
|
|
25
|
+
{ field: 'id', format: 'whole_number', label: 'ID' },
|
|
26
|
+
{
|
|
27
|
+
field: 'comparison_id',
|
|
28
|
+
format: 'whole_number',
|
|
29
|
+
label: 'comparison ID',
|
|
30
|
+
},
|
|
31
|
+
]);
|
|
32
|
+
});
|
|
33
|
+
it('should return the proper fields for a 2d pivot report', () => {
|
|
34
|
+
const internalReport = {
|
|
35
|
+
...GENERIC_REPORT_INTERNAL,
|
|
36
|
+
rows: createRows(GENERIC_REPORT_INTERNAL.columns, 10),
|
|
37
|
+
pivotColumns: TWO_D_PIVOT.pivotColumns,
|
|
38
|
+
pivotRows: TWO_D_PIVOT.pivotRows,
|
|
39
|
+
pivot: TWO_D_PIVOT.pivot,
|
|
40
|
+
};
|
|
41
|
+
const result = getYAxisFields(internalReport);
|
|
42
|
+
expect(result).toEqual([
|
|
43
|
+
{ field: 'Food', format: 'whole_number', label: 'Food' },
|
|
44
|
+
{ field: 'Fuel', format: 'whole_number', label: 'Fuel' },
|
|
45
|
+
{ field: 'Other', format: 'whole_number', label: 'Other' },
|
|
46
|
+
]);
|
|
47
|
+
});
|
|
48
|
+
it('should return the proper fields for a 1d pivot report', () => {
|
|
49
|
+
const internalReport = {
|
|
50
|
+
...GENERIC_REPORT_INTERNAL,
|
|
51
|
+
rows: createRows(GENERIC_REPORT_INTERNAL.columns, 10),
|
|
52
|
+
pivotColumns: ONE_D_PIVOT.pivotColumns,
|
|
53
|
+
pivotRows: ONE_D_PIVOT.pivotRows,
|
|
54
|
+
pivot: ONE_D_PIVOT.pivot,
|
|
55
|
+
yAxisFields: [
|
|
56
|
+
{ field: 'amount', format: 'whole_number', label: 'Amount' },
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
const result = getYAxisFields(internalReport);
|
|
60
|
+
expect(result).toEqual([
|
|
61
|
+
{ field: 'amount', format: 'whole_number', label: 'Amount' },
|
|
62
|
+
]);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { QuillReportInternal } from '../
|
|
1
|
+
import { QuillReportInternal } from '../models/Report';
|
|
2
2
|
/**
|
|
3
3
|
* Returns a cleaned version of the dashboard item we store in state. We clean
|
|
4
4
|
* the dashboard item so that we aren't exposing unnecessary details to the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AA+BpE;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,EACrB,MAAM,CAAC,EAAE,GAAG,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CAyC9B;AAgHD,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,GAAG,CAAC,CA2Bd"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { valueFormatter } from './valueFormatter';
|
|
2
1
|
import { generatePivotTable, generatePivotTableYAxis, } from '../internals/ReportBuilder/PivotModal';
|
|
3
2
|
import { snakeAndCamelCaseToTitleCase } from './textProcessing';
|
|
4
3
|
import { getData } from './dataFetcher';
|
|
@@ -14,15 +13,14 @@ const defaultDashboardItem = {
|
|
|
14
13
|
chartType: '',
|
|
15
14
|
dateField: null,
|
|
16
15
|
pivot: null,
|
|
17
|
-
primaryAggregation: '',
|
|
18
|
-
comparisonAggregation: '',
|
|
19
|
-
aggregationPercentChange: undefined,
|
|
20
16
|
yAxisFields: [],
|
|
21
17
|
xAxisLabel: '',
|
|
22
18
|
xAxisField: '',
|
|
23
19
|
xAxisFormat: 'string',
|
|
24
20
|
order: -1,
|
|
25
21
|
filtersApplied: {},
|
|
22
|
+
queryString: '',
|
|
23
|
+
rowCount: 0,
|
|
26
24
|
};
|
|
27
25
|
/**
|
|
28
26
|
* Returns a cleaned version of the dashboard item we store in state. We clean
|
|
@@ -41,7 +39,6 @@ export async function cleanDashboardItem(item, dashboardFilters, client, dateBuc
|
|
|
41
39
|
name: item.name,
|
|
42
40
|
};
|
|
43
41
|
const pivotTable = await getPivotTable(item, dashboardFilters, client, dateBucket);
|
|
44
|
-
const { primaryAggregation, comparisonAggregation, aggregationPercentChange, } = getAggragations(pivotTable, item);
|
|
45
42
|
return {
|
|
46
43
|
id: item._id,
|
|
47
44
|
name: item.name,
|
|
@@ -56,9 +53,6 @@ export async function cleanDashboardItem(item, dashboardFilters, client, dateBuc
|
|
|
56
53
|
chartType: item.chartType,
|
|
57
54
|
dateField: item.dateField,
|
|
58
55
|
pivot: item.pivot,
|
|
59
|
-
primaryAggregation,
|
|
60
|
-
comparisonAggregation,
|
|
61
|
-
aggregationPercentChange,
|
|
62
56
|
yAxisFields: pivotTable
|
|
63
57
|
? extractPivotedYAxis(pivotTable, item)
|
|
64
58
|
: item.yAxisFields,
|
|
@@ -70,42 +64,9 @@ export async function cleanDashboardItem(item, dashboardFilters, client, dateBuc
|
|
|
70
64
|
rowCount: parseInt(item.rowCount),
|
|
71
65
|
sort: item.sort,
|
|
72
66
|
itemQuery: item.itemQuery,
|
|
67
|
+
queryString: item.queryString,
|
|
73
68
|
};
|
|
74
69
|
}
|
|
75
|
-
/**
|
|
76
|
-
* Extracts the aggregations from the item, if any.
|
|
77
|
-
*/
|
|
78
|
-
function getAggragations(pivotTable, item) {
|
|
79
|
-
const yAxisFields = extractPivotedYAxis(pivotTable, item);
|
|
80
|
-
const rows = extractPivotedData(pivotTable, item);
|
|
81
|
-
// extract the aggragation for the primary range.
|
|
82
|
-
const mainKey = yAxisFields[0]?.field ?? item.pivot?.valueField;
|
|
83
|
-
const primary = mainKey
|
|
84
|
-
? rows.reduce((sum, row) => sum + parseFloat(row[mainKey]), 0)
|
|
85
|
-
: 0;
|
|
86
|
-
// extract the aggragation for the comparison range, if applicable.
|
|
87
|
-
const compKey = yAxisFields[1]?.field ?? item.pivot?.valueField;
|
|
88
|
-
const comparison = compKey
|
|
89
|
-
? rows.reduce((sum, row) => sum + parseFloat(row[compKey]), 0)
|
|
90
|
-
: 0;
|
|
91
|
-
return {
|
|
92
|
-
primaryAggregation: formatAggragation(item, primary),
|
|
93
|
-
comparisonAggregation: formatAggragation(item, comparison),
|
|
94
|
-
aggregationPercentChange: Number(primary - comparison),
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Applies a valueFormatter to the given value based on the format in the item.
|
|
99
|
-
*/
|
|
100
|
-
function formatAggragation(item, value) {
|
|
101
|
-
if (!value)
|
|
102
|
-
return undefined;
|
|
103
|
-
return valueFormatter({
|
|
104
|
-
value,
|
|
105
|
-
field: item.pivot?.valueField,
|
|
106
|
-
fields: item.yAxisFields,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
70
|
/**
|
|
110
71
|
* Extract and transform the data from itemInfo.
|
|
111
72
|
*/
|
|
@@ -161,20 +122,6 @@ async function getPivotTable(report, dashboardFilters, client, dateBucketInitial
|
|
|
161
122
|
: undefined)
|
|
162
123
|
: undefined;
|
|
163
124
|
}
|
|
164
|
-
/**
|
|
165
|
-
* Returns the data list based on whether the table is pivoted and if there is
|
|
166
|
-
* a config value passed into this component.
|
|
167
|
-
*/
|
|
168
|
-
function extractPivotedData(pivotTable, item, config = undefined) {
|
|
169
|
-
if (pivotTable)
|
|
170
|
-
return pivotTable.rows;
|
|
171
|
-
if (config) {
|
|
172
|
-
if (config.bucketedRows.length > 0)
|
|
173
|
-
return config.bucketedRows;
|
|
174
|
-
return config.rows;
|
|
175
|
-
}
|
|
176
|
-
return item.rows;
|
|
177
|
-
}
|
|
178
125
|
/**
|
|
179
126
|
* Extracts the yAxis from the pivot table, if one exists.
|
|
180
127
|
*/
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { QuillReportInternal } from '../
|
|
1
|
+
import { QuillReportInternal } from '../models/Report';
|
|
2
2
|
export declare enum Calculation {
|
|
3
3
|
PointToPointPercentageChange = "POINT_TO_POINT_PERCENTAGE_CHANGE",
|
|
4
|
-
SimplePercentageChange = "SIMPLE_PERCENTAGE_CHANGE"
|
|
4
|
+
SimplePercentageChange = "SIMPLE_PERCENTAGE_CHANGE",
|
|
5
|
+
Sum = "SUM"
|
|
5
6
|
}
|
|
6
7
|
export declare const getSimplePercentageChange: (data: QuillReportInternal) => number | undefined;
|
|
7
8
|
export declare const getPointToPointPercentageChange: (data: QuillReportInternal) => number | undefined;
|
|
9
|
+
export declare const getSumOfFields: (data: QuillReportInternal) => number;
|
|
8
10
|
//# sourceMappingURL=dataProcessing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/dataProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"dataProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/dataProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAIvD,oBAAY,WAAW;IACrB,4BAA4B,qCAAqC;IACjE,sBAAsB,6BAA6B;IACnD,GAAG,QAAQ;CACZ;AAyBD,eAAO,MAAM,yBAAyB,SAAU,mBAAmB,uBAsClE,CAAC;AAEF,eAAO,MAAM,+BAA+B,SAAU,mBAAmB,uBAkFxE,CAAC;AAEF,eAAO,MAAM,cAAc,SAAU,mBAAmB,WAavD,CAAC"}
|
|
@@ -4,6 +4,7 @@ export var Calculation;
|
|
|
4
4
|
(function (Calculation) {
|
|
5
5
|
Calculation["PointToPointPercentageChange"] = "POINT_TO_POINT_PERCENTAGE_CHANGE";
|
|
6
6
|
Calculation["SimplePercentageChange"] = "SIMPLE_PERCENTAGE_CHANGE";
|
|
7
|
+
Calculation["Sum"] = "SUM";
|
|
7
8
|
})(Calculation || (Calculation = {}));
|
|
8
9
|
const getSumOfField = (rows, field) => {
|
|
9
10
|
if (rows[0] && rows[0][field]) {
|
|
@@ -120,3 +121,18 @@ export const getPointToPointPercentageChange = (data) => {
|
|
|
120
121
|
}
|
|
121
122
|
}
|
|
122
123
|
};
|
|
124
|
+
export const getSumOfFields = (data) => {
|
|
125
|
+
if (data.pivot && data.pivotRows && data.pivotColumns) {
|
|
126
|
+
const pivotRows = data.pivotRows;
|
|
127
|
+
const fields = data.pivotColumns.map((field) => {
|
|
128
|
+
return field.field;
|
|
129
|
+
});
|
|
130
|
+
return getSumOfFieldsAndRows(pivotRows, fields);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
const yAxisFields = data.yAxisFields.map((field) => {
|
|
134
|
+
return field.field;
|
|
135
|
+
});
|
|
136
|
+
return getSumOfFieldsAndRows(data.rows, yAxisFields);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
@@ -14,6 +14,7 @@ export declare function getComparisonInterval(comparisonRange: {
|
|
|
14
14
|
export declare function getDateBucketFromRange(dateRange: {
|
|
15
15
|
start: Date;
|
|
16
16
|
end: Date;
|
|
17
|
-
}): "
|
|
17
|
+
}): "year" | "month" | "week" | "day";
|
|
18
18
|
export declare function parseDateByDatabaseType(date: any, databaseType: string): Date;
|
|
19
|
+
export declare function getDateFormatFromBucket(dateBucket: string): string;
|
|
19
20
|
//# sourceMappingURL=dates.d.ts.map
|