@quillsql/react 2.12.28 → 2.12.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +10 -8
  3. package/dist/cjs/ChartBuilder.d.ts +35 -1
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +38 -4
  6. package/dist/cjs/Context.d.ts +1 -19
  7. package/dist/cjs/Context.d.ts.map +1 -1
  8. package/dist/cjs/Context.js +32 -83
  9. package/dist/cjs/Dashboard.d.ts.map +1 -1
  10. package/dist/cjs/Dashboard.js +76 -49
  11. package/dist/cjs/ReportBuilder.d.ts +9 -0
  12. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  13. package/dist/cjs/ReportBuilder.js +330 -100
  14. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  15. package/dist/cjs/SQLEditor.js +98 -29
  16. package/dist/cjs/Table.d.ts.map +1 -1
  17. package/dist/cjs/Table.js +8 -8
  18. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  19. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  20. package/dist/cjs/components/Dashboard/DataLoader.js +20 -16
  21. package/dist/cjs/hooks/useDashboard.d.ts +1 -1
  22. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  23. package/dist/cjs/hooks/useDashboard.js +18 -4
  24. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  25. package/dist/cjs/internals/ReportBuilder/PivotModal.js +56 -57
  26. package/dist/cjs/utils/columnProcessing.d.ts +1 -0
  27. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
  28. package/dist/cjs/utils/columnProcessing.js +8 -1
  29. package/dist/cjs/utils/dashboard.js +1 -1
  30. package/dist/cjs/utils/dataFetcher.d.ts +1 -1
  31. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  32. package/dist/cjs/utils/dataFetcher.js +9 -4
  33. package/dist/cjs/utils/dates.d.ts +1 -0
  34. package/dist/cjs/utils/dates.d.ts.map +1 -1
  35. package/dist/cjs/utils/dates.js +12 -3
  36. package/dist/cjs/utils/monacoAutocomplete.d.ts +20 -0
  37. package/dist/cjs/utils/monacoAutocomplete.d.ts.map +1 -0
  38. package/dist/cjs/utils/monacoAutocomplete.js +145 -0
  39. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  40. package/dist/cjs/utils/pivotConstructor.js +58 -5
  41. package/dist/cjs/utils/queryConstructor.d.ts +4 -2
  42. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  43. package/dist/cjs/utils/queryConstructor.js +118 -57
  44. package/dist/cjs/utils/queryConstructor.uspec.d.ts +2 -0
  45. package/dist/cjs/utils/queryConstructor.uspec.d.ts.map +1 -0
  46. package/dist/cjs/utils/queryConstructor.uspec.js +225 -0
  47. package/dist/cjs/utils/tableProcessing.d.ts +1 -0
  48. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  49. package/dist/cjs/utils/tableProcessing.js +42 -5
  50. package/dist/esm/Chart.d.ts.map +1 -1
  51. package/dist/esm/Chart.js +10 -8
  52. package/dist/esm/ChartBuilder.d.ts +35 -1
  53. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  54. package/dist/esm/ChartBuilder.js +36 -3
  55. package/dist/esm/Context.d.ts +1 -19
  56. package/dist/esm/Context.d.ts.map +1 -1
  57. package/dist/esm/Context.js +32 -82
  58. package/dist/esm/Dashboard.d.ts.map +1 -1
  59. package/dist/esm/Dashboard.js +77 -50
  60. package/dist/esm/ReportBuilder.d.ts +9 -0
  61. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  62. package/dist/esm/ReportBuilder.js +333 -103
  63. package/dist/esm/SQLEditor.d.ts.map +1 -1
  64. package/dist/esm/SQLEditor.js +99 -30
  65. package/dist/esm/Table.d.ts.map +1 -1
  66. package/dist/esm/Table.js +8 -8
  67. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  68. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  69. package/dist/esm/components/Dashboard/DataLoader.js +20 -16
  70. package/dist/esm/hooks/useDashboard.d.ts +1 -1
  71. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  72. package/dist/esm/hooks/useDashboard.js +19 -5
  73. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  74. package/dist/esm/internals/ReportBuilder/PivotModal.js +57 -58
  75. package/dist/esm/utils/columnProcessing.d.ts +1 -0
  76. package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
  77. package/dist/esm/utils/columnProcessing.js +6 -0
  78. package/dist/esm/utils/dashboard.js +1 -1
  79. package/dist/esm/utils/dataFetcher.d.ts +1 -1
  80. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  81. package/dist/esm/utils/dataFetcher.js +9 -4
  82. package/dist/esm/utils/dates.d.ts +1 -0
  83. package/dist/esm/utils/dates.d.ts.map +1 -1
  84. package/dist/esm/utils/dates.js +10 -2
  85. package/dist/esm/utils/monacoAutocomplete.d.ts +20 -0
  86. package/dist/esm/utils/monacoAutocomplete.d.ts.map +1 -0
  87. package/dist/esm/utils/monacoAutocomplete.js +140 -0
  88. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  89. package/dist/esm/utils/pivotConstructor.js +58 -5
  90. package/dist/esm/utils/queryConstructor.d.ts +4 -2
  91. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  92. package/dist/esm/utils/queryConstructor.js +115 -56
  93. package/dist/esm/utils/queryConstructor.uspec.d.ts +2 -0
  94. package/dist/esm/utils/queryConstructor.uspec.d.ts.map +1 -0
  95. package/dist/esm/utils/queryConstructor.uspec.js +223 -0
  96. package/dist/esm/utils/tableProcessing.d.ts +1 -0
  97. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  98. package/dist/esm/utils/tableProcessing.js +41 -5
  99. package/package.json +1 -1
  100. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
  101. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
  102. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.js +0 -213
  103. package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
  104. package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
  105. package/dist/esm/internals/ReportBuilder/PivotModal.spec.js +0 -211
