diff --git a/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinitionRequest.java b/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinitionRequest.java index ef07542903..6f403541f5 100644 --- a/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinitionRequest.java +++ b/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinitionRequest.java @@ -1,16 +1,15 @@ package io.dataease.controller.request.datasource; -import com.google.gson.JsonObject; +import com.alibaba.fastjson.JSONObject; import lombok.Data; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @Data public class ApiDefinitionRequest { private List> headers = new ArrayList<>(); - private Map body = new HashMap<>(); + private JSONObject body = new JSONObject(); private AuthManager authManager = new AuthManager(); diff --git a/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java b/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java index 8953615172..e592d2c5a2 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java @@ -5,8 +5,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; -import com.google.gson.*; -import com.google.gson.reflect.TypeToken; +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import io.dataease.controller.sys.response.BasicInfo; import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.plugins.common.dto.datasource.TableDesc; @@ -161,11 +162,12 @@ public class ApiProvider extends Provider { if (StringUtils.equalsAny(type, "Form_Data", "WWW_FORM")) { if (apiDefinitionRequest.getBody().get("kvs") != null) { Map body = new HashMap<>(); - JsonArray kvsArr = JsonParser.parseString(apiDefinitionRequest.getBody().get("kvs").toString()).getAsJsonArray(); + JSONObject bodyObj = JSONObject.parseObject(apiDefinitionRequest.getBody().toString()); + JSONArray kvsArr = bodyObj.getJSONArray("kvs"); for (int i = 0; i < kvsArr.size(); i++) { - JsonObject kv = kvsArr.get(i).getAsJsonObject(); - if (kv.get("name") != null) { - body.put(kv.get("name").getAsString(), kv.get("value").getAsString()); + JSONObject kv = kvsArr.getJSONObject(i); + if (kv.containsKey("name")) { + body.put(kv.getString("name"), kv.getString("value")); } } response = HttpClientUtil.post(apiDefinition.getUrl(), body, httpClientConfig); @@ -195,6 +197,14 @@ public class ApiProvider extends Provider { rootPath = "$"; handleStr(apiDefinition, response, fields, rootPath); } + for (JSONObject field : fields) { + if(field.containsKey("children") && CollectionUtils.isNotEmpty(field.getJSONArray("children"))){ + field.put("disabled", false); + } + if(field.containsKey("children") && CollectionUtils.isEmpty(field.getJSONArray("children"))){ + field.put("disabled", true); + } + } apiDefinition.setJsonFields(fields); return apiDefinition; } @@ -216,14 +226,14 @@ public class ApiProvider extends Provider { try { JSONArray jsonArray = jsonObject.getJSONArray(s); List childrenField = new ArrayList<>(); - for (Object object: jsonArray) { + for (Object object : jsonArray) { JSONObject.parseObject(object.toString()); handleStr(apiDefinition, JSON.toJSONString(object, SerializerFeature.WriteMapNullValue), childrenField, rootPath + "." + s + "[*]"); } o.put("children", childrenField); o.put("childrenDataType", "LIST"); - }catch (Exception e){ + } catch (Exception e) { JSONArray array = new JSONArray(); array.add(StringUtils.isNotEmpty(jsonObject.getString(s)) ? jsonObject.getString(s) : ""); o.put("value", array); @@ -295,11 +305,11 @@ public class ApiProvider extends Provider { } - static void mergeField(JSONObject field, JSONObject item){ - if(item.getJSONArray("children") != null ){ + static void mergeField(JSONObject field, JSONObject item) { + if (item.getJSONArray("children") != null) { JSONArray itemChildren = item.getJSONArray("children"); JSONArray fieldChildren = field.getJSONArray("children"); - if(fieldChildren == null){ + if (fieldChildren == null) { fieldChildren = new JSONArray(); } for (Object itemChild : itemChildren) { @@ -307,12 +317,12 @@ public class ApiProvider extends Provider { JSONObject itemChildObject = JSONObject.parseObject(itemChild.toString()); for (Object fieldChild : fieldChildren) { JSONObject fieldChildObject = JSONObject.parseObject(fieldChild.toString()); - if(itemChildObject.getString("jsonPath").equals(fieldChildObject.getString("jsonPath"))){ + if (itemChildObject.getString("jsonPath").equals(fieldChildObject.getString("jsonPath"))) { mergeField(fieldChildObject, itemChildObject); hasKey = true; } } - if(!hasKey){ + if (!hasKey) { fieldChildren.add(itemChild); } } @@ -325,7 +335,7 @@ public class ApiProvider extends Provider { array.add(item.getJSONArray("value").get(0).toString()); field.put("value", array); } - if(CollectionUtils.isNotEmpty(field.getJSONArray("children"))&& CollectionUtils.isNotEmpty(item.getJSONArray("children"))){ + if (CollectionUtils.isNotEmpty(field.getJSONArray("children")) && CollectionUtils.isNotEmpty(item.getJSONArray("children"))) { JSONArray fieldChildren = field.getJSONArray("children"); JSONArray itemChildren = item.getJSONArray("children"); @@ -335,11 +345,11 @@ public class ApiProvider extends Provider { JSONObject find = null; for (Object itemChild : itemChildren) { JSONObject itemObject = JSONObject.parseObject(itemChild.toString()); - if(jsonObject.getString("jsonPath").equals(itemObject.getString("jsonPath"))){ + if (jsonObject.getString("jsonPath").equals(itemObject.getString("jsonPath"))) { find = itemObject; } } - if(find != null){ + if (find != null) { mergeValue(jsonObject, apiDefinition, find); } fieldArrayChildren.add(jsonObject); diff --git a/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java index 90d47de82d..2ea6ff8c10 100644 --- a/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java @@ -1244,7 +1244,13 @@ public class SqlserverQueryProvider extends QueryProvider { } else { if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) { String convert = String.format(SqlServerSQLConstants.CONVERT, y.getDeType() == DeTypeConstants.DE_INT ? SqlServerSQLConstants.DEFAULT_INT_FORMAT : SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT, originField); - String agg = String.format(SqlServerSQLConstants.AGG_FIELD, y.getSummary(), convert); + String summary = y.getSummary(); + if (StringUtils.equalsIgnoreCase(y.getSummary(), "stddev_pop")) { + summary = "STDEVP"; + } else if (StringUtils.equalsIgnoreCase(y.getSummary(), "var_pop")) { + summary = "VARP"; + } + String agg = String.format(SqlServerSQLConstants.AGG_FIELD, summary, convert); fieldName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT, agg); } else { String convert = String.format(SqlServerSQLConstants.CONVERT, y.getDeType() == 2 ? SqlServerSQLConstants.DEFAULT_INT_FORMAT : SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT, originField); diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 867e0e0ccf..e29cf1e558 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -465,7 +465,7 @@ public class ChartViewService { } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.SQL.name())) { String sql = dataTableInfoDTO.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfoDTO.getSql())) : dataTableInfoDTO.getSql(); - sql = handleVariable(sql, requestList, qp, table); + sql = handleVariable(sql, requestList, qp, table, ds); if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { @@ -874,7 +874,7 @@ public class ChartViewService { } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.SQL.name())) { String sql = dataTableInfoDTO.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfoDTO.getSql())) : dataTableInfoDTO.getSql(); - sql = handleVariable(sql, requestList, qp, table); + sql = handleVariable(sql, requestList, qp, table, ds); if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { @@ -1590,7 +1590,7 @@ public class ChartViewService { chartViewMapper.updateByPrimaryKeySelective(chartView); } - private String handleVariable(String sql, ChartExtRequest requestList, QueryProvider qp, DataSetTableDTO table) throws Exception { + private String handleVariable(String sql, ChartExtRequest requestList, QueryProvider qp, DataSetTableDTO table, Datasource ds) throws Exception { List sqlVariables = new Gson().fromJson(table.getSqlVariableDetails(), new TypeToken>() { }.getType()); @@ -1614,7 +1614,7 @@ public class ChartViewService { } } } - sql = dataSetTableService.removeVariables(sql); + sql = dataSetTableService.removeVariables(sql, ds.getType()); return sql; } diff --git a/backend/src/main/java/io/dataease/service/chart/ViewPluginBaseServiceImpl.java b/backend/src/main/java/io/dataease/service/chart/ViewPluginBaseServiceImpl.java index 9e5cad8efa..a1160b5f42 100644 --- a/backend/src/main/java/io/dataease/service/chart/ViewPluginBaseServiceImpl.java +++ b/backend/src/main/java/io/dataease/service/chart/ViewPluginBaseServiceImpl.java @@ -113,7 +113,7 @@ public class ViewPluginBaseServiceImpl implements ViewPluginBaseService { break; case SQL: String sql = dataTableInfoDTO.isBase64Encryption()? new String(java.util.Base64.getDecoder().decode(dataTableInfoDTO.getSql())): dataTableInfoDTO.getSql(); - tableName = dataSetTableService.handleVariableDefaultValue( sql, null); + tableName = dataSetTableService.handleVariableDefaultValue(sql, null, pluginViewSet.getDsType()); tableName = "(" + sqlFix(tableName) + ")"; break; diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 0baac40d72..219e7f8a34 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -673,7 +673,7 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); DataTableInfoDTO dataTableInfo = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); String sql = dataTableInfo.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfo.getSql())) : dataTableInfo.getSql(); - sql = handleVariableDefaultValue(sql, null); + sql = handleVariableDefaultValue(sql, null, ds.getType()); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); datasourceRequest.setQuery( qp.createQuerySQLWithPage(sql, fields, page, pageSize, realSize, false, null, rowPermissionsTree)); @@ -1002,14 +1002,14 @@ public class DataSetTableService { } - public void checkVariable(final String sql) throws Exception { - String tmpSql = removeVariables(sql); + public void checkVariable(final String sql, String dsType) throws Exception { + String tmpSql = removeVariables(sql, dsType); if (tmpSql.contains(SubstitutedParams)) { throw new Exception(Translator.get("I18N_SQL_variable_limit")); } } - public String handleVariableDefaultValue(String sql, String sqlVariableDetails) { + public String handleVariableDefaultValue(String sql, String sqlVariableDetails, String dsType) { if (StringUtils.isEmpty(sql)) { DataEaseException.throwException(Translator.get("i18n_sql_not_empty")); } @@ -1033,14 +1033,14 @@ public class DataSetTableService { } try { - sql = removeVariables(sql); + sql = removeVariables(sql, dsType); } catch (Exception e) { e.printStackTrace(); } return sql; } - public String removeVariables(String sql) throws Exception { + public String removeVariables(String sql, String dsType) throws Exception { Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(sql); boolean hasVariables = false; @@ -1060,15 +1060,19 @@ public class DataSetTableService { if (fromItem instanceof SubSelect) { SelectBody selectBody = ((SubSelect) fromItem).getSelectBody(); SubSelect subSelect = new SubSelect(); - Select subSelectTmp = (Select) CCJSqlParserUtil.parse(removeVariables(selectBody.toString())); + Select subSelectTmp = (Select) CCJSqlParserUtil.parse(removeVariables(selectBody.toString(), dsType)); PlainSelect subPlainSelect = ((PlainSelect) subSelectTmp.getSelectBody()); subSelect.setSelectBody(subPlainSelect); - subSelect.setAlias(new Alias(fromItem.getAlias().toString())); + if(dsType.equals(DatasourceTypes.oracle.getType())){ + subSelect.setAlias(new Alias(fromItem.getAlias().toString(), false)); + }else { + subSelect.setAlias(new Alias(fromItem.getAlias().toString())); + } plainSelect.setFromItem(subSelect); } Expression expr = plainSelect.getWhere(); if (expr == null) { - return handleWith(plainSelect, select); + return handleWith(plainSelect, select, dsType); } StringBuilder stringBuilder = new StringBuilder(); BinaryExpression binaryExpression = null; @@ -1082,17 +1086,17 @@ public class DataSetTableService { expr.accept(getExpressionDeParser(stringBuilder)); } plainSelect.setWhere(CCJSqlParserUtil.parseCondExpression(stringBuilder.toString())); - return handleWith(plainSelect, select); + return handleWith(plainSelect, select, dsType); } - private String handleWith(PlainSelect plainSelect, Select select) throws Exception { + private String handleWith(PlainSelect plainSelect, Select select, String dsType) throws Exception { StringBuilder builder = new StringBuilder(); if (CollectionUtils.isNotEmpty(select.getWithItemsList())) { builder.append("WITH"); builder.append(" "); for (Iterator iter = select.getWithItemsList().iterator(); iter.hasNext(); ) { WithItem withItem = iter.next(); - builder.append(withItem.getName() + " AS ( " + removeVariables(withItem.getSubSelect().toString()) + " ) "); + builder.append(withItem.getName() + " AS ( " + removeVariables(withItem.getSubSelect().toString(), dsType) + " ) "); if (iter.hasNext()) { builder.append(","); } @@ -1152,11 +1156,11 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); DataTableInfoDTO dataTableInfo = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class); String sql = dataTableInfo.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfo.getSql())) : dataTableInfo.getSql(); - sql = handleVariableDefaultValue(sql, dataSetTableRequest.getSqlVariableDetails()); + sql = handleVariableDefaultValue(sql, dataSetTableRequest.getSqlVariableDetails(), ds.getType()); if (StringUtils.isEmpty(sql)) { DataEaseException.throwException(Translator.get("i18n_sql_not_empty")); } - checkVariable(sql); + checkVariable(sql, ds.getType()); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); String sqlAsTable = qp.createSQLPreview(sql, null); datasourceRequest.setQuery(sqlAsTable); @@ -1811,7 +1815,7 @@ public class DataSetTableService { QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); DataTableInfoDTO dataTableInfo = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); String sql = dataTableInfo.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfo.getSql())) : dataTableInfo.getSql(); - sql = handleVariableDefaultValue(sql, null); + sql = handleVariableDefaultValue(sql, null, ds.getType()); String sqlAsTable = qp.createSQLPreview(sql, null); datasourceRequest.setQuery(sqlAsTable); fields = datasourceProvider.fetchResultField(datasourceRequest); diff --git a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java index 8834cce94e..411039126e 100644 --- a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java +++ b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java @@ -148,7 +148,7 @@ public class DirectFieldService implements DataSetFieldService { if(dataTableInfoDTO.isBase64Encryption()){ sql = new String(java.util.Base64.getDecoder().decode(sql)); } - sql = dataSetTableService.removeVariables(sql); + sql = dataSetTableService.removeVariables(sql, ds.getType()); datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields)); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.CUSTOM.toString())) { DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); diff --git a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java index 0f9993c2f7..9722ee5a1d 100644 --- a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java +++ b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java @@ -184,7 +184,7 @@ public class DatasourceService { for (int i = 0; i < apiDefinitionList.size(); i++) { String status = null; - if(apiItemStatuses.get(apiDefinitionList.get(i).getName()) != null){ + if (apiItemStatuses.get(apiDefinitionList.get(i).getName()) != null) { status = apiItemStatuses.get(apiDefinitionList.get(i).getName()).getAsString(); } apiDefinitionList.get(i).setStatus(status); @@ -304,9 +304,9 @@ public class DatasourceService { return ResultHolder.success(datasourceDTO); } if (success > 0 && success < apiDefinitionList.size()) { - return ResultHolder.error(Translator.get("I18N_DS_INVALID_TABLE") , datasourceDTO); + return ResultHolder.error(Translator.get("I18N_DS_INVALID_TABLE"), datasourceDTO); } - return ResultHolder.error(Translator.get("I18N_DS_INVALID") , datasourceDTO); + return ResultHolder.error(Translator.get("I18N_DS_INVALID"), datasourceDTO); } return ResultHolder.success(datasourceDTO); } catch (Exception e) { @@ -530,7 +530,7 @@ public class DatasourceService { }); } - public void updateDatasourceStatusJob(BasicInfo basicInfo, List parameters) { + public void updateDatasourceStatusJob(BasicInfo basicInfo, List parameters) { String type = ""; Integer interval = 30; @@ -547,7 +547,7 @@ public class DatasourceService { type = parameter.getParamValue(); } } - if(!changeDsCheckTime){ + if (!changeDsCheckTime) { return; } addJob(type, interval); @@ -555,7 +555,7 @@ public class DatasourceService { private void addJob(String type, Integer interval) { String cron = ""; - switch (type){ + switch (type) { case "hour": cron = "0 0 0/hour * * ? *".replace("hour", interval.toString()); break; @@ -572,12 +572,12 @@ public class DatasourceService { globalTask.setStartTime(System.currentTimeMillis()); try { scheduleService.addSchedule(globalTask); - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } } - public void initDsCheckJob(){ + public void initDsCheckJob() { BasicInfo basicInfo = systemParameterService.basicInfo(); addJob(basicInfo.getDsCheckIntervalType(), Integer.valueOf(basicInfo.getDsCheckInterval())); } diff --git a/frontend/src/components/dataease/DeOutWidget.vue b/frontend/src/components/dataease/DeOutWidget.vue index b1c3bd26e5..14f1762054 100644 --- a/frontend/src/components/dataease/DeOutWidget.vue +++ b/frontend/src/components/dataease/DeOutWidget.vue @@ -1,7 +1,7 @@