From adabf1e604b38f5175e68c7751cd3caab1cecc54 Mon Sep 17 00:00:00 2001
From: root <13910913995@163.com>
Date: Mon, 23 Jun 2025 10:34:29 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B9=B6=E6=8F=90=E4=BA=A4?=
=?UTF-8?q?=E4=BA=86=E5=90=8E=E7=AB=AF=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
core/core-backend/pom.xml | 41 +-
.../java/io/gisbi/MybatisPlusGenerator.java | 2 +-
.../charts/impl/DefaultChartHandler.java | 142 ++-
.../chart/charts/impl/YoyChartHandler.java | 4 +-
.../chart/charts/impl/bar/BarHandler.java | 32 +-
.../chart/charts/impl/line/LineHandler.java | 31 +-
.../charts/impl/line/StackAreaHandler.java | 31 +-
.../charts/impl/map/SymbolicMapHandler.java | 15 +-
.../chart/charts/impl/mix/MixHandler.java | 67 +-
.../impl/numeric/NumericalChartHandler.java | 11 +-
.../chart/charts/impl/pie/PieHandler.java | 80 +-
.../impl/table/TableHeatmapHandler.java | 2 +
.../charts/impl/table/TableInfoHandler.java | 37 +-
.../charts/impl/table/TableNormalHandler.java | 196 +++-
.../charts/impl/table/TablePivotHandler.java | 64 +-
.../dao/ext/mapper/ExtChartViewMapper.java | 40 +-
.../gisbi/chart/manage/ChartDataManage.java | 91 +-
.../gisbi/chart/manage/ChartViewManege.java | 71 +-
.../manage/ChartViewThresholdManage.java | 36 +-
.../gisbi/chart/server/ChartDataServer.java | 246 ++++-
.../gisbi/chart/server/ChartViewServer.java | 21 +-
.../io/gisbi/chart/utils/ChartDataBuild.java | 39 +-
.../constants/DataVisualizationConstants.java | 3 +
.../io/gisbi/commons/utils/EncryptUtils.java | 1 +
.../commons/utils/ExcelWatermarkUtils.java | 41 +-
.../gisbi/commons/utils/SqlparserUtils.java | 61 +-
.../java/io/gisbi/config/DeMvcConfig.java | 8 +-
.../dao/auto/entity/CoreDatasetGroup.java | 28 +-
.../auto/entity/CoreDatasetTableField.java | 16 +-
.../auto/mapper/CoreDatasetTableMapper.java | 4 +-
.../dao/ext/mapper/CoreDataSetExtMapper.java | 2 +-
.../dataset/manage/DatasetDataManage.java | 315 +++---
.../dataset/manage/DatasetGroupManage.java | 82 +-
.../dataset/manage/DatasetSQLManage.java | 125 ++-
.../manage/DatasetTableFieldManage.java | 77 +-
.../dataset/manage/PermissionManage.java | 6 +-
.../dataset/server/DatasetDataServer.java | 73 +-
.../dataset/server/DatasetFieldServer.java | 5 +-
.../dataset/server/DatasetTreeServer.java | 25 +-
.../io/gisbi/dataset/utils/DatasetUtils.java | 99 +-
.../datasource/manage/DataSourceManage.java | 28 +-
.../manage/DatasourceSyncManage.java | 46 +-
.../gisbi/datasource/manage/EngineManage.java | 21 +-
.../gisbi/datasource/provider/ApiUtils.java | 85 +-
.../datasource/provider/CalciteProvider.java | 412 ++++++--
.../gisbi/datasource/provider/ExcelUtils.java | 358 +++++--
.../datasource/provider/H2EngineProvider.java | 9 +-
.../provider/MysqlEngineProvider.java | 6 +-
.../server/DatasourceDriverServer.java | 2 +-
.../datasource/server/DatasourceServer.java | 244 +++--
.../java/io/gisbi/datasource/type/H2.java | 18 +
.../java/io/gisbi/datasource/type/Mysql.java | 16 +-
.../java/io/gisbi/datasource/type/Pg.java | 30 +-
.../io/gisbi/datasource/type/Redshift.java | 21 +-
.../java/io/gisbi/engine/sql/SQLProvider.java | 2 +-
.../gisbi/engine/trans/CustomWhere2Str.java | 23 +-
.../gisbi/engine/trans/Dimension2SQLObj.java | 6 +-
.../io/gisbi/engine/trans/ExtWhere2Str.java | 28 +-
.../io/gisbi/engine/trans/Field2SQLObj.java | 6 +-
.../io/gisbi/engine/trans/Order2SQLObj.java | 6 +-
.../io/gisbi/engine/trans/Quota2SQLObj.java | 6 +-
.../io/gisbi/engine/trans/WhereTree2Str.java | 25 +-
.../java/io/gisbi/engine/utils/Utils.java | 44 +-
.../dao/auto/entity/CoreExportTask.java | 6 +-
.../manage/ExportCenterLimitManage.java | 4 +-
.../manage/ExportCenterManage.java | 680 +++----------
.../server/ExportCenterServer.java | 19 +-
.../java/io/gisbi/font/manage/FontManage.java | 2 +-
.../gisbi/license/manage/CoreLicManage.java | 2 +-
.../gisbi/license/server/LicenseServer.java | 2 +-
.../gisbi/listener/EhCacheStartListener.java | 12 +-
.../java/io/gisbi/menu/server/MenuServer.java | 1 -
.../io/gisbi/resource/ResourceService.java | 11 +-
.../dao/ext/mapper/XpackShareExtMapper.java | 1 +
.../gisbi/share/dao/ext/po/XpackSharePO.java | 2 +
.../share/interceptor/LinkInterceptor.java | 11 +-
.../gisbi/share/manage/XpackShareManage.java | 2 +-
.../gisbi/share/server/XpackShareServer.java | 1 +
.../system/manage/SysParameterManage.java | 60 +-
.../system/server/SysParameterServer.java | 7 +-
.../template/manage/TemplateCenterManage.java | 6 +-
.../manage/TemplateLocalParseManage.java | 2 +-
.../auto/entity/DataVisualizationInfo.java | 14 +-
.../mapper/VisualizationWatermarkMapper.java | 5 +
.../dao/ext/mapper/CoreStoreExtMapper.java | 3 +-
.../ext/mapper/CoreVisualiationExtMapper.java | 2 +-
.../mapper/ExtDataVisualizationMapper.java | 56 +-
.../ExtVisualizationLinkJumpMapper.java | 16 +-
.../mapper/ExtVisualizationLinkageMapper.java | 8 +
.../ExtVisualizationOuterParamsMapper.java | 11 +-
.../visualization/dao/ext/po/StorePO.java | 2 +
.../dao/ext/po/VisualizationNodePO.java | 2 +
.../dto/VisualizationNodeBO.java | 1 +
.../manage/CoreVisualizationExportManage.java | 46 +-
.../manage/CoreVisualizationManage.java | 164 ++-
.../manage/VisualizationStoreManage.java | 4 +-
...VisualizationTemplateExtendDataManage.java | 2 +-
.../server/DataVisualizationServer.java | 194 +++-
.../server/StaticResourceServer.java | 7 +-
.../server/VisualizationLinkJumpService.java | 72 +-
.../server/VisualizationLinkageService.java | 70 +-
.../VisualizationOuterParamsService.java | 57 +-
.../server/VisualizationStoreServer.java | 1 +
.../utils/VisualizationExcelUtils.java | 4 +-
.../src/main/resources/application.yml | 2 +-
.../main/resources/i18n/core_en_US.properties | 7 +
.../main/resources/i18n/core_zh_CN.properties | 8 +
.../main/resources/i18n/core_zh_TW.properties | 204 ----
.../mybatis/ExtDataVisualizationMapper.xml | 932 ++++++++++++++++--
.../ExtVisualizationLinkJumpMapper.xml | 242 +++--
.../mybatis/ExtVisualizationLinkageMapper.xml | 120 ++-
.../ExtVisualizationOuterParamsMapper.xml | 97 +-
core/pom.xml | 25 +-
pom.xml | 1 +
.../java/io/gisbi/model/BusiNodeRequest.java | 2 +
sdk/sdk-bundle/pom.xml | 8 +-
116 files changed, 4759 insertions(+), 2173 deletions(-)
delete mode 100644 core/core-backend/src/main/resources/i18n/core_zh_TW.properties
diff --git a/core/core-backend/pom.xml b/core/core-backend/pom.xml
index f738ba5..2587cad 100644
--- a/core/core-backend/pom.xml
+++ b/core/core-backend/pom.xml
@@ -3,33 +3,40 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- gisbi
+ core
io.gisbi
- 1.0.0
+ 2.0.0
+
4.0.0
jar
core-backend
+
+
+ commons-net
+ commons-net
+ 3.8.0
+
com.google.guava
guava
- ${guava.version}
+ 33.0.0-jre
io.gisbi
api-base
- 1.0.0
+ 2.0.0
io.gisbi
common
- 1.0.0
+ 2.0.0
io.gisbi
api-sync
- 1.0.0
+ 2.0.0
com.mysql
@@ -38,18 +45,18 @@
org.apache.commons
commons-dbcp2
- ${commons-dbcp2.version}
+ 2.6.0
org.antlr
antlr
- ${antlr.version}
+ 3.5.2
junit
junit
- ${junit.version}
+ 4.13.2
test
@@ -73,7 +80,6 @@
hutool-all
5.8.8
-
org.springframework.boot
spring-boot-starter-websocket
@@ -93,15 +99,10 @@
org.apache.commons
commons-lang3
-
- cn.hutool
- hutool-all
- 5.8.38
-
io.gisbi
api-permissions
- 1.0.0
+ 2.0.0
@@ -125,12 +126,12 @@
org.seleniumhq.selenium
selenium-java
- ${selenium-java.version}
+ 4.19.1
org.eclipse.angus
angus-mail
- ${angus-mail.version}
+ 2.0.3
org.eclipse.angus
@@ -141,13 +142,13 @@
com.itextpdf
itext7-core
- ${itextpdf.version}
+ 8.0.4
pom
com.vladsch.flexmark
flexmark-all
- ${flexmark.version}
+ 0.62.2
diff --git a/core/core-backend/src/main/java/io/gisbi/MybatisPlusGenerator.java b/core/core-backend/src/main/java/io/gisbi/MybatisPlusGenerator.java
index c5db994..a621a48 100644
--- a/core/core-backend/src/main/java/io/gisbi/MybatisPlusGenerator.java
+++ b/core/core-backend/src/main/java/io/gisbi/MybatisPlusGenerator.java
@@ -14,7 +14,7 @@ public class MybatisPlusGenerator {
* 第一 我嫌麻烦
* 第二 后面配置会放到nacos读起来更麻烦了
*/
- private static final String url = "jdbc:mysql://localhost:3306/dataease?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false";
+ private static final String url = "jdbc:mysql://localhost:3306/gisbi?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false";
private static final String username = "root";
private static final String password = "123456";
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/DefaultChartHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/DefaultChartHandler.java
index 7f00f9c..1fd82ad 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/DefaultChartHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/DefaultChartHandler.java
@@ -1,12 +1,14 @@
package io.gisbi.chart.charts.impl;
+import com.beust.jcommander.Strings;
+import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.ChartHandlerManager;
import io.gisbi.chart.constant.ChartConstants;
import io.gisbi.chart.manage.ChartDataManage;
import io.gisbi.chart.manage.ChartViewManege;
import io.gisbi.chart.utils.ChartDataBuild;
-import io.gisbi.dataset.manage.DatasetTableFieldManage;
import io.gisbi.constant.SQLConstants;
+import io.gisbi.dataset.manage.DatasetTableFieldManage;
import io.gisbi.engine.sql.SQLProvider;
import io.gisbi.engine.trans.Dimension2SQLObj;
import io.gisbi.engine.trans.Quota2SQLObj;
@@ -82,7 +84,7 @@ public class DefaultChartHandler extends AbstractChartPlugin {
var desensitizationList = (Map) formatResult.getContext().get("desensitizationList");
if (MapUtils.isNotEmpty(desensitizationList)) {
formatResult.getAxisMap().forEach((axis, fields) -> {
- fields.removeIf(f -> desensitizationList.containsKey(f.getDataeaseName()));
+ fields.removeIf(f -> desensitizationList.containsKey(f.getGisbiName()));
});
}
return (T) new CustomFilterResult(filterList, formatResult.getContext());
@@ -107,8 +109,9 @@ public class DefaultChartHandler extends AbstractChartPlugin {
dsList.add(next.getValue().getType());
}
boolean needOrder = Utils.isNeedOrder(dsList);
- boolean crossDs = Utils.isCrossDs(dsMap);
+ boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
DatasourceRequest datasourceRequest = new DatasourceRequest();
+ datasourceRequest.setIsCross(crossDs);
datasourceRequest.setDsList(dsMap);
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
@@ -168,8 +171,8 @@ public class DefaultChartHandler extends AbstractChartPlugin {
dataMap.putAll(calcResult.getData());
dataMap.putAll(mapTableNormal);
dataMap.put("sourceFields", allFields);
- mergeAssistField(calcResult.getDynamicAssistFields(), calcResult.getAssistData());
- dataMap.put("dynamicAssistLines", calcResult.getDynamicAssistFields());
+ List chartSeniorAssistDTOS = mergeAssistField(calcResult.getDynamicAssistFields(), calcResult.getAssistData(), calcResult.getDynamicAssistFieldsOriginList(), calcResult.getAssistDataOriginList());
+ dataMap.put("dynamicAssistLines", chartSeniorAssistDTOS);
view.setData(dataMap);
view.setSql(Base64.getEncoder().encodeToString(calcResult.getQuerySql().getBytes()));
view.setDrill(isDrill);
@@ -177,18 +180,30 @@ public class DefaultChartHandler extends AbstractChartPlugin {
return view;
}
-
- protected void mergeAssistField(List dynamicAssistFields, List assistData) {
- if (ObjectUtils.isEmpty(assistData)) {
- return;
- }
- String[] strings = assistData.get(0);
- for (int i = 0; i < dynamicAssistFields.size(); i++) {
- if (i < strings.length) {
- ChartSeniorAssistDTO chartSeniorAssistDTO = dynamicAssistFields.get(i);
- chartSeniorAssistDTO.setValue(strings[i]);
+ protected List mergeAssistField(List dynamicAssistFields, List assistData, List dynamicAssistFieldsOriginList, List assistDataOriginList) {
+ List list = new ArrayList<>();
+ if (ObjectUtils.isNotEmpty(assistData)) {
+ String[] strings = assistData.getFirst();
+ for (int i = 0; i < dynamicAssistFields.size(); i++) {
+ if (i < strings.length) {
+ ChartSeniorAssistDTO chartSeniorAssistDTO = dynamicAssistFields.get(i);
+ chartSeniorAssistDTO.setValue(strings[i]);
+ list.add(chartSeniorAssistDTO);
+ }
}
}
+
+ if (ObjectUtils.isNotEmpty(assistDataOriginList)) {
+ String[] stringsOriginList = assistDataOriginList.getLast();// 取最后一项,如果有其他运算逻辑需要取明细数据可增加逻辑
+ for (int i = 0; i < dynamicAssistFieldsOriginList.size(); i++) {
+ if (i < stringsOriginList.length) {
+ ChartSeniorAssistDTO chartSeniorAssistDTO = dynamicAssistFieldsOriginList.get(i);
+ chartSeniorAssistDTO.setValue(stringsOriginList[i]);
+ list.add(chartSeniorAssistDTO);
+ }
+ }
+ }
+ return list;
}
protected List getDynamicAssistFields(ChartViewDTO view) {
@@ -370,7 +385,7 @@ public class DefaultChartHandler extends AbstractChartPlugin {
return conditionField;
}
- protected String assistSQL(String sql, List assistFields, Map dsMap) {
+ protected String assistSQL(String sql, List assistFields, Map dsMap, boolean crossDs) {
// get datasource prefix and suffix
String dsType = dsMap.entrySet().iterator().next().getValue().getType();
String prefix = "";
@@ -391,25 +406,54 @@ public class DefaultChartHandler extends AbstractChartPlugin {
}
}
- boolean crossDs = Utils.isCrossDs(dsMap);
- StringBuilder stringBuilder = new StringBuilder();
+ List fieldList = new ArrayList<>();
for (int i = 0; i < assistFields.size(); i++) {
ChartViewFieldDTO dto = assistFields.get(i);
+ if (StringUtils.equalsIgnoreCase(dto.getSummary(), "last_item")) {
+ continue;
+ }
if (crossDs) {
- if (i == (assistFields.size() - 1)) {
- stringBuilder.append(dto.getSummary() + "(" + dto.getOriginName() + ")");
- } else {
- stringBuilder.append(dto.getSummary() + "(" + dto.getOriginName() + "),");
- }
+ fieldList.add(dto.getSummary() + "(" + dto.getOriginName() + ")");
} else {
- if (i == (assistFields.size() - 1)) {
- stringBuilder.append(dto.getSummary() + "(" + prefix + dto.getOriginName() + suffix + ")");
+ fieldList.add(dto.getSummary() + "(" + prefix + dto.getOriginName() + suffix + ")");
+ }
+ }
+ return "SELECT " + Strings.join(",", fieldList) + " FROM (" + sql + ") tmp";
+ }
+
+ protected String assistSQLOriginList(String sql, List assistFields, Map dsMap, boolean crossDs) {
+ // get datasource prefix and suffix
+ String dsType = dsMap.entrySet().iterator().next().getValue().getType();
+ String prefix = "";
+ String suffix = "";
+ if (Arrays.stream(DatasourceConfiguration.DatasourceType.values()).map(DatasourceConfiguration.DatasourceType::getType).toList().contains(dsType)) {
+ DatasourceConfiguration.DatasourceType datasourceType = DatasourceConfiguration.DatasourceType.valueOf(dsType);
+ prefix = datasourceType.getPrefix();
+ suffix = datasourceType.getSuffix();
+ } else {
+ List xpackPluginsDatasourceVOS = pluginManage.queryPluginDs();
+ List list = xpackPluginsDatasourceVOS.stream().filter(ele -> StringUtils.equals(ele.getType(), dsType)).toList();
+ if (ObjectUtils.isNotEmpty(list)) {
+ XpackPluginsDatasourceVO first = list.getFirst();
+ prefix = first.getPrefix();
+ suffix = first.getSuffix();
+ } else {
+ DEException.throwException("当前数据源插件不存在");
+ }
+ }
+
+ List fieldList = new ArrayList<>();
+ for (int i = 0; i < assistFields.size(); i++) {
+ ChartViewFieldDTO dto = assistFields.get(i);
+ if (StringUtils.equalsIgnoreCase(dto.getSummary(), "last_item")) {
+ if (crossDs) {
+ fieldList.add(dto.getOriginName());
} else {
- stringBuilder.append(dto.getSummary() + "(" + prefix + dto.getOriginName() + suffix + "),");
+ fieldList.add(prefix + dto.getOriginName() + suffix);
}
}
}
- return "SELECT " + stringBuilder + " FROM (" + sql + ") tmp";
+ return "SELECT " + Strings.join(",", fieldList) + " FROM (" + sql + ") tmp";
}
protected List mergeIds(List xAxisExt, List extStack) {
@@ -522,26 +566,29 @@ public class DefaultChartHandler extends AbstractChartPlugin {
if (CollectionUtils.isEmpty(data)) {
break;
}
- if (StringUtils.containsAny(chartType, "group", "stack")) {
+ if (Objects.isNull(extStack)) {
+ extStack = Arrays.asList();
+ }
+ if (Objects.isNull(xAxisExt)) {
+ xAxisExt = Arrays.asList();
+ }
+ boolean isStack = StringUtils.containsIgnoreCase(chartType, "stack") && CollectionUtils.isNotEmpty(extStack);
+ boolean isGroup = StringUtils.containsIgnoreCase(chartType, "group")
+ || (CollectionUtils.isNotEmpty(xAxisExt));
+ if (isStack || isGroup) {
if (CollectionUtils.isEmpty(xAxis)) {
break;
}
- if (StringUtils.containsIgnoreCase(chartType, "stack") && extStack.isEmpty()) {
- break;
- }
- if (StringUtils.containsIgnoreCase(chartType, "group") && xAxisExt.isEmpty()) {
- break;
- }
final Map mainIndexMap = new HashMap<>();
final List> mainMatrix = new ArrayList<>();
// 排除group和stack的字段
List groupStackAxisIds = mergeIds(xAxisExt, extStack);
- List finalXAxisBase = xAxis.stream().filter(ele->!groupStackAxisIds.contains(String.valueOf(ele.getId()))).toList();
- if (CollectionUtils.isEmpty(finalXAxisBase) && CollectionUtils.isNotEmpty(xAxis)) {
- finalXAxisBase.add(xAxis.get(0));
+ List xAxisBase = xAxis.stream().filter(ele -> !groupStackAxisIds.contains(String.valueOf(ele.getId()))).collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(xAxisBase) && CollectionUtils.isNotEmpty(xAxis)) {
+ xAxisBase.add(xAxis.get(0));
}
data.forEach(item -> {
- String[] mainAxisArr = Arrays.copyOfRange(item, 0, finalXAxisBase.size());
+ String[] mainAxisArr = Arrays.copyOfRange(item, 0, xAxisBase.size());
String mainAxis = StringUtils.join(mainAxisArr, '-');
Integer index = mainIndexMap.get(mainAxis);
if (index == null) {
@@ -555,21 +602,24 @@ public class DefaultChartHandler extends AbstractChartPlugin {
}
});
int finalDataIndex = dataIndex;
- int subEndIndex = finalXAxisBase.size();
- if (StringUtils.containsIgnoreCase(chartType, "group")) {
+ int subEndIndex = xAxisBase.size();
+ if (CollectionUtils.isNotEmpty(xAxisExt)
+ || StringUtils.containsIgnoreCase(chartType, "group")
+ || StringUtils.containsIgnoreCase(chartType, "-mix")) {
subEndIndex += xAxisExt.size();
}
if (StringUtils.containsIgnoreCase(chartType, "stack")) {
subEndIndex += extStack.size();
}
int finalSubEndIndex = subEndIndex;
+ // 存储上次的值
+ Map preDataMap = new HashMap<>();
//滑动累加
for (int k = 1; k < mainMatrix.size(); k++) {
List preDataItems = mainMatrix.get(k - 1);
List curDataItems = mainMatrix.get(k);
- Map preDataMap = new HashMap<>();
preDataItems.forEach(preDataItem -> {
- String[] groupStackAxisArr = Arrays.copyOfRange(preDataItem, finalXAxisBase.size(), finalSubEndIndex);
+ String[] groupStackAxisArr = Arrays.copyOfRange(preDataItem, xAxisBase.size(), finalSubEndIndex);
String groupStackAxis = StringUtils.join(groupStackAxisArr, '-');
String preVal = preDataItem[finalDataIndex];
if (StringUtils.isBlank(preVal)) {
@@ -578,13 +628,19 @@ public class DefaultChartHandler extends AbstractChartPlugin {
preDataMap.put(groupStackAxis, new BigDecimal(preVal));
});
curDataItems.forEach(curDataItem -> {
- String[] groupStackAxisArr = Arrays.copyOfRange(curDataItem, finalXAxisBase.size(), finalSubEndIndex);
+ String[] groupStackAxisArr = Arrays.copyOfRange(curDataItem, xAxisBase.size(), finalSubEndIndex);
String groupStackAxis = StringUtils.join(groupStackAxisArr, '-');
BigDecimal preValue = preDataMap.get(groupStackAxis);
if (preValue != null) {
curDataItem[finalDataIndex] = new BigDecimal(curDataItem[finalDataIndex])
.add(preValue)
.toString();
+ } else {
+ if (preDataMap.containsKey(groupStackAxis)) {
+ curDataItem[finalDataIndex] = new BigDecimal(curDataItem[finalDataIndex])
+ .add(preDataMap.get(groupStackAxis))
+ .toString();
+ }
}
});
}
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/YoyChartHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/YoyChartHandler.java
index d4af6b9..438d0af 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/YoyChartHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/YoyChartHandler.java
@@ -2,6 +2,7 @@ package io.gisbi.chart.charts.impl;
import com.fasterxml.jackson.core.type.TypeReference;
+import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.engine.sql.SQLProvider;
import io.gisbi.engine.trans.ExtWhere2Str;
import io.gisbi.engine.utils.Utils;
@@ -74,7 +75,7 @@ public class YoyChartHandler extends DefaultChartHandler {
dsList.add(next.getValue().getType());
}
boolean needOrder = Utils.isNeedOrder(dsList);
- boolean crossDs = Utils.isCrossDs(dsMap);
+ boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
// 这里拿到的可能有一年前的数据
var expandedResult = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
// 检查同环比过滤,拿到实际数据
@@ -86,6 +87,7 @@ public class YoyChartHandler extends DefaultChartHandler {
var originSql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
originSql = provider.rebuildSQL(originSql, sqlMeta, crossDs, dsMap);
var request = new DatasourceRequest();
+ request.setIsCross(crossDs);
request.setDsList(dsMap);
request.setQuery(originSql);
logger.debug("calcite yoy sql: " + originSql);
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/bar/BarHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/bar/BarHandler.java
index 7e83893..8510cb0 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/bar/BarHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/bar/BarHandler.java
@@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.bar;
+import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.YoyChartHandler;
import io.gisbi.engine.utils.Utils;
import io.gisbi.extensions.datasource.dto.DatasourceRequest;
@@ -8,6 +9,8 @@ import io.gisbi.extensions.datasource.model.SQLMeta;
import io.gisbi.extensions.datasource.provider.Provider;
import io.gisbi.extensions.view.dto.*;
import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
@@ -42,7 +45,7 @@ public class BarHandler extends YoyChartHandler {
dsList.add(next.getValue().getType());
}
boolean needOrder = Utils.isNeedOrder(dsList);
- boolean crossDs = Utils.isCrossDs(dsMap);
+ boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
try {
//如果有同环比过滤,应该用原始sql
@@ -52,13 +55,28 @@ public class BarHandler extends YoyChartHandler {
var assistFields = getAssistFields(dynamicAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest();
+ req.setIsCross(crossDs);
req.setDsList(dsMap);
- var assistSql = assistSQL(originSql, assistFields, dsMap);
- req.setQuery(assistSql);
- logger.debug("calcite assistSql sql: " + assistSql);
- var assistData = (List) provider.fetchResultField(req).get("data");
- result.setAssistData(assistData);
- result.setDynamicAssistFields(dynamicAssistFields);
+
+ List assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assists)) {
+ var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
+ req.setQuery(assistSql);
+ logger.debug("calcite assistSql sql: " + assistSql);
+ var assistData = (List) provider.fetchResultField(req).get("data");
+ result.setAssistData(assistData);
+ result.setDynamicAssistFields(assists);
+ }
+
+ List assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assistsOriginList)) {
+ var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
+ req.setQuery(assistSqlOriginList);
+ logger.debug("calcite assistSql sql origin list: " + assistSqlOriginList);
+ var assistDataOriginList = (List) provider.fetchResultField(req).get("data");
+ result.setAssistDataOriginList(assistDataOriginList);
+ result.setDynamicAssistFieldsOriginList(assistsOriginList);
+ }
}
} catch (Exception e) {
e.printStackTrace();
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/line/LineHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/line/LineHandler.java
index 5f90baa..1265f41 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/line/LineHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/line/LineHandler.java
@@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.line;
+import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.YoyChartHandler;
import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.extensions.datasource.dto.DatasourceRequest;
@@ -9,6 +10,8 @@ import io.gisbi.extensions.datasource.provider.Provider;
import io.gisbi.extensions.view.dto.*;
import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
@@ -55,6 +58,7 @@ public class LineHandler extends YoyChartHandler {
for (Map.Entry next : dsMap.entrySet()) {
dsList.add(next.getValue().getType());
}
+ boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
try {
//如果有同环比过滤,应该用原始sql
@@ -64,13 +68,28 @@ public class LineHandler extends YoyChartHandler {
var assistFields = getAssistFields(dynamicAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest();
+ req.setIsCross(crossDs);
req.setDsList(dsMap);
- var assistSql = assistSQL(originSql, assistFields, dsMap);
- req.setQuery(assistSql);
- logger.debug("calcite assistSql sql: " + assistSql);
- var assistData = (List) provider.fetchResultField(req).get("data");
- result.setAssistData(assistData);
- result.setDynamicAssistFields(dynamicAssistFields);
+
+ List assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assists)) {
+ var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
+ req.setQuery(assistSql);
+ logger.debug("calcite assistSql sql: " + assistSql);
+ var assistData = (List) provider.fetchResultField(req).get("data");
+ result.setAssistData(assistData);
+ result.setDynamicAssistFields(assists);
+ }
+
+ List assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assistsOriginList)) {
+ var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
+ req.setQuery(assistSqlOriginList);
+ logger.debug("calcite assistSql sql origin list: " + assistSqlOriginList);
+ var assistDataOriginList = (List) provider.fetchResultField(req).get("data");
+ result.setAssistDataOriginList(assistDataOriginList);
+ result.setDynamicAssistFieldsOriginList(assistsOriginList);
+ }
}
} catch (Exception e) {
e.printStackTrace();
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/line/StackAreaHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/line/StackAreaHandler.java
index 70b9a4f..fe67e90 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/line/StackAreaHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/line/StackAreaHandler.java
@@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.line;
+import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.YoyChartHandler;
import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.engine.utils.Utils;
@@ -11,6 +12,7 @@ import io.gisbi.extensions.view.dto.*;
import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
@@ -89,7 +91,7 @@ public class StackAreaHandler extends YoyChartHandler {
dsList.add(next.getValue().getType());
}
boolean needOrder = Utils.isNeedOrder(dsList);
- boolean crossDs = Utils.isCrossDs(dsMap);
+ boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
try {
//如果有同环比过滤,应该用原始sql
@@ -99,13 +101,28 @@ public class StackAreaHandler extends YoyChartHandler {
var assistFields = getAssistFields(dynamicAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest();
+ req.setIsCross(crossDs);
req.setDsList(dsMap);
- var assistSql = assistSQL(originSql, assistFields, dsMap);
- req.setQuery(assistSql);
- logger.debug("calcite assist sql: " + assistSql);
- var assistData = (List) provider.fetchResultField(req).get("data");
- result.setAssistData(assistData);
- result.setDynamicAssistFields(dynamicAssistFields);
+
+ List assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assists)) {
+ var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
+ req.setQuery(assistSql);
+ logger.debug("calcite assistSql sql: " + assistSql);
+ var assistData = (List) provider.fetchResultField(req).get("data");
+ result.setAssistData(assistData);
+ result.setDynamicAssistFields(assists);
+ }
+
+ List assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assistsOriginList)) {
+ var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
+ req.setQuery(assistSqlOriginList);
+ logger.debug("calcite assistSql sql origin list: " + assistSqlOriginList);
+ var assistDataOriginList = (List) provider.fetchResultField(req).get("data");
+ result.setAssistDataOriginList(assistDataOriginList);
+ result.setDynamicAssistFieldsOriginList(assistsOriginList);
+ }
}
} catch (Exception e) {
e.printStackTrace();
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/map/SymbolicMapHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/map/SymbolicMapHandler.java
index b19f87a..30ed621 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/map/SymbolicMapHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/map/SymbolicMapHandler.java
@@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.map;
+import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.GroupChartHandler;
import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.dataset.manage.DatasetDataManage;
@@ -60,22 +61,23 @@ public class SymbolicMapHandler extends GroupChartHandler {
boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap);
DatasourceRequest datasourceRequest = new DatasourceRequest();
+ datasourceRequest.setIsCross(((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross());
datasourceRequest.setDsList(dsMap);
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var extBubble = formatResult.getAxisMap().get(ChartAxis.extBubble);
var allFields = (List) filterResult.getContext().get("allFields");
- List countField =chartViewManege.transFieldDTO(Collections.singletonList(chartViewManege.createCountField(view.getTableId())));
+ List countField = chartViewManege.transFieldDTO(Collections.singletonList(chartViewManege.createCountField(view.getTableId())));
List datasetTableFieldDTOList = FieldUtil.transFields(allFields);
SQLMeta sqlMeta1 = new SQLMeta();
BeanUtils.copyBean(sqlMeta1, sqlMeta);
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, datasetTableFieldDTOList, crossDs, dsMap, Utils.getParams(datasetTableFieldDTOList), view.getCalParams(), pluginManage);
List yAxis = new ArrayList<>();
- if(!extBubble.isEmpty() && !"*".equals(extBubble.get(0).getDataeaseName())){
+ if (!extBubble.isEmpty() && !"*".equals(extBubble.get(0).getGisbiName())) {
yAxis.addAll(extBubble);
}
yAxis.addAll(countField);
datasetTableFieldDTOList.addAll(FieldUtil.transFields(countField));
- formatResult.getAxisMap().put(ChartAxis.yAxis,countField);
+ formatResult.getAxisMap().put(ChartAxis.yAxis, countField);
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, datasetTableFieldDTOList, crossDs, dsMap, Utils.getParams(datasetTableFieldDTOList), view.getCalParams(), pluginManage);
String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap);
@@ -102,6 +104,7 @@ public class SymbolicMapHandler extends GroupChartHandler {
logger.debug("calcite data preview sql: " + querySQL);
// 调用数据源的calcite获得data
DatasourceRequest datasourceRequest1 = new DatasourceRequest();
+ datasourceRequest1.setIsCross(((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross());
datasourceRequest1.setQuery(querySQL);
datasourceRequest1.setDsList(dsMap);
detailData = (List) provider.fetchResultField(datasourceRequest1).get("data");
@@ -115,7 +118,7 @@ public class SymbolicMapHandler extends GroupChartHandler {
calcResult.setContext(filterResult.getContext());
calcResult.setQuerySql(querySql);
calcResult.setOriginData(data);
- formatResult.getAxisMap().put(ChartAxis.yAxis,new ArrayList<>());
+ formatResult.getAxisMap().put(ChartAxis.yAxis, new ArrayList<>());
return calcResult;
}
@@ -142,8 +145,8 @@ public class SymbolicMapHandler extends GroupChartHandler {
dataMap.putAll(calcResult.getData());
dataMap.putAll(mapTableNormal);
dataMap.put("sourceFields", allFields);
- mergeAssistField(calcResult.getDynamicAssistFields(), calcResult.getAssistData());
- dataMap.put("dynamicAssistLines", calcResult.getDynamicAssistFields());
+ List chartSeniorAssistDTOS = mergeAssistField(calcResult.getDynamicAssistFields(), calcResult.getAssistData(), calcResult.getDynamicAssistFieldsOriginList(), calcResult.getAssistDataOriginList());
+ dataMap.put("dynamicAssistLines", chartSeniorAssistDTOS);
view.setData(dataMap);
view.setSql(Base64.getEncoder().encodeToString(calcResult.getQuerySql().getBytes()));
view.setDrill(isDrill);
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/mix/MixHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/mix/MixHandler.java
index 9977cee..bd538c0 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/mix/MixHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/mix/MixHandler.java
@@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.mix;
+import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.YoyChartHandler;
import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.engine.utils.Utils;
@@ -10,6 +11,7 @@ import io.gisbi.extensions.datasource.provider.Provider;
import io.gisbi.extensions.view.dto.*;
import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
@@ -80,7 +82,7 @@ public class MixHandler extends YoyChartHandler {
dsList.add(next.getValue().getType());
}
boolean needOrder = Utils.isNeedOrder(dsList);
- boolean crossDs = Utils.isCrossDs(dsMap);
+ boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
var leftResult = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
var dynamicAssistFields = getDynamicAssistFields(view);
try {
@@ -91,13 +93,28 @@ public class MixHandler extends YoyChartHandler {
var assistFields = getAssistFields(leftAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest();
+ req.setIsCross(crossDs);
req.setDsList(dsMap);
- var assistSql = assistSQL(originSql, assistFields, dsMap);
- req.setQuery(assistSql);
- logger.debug("calcite assistSql sql: " + assistSql);
- var assistData = (List) provider.fetchResultField(req).get("data");
- leftResult.setAssistData(assistData);
- leftResult.setDynamicAssistFields(leftAssistFields);
+
+ List assists = leftAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assists)) {
+ var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
+ req.setQuery(assistSql);
+ logger.debug("calcite assistSql sql: " + assistSql);
+ var assistData = (List) provider.fetchResultField(req).get("data");
+ leftResult.setAssistData(assistData);
+ leftResult.setDynamicAssistFields(assists);
+ }
+
+ List assistsOriginList = leftAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assistsOriginList)) {
+ var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
+ req.setQuery(assistSqlOriginList);
+ logger.debug("calcite assistSql sql origin list: " + assistSqlOriginList);
+ var assistDataOriginList = (List) provider.fetchResultField(req).get("data");
+ leftResult.setAssistDataOriginList(assistDataOriginList);
+ leftResult.setDynamicAssistFieldsOriginList(assistsOriginList);
+ }
}
} catch (Exception e) {
e.printStackTrace();
@@ -143,12 +160,28 @@ public class MixHandler extends YoyChartHandler {
var assistFields = getAssistFields(rightAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest();
+ req.setIsCross(crossDs);
req.setDsList(dsMap);
- var assistSql = assistSQL(originSql, assistFields, dsMap);
- req.setQuery(assistSql);
- var assistData = (List) provider.fetchResultField(req).get("data");
- rightResult.setAssistData(assistData);
- rightResult.setDynamicAssistFields(rightAssistFields);
+
+ List assists = rightAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assists)) {
+ var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
+ req.setQuery(assistSql);
+ logger.debug("calcite assistSql sql: " + assistSql);
+ var assistData = (List) provider.fetchResultField(req).get("data");
+ rightResult.setAssistData(assistData);
+ rightResult.setDynamicAssistFields(assists);
+ }
+
+ List assistsOriginList = rightAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assistsOriginList)) {
+ var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
+ req.setQuery(assistSqlOriginList);
+ logger.debug("calcite assistSql sql origin list: " + assistSqlOriginList);
+ var assistDataOriginList = (List) provider.fetchResultField(req).get("data");
+ rightResult.setAssistDataOriginList(assistDataOriginList);
+ rightResult.setDynamicAssistFieldsOriginList(assistsOriginList);
+ }
}
} catch (Exception e) {
e.printStackTrace();
@@ -169,12 +202,12 @@ public class MixHandler extends YoyChartHandler {
var leftFields = new ArrayList();
leftFields.addAll(formatResult.getAxisMap().get(ChartAxis.xAxis));
leftFields.addAll(formatResult.getAxisMap().get(ChartAxis.yAxis));
- mergeAssistField(leftCalcResult.getDynamicAssistFields(), leftCalcResult.getAssistData());
+ List chartSeniorAssistDTOSLeft = mergeAssistField(leftCalcResult.getDynamicAssistFields(), leftCalcResult.getAssistData(), leftCalcResult.getDynamicAssistFieldsOriginList(), leftCalcResult.getAssistDataOriginList());
var leftOriginData = leftCalcResult.getOriginData();
var leftTable = ChartDataBuild.transTableNormal(leftFields, view, leftOriginData, desensitizationList);
var leftData = new HashMap(leftTable);
leftData.putAll(leftCalcResult.getData());
- leftData.put("dynamicAssistLines", leftCalcResult.getDynamicAssistFields());
+ leftData.put("dynamicAssistLines", chartSeniorAssistDTOSLeft);
var rightCalcResult = (ChartCalcDataResult) calcResult.getData().get("right");
var rightFields = new ArrayList();
@@ -183,12 +216,12 @@ public class MixHandler extends YoyChartHandler {
rightFields.addAll(subAxisMap.get(ChartAxis.xAxis));
rightFields.addAll(subAxisMap.get(ChartAxis.yAxis));
- mergeAssistField(rightCalcResult.getDynamicAssistFields(), rightCalcResult.getAssistData());
+ List chartSeniorAssistDTOSRight = mergeAssistField(rightCalcResult.getDynamicAssistFields(), rightCalcResult.getAssistData(), rightCalcResult.getDynamicAssistFieldsOriginList(), rightCalcResult.getAssistDataOriginList());
var rightOriginData = rightCalcResult.getOriginData();
var rightTable = ChartDataBuild.transTableNormal(rightFields, view, rightOriginData, desensitizationList);
var rightData = new HashMap(rightTable);
rightData.putAll(rightCalcResult.getData());
- rightData.put("dynamicAssistLines", rightCalcResult.getDynamicAssistFields());
+ rightData.put("dynamicAssistLines", chartSeniorAssistDTOSRight);
// 构建结果
Map chartData = new TreeMap<>();
@@ -205,7 +238,7 @@ public class MixHandler extends YoyChartHandler {
var isDrill = CollectionUtils.isNotEmpty(drillFilters);
view.setDrillFilters(drillFilters);
view.setDrill(isDrill);
- view.setSql(leftCalcResult.getQuerySql());
+ view.setSql(Base64.getEncoder().encodeToString(leftCalcResult.getQuerySql().getBytes()));
view.setData(chartData);
return view;
}
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/numeric/NumericalChartHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/numeric/NumericalChartHandler.java
index 1b91c0c..2c6041a 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/numeric/NumericalChartHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/numeric/NumericalChartHandler.java
@@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.numeric;
+import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.DefaultChartHandler;
import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.engine.sql.SQLProvider;
@@ -33,6 +34,7 @@ public class NumericalChartHandler extends DefaultChartHandler {
boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap);
DatasourceRequest datasourceRequest = new DatasourceRequest();
+ datasourceRequest.setIsCross(((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross());
datasourceRequest.setDsList(dsMap);
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
@@ -67,14 +69,11 @@ public class NumericalChartHandler extends DefaultChartHandler {
String summary = (String) maxField.get("summary");
DatasetTableFieldDTO datasetTableField = datasetTableFieldManage.selectById(id);
if (ObjectUtils.isNotEmpty(datasetTableField)) {
- if (datasetTableField.getDeType() == 0 || datasetTableField.getDeType() == 1 || datasetTableField.getDeType() == 5) {
- if (!StringUtils.containsIgnoreCase(summary, "count")) {
- DEException.throwException(Translator.get("i18n_gauge_field_change"));
- }
- }
ChartViewFieldDTO dto = new ChartViewFieldDTO();
BeanUtils.copyBean(dto, datasetTableField);
- dto.setSummary(summary);
+ if (StringUtils.isEmpty(dto.getSummary())) {
+ dto.setSummary(summary);
+ }
return dto;
} else {
DEException.throwException(Translator.get("i18n_gauge_field_delete"));
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/pie/PieHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/pie/PieHandler.java
index a05cc7b..d4c50c6 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/pie/PieHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/pie/PieHandler.java
@@ -1,11 +1,15 @@
package io.gisbi.chart.charts.impl.pie;
import io.gisbi.chart.charts.impl.YoyChartHandler;
-import io.gisbi.extensions.view.dto.AxisFormatResult;
-import io.gisbi.extensions.view.dto.ChartAxis;
-import io.gisbi.extensions.view.dto.ChartViewDTO;
+import io.gisbi.extensions.view.dto.*;
import org.springframework.stereotype.Component;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
@Component
public class PieHandler extends YoyChartHandler {
@Override
@@ -26,4 +30,74 @@ public class PieHandler extends YoyChartHandler {
result.getAxisMap().put(ChartAxis.extTooltip, view.getExtTooltip());
return result;
}
+
+ @Override
+ public ChartViewDTO buildChart(ChartViewDTO view, ChartCalcDataResult calcResult, AxisFormatResult formatResult, CustomFilterResult filterResult) {
+ ChartViewDTO result = super.buildChart(view, calcResult, formatResult, filterResult);
+ filterPositiveData(result, "data", AxisChartDataAntVDTO.class);
+ filterPositiveData(result, "tableRow", Map.class, view.getYAxis().get(0).getGisbiName());
+ return result;
+ }
+
+ /**
+ * 过滤正数数据根据data
+ * @param result
+ * @param key
+ * @param clazz
+ * @param
+ */
+ private void filterPositiveData(ChartViewDTO result, String key, Class clazz) {
+ if (result.getData().containsKey(key)) {
+ List list = ((List) result.getData().get(key))
+ .stream()
+ .filter(item -> {
+ if (clazz == AxisChartDataAntVDTO.class) {
+ if (Objects.isNull(((AxisChartDataAntVDTO) item).getValue())) return false;
+ return ((AxisChartDataAntVDTO) item).getValue().compareTo(BigDecimal.ZERO) >= 0;
+ } else if (clazz == Map.class) {
+ return isPositive(((Map) item).get("value"));
+ }
+ return false;
+ })
+ .collect(Collectors.toList());
+ result.getData().put(key, list);
+ }
+ }
+
+ /**
+ * 过滤正数数据根据tableRow
+ * @param result
+ * @param key
+ * @param clazz
+ * @param yAxisName
+ * @param
+ */
+ private void filterPositiveData(ChartViewDTO result, String key, Class clazz, String yAxisName) {
+ if (result.getData().containsKey(key)) {
+ List list = ((List) result.getData().get(key))
+ .stream()
+ .filter(item -> {
+ if (clazz == Map.class) {
+ Object value = ((Map) item).get(yAxisName);
+ return isPositive(value);
+ }
+ return false;
+ })
+ .collect(Collectors.toList());
+ result.getData().put(key, list);
+ }
+ }
+
+ private boolean isPositive(Object value) {
+ if (value instanceof String) {
+ try {
+ return new BigDecimal((String) value).compareTo(BigDecimal.ZERO) >= 0;
+ } catch (NumberFormatException e) {
+ return false;
+ }
+ } else if (value instanceof BigDecimal) {
+ return ((BigDecimal) value).compareTo(BigDecimal.ZERO) >= 0;
+ }
+ return false;
+ }
}
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TableHeatmapHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TableHeatmapHandler.java
index dae3acf..1cfe918 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TableHeatmapHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TableHeatmapHandler.java
@@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.table;
+import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.DefaultChartHandler;
import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.engine.sql.SQLProvider;
@@ -55,6 +56,7 @@ public class TableHeatmapHandler extends DefaultChartHandler {
boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap);
DatasourceRequest datasourceRequest = new DatasourceRequest();
+ datasourceRequest.setIsCross(((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross());
datasourceRequest.setDsList(dsMap);
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TableInfoHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TableInfoHandler.java
index 2d08831..3b3ad7e 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TableInfoHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TableInfoHandler.java
@@ -1,6 +1,7 @@
package io.gisbi.chart.charts.impl.table;
import io.gisbi.api.chart.dto.PageInfo;
+import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.DefaultChartHandler;
import io.gisbi.engine.sql.SQLProvider;
import io.gisbi.engine.trans.Dimension2SQLObj;
@@ -65,6 +66,11 @@ public class TableInfoHandler extends DefaultChartHandler {
return (T) new CustomFilterResult(filterList, formatResult.getContext());
}
+ @Override
+ public Map buildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) {
+ return new HashMap<>();
+ }
+
@Override
public T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, Provider provider) {
var chartExtRequest = view.getChartExtRequest();
@@ -73,8 +79,9 @@ public class TableInfoHandler extends DefaultChartHandler {
for (Map.Entry next : dsMap.entrySet()) {
dsList.add(next.getValue().getType());
}
- boolean crossDs = Utils.isCrossDs(dsMap);
+ boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
DatasourceRequest datasourceRequest = new DatasourceRequest();
+ datasourceRequest.setIsCross(crossDs);
datasourceRequest.setDsList(dsMap);
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var allFields = (List) filterResult.getContext().get("allFields");
@@ -150,12 +157,28 @@ public class TableInfoHandler extends DefaultChartHandler {
if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest();
req.setDsList(dsMap);
- var assistSql = assistSQL(querySql, assistFields, dsMap);
- req.setQuery(assistSql);
- logger.debug("calcite assistSql sql: " + assistSql);
- var assistData = (List) provider.fetchResultField(req).get("data");
- calcResult.setAssistData(assistData);
- calcResult.setDynamicAssistFields(dynamicAssistFields);
+
+ List assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assists)) {
+ var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
+ var tmpSql = provider.rebuildSQL(assistSql, sqlMeta, crossDs, dsMap);
+ req.setQuery(tmpSql);
+ logger.debug("calcite assistSql sql: " + tmpSql);
+ var assistData = (List) provider.fetchResultField(req).get("data");
+ calcResult.setAssistData(assistData);
+ calcResult.setDynamicAssistFields(assists);
+ }
+
+ List assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assistsOriginList)) {
+ var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
+ var tmpSql = provider.rebuildSQL(assistSqlOriginList, sqlMeta, crossDs, dsMap);
+ req.setQuery(tmpSql);
+ logger.debug("calcite assistSql sql origin list: " + tmpSql);
+ var assistDataOriginList = (List) provider.fetchResultField(req).get("data");
+ calcResult.setAssistDataOriginList(assistDataOriginList);
+ calcResult.setDynamicAssistFieldsOriginList(assistsOriginList);
+ }
}
} catch (Exception e) {
e.printStackTrace();
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TableNormalHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TableNormalHandler.java
index 7fb8135..d6b0f12 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TableNormalHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TableNormalHandler.java
@@ -1,49 +1,213 @@
package io.gisbi.chart.charts.impl.table;
-import io.gisbi.chart.charts.impl.YoyChartHandler;
+import com.fasterxml.jackson.core.type.TypeReference;
+import io.gisbi.api.chart.dto.PageInfo;
+import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
+import io.gisbi.chart.charts.impl.DefaultChartHandler;
+import io.gisbi.engine.sql.SQLProvider;
+import io.gisbi.engine.trans.Dimension2SQLObj;
+import io.gisbi.engine.trans.ExtWhere2Str;
+import io.gisbi.engine.trans.Quota2SQLObj;
+import io.gisbi.engine.utils.Utils;
import io.gisbi.extensions.datasource.dto.DatasourceRequest;
import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO;
import io.gisbi.extensions.datasource.model.SQLMeta;
import io.gisbi.extensions.datasource.provider.Provider;
import io.gisbi.extensions.view.dto.*;
+import io.gisbi.extensions.view.util.ChartDataUtil;
+import io.gisbi.extensions.view.util.FieldUtil;
+import io.gisbi.utils.JsonUtil;
import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
/**
* @author jianneng
* @date 2024/9/11 11:37
**/
@Component
-public class TableNormalHandler extends YoyChartHandler {
+public class TableNormalHandler extends DefaultChartHandler {
@Getter
- private String type = "table-normal";
+ private final String type = "table-normal";
+
+ @Override
+ public T customFilter(ChartViewDTO view, List filterList, AxisFormatResult formatResult) {
+ var chartExtRequest = view.getChartExtRequest();
+ Map mapAttr = view.getCustomAttr();
+ Map basicStyle = (Map) mapAttr.get("basicStyle");
+ var tablePageMode = (String) basicStyle.get("tablePageMode");
+ formatResult.getContext().put("tablePageMode", tablePageMode);
+ if (StringUtils.equalsIgnoreCase(tablePageMode, "page")) {
+ if (chartExtRequest.getGoPage() == null) {
+ chartExtRequest.setGoPage(1L);
+ }
+ if (chartExtRequest.getPageSize() == null) {
+ int pageSize = (int) basicStyle.get("tablePageSize");
+ if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
+ chartExtRequest.setPageSize(Math.min(pageSize, view.getResultCount().longValue()));
+ } else {
+ chartExtRequest.setPageSize((long) pageSize);
+ }
+ }
+ } else {
+ if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
+ chartExtRequest.setGoPage(1L);
+ chartExtRequest.setPageSize(view.getResultCount().longValue());
+ } else if (!view.getIsExcelExport()) {
+ chartExtRequest.setGoPage(null);
+ chartExtRequest.setPageSize(null);
+ }
+ }
+ var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
+ String originFilterJson = (String) JsonUtil.toJSONString(filterList);
+ List originFilter = JsonUtil.parseList(originFilterJson, new TypeReference<>() {
+ });
+ boolean yoyFiltered = checkYoyFilter(originFilter, yAxis);
+ if (yoyFiltered) {
+ formatResult.getContext().put("expandedFilter", originFilter);
+ formatResult.getContext().put("yoyFiltered", true);
+ }
+ return (T) new CustomFilterResult(filterList, formatResult.getContext());
+ }
+
+ @Override
+ public Map buildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) {
+ return new HashMap<>();
+ }
@Override
public T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, Provider provider) {
+ var chartExtRequest = view.getChartExtRequest();
var dsMap = (Map) sqlMap.get("dsMap");
- var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
+ List dsList = new ArrayList<>();
+ for (Map.Entry next : dsMap.entrySet()) {
+ dsList.add(next.getValue().getType());
+ }
+ boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
+ DatasourceRequest datasourceRequest = new DatasourceRequest();
+ datasourceRequest.setIsCross(crossDs);
+ datasourceRequest.setDsList(dsMap);
+ var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
+ var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
+
+ var allFields = (List) filterResult.getContext().get("allFields");
+ PageInfo pageInfo = new PageInfo();
+ pageInfo.setGoPage(chartExtRequest.getGoPage());
+ if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
+ pageInfo.setPageSize(Math.min(view.getResultCount() - (chartExtRequest.getGoPage() - 1) * chartExtRequest.getPageSize(), chartExtRequest.getPageSize()));
+ } else {
+ pageInfo.setPageSize(chartExtRequest.getPageSize());
+ }
+ Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
+ Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
+ String originSql = SQLProvider.createQuerySQL(sqlMeta, true, !StringUtils.equalsIgnoreCase(dsMap.values().iterator().next().getType(), "es"), view);// 分页强制加排序
+ String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " OFFSET " + (pageInfo.getGoPage() - 1) * chartExtRequest.getPageSize() : "");
+ var querySql = originSql + limit;
+
+ var tablePageMode = (String) filterResult.getContext().get("tablePageMode");
+ var totalPageSql = "SELECT COUNT(*) FROM (" + SQLProvider.createQuerySQLNoSort(sqlMeta, true, view) + ") COUNT_TEMP";
+ if (StringUtils.isNotEmpty(totalPageSql) && StringUtils.equalsIgnoreCase(tablePageMode, "page")) {
+ totalPageSql = provider.rebuildSQL(totalPageSql, sqlMeta, crossDs, dsMap);
+ datasourceRequest.setQuery(totalPageSql);
+ datasourceRequest.setTotalPageFlag(true);
+ logger.debug("calcite total sql: " + totalPageSql);
+ List tmpData = (List) provider.fetchResultField(datasourceRequest).get("data");
+ var totalItems = ObjectUtils.isEmpty(tmpData) ? 0 : Long.valueOf(tmpData.get(0)[0]);
+ if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
+ totalItems = totalItems <= view.getResultCount() ? totalItems : view.getResultCount();
+ }
+ var totalPage = (totalItems / pageInfo.getPageSize()) + (totalItems % pageInfo.getPageSize() > 0 ? 1 : 0);
+ view.setTotalItems(totalItems);
+ view.setTotalPage(totalPage);
+ }
+
+ querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap);
+ datasourceRequest.setQuery(querySql);
+ logger.debug("calcite chart sql: " + querySql);
+ List data = (List) provider.fetchResultField(datasourceRequest).get("data");
+ //自定义排序
+ data = ChartDataUtil.resultCustomSort(xAxis, yAxis, view.getSortPriority(), data);
+
+ var yoyFiltered = filterResult.getContext().get("yoyFiltered") != null;
+ if (yoyFiltered) {
+ // 这里没加分页,因为加了分页参数可能会把原始数据挤出去
+ var expandedFilter = (List) filterResult.getContext().get("expandedFilter");
+ ExtWhere2Str.extWhere2sqlOjb(sqlMeta, expandedFilter, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
+ var expandedSql = SQLProvider.createQuerySQL(sqlMeta, true, !StringUtils.equalsIgnoreCase(dsMap.values().iterator().next().getType(), "es"), view);
+ expandedSql = provider.rebuildSQL(expandedSql, sqlMeta, crossDs, dsMap);
+ var expandedReq = new DatasourceRequest();
+ expandedReq.setIsCross(crossDs);
+ expandedReq.setDsList(dsMap);
+ expandedReq.setQuery(expandedSql);
+ logger.debug("expanded sql: " + expandedSql);
+ var expandedData = (List) provider.fetchResultField(expandedReq).get("data");
+ logger.debug("expanded data: " + expandedData);
+ quickCalc(xAxis, yAxis, Collections.emptyList(), Collections.emptyList(), view.getType(), expandedData);
+ var resultData = new ArrayList();
+ for (String[] originDataLine : data) {
+ var originDim = new StringBuilder();
+ for (int i = 0; i < xAxis.size(); i++) {
+ originDim.append(originDataLine[i]);
+ }
+ for (String[] expandedDataLine : expandedData) {
+ var expandedDim = new StringBuilder();
+ for (int i = 0; i < xAxis.size(); i++) {
+ expandedDim.append(expandedDataLine[i]);
+ }
+ if (StringUtils.equals(originDim, expandedDim)) {
+ resultData.add(expandedDataLine);
+ break;
+ }
+ }
+ }
+ data = resultData;
+ } else {
+ quickCalc(xAxis, yAxis, Collections.emptyList(), Collections.emptyList(), view.getType(), data);
+ }
+ //数据重组逻辑可重载
+ var result = this.buildResult(view, formatResult, filterResult, data);
+ T calcResult = (T) new ChartCalcDataResult();
+ calcResult.setData(result);
+ calcResult.setContext(filterResult.getContext());
+ calcResult.setQuerySql(querySql);
+ calcResult.setOriginData(data);
try {
- var originSql = result.getQuerySql();
var dynamicAssistFields = getDynamicThresholdFields(view);
- var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
- var assistFields = getAssistFields(dynamicAssistFields, yAxis);
+ var assistFields = getAssistFields(dynamicAssistFields, yAxis, xAxis);
if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest();
+ req.setIsCross(crossDs);
req.setDsList(dsMap);
- var assistSql = assistSQL(originSql, assistFields, dsMap);
- req.setQuery(assistSql);
- logger.debug("calcite assistSql sql: " + assistSql);
- var assistData = (List) provider.fetchResultField(req).get("data");
- result.setAssistData(assistData);
- result.setDynamicAssistFields(dynamicAssistFields);
+
+ List assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assists)) {
+ var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
+ var tmpSql = provider.rebuildSQL(assistSql, sqlMeta, crossDs, dsMap);
+ req.setQuery(tmpSql);
+ logger.debug("calcite assistSql sql: " + tmpSql);
+ var assistData = (List) provider.fetchResultField(req).get("data");
+ calcResult.setAssistData(assistData);
+ calcResult.setDynamicAssistFields(assists);
+ }
+
+ List assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assistsOriginList)) {
+ var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
+ var tmpSql = provider.rebuildSQL(assistSqlOriginList, sqlMeta, crossDs, dsMap);
+ req.setQuery(tmpSql);
+ logger.debug("calcite assistSql sql origin list: " + tmpSql);
+ var assistDataOriginList = (List) provider.fetchResultField(req).get("data");
+ calcResult.setAssistDataOriginList(assistDataOriginList);
+ calcResult.setDynamicAssistFieldsOriginList(assistsOriginList);
+ }
}
} catch (Exception e) {
e.printStackTrace();
}
- return result;
+ return calcResult;
}
}
diff --git a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TablePivotHandler.java b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TablePivotHandler.java
index b7bcd76..13f3b48 100644
--- a/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TablePivotHandler.java
+++ b/core/core-backend/src/main/java/io/gisbi/chart/charts/impl/table/TablePivotHandler.java
@@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.table;
+import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.GroupChartHandler;
import io.gisbi.constant.DeTypeConstants;
import io.gisbi.engine.constant.ExtFieldConstant;
@@ -18,6 +19,7 @@ import io.gisbi.utils.IDUtils;
import io.gisbi.utils.JsonUtil;
import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import reactor.util.function.Tuple2;
@@ -34,7 +36,8 @@ public class TablePivotHandler extends GroupChartHandler {
@Override
public T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, Provider provider) {
T result = super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
- Map customCalc = calcCustomExpr(view, filterResult, sqlMap, sqlMeta, provider);
+ Map customCalc = calcCustomExpr(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
+ boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
result.getData().put("customCalc", customCalc);
try {
var dsMap = (Map) sqlMap.get("dsMap");
@@ -44,13 +47,28 @@ public class TablePivotHandler extends GroupChartHandler {
var assistFields = getAssistFields(dynamicAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest();
+ req.setIsCross(crossDs);
req.setDsList(dsMap);
- var assistSql = assistSQL(originSql, assistFields, dsMap);
- req.setQuery(assistSql);
- logger.debug("calcite assistSql sql: " + assistSql);
- var assistData = (List) provider.fetchResultField(req).get("data");
- result.setAssistData(assistData);
- result.setDynamicAssistFields(dynamicAssistFields);
+
+ List assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assists)) {
+ var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
+ req.setQuery(assistSql);
+ logger.debug("calcite assistSql sql: " + assistSql);
+ var assistData = (List) provider.fetchResultField(req).get("data");
+ result.setAssistData(assistData);
+ result.setDynamicAssistFields(assists);
+ }
+
+ List assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
+ if (ObjectUtils.isNotEmpty(assistsOriginList)) {
+ var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
+ req.setQuery(assistSqlOriginList);
+ logger.debug("calcite assistSql sql origin list: " + assistSqlOriginList);
+ var assistDataOriginList = (List) provider.fetchResultField(req).get("data");
+ result.setAssistDataOriginList(assistDataOriginList);
+ result.setDynamicAssistFieldsOriginList(assistsOriginList);
+ }
}
} catch (Exception e) {
e.printStackTrace();
@@ -58,7 +76,18 @@ public class TablePivotHandler extends GroupChartHandler {
return result;
}
- private Map calcCustomExpr(ChartViewDTO view, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, Provider provider) {
+ @Override
+ public Map buildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) {
+ var result = new HashMap();
+ var yoyFiltered = filterResult.getContext().get("yoyFiltered") != null;
+ // 带过滤同环比直接返回原始数据,再由视图重新组装
+ if (yoyFiltered) {
+ result.put("data", data);
+ }
+ return result;
+ }
+
+ private Map calcCustomExpr(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, Provider provider) {
Object totalStr = JsonUtil.toJSONString(view.getCustomAttr().get("tableTotal"));
TableTotal tableTotal = JsonUtil.parseObject((String) totalStr, TableTotal.class);
var dsMap = (Map) sqlMap.get("dsMap");
@@ -67,7 +96,7 @@ public class TablePivotHandler extends GroupChartHandler {
dsList.add(next.getValue().getType());
}
boolean needOrder = Utils.isNeedOrder(dsList);
- boolean crossDs = Utils.isCrossDs(dsMap);
+ boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDsList(dsMap);
var allFields = (List) filterResult.getContext().get("allFields");
@@ -178,7 +207,7 @@ public class TablePivotHandler extends GroupChartHandler {
var tmpData = new HashMap();
for (int i = 0; i < yAxis.size(); i++) {
var a = yAxis.get(i);
- tmpData.put(a.getDataeaseName(), data.getFirst()[i]);
+ tmpData.put(a.getGisbiName(), data.getFirst()[i]);
}
tmp.put("data", tmpData);
tmp.put("sql", Base64.getEncoder().encodeToString(querySql.getBytes()));
@@ -208,8 +237,8 @@ public class TablePivotHandler extends GroupChartHandler {
}
}
// 列总计里面的行小计
- if (col.isShowGrandTotals() && row.isShowGrandTotals() && rowAxis.size() >= 2) {
- var yAxis = getCustomFields(view, row.getCalcTotals().getCfg());
+ if (col.isShowGrandTotals() && row.isShowSubTotals() && rowAxis.size() >= 2) {
+ var yAxis = getCustomFields(view, row.getCalcSubTotals().getCfg());
if (!yAxis.isEmpty()) {
var tmpData = new ArrayList