@@ -1 +1 @@
1
- {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAe9D,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,UAQ1E;AAED,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAcrB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,EAAE,GAAG,EAAE,EACX,UAAU,CAAC,EAAE,MAAM,EACnB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,MAAM,GAAG,SAAS,CAuBpB"}
1
+ {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAmB9D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,UAa1E;AA4CD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAUrB;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UASrB;AAED,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAcrB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EACpB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAwBpB"}
@@ -1,22 +1,74 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generatePivotQuery = exports.generateMinMaxRangeQueries = exports.generateDistinctQuery = void 0;
3
+ exports.generatePivotQuery = exports.generateMinMaxRangeQueries = exports.generateDistinctQuery = exports.generateCountQuery = exports.processColumnReference = void 0;
4
4
  const pivotProcessing_1 = require("./pivotProcessing");
5
- function processAggType(aggType) {
6
- if (aggType === 'count')
5
+ function processSingleQuotes(value, databaseType) {
6
+ if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
7
+ return value.replaceAll("'", "''");
8
+ }
9
+ return value.replaceAll("'", "\\'");
10
+ }
11
+ function processAggType(aggType, hasColumnField = false) {
12
+ if (aggType === 'count' && hasColumnField)
7
13
  return 'SUM';
8
14
  return aggType?.toLowerCase() === 'average' ? 'AVG' : aggType?.toLowerCase();
9
15
  }
10
- function processValueField(aggType, valueField) {
16
+ function replaceBigQuerySpecialCharacters(column) {
17
+ return column.replaceAll('/', 'quill_forward_slash');
18
+ }
19
+ function processColumnReference(column, databaseType) {
20
+ if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
21
+ const columnParts = column.split('.');
22
+ if (columnParts.length > 1) {
23
+ return `"${columnParts[0]}"."${columnParts[1]}"`;
24
+ }
25
+ return `"${column}"`;
26
+ }
27
+ const columnParts = column.split('.');
28
+ if (columnParts.length > 1) {
29
+ return `\`${columnParts[0]}\`.\`${columnParts[1]}\``;
30
+ }
31
+ return `\`${replaceBigQuerySpecialCharacters(column)}\``;
32
+ }
33
+ exports.processColumnReference = processColumnReference;
34
+ function processInterval(interval, rowField, databaseType) {
35
+ if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
36
+ return `(${processColumnReference(rowField, databaseType)} + INTERVAL '${interval}')`;
37
+ }
38
+ return `TIMESTAMP_ADD(${processColumnReference(rowField, databaseType)}, INTERVAL ${interval} )`;
39
+ }
40
+ function processDateTrunc(dateBucket, rowField, databaseType, comparisonInterval) {
41
+ if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
42
+ const date = comparisonInterval
43
+ ? processInterval(comparisonInterval, rowField, databaseType)
44
+ : processColumnReference(rowField, databaseType);
45
+ return `date_trunc('${dateBucket}', ${date})`;
46
+ }
47
+ const date = comparisonInterval
48
+ ? processInterval(comparisonInterval, rowField, databaseType)
49
+ : processColumnReference(rowField, databaseType);
50
+ return `TIMESTAMP_TRUNC(${date}, ${dateBucket})`;
51
+ }
52
+ function processValueField(aggType, databaseType, valueField) {
11
53
  if (aggType === 'min' || aggType === 'max')
12
- return `"${valueField}" ELSE null`;
54
+ return `${processColumnReference(valueField, databaseType)} ELSE null`;
13
55
  if (aggType === 'count')
14
56
  return `1 ELSE 0`;
15
- return valueField ? `"${valueField}" ELSE 0` : `1 ELSE 0`;
57
+ return valueField
58
+ ? `${processColumnReference(valueField, databaseType)} ELSE 0`
59
+ : `1 ELSE 0`;
60
+ }
61
+ function generateCountQuery(fields, query, databaseType) {
62
+ const countQuery = fields.map((field) => {
63
+ return `SELECT '${field}' AS ${processColumnReference('field', databaseType)}, COUNT(DISTINCT ${processColumnReference(field, databaseType)}) AS ${processColumnReference('count', databaseType)} FROM querytable`;
64
+ });
65
+ return (`WITH querytable AS (${query.replace(';', '')}) ` +
66
+ countQuery.join(' UNION ALL '));
16
67
  }
17
- function generateDistinctQuery(stringFields, query) {
68
+ exports.generateCountQuery = generateCountQuery;
69
+ function generateDistinctQuery(stringFields, query, databaseType) {
18
70
  const distinctQueries = stringFields.map((field) => {
19
- return `SELECT '${field}' AS field, ARRAY_AGG(DISTINCT ${field}) AS string_values FROM querytable`;
71
+ return `SELECT '${field}' AS ${processColumnReference('field', databaseType)}, ARRAY_AGG(DISTINCT ${field}) AS ${processColumnReference('string_values', databaseType)} FROM querytable`;
20
72
  });
21
73
  const distinctQuery = distinctQueries.join(' UNION ALL ');
22
74
  return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
@@ -33,136 +85,145 @@ function generateMinMaxRangeQueries(columnFields, query, databaseType) {
33
85
  return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
34
86
  }
35
87
  exports.generateMinMaxRangeQueries = generateMinMaxRangeQueries;
36
- function generatePivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval, distinctStrings) {
88
+ function generatePivotQuery(pivot, itemQueries, databaseType, comparisonInterval, distinctStrings, dateBucket) {
37
89
  if (!(0, pivotProcessing_1.isValidPivot)(pivot)) {
38
90
  return undefined;
39
91
  }
40
92
  if (pivot.columnField) {
41
- return create2DPivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval, distinctStrings);
93
+ return create2DPivotQuery(pivot, itemQueries, databaseType, dateBucket, comparisonInterval, distinctStrings);
42
94
  }
43
95
  if (pivot.rowField) {
44
- return create1DPivotQuery(pivot, itemQueries, dateBucket, comparisonInterval);
96
+ return create1DPivotQuery(pivot, itemQueries, dateBucket, databaseType, comparisonInterval);
45
97
  }
46
- return createAggregationValuePivot(pivot, itemQueries);
98
+ return createAggregationValuePivot(pivot, itemQueries, databaseType);
47
99
  }
48
100
  exports.generatePivotQuery = generatePivotQuery;
49
- function create2DPivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval, distinctStrings) {
101
+ function create2DPivotQuery(pivot, itemQueries, databaseType, dateBucket, comparisonInterval, columnFieldValues) {
50
102
  if (!pivot || !pivot.columnField) {
51
103
  return undefined;
52
104
  }
53
- // @ts-ignore
54
- const columnValues = rows.map((row) => row[pivot.columnField]);
55
- const distinctColumnValues = distinctStrings
56
- ? distinctStrings
57
- : Array.from(new Set(columnValues)).filter((value) => value !== undefined && value !== null);
58
- if (distinctColumnValues.length === 0) {
105
+ if (!columnFieldValues) {
59
106
  return undefined;
60
107
  }
61
108
  if (['string', 'varchar'].includes(pivot.rowFieldType) ||
62
109
  !pivot.rowFieldType) {
63
- return create2DStringPivotQuery(pivot, itemQueries, distinctColumnValues);
110
+ return create2DStringPivotQuery(pivot, itemQueries, columnFieldValues, databaseType);
64
111
  }
65
- return create2DDatePivotQuery(pivot, itemQueries, distinctColumnValues, dateBucket, comparisonInterval);
112
+ return create2DDatePivotQuery(pivot, itemQueries, columnFieldValues, databaseType, dateBucket, comparisonInterval);
66
113
  }
67
- function create2DStringPivotQuery(pivot, itemQueries, distinctColumnValues) {
68
- const caseWhens = distinctColumnValues.map((column) => {
69
- return `${processAggType(pivot.aggregationType)}(CASE WHEN "${pivot.columnField}" = '${column.replaceAll("'", "''")}' THEN ${processValueField(pivot.aggregationType, pivot.valueField)} END) AS "${column}"`;
114
+ function create2DStringPivotQuery(pivot, itemQueries, columnFieldValues, databaseType) {
115
+ if (!pivot.columnField || !pivot.rowField) {
116
+ return undefined;
117
+ }
118
+ const rowField = pivot.rowField;
119
+ const valueField = pivot.valueField;
120
+ const columnField = pivot.columnField;
121
+ const caseWhens = columnFieldValues.map((column) => {
122
+ return `${processAggType(pivot.aggregationType, true)}(CASE WHEN ${processColumnReference(columnField, databaseType)} = '${processSingleQuotes(column, databaseType)}' THEN ${processValueField(pivot.aggregationType, databaseType, valueField)} END) AS ${processColumnReference(column, databaseType)}`;
70
123
  });
71
- const caseWhensCompare = distinctColumnValues.map((column) => {
72
- return `${processAggType(pivot.aggregationType)}(CASE WHEN "${pivot.columnField}" = '${column.replaceAll("'", "''")}' THEN ${processValueField(pivot.aggregationType, pivot.valueField)} END) AS "comparison_${column}"`;
124
+ const caseWhensCompare = columnFieldValues.map((column) => {
125
+ return `${processAggType(pivot.aggregationType, true)}(CASE WHEN ${processColumnReference(columnField, databaseType)} = '${processSingleQuotes(column, databaseType)}' THEN ${processValueField(pivot.aggregationType, databaseType, valueField)} END) AS ${processColumnReference(`comparison_${column}`, databaseType)}`;
73
126
  });
74
127
  const compareCTE = itemQueries[1]
75
128
  ? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
76
129
  : '';
77
130
  const compareCaseWhenCTE = itemQueries[1]
78
- ? `, quill_ct_cw as (SELECT "${pivot.rowField}" as "comparison_${pivot.rowField}", ${caseWhensCompare.join(', ')} FROM quill_ct GROUP BY ${pivot.rowField})`
131
+ ? `, quill_ct_cw as (SELECT ${processColumnReference(rowField, databaseType)} as ${processColumnReference(`comparison_${rowField}`, databaseType)}, ${caseWhensCompare.join(', ')} FROM quill_ct GROUP BY ${processColumnReference(rowField, databaseType)})`
79
132
  : '';
80
133
  const joinQuery = itemQueries[1]
81
- ? `JOIN quill_ct_cw ct ON ct."comparison_${pivot.rowField}" = qt."${pivot.rowField}"`
134
+ ? `JOIN quill_ct_cw ct ON ct.${processColumnReference(`comparison_${rowField}`, databaseType)} = qt.${processColumnReference(rowField, databaseType)}`
82
135
  : '';
83
136
  return `WITH quill_qt AS (${itemQueries[0]?.replaceAll(';', '')}),
84
- quill_qt_cw AS (SELECT ${pivot.rowField}, ${caseWhens.join(', ')} FROM quill_qt GROUP BY ${pivot.rowField})
137
+ quill_qt_cw AS (SELECT ${processColumnReference(rowField, databaseType)}, ${caseWhens.join(', ')} FROM quill_qt GROUP BY ${processColumnReference(rowField, databaseType)})
85
138
  ${compareCTE} ${compareCaseWhenCTE}
86
139
  SELECT * FROM quill_qt_cw qt
87
140
  ${joinQuery}`;
88
141
  }
89
- function create2DDatePivotQuery(pivot, itemQueries, distinctColumnValues, dateBucket = 'month', comparisonInterval) {
90
- const caseWhens = distinctColumnValues.map((column) => {
91
- return `${processAggType(pivot.aggregationType)}(CASE WHEN qt."${pivot.columnField}" = '${column.replaceAll("'", "''")}' THEN ${processValueField(pivot.aggregationType, pivot.valueField)} END) AS "${column}"`;
142
+ function create2DDatePivotQuery(pivot, itemQueries, columnFieldValues, databaseType, dateBucket = 'month', comparisonInterval) {
143
+ if (!pivot.columnField || !pivot.rowField) {
144
+ return undefined;
145
+ }
146
+ const rowField = pivot.rowField;
147
+ const valueField = pivot.valueField;
148
+ const columnField = pivot.columnField;
149
+ const caseWhens = columnFieldValues.map((column) => {
150
+ return `${processAggType(pivot.aggregationType, true)}(CASE WHEN qt.${processColumnReference(columnField, databaseType)} = '${processSingleQuotes(column, databaseType)}' THEN ${processValueField(pivot.aggregationType, databaseType, pivot.valueField)} END) AS ${processColumnReference(column, databaseType)}`;
92
151
  });
93
- const caseWhensCompare = distinctColumnValues.map((column) => {
94
- return `${processAggType(pivot.aggregationType)}(CASE WHEN "${pivot.columnField}" = '${column.replaceAll("'", "''")}' THEN ${processValueField(pivot.aggregationType, pivot.valueField)} END) AS "comparison_${column}"`;
152
+ const caseWhensCompare = columnFieldValues.map((column) => {
153
+ return `${processAggType(pivot.aggregationType, true)}(CASE WHEN ${processColumnReference(columnField, databaseType)} = '${processSingleQuotes(column, databaseType)}' THEN ${processValueField(pivot.aggregationType, databaseType, pivot.valueField)} END) AS ${processColumnReference(`comparison_${column}`, databaseType)}`;
95
154
  });
96
155
  const compareCTE = itemQueries[1] && comparisonInterval
97
156
  ? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
98
157
  : '';
99
158
  const compareCaseWhenCTE = itemQueries[1] && comparisonInterval
100
- ? `, 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}))`
159
+ ? `, quill_ct_cw as (SELECT ${processDateTrunc(dateBucket, rowField, databaseType)} as ${processColumnReference(`comparison_${rowField}`, databaseType)}, ${caseWhensCompare.join(', ')} FROM quill_ct GROUP BY ${processDateTrunc(dateBucket, rowField, databaseType)})`
101
160
  : '';
102
161
  const joinQuery = itemQueries[1] && comparisonInterval
103
- ? `LEFT JOIN quill_ct_cw ct ON qt."${pivot.rowField}" = date_trunc('${dateBucket}', (ct."comparison_${pivot.rowField}" + INTERVAL '${comparisonInterval} day'))`
162
+ ? `LEFT JOIN quill_ct_cw ${processColumnReference(`ct`, databaseType)} ON qt.${processColumnReference(`${rowField}`, databaseType)} = ${processDateTrunc(dateBucket, `ct.comparison_${rowField}`, databaseType, comparisonInterval)}`
104
163
  : '';
105
164
  return `WITH quill_query_table AS (${itemQueries[0]?.replaceAll(';', '')}),
106
- 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}))
165
+ quill_qt_agg as (SELECT ${processDateTrunc(dateBucket, rowField, databaseType)} as ${processColumnReference(rowField, databaseType)}, ${caseWhens.join(', ')} FROM quill_query_table qt GROUP BY ${processDateTrunc(dateBucket, rowField, databaseType)})
107
166
  ${compareCTE} ${compareCaseWhenCTE}
108
167
  SELECT * FROM quill_qt_agg qt
109
- ${joinQuery} ORDER BY qt."${pivot.rowField}"`;
168
+ ${joinQuery} ORDER BY qt.${processColumnReference(`${rowField}`, databaseType)}`;
110
169
  }
111
- function create1DPivotQuery(pivot, itemQueries, dateBucket = 'month', comparisonInterval) {
170
+ function create1DPivotQuery(pivot, itemQueries, dateBucket = 'month', databaseType, comparisonInterval) {
112
171
  if (['string', 'varchar'].includes(pivot.rowFieldType) ||
113
172
  !pivot.rowFieldType) {
114
- return create1DStringPivotQuery(pivot, itemQueries);
173
+ return create1DStringPivotQuery(pivot, itemQueries, databaseType);
115
174
  }
116
- return create1DDatePivotQuery(pivot, itemQueries, dateBucket, comparisonInterval);
175
+ return create1DDatePivotQuery(pivot, itemQueries, dateBucket, databaseType, comparisonInterval);
117
176
  }
118
- function create1DStringPivotQuery(pivot, itemQueries) {
177
+ function create1DStringPivotQuery(pivot, itemQueries, databaseType) {
178
+ const rowField = pivot.rowField;
179
+ const valueField = pivot.valueField;
119
180
  const compareCTE = itemQueries[1]
120
181
  ? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
121
182
  : '';
122
183
  const compareCaseWhenCTE = itemQueries[1]
123
- ? `, quill_ct_cw as (SELECT ${pivot.rowField} as "comparison_${pivot.rowField}", ${processAggType(pivot.aggregationType)}(${pivot.valueField}) as comparison_${pivot.valueField} FROM quill_ct GROUP BY ${pivot.rowField})`
184
+ ? `, quill_ct_cw as (SELECT ${processColumnReference(`${rowField}`, databaseType)} as ${processColumnReference(`comparison_${rowField}`, databaseType)}, ${processAggType(pivot.aggregationType)}(${processColumnReference(`${valueField || rowField}`, databaseType)}) as ${processColumnReference(`comparison_${valueField || 'count'}`, databaseType)} FROM quill_ct GROUP BY ${processColumnReference(`${rowField}`, databaseType)})`
124
185
  : '';
125
186
  const joinQuery = itemQueries[1]
126
- ? `JOIN quill_ct_cw ct ON ct."comparison_${pivot.rowField}" = qt."${pivot.rowField}"`
187
+ ? `JOIN quill_ct_cw ct ON ct.${processColumnReference(`comparison_${rowField}`, databaseType)} = qt.${processColumnReference(`${rowField}`, databaseType)}`
127
188
  : '';
128
189
  return `WITH quill_qt AS (${itemQueries[0]?.replaceAll(';', '')}),
129
- quill_qt_cw AS (SELECT ${pivot.rowField}, ${processAggType(pivot.aggregationType)}(${pivot.valueField}) as ${pivot.valueField} FROM quill_qt GROUP BY ${pivot.rowField})
190
+ quill_qt_cw AS (SELECT ${processColumnReference(`${rowField}`, databaseType)}, ${processAggType(pivot.aggregationType)}(${processColumnReference(`${valueField || rowField}`, databaseType)}) as ${processColumnReference(`${valueField}` || 'count', databaseType)} FROM quill_qt GROUP BY ${processColumnReference(`${rowField}`, databaseType)})
130
191
  ${compareCTE} ${compareCaseWhenCTE}
131
- SELECT * FROM quill_qt_cw qt
192
+ SELECT * FROM quill_qt_cw qt
132
193
  ${joinQuery}`;
133
194
  }
134
- function create1DDatePivotQuery(pivot, itemQueries, dateBucket = 'month', comparisonInterval) {
195
+ function create1DDatePivotQuery(pivot, itemQueries, dateBucket = 'month', databaseType, comparisonInterval) {
196
+ const rowField = pivot.rowField;
197
+ const valueField = pivot.valueField;
135
198
  const compareCTE = itemQueries[1] && comparisonInterval
136
199
  ? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
137
200
  : '';
138
201
  const compareCaseWhenCTE = itemQueries[1] && comparisonInterval
139
- ? `, 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}))`
202
+ ? `, quill_ct_cw as (SELECT ${processDateTrunc(dateBucket, rowField, databaseType)} as ${processColumnReference(`comparison_${rowField}`, databaseType)}, ${processAggType(pivot.aggregationType)}(${processColumnReference(`${valueField || rowField}`, databaseType)}) as ${processColumnReference(`comparison_${valueField || 'count'}`, databaseType)} FROM quill_ct GROUP BY ${processDateTrunc(dateBucket, rowField, databaseType)})`
140
203
  : '';
141
204
  const joinQuery = itemQueries[1] && comparisonInterval
142
- ? `LEFT JOIN quill_ct_cw ct ON qt."${pivot.rowField}" = date_trunc('${dateBucket}', (ct."comparison_${pivot.rowField}" + INTERVAL '${comparisonInterval}'))`
205
+ ? `LEFT JOIN quill_ct_cw ${processColumnReference(`ct`, databaseType)} ON qt.${processColumnReference(`${rowField}`, databaseType)} = ${processDateTrunc(dateBucket, `ct.comparison_${rowField}`, databaseType, comparisonInterval)}`
143
206
  : '';
144
207
  return `WITH quill_qt AS (${itemQueries[0]?.replaceAll(';', '')}),
145
- 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}))
208
+ quill_qt_agg AS (SELECT ${processDateTrunc(dateBucket, rowField, databaseType)} as ${processColumnReference(`${rowField}`, databaseType)}, ${processAggType(pivot.aggregationType)}(${processColumnReference(`${valueField || rowField}`, databaseType)}) as ${processColumnReference(`${valueField || 'count'}`, databaseType)} FROM quill_qt GROUP BY ${processDateTrunc(dateBucket, rowField, databaseType)})
146
209
  ${compareCTE} ${compareCaseWhenCTE}
147
210
  SELECT * FROM quill_qt_agg qt
148
- ${joinQuery} ORDER BY qt."${pivot.rowField}"`;
211
+ ${joinQuery} ORDER BY qt.${processColumnReference(`${rowField}`, databaseType)}`;
149
212
  }
150
- function createAggregationValuePivot(pivot, itemQueries) {
213
+ function createAggregationValuePivot(pivot, itemQueries, databaseType) {
214
+ const valueField = pivot.valueField;
151
215
  let aggregationType = processAggType(pivot.aggregationType);
152
- if (pivot.aggregationType === 'count') {
153
- aggregationType = 'COUNT';
154
- }
155
216
  if (!pivot.valueField)
156
217
  return undefined;
157
218
  const compareCTE = itemQueries[1]
158
219
  ? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
159
220
  : '';
160
221
  const compareAggregation = itemQueries[1]
161
- ? `, quill_ct_cw as (SELECT ${aggregationType}(${pivot.valueField}) as comparison_${pivot.valueField} FROM quill_ct)`
222
+ ? `, quill_ct_cw as (SELECT ${aggregationType}(${processColumnReference(`${valueField}`, databaseType)}) as ${processColumnReference(`comparison_${valueField}`, databaseType)} FROM quill_ct)`
162
223
  : '';
163
224
  const joinQuery = itemQueries[1] ? `CROSS JOIN quill_ct_cw ct` : '';
164
225
  return `WITH quill_qt AS (${itemQueries[0]?.replaceAll(';', '')}),
165
- quill_qt_agg AS (SELECT ${aggregationType}(${pivot.valueField}) as ${pivot.valueField} FROM quill_qt)
226
+ quill_qt_agg AS (SELECT ${aggregationType}(${processColumnReference(`${valueField}`, databaseType)}) as ${processColumnReference(`${valueField}`, databaseType)} FROM quill_qt)
166
227
  ${compareCTE} ${compareAggregation}
167
228
  SELECT * FROM quill_qt_agg qt
168
229
  ${joinQuery}`;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=queryConstructor.uspec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryConstructor.uspec.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.uspec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const queryConstructor_1 = require("./queryConstructor");
4
+ const removeExtraSpacesAndNewLines = (str) => {
5
+ return str.replace(/\s+/g, ' ').trim();
6
+ };
7
+ describe('queryConstructor', () => {
8
+ let default2DPivot = {
9
+ rowField: 'merchant',
10
+ rowFieldType: 'string',
11
+ columnField: 'user',
12
+ valueField: 'amount',
13
+ aggregationType: 'sum',
14
+ };
15
+ const nonComparisonQuery = ['select * from transactions'];
16
+ const comparisonQueries = [
17
+ `select * from transactions where created_at BETWEEN '2024-06-01' AND '2024-07-01'`,
18
+ `select * from transactions where created_at BETWEEN '2024-05-01' AND '2024-06-01'`,
19
+ ];
20
+ describe('bigquery - generatePivotQuery', () => {
21
+ let databaseType = 'bigquery';
22
+ it('should return a 2d string pivot query', async () => {
23
+ const query = (0, queryConstructor_1.generatePivotQuery)(default2DPivot, nonComparisonQuery, databaseType, undefined, ['value1', 'value2']);
24
+ const expected = `WITH quill_qt AS (select * from transactions),
25
+ quill_qt_cw AS (SELECT \`merchant\`,
26
+ sum(CASE WHEN \`user\` = 'value1' THEN \`amount\` ELSE 0 END) AS \`value1\`,
27
+ sum(CASE WHEN \`user\` = 'value2' THEN \`amount\` ELSE 0 END) AS \`value2\`
28
+ FROM quill_qt GROUP BY \`merchant\`)
29
+ SELECT * FROM quill_qt_cw qt`;
30
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
31
+ });
32
+ it('should return a 2d date pivot query', async () => {
33
+ const query = (0, queryConstructor_1.generatePivotQuery)({
34
+ ...default2DPivot,
35
+ rowFieldType: 'MMM_DD_YYY',
36
+ rowField: 'created_at',
37
+ }, nonComparisonQuery, databaseType, undefined, ['value1', 'value2']);
38
+ const expected = `WITH quill_query_table AS (select * from transactions),
39
+ quill_qt_agg as (SELECT TIMESTAMP_TRUNC(\`created_at\`, month) as \`created_at\`,
40
+ sum(CASE WHEN qt.\`user\` = 'value1' THEN \`amount\` ELSE 0 END) AS \`value1\`,
41
+ sum(CASE WHEN qt.\`user\` = 'value2' THEN \`amount\` ELSE 0 END) AS \`value2\` FROM quill_query_table qt
42
+ GROUP BY TIMESTAMP_TRUNC(\`created_at\`, month))
43
+ SELECT * FROM quill_qt_agg qt ORDER BY qt.\`created_at\``;
44
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
45
+ });
46
+ it('should return a 1d date pivot query', async () => {
47
+ const query = (0, queryConstructor_1.generatePivotQuery)({
48
+ ...default2DPivot,
49
+ rowFieldType: 'MMM_DD_YYY',
50
+ rowField: 'created_at',
51
+ columnField: undefined,
52
+ }, nonComparisonQuery, databaseType, undefined);
53
+ const expected = `WITH quill_qt AS (select * from transactions),
54
+ quill_qt_agg AS (SELECT TIMESTAMP_TRUNC(\`created_at\`, month) as \`created_at\`,
55
+ sum(\`amount\`) as \`amount\` FROM quill_qt GROUP BY TIMESTAMP_TRUNC(\`created_at\`, month))
56
+ SELECT * FROM quill_qt_agg qt ORDER BY qt.\`created_at\``;
57
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
58
+ });
59
+ it('should return a 1d string pivot query', async () => {
60
+ const query = (0, queryConstructor_1.generatePivotQuery)({ ...default2DPivot, columnField: undefined }, nonComparisonQuery, databaseType, undefined);
61
+ const expected = `WITH quill_qt AS (select * from transactions),
62
+ quill_qt_cw AS (SELECT \`merchant\`, sum(\`amount\`) as \`amount\`
63
+ FROM quill_qt GROUP BY \`merchant\`)
64
+ SELECT * FROM quill_qt_cw qt`;
65
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
66
+ });
67
+ it('should return a value aggregation query', async () => {
68
+ const query = (0, queryConstructor_1.generatePivotQuery)(
69
+ // @ts-ignore
70
+ { ...default2DPivot, columnField: undefined, rowField: undefined }, nonComparisonQuery, databaseType, undefined);
71
+ const expected = `WITH quill_qt AS (select * from transactions),
72
+ quill_qt_agg AS (SELECT sum(\`amount\`) as \`amount\` FROM quill_qt) SELECT * FROM quill_qt_agg qt`;
73
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
74
+ });
75
+ it('should return a 2d string pivot query with comparison', async () => {
76
+ const query = (0, queryConstructor_1.generatePivotQuery)(default2DPivot, comparisonQueries, databaseType, undefined, ['value1', 'value2']);
77
+ const expected = `WITH quill_qt AS
78
+ (select * from transactions where created_at BETWEEN '2024-06-01' AND '2024-07-01'),
79
+ quill_qt_cw AS (SELECT \`merchant\`,
80
+ sum(CASE WHEN \`user\` = 'value1' THEN \`amount\` ELSE 0 END) AS \`value1\`,
81
+ sum(CASE WHEN \`user\` = 'value2' THEN \`amount\` ELSE 0 END) AS \`value2\` FROM quill_qt GROUP BY \`merchant\`) ,
82
+ quill_ct as (select * from transactions where created_at BETWEEN '2024-05-01' AND '2024-06-01') ,
83
+ quill_ct_cw as (SELECT \`merchant\` as \`comparison_merchant\`,
84
+ sum(CASE WHEN \`user\` = 'value1' THEN \`amount\` ELSE 0 END) AS \`comparison_value1\`,
85
+ sum(CASE WHEN \`user\` = 'value2' THEN \`amount\` ELSE 0 END) AS \`comparison_value2\` FROM quill_ct GROUP BY \`merchant\`)
86
+ SELECT * FROM quill_qt_cw qt JOIN quill_ct_cw ct ON ct.\`comparison_merchant\` = qt.\`merchant\``;
87
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
88
+ });
89
+ it('should return a 2d date pivot query with comparison', async () => {
90
+ const query = (0, queryConstructor_1.generatePivotQuery)({
91
+ ...default2DPivot,
92
+ rowFieldType: 'MMM_DD_YYY',
93
+ rowField: 'created_at',
94
+ }, comparisonQueries, databaseType, '90', ['value1', 'value2']);
95
+ const expected = `WITH quill_query_table AS (select * from transactions where created_at BETWEEN '2024-06-01' AND '2024-07-01'),
96
+ quill_qt_agg as (SELECT TIMESTAMP_TRUNC(\`created_at\`, month) as \`created_at\`,
97
+ sum(CASE WHEN qt.\`user\` = 'value1' THEN \`amount\` ELSE 0 END) AS \`value1\`,
98
+ sum(CASE WHEN qt.\`user\` = 'value2' THEN \`amount\` ELSE 0 END) AS \`value2\`
99
+ FROM quill_query_table qt GROUP BY TIMESTAMP_TRUNC(\`created_at\`, month)) ,
100
+ quill_ct as (select * from transactions where created_at BETWEEN '2024-05-01' AND '2024-06-01') ,
101
+ quill_ct_cw as (SELECT TIMESTAMP_TRUNC(\`created_at\`, month) as \`comparison_created_at\`,
102
+ sum(CASE WHEN \`user\` = 'value1' THEN \`amount\` ELSE 0 END) AS \`comparison_value1\`,
103
+ sum(CASE WHEN \`user\` = 'value2' THEN \`amount\` ELSE 0 END) AS \`comparison_value2\`
104
+ FROM quill_ct GROUP BY TIMESTAMP_TRUNC(\`created_at\`, month))
105
+ SELECT * FROM quill_qt_agg qt
106
+ LEFT JOIN quill_ct_cw \`ct\` ON qt.\`created_at\` = TIMESTAMP_TRUNC(TIMESTAMP_ADD(\`ct\`.\`comparison_created_at\`, INTERVAL 90 ), month)
107
+ ORDER BY qt.\`created_at\``;
108
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
109
+ });
110
+ it('should return a 1d date pivot query with comparison', async () => {
111
+ const query = (0, queryConstructor_1.generatePivotQuery)({
112
+ ...default2DPivot,
113
+ rowFieldType: 'MMM_DD_YYY',
114
+ rowField: 'created_at',
115
+ columnField: undefined,
116
+ }, comparisonQueries, databaseType, '3 month');
117
+ const expected = `WITH quill_qt AS (select * from transactions where created_at BETWEEN '2024-06-01' AND '2024-07-01'),
118
+ quill_qt_agg AS (SELECT TIMESTAMP_TRUNC(\`created_at\`, month) as \`created_at\`,
119
+ sum(\`amount\`) as \`amount\` FROM quill_qt GROUP BY TIMESTAMP_TRUNC(\`created_at\`, month)) ,
120
+ quill_ct as (select * from transactions where created_at BETWEEN '2024-05-01' AND '2024-06-01') ,
121
+ quill_ct_cw as (SELECT TIMESTAMP_TRUNC(\`created_at\`, month) as \`comparison_created_at\`,
122
+ sum(\`amount\`) as \`comparison_amount\` FROM quill_ct GROUP BY TIMESTAMP_TRUNC(\`created_at\`, month))
123
+ SELECT * FROM quill_qt_agg qt LEFT JOIN quill_ct_cw \`ct\` ON qt.\`created_at\` = TIMESTAMP_TRUNC(TIMESTAMP_ADD(\`ct\`.\`comparison_created_at\`, INTERVAL 3 month ), month)
124
+ ORDER BY qt.\`created_at\``;
125
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
126
+ });
127
+ it('should return a 1d string pivot query with comparison', async () => {
128
+ const query = (0, queryConstructor_1.generatePivotQuery)({ ...default2DPivot, columnField: undefined }, comparisonQueries, databaseType, undefined);
129
+ const expected = `WITH quill_qt AS (select * from transactions where created_at BETWEEN '2024-06-01' AND '2024-07-01'),
130
+ quill_qt_cw AS (SELECT \`merchant\`, sum(\`amount\`) as \`amount\` FROM quill_qt GROUP BY \`merchant\`) ,
131
+ quill_ct as (select * from transactions where created_at BETWEEN '2024-05-01' AND '2024-06-01') ,
132
+ quill_ct_cw as (SELECT \`merchant\` as \`comparison_merchant\`, sum(\`amount\`) as \`comparison_amount\` FROM quill_ct GROUP BY \`merchant\`)
133
+ SELECT * FROM quill_qt_cw qt JOIN quill_ct_cw ct ON ct.\`comparison_merchant\` = qt.\`merchant\``;
134
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
135
+ });
136
+ it('should return a value aggregation query', async () => {
137
+ const query = (0, queryConstructor_1.generatePivotQuery)(
138
+ // @ts-ignore
139
+ { ...default2DPivot, columnField: undefined, rowField: undefined }, comparisonQueries, databaseType, undefined);
140
+ const expected = `WITH quill_qt AS (select * from transactions where created_at BETWEEN '2024-06-01' AND '2024-07-01'),
141
+ quill_qt_agg AS (SELECT sum(\`amount\`) as \`amount\` FROM quill_qt) ,
142
+ quill_ct as (select * from transactions where created_at BETWEEN '2024-05-01' AND '2024-06-01') ,
143
+ quill_ct_cw as (SELECT sum(\`amount\`) as \`comparison_amount\` FROM quill_ct)
144
+ SELECT * FROM quill_qt_agg qt CROSS JOIN quill_ct_cw ct`;
145
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
146
+ });
147
+ });
148
+ describe('postgresql - generatePivotQuery', () => {
149
+ let databaseType = 'postgresql';
150
+ it('should return a 2d string pivot query', async () => {
151
+ const query = (0, queryConstructor_1.generatePivotQuery)(default2DPivot, ['select * from transactions'], databaseType, undefined, ['value1', 'value2']);
152
+ const expected = `WITH quill_qt AS (select * from transactions),
153
+ quill_qt_cw AS
154
+ (SELECT \"merchant\", sum(CASE WHEN \"user\" = 'value1' THEN \"amount\" ELSE 0 END) AS \"value1\",
155
+ sum(CASE WHEN \"user\" = 'value2' THEN \"amount\" ELSE 0 END) AS \"value2\" FROM quill_qt GROUP BY \"merchant\")
156
+ SELECT * FROM quill_qt_cw qt`;
157
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
158
+ });
159
+ it('should return a 2d date pivot query', async () => {
160
+ const query = (0, queryConstructor_1.generatePivotQuery)({
161
+ ...default2DPivot,
162
+ rowFieldType: 'MMM_DD_YYY',
163
+ rowField: 'created_at',
164
+ }, ['select * from transactions'], databaseType, undefined, ['value1', 'value2']);
165
+ const expected = `WITH quill_query_table AS (select * from transactions),
166
+ quill_qt_agg as (SELECT date_trunc('month', \"created_at\") as \"created_at\",
167
+ sum(CASE WHEN qt.\"user\" = 'value1' THEN \"amount\" ELSE 0 END) AS \"value1\",
168
+ sum(CASE WHEN qt.\"user\" = 'value2' THEN \"amount\" ELSE 0 END) AS \"value2\"
169
+ FROM quill_query_table qt
170
+ GROUP BY date_trunc('month', \"created_at\"))
171
+ SELECT * FROM quill_qt_agg qt ORDER BY qt.\"created_at\"`;
172
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
173
+ });
174
+ it('should return a 1d date pivot query', async () => {
175
+ const query = (0, queryConstructor_1.generatePivotQuery)({
176
+ ...default2DPivot,
177
+ rowFieldType: 'MMM_DD_YYY',
178
+ rowField: 'created_at',
179
+ columnField: undefined,
180
+ }, ['select * from transactions'], databaseType, undefined);
181
+ const expected = `WITH quill_qt AS (select * from transactions),
182
+ quill_qt_agg AS (SELECT date_trunc('month', \"created_at\") as \"created_at\", sum(\"amount\") as \"amount\"
183
+ FROM quill_qt
184
+ GROUP BY date_trunc('month', \"created_at\"))
185
+ SELECT * FROM quill_qt_agg qt ORDER BY qt.\"created_at\"`;
186
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
187
+ });
188
+ it('should return a 1d string pivot query', async () => {
189
+ const query = (0, queryConstructor_1.generatePivotQuery)({ ...default2DPivot, columnField: undefined }, ['select * from transactions'], databaseType, undefined);
190
+ const expected = `WITH quill_qt AS (select * from transactions),
191
+ quill_qt_cw AS (SELECT "merchant", sum("amount") as "amount"
192
+ FROM quill_qt
193
+ GROUP BY "merchant")
194
+ SELECT * FROM quill_qt_cw qt`;
195
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
196
+ });
197
+ it('should return a value aggregation query', async () => {
198
+ const query = (0, queryConstructor_1.generatePivotQuery)(
199
+ // @ts-ignore
200
+ { ...default2DPivot, columnField: undefined, rowField: undefined }, ['select * from transactions'], databaseType, undefined);
201
+ const expected = `WITH quill_qt AS (select * from transactions),
202
+ quill_qt_agg AS (SELECT sum("amount") as "amount" FROM quill_qt) SELECT * FROM quill_qt_agg qt`;
203
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
204
+ });
205
+ it('should return a 2d date pivot query with comparison', async () => {
206
+ const query = (0, queryConstructor_1.generatePivotQuery)({
207
+ ...default2DPivot,
208
+ rowFieldType: 'MMM_DD_YYY',
209
+ rowField: 'created_at',
210
+ }, comparisonQueries, databaseType, '90 DAY', ['value1', 'value2']);
211
+ const expected = `WITH quill_query_table AS
212
+ (select * from transactions where created_at BETWEEN '2024-06-01' AND '2024-07-01'),
213
+ quill_qt_agg as (SELECT date_trunc('month', \"created_at\") as \"created_at\",
214
+ sum(CASE WHEN qt.\"user\" = 'value1' THEN \"amount\" ELSE 0 END) AS \"value1\",
215
+ sum(CASE WHEN qt.\"user\" = 'value2' THEN \"amount\" ELSE 0 END) AS \"value2\" FROM quill_query_table qt GROUP BY date_trunc('month', \"created_at\")) ,
216
+ quill_ct as (select * from transactions where created_at BETWEEN '2024-05-01' AND '2024-06-01') ,
217
+ quill_ct_cw as (SELECT date_trunc('month', \"created_at\") as \"comparison_created_at\",
218
+ sum(CASE WHEN \"user\" = 'value1' THEN \"amount\" ELSE 0 END) AS \"comparison_value1\",
219
+ sum(CASE WHEN \"user\" = 'value2' THEN \"amount\" ELSE 0 END) AS \"comparison_value2\" FROM quill_ct GROUP BY date_trunc('month', \"created_at\"))
220
+ SELECT * FROM quill_qt_agg qt LEFT JOIN quill_ct_cw \"ct\" ON qt.\"created_at\" = date_trunc('month', (\"ct\".\"comparison_created_at\" + INTERVAL '90 DAY'))
221
+ ORDER BY qt.\"created_at\"`;
222
+ expect(removeExtraSpacesAndNewLines(query)).toEqual(removeExtraSpacesAndNewLines(expected));
223
+ });
224
+ });
225
+ });
@@ -16,6 +16,7 @@ export declare const getUniqueValuesByColumns: (columns: Column[], query: string
16
16
  [value: string]: boolean;
17
17
  };
18
18
  } | null>;
19
+ export declare const getCountsByColumns: (columns: Column[], query: string, client: any, customFields: any[]) => Promise<Column[]>;
19
20
  export declare const getDateRangeByColumns: (columns: Column[], query: string, client: any, customFields: any[]) => Promise<{
20
21
  [column: string]: {
21
22
  dateRange: {
@@ -1 +1 @@
1
- {"version":3,"file":"tableProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/tableProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAS3C,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,IAAI,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD;AAED,eAAO,MAAM,cAAc,YAChB,MAAM,EAAE,qBACE,MAAM,EAAE,KAC1B,OAUF,CAAC;AAEF,eAAO,MAAM,wBAAwB,YAC1B,MAAM,EAAE,SACV,MAAM,QACP,GAAG,UACD,GAAG,gBACG,GAAG,EAAE;;;;SA6DpB,CAAC;AAkDF,eAAO,MAAM,qBAAqB,YACvB,MAAM,EAAE,SACV,MAAM,UACL,GAAG,gBACG,GAAG,EAAE;;mBAEY;YAAE,KAAK,EAAE,IAAI,CAAC;YAAC,GAAG,EAAE,IAAI,CAAA;SAAE;;SAc1D,CAAC;AAqDF,eAAO,MAAM,gBAAgB,WACnB,WAAW,UACX,GAAG,eACE,GAAG,YACN,GAAG,iBACE,GAAG;;EA4CnB,CAAC"}
1
+ {"version":3,"file":"tableProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/tableProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAW3C,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,IAAI,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD;AAED,eAAO,MAAM,cAAc,YAChB,MAAM,EAAE,qBACE,MAAM,EAAE,KAC1B,OAUF,CAAC;AAEF,eAAO,MAAM,wBAAwB,YAC1B,MAAM,EAAE,SACV,MAAM,QACP,GAAG,UACD,GAAG,gBACG,GAAG,EAAE;;;;SAiEpB,CAAC;AAEF,eAAO,MAAM,kBAAkB,YACpB,MAAM,EAAE,SACV,MAAM,UACL,GAAG,gBACG,GAAG,EAAE,KAClB,QAAQ,MAAM,EAAE,CA2ClB,CAAC;AAkDF,eAAO,MAAM,qBAAqB,YACvB,MAAM,EAAE,SACV,MAAM,UACL,GAAG,gBACG,GAAG,EAAE;;mBAEY;YAAE,KAAK,EAAE,IAAI,CAAC;YAAC,GAAG,EAAE,IAAI,CAAA;SAAE;;SAiB1D,CAAC;AA2DF,eAAO,MAAM,gBAAgB,WACnB,WAAW,UACX,GAAG,eACE,GAAG,YACN,GAAG,iBACE,GAAG;;EA4CnB,CAAC"}
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getPaginatedRows = exports.getDateRangeByColumns = exports.getUniqueValuesByColumns = exports.hasColumnAlias = void 0;
3
+ exports.getPaginatedRows = exports.getDateRangeByColumns = exports.getCountsByColumns = exports.getUniqueValuesByColumns = exports.hasColumnAlias = void 0;
4
4
  const dataFetcher_1 = require("./dataFetcher");
5
+ const dates_1 = require("./dates");
5
6
  const errorProcessing_1 = require("./errorProcessing");
6
7
  const merge_1 = require("./merge");
7
8
  const queryConstructor_1 = require("./queryConstructor");
@@ -52,7 +53,7 @@ const getUniqueValuesByColumns = async (columns, query, rows, client, customFiel
52
53
  }
53
54
  }
54
55
  else {
55
- const distinctValueQuery = (0, queryConstructor_1.generateDistinctQuery)(stringNames, query);
56
+ const distinctValueQuery = (0, queryConstructor_1.generateDistinctQuery)(stringNames, query, client.databaseType);
56
57
  const distinctStrings = await fetchDistinctStrings(distinctValueQuery, client, customFields);
57
58
  if (!distinctStrings) {
58
59
  return {};
@@ -64,6 +65,40 @@ const getUniqueValuesByColumns = async (columns, query, rows, client, customFiel
64
65
  return uniqueValues;
65
66
  };
66
67
  exports.getUniqueValuesByColumns = getUniqueValuesByColumns;
68
+ const getCountsByColumns = async (columns, query, client, customFields) => {
69
+ const stringNames = columns.map((column) => column.field);
70
+ const countQuery = (0, queryConstructor_1.generateCountQuery)(stringNames, query, client.databaseType);
71
+ try {
72
+ const hostedBody = {
73
+ metadata: {
74
+ query: countQuery,
75
+ task: 'query',
76
+ orgId: client.customerId || '*',
77
+ clientId: client.publicKey,
78
+ databaseType: client?.databaseType,
79
+ customFieldsByTable: customFields,
80
+ },
81
+ };
82
+ const cloudBody = { countQuery };
83
+ const data = await (0, dataFetcher_1.getData)(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
84
+ if (data.errorMessage) {
85
+ return columns;
86
+ }
87
+ const results = data.rows.map((columnInfo) => {
88
+ return { field: columnInfo.field, count: columnInfo.count };
89
+ });
90
+ const filteredColumns = columns.filter((column) => {
91
+ const columnInfo = results.find((result) => result.field === column.field);
92
+ return columnInfo.count <= 50;
93
+ });
94
+ return filteredColumns;
95
+ }
96
+ catch (e) {
97
+ console.error(e);
98
+ return columns;
99
+ }
100
+ };
101
+ exports.getCountsByColumns = getCountsByColumns;
67
102
  const fetchDistinctStrings = async (query, client, customFields) => {
68
103
  try {
69
104
  const hostedBody = {
@@ -100,7 +135,9 @@ const fetchDistinctStrings = async (query, client, customFields) => {
100
135
  }
101
136
  };
102
137
  const getDateRangeByColumns = async (columns, query, client, customFields) => {
103
- const columnNames = columns.map((column) => column.field);
138
+ const columnNames = columns.map(
139
+ // @ts-ignore
140
+ (column) => column.field || column.name);
104
141
  const distinctValueQuery = (0, queryConstructor_1.generateMinMaxRangeQueries)(columnNames, query, client.databaseType);
105
142
  const dateRanges = await fetchDateRanges(distinctValueQuery, client, customFields);
106
143
  return dateRanges;
@@ -126,8 +163,8 @@ const fetchDateRanges = async (query, client, customFields) => {
126
163
  const results = data.rows.reduce((acc, currentValue) => {
127
164
  acc[currentValue.field] = {
128
165
  dateRange: {
129
- start: new Date(currentValue.min_range),
130
- end: new Date(currentValue.max_range),
166
+ start: (0, dates_1.parseDateByDatabaseType)(currentValue.min_range, client.databaseType),
167
+ end: (0, dates_1.parseDateByDatabaseType)(currentValue.max_range, client.databaseType),
131
168
  },
132
169
  };
133
170
  return acc;