@quillsql/react 2.12.20 → 2.12.22

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