@quillsql/react 2.12.46 → 2.12.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +16 -7
- package/dist/cjs/ChartBuilder.d.ts +10 -11
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +78 -81
- package/dist/cjs/ChartEditor.d.ts +3 -1
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +26 -10
- package/dist/cjs/Context.d.ts +2 -3
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +42 -28
- package/dist/cjs/Dashboard.d.ts +12 -12
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +61 -69
- package/dist/cjs/QuillProvider.d.ts +2 -0
- package/dist/cjs/QuillProvider.d.ts.map +1 -1
- package/dist/cjs/QuillProvider.js +1 -15
- package/dist/cjs/ReportBuilder.d.ts +9 -9
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +116 -179
- package/dist/cjs/SQLEditor.d.ts +20 -11
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +157 -90
- package/dist/cjs/Table.js +3 -3
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarChart.js +6 -25
- package/dist/cjs/components/Chart/BarList.js +1 -1
- package/dist/cjs/components/Chart/ChartError.d.ts +5 -2
- package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartError.js +7 -10
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +16 -1
- package/dist/cjs/components/Chart/PieChart.js +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.js +46 -47
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.js +2 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +2 -2
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +19 -13
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +16 -26
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +16 -25
- package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.js +31 -1
- package/dist/cjs/components/QuillSelect.js +1 -1
- package/dist/cjs/components/QuillTable.d.ts +1 -1
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +115 -105
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts +3 -3
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddColumnModal.js +2 -2
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +2 -2
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +28 -9
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +1 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.js +178 -114
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +1 -2
- package/dist/cjs/components/ReportBuilder/ui.d.ts +9 -1
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +37 -3
- package/dist/cjs/components/ReportBuilder/util.d.ts +5 -1
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +26 -12
- package/dist/cjs/components/UiComponents.d.ts +17 -3
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +160 -29
- package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useAskQuill.js +7 -7
- package/dist/cjs/hooks/useAstToFilterTree.d.ts +4 -1
- package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -1
- package/dist/cjs/hooks/useAstToFilterTree.js +4 -1
- package/dist/cjs/hooks/useDashboard.d.ts +5 -1
- package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +28 -4
- package/dist/cjs/hooks/useOnClickOutside.js +2 -2
- package/dist/cjs/hooks/useQuill.js +4 -4
- package/dist/cjs/hooks/useVirtualTables.d.ts +10 -0
- package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -0
- package/dist/cjs/hooks/useVirtualTables.js +29 -0
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +4 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +45 -21
- package/dist/cjs/models/Client.d.ts +3 -0
- package/dist/cjs/models/Client.d.ts.map +1 -1
- package/dist/cjs/models/Report.d.ts +2 -0
- package/dist/cjs/models/Report.d.ts.map +1 -1
- package/dist/cjs/models/Schema.d.ts +7 -0
- package/dist/cjs/models/Schema.d.ts.map +1 -0
- package/dist/cjs/models/Schema.js +2 -0
- package/dist/cjs/models/Tables.d.ts +2 -0
- package/dist/cjs/models/Tables.d.ts.map +1 -1
- package/dist/cjs/utils/astFilterProcessing.d.ts +4 -0
- package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astFilterProcessing.js +47 -44
- package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astProcessing.js +8 -8
- package/dist/cjs/utils/client.d.ts.map +1 -1
- package/dist/cjs/utils/client.js +1 -0
- package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/columnProcessing.js +88 -5
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +7 -3
- package/dist/cjs/utils/filterProcessing.d.ts +25 -0
- package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/filterProcessing.js +121 -1
- package/dist/cjs/utils/paginationProcessing.js +2 -2
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +10 -6
- package/dist/cjs/utils/queryConstructor.d.ts +1 -0
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +37 -11
- package/dist/cjs/utils/report.d.ts +5 -0
- package/dist/cjs/utils/report.d.ts.map +1 -1
- package/dist/cjs/utils/report.js +63 -9
- package/dist/cjs/utils/schema.js +22 -20
- package/dist/cjs/utils/tableProcessing.d.ts +1 -0
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +22 -1
- package/dist/cjs/utils/validation.d.ts.map +1 -1
- package/dist/cjs/utils/validation.js +4 -0
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +17 -8
- package/dist/esm/ChartBuilder.d.ts +10 -11
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +81 -84
- package/dist/esm/ChartEditor.d.ts +3 -1
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +27 -11
- package/dist/esm/Context.d.ts +2 -3
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +42 -28
- package/dist/esm/Dashboard.d.ts +12 -12
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +63 -71
- package/dist/esm/QuillProvider.d.ts +2 -0
- package/dist/esm/QuillProvider.d.ts.map +1 -1
- package/dist/esm/QuillProvider.js +2 -16
- package/dist/esm/ReportBuilder.d.ts +9 -9
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +122 -185
- package/dist/esm/SQLEditor.d.ts +20 -11
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +160 -93
- package/dist/esm/Table.js +4 -4
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarChart.js +7 -26
- package/dist/esm/components/Chart/BarList.js +1 -1
- package/dist/esm/components/Chart/ChartError.d.ts +5 -2
- package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartError.js +7 -10
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +16 -1
- package/dist/esm/components/Chart/PieChart.js +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.d.ts +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.js +46 -47
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.js +2 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts +2 -2
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +20 -14
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +16 -26
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +16 -25
- package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.js +31 -1
- package/dist/esm/components/QuillSelect.js +1 -1
- package/dist/esm/components/QuillTable.d.ts +1 -1
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +115 -105
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +3 -3
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddColumnModal.js +2 -2
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +2 -2
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.js +28 -9
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts +1 -1
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/FilterModal.js +178 -114
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +1 -2
- package/dist/esm/components/ReportBuilder/ui.d.ts +9 -1
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +38 -4
- package/dist/esm/components/ReportBuilder/util.d.ts +5 -1
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +26 -12
- package/dist/esm/components/UiComponents.d.ts +17 -3
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +158 -28
- package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useAskQuill.js +8 -8
- package/dist/esm/hooks/useAstToFilterTree.d.ts +4 -1
- package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -1
- package/dist/esm/hooks/useAstToFilterTree.js +4 -1
- package/dist/esm/hooks/useDashboard.d.ts +5 -1
- package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.js +28 -5
- package/dist/esm/hooks/useOnClickOutside.js +2 -2
- package/dist/esm/hooks/useQuill.js +5 -5
- package/dist/esm/hooks/useVirtualTables.d.ts +10 -0
- package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -0
- package/dist/esm/hooks/useVirtualTables.js +25 -0
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +44 -23
- package/dist/esm/models/Client.d.ts +3 -0
- package/dist/esm/models/Client.d.ts.map +1 -1
- package/dist/esm/models/Report.d.ts +2 -0
- package/dist/esm/models/Report.d.ts.map +1 -1
- package/dist/esm/models/Schema.d.ts +7 -0
- package/dist/esm/models/Schema.d.ts.map +1 -0
- package/dist/esm/models/Schema.js +1 -0
- package/dist/esm/models/Tables.d.ts +2 -0
- package/dist/esm/models/Tables.d.ts.map +1 -1
- package/dist/esm/utils/astFilterProcessing.d.ts +4 -0
- package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astFilterProcessing.js +45 -43
- package/dist/esm/utils/astProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astProcessing.js +8 -8
- package/dist/esm/utils/client.d.ts.map +1 -1
- package/dist/esm/utils/client.js +1 -0
- package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
- package/dist/esm/utils/columnProcessing.js +88 -5
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +7 -3
- package/dist/esm/utils/filterProcessing.d.ts +25 -0
- package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/filterProcessing.js +116 -0
- package/dist/esm/utils/paginationProcessing.js +2 -2
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +10 -6
- package/dist/esm/utils/queryConstructor.d.ts +1 -0
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +35 -10
- package/dist/esm/utils/report.d.ts +5 -0
- package/dist/esm/utils/report.d.ts.map +1 -1
- package/dist/esm/utils/report.js +61 -8
- package/dist/esm/utils/schema.js +22 -20
- package/dist/esm/utils/tableProcessing.d.ts +1 -0
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +21 -1
- package/dist/esm/utils/validation.d.ts.map +1 -1
- package/dist/esm/utils/validation.js +4 -0
- package/package.json +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/utils/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,eAAO,MAAM,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/utils/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,eAAO,MAAM,YAAY,EAAE,MAU1B,CAAC;AAEF,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,eAAe,UAAQ,EACvB,YAAY,CAAC,EAAE,WAAW,GACzB,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
|
package/dist/esm/utils/client.js
CHANGED
|
@@ -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;AAEhE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,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;AAQvD,UAAU,6CAA6C;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,oCAAoC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,2BAA2B,GAC5B,6CAA6C,GAC7C,oCAAoC,CAAC;AAEzC,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,2BAA2B,GACjC,cAAc,CAgJhB;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,UAAU,GACrB,cAAc,CAShB;AAsED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwDlE;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,4 +1,5 @@
|
|
|
1
1
|
import { findAndProcessDateFilter } from './filterProcessing';
|
|
2
|
+
import { snakeAndCamelCaseToTitleCase } from './textProcessing';
|
|
2
3
|
function removeBigQuerySpecialChars(columnName) {
|
|
3
4
|
return columnName.replaceAll('quill_forward_slash', '/');
|
|
4
5
|
}
|
|
@@ -26,8 +27,12 @@ export function convertPostgresColumn(field) {
|
|
|
26
27
|
case 1114: // timestamp
|
|
27
28
|
format = 'MMM_dd_yyyy';
|
|
28
29
|
break;
|
|
30
|
+
case 114: // json
|
|
31
|
+
case 199: // json[]
|
|
29
32
|
case 1186: // interval
|
|
30
33
|
case 1043: // varchar
|
|
34
|
+
case 3802: // jsonb
|
|
35
|
+
case 3807: // jsonb[]
|
|
31
36
|
default:
|
|
32
37
|
format = 'string';
|
|
33
38
|
}
|
|
@@ -44,6 +49,12 @@ export function convertPostgresColumn(field) {
|
|
|
44
49
|
case 23: // int4
|
|
45
50
|
fieldType = 'int4';
|
|
46
51
|
break;
|
|
52
|
+
case 114: // json
|
|
53
|
+
fieldType = 'json';
|
|
54
|
+
break;
|
|
55
|
+
case 199: // json[]
|
|
56
|
+
fieldType = 'json[]';
|
|
57
|
+
break;
|
|
47
58
|
case 700: // float4
|
|
48
59
|
fieldType = 'float4';
|
|
49
60
|
break;
|
|
@@ -68,6 +79,18 @@ export function convertPostgresColumn(field) {
|
|
|
68
79
|
case 1114: // timestamp
|
|
69
80
|
fieldType = 'timestamp';
|
|
70
81
|
break;
|
|
82
|
+
case 2950: // uuid
|
|
83
|
+
fieldType = 'uuid';
|
|
84
|
+
break;
|
|
85
|
+
case 2951: // uuid[]
|
|
86
|
+
fieldType = 'uuid[]';
|
|
87
|
+
break;
|
|
88
|
+
case 3802: // jsonb
|
|
89
|
+
fieldType = 'jsonb';
|
|
90
|
+
break;
|
|
91
|
+
case 3807: // jsonb[]
|
|
92
|
+
fieldType = 'jsonb[]';
|
|
93
|
+
break;
|
|
71
94
|
case 1043: // varchar
|
|
72
95
|
default:
|
|
73
96
|
fieldType = 'varchar';
|
|
@@ -84,6 +107,14 @@ export function convertPostgresColumn(field) {
|
|
|
84
107
|
case 1700: // numeric
|
|
85
108
|
jsType = 'number';
|
|
86
109
|
break;
|
|
110
|
+
case 114: // json
|
|
111
|
+
case 3802: // jsonb
|
|
112
|
+
jsType = 'object';
|
|
113
|
+
break;
|
|
114
|
+
case 199:
|
|
115
|
+
case 3807:
|
|
116
|
+
jsType = 'object[]';
|
|
117
|
+
break;
|
|
87
118
|
case 1082: // date
|
|
88
119
|
case 1083: // time
|
|
89
120
|
case 1184: // timestamptz
|
|
@@ -92,11 +123,19 @@ export function convertPostgresColumn(field) {
|
|
|
92
123
|
jsType = 'date';
|
|
93
124
|
break;
|
|
94
125
|
case 1043: // varchar
|
|
126
|
+
case 2950: // uuid
|
|
127
|
+
jsType = 'string';
|
|
128
|
+
break;
|
|
129
|
+
case 2951: // uuid[]
|
|
130
|
+
jsType = 'string[]';
|
|
131
|
+
break;
|
|
95
132
|
default:
|
|
96
133
|
jsType = 'string';
|
|
97
134
|
}
|
|
98
135
|
return {
|
|
99
|
-
label: 'field' in field
|
|
136
|
+
label: 'field' in field
|
|
137
|
+
? snakeAndCamelCaseToTitleCase(field.field)
|
|
138
|
+
: snakeAndCamelCaseToTitleCase(field.name),
|
|
100
139
|
field: 'field' in field ? field.field : field.name,
|
|
101
140
|
format,
|
|
102
141
|
fieldType,
|
|
@@ -147,6 +186,10 @@ function fieldTypeToDataTypeID(fieldType) {
|
|
|
147
186
|
return 21;
|
|
148
187
|
case 'int4':
|
|
149
188
|
return 23;
|
|
189
|
+
case 'json':
|
|
190
|
+
return 114;
|
|
191
|
+
case 'json[]':
|
|
192
|
+
return 199;
|
|
150
193
|
case 'float4':
|
|
151
194
|
return 700;
|
|
152
195
|
case 'float8':
|
|
@@ -163,33 +206,73 @@ function fieldTypeToDataTypeID(fieldType) {
|
|
|
163
206
|
return 1114;
|
|
164
207
|
case 'interval':
|
|
165
208
|
return 1186;
|
|
209
|
+
case 'uuid':
|
|
210
|
+
return 2950;
|
|
211
|
+
case 'uuid[]':
|
|
212
|
+
return 2951;
|
|
213
|
+
case 'jsonb':
|
|
214
|
+
return 3802;
|
|
215
|
+
case 'jsonb[]':
|
|
216
|
+
return 3807;
|
|
166
217
|
case 'varchar':
|
|
167
218
|
default:
|
|
168
219
|
return 1043;
|
|
169
220
|
}
|
|
170
221
|
}
|
|
171
222
|
export function convertFieldTypeToJSType(fieldType) {
|
|
223
|
+
let jsType = '';
|
|
172
224
|
switch (fieldType) {
|
|
173
225
|
case 'bool':
|
|
174
|
-
|
|
226
|
+
jsType = 'bool';
|
|
227
|
+
break;
|
|
175
228
|
case 'int8':
|
|
176
229
|
case 'int2':
|
|
177
230
|
case 'int4':
|
|
178
231
|
case 'float4':
|
|
179
232
|
case 'float8':
|
|
180
233
|
case 'numeric':
|
|
181
|
-
|
|
234
|
+
jsType = 'number';
|
|
235
|
+
break;
|
|
182
236
|
case 'date':
|
|
183
237
|
case 'time':
|
|
184
238
|
case 'timestamptz':
|
|
185
239
|
case 'timestamp':
|
|
186
|
-
|
|
240
|
+
jsType = 'date';
|
|
241
|
+
break;
|
|
242
|
+
case 'json':
|
|
243
|
+
case 'jsonb':
|
|
244
|
+
case 'json[]':
|
|
245
|
+
case 'jsonb[]':
|
|
246
|
+
case 'int2[]':
|
|
247
|
+
case 'int4[]':
|
|
248
|
+
case 'int8[]':
|
|
249
|
+
case 'float4[]':
|
|
250
|
+
case 'float8[]':
|
|
251
|
+
case 'text[]':
|
|
252
|
+
case 'char[]':
|
|
253
|
+
case 'bool[]':
|
|
254
|
+
case 'uuid[]':
|
|
255
|
+
case 'varchar[]':
|
|
256
|
+
case 'interval[]':
|
|
257
|
+
case 'numeric[]':
|
|
258
|
+
case 'bytea[]':
|
|
259
|
+
case 'cidr[]':
|
|
260
|
+
case 'inet[]':
|
|
261
|
+
case 'macaddr[]':
|
|
262
|
+
case 'date[]':
|
|
263
|
+
case 'timestamp[]':
|
|
264
|
+
case 'timestamptz[]':
|
|
265
|
+
case 'timetz[]':
|
|
266
|
+
jsType = 'object';
|
|
267
|
+
break;
|
|
187
268
|
case 'interval':
|
|
188
269
|
case 'varchar':
|
|
189
270
|
case 'text':
|
|
271
|
+
case 'uuid':
|
|
190
272
|
default:
|
|
191
|
-
|
|
273
|
+
jsType = 'string';
|
|
192
274
|
}
|
|
275
|
+
return jsType;
|
|
193
276
|
}
|
|
194
277
|
export function convertFormatToJsType(column) {
|
|
195
278
|
switch (column.format) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/dataFetcher.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AA8E1C,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,GAAG,EACtB,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,EACf,UAAU,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"dataFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/dataFetcher.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AA8E1C,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,GAAG,EACtB,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,EACf,UAAU,CAAC,EAAE,MAAM,gBAgJpB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBA6BhB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,GAAG,GACb,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB5C"}
|
|
@@ -54,7 +54,7 @@ async function testSqlViewState(hostedRequestBody, client, referencedTables) {
|
|
|
54
54
|
},
|
|
55
55
|
};
|
|
56
56
|
getData(client, 'test-view', 'same-origin', brokenBody, cloudBody);
|
|
57
|
-
errorMessage = `
|
|
57
|
+
errorMessage = `Virtual Table Error: '${table}' is out of sync with datasource.`;
|
|
58
58
|
}
|
|
59
59
|
}));
|
|
60
60
|
return errorMessage;
|
|
@@ -83,18 +83,22 @@ export async function getData(client, cloudQueryEndpoint, noCred, hostedRequestB
|
|
|
83
83
|
['query', 'patterns', 'item'].includes(hostedRequestBody.metadata.task)) {
|
|
84
84
|
const brokenReport = { ...responseJson };
|
|
85
85
|
let errorPrefix = 'Error: ';
|
|
86
|
-
let errorMessage = 'Failed to fetch
|
|
86
|
+
let errorMessage = 'Failed to fetch report: ' + responseJson.error;
|
|
87
87
|
if (hostedRequestBody.metadata.task === 'query' ||
|
|
88
88
|
hostedRequestBody.metadata.task === 'patterns') {
|
|
89
89
|
errorPrefix = 'SQL Error: ';
|
|
90
90
|
errorMessage = errorPrefix + responseJson.error;
|
|
91
91
|
}
|
|
92
|
+
else if (responseJson.error?.includes('Virtual Table Error')) {
|
|
93
|
+
errorMessage = responseJson.error;
|
|
94
|
+
}
|
|
92
95
|
let adminErrorMessage = undefined;
|
|
93
96
|
const processedData = fetchQuillData(brokenReport);
|
|
94
97
|
if (processedData &&
|
|
95
98
|
processedData.data &&
|
|
96
99
|
processedData.data.referencedTables) {
|
|
97
|
-
adminErrorMessage =
|
|
100
|
+
adminErrorMessage =
|
|
101
|
+
(await testSqlViewState(hostedRequestBody, client, processedData.data.referencedTables)) ?? undefined;
|
|
98
102
|
}
|
|
99
103
|
return {
|
|
100
104
|
success: false,
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { FieldTypes, Filter } from '../models/Filter';
|
|
2
|
+
import { UniqueValuesByColumn } from '../models/Tables';
|
|
3
|
+
import { FilterTreeNode } from './astFilterProcessing';
|
|
2
4
|
export declare function findAndProcessDateFilter(filters: any[]): any;
|
|
3
5
|
export declare function processFilterFromBackend(filter: any): any;
|
|
4
6
|
export declare function updateFilter(filter: any, value?: any, comparison?: any): any;
|
|
@@ -7,4 +9,27 @@ export declare const getType: (t: string) => FieldTypes.String | FieldTypes.Numb
|
|
|
7
9
|
* Returns a sentence to describe a Filter
|
|
8
10
|
*/
|
|
9
11
|
export declare function filterSentence(filter: Filter): string;
|
|
12
|
+
/**
|
|
13
|
+
* Function that flattens a tree of filters into an array
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateFilterStack(filterTree: any): FilterTreeNode[];
|
|
16
|
+
/**
|
|
17
|
+
* Given an array of Filters (presumed to be in in-order state), generate
|
|
18
|
+
* the corresponding Filter tree. Essentially the reverse of what traverseTree does
|
|
19
|
+
*/
|
|
20
|
+
export declare function filterStackToFilterTree(stack: any[]): FilterTreeNode | null;
|
|
21
|
+
/**
|
|
22
|
+
* This function uses the baseAst and forms a SQL query using the a filters array
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildQueryFromFilters(baseAst: any, filters: FilterTreeNode[], endpoint: string, client: any): Promise<{
|
|
25
|
+
success: boolean;
|
|
26
|
+
query?: string;
|
|
27
|
+
error?: string;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Helper function that converts a UniqueValuesByColumn interface to a string map
|
|
31
|
+
*/
|
|
32
|
+
export declare function uniqueValuesToStringMap(uniqueValues: UniqueValuesByColumn): {
|
|
33
|
+
[key: string]: string[];
|
|
34
|
+
};
|
|
10
35
|
//# sourceMappingURL=filterProcessing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/filterProcessing.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,UAAU,EACV,MAAM,EAEP,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"filterProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/filterProcessing.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,UAAU,EACV,MAAM,EAEP,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAmB,MAAM,uBAAuB,CAAC;AAGxE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAoB5D;AAMD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,GAAG,OAkBnD;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,GAAG,EACX,KAAK,GAAE,GAAU,EACjB,UAAU,GAAE,GAAU,OAuGvB;AAGD,eAAO,MAAM,OAAO,MAAO,MAAM,iFAwDhC,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAwBrD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,GAAG,GAAG,cAAc,EAAE,CAoCrE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,GAAG,EAAE,yBAgCnD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE,cAAc,EAAE,EACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,GAAG,GACV,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B/D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,oBAAoB,GAAG;IAC3E,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACzB,CASA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { COMPARISON_RANGE, PRIMARY_RANGE, defaultOptionsV2, getRangeFromPresetOptions, } from '../DateRangePicker/dateRangePickerUtils';
|
|
2
2
|
import { DateOperator, FieldTypes, FilterNames, } from '../models/Filter';
|
|
3
|
+
import { filterTreeToAst } from './astFilterProcessing';
|
|
3
4
|
import { snakeAndCamelCaseToTitleCase } from './textProcessing';
|
|
4
5
|
export function findAndProcessDateFilter(filters) {
|
|
5
6
|
let dateFilter = filters.find((filter) => filter.filterType === 'date_range');
|
|
@@ -230,3 +231,118 @@ export function filterSentence(filter) {
|
|
|
230
231
|
}
|
|
231
232
|
return `${snakeAndCamelCaseToTitleCase(filter.field)} ${filter.operator}${filter.operator === 'is' || filter.operator === 'is not' ? ' one of' : ''} ${value}`;
|
|
232
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* Function that flattens a tree of filters into an array
|
|
236
|
+
*/
|
|
237
|
+
export function generateFilterStack(filterTree) {
|
|
238
|
+
if (!filterTree) {
|
|
239
|
+
return [];
|
|
240
|
+
}
|
|
241
|
+
const tree = filterTree;
|
|
242
|
+
let filterStack = [];
|
|
243
|
+
/**
|
|
244
|
+
* Function that takes in a FilterTree and flattens it into an array using in order traversal
|
|
245
|
+
*/
|
|
246
|
+
function traverseTree(node) {
|
|
247
|
+
if (!node) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (node.leaf) {
|
|
251
|
+
filterStack.push(node);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
traverseTree(node.leftNode);
|
|
255
|
+
filterStack.push(node);
|
|
256
|
+
traverseTree(node.rightNode);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
traverseTree(tree);
|
|
260
|
+
// Remove null (invalid) filters from filter stack
|
|
261
|
+
filterStack = filterStack.filter((filter) => {
|
|
262
|
+
return ((!filter.leaf &&
|
|
263
|
+
filter.rightNode &&
|
|
264
|
+
(!filter.rightNode.leaf || filter.rightNode.value)) ||
|
|
265
|
+
(filter.leaf && filter.value));
|
|
266
|
+
});
|
|
267
|
+
return filterStack;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Given an array of Filters (presumed to be in in-order state), generate
|
|
271
|
+
* the corresponding Filter tree. Essentially the reverse of what traverseTree does
|
|
272
|
+
*/
|
|
273
|
+
export function filterStackToFilterTree(stack) {
|
|
274
|
+
function buildTree(i) {
|
|
275
|
+
const newNode = {
|
|
276
|
+
leaf: false,
|
|
277
|
+
operator: null,
|
|
278
|
+
leftNode: null,
|
|
279
|
+
rightNode: null,
|
|
280
|
+
};
|
|
281
|
+
if (i >= stack.length) {
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
else if (stack[i].leaf) {
|
|
285
|
+
if (i < stack.length - 1) {
|
|
286
|
+
// more nodes later
|
|
287
|
+
newNode.operator = stack[i + 1].operator;
|
|
288
|
+
newNode.leftNode = {
|
|
289
|
+
leaf: true,
|
|
290
|
+
leftNode: null,
|
|
291
|
+
rightNode: null,
|
|
292
|
+
operator: null,
|
|
293
|
+
value: stack[i].value,
|
|
294
|
+
};
|
|
295
|
+
newNode.rightNode = buildTree(i + 2);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
newNode.leaf = true;
|
|
299
|
+
newNode.value = stack[i].value;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return newNode;
|
|
303
|
+
}
|
|
304
|
+
return buildTree(0);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* This function uses the baseAst and forms a SQL query using the a filters array
|
|
308
|
+
*/
|
|
309
|
+
export async function buildQueryFromFilters(baseAst, filters, endpoint, client) {
|
|
310
|
+
const subTree = filterStackToFilterTree(filters);
|
|
311
|
+
let whereNode = null;
|
|
312
|
+
if (subTree) {
|
|
313
|
+
whereNode = filterTreeToAst(subTree, client.databaseType.toLowerCase());
|
|
314
|
+
}
|
|
315
|
+
const queryAst = { ...baseAst, where: whereNode };
|
|
316
|
+
try {
|
|
317
|
+
const response = await fetch(`${endpoint}/sqlify`, {
|
|
318
|
+
method: 'POST',
|
|
319
|
+
headers: {
|
|
320
|
+
'Content-Type': 'application/json',
|
|
321
|
+
},
|
|
322
|
+
body: JSON.stringify({
|
|
323
|
+
ast: queryAst,
|
|
324
|
+
publicKey: client.publicKey,
|
|
325
|
+
useNewNodeSql: true,
|
|
326
|
+
}),
|
|
327
|
+
});
|
|
328
|
+
const data = await response.json();
|
|
329
|
+
const query = data.query;
|
|
330
|
+
return { success: true, query };
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
return { success: false, error: `error: ${error.message}` };
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Helper function that converts a UniqueValuesByColumn interface to a string map
|
|
338
|
+
*/
|
|
339
|
+
export function uniqueValuesToStringMap(uniqueValues) {
|
|
340
|
+
const fieldValues = {};
|
|
341
|
+
for (const field of Object.keys(uniqueValues)) {
|
|
342
|
+
fieldValues[field] = [];
|
|
343
|
+
for (const value of Object.keys(uniqueValues[field] ?? {})) {
|
|
344
|
+
fieldValues[field].push(value);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return fieldValues;
|
|
348
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,GAAG,EAChB,eAAe,CAAC,EAAE,GAAG;;;
|
|
1
|
+
{"version":3,"file":"pivotConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotConstructor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,GAAG,EAChB,eAAe,CAAC,EAAE,GAAG;;;eAuMtB"}
|
|
@@ -53,8 +53,11 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
|
|
|
53
53
|
};
|
|
54
54
|
const cloudBody = { ...hostedBody };
|
|
55
55
|
const resp = await getData(client, 'query', 'same-origin', hostedBody, cloudBody, 'POST', 'fetch-pivot');
|
|
56
|
+
if (resp.success === false) {
|
|
57
|
+
console.error('Error:', resp.errorMessage); // surface to devs
|
|
58
|
+
}
|
|
56
59
|
// With our current design we have to remove the second row field but leave the first for comparison purposes.
|
|
57
|
-
const rows = resp
|
|
60
|
+
const rows = resp?.queryResults?.[0]?.rows || [];
|
|
58
61
|
if (pivot.columnField &&
|
|
59
62
|
client.databaseType?.toLowerCase() === 'bigquery') {
|
|
60
63
|
rows.forEach((row) => {
|
|
@@ -67,8 +70,8 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
|
|
|
67
70
|
});
|
|
68
71
|
});
|
|
69
72
|
}
|
|
70
|
-
const columns = resp
|
|
71
|
-
|
|
73
|
+
const columns = resp?.queryResults?.[0]?.fields
|
|
74
|
+
?.map((field) => ({
|
|
72
75
|
field: processColumnName(field.name),
|
|
73
76
|
label: snakeCaseToTitleCase(processColumnName(field.name.replace('comparison_', 'comparison '))),
|
|
74
77
|
format: field.name === pivot.rowField
|
|
@@ -140,8 +143,9 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
|
|
|
140
143
|
});
|
|
141
144
|
}
|
|
142
145
|
// for the case of count agg on no value field
|
|
143
|
-
columns
|
|
144
|
-
if (
|
|
146
|
+
columns?.forEach((column) => {
|
|
147
|
+
if (column.label &&
|
|
148
|
+
['null', 'undefined'].includes(column.label.toLowerCase()) &&
|
|
145
149
|
!pivot.valueField &&
|
|
146
150
|
pivot.aggregationType === 'count') {
|
|
147
151
|
column.label = 'Count';
|
|
@@ -149,7 +153,7 @@ export async function generatePivotWithSQL(pivot, report, client, dateBucket, da
|
|
|
149
153
|
});
|
|
150
154
|
return {
|
|
151
155
|
rows: rows,
|
|
152
|
-
columns: columns,
|
|
156
|
+
columns: columns ?? [],
|
|
153
157
|
};
|
|
154
158
|
}
|
|
155
159
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Pivot } from '../models/Pivot';
|
|
2
2
|
export declare function processColumnReference(column: string, databaseType: string, fallbackOnNull?: string, isPivotFieldAlias?: boolean): string;
|
|
3
|
+
export declare function replaceSpacesWithUnderscores(column: string): string;
|
|
3
4
|
export declare function generateCountQuery(fields: string[], query: string, databaseType: string): string;
|
|
4
5
|
export declare function generateDistinctQuery(stringFields: string[], query: string, databaseType: string): string;
|
|
5
6
|
export declare function generateMinMaxRangeQueries(columnFields: string[], query: string, databaseType: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAmBxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,EAEvB,iBAAiB,CAAC,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAmBxC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,EAEvB,iBAAiB,CAAC,EAAE,OAAO,UAmC5B;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,UAE1D;AAwDD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAmBrB;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,UAUrB;AAsDD,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,CAyBpB"}
|
|
@@ -37,6 +37,10 @@ isPivotFieldAlias) {
|
|
|
37
37
|
if (column === '' && fallbackOnNull) {
|
|
38
38
|
return `${fallbackOnNull}`;
|
|
39
39
|
}
|
|
40
|
+
// Wrap in single quotes if contains whitespace or special characters and no single quotes
|
|
41
|
+
if (column.match(/[^a-zA-Z0-9_]/) && !column.includes("'")) {
|
|
42
|
+
return `'${column}'`;
|
|
43
|
+
}
|
|
40
44
|
return `${column}`;
|
|
41
45
|
}
|
|
42
46
|
const columnParts = column.split('.');
|
|
@@ -45,23 +49,35 @@ isPivotFieldAlias) {
|
|
|
45
49
|
}
|
|
46
50
|
return `\`${replaceBigQuerySpecialCharacters(column)}\``;
|
|
47
51
|
}
|
|
52
|
+
export function replaceSpacesWithUnderscores(column) {
|
|
53
|
+
return column.replaceAll(' ', '_');
|
|
54
|
+
}
|
|
48
55
|
function processInterval(interval, rowField, databaseType) {
|
|
49
56
|
if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
|
|
50
57
|
return `(${processColumnReference(rowField, databaseType)} + INTERVAL '${interval}')`;
|
|
51
58
|
}
|
|
59
|
+
else if (databaseType.toLowerCase() === 'mysql') {
|
|
60
|
+
return `(${processColumnReference(rowField, databaseType)} + INTERVAL ${interval})`;
|
|
61
|
+
}
|
|
52
62
|
return `TIMESTAMP_ADD(${processColumnReference(rowField, databaseType)}, INTERVAL ${interval} )`;
|
|
53
63
|
}
|
|
54
64
|
function processDateTrunc(dateBucket, rowField, databaseType, comparisonInterval) {
|
|
55
65
|
if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
|
|
56
|
-
const
|
|
66
|
+
const dateField = comparisonInterval
|
|
67
|
+
? processInterval(comparisonInterval, rowField, databaseType)
|
|
68
|
+
: processColumnReference(rowField, databaseType);
|
|
69
|
+
return `date_trunc('${dateBucket}', ${dateField})`;
|
|
70
|
+
}
|
|
71
|
+
if (['mysql'].includes(databaseType.toLowerCase())) {
|
|
72
|
+
const dateField = comparisonInterval
|
|
57
73
|
? processInterval(comparisonInterval, rowField, databaseType)
|
|
58
74
|
: processColumnReference(rowField, databaseType);
|
|
59
|
-
return `
|
|
75
|
+
return `extract(${dateBucket} from ${dateField})`;
|
|
60
76
|
}
|
|
61
|
-
const
|
|
77
|
+
const dateField = comparisonInterval
|
|
62
78
|
? processInterval(comparisonInterval, rowField, databaseType)
|
|
63
79
|
: processColumnReference(rowField, databaseType);
|
|
64
|
-
return `TIMESTAMP_TRUNC(${
|
|
80
|
+
return `TIMESTAMP_TRUNC(${dateField}, ${dateBucket})`;
|
|
65
81
|
}
|
|
66
82
|
function processValueField(aggType, databaseType, valueField) {
|
|
67
83
|
if (aggType === 'min' ||
|
|
@@ -75,9 +91,18 @@ function processValueField(aggType, databaseType, valueField) {
|
|
|
75
91
|
: `1 ELSE 0`;
|
|
76
92
|
}
|
|
77
93
|
export function generateCountQuery(fields, query, databaseType) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
94
|
+
let countQuery = [];
|
|
95
|
+
switch (databaseType.toLowerCase()) {
|
|
96
|
+
case 'mysql':
|
|
97
|
+
countQuery = fields.map((field) => {
|
|
98
|
+
return `SELECT '${field}' AS ${processColumnReference('field', databaseType)}, COUNT(DISTINCT ${processColumnReference(field, databaseType)}) AS ${processColumnReference('count', databaseType)} FROM querytable`;
|
|
99
|
+
});
|
|
100
|
+
break;
|
|
101
|
+
default:
|
|
102
|
+
countQuery = fields.map((field) => {
|
|
103
|
+
return `SELECT '${field}' AS ${processColumnReference('field', databaseType)}, COUNT(DISTINCT ${processColumnReference(field, databaseType)}) AS ${processColumnReference('count', databaseType)} FROM querytable`;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
81
106
|
return (`WITH querytable AS (${query.replace(';', '')}) ` +
|
|
82
107
|
countQuery.join(' UNION ALL '));
|
|
83
108
|
}
|
|
@@ -117,15 +142,15 @@ function generateDistinctQueryMySQL(stringFields, query) {
|
|
|
117
142
|
const distinctQueries = stringFields.map((field) => {
|
|
118
143
|
return `
|
|
119
144
|
SELECT '${field}' AS ${processColumnReference('field', 'mysql')},
|
|
120
|
-
JSON_ARRAYAGG(
|
|
121
|
-
FROM (SELECT DISTINCT
|
|
145
|
+
JSON_ARRAYAGG(\`${field}\`) AS ${processColumnReference('string_values', 'mysql')}
|
|
146
|
+
FROM (SELECT DISTINCT \`${field}\` FROM querytable) AS distinct_${replaceSpacesWithUnderscores(field)}`;
|
|
122
147
|
});
|
|
123
148
|
const distinctQuery = distinctQueries.join(' UNION ALL ');
|
|
124
149
|
return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
|
|
125
150
|
}
|
|
126
151
|
function generateDistinctQueryPostgres(stringFields, query) {
|
|
127
152
|
const distinctQueries = stringFields.map((field) => {
|
|
128
|
-
return `SELECT '${field}' AS ${processColumnReference('field', 'postgresql')}, ARRAY_AGG(DISTINCT ${field}) AS ${processColumnReference('string_values', 'postgresql')} FROM querytable`;
|
|
153
|
+
return `SELECT '${field}' AS ${processColumnReference('field', 'postgresql')}, to_json(ARRAY_AGG(DISTINCT ${field})) AS ${processColumnReference('string_values', 'postgresql')} FROM querytable`;
|
|
129
154
|
});
|
|
130
155
|
const distinctQuery = distinctQueries.join(' UNION ALL ');
|
|
131
156
|
return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
|
|
@@ -27,6 +27,11 @@ export declare function fetchReport(reportId: string, client: Client, useReportT
|
|
|
27
27
|
report: QuillReportInternal;
|
|
28
28
|
error?: string;
|
|
29
29
|
}>;
|
|
30
|
+
export declare function saveReport({ report, dashboardItemId, client, }: {
|
|
31
|
+
report: any;
|
|
32
|
+
dashboardItemId?: string;
|
|
33
|
+
client: Client;
|
|
34
|
+
}): Promise<any>;
|
|
30
35
|
export declare const formatRowsFromReport: (report: any) => any;
|
|
31
36
|
export declare function convertInternalReportToReport(report: QuillReportInternal): QuillReport;
|
|
32
37
|
export declare const fetchReportBuilderDataFromAST: (baseAst: any, formData: any, schema: Table[], client: Client, pivot?: Pivot, previousFormData?: any, currentTable?: string, previousRelevant?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/utils/report.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,KAAK,EACL,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAa1B,OAAO,EACL,oBAAoB,EAGrB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/utils/report.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,KAAK,EACL,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAa1B,OAAO,EACL,oBAAoB,EAGrB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,OAAO,EAAE,cAAc,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7D,aAAa,EAAE,GAAG,EAAE,CAAC;IACrB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,mBAAmB,CAAC;IAClC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,WAkB1B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,mBAGnC,CAAC;AA2BF,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,aAAa,UAAO,EACpB,OAAO,GAAE,GAAG,EAAO,EACnB,oBAAoB,CAAC,EAAE,oBAAoB,EAC3C,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,GAAG,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA4H1D;AAED,wBAAsB,UAAU,CAAC,EAC/B,MAAM,EACN,eAAe,EACf,MAAM,GACP,EAAE;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,GAAG,CAAC,CA4Cf;AAED,eAAO,MAAM,oBAAoB,WAAY,GAAG,QAkB/C,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,mBAAmB,GAC1B,WAAW,CAsDb;AAED,eAAO,MAAM,6BAA6B,YAC/B,GAAG,YACF,GAAG,UACL,KAAK,EAAE,UACP,MAAM,UACN,KAAK,qBACM,GAAG,iBACP,MAAM,qBACF;IACjB,aAAa,EAAE,mBAAmB,CAAC;IACnC,UAAU,EAAE,kBAAkB,CAAC;CAChC,WACQ,mBAAmB,iBACb,GAAG,KACjB,QAAQ,iBAAiB,CAyI3B,CAAC"}
|