@quillsql/react 2.12.45 → 2.12.47
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
|
@@ -5,7 +5,7 @@ const ast_1 = require("../components/ReportBuilder/ast");
|
|
|
5
5
|
const convert_1 = require("../components/ReportBuilder/convert");
|
|
6
6
|
const util_1 = require("../components/ReportBuilder/util");
|
|
7
7
|
const constants_1 = require("./constants");
|
|
8
|
-
const
|
|
8
|
+
const tableProcessing_1 = require("./tableProcessing");
|
|
9
9
|
function getSelectFromAST(ast) {
|
|
10
10
|
if (Array.isArray(ast)) {
|
|
11
11
|
return ast[0];
|
|
@@ -246,12 +246,15 @@ function getColumnsByTableFromASTAndSchema(ast, tables, tableAliasMap) {
|
|
|
246
246
|
const tableInfo = tables.find((tableInfo) => tableInfo.name === table);
|
|
247
247
|
if (!tableInfo)
|
|
248
248
|
continue;
|
|
249
|
-
const columnNames = tableInfo.columns.map((column) => column.
|
|
249
|
+
const columnNames = tableInfo.columns.map((column) => column.field);
|
|
250
250
|
if (columnNames.includes(column.value)) {
|
|
251
251
|
tableName = table;
|
|
252
252
|
break;
|
|
253
253
|
}
|
|
254
254
|
}
|
|
255
|
+
if (tableName === '') {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
255
258
|
if (!referencedColumns[tableName]) {
|
|
256
259
|
referencedColumns[tableName] = [];
|
|
257
260
|
}
|
|
@@ -400,8 +403,9 @@ const fetchAndProcessASTFromPrompt = async (aiPrompt, schema, client, prevPivot,
|
|
|
400
403
|
if (!tableInfo) {
|
|
401
404
|
throw new Error('Table info not found');
|
|
402
405
|
}
|
|
406
|
+
const uniqueValues = await (0, tableProcessing_1.getUniqueStringValues)(tableInfo.columns, processedName, client);
|
|
403
407
|
newAst = (0, convert_1.convertUnaryToBinary)(newAst);
|
|
404
|
-
newAst = (0, util_1.removeNonSelectedTableReferences)(newAst, processedName, tableInfo.columns.map((col) => col.field));
|
|
408
|
+
newAst = (0, util_1.removeNonSelectedTableReferences)(newAst, processedName, tableInfo.columns.map((col) => col.field), uniqueValues);
|
|
405
409
|
if (pivot) {
|
|
406
410
|
newAst = (0, util_1.deepCopy)({ ...newAst, orderby: null, limit: null });
|
|
407
411
|
}
|
|
@@ -455,14 +459,10 @@ const fetchASTFromQuillReport = async (report, client, schema) => {
|
|
|
455
459
|
convertedAst = (0, convert_1.convertWildcardColumns)(convertedAst, schema); // must go before groupby
|
|
456
460
|
convertedAst = (0, convert_1.convertBigQuery)(convertedAst);
|
|
457
461
|
schemaInfo = schema;
|
|
458
|
-
if (!schemaInfo) {
|
|
459
|
-
const { schemaData } = await (0, schema_1.getSchemaInfoWithCustomFields)(client, 'rb');
|
|
460
|
-
schemaInfo = schemaData;
|
|
461
|
-
}
|
|
462
462
|
processApostrophe(convertedAst, ['type', 'value']);
|
|
463
463
|
convertedAst = (0, convert_1.convertBigQuery)(convertedAst);
|
|
464
464
|
({ ast: newAst, pivot: groupByPivot } = (0, convert_1.convertGroupBy)(convertedAst, schemaInfo, report.pivot ? report.pivot : undefined));
|
|
465
|
-
newAst =
|
|
465
|
+
newAst = convertedAst;
|
|
466
466
|
}
|
|
467
467
|
catch (e) {
|
|
468
468
|
console.log(e);
|
|
@@ -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/cjs/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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getYAxisFields = exports.processColumnName = exports.convertFormatToJsType = exports.convertFieldTypeToJSType = exports.convertColumnInfoToColumnInternal = exports.convertPostgresColumn = void 0;
|
|
4
4
|
const filterProcessing_1 = require("./filterProcessing");
|
|
5
|
+
const textProcessing_1 = require("./textProcessing");
|
|
5
6
|
function removeBigQuerySpecialChars(columnName) {
|
|
6
7
|
return columnName.replaceAll('quill_forward_slash', '/');
|
|
7
8
|
}
|
|
@@ -29,8 +30,12 @@ function convertPostgresColumn(field) {
|
|
|
29
30
|
case 1114: // timestamp
|
|
30
31
|
format = 'MMM_dd_yyyy';
|
|
31
32
|
break;
|
|
33
|
+
case 114: // json
|
|
34
|
+
case 199: // json[]
|
|
32
35
|
case 1186: // interval
|
|
33
36
|
case 1043: // varchar
|
|
37
|
+
case 3802: // jsonb
|
|
38
|
+
case 3807: // jsonb[]
|
|
34
39
|
default:
|
|
35
40
|
format = 'string';
|
|
36
41
|
}
|
|
@@ -47,6 +52,12 @@ function convertPostgresColumn(field) {
|
|
|
47
52
|
case 23: // int4
|
|
48
53
|
fieldType = 'int4';
|
|
49
54
|
break;
|
|
55
|
+
case 114: // json
|
|
56
|
+
fieldType = 'json';
|
|
57
|
+
break;
|
|
58
|
+
case 199: // json[]
|
|
59
|
+
fieldType = 'json[]';
|
|
60
|
+
break;
|
|
50
61
|
case 700: // float4
|
|
51
62
|
fieldType = 'float4';
|
|
52
63
|
break;
|
|
@@ -71,6 +82,18 @@ function convertPostgresColumn(field) {
|
|
|
71
82
|
case 1114: // timestamp
|
|
72
83
|
fieldType = 'timestamp';
|
|
73
84
|
break;
|
|
85
|
+
case 2950: // uuid
|
|
86
|
+
fieldType = 'uuid';
|
|
87
|
+
break;
|
|
88
|
+
case 2951: // uuid[]
|
|
89
|
+
fieldType = 'uuid[]';
|
|
90
|
+
break;
|
|
91
|
+
case 3802: // jsonb
|
|
92
|
+
fieldType = 'jsonb';
|
|
93
|
+
break;
|
|
94
|
+
case 3807: // jsonb[]
|
|
95
|
+
fieldType = 'jsonb[]';
|
|
96
|
+
break;
|
|
74
97
|
case 1043: // varchar
|
|
75
98
|
default:
|
|
76
99
|
fieldType = 'varchar';
|
|
@@ -87,6 +110,14 @@ function convertPostgresColumn(field) {
|
|
|
87
110
|
case 1700: // numeric
|
|
88
111
|
jsType = 'number';
|
|
89
112
|
break;
|
|
113
|
+
case 114: // json
|
|
114
|
+
case 3802: // jsonb
|
|
115
|
+
jsType = 'object';
|
|
116
|
+
break;
|
|
117
|
+
case 199:
|
|
118
|
+
case 3807:
|
|
119
|
+
jsType = 'object[]';
|
|
120
|
+
break;
|
|
90
121
|
case 1082: // date
|
|
91
122
|
case 1083: // time
|
|
92
123
|
case 1184: // timestamptz
|
|
@@ -95,11 +126,19 @@ function convertPostgresColumn(field) {
|
|
|
95
126
|
jsType = 'date';
|
|
96
127
|
break;
|
|
97
128
|
case 1043: // varchar
|
|
129
|
+
case 2950: // uuid
|
|
130
|
+
jsType = 'string';
|
|
131
|
+
break;
|
|
132
|
+
case 2951: // uuid[]
|
|
133
|
+
jsType = 'string[]';
|
|
134
|
+
break;
|
|
98
135
|
default:
|
|
99
136
|
jsType = 'string';
|
|
100
137
|
}
|
|
101
138
|
return {
|
|
102
|
-
label: 'field' in field
|
|
139
|
+
label: 'field' in field
|
|
140
|
+
? (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field.field)
|
|
141
|
+
: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field.name),
|
|
103
142
|
field: 'field' in field ? field.field : field.name,
|
|
104
143
|
format,
|
|
105
144
|
fieldType,
|
|
@@ -152,6 +191,10 @@ function fieldTypeToDataTypeID(fieldType) {
|
|
|
152
191
|
return 21;
|
|
153
192
|
case 'int4':
|
|
154
193
|
return 23;
|
|
194
|
+
case 'json':
|
|
195
|
+
return 114;
|
|
196
|
+
case 'json[]':
|
|
197
|
+
return 199;
|
|
155
198
|
case 'float4':
|
|
156
199
|
return 700;
|
|
157
200
|
case 'float8':
|
|
@@ -168,33 +211,73 @@ function fieldTypeToDataTypeID(fieldType) {
|
|
|
168
211
|
return 1114;
|
|
169
212
|
case 'interval':
|
|
170
213
|
return 1186;
|
|
214
|
+
case 'uuid':
|
|
215
|
+
return 2950;
|
|
216
|
+
case 'uuid[]':
|
|
217
|
+
return 2951;
|
|
218
|
+
case 'jsonb':
|
|
219
|
+
return 3802;
|
|
220
|
+
case 'jsonb[]':
|
|
221
|
+
return 3807;
|
|
171
222
|
case 'varchar':
|
|
172
223
|
default:
|
|
173
224
|
return 1043;
|
|
174
225
|
}
|
|
175
226
|
}
|
|
176
227
|
function convertFieldTypeToJSType(fieldType) {
|
|
228
|
+
let jsType = '';
|
|
177
229
|
switch (fieldType) {
|
|
178
230
|
case 'bool':
|
|
179
|
-
|
|
231
|
+
jsType = 'bool';
|
|
232
|
+
break;
|
|
180
233
|
case 'int8':
|
|
181
234
|
case 'int2':
|
|
182
235
|
case 'int4':
|
|
183
236
|
case 'float4':
|
|
184
237
|
case 'float8':
|
|
185
238
|
case 'numeric':
|
|
186
|
-
|
|
239
|
+
jsType = 'number';
|
|
240
|
+
break;
|
|
187
241
|
case 'date':
|
|
188
242
|
case 'time':
|
|
189
243
|
case 'timestamptz':
|
|
190
244
|
case 'timestamp':
|
|
191
|
-
|
|
245
|
+
jsType = 'date';
|
|
246
|
+
break;
|
|
247
|
+
case 'json':
|
|
248
|
+
case 'jsonb':
|
|
249
|
+
case 'json[]':
|
|
250
|
+
case 'jsonb[]':
|
|
251
|
+
case 'int2[]':
|
|
252
|
+
case 'int4[]':
|
|
253
|
+
case 'int8[]':
|
|
254
|
+
case 'float4[]':
|
|
255
|
+
case 'float8[]':
|
|
256
|
+
case 'text[]':
|
|
257
|
+
case 'char[]':
|
|
258
|
+
case 'bool[]':
|
|
259
|
+
case 'uuid[]':
|
|
260
|
+
case 'varchar[]':
|
|
261
|
+
case 'interval[]':
|
|
262
|
+
case 'numeric[]':
|
|
263
|
+
case 'bytea[]':
|
|
264
|
+
case 'cidr[]':
|
|
265
|
+
case 'inet[]':
|
|
266
|
+
case 'macaddr[]':
|
|
267
|
+
case 'date[]':
|
|
268
|
+
case 'timestamp[]':
|
|
269
|
+
case 'timestamptz[]':
|
|
270
|
+
case 'timetz[]':
|
|
271
|
+
jsType = 'object';
|
|
272
|
+
break;
|
|
192
273
|
case 'interval':
|
|
193
274
|
case 'varchar':
|
|
194
275
|
case 'text':
|
|
276
|
+
case 'uuid':
|
|
195
277
|
default:
|
|
196
|
-
|
|
278
|
+
jsType = 'string';
|
|
197
279
|
}
|
|
280
|
+
return jsType;
|
|
198
281
|
}
|
|
199
282
|
exports.convertFieldTypeToJSType = convertFieldTypeToJSType;
|
|
200
283
|
function convertFormatToJsType(column) {
|
|
@@ -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"}
|
|
@@ -57,7 +57,7 @@ async function testSqlViewState(hostedRequestBody, client, referencedTables) {
|
|
|
57
57
|
},
|
|
58
58
|
};
|
|
59
59
|
getData(client, 'test-view', 'same-origin', brokenBody, cloudBody);
|
|
60
|
-
errorMessage = `
|
|
60
|
+
errorMessage = `Virtual Table Error: '${table}' is out of sync with datasource.`;
|
|
61
61
|
}
|
|
62
62
|
}));
|
|
63
63
|
return errorMessage;
|
|
@@ -86,18 +86,22 @@ async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cl
|
|
|
86
86
|
['query', 'patterns', 'item'].includes(hostedRequestBody.metadata.task)) {
|
|
87
87
|
const brokenReport = { ...responseJson };
|
|
88
88
|
let errorPrefix = 'Error: ';
|
|
89
|
-
let errorMessage = 'Failed to fetch
|
|
89
|
+
let errorMessage = 'Failed to fetch report: ' + responseJson.error;
|
|
90
90
|
if (hostedRequestBody.metadata.task === 'query' ||
|
|
91
91
|
hostedRequestBody.metadata.task === 'patterns') {
|
|
92
92
|
errorPrefix = 'SQL Error: ';
|
|
93
93
|
errorMessage = errorPrefix + responseJson.error;
|
|
94
94
|
}
|
|
95
|
+
else if (responseJson.error?.includes('Virtual Table Error')) {
|
|
96
|
+
errorMessage = responseJson.error;
|
|
97
|
+
}
|
|
95
98
|
let adminErrorMessage = undefined;
|
|
96
99
|
const processedData = fetchQuillData(brokenReport);
|
|
97
100
|
if (processedData &&
|
|
98
101
|
processedData.data &&
|
|
99
102
|
processedData.data.referencedTables) {
|
|
100
|
-
adminErrorMessage =
|
|
103
|
+
adminErrorMessage =
|
|
104
|
+
(await testSqlViewState(hostedRequestBody, client, processedData.data.referencedTables)) ?? undefined;
|
|
101
105
|
}
|
|
102
106
|
return {
|
|
103
107
|
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,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.filterSentence = exports.getType = exports.updateFilter = exports.processFilterFromBackend = exports.findAndProcessDateFilter = void 0;
|
|
3
|
+
exports.uniqueValuesToStringMap = exports.buildQueryFromFilters = exports.filterStackToFilterTree = exports.generateFilterStack = exports.filterSentence = exports.getType = exports.updateFilter = exports.processFilterFromBackend = exports.findAndProcessDateFilter = void 0;
|
|
4
4
|
const dateRangePickerUtils_1 = require("../DateRangePicker/dateRangePickerUtils");
|
|
5
5
|
const Filter_1 = require("../models/Filter");
|
|
6
|
+
const astFilterProcessing_1 = require("./astFilterProcessing");
|
|
6
7
|
const textProcessing_1 = require("./textProcessing");
|
|
7
8
|
function findAndProcessDateFilter(filters) {
|
|
8
9
|
let dateFilter = filters.find((filter) => filter.filterType === 'date_range');
|
|
@@ -238,3 +239,122 @@ function filterSentence(filter) {
|
|
|
238
239
|
return `${(0, textProcessing_1.snakeAndCamelCaseToTitleCase)(filter.field)} ${filter.operator}${filter.operator === 'is' || filter.operator === 'is not' ? ' one of' : ''} ${value}`;
|
|
239
240
|
}
|
|
240
241
|
exports.filterSentence = filterSentence;
|
|
242
|
+
/**
|
|
243
|
+
* Function that flattens a tree of filters into an array
|
|
244
|
+
*/
|
|
245
|
+
function generateFilterStack(filterTree) {
|
|
246
|
+
if (!filterTree) {
|
|
247
|
+
return [];
|
|
248
|
+
}
|
|
249
|
+
const tree = filterTree;
|
|
250
|
+
let filterStack = [];
|
|
251
|
+
/**
|
|
252
|
+
* Function that takes in a FilterTree and flattens it into an array using in order traversal
|
|
253
|
+
*/
|
|
254
|
+
function traverseTree(node) {
|
|
255
|
+
if (!node) {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (node.leaf) {
|
|
259
|
+
filterStack.push(node);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
traverseTree(node.leftNode);
|
|
263
|
+
filterStack.push(node);
|
|
264
|
+
traverseTree(node.rightNode);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
traverseTree(tree);
|
|
268
|
+
// Remove null (invalid) filters from filter stack
|
|
269
|
+
filterStack = filterStack.filter((filter) => {
|
|
270
|
+
return ((!filter.leaf &&
|
|
271
|
+
filter.rightNode &&
|
|
272
|
+
(!filter.rightNode.leaf || filter.rightNode.value)) ||
|
|
273
|
+
(filter.leaf && filter.value));
|
|
274
|
+
});
|
|
275
|
+
return filterStack;
|
|
276
|
+
}
|
|
277
|
+
exports.generateFilterStack = generateFilterStack;
|
|
278
|
+
/**
|
|
279
|
+
* Given an array of Filters (presumed to be in in-order state), generate
|
|
280
|
+
* the corresponding Filter tree. Essentially the reverse of what traverseTree does
|
|
281
|
+
*/
|
|
282
|
+
function filterStackToFilterTree(stack) {
|
|
283
|
+
function buildTree(i) {
|
|
284
|
+
const newNode = {
|
|
285
|
+
leaf: false,
|
|
286
|
+
operator: null,
|
|
287
|
+
leftNode: null,
|
|
288
|
+
rightNode: null,
|
|
289
|
+
};
|
|
290
|
+
if (i >= stack.length) {
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
else if (stack[i].leaf) {
|
|
294
|
+
if (i < stack.length - 1) {
|
|
295
|
+
// more nodes later
|
|
296
|
+
newNode.operator = stack[i + 1].operator;
|
|
297
|
+
newNode.leftNode = {
|
|
298
|
+
leaf: true,
|
|
299
|
+
leftNode: null,
|
|
300
|
+
rightNode: null,
|
|
301
|
+
operator: null,
|
|
302
|
+
value: stack[i].value,
|
|
303
|
+
};
|
|
304
|
+
newNode.rightNode = buildTree(i + 2);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
newNode.leaf = true;
|
|
308
|
+
newNode.value = stack[i].value;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return newNode;
|
|
312
|
+
}
|
|
313
|
+
return buildTree(0);
|
|
314
|
+
}
|
|
315
|
+
exports.filterStackToFilterTree = filterStackToFilterTree;
|
|
316
|
+
/**
|
|
317
|
+
* This function uses the baseAst and forms a SQL query using the a filters array
|
|
318
|
+
*/
|
|
319
|
+
async function buildQueryFromFilters(baseAst, filters, endpoint, client) {
|
|
320
|
+
const subTree = filterStackToFilterTree(filters);
|
|
321
|
+
let whereNode = null;
|
|
322
|
+
if (subTree) {
|
|
323
|
+
whereNode = (0, astFilterProcessing_1.filterTreeToAst)(subTree, client.databaseType.toLowerCase());
|
|
324
|
+
}
|
|
325
|
+
const queryAst = { ...baseAst, where: whereNode };
|
|
326
|
+
try {
|
|
327
|
+
const response = await fetch(`${endpoint}/sqlify`, {
|
|
328
|
+
method: 'POST',
|
|
329
|
+
headers: {
|
|
330
|
+
'Content-Type': 'application/json',
|
|
331
|
+
},
|
|
332
|
+
body: JSON.stringify({
|
|
333
|
+
ast: queryAst,
|
|
334
|
+
publicKey: client.publicKey,
|
|
335
|
+
useNewNodeSql: true,
|
|
336
|
+
}),
|
|
337
|
+
});
|
|
338
|
+
const data = await response.json();
|
|
339
|
+
const query = data.query;
|
|
340
|
+
return { success: true, query };
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
return { success: false, error: `error: ${error.message}` };
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
exports.buildQueryFromFilters = buildQueryFromFilters;
|
|
347
|
+
/**
|
|
348
|
+
* Helper function that converts a UniqueValuesByColumn interface to a string map
|
|
349
|
+
*/
|
|
350
|
+
function uniqueValuesToStringMap(uniqueValues) {
|
|
351
|
+
const fieldValues = {};
|
|
352
|
+
for (const field of Object.keys(uniqueValues)) {
|
|
353
|
+
fieldValues[field] = [];
|
|
354
|
+
for (const value of Object.keys(uniqueValues[field] ?? {})) {
|
|
355
|
+
fieldValues[field].push(value);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return fieldValues;
|
|
359
|
+
}
|
|
360
|
+
exports.uniqueValuesToStringMap = uniqueValuesToStringMap;
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.shouldSortInMemory = exports.shouldFetchMore = exports.DEFAULT_PAGINATION = void 0;
|
|
4
4
|
exports.DEFAULT_PAGINATION = {
|
|
5
5
|
page: 0,
|
|
6
|
-
rowsPerPage:
|
|
7
|
-
rowsPerRequest:
|
|
6
|
+
rowsPerPage: 10,
|
|
7
|
+
rowsPerRequest: 1000,
|
|
8
8
|
};
|
|
9
9
|
function shouldFetchMore(pagination, page, maxPage) {
|
|
10
10
|
if (!pagination) {
|
|
@@ -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"}
|
|
@@ -56,8 +56,11 @@ async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilte
|
|
|
56
56
|
};
|
|
57
57
|
const cloudBody = { ...hostedBody };
|
|
58
58
|
const resp = await (0, dataFetcher_1.getData)(client, 'query', 'same-origin', hostedBody, cloudBody, 'POST', 'fetch-pivot');
|
|
59
|
+
if (resp.success === false) {
|
|
60
|
+
console.error('Error:', resp.errorMessage); // surface to devs
|
|
61
|
+
}
|
|
59
62
|
// With our current design we have to remove the second row field but leave the first for comparison purposes.
|
|
60
|
-
const rows = resp
|
|
63
|
+
const rows = resp?.queryResults?.[0]?.rows || [];
|
|
61
64
|
if (pivot.columnField &&
|
|
62
65
|
client.databaseType?.toLowerCase() === 'bigquery') {
|
|
63
66
|
rows.forEach((row) => {
|
|
@@ -70,8 +73,8 @@ async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilte
|
|
|
70
73
|
});
|
|
71
74
|
});
|
|
72
75
|
}
|
|
73
|
-
const columns = resp
|
|
74
|
-
|
|
76
|
+
const columns = resp?.queryResults?.[0]?.fields
|
|
77
|
+
?.map((field) => ({
|
|
75
78
|
field: (0, columnProcessing_1.processColumnName)(field.name),
|
|
76
79
|
label: (0, textProcessing_1.snakeCaseToTitleCase)((0, columnProcessing_1.processColumnName)(field.name.replace('comparison_', 'comparison '))),
|
|
77
80
|
format: field.name === pivot.rowField
|
|
@@ -143,8 +146,9 @@ async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilte
|
|
|
143
146
|
});
|
|
144
147
|
}
|
|
145
148
|
// for the case of count agg on no value field
|
|
146
|
-
columns
|
|
147
|
-
if (
|
|
149
|
+
columns?.forEach((column) => {
|
|
150
|
+
if (column.label &&
|
|
151
|
+
['null', 'undefined'].includes(column.label.toLowerCase()) &&
|
|
148
152
|
!pivot.valueField &&
|
|
149
153
|
pivot.aggregationType === 'count') {
|
|
150
154
|
column.label = 'Count';
|
|
@@ -152,7 +156,7 @@ async function generatePivotWithSQL(pivot, report, client, dateBucket, dateFilte
|
|
|
152
156
|
});
|
|
153
157
|
return {
|
|
154
158
|
rows: rows,
|
|
155
|
-
columns: columns,
|
|
159
|
+
columns: columns ?? [],
|
|
156
160
|
};
|
|
157
161
|
}
|
|
158
162
|
}
|
|
@@ -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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generatePivotQuery = exports.generateMinMaxRangeQueries = exports.generateDistinctQuery = exports.generateCountQuery = exports.processColumnReference = void 0;
|
|
3
|
+
exports.generatePivotQuery = exports.generateMinMaxRangeQueries = exports.generateDistinctQuery = exports.generateCountQuery = exports.replaceSpacesWithUnderscores = exports.processColumnReference = void 0;
|
|
4
4
|
const pivotProcessing_1 = require("./pivotProcessing");
|
|
5
5
|
function processSingleQuotes(value, databaseType) {
|
|
6
6
|
if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
|
|
@@ -40,6 +40,10 @@ isPivotFieldAlias) {
|
|
|
40
40
|
if (column === '' && fallbackOnNull) {
|
|
41
41
|
return `${fallbackOnNull}`;
|
|
42
42
|
}
|
|
43
|
+
// Wrap in single quotes if contains whitespace or special characters and no single quotes
|
|
44
|
+
if (column.match(/[^a-zA-Z0-9_]/) && !column.includes("'")) {
|
|
45
|
+
return `'${column}'`;
|
|
46
|
+
}
|
|
43
47
|
return `${column}`;
|
|
44
48
|
}
|
|
45
49
|
const columnParts = column.split('.');
|
|
@@ -49,23 +53,36 @@ isPivotFieldAlias) {
|
|
|
49
53
|
return `\`${replaceBigQuerySpecialCharacters(column)}\``;
|
|
50
54
|
}
|
|
51
55
|
exports.processColumnReference = processColumnReference;
|
|
56
|
+
function replaceSpacesWithUnderscores(column) {
|
|
57
|
+
return column.replaceAll(' ', '_');
|
|
58
|
+
}
|
|
59
|
+
exports.replaceSpacesWithUnderscores = replaceSpacesWithUnderscores;
|
|
52
60
|
function processInterval(interval, rowField, databaseType) {
|
|
53
61
|
if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
|
|
54
62
|
return `(${processColumnReference(rowField, databaseType)} + INTERVAL '${interval}')`;
|
|
55
63
|
}
|
|
64
|
+
else if (databaseType.toLowerCase() === 'mysql') {
|
|
65
|
+
return `(${processColumnReference(rowField, databaseType)} + INTERVAL ${interval})`;
|
|
66
|
+
}
|
|
56
67
|
return `TIMESTAMP_ADD(${processColumnReference(rowField, databaseType)}, INTERVAL ${interval} )`;
|
|
57
68
|
}
|
|
58
69
|
function processDateTrunc(dateBucket, rowField, databaseType, comparisonInterval) {
|
|
59
70
|
if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
|
|
60
|
-
const
|
|
71
|
+
const dateField = comparisonInterval
|
|
72
|
+
? processInterval(comparisonInterval, rowField, databaseType)
|
|
73
|
+
: processColumnReference(rowField, databaseType);
|
|
74
|
+
return `date_trunc('${dateBucket}', ${dateField})`;
|
|
75
|
+
}
|
|
76
|
+
if (['mysql'].includes(databaseType.toLowerCase())) {
|
|
77
|
+
const dateField = comparisonInterval
|
|
61
78
|
? processInterval(comparisonInterval, rowField, databaseType)
|
|
62
79
|
: processColumnReference(rowField, databaseType);
|
|
63
|
-
return `
|
|
80
|
+
return `extract(${dateBucket} from ${dateField})`;
|
|
64
81
|
}
|
|
65
|
-
const
|
|
82
|
+
const dateField = comparisonInterval
|
|
66
83
|
? processInterval(comparisonInterval, rowField, databaseType)
|
|
67
84
|
: processColumnReference(rowField, databaseType);
|
|
68
|
-
return `TIMESTAMP_TRUNC(${
|
|
85
|
+
return `TIMESTAMP_TRUNC(${dateField}, ${dateBucket})`;
|
|
69
86
|
}
|
|
70
87
|
function processValueField(aggType, databaseType, valueField) {
|
|
71
88
|
if (aggType === 'min' ||
|
|
@@ -79,9 +96,18 @@ function processValueField(aggType, databaseType, valueField) {
|
|
|
79
96
|
: `1 ELSE 0`;
|
|
80
97
|
}
|
|
81
98
|
function generateCountQuery(fields, query, databaseType) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
99
|
+
let countQuery = [];
|
|
100
|
+
switch (databaseType.toLowerCase()) {
|
|
101
|
+
case 'mysql':
|
|
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
|
+
break;
|
|
106
|
+
default:
|
|
107
|
+
countQuery = fields.map((field) => {
|
|
108
|
+
return `SELECT '${field}' AS ${processColumnReference('field', databaseType)}, COUNT(DISTINCT ${processColumnReference(field, databaseType)}) AS ${processColumnReference('count', databaseType)} FROM querytable`;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
85
111
|
return (`WITH querytable AS (${query.replace(';', '')}) ` +
|
|
86
112
|
countQuery.join(' UNION ALL '));
|
|
87
113
|
}
|
|
@@ -123,15 +149,15 @@ function generateDistinctQueryMySQL(stringFields, query) {
|
|
|
123
149
|
const distinctQueries = stringFields.map((field) => {
|
|
124
150
|
return `
|
|
125
151
|
SELECT '${field}' AS ${processColumnReference('field', 'mysql')},
|
|
126
|
-
JSON_ARRAYAGG(
|
|
127
|
-
FROM (SELECT DISTINCT
|
|
152
|
+
JSON_ARRAYAGG(\`${field}\`) AS ${processColumnReference('string_values', 'mysql')}
|
|
153
|
+
FROM (SELECT DISTINCT \`${field}\` FROM querytable) AS distinct_${replaceSpacesWithUnderscores(field)}`;
|
|
128
154
|
});
|
|
129
155
|
const distinctQuery = distinctQueries.join(' UNION ALL ');
|
|
130
156
|
return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
|
|
131
157
|
}
|
|
132
158
|
function generateDistinctQueryPostgres(stringFields, query) {
|
|
133
159
|
const distinctQueries = stringFields.map((field) => {
|
|
134
|
-
return `SELECT '${field}' AS ${processColumnReference('field', 'postgresql')}, ARRAY_AGG(DISTINCT ${field}) AS ${processColumnReference('string_values', 'postgresql')} FROM querytable`;
|
|
160
|
+
return `SELECT '${field}' AS ${processColumnReference('field', 'postgresql')}, to_json(ARRAY_AGG(DISTINCT ${field})) AS ${processColumnReference('string_values', 'postgresql')} FROM querytable`;
|
|
135
161
|
});
|
|
136
162
|
const distinctQuery = distinctQueries.join(' UNION ALL ');
|
|
137
163
|
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?: {
|