From 0709575cd95d7b8e0c5a2c743c7dbf176203d5e6 Mon Sep 17 00:00:00 2001 From: wanglongqiang Date: Tue, 20 May 2025 22:35:28 +0800 Subject: [PATCH] when sql script has variables, generate sql can't be executed, this commit supports variable replement (#2259) --- .../tencent/supersonic/headless/api/pojo/SqlVariable.java | 6 ++++++ .../core/translator/parser/calcite/DataModelNode.java | 5 +++++ .../headless/server/manager/ModelYamlManager.java | 1 + .../headless/server/manager/SemanticSchemaManager.java | 2 +- .../headless/server/pojo/StarrocksParametersBuilder.java | 2 +- .../headless/server/pojo/yaml/DataModelYamlTpl.java | 3 +++ 6 files changed, 17 insertions(+), 2 deletions(-) diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/SqlVariable.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/SqlVariable.java index cac26a21a..22192a5e9 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/SqlVariable.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/SqlVariable.java @@ -2,11 +2,17 @@ package com.tencent.supersonic.headless.api.pojo; import com.google.common.collect.Lists; import com.tencent.supersonic.headless.api.pojo.enums.VariableValueType; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class SqlVariable { private String name; private VariableValueType valueType; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java index e1d57f87d..f08bb3bf5 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java @@ -14,6 +14,7 @@ import com.tencent.supersonic.headless.core.pojo.JoinRelation; import com.tencent.supersonic.headless.core.pojo.Ontology; import com.tencent.supersonic.headless.core.pojo.OntologyQuery; import com.tencent.supersonic.headless.core.translator.parser.Constants; +import com.tencent.supersonic.headless.core.utils.SqlVariableParseUtils; import lombok.extern.slf4j.Slf4j; import org.apache.calcite.sql.SqlDataTypeSpec; import org.apache.calcite.sql.SqlNode; @@ -34,6 +35,10 @@ public class DataModelNode extends SemanticNode { if (dataModel.getModelDetail().getSqlQuery() != null && !dataModel.getModelDetail().getSqlQuery().isEmpty()) { sqlTable = dataModel.getModelDetail().getSqlQuery(); + // if model has sqlVariables, parse sqlVariables + if (Objects.nonNull(dataModel.getModelDetail().getSqlVariables()) || (CollectionUtils.isEmpty(dataModel.getModelDetail().getSqlVariables()))) { + sqlTable = SqlVariableParseUtils.parse(sqlTable, dataModel.getModelDetail().getSqlVariables(), Lists.newArrayList()); + } } else if (dataModel.getModelDetail().getTableQuery() != null && !dataModel.getModelDetail().getTableQuery().isEmpty()) { if (dataModel.getModelDetail().getDbType() diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/ModelYamlManager.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/ModelYamlManager.java index bb0f3a6f7..7e66cff74 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/ModelYamlManager.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/ModelYamlManager.java @@ -39,6 +39,7 @@ public class ModelYamlManager { dataModelYamlTpl.setFilterSql(modelDetail.getFilterSql()); dataModelYamlTpl.setFields(modelResp.getModelDetail().getFields()); dataModelYamlTpl.setId(modelResp.getId()); + dataModelYamlTpl.setSqlVariables(modelDetail.getSqlVariables()); return dataModelYamlTpl; } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java index 8c12c376a..993c065f2 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java @@ -102,7 +102,7 @@ public class SemanticSchemaManager { modelDetail.getMeasures().addAll(getMeasureParams(d.getMeasures())); modelDetail.getDimensions().addAll(getDimensions(d.getDimensions())); modelDetail.getFields().addAll(d.getFields()); - + modelDetail.getSqlVariables().addAll(d.getSqlVariables()); return dataModel; } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/StarrocksParametersBuilder.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/StarrocksParametersBuilder.java index 5722fa481..28273c371 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/StarrocksParametersBuilder.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/StarrocksParametersBuilder.java @@ -15,7 +15,7 @@ public class StarrocksParametersBuilder extends DefaultParametersBuilder { List databaseParameters = new ArrayList<>(); DatabaseParameter host = new DatabaseParameter(); host.setComment("JDBC连接"); - host.setValue("jdbc:mysql://localhost:3306/dbname"); + host.setValue("jdbc:mysql://localhost:9030/dbname"); host.setName("url"); host.setPlaceholder("请输入JDBC连接串"); databaseParameters.add(host); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DataModelYamlTpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DataModelYamlTpl.java index 75208392a..a2ff3d388 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DataModelYamlTpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DataModelYamlTpl.java @@ -1,6 +1,7 @@ package com.tencent.supersonic.headless.server.pojo.yaml; import com.tencent.supersonic.headless.api.pojo.Field; +import com.tencent.supersonic.headless.api.pojo.SqlVariable; import com.tencent.supersonic.headless.api.pojo.enums.ModelSourceType; import lombok.Data; @@ -32,4 +33,6 @@ public class DataModelYamlTpl { private List fields; private ModelSourceType modelSourceTypeEnum; + + private List sqlVariables; }