From 67805111cbd37359fcdc7eee9b7970222369ca97 Mon Sep 17 00:00:00 2001 From: ulleo Date: Tue, 28 Nov 2023 14:34:23 +0800 Subject: [PATCH 01/39] =?UTF-8?q?feat:=20AntV=E6=95=A3=E7=82=B9=E5=9B=BE?= =?UTF-8?q?=E7=B1=BB=E5=88=AB=E6=94=AF=E6=8C=81=E9=87=8D=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/dragItem/ChartDragItem.vue | 21 ++++++++++++++++++- .../src/views/chart/view/ChartEdit.vue | 3 +++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/core/frontend/src/views/chart/components/dragItem/ChartDragItem.vue b/core/frontend/src/views/chart/components/dragItem/ChartDragItem.vue index 340012a466..24a877469b 100644 --- a/core/frontend/src/views/chart/components/dragItem/ChartDragItem.vue +++ b/core/frontend/src/views/chart/components/dragItem/ChartDragItem.vue @@ -201,6 +201,16 @@ + + + {{ $t('chart.show_name_set') }} + + + \ No newline at end of file From d7141dfa9ac1c2a5a29aaf2d830a9c59a81a10b5 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Wed, 29 Nov 2023 11:25:49 +0800 Subject: [PATCH 13/39] =?UTF-8?q?perf:=20=E8=BF=87=E6=BB=A4=E5=99=A8?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=A6=96=E9=A1=B9=E4=BD=9C=E7=94=A8=E4=BA=8E?= =?UTF-8?q?tab=E5=86=85=E8=A7=86=E5=9B=BE=E9=A2=84=E8=A7=88=E6=97=A0?= =?UTF-8?q?=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/canvas/components/editor/Preview.vue | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/frontend/src/components/canvas/components/editor/Preview.vue b/core/frontend/src/components/canvas/components/editor/Preview.vue index 357c632813..17892d786e 100644 --- a/core/frontend/src/components/canvas/components/editor/Preview.vue +++ b/core/frontend/src/components/canvas/components/editor/Preview.vue @@ -445,6 +445,7 @@ export default { this.canvasId === 'canvas-main' && bus.$on('pcChartDetailsDialog', this.openChartDetailsDialog) bus.$on('trigger-search-button', this.triggerSearchButton) bus.$on('trigger-reset-button', this.triggerResetButton) + bus.$on('trigger-filter-loaded', this.triggerFilterLoaded) this.initPdfTemplate() }, beforeDestroy() { @@ -460,10 +461,15 @@ export default { this.canvasId === 'canvas-main' && bus.$off('pcChartDetailsDialog', this.openChartDetailsDialog) bus.$off('trigger-search-button', this.triggerSearchButton) bus.$off('trigger-reset-button', this.triggerResetButton) + bus.$off('trigger-filter-loaded', this.triggerFilterLoaded) }, methods: { - filterLoaded(p) { + triggerFilterLoaded({ canvasIdStr, p }) { + canvasIdStr.includes(this.canvasId) || this.filterLoaded(p, canvasIdStr) + }, + filterLoaded(p, canvasIdStr = '') { buildAfterFilterLoaded(this.filterMap, p) + bus.$emit('trigger-filter-loaded', { canvasIdStr: canvasIdStr + this.canvasId, p }) }, getWrapperChildRefs() { return this.$refs['viewWrapperChild'] From 0fa959e8d5c0379d1b0074a759e29e2f3a1d5d50 Mon Sep 17 00:00:00 2001 From: dataeaseShu Date: Wed, 29 Nov 2023 11:33:44 +0800 Subject: [PATCH 14/39] =?UTF-8?q?test:=20=E5=BE=AE=E4=BF=A1=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/mobile/public/index.html | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/mobile/public/index.html b/core/mobile/public/index.html index d917f38345..c71119229a 100644 --- a/core/mobile/public/index.html +++ b/core/mobile/public/index.html @@ -24,9 +24,5 @@
- - \ No newline at end of file From f337c73c11a47df25903ffabed4e77070a21f0fc Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 29 Nov 2023 12:13:47 +0800 Subject: [PATCH 15/39] =?UTF-8?q?fix:=20=E8=A7=A3=E6=9E=90sql=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/service/dataset/DataSetTableService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index d5561c0148..057f561df7 100644 --- a/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -1123,7 +1123,9 @@ public class DataSetTableService { Select subSelectTmp = (Select) CCJSqlParserUtil.parse(removeVariables(selectBody.toString(), dsType)); subSelect.setSelectBody(subSelectTmp.getSelectBody()); if (dsType.equals(DatasourceTypes.oracle.getType())) { - subSelect.setAlias(new Alias(fromItem.getAlias().toString(), false)); + if(fromItem.getAlias() != null){ + subSelect.setAlias(new Alias(fromItem.getAlias().toString(), false)); + } } else { if (fromItem.getAlias() == null) { throw new Exception("Failed to parse sql, Every derived table must have its own alias!"); From 02d678a9b6120cd694430c5757cf31e0ab071c7f Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 29 Nov 2023 12:22:58 +0800 Subject: [PATCH 16/39] =?UTF-8?q?fix:=20=E6=A0=A1=E9=AA=8C=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E8=B6=85=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/frontend/src/lang/en.js | 2 +- core/frontend/src/lang/tw.js | 2 +- core/frontend/src/lang/zh.js | 2 +- .../src/views/system/datasource/DsConfiguration.vue | 7 ++++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/core/frontend/src/lang/en.js b/core/frontend/src/lang/en.js index 19d7844838..187004dd64 100644 --- a/core/frontend/src/lang/en.js +++ b/core/frontend/src/lang/en.js @@ -1944,7 +1944,7 @@ export default { please_input_max_pool_size: 'Please enter the maximum number of connections', please_input_max_idle_time: 'Please enter the maximum idle (seconds)', please_input_acquire_increment: 'Please enter the growth number', - please_input_query_timeout: 'Please enter query timeout', + please_input_query_timeout: 'Please enter query timeout,no less then zero', please_input_connect_timeout: 'Please enter the connection timeout (seconds)', no_less_then_0: 'Parameters in advanced settings cannot be less than zero', port_no_less_then_0: 'Port cannot be less than zero', diff --git a/core/frontend/src/lang/tw.js b/core/frontend/src/lang/tw.js index af5aa0f52d..cf3a0c0a50 100644 --- a/core/frontend/src/lang/tw.js +++ b/core/frontend/src/lang/tw.js @@ -1936,7 +1936,7 @@ export default { please_input_max_pool_size: '請輸入最大連接數', please_input_max_idle_time: '請輸入最大空閑(秒)', please_input_acquire_increment: '請輸入增長數', - please_input_query_timeout: '請輸入查詢超時', + please_input_query_timeout: '請輸入查詢超時,不小于零', please_input_connect_timeout: '請輸輸入連接超時(秒)', no_less_then_0: '高級設置中的參數不能小於零', port_no_less_then_0: '端口不能小於零', diff --git a/core/frontend/src/lang/zh.js b/core/frontend/src/lang/zh.js index dc0ca4b1fd..9a7081548b 100644 --- a/core/frontend/src/lang/zh.js +++ b/core/frontend/src/lang/zh.js @@ -1936,7 +1936,7 @@ export default { please_input_max_pool_size: '请输入最大连接数', please_input_max_idle_time: '请输入最大空闲(秒)', please_input_acquire_increment: '请输入增长数', - please_input_query_timeout: '请输入查询超时', + please_input_query_timeout: '请输入查询超时,不小于零', please_input_connect_timeout: '请输入连接超时(秒)', no_less_then_0: '高级设置中的参数不能小于零', port_no_less_then_0: '端口不能小于零', diff --git a/core/frontend/src/views/system/datasource/DsConfiguration.vue b/core/frontend/src/views/system/datasource/DsConfiguration.vue index 0b59837c3d..1223b9430f 100644 --- a/core/frontend/src/views/system/datasource/DsConfiguration.vue +++ b/core/frontend/src/views/system/datasource/DsConfiguration.vue @@ -999,8 +999,7 @@ export default { { required: true, validator: this.isNumber, - message: i18n.t('datasource.please_input_query_timeout'), - trigger: 'blur' + trigger: ['blur', 'change'] } ], dataPath: [ @@ -1161,6 +1160,7 @@ export default { }, isNumber(rule, value, callback) { console.log(value) + console.log(!value) if (!value) { callback(new Error(i18n.t('datasource.please_input_query_timeout'))) return @@ -1168,8 +1168,9 @@ export default { let isNumber = false var reg = /^\d+$/; isNumber = reg.test(value); + console.log(!isNumber) if (!isNumber) { - callback(new Error(i18n.t('chart.value_error'))) + callback(new Error(i18n.t('datasource.please_input_query_timeout'))) return } callback() From 2062cfd4e6fd3a9623b5c1d4e50ef5e7e4ef32f2 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 29 Nov 2023 12:59:43 +0800 Subject: [PATCH 17/39] =?UTF-8?q?fix:=20SQL=E5=8F=98=E9=87=8F=E8=AF=AF?= =?UTF-8?q?=E6=8A=A5=E9=94=99=20#6624?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/dataset/DataSetTableService.java | 72 +++++++++++++------ 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 057f561df7..8b9adb8d47 100644 --- a/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -1115,7 +1115,22 @@ public class DataSetTableService { } } - private String handlePlainSelect(PlainSelect plainSelect, Select statementSelect, String dsType) throws Exception { + private void handleSelectItems(PlainSelect plainSelect, String dsType) throws Exception{ + List selectItems = new ArrayList<>(); + for (SelectItem selectItem : plainSelect.getSelectItems()) { + SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem; + if (selectExpressionItem.getExpression() instanceof SubSelect) { + SubSelect subSelect = (SubSelect) selectExpressionItem.getExpression(); + Select select = (Select) CCJSqlParserUtil.parse (removeVariables(subSelect.getSelectBody().toString(), dsType)); + subSelect.setSelectBody(select.getSelectBody()); + ((SelectExpressionItem) selectItem).setExpression(subSelect); + } + selectItems.add(selectItem); + } + plainSelect.setSelectItems(selectItems); + } + + private void handleFromItems(PlainSelect plainSelect, String dsType) throws Exception{ FromItem fromItem = plainSelect.getFromItem(); if (fromItem instanceof SubSelect) { SelectBody selectBody = ((SubSelect) fromItem).getSelectBody(); @@ -1134,6 +1149,8 @@ public class DataSetTableService { } plainSelect.setFromItem(subSelect); } + } + private void handleJoins(PlainSelect plainSelect, String dsType) throws Exception{ List joins = plainSelect.getJoins(); if (joins != null) { List joinsList = new ArrayList<>(); @@ -1159,27 +1176,29 @@ public class DataSetTableService { } plainSelect.setJoins(joinsList); } - Expression expr = plainSelect.getWhere(); - if (expr == null) { - return handleWith(plainSelect, statementSelect, dsType); - } - StringBuilder stringBuilder = new StringBuilder(); - BinaryExpression binaryExpression = null; - try { - binaryExpression = (BinaryExpression) expr; - } catch (Exception e) { - } - if (binaryExpression != null) { - if (!(binaryExpression.getLeftExpression() instanceof BinaryExpression) && !(binaryExpression.getLeftExpression() instanceof InExpression) && hasVariable(binaryExpression.getRightExpression().toString())) { - stringBuilder.append(SubstitutedSql); - } else { - expr.accept(getExpressionDeParser(stringBuilder)); - } - } else { - expr.accept(getExpressionDeParser(stringBuilder)); - } - plainSelect.setWhere(CCJSqlParserUtil.parseCondExpression(stringBuilder.toString())); - return handleWith(plainSelect, statementSelect, dsType); + } + private String handleWhere(PlainSelect plainSelect, Select statementSelect, String dsType) throws Exception{ + Expression expr = plainSelect.getWhere(); + if (expr == null) { + return handleWith(plainSelect, statementSelect, dsType); + } + StringBuilder stringBuilder = new StringBuilder(); + BinaryExpression binaryExpression = null; + try { + binaryExpression = (BinaryExpression) expr; + } catch (Exception e) { + } + if (binaryExpression != null) { + if (!(binaryExpression.getLeftExpression() instanceof BinaryExpression) && !(binaryExpression.getLeftExpression() instanceof InExpression) && hasVariable(binaryExpression.getRightExpression().toString())) { + stringBuilder.append(SubstitutedSql); + } else { + expr.accept(getExpressionDeParser(stringBuilder)); + } + } else { + expr.accept(getExpressionDeParser(stringBuilder)); + } + plainSelect.setWhere(CCJSqlParserUtil.parseCondExpression(stringBuilder.toString())); + return handleWith(plainSelect, statementSelect, dsType); } private String handleWith(PlainSelect plainSelect, Select select, String dsType) throws Exception { @@ -1200,6 +1219,15 @@ public class DataSetTableService { return builder.toString(); } + private String handlePlainSelect(PlainSelect plainSelect, Select statementSelect, String dsType) throws Exception { + handleSelectItems(plainSelect, dsType); + handleFromItems(plainSelect, dsType); + handleJoins(plainSelect, dsType); + return handleWhere(plainSelect, statementSelect, dsType); + } + + + public Map getDBPreview(DataSetTableRequest dataSetTableRequest) throws Exception { Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); if (ds == null) { From ed3117af5b05385bca79f86d81d833feab745bb6 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Wed, 29 Nov 2023 14:12:36 +0800 Subject: [PATCH 18/39] =?UTF-8?q?perf:=20=E4=B8=8B=E6=8B=89=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=99=A8=E9=A6=96=E9=80=89=E9=A1=B9=E4=BD=9C=E7=94=A8?= =?UTF-8?q?=E4=BA=8Etab=E4=B8=AD=E8=A7=86=E5=9B=BE(=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E7=8A=B6=E6=80=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/frontend/src/utils/conditionUtil.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/frontend/src/utils/conditionUtil.js b/core/frontend/src/utils/conditionUtil.js index 791a9e9d4a..0c960538b9 100644 --- a/core/frontend/src/utils/conditionUtil.js +++ b/core/frontend/src/utils/conditionUtil.js @@ -90,7 +90,13 @@ export const buildCanvasIdMap = panelItems => { const cacheCondition = (cb, obj) => { obj.cb = cb } -export const buildViewKeyFilters = (panelItems, result) => { + +const crossCanvasFilter = (filterEle, viewId) => { + const filterCanvas = filterEle.canvasId + const canvasIdMap = buildCanvasIdMap(store.state.componentData) + return canvasIdMap[viewId] !== filterCanvas +} +export const buildViewKeyFilters = (panelItems, result, isEdit = false) => { if (!(panelItems && panelItems.length > 0)) { return result } @@ -112,7 +118,7 @@ export const buildViewKeyFilters = (panelItems, result) => { // 进行过滤时 如果过滤组件在主画布 则条件适用于所有画布视图 否则需要过滤组件和视图在相同画布 if (element.canvasId === 'canvas-main' || element.canvasId === canvasIdMap[viewId]) { const vidMatch = viewIdMatch(condition.viewIds, viewId) - if (vidMatch && selectFirst) { + if (vidMatch && selectFirst && !(crossCanvasFilter(element, viewId) && isEdit)) { const obj = {} const promise = new Promise(resolve => { cacheCondition(cbParam => { @@ -139,10 +145,9 @@ export const buildViewKeyFilters = (panelItems, result) => { }) return result } -export const buildFilterMap = panelItems => { +export const buildFilterMap = (panelItems, isEdit = false) => { let result = buildViewKeyMap(panelItems) - - result = buildViewKeyFilters(panelItems, result) + result = buildViewKeyFilters(panelItems, result, isEdit) return result } From b8af080b4d565607761be76b5aeadae2b4e06876 Mon Sep 17 00:00:00 2001 From: ulleo Date: Wed, 29 Nov 2023 14:47:18 +0800 Subject: [PATCH 19/39] =?UTF-8?q?fix:=20=E5=9C=A8=E6=8C=87=E6=A0=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=B8=BA=E2=80=9C=E5=8D=A0=E6=AF=94=E2=80=9D?= =?UTF-8?q?=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B=EF=BC=8C=E9=92=BB=E5=8F=96?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E8=A7=A6=E5=8F=91=20/=20by=20zero=20?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/dataease/service/chart/ChartViewService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index e62b4833ef..414025dfac 100644 --- a/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -1379,6 +1379,9 @@ public class ChartViewService { if (StringUtils.isEmpty(cValue)) { continue; } + if (sum.equals(new BigDecimal(0))) { + continue; + } item[dataIndex] = new BigDecimal(cValue) .divide(sum, 8, RoundingMode.HALF_UP) .toString(); From f78ab3f29d0d48d2324d1016506167c8fb36a7a3 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Wed, 29 Nov 2023 16:23:56 +0800 Subject: [PATCH 20/39] =?UTF-8?q?perf:=20=E4=B8=8B=E6=8B=89=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=99=A8=E4=B8=8E=E9=80=89=E9=A1=B9=E5=8D=A1=E4=BA=A4?= =?UTF-8?q?=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/frontend/src/components/canvas/utils/utils.js | 1 + core/frontend/src/components/widget/deWidget/DeSelect.vue | 2 ++ core/frontend/src/utils/conditionUtil.js | 7 +------ 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/core/frontend/src/components/canvas/utils/utils.js b/core/frontend/src/components/canvas/utils/utils.js index 630adfcbb8..19ed237940 100644 --- a/core/frontend/src/components/canvas/utils/utils.js +++ b/core/frontend/src/components/canvas/utils/utils.js @@ -136,6 +136,7 @@ export function panelDataPrepare(componentData, componentStyle, callback) { } if (item.type === 'custom') { item.options.manualModify = false + item.options.loaded = false } if (item.filters && item.filters.length > 0) { item.filters = [] diff --git a/core/frontend/src/components/widget/deWidget/DeSelect.vue b/core/frontend/src/components/widget/deWidget/DeSelect.vue index 599e192c0e..d8097e4361 100644 --- a/core/frontend/src/components/widget/deWidget/DeSelect.vue +++ b/core/frontend/src/components/widget/deWidget/DeSelect.vue @@ -382,6 +382,8 @@ export default { componentId: this.element.id, val: (this.value && Array.isArray(this.value)) ? this.value.join(',') : this.value }) + this.element.options.loaded = true + this.$store.commit('setComponentWithId', this.element) } }, refreshLoad() { diff --git a/core/frontend/src/utils/conditionUtil.js b/core/frontend/src/utils/conditionUtil.js index 0c960538b9..ac93c68890 100644 --- a/core/frontend/src/utils/conditionUtil.js +++ b/core/frontend/src/utils/conditionUtil.js @@ -91,11 +91,6 @@ const cacheCondition = (cb, obj) => { obj.cb = cb } -const crossCanvasFilter = (filterEle, viewId) => { - const filterCanvas = filterEle.canvasId - const canvasIdMap = buildCanvasIdMap(store.state.componentData) - return canvasIdMap[viewId] !== filterCanvas -} export const buildViewKeyFilters = (panelItems, result, isEdit = false) => { if (!(panelItems && panelItems.length > 0)) { return result @@ -118,7 +113,7 @@ export const buildViewKeyFilters = (panelItems, result, isEdit = false) => { // 进行过滤时 如果过滤组件在主画布 则条件适用于所有画布视图 否则需要过滤组件和视图在相同画布 if (element.canvasId === 'canvas-main' || element.canvasId === canvasIdMap[viewId]) { const vidMatch = viewIdMatch(condition.viewIds, viewId) - if (vidMatch && selectFirst && !(crossCanvasFilter(element, viewId) && isEdit)) { + if (vidMatch && selectFirst && !element.options.loaded) { const obj = {} const promise = new Promise(resolve => { cacheCondition(cbParam => { From c22e25ec00ec77b08ad999d4e697c2c4a093ebd8 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 29 Nov 2023 19:26:12 +0800 Subject: [PATCH 21/39] =?UTF-8?q?fix:=20SQL=E5=8F=98=E9=87=8F=E8=AF=AF?= =?UTF-8?q?=E6=8A=A5=E9=94=99=20#6624?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/DriverMgmController.java | 1 - .../provider/query/es/EsQueryProvider.java | 4 +- .../service/dataset/DataSetTableService.java | 76 ++++++++++--------- .../system/datasource/DsConfiguration.vue | 3 - .../views/system/datasource/DsFormContent.vue | 2 +- 5 files changed, 44 insertions(+), 42 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/controller/datasource/DriverMgmController.java b/core/backend/src/main/java/io/dataease/controller/datasource/DriverMgmController.java index 32edc4ae23..aadd2df8f1 100644 --- a/core/backend/src/main/java/io/dataease/controller/datasource/DriverMgmController.java +++ b/core/backend/src/main/java/io/dataease/controller/datasource/DriverMgmController.java @@ -34,7 +34,6 @@ public class DriverMgmController { @ApiOperation("驱动列表") @PostMapping("/list") public List listDeDriver() throws Exception{ - checkPermission(); return driverService.list(); } diff --git a/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java index db09106e94..0072a0d374 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java @@ -333,8 +333,10 @@ public class EsQueryProvider extends QueryProvider { } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == DeTypeConstants.DE_TIME) { originField = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); } else { - if (y.getDeType() == 2 || y.getDeType() == 3) { + if (y.getDeType() == 2) { originField = String.format(EsSqlLConstants.CAST, String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()), "bigint"); + } else if (y.getDeType() == 3) { + originField = String.format(EsSqlLConstants.CAST, String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()), "float"); } else { originField = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); } diff --git a/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 8b9adb8d47..51cef6c3b9 100644 --- a/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -1115,22 +1115,25 @@ public class DataSetTableService { } } - private void handleSelectItems(PlainSelect plainSelect, String dsType) throws Exception{ + private void handleSelectItems(PlainSelect plainSelect, String dsType) throws Exception { List selectItems = new ArrayList<>(); for (SelectItem selectItem : plainSelect.getSelectItems()) { - SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem; - if (selectExpressionItem.getExpression() instanceof SubSelect) { - SubSelect subSelect = (SubSelect) selectExpressionItem.getExpression(); - Select select = (Select) CCJSqlParserUtil.parse (removeVariables(subSelect.getSelectBody().toString(), dsType)); - subSelect.setSelectBody(select.getSelectBody()); - ((SelectExpressionItem) selectItem).setExpression(subSelect); + try { + SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem; + if (selectExpressionItem.getExpression() instanceof SubSelect) { + SubSelect subSelect = (SubSelect) selectExpressionItem.getExpression(); + Select select = (Select) CCJSqlParserUtil.parse(removeVariables(subSelect.getSelectBody().toString(), dsType)); + subSelect.setSelectBody(select.getSelectBody()); + ((SelectExpressionItem) selectItem).setExpression(subSelect); + } + } catch (Exception e) { } selectItems.add(selectItem); } plainSelect.setSelectItems(selectItems); } - private void handleFromItems(PlainSelect plainSelect, String dsType) throws Exception{ + private void handleFromItems(PlainSelect plainSelect, String dsType) throws Exception { FromItem fromItem = plainSelect.getFromItem(); if (fromItem instanceof SubSelect) { SelectBody selectBody = ((SubSelect) fromItem).getSelectBody(); @@ -1138,7 +1141,7 @@ public class DataSetTableService { Select subSelectTmp = (Select) CCJSqlParserUtil.parse(removeVariables(selectBody.toString(), dsType)); subSelect.setSelectBody(subSelectTmp.getSelectBody()); if (dsType.equals(DatasourceTypes.oracle.getType())) { - if(fromItem.getAlias() != null){ + if (fromItem.getAlias() != null) { subSelect.setAlias(new Alias(fromItem.getAlias().toString(), false)); } } else { @@ -1150,7 +1153,8 @@ public class DataSetTableService { plainSelect.setFromItem(subSelect); } } - private void handleJoins(PlainSelect plainSelect, String dsType) throws Exception{ + + private void handleJoins(PlainSelect plainSelect, String dsType) throws Exception { List joins = plainSelect.getJoins(); if (joins != null) { List joinsList = new ArrayList<>(); @@ -1177,28 +1181,29 @@ public class DataSetTableService { plainSelect.setJoins(joinsList); } } - private String handleWhere(PlainSelect plainSelect, Select statementSelect, String dsType) throws Exception{ - Expression expr = plainSelect.getWhere(); - if (expr == null) { - return handleWith(plainSelect, statementSelect, dsType); - } - StringBuilder stringBuilder = new StringBuilder(); - BinaryExpression binaryExpression = null; - try { - binaryExpression = (BinaryExpression) expr; - } catch (Exception e) { - } - if (binaryExpression != null) { - if (!(binaryExpression.getLeftExpression() instanceof BinaryExpression) && !(binaryExpression.getLeftExpression() instanceof InExpression) && hasVariable(binaryExpression.getRightExpression().toString())) { - stringBuilder.append(SubstitutedSql); - } else { - expr.accept(getExpressionDeParser(stringBuilder)); - } - } else { - expr.accept(getExpressionDeParser(stringBuilder)); - } - plainSelect.setWhere(CCJSqlParserUtil.parseCondExpression(stringBuilder.toString())); - return handleWith(plainSelect, statementSelect, dsType); + + private String handleWhere(PlainSelect plainSelect, Select statementSelect, String dsType) throws Exception { + Expression expr = plainSelect.getWhere(); + if (expr == null) { + return handleWith(plainSelect, statementSelect, dsType); + } + StringBuilder stringBuilder = new StringBuilder(); + BinaryExpression binaryExpression = null; + try { + binaryExpression = (BinaryExpression) expr; + } catch (Exception e) { + } + if (binaryExpression != null) { + if (!(binaryExpression.getLeftExpression() instanceof BinaryExpression) && !(binaryExpression.getLeftExpression() instanceof InExpression) && hasVariable(binaryExpression.getRightExpression().toString())) { + stringBuilder.append(SubstitutedSql); + } else { + expr.accept(getExpressionDeParser(stringBuilder)); + } + } else { + expr.accept(getExpressionDeParser(stringBuilder)); + } + plainSelect.setWhere(CCJSqlParserUtil.parseCondExpression(stringBuilder.toString())); + return handleWith(plainSelect, statementSelect, dsType); } private String handleWith(PlainSelect plainSelect, Select select, String dsType) throws Exception { @@ -1227,7 +1232,6 @@ public class DataSetTableService { } - public Map getDBPreview(DataSetTableRequest dataSetTableRequest) throws Exception { Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); if (ds == null) { @@ -2783,13 +2787,13 @@ public class DataSetTableService { if (StringUtils.isEmpty(s)) { throw new RuntimeException(Translator.get("i18n_excel_empty_column")); } - if(hashSet.contains(s)){ + if (hashSet.contains(s)) { repeat.add(s); - }else { + } else { hashSet.add(s); } } - if(CollectionUtils.isNotEmpty(repeat)){ + if (CollectionUtils.isNotEmpty(repeat)) { DataEaseException.throwException(Translator.get("i18n_excel_field_repeat") + "" + String.valueOf(repeat)); } } diff --git a/core/frontend/src/views/system/datasource/DsConfiguration.vue b/core/frontend/src/views/system/datasource/DsConfiguration.vue index 1223b9430f..74c922f4d6 100644 --- a/core/frontend/src/views/system/datasource/DsConfiguration.vue +++ b/core/frontend/src/views/system/datasource/DsConfiguration.vue @@ -1159,8 +1159,6 @@ export default { callback() }, isNumber(rule, value, callback) { - console.log(value) - console.log(!value) if (!value) { callback(new Error(i18n.t('datasource.please_input_query_timeout'))) return @@ -1168,7 +1166,6 @@ export default { let isNumber = false var reg = /^\d+$/; isNumber = reg.test(value); - console.log(!isNumber) if (!isNumber) { callback(new Error(i18n.t('datasource.please_input_query_timeout'))) return diff --git a/core/frontend/src/views/system/datasource/DsFormContent.vue b/core/frontend/src/views/system/datasource/DsFormContent.vue index a99defa973..9753494be1 100644 --- a/core/frontend/src/views/system/datasource/DsFormContent.vue +++ b/core/frontend/src/views/system/datasource/DsFormContent.vue @@ -946,7 +946,7 @@ export default { this.tData.forEach((item) => { if (item.id === this.form.type) { item.children.forEach((child) => { - if (this.formType === 'modify' && child.id === this.form.id) { + if (child.id === this.form.id) { return } const configuration = JSON.parse(child.configuration) From 3e8e910c25640026d94498a9f86e3d823dbe3270 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 30 Nov 2023 12:37:59 +0800 Subject: [PATCH 22/39] =?UTF-8?q?fix:=20API=20=E4=B8=A2=E5=A4=B1null?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/provider/datasource/ApiProvider.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java b/core/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java index 0b4adc7626..4f850deeea 100644 --- a/core/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java @@ -6,6 +6,8 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.serializer.SerializerFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import com.google.gson.JsonObject; @@ -239,7 +241,12 @@ public class ApiProvider extends Provider { String rootPath; if (response.startsWith("[")) { rootPath = "$[*]"; - JSONArray jsonArray = JSONObject.parseArray(response); + JsonNode jsonArray = null; + try { + jsonArray = new ObjectMapper().readTree(response); + } catch (Exception e) { + e.printStackTrace(); + } for (Object o : jsonArray) { handleStr(apiDefinition, o.toString(), fields, rootPath); } From c8a4059dd43e58078a5cfa00acd66e009f45e762 Mon Sep 17 00:00:00 2001 From: junjun Date: Thu, 30 Nov 2023 16:19:59 +0800 Subject: [PATCH 23/39] =?UTF-8?q?fix:=20=E5=85=B3=E8=81=94=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E4=BF=9D=E5=AD=98=20#6894?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/service/dataset/DataSetTableService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 51cef6c3b9..6d46d0b169 100644 --- a/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -1659,7 +1659,7 @@ public class DataSetTableService { } List fields = dataSetTableFieldsService.getListByIdsEach(unionDTO.getCurrentDsField()); - String[] array = fields.stream() + String[] array = fields.stream().filter(Objects::nonNull) .map(f -> table + "." + f.getDataeaseName() + " AS " + TableUtils.fieldName(tableId + "_" + f.getDataeaseName())) .toArray(String[]::new); From a18015dbbd42a4d5b932a8ea25ed853c63757a7f Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 30 Nov 2023 16:24:47 +0800 Subject: [PATCH 24/39] =?UTF-8?q?fix:=20API=20=E4=B8=A2=E5=A4=B1null?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/controller/datasource/DriverMgmController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/backend/src/main/java/io/dataease/controller/datasource/DriverMgmController.java b/core/backend/src/main/java/io/dataease/controller/datasource/DriverMgmController.java index aadd2df8f1..3c4b1d88bd 100644 --- a/core/backend/src/main/java/io/dataease/controller/datasource/DriverMgmController.java +++ b/core/backend/src/main/java/io/dataease/controller/datasource/DriverMgmController.java @@ -56,7 +56,6 @@ public class DriverMgmController { @ApiOperation("驱动列表") @GetMapping("/list/{type}") public List listDeDriver(@PathVariable String type) throws Exception{ - checkPermission(); return listDeDriver().stream().filter(driverDTO -> driverDTO.getType().equalsIgnoreCase(type)).collect(Collectors.toList()); } From cba0c4130cf01b7ca60201284b157146de3ade4d Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 30 Nov 2023 16:35:54 +0800 Subject: [PATCH 25/39] =?UTF-8?q?fix:=20API=20=E8=B6=85=E6=97=B6=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/frontend/src/lang/en.js | 2 +- core/frontend/src/lang/tw.js | 2 +- core/frontend/src/lang/zh.js | 2 +- core/frontend/src/views/system/datasource/DsConfiguration.vue | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/core/frontend/src/lang/en.js b/core/frontend/src/lang/en.js index 187004dd64..28943c1bd5 100644 --- a/core/frontend/src/lang/en.js +++ b/core/frontend/src/lang/en.js @@ -1944,7 +1944,7 @@ export default { please_input_max_pool_size: 'Please enter the maximum number of connections', please_input_max_idle_time: 'Please enter the maximum idle (seconds)', please_input_acquire_increment: 'Please enter the growth number', - please_input_query_timeout: 'Please enter query timeout,no less then zero', + please_input_query_timeout: 'Please enter query timeout,Valid range [1 - 300]', please_input_connect_timeout: 'Please enter the connection timeout (seconds)', no_less_then_0: 'Parameters in advanced settings cannot be less than zero', port_no_less_then_0: 'Port cannot be less than zero', diff --git a/core/frontend/src/lang/tw.js b/core/frontend/src/lang/tw.js index cf3a0c0a50..c9df7fe82d 100644 --- a/core/frontend/src/lang/tw.js +++ b/core/frontend/src/lang/tw.js @@ -1936,7 +1936,7 @@ export default { please_input_max_pool_size: '請輸入最大連接數', please_input_max_idle_time: '請輸入最大空閑(秒)', please_input_acquire_increment: '請輸入增長數', - please_input_query_timeout: '請輸入查詢超時,不小于零', + please_input_query_timeout: '請輸入查詢超時,請填寫1-300正整數', please_input_connect_timeout: '請輸輸入連接超時(秒)', no_less_then_0: '高級設置中的參數不能小於零', port_no_less_then_0: '端口不能小於零', diff --git a/core/frontend/src/lang/zh.js b/core/frontend/src/lang/zh.js index 9a7081548b..45cf7ff125 100644 --- a/core/frontend/src/lang/zh.js +++ b/core/frontend/src/lang/zh.js @@ -1936,7 +1936,7 @@ export default { please_input_max_pool_size: '请输入最大连接数', please_input_max_idle_time: '请输入最大空闲(秒)', please_input_acquire_increment: '请输入增长数', - please_input_query_timeout: '请输入查询超时,不小于零', + please_input_query_timeout: '请输入查询超时,填写1-300正整数', please_input_connect_timeout: '请输入连接超时(秒)', no_less_then_0: '高级设置中的参数不能小于零', port_no_less_then_0: '端口不能小于零', diff --git a/core/frontend/src/views/system/datasource/DsConfiguration.vue b/core/frontend/src/views/system/datasource/DsConfiguration.vue index 74c922f4d6..78e27d1705 100644 --- a/core/frontend/src/views/system/datasource/DsConfiguration.vue +++ b/core/frontend/src/views/system/datasource/DsConfiguration.vue @@ -1170,6 +1170,10 @@ export default { callback(new Error(i18n.t('datasource.please_input_query_timeout'))) return } + if(value <= 0 || value > 300){ + callback(new Error(i18n.t('datasource.please_input_query_timeout'))) + return + } callback() }, next() { From c591a8377e3a1fd6d38eb0d00c32c6c294cf082a Mon Sep 17 00:00:00 2001 From: junjun Date: Thu, 30 Nov 2023 16:56:53 +0800 Subject: [PATCH 26/39] =?UTF-8?q?fix:=20=E5=85=B3=E8=81=94=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=8A=A5=E9=94=99=20#6894?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/dataset/DataSetTableService.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 6d46d0b169..8539ce7738 100644 --- a/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/core/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -1659,9 +1659,18 @@ public class DataSetTableService { } List fields = dataSetTableFieldsService.getListByIdsEach(unionDTO.getCurrentDsField()); - String[] array = fields.stream().filter(Objects::nonNull) - .map(f -> table + "." + f.getDataeaseName() + " AS " - + TableUtils.fieldName(tableId + "_" + f.getDataeaseName())) + String[] array = fields.stream() + .map(f -> { + String s = ""; + if (f == null) { + DEException.throwException( + Translator.get("i18n_ds_error")); + } else { + s = table + "." + f.getDataeaseName() + " AS " + + TableUtils.fieldName(tableId + "_" + f.getDataeaseName()); + } + return s; + }) .toArray(String[]::new); checkedInfo.put(table, array); checkedFields.addAll(fields); From 905be5a84afbf1a2bfbf667a2aa78294c7966c15 Mon Sep 17 00:00:00 2001 From: dataeaseShu Date: Thu, 30 Nov 2023 17:43:21 +0800 Subject: [PATCH 27/39] =?UTF-8?q?fix:=20=E4=BD=BF=E7=94=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E6=95=B0=E6=8D=AE=E9=9B=86=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E5=AD=97=E6=AE=B5=EF=BC=8C=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E7=82=B9=E5=87=BB=E5=BC=95=E7=94=A8=E5=AD=97=E6=AE=B5=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E6=A1=86=E4=B8=AD=E6=9C=89=E4=BF=A1=E6=81=AF=EF=BC=8C?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=97=B6=E4=BC=9A=E6=8F=90=E7=A4=BA=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=AF=AD=E6=B3=95=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E3=80=82=20#6919?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/frontend/src/views/dataset/data/CalcFieldEdit.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/frontend/src/views/dataset/data/CalcFieldEdit.vue b/core/frontend/src/views/dataset/data/CalcFieldEdit.vue index 2923b65cf1..c741f4a719 100644 --- a/core/frontend/src/views/dataset/data/CalcFieldEdit.vue +++ b/core/frontend/src/views/dataset/data/CalcFieldEdit.vue @@ -535,7 +535,7 @@ export default { }, setNameIdTrans(from, to, originName, name2Auto) { let name2Id = originName - const nameIdMap = [...this.dimensionData, ...this.quotaData].reduce( + const nameIdMap = [...this.tableFields.dimensionList, ...this.tableFields.quotaList].reduce( (pre, next) => { pre[next[from]] = next[to] return pre From 74130c497deb500ec5bfd5cba4ad638b5e322414 Mon Sep 17 00:00:00 2001 From: maninhill <41712985+maninhill@users.noreply.github.com> Date: Fri, 1 Dec 2023 17:34:28 +0800 Subject: [PATCH 28/39] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e854a1256..5e3704ea22 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ |说明| |------------------| -|此分支为 DataEase v1.18 版本的开发分支。[DataEase v2.0.0](https://github.com/dataease/dataease/releases/tag/v2.0.0) 也已经正式发布,v2 版本的开发分支为 [dev-v2](https://github.com/dataease/dataease/tree/dev-v2)。v2 版本正在快速迭代中,如是在生产环境部署 DataEase,建议继续使用 v1.18.* 的最新稳定版本。| +|此分支为 DataEase v1.18 版本的开发分支。|
From 435f05ffe8e4985ee2be9f1554c6c2f7d7181ada Mon Sep 17 00:00:00 2001 From: maninhill <41712985+maninhill@users.noreply.github.com> Date: Fri, 1 Dec 2023 17:35:19 +0800 Subject: [PATCH 29/39] Update README.md --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 5e3704ea22..d5a0aa813c 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,6 @@ FOSSA Status

-|说明| -|------------------| -|此分支为 DataEase v1.18 版本的开发分支。| -
## 什么是 DataEase? From 9764929eade90038473ab8a3c0df374a3ccddeb2 Mon Sep 17 00:00:00 2001 From: ulleo Date: Mon, 4 Dec 2023 17:59:26 +0800 Subject: [PATCH 30/39] =?UTF-8?q?feat:=20AntV=E7=BB=84=E5=90=88=E5=9B=BE?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E6=8C=87=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #6853 --- .../src/views/antv/chartmix/data.vue | 198 +++++++------ .../src/views/antv/chartmix/index.vue | 260 ++++++++++-------- 2 files changed, 259 insertions(+), 199 deletions(-) diff --git a/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/data.vue b/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/data.vue index d4ec306f10..116b222248 100644 --- a/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/data.vue +++ b/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/data.vue @@ -6,30 +6,30 @@ {{ $t('plugin_view_chartmix.source') }}/{{ $t('chart.dimension') }} @@ -43,28 +43,28 @@ {{ $t('plugin_view_chartmix.mark_size') }}/{{ $t('chart.quota') }} @@ -78,28 +78,28 @@ {{ $t('plugin_view_chartmix.mark_size') }}/{{ $t('chart.quota') }} @@ -114,27 +114,27 @@ {{ $t('chart.result_filter') }} @@ -230,7 +230,7 @@ export default { this.$emit('on-add-languages', messages) }, watch: { - listenLists: function(val) { + /*listenLists: function(val) { if (this.listenLists[0] <= 1 && this.listenLists[1] <= 1) { return } @@ -243,7 +243,7 @@ export default { this.view.yaxisExt = [this.view.yaxisExt[0]] } this.calcData(true) - } + }*/ }, methods: { executeAxios(url, type, data, callBack) { @@ -284,20 +284,41 @@ export default { this.multiAdd(e, this.view.yaxis) this.dragMoveDuplicate(this.view.yaxis, e) this.dragCheckType(this.view.yaxis, 'q') - if (this.view.yaxis.length <= 1) { - this.calcData(true) + + if (this.view.yaxis.length > 1) { + for (let i = 0; i < this.view.yaxis.length; i++) { + if (i === e.newDraggableIndex) { + continue + } + this.view.yaxis[e.newDraggableIndex].chartType = this.view.yaxis[i].chartType; + break + } } + + //if (this.view.yaxis.length <= 1) { + this.calcData(true) + //} }, addYaxisExt(e) { this.multiAdd(e, this.view.yaxisExt) this.dragMoveDuplicate(this.view.yaxisExt, e) this.dragCheckType(this.view.yaxisExt, 'q') - if (this.view.yaxisExt.length <= 1) { - this.calcData(true) + + if (this.view.yaxisExt.length > 1) { + for (let i = 0; i < this.view.yaxisExt.length; i++) { + if (i === e.newDraggableIndex) { + continue + } + this.view.yaxisExt[e.newDraggableIndex].chartType = this.view.yaxisExt[i].chartType; + break + } } + + //if (this.view.yaxisExt.length <= 1) { + this.calcData(true) + //} }, calcData(cache) { - console.log(cache) //this.view.xaxis = [...this.source, ...this.target] this.$emit('plugin-call-back', { @@ -339,6 +360,15 @@ export default { }, quotaItemChange(item) { + for (let i = 0; i < this.view.yaxis.length; i++) { + this.view.yaxis[i].chartType = item.chartType + } + this.calcData(true) + }, + quotaExtItemChange(item) { + for (let i = 0; i < this.view.yaxisExt.length; i++) { + this.view.yaxisExt[i].chartType = item.chartType + } this.calcData(true) }, quotaItemRemove(item) { diff --git a/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/index.vue b/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/index.vue index f058656ee9..07aba04106 100644 --- a/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/index.vue +++ b/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/index.vue @@ -6,23 +6,23 @@ @trackClick="trackClick"/>
@@ -310,135 +310,54 @@ export default { const names = []; - let _data = this.chart.data && this.chart.data.data && this.chart.data.data.length > 0 ? _.map(_.filter(this.chart.data.data, (c, _index) => { - return _index < yaxisCount; - }), (t, _index) => { + const yChartData = this.chart.data && this.chart.data.data && this.chart.data.data.length > 0 ? _.map(_.filter(this.chart.data.data, (c, _index) => { + return _index < yaxisCount; + }), (t, _index) => { + names.push(t.name); - const _labelSetting = _.cloneDeep(labelSetting); - if (_labelSetting && yaxisList[_index].formatterCfg) { - _labelSetting.formatter = function (x) { - return valueFormatter(x.value, yaxisList[_index].formatterCfg); - } - } - - names.push(t.name); - - const _chartType = this.getChartType(yaxisList[_index].chartType); - - if (_labelSetting) { - if (_chartType === "column") { - _labelSetting.position = labelPosition; - } else { - _labelSetting.position = undefined; - } - } - - let color = colors && _index < colors.length ? hexColorToRGBA(colors[_index], alpha) : undefined; - if (color && gradient) { - color = setGradientColor(color, true, 270) - } - - const setting = { - type: _chartType, - name: t.name, - options: { - data: _.map(t.data, (v) => { + return _.map(t.data, (v) => { return { quotaList: v.quotaList, dimensionList: v.dimensionList, key: _.join(_.map(v.dimensionList, (d) => d.value), "\n"), value: v.value, + name: t.name, i: _index, t: 'yaxis' } - }), - xField: 'key', - yField: 'value', - meta: { - key: { - sync: true, - }, - value: { - alias: t.name, - }, - }, - color: color, - label: _labelSetting, - xAxis: xAxis, - yAxis: yAxis, + }); } - } - return this.setSizeSetting(setting); - }) : []; + ) : []; - let _dataExt = this.chart.data && this.chart.data.data && this.chart.data.data.length > 0 ? _.map(_.filter(this.chart.data.data, (c, _index) => { - return _index >= yaxisCount; - }), (t, _index) => { + const yData = [this.getYData(_.flatten(yChartData), labelSetting, labelPosition, yaxisList, colors, gradient, alpha, xAxis, yAxis, yaxisExtList.length)]; - const _labelSetting = _.cloneDeep(labelSetting); - if (_labelSetting && yaxisExtList[_index].formatterCfg) { - _labelSetting.formatter = function (x) { - return valueFormatter(x.value, yaxisExtList[_index].formatterCfg); - } - } + const yExtChartData = this.chart.data && this.chart.data.data && this.chart.data.data.length > 0 ? _.map(_.filter(this.chart.data.data, (c, _index) => { + return _index >= yaxisCount; + }), (t, _index) => { + names.push(t.name); - names.push(t.name); - - const _chartType = this.getChartType(yaxisExtList[_index].chartType); - - if (_labelSetting) { - if (_chartType === "column") { - _labelSetting.position = labelPosition; - } else { - _labelSetting.position = undefined; - } - } - - let color = colors && (yaxisCount + _index) < colors.length ? hexColorToRGBA(colors[yaxisCount + _index], alpha) : undefined; - if (color && gradient) { - color = setGradientColor(color, true, 270) - } - - const setting = { - type: _chartType, - name: t.name, - options: { - data: _.map(t.data, (v) => { + return _.map(t.data, (v) => { return { quotaList: v.quotaList, dimensionList: v.dimensionList, key: _.join(_.map(v.dimensionList, (d) => d.value), "\n"), value: v.value, + name: t.name, i: _index, t: 'yaxisExt' } - }), - xField: 'key', - yField: 'value', - meta: { - key: { - sync: true, - }, - value: { - alias: t.name, - }, - }, - color: color, - label: _labelSetting, - xAxis: false, - yAxis: yAxisExt, + }) } - } - return this.setSizeSetting(setting); - }) : []; + ) : []; + const yExtData = [this.getYExtData(_.flatten(yExtChartData), labelSetting, labelPosition, yaxisExtList, colors, gradient, alpha, xAxis, yAxisExt, yaxisCount)]; const params = { tooltip: false, syncViewPadding: true, plots: [ - ..._data, - ..._dataExt + ...yData, + ...yExtData ] }; @@ -489,7 +408,8 @@ export default { params.annotations = this.getAnalyse(this.chart); - params.legend = this.getLegend(this.chart); + //两个轴只能展示一个轴的图例,所以隐藏 + //params.legend = this.getLegend(this.chart); return params; }, @@ -755,6 +675,116 @@ export default { return axis }, + getYData(data, labelSetting, labelPosition, yaxisList, colors, gradient, alpha, xAxis, yAxis, yaxisExtCount) { + + const _labelSetting = _.cloneDeep(labelSetting); + if (_labelSetting) { + _labelSetting.formatter = function (x) { + for (let i = 0; i < yaxisList.length; i++) { + if (i === x.i && yaxisList[i].formatterCfg) { + return valueFormatter(x.value, yaxisList[i].formatterCfg); + } + } + return x.value; + } + } + + const _chartType = this.getChartType(yaxisList && yaxisList.length > 0 ? yaxisList[0].chartType : undefined); + + if (_labelSetting) { + if (_chartType === "column") { + _labelSetting.position = labelPosition; + } else { + _labelSetting.position = undefined; + } + } + + const color = []; + for (let i = 0; i < yaxisList.length; i++) { + if (gradient) { + color.push(setGradientColor(hexColorToRGBA(colors[i % colors.length], alpha), true, 270)) + } else { + color.push(hexColorToRGBA(colors[i % colors.length], alpha)) + } + } + + const setting = { + type: _chartType, + options: { + data: data, + xField: 'key', + yField: 'value', + seriesField: 'name', + colorField: 'name', + isGroup: true, + meta: { + key: { + sync: true, + }, + }, + color: color, + label: _labelSetting, + xAxis: yaxisList.length > 0 || yaxisExtCount === 0 ? xAxis : false, + yAxis: yAxis, + } + } + return this.setSizeSetting(setting); + }, + + getYExtData(data, labelSetting, labelPosition, yaxisExtList, colors, gradient, alpha, xAxis, yAxisExt, yaxisCount) { + const _labelSetting = _.cloneDeep(labelSetting); + if (_labelSetting) { + _labelSetting.formatter = function (x) { + for (let i = 0; i < yaxisExtList.length; i++) { + if (i === x.i && yaxisExtList[i].formatterCfg) { + return valueFormatter(x.value, yaxisExtList[i].formatterCfg); + } + } + return x.value; + } + } + + const _chartType = this.getChartType(yaxisExtList && yaxisExtList.length > 0 ? yaxisExtList[0].chartType : undefined); + + if (_labelSetting) { + if (_chartType === "column") { + _labelSetting.position = labelPosition; + } else { + _labelSetting.position = undefined; + } + } + + const color = []; + for (let i = yaxisCount; i < yaxisExtList.length + yaxisCount; i++) { + if (gradient) { + color.push(setGradientColor(hexColorToRGBA(colors[i % colors.length], alpha), true, 270)) + } else { + color.push(hexColorToRGBA(colors[i % colors.length], alpha)) + } + } + + const setting = { + type: _chartType, + options: { + data: data, + xField: 'key', + yField: 'value', + seriesField: 'name', + isGroup: true, + meta: { + key: { + sync: true, + }, + }, + color: color, + label: _labelSetting, + xAxis: yaxisCount > 0 || yaxisExtList.length === 0 ? false : xAxis, + yAxis: yAxisExt, + } + } + return this.setSizeSetting(setting); + }, + setSizeSetting(setting) { let customAttr = undefined; if (this.chart.customAttr) { @@ -1044,7 +1074,7 @@ export default { }, checkSelected(param) { return (this.linkageActiveParam.name === param.name || (this.linkageActiveParam.name === 'NO_DATA' && !param.name)) && - (this.linkageActiveParam.category === param.category) + (this.linkageActiveParam.category === param.category) }, trackClick(trackAction) { From 0c8a50ae410797c5cea7c6a8d2315bffcfd58218 Mon Sep 17 00:00:00 2001 From: junjun Date: Tue, 5 Dec 2023 10:45:56 +0800 Subject: [PATCH 31/39] =?UTF-8?q?feat:=20=E8=AE=A1=E7=AE=97=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=94=AF=E6=8C=81=E4=BA=8C=E6=AC=A1=E5=BC=95=E7=94=A8?= =?UTF-8?q?=20#5996?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/doris/DorisQueryProvider.java | 67 +++++++++++++----- .../engine/mysql/MysqlQueryProvider.java | 67 +++++++++++++----- .../provider/query/ck/CKQueryProvider.java | 67 +++++++++++++----- .../provider/query/db2/Db2QueryProvider.java | 67 +++++++++++++----- .../provider/query/es/EsQueryProvider.java | 65 ++++++++++++----- .../query/hive/HiveQueryProvider.java | 67 +++++++++++++----- .../query/impala/ImpalaQueryProvider.java | 66 +++++++++++++----- .../query/mongodb/MongoQueryProvider.java | 67 +++++++++++++----- .../query/mysql/MysqlQueryProvider.java | 67 +++++++++++++----- .../query/oracle/OracleQueryProvider.java | 67 +++++++++++++----- .../provider/query/pg/PgQueryProvider.java | 67 +++++++++++++----- .../query/redshift/RedshiftQueryProvider.java | 65 ++++++++++++----- .../sqlserver/SqlserverQueryProvider.java | 69 +++++++++++++------ .../resources/i18n/messages_en_US.properties | 4 +- .../resources/i18n/messages_zh_CN.properties | 3 +- .../resources/i18n/messages_zh_TW.properties | 4 +- .../views/chart/view/CalcChartFieldEdit.vue | 16 ++--- .../src/views/dataset/data/CalcFieldEdit.vue | 16 ++--- 18 files changed, 646 insertions(+), 265 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java index 7d7fd45691..726d8e16dc 100644 --- a/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java @@ -1,6 +1,8 @@ package io.dataease.provider.engine.doris; import com.alibaba.fastjson.JSONArray; +import io.dataease.commons.exception.DEException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -197,7 +199,7 @@ public class DorisQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -1418,27 +1420,54 @@ public class DorisQueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getDataeaseName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getDataeaseName())); - } - return originField; + return null; } private String sqlLimit(String sql, ChartViewWithBLOBs view) { diff --git a/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java index 2b79c4571b..82fb97afb6 100644 --- a/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java @@ -1,6 +1,8 @@ package io.dataease.provider.engine.mysql; import com.alibaba.fastjson.JSONArray; +import io.dataease.commons.exception.DEException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -167,7 +169,7 @@ public class MysqlQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -1366,27 +1368,54 @@ public class MysqlQueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getDataeaseName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getDataeaseName())); - } - return originField; + return null; } private String sqlLimit(String sql, ChartViewWithBLOBs view) { diff --git a/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java index 521d1c7a7a..5b582ef804 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java @@ -1,7 +1,9 @@ package io.dataease.provider.query.ck; import com.alibaba.fastjson.JSONArray; +import io.dataease.commons.exception.DEException; import io.dataease.commons.utils.BeanUtils; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -196,7 +198,7 @@ public class CKQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -1416,27 +1418,54 @@ public class CKQueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); - } - return originField; + return null; } private String sqlLimit(String sql, ChartViewWithBLOBs view) { diff --git a/core/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java index 545806915d..3e401f1476 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java @@ -2,7 +2,9 @@ package io.dataease.provider.query.db2; import com.alibaba.fastjson.JSONArray; import com.google.gson.Gson; +import io.dataease.commons.exception.DEException; import io.dataease.dto.datasource.Db2Configuration; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -172,7 +174,7 @@ public class Db2QueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -1404,27 +1406,54 @@ public class Db2QueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); - } - return originField; + return null; } private String sqlLimit(String sql, ChartViewWithBLOBs view) { diff --git a/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java index 062eaaa131..b72cd5348a 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java @@ -1,6 +1,8 @@ package io.dataease.provider.query.es; import com.alibaba.fastjson.JSONArray; +import io.dataease.commons.exception.DEException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -1322,27 +1324,54 @@ public class EsQueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); - } - return originField; + return null; } private String sqlLimit(String sql, ChartViewWithBLOBs view) { diff --git a/core/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java index 8b0cb477d3..2e1510f271 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java @@ -1,6 +1,8 @@ package io.dataease.provider.query.hive; import com.alibaba.fastjson.JSONArray; +import io.dataease.commons.exception.DEException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -153,7 +155,7 @@ public class HiveQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -1334,27 +1336,54 @@ public class HiveQueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); - } - return originField; + return null; } private String sqlLimit(String sql, ChartViewWithBLOBs view) { diff --git a/core/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java index 39b1a3097a..a008acb38b 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java @@ -1,6 +1,8 @@ package io.dataease.provider.query.impala; import com.alibaba.fastjson.JSONArray; +import io.dataease.commons.exception.DEException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -18,7 +20,6 @@ import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; import io.dataease.plugins.datasource.entity.Dateformat; -import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -1306,27 +1307,54 @@ public class ImpalaQueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(ImpalaConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(ImpalaConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); - } - return originField; + return null; } private String sqlLimit(String sql, ChartViewWithBLOBs view) { diff --git a/core/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java index 7743e4d1fa..fd4bb88916 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java @@ -1,6 +1,8 @@ package io.dataease.provider.query.mongodb; import com.alibaba.fastjson.JSONArray; +import io.dataease.commons.exception.DEException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -139,7 +141,7 @@ public class MongoQueryProvider extends QueryProvider { List wheres = new ArrayList<>(); if (customWheres != null) wheres.add(customWheres); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (whereTrees != null) wheres.add(whereTrees); @@ -1159,27 +1161,54 @@ public class MongoQueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); - } - return originField; + return null; } private String sqlLimit(String sql, ChartViewWithBLOBs view) { diff --git a/core/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java index 6d19c6b574..3b5c414b6d 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java @@ -1,6 +1,8 @@ package io.dataease.provider.query.mysql; import com.alibaba.fastjson.JSONArray; +import io.dataease.commons.exception.DEException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -251,7 +253,7 @@ public class MysqlQueryProvider extends QueryProvider { if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -1426,27 +1428,54 @@ public class MysqlQueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); - } - return originField; + return null; } private String sqlLimit(String sql, ChartViewWithBLOBs view) { diff --git a/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java index 3fd78c57f7..419cb087fb 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java @@ -2,7 +2,9 @@ package io.dataease.provider.query.oracle; import com.alibaba.fastjson.JSONArray; import com.google.gson.Gson; +import io.dataease.commons.exception.DEException; import io.dataease.dto.datasource.OracleConfiguration; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -127,7 +129,7 @@ public class OracleQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -1516,27 +1518,54 @@ public class OracleQueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); - } - return originField; + return null; } private String sqlLimit(String sql, ChartViewWithBLOBs view) { diff --git a/core/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java index f0e0b053c4..1f362cef65 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java @@ -2,6 +2,8 @@ package io.dataease.provider.query.pg; import com.alibaba.fastjson.JSONArray; import com.google.gson.Gson; +import io.dataease.commons.exception.DEException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -180,7 +182,7 @@ public class PgQueryProvider extends QueryProvider { List wheres = new ArrayList<>(); if (customWheres != null) wheres.add(customWheres); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (whereTrees != null) wheres.add(whereTrees); @@ -1332,27 +1334,54 @@ public class PgQueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); - } - return originField; + return null; } private String sqlLimit(String sql, ChartViewWithBLOBs view) { diff --git a/core/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java index 8c4a0c348f..07bab6ddfd 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java @@ -2,6 +2,8 @@ package io.dataease.provider.query.redshift; import com.alibaba.fastjson.JSONArray; import com.google.gson.Gson; +import io.dataease.commons.exception.DEException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -1313,27 +1315,54 @@ public class RedshiftQueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); - } - return originField; + return null; } private String sqlLimit(String sql, ChartViewWithBLOBs view) { diff --git a/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java index 3d98e2c9cb..12573c2e33 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java @@ -2,6 +2,8 @@ package io.dataease.provider.query.sqlserver; import com.alibaba.fastjson.JSONArray; import com.google.gson.Gson; +import io.dataease.commons.exception.DEException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -269,7 +271,7 @@ public class SqlserverQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (whereTrees != null) wheres.add(whereTrees); if (StringUtils.isNotBlank(keyword)) { - String keyWhere = "("+transKeywordFilterList(tableObj, xFields, keyword)+")"; + String keyWhere = "(" + transKeywordFilterList(tableObj, xFields, keyword) + ")"; wheres.add(keyWhere); } if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); @@ -282,7 +284,7 @@ public class SqlserverQueryProvider extends QueryProvider { xOrders.add(order); } } - if(ObjectUtils.isNotEmpty(limit)){ + if (ObjectUtils.isNotEmpty(limit)) { SQLObj limitFiled = SQLObj.builder().limitFiled(" top " + limit + " ").build(); st_sql.add("limitFiled", limitFiled); } @@ -1488,27 +1490,54 @@ public class SqlserverQueryProvider extends QueryProvider { } private String calcFieldRegex(String originField, SQLObj tableObj) { - originField = originField.replaceAll("[\\t\\n\\r]]", ""); - // 正则提取[xxx] - String regex = "\\[(.*?)]"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(originField); - Set ids = new HashSet<>(); - while (matcher.find()) { - String id = matcher.group(1); - ids.add(id); + try { + int i = 0; + return buildCalcField(originField, tableObj, i); + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_ref")); } - if (CollectionUtils.isEmpty(ids)) { + return null; + } + + private String buildCalcField(String originField, SQLObj tableObj, int i) throws Exception { + try { + i++; + if (i > 100) { + DEException.throwException(Translator.get("i18n_field_circular_error")); + } + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { + // 计算字段允许二次引用,这里递归查询完整引用链 + if (Objects.equals(ele.getExtField(), 0)) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } else { + originField = originField.replaceAll("\\[" + ele.getId() + "]", ele.getOriginName()); + originField = buildCalcField(originField, tableObj, i); + } + } + } return originField; + } catch (Exception e) { + DEException.throwException(Translator.get("i18n_field_circular_error")); } - DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); - datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); - List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); - for (DatasetTableField ele : calcFields) { - originField = originField.replaceAll("\\[" + ele.getId() + "]", - String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); - } - return originField; + return null; } @Override diff --git a/core/backend/src/main/resources/i18n/messages_en_US.properties b/core/backend/src/main/resources/i18n/messages_en_US.properties index 48c85b8c64..2fee75cb4d 100644 --- a/core/backend/src/main/resources/i18n/messages_en_US.properties +++ b/core/backend/src/main/resources/i18n/messages_en_US.properties @@ -277,4 +277,6 @@ I18N_PANEL_PDF_TEMPLATE_ONLY_PIC=Default template only screenshot \u8FB9\u684610=Border 10 I18n_name_cant_empty=Name can not be empty! I18n_del_admin_tips=Forbidden to delete the admin account -I18N_NO_DRIVER_PERMISSION=Do not have permissions! \ No newline at end of file +I18N_NO_DRIVER_PERMISSION=Do not have permissions! +i18n_field_circular_error=Field error +i18n_field_circular_ref=Field has Circular Reference diff --git a/core/backend/src/main/resources/i18n/messages_zh_CN.properties b/core/backend/src/main/resources/i18n/messages_zh_CN.properties index ff5de5ab72..7a5e436e86 100644 --- a/core/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/core/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -268,4 +268,5 @@ I18N_PANEL_PDF_TEMPLATE_ONLY_PIC=\u9ED8\u8BA4\u6A21\u677F(\u53EA\u622A\u56FE) I18n_name_cant_empty=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\uFF01 I18n_del_admin_tips=\u7981\u6B62\u5220\u9664admin\u8D26\u53F7 I18N_NO_DRIVER_PERMISSION=\u6ca1\u6709\u6743\u9650\uff01 - +i18n_field_circular_error=\u5B57\u6BB5\u89E3\u6790\u9519\u8BEF\uFF0C\u53EF\u80FD\u539F\u56E0\uFF1A\u5B57\u6BB5\u5DF2\u5220\u9664\u3001\u8BA1\u7B97\u5B57\u6BB5\u5F15\u7528\u5C42\u7EA7\u8FC7\u6DF1\u3001\u5B58\u5728\u5FAA\u73AF\u5F15\u7528\u7B49\uFF0C\u8BF7\u68C0\u67E5\u8868\u8282\u70B9\u548C\u5B57\u6BB5\u5E76\u91CD\u65B0\u7F16\u8F91\u3002 +i18n_field_circular_ref=\u5B57\u6BB5\u5B58\u5728\u5FAA\u73AF\u5F15\u7528 diff --git a/core/backend/src/main/resources/i18n/messages_zh_TW.properties b/core/backend/src/main/resources/i18n/messages_zh_TW.properties index 9898eb0b13..1489026291 100644 --- a/core/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/core/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -273,4 +273,6 @@ I18N_PANEL_PDF_TEMPLATE_ONLY_PIC=\u9ED8\u8A8D\u6A21\u677F(\u53EA\u622A\u5716) \u8FB9\u684610=\u908A\u6846 10 I18n_name_cant_empty=\u540D\u7A31\u4E0D\u80FD\u70BA\u7A7A\uFF01 I18n_del_admin_tips=\u7981\u6B62\u522A\u9664admin\u8CEC\u865F -I18N_NO_DRIVER_PERMISSION=\u6c92\u6709\u8a31\u53ef\u6b0a\uff01 \ No newline at end of file +I18N_NO_DRIVER_PERMISSION=\u6c92\u6709\u8a31\u53ef\u6b0a\uff01 +i18n_field_circular_error=\u5B57\u6BB5\u89E3\u6790\u932F\u8AA4\uFF0C\u53EF\u80FD\u539F\u56E0\uFF1A\u5B57\u6BB5\u5DF2\u522A\u9664\u3001\u8A08\u7B97\u5B57\u6BB5\u5F15\u7528\u5C64\u7D1A\u904E\u6DF1\u3001\u5B58\u5728\u5FAA\u74B0\u5F15\u7528\u7B49\uFF0C\u8ACB\u6AA2\u67E5\u8868\u7BC0\u9EDE\u548C\u5B57\u6BB5\u4E26\u91CD\u65B0\u7DE8\u8F2F\u3002 +i18n_field_circular_ref=\u5B57\u6BB5\u5B58\u5728\u5FAA\u74B0\u5F15\u7528 diff --git a/core/frontend/src/views/chart/view/CalcChartFieldEdit.vue b/core/frontend/src/views/chart/view/CalcChartFieldEdit.vue index 0fdd7df17a..d70b83ac56 100644 --- a/core/frontend/src/views/chart/view/CalcChartFieldEdit.vue +++ b/core/frontend/src/views/chart/view/CalcChartFieldEdit.vue @@ -415,16 +415,16 @@ export default { deep: true }, 'tableFields': function() { - this.dimensionData = JSON.parse(JSON.stringify(this.tableFields.dimensionList)).filter(ele => ele.extField === 0) - this.quotaData = JSON.parse(JSON.stringify(this.tableFields.quotaList)).filter(ele => ele.extField === 0) + this.dimensionData = JSON.parse(JSON.stringify(this.tableFields.dimensionList)) + this.quotaData = JSON.parse(JSON.stringify(this.tableFields.quotaList)) }, 'searchField': function(val) { if (val && val !== '') { - this.dimensionData = JSON.parse(JSON.stringify(this.tableFields.dimensionList.filter(ele => ele.name.toLocaleLowerCase().includes(val.toLocaleLowerCase()) && ele.extField === 0))) - this.quotaData = JSON.parse(JSON.stringify(this.tableFields.quotaList.filter(ele => ele.name.toLocaleLowerCase().includes(val.toLocaleLowerCase()) && ele.extField === 0))) + this.dimensionData = JSON.parse(JSON.stringify(this.tableFields.dimensionList.filter(ele => ele.name.toLocaleLowerCase().includes(val.toLocaleLowerCase())))) + this.quotaData = JSON.parse(JSON.stringify(this.tableFields.quotaList.filter(ele => ele.name.toLocaleLowerCase().includes(val.toLocaleLowerCase())))) } else { - this.dimensionData = JSON.parse(JSON.stringify(this.tableFields.dimensionList)).filter(ele => ele.extField === 0) - this.quotaData = JSON.parse(JSON.stringify(this.tableFields.quotaList)).filter(ele => ele.extField === 0) + this.dimensionData = JSON.parse(JSON.stringify(this.tableFields.dimensionList)) + this.quotaData = JSON.parse(JSON.stringify(this.tableFields.quotaList)) } }, 'searchFunction': function(val) { @@ -572,8 +572,8 @@ export default { this.tableFields.dimensionListData = JSON.parse(JSON.stringify(this.tableFields.dimensionList)) this.tableFields.quotaListData = JSON.parse(JSON.stringify(this.tableFields.quotaList)) - this.dimensionData = JSON.parse(JSON.stringify(this.tableFields.dimensionList)).filter(ele => ele.extField === 0) - this.quotaData = JSON.parse(JSON.stringify(this.tableFields.quotaList)).filter(ele => ele.extField === 0) + this.dimensionData = JSON.parse(JSON.stringify(this.tableFields.dimensionList)) + this.quotaData = JSON.parse(JSON.stringify(this.tableFields.quotaList)) this.initField() }) diff --git a/core/frontend/src/views/dataset/data/CalcFieldEdit.vue b/core/frontend/src/views/dataset/data/CalcFieldEdit.vue index c741f4a719..bc2219e963 100644 --- a/core/frontend/src/views/dataset/data/CalcFieldEdit.vue +++ b/core/frontend/src/views/dataset/data/CalcFieldEdit.vue @@ -392,10 +392,10 @@ export default { tableFields: function() { this.dimensionData = JSON.parse( JSON.stringify(this.tableFields.dimensionList) - ).filter((ele) => ele.extField === 0) + ) this.quotaData = JSON.parse( JSON.stringify(this.tableFields.quotaList) - ).filter((ele) => ele.extField === 0) + ) }, searchField: function(val) { if (val && val !== '') { @@ -405,7 +405,7 @@ export default { (ele) => ele.name .toLocaleLowerCase() - .includes(val.toLocaleLowerCase()) && ele.extField === 0 + .includes(val.toLocaleLowerCase()) ) ) ) @@ -415,17 +415,17 @@ export default { (ele) => ele.name .toLocaleLowerCase() - .includes(val.toLocaleLowerCase()) && ele.extField === 0 + .includes(val.toLocaleLowerCase()) ) ) ) } else { this.dimensionData = JSON.parse( JSON.stringify(this.tableFields.dimensionList) - ).filter((ele) => ele.extField === 0) + ) this.quotaData = JSON.parse( JSON.stringify(this.tableFields.quotaList) - ).filter((ele) => ele.extField === 0) + ) } }, searchFunction: function(val) { @@ -452,10 +452,10 @@ export default { this.initFunctions() this.dimensionData = JSON.parse( JSON.stringify(this.tableFields.dimensionList) - ).filter((ele) => ele.extField === 0) + ) this.quotaData = JSON.parse( JSON.stringify(this.tableFields.quotaList) - ).filter((ele) => ele.extField === 0) + ) this.initField() }, methods: { From 3cf950cb84108efc29df1df7db721083369e2e7b Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Tue, 5 Dec 2023 11:43:10 +0800 Subject: [PATCH 32/39] =?UTF-8?q?fix:=20=E7=AC=A6=E5=8F=B7=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E7=AD=BE=E6=8F=90=E7=A4=BA=E6=9C=AA=E5=8E=BB?= =?UTF-8?q?=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../official/handler/SymbolMapRSHandler.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/extensions/dataease-extensions-view/view-symbolmap/view-symbolmap-backend/src/main/java/io/dataease/plugins/view/official/handler/SymbolMapRSHandler.java b/extensions/dataease-extensions-view/view-symbolmap/view-symbolmap-backend/src/main/java/io/dataease/plugins/view/official/handler/SymbolMapRSHandler.java index 3c83a67450..018efca7a9 100644 --- a/extensions/dataease-extensions-view/view-symbolmap/view-symbolmap-backend/src/main/java/io/dataease/plugins/view/official/handler/SymbolMapRSHandler.java +++ b/extensions/dataease-extensions-view/view-symbolmap/view-symbolmap-backend/src/main/java/io/dataease/plugins/view/official/handler/SymbolMapRSHandler.java @@ -11,10 +11,8 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; import javax.annotation.PostConstruct; @@ -124,7 +122,7 @@ public class SymbolMapRSHandler implements PluginViewRSHandler { ChartQuotaDTO chartQuotaDTO = new ChartQuotaDTO(); chartQuotaDTO.setId(curY.getId()); axisChartDataDTO.getQuotaList().add(chartQuotaDTO); - axisChartDataDTO.getProperties().put(curY.getName(), row[i + step]); + axisChartDataDTO.getProperties().put(curY.getName(), formatLabel(curY, row[i + step])); axisChartDataDTO.setLongitude(dimensionList.get(0).getValue()); axisChartDataDTO.setLatitude(dimensionList.get(1).getValue()); if (StringUtils.equals(curY.getTypeField(), "yAxis") && !valueFilled) { @@ -139,4 +137,13 @@ public class SymbolMapRSHandler implements PluginViewRSHandler { map.put("data", datalist); return map; } + + private String formatLabel(PluginViewField field, String val) { + if (StringUtils.isBlank(val)) return val; + String typeField = field.getTypeField(); + if (StringUtils.isNotBlank(typeField) && trans2Ykeys.contains(typeField)) { + return Arrays.stream(val.split(",")).distinct().collect(Collectors.joining(",")); + } + return val; + } } From ba9852a9e8ee45b8f95585edb9a1fa97fb099426 Mon Sep 17 00:00:00 2001 From: ulleo Date: Tue, 5 Dec 2023 15:59:45 +0800 Subject: [PATCH 33/39] =?UTF-8?q?fix:=20AntV=E7=BB=84=E5=90=88=E5=9B=BE?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=8B=96=E6=8B=BD=E6=8C=87=E6=A0=87=EF=BC=8C?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E7=B1=BB=E5=9E=8B=E4=B8=8D=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/antv/chartmix/data.vue | 198 +++++++++--------- .../src/views/antv/chartmix/index.vue | 102 ++++----- 2 files changed, 152 insertions(+), 148 deletions(-) diff --git a/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/data.vue b/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/data.vue index 116b222248..e2173d0fe6 100644 --- a/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/data.vue +++ b/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/data.vue @@ -6,30 +6,30 @@ {{ $t('plugin_view_chartmix.source') }}/{{ $t('chart.dimension') }} @@ -43,28 +43,28 @@ {{ $t('plugin_view_chartmix.mark_size') }}/{{ $t('chart.quota') }} @@ -78,28 +78,28 @@ {{ $t('plugin_view_chartmix.mark_size') }}/{{ $t('chart.quota') }} @@ -114,27 +114,27 @@ {{ $t('chart.result_filter') }} @@ -152,6 +152,7 @@ import QuotaItem from '../../../components/views/QuotaItem' import QuotaExtItem from '../../../components/views/QuotaExtItem' import FilterItem from '../../../components/views/FilterItem' import messages from '@/de-base/lang/messages' +import {defaultTo} from "lodash-es" export default { props: { @@ -174,6 +175,8 @@ export default { }, data() { return { + yChartType: undefined, + yExtChartType: undefined, widgets: [], places: [], moveId: -1, @@ -229,6 +232,17 @@ export default { created() { this.$emit('on-add-languages', messages) }, + mounted() { + if (this.view.yaxis && this.view.yaxis[0]) { + this.yChartType = this.view.yaxis[0].chartType + } + if (this.view.yaxisExt && this.view.yaxisExt[0]) { + this.yExtChartType = this.view.yaxisExt[0].chartType + } + this.yChartType = defaultTo(this.yChartType, 'bar'); + this.yExtChartType = defaultTo(this.yExtChartType, 'line'); + + }, watch: { /*listenLists: function(val) { if (this.listenLists[0] <= 1 && this.listenLists[1] <= 1) { @@ -285,14 +299,8 @@ export default { this.dragMoveDuplicate(this.view.yaxis, e) this.dragCheckType(this.view.yaxis, 'q') - if (this.view.yaxis.length > 1) { - for (let i = 0; i < this.view.yaxis.length; i++) { - if (i === e.newDraggableIndex) { - continue - } - this.view.yaxis[e.newDraggableIndex].chartType = this.view.yaxis[i].chartType; - break - } + for (let i = 0; i < this.view.yaxis.length; i++) { + this.view.yaxis[i].chartType = this.yChartType } //if (this.view.yaxis.length <= 1) { @@ -304,14 +312,8 @@ export default { this.dragMoveDuplicate(this.view.yaxisExt, e) this.dragCheckType(this.view.yaxisExt, 'q') - if (this.view.yaxisExt.length > 1) { - for (let i = 0; i < this.view.yaxisExt.length; i++) { - if (i === e.newDraggableIndex) { - continue - } - this.view.yaxisExt[e.newDraggableIndex].chartType = this.view.yaxisExt[i].chartType; - break - } + for (let i = 0; i < this.view.yaxisExt.length; i++) { + this.view.yaxisExt[i].chartType = this.yExtChartType; } //if (this.view.yaxisExt.length <= 1) { @@ -360,14 +362,16 @@ export default { }, quotaItemChange(item) { + this.yChartType = item.chartType; for (let i = 0; i < this.view.yaxis.length; i++) { - this.view.yaxis[i].chartType = item.chartType + this.view.yaxis[i].chartType = this.yChartType } this.calcData(true) }, quotaExtItemChange(item) { + this.yExtChartType = item.chartType; for (let i = 0; i < this.view.yaxisExt.length; i++) { - this.view.yaxisExt[i].chartType = item.chartType + this.view.yaxisExt[i].chartType = this.yExtChartType } this.calcData(true) }, @@ -421,8 +425,8 @@ export default { newItems = groupDie ? this.selectedDimension : this.selectedQuota } const preIds = list - .filter((_, i) => i < e.newDraggableIndex || i >= e.newDraggableIndex + newItems.length) - .map(i => i.id) + .filter((_, i) => i < e.newDraggableIndex || i >= e.newDraggableIndex + newItems.length) + .map(i => i.id) // 倒序删除 for (let i = e.newDraggableIndex + newItems.length - 1; i >= e.newDraggableIndex; i--) { if (preIds.includes(list[i].id)) { diff --git a/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/index.vue b/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/index.vue index 07aba04106..ba7bc6ec09 100644 --- a/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/index.vue +++ b/extensions/dataease-extensions-view/view-chartmix/view-chartmix-frontend/src/views/antv/chartmix/index.vue @@ -6,23 +6,23 @@ @trackClick="trackClick"/>
@@ -43,7 +43,7 @@ import { getLineDash, DEFAULT_COLOR_CASE, formatterItem, DEFAULT_YAXIS_EXT_STYLE } from '../../../utils/map'; import ChartTitleUpdate from '../../../components/views/ChartTitleUpdate'; -import _ from 'lodash'; +import {map, filter, join, flatten, cloneDeep} from 'lodash-es'; import {clear} from 'size-sensor' import {valueFormatter} from '../../../utils/formatter' @@ -310,47 +310,47 @@ export default { const names = []; - const yChartData = this.chart.data && this.chart.data.data && this.chart.data.data.length > 0 ? _.map(_.filter(this.chart.data.data, (c, _index) => { - return _index < yaxisCount; - }), (t, _index) => { - names.push(t.name); + const yChartData = this.chart.data && this.chart.data.data && this.chart.data.data.length > 0 ? map(filter(this.chart.data.data, (c, _index) => { + return _index < yaxisCount; + }), (t, _index) => { + names.push(t.name); - return _.map(t.data, (v) => { - return { - quotaList: v.quotaList, - dimensionList: v.dimensionList, - key: _.join(_.map(v.dimensionList, (d) => d.value), "\n"), - value: v.value, - name: t.name, - i: _index, - t: 'yaxis' - } - }); - } + return map(t.data, (v) => { + return { + quotaList: v.quotaList, + dimensionList: v.dimensionList, + key: join(map(v.dimensionList, (d) => d.value), "\n"), + value: v.value, + name: t.name, + i: _index, + t: 'yaxis' + } + }); + } ) : []; - const yData = [this.getYData(_.flatten(yChartData), labelSetting, labelPosition, yaxisList, colors, gradient, alpha, xAxis, yAxis, yaxisExtList.length)]; + const yData = [this.getYData(flatten(yChartData), labelSetting, labelPosition, yaxisList, colors, gradient, alpha, xAxis, yAxis, yaxisExtList.length)]; - const yExtChartData = this.chart.data && this.chart.data.data && this.chart.data.data.length > 0 ? _.map(_.filter(this.chart.data.data, (c, _index) => { - return _index >= yaxisCount; - }), (t, _index) => { - names.push(t.name); + const yExtChartData = this.chart.data && this.chart.data.data && this.chart.data.data.length > 0 ? map(filter(this.chart.data.data, (c, _index) => { + return _index >= yaxisCount; + }), (t, _index) => { + names.push(t.name); - return _.map(t.data, (v) => { - return { - quotaList: v.quotaList, - dimensionList: v.dimensionList, - key: _.join(_.map(v.dimensionList, (d) => d.value), "\n"), - value: v.value, - name: t.name, - i: _index, - t: 'yaxisExt' - } - }) - } + return map(t.data, (v) => { + return { + quotaList: v.quotaList, + dimensionList: v.dimensionList, + key: join(map(v.dimensionList, (d) => d.value), "\n"), + value: v.value, + name: t.name, + i: _index, + t: 'yaxisExt' + } + }) + } ) : []; - const yExtData = [this.getYExtData(_.flatten(yExtChartData), labelSetting, labelPosition, yaxisExtList, colors, gradient, alpha, xAxis, yAxisExt, yaxisCount)]; + const yExtData = [this.getYExtData(flatten(yExtChartData), labelSetting, labelPosition, yaxisExtList, colors, gradient, alpha, xAxis, yAxisExt, yaxisCount)]; const params = { tooltip: false, @@ -390,7 +390,7 @@ export default { item.value = valueFormatter(item.data.value, yaxisExtList[item.data.i].formatterCfg) } }) - return _.filter(originalItems, (item) => { + return filter(originalItems, (item) => { const v = item.data.key; if (item.title === v && item.title === item.value && item.name === "key" || !names.includes(item.name)) { return false; @@ -677,7 +677,7 @@ export default { getYData(data, labelSetting, labelPosition, yaxisList, colors, gradient, alpha, xAxis, yAxis, yaxisExtCount) { - const _labelSetting = _.cloneDeep(labelSetting); + const _labelSetting = cloneDeep(labelSetting); if (_labelSetting) { _labelSetting.formatter = function (x) { for (let i = 0; i < yaxisList.length; i++) { @@ -732,7 +732,7 @@ export default { }, getYExtData(data, labelSetting, labelPosition, yaxisExtList, colors, gradient, alpha, xAxis, yAxisExt, yaxisCount) { - const _labelSetting = _.cloneDeep(labelSetting); + const _labelSetting = cloneDeep(labelSetting); if (_labelSetting) { _labelSetting.formatter = function (x) { for (let i = 0; i < yaxisExtList.length; i++) { @@ -1074,7 +1074,7 @@ export default { }, checkSelected(param) { return (this.linkageActiveParam.name === param.name || (this.linkageActiveParam.name === 'NO_DATA' && !param.name)) && - (this.linkageActiveParam.category === param.category) + (this.linkageActiveParam.category === param.category) }, trackClick(trackAction) { From 2096d058376d01a69b3e628cd5b5cf07ab995a65 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Tue, 5 Dec 2023 16:24:13 +0800 Subject: [PATCH 34/39] =?UTF-8?q?fix:=20sqlserver=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E6=A0=91=E8=BF=87=E6=BB=A4=E5=99=A8=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sqlserver/SqlserverQueryProvider.java | 133 ++++++------------ .../datasource/SqlServerSQLConstants.java | 2 + 2 files changed, 48 insertions(+), 87 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java index 12573c2e33..d5efe0bdd4 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java @@ -112,94 +112,15 @@ public class SqlserverQueryProvider extends QueryProvider { return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, rowPermissionsTree, sortFields, limit, keyword); } - /*@Override - public String createQuerySQLWithLimit(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List rowPermissionsTree, List sortFields, Long limit, String keyword) { - SQLObj tableObj = SQLObj.builder() - .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(SqlServerSQLConstants.KEYWORD_TABLE, table)) - .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) - .build(); - setSchema(tableObj, ds); - - List xFields = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(fields)) { - for (int i = 0; i < fields.size(); i++) { - DatasetTableField f = fields.get(i); - String originField; - if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originField = calcFieldRegex(f.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { - originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); - } else { - originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); - } - String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); - String fieldName; - // 处理横轴字段 - if (f.getDeExtractType() == DeTypeConstants.DE_TIME) { // 时间 转为 数值 - if (f.getDeType() == DeTypeConstants.DE_INT || f.getDeType() == DeTypeConstants.DE_FLOAT) { - fieldName = String.format(SqlServerSQLConstants.UNIX_TIMESTAMP, originField); - } else { - fieldName = originField; - } - } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) { - if (f.getDeType() == DeTypeConstants.DE_INT) { - fieldName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_INT_FORMAT, originField); - } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { - fieldName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT, originField); - } else if (f.getDeType() == DeTypeConstants.DE_TIME) { //字符串转时间 - fieldName = String.format(SqlServerSQLConstants.STRING_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : SqlServerSQLConstants.DEFAULT_DATE_FORMAT); - } else { - fieldName = originField; - } - } else { - if (f.getDeType() == DeTypeConstants.DE_TIME) { // 数值转时间 - String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originField + "/1000"); - fieldName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); - } else if (f.getDeType() == DeTypeConstants.DE_INT) { - fieldName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_INT_FORMAT, originField); - } else { - fieldName = originField; - } - } - xFields.add(SQLObj.builder() - .fieldName(fieldName) - .fieldAlias(fieldAlias) - .build()); - } - } - - STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); - ST st_sql = stg.getInstanceOf("previewSql"); - st_sql.add("isGroup", isGroup); - if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); - if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); - String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); - // row permissions tree - String whereTrees = transFilterTrees(tableObj, rowPermissionsTree); - List wheres = new ArrayList<>(); - if (customWheres != null) wheres.add(customWheres); - if (whereTrees != null) wheres.add(whereTrees); - if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); - List xOrders = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(sortFields)) { - int step = fields.size(); - for (int i = step; i < (step + sortFields.size()); i++) { - DeSortField deSortField = sortFields.get(i - step); - SQLObj order = buildSortField(deSortField, tableObj, i); - xOrders.add(order); - } - } - if(limit != null){ - SQLObj limitFiled = SQLObj.builder().limitFiled(" top " + limit + " ").build(); - st_sql.add("limitFiled", limitFiled); - } - if (ObjectUtils.isNotEmpty(xOrders)) { - st_sql.add("orders", xOrders); - } - return st_sql.render(); - }*/ + private boolean anyFieldExceed(List fields) { + if (CollectionUtils.isEmpty(fields)) return false; + return fields.stream().anyMatch(field -> field.getDeExtractType().equals(DeTypeConstants.DE_STRING) && field.getSize() > 8000); + } + private boolean anySortFieldExceed(List fields) { + if (CollectionUtils.isEmpty(fields)) return false; + return fields.stream().anyMatch(field -> field.getDeExtractType().equals(DeTypeConstants.DE_STRING) && field.getSize() > 8000); + } @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List rowPermissionsTree, List sortFields, Long limit, String keyword) { @@ -208,11 +129,46 @@ public class SqlserverQueryProvider extends QueryProvider { .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) .build(); setSchema(tableObj, ds); + List exceedList = null; + if (anyFieldExceed(fields) || anySortFieldExceed(sortFields)) { + exceedList = new ArrayList<>(); + List calcFieldList = new ArrayList<>(fields); + if (CollectionUtils.isNotEmpty(sortFields)) { + calcFieldList.addAll(sortFields); + } + List sqlObjList = new ArrayList<>(); + sqlObjList.add(SQLObj.builder().fieldName("*").build()); + for (DatasetTableField f : calcFieldList) { + boolean exceed = f.getDeExtractType().equals(DeTypeConstants.DE_STRING) && f.getSize() > 8000; + if (!exceedList.contains(f.getOriginName()) && exceed) { + exceedList.add(f.getOriginName()); + String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + String newOriginName = f.getOriginName() + "_exceed"; + String format = String.format(SqlServerSQLConstants.TO_STRING, originField, newOriginName); + sqlObjList.add(SQLObj.builder().fieldName(format).build()); + } + } + STGroup tabStg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = tabStg.getInstanceOf("previewSql"); + st_sql.add("isGroup", false); + st_sql.add("notUseAs", true); + st_sql.add("table", tableObj); + st_sql.add("groups", sqlObjList); + String render = st_sql.render(); + tableObj = SQLObj.builder() + .tableName(" (" + render + ") ") + .tableAlias(String.format(TABLE_ALIAS_PREFIX, "_exceed")) + .build(); + } + List xFields = new ArrayList<>(); if (CollectionUtils.isNotEmpty(fields)) { for (int i = 0; i < fields.size(); i++) { DatasetTableField f = fields.get(i); + if (CollectionUtils.isNotEmpty(exceedList) && exceedList.contains(f.getOriginName())) { + f.setOriginName(f.getOriginName() + "_exceed"); + } String originField; if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 @@ -280,6 +236,9 @@ public class SqlserverQueryProvider extends QueryProvider { int step = fields.size(); for (int i = step; i < (step + sortFields.size()); i++) { DeSortField deSortField = sortFields.get(i - step); + if (CollectionUtils.isNotEmpty(exceedList) && exceedList.contains(deSortField.getOriginName())) { + deSortField.setOriginName(deSortField.getOriginName() + "_exceed"); + } SQLObj order = buildSortField(deSortField, tableObj, i); xOrders.add(order); } diff --git a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/constants/datasource/SqlServerSQLConstants.java b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/constants/datasource/SqlServerSQLConstants.java index 86afee10b9..dccd984dcd 100644 --- a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/constants/datasource/SqlServerSQLConstants.java +++ b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/constants/datasource/SqlServerSQLConstants.java @@ -47,4 +47,6 @@ public class SqlServerSQLConstants extends SQLConstants { public static final String DEFAULT_DATE_FORMAT = "120"; + public static final String TO_STRING = "cast(%s as varchar(max)) as %s"; + } From 9775af5169cfe4b60541f04cf72d89b05a416292 Mon Sep 17 00:00:00 2001 From: dataeaseShu Date: Tue, 5 Dec 2023 16:43:08 +0800 Subject: [PATCH 35/39] =?UTF-8?q?fix:=20=E5=85=A8=E5=B1=8F=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E4=B8=8Btab=E7=BB=84=E4=BB=B6=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E4=B8=8D=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/widget/deWidget/DeTabs.vue | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/frontend/src/components/widget/deWidget/DeTabs.vue b/core/frontend/src/components/widget/deWidget/DeTabs.vue index ef699bc0e9..66e8581be7 100644 --- a/core/frontend/src/components/widget/deWidget/DeTabs.vue +++ b/core/frontend/src/components/widget/deWidget/DeTabs.vue @@ -1,7 +1,7 @@