mirror of
https://github.com/tencentmusic/supersonic.git
synced 2026-04-30 21:14:24 +08:00
Compare commits
4 Commits
00814a3807
...
0709575cd9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0709575cd9 | ||
|
|
be0447ae15 | ||
|
|
1b8cd7f0d3 | ||
|
|
2fd82cc259 |
@@ -2,11 +2,17 @@ package com.tencent.supersonic.headless.api.pojo;
|
|||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.tencent.supersonic.headless.api.pojo.enums.VariableValueType;
|
import com.tencent.supersonic.headless.api.pojo.enums.VariableValueType;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
public class SqlVariable {
|
public class SqlVariable {
|
||||||
private String name;
|
private String name;
|
||||||
private VariableValueType valueType;
|
private VariableValueType valueType;
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ public class EmbeddingMatchStrategy extends BatchMatchStrategy<EmbeddingResult>
|
|||||||
variable.put("retrievedInfo", JSONObject.toJSONString(results));
|
variable.put("retrievedInfo", JSONObject.toJSONString(results));
|
||||||
|
|
||||||
Prompt prompt = PromptTemplate.from(LLM_FILTER_PROMPT).apply(variable);
|
Prompt prompt = PromptTemplate.from(LLM_FILTER_PROMPT).apply(variable);
|
||||||
ChatLanguageModel chatLanguageModel = ModelProvider.getChatModel();
|
ChatLanguageModel chatLanguageModel = ModelProvider.getChatModel(chatQueryContext.getRequest().getChatAppConfig().get("REWRITE_MULTI_TURN").getChatModelConfig());
|
||||||
String response = chatLanguageModel.generate(prompt.toUserMessage().singleText());
|
String response = chatLanguageModel.generate(prompt.toUserMessage().singleText());
|
||||||
|
|
||||||
if (StringUtils.isBlank(response)) {
|
if (StringUtils.isBlank(response)) {
|
||||||
|
|||||||
@@ -47,12 +47,17 @@ public class SqlQueryParser implements QueryParser {
|
|||||||
SqlQuery sqlQuery = queryStatement.getSqlQuery();
|
SqlQuery sqlQuery = queryStatement.getSqlQuery();
|
||||||
List<String> queryFields = SqlSelectHelper.getAllSelectFields(sqlQuery.getSql());
|
List<String> queryFields = SqlSelectHelper.getAllSelectFields(sqlQuery.getSql());
|
||||||
Set<String> queryAliases = SqlSelectHelper.getAliasFields(sqlQuery.getSql());
|
Set<String> queryAliases = SqlSelectHelper.getAliasFields(sqlQuery.getSql());
|
||||||
|
Set<String> ontologyMetricsDimensions = Collections.synchronizedSet(new HashSet<String>());
|
||||||
|
Set<String> ontologyBizNameMetricsDimensions = Collections.synchronizedSet(new HashSet<String>());
|
||||||
queryFields.removeAll(queryAliases);
|
queryFields.removeAll(queryAliases);
|
||||||
Ontology ontology = queryStatement.getOntology();
|
Ontology ontology = queryStatement.getOntology();
|
||||||
OntologyQuery ontologyQuery = buildOntologyQuery(ontology, queryFields);
|
OntologyQuery ontologyQuery = buildOntologyQuery(ontology, queryFields);
|
||||||
|
Set<String> queryFieldsSet = new HashSet<>(queryFields);
|
||||||
|
ontologyQuery.getMetrics().forEach(m -> {ontologyMetricsDimensions.add(m.getName()); ontologyBizNameMetricsDimensions.add(m.getBizName());});
|
||||||
|
ontologyQuery.getDimensions().forEach(d -> {ontologyMetricsDimensions.add(d.getName()); ontologyBizNameMetricsDimensions.add(d.getBizName());});
|
||||||
// check if there are fields not matched with any metric or dimension
|
// check if there are fields not matched with any metric or dimension
|
||||||
if (queryFields.size() > ontologyQuery.getMetrics().size()
|
|
||||||
+ ontologyQuery.getDimensions().size()) {
|
if (!(queryFieldsSet.containsAll(ontologyMetricsDimensions)||queryFieldsSet.containsAll(ontologyBizNameMetricsDimensions))) {
|
||||||
List<String> semanticFields = Lists.newArrayList();
|
List<String> semanticFields = Lists.newArrayList();
|
||||||
ontologyQuery.getMetrics().forEach(m -> semanticFields.add(m.getName()));
|
ontologyQuery.getMetrics().forEach(m -> semanticFields.add(m.getName()));
|
||||||
ontologyQuery.getDimensions().forEach(d -> semanticFields.add(d.getName()));
|
ontologyQuery.getDimensions().forEach(d -> semanticFields.add(d.getName()));
|
||||||
|
|||||||
@@ -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.Ontology;
|
||||||
import com.tencent.supersonic.headless.core.pojo.OntologyQuery;
|
import com.tencent.supersonic.headless.core.pojo.OntologyQuery;
|
||||||
import com.tencent.supersonic.headless.core.translator.parser.Constants;
|
import com.tencent.supersonic.headless.core.translator.parser.Constants;
|
||||||
|
import com.tencent.supersonic.headless.core.utils.SqlVariableParseUtils;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.calcite.sql.SqlDataTypeSpec;
|
import org.apache.calcite.sql.SqlDataTypeSpec;
|
||||||
import org.apache.calcite.sql.SqlNode;
|
import org.apache.calcite.sql.SqlNode;
|
||||||
@@ -34,6 +35,10 @@ public class DataModelNode extends SemanticNode {
|
|||||||
if (dataModel.getModelDetail().getSqlQuery() != null
|
if (dataModel.getModelDetail().getSqlQuery() != null
|
||||||
&& !dataModel.getModelDetail().getSqlQuery().isEmpty()) {
|
&& !dataModel.getModelDetail().getSqlQuery().isEmpty()) {
|
||||||
sqlTable = dataModel.getModelDetail().getSqlQuery();
|
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
|
} else if (dataModel.getModelDetail().getTableQuery() != null
|
||||||
&& !dataModel.getModelDetail().getTableQuery().isEmpty()) {
|
&& !dataModel.getModelDetail().getTableQuery().isEmpty()) {
|
||||||
if (dataModel.getModelDetail().getDbType()
|
if (dataModel.getModelDetail().getDbType()
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ public class ModelYamlManager {
|
|||||||
dataModelYamlTpl.setFilterSql(modelDetail.getFilterSql());
|
dataModelYamlTpl.setFilterSql(modelDetail.getFilterSql());
|
||||||
dataModelYamlTpl.setFields(modelResp.getModelDetail().getFields());
|
dataModelYamlTpl.setFields(modelResp.getModelDetail().getFields());
|
||||||
dataModelYamlTpl.setId(modelResp.getId());
|
dataModelYamlTpl.setId(modelResp.getId());
|
||||||
|
dataModelYamlTpl.setSqlVariables(modelDetail.getSqlVariables());
|
||||||
return dataModelYamlTpl;
|
return dataModelYamlTpl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public class SemanticSchemaManager {
|
|||||||
modelDetail.getMeasures().addAll(getMeasureParams(d.getMeasures()));
|
modelDetail.getMeasures().addAll(getMeasureParams(d.getMeasures()));
|
||||||
modelDetail.getDimensions().addAll(getDimensions(d.getDimensions()));
|
modelDetail.getDimensions().addAll(getDimensions(d.getDimensions()));
|
||||||
modelDetail.getFields().addAll(d.getFields());
|
modelDetail.getFields().addAll(d.getFields());
|
||||||
|
modelDetail.getSqlVariables().addAll(d.getSqlVariables());
|
||||||
return dataModel;
|
return dataModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ public class StarrocksParametersBuilder extends DefaultParametersBuilder {
|
|||||||
List<DatabaseParameter> databaseParameters = new ArrayList<>();
|
List<DatabaseParameter> databaseParameters = new ArrayList<>();
|
||||||
DatabaseParameter host = new DatabaseParameter();
|
DatabaseParameter host = new DatabaseParameter();
|
||||||
host.setComment("JDBC连接");
|
host.setComment("JDBC连接");
|
||||||
host.setValue("jdbc:mysql://localhost:3306/dbname");
|
host.setValue("jdbc:mysql://localhost:9030/dbname");
|
||||||
host.setName("url");
|
host.setName("url");
|
||||||
host.setPlaceholder("请输入JDBC连接串");
|
host.setPlaceholder("请输入JDBC连接串");
|
||||||
databaseParameters.add(host);
|
databaseParameters.add(host);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.tencent.supersonic.headless.server.pojo.yaml;
|
package com.tencent.supersonic.headless.server.pojo.yaml;
|
||||||
|
|
||||||
import com.tencent.supersonic.headless.api.pojo.Field;
|
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 com.tencent.supersonic.headless.api.pojo.enums.ModelSourceType;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@@ -32,4 +33,6 @@ public class DataModelYamlTpl {
|
|||||||
private List<Field> fields;
|
private List<Field> fields;
|
||||||
|
|
||||||
private ModelSourceType modelSourceTypeEnum;
|
private ModelSourceType modelSourceTypeEnum;
|
||||||
|
|
||||||
|
private List<SqlVariable> sqlVariables;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ const ChatMsg: React.FC<Props> = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const isMetricPie =
|
const isMetricPie =
|
||||||
metricFields.length > 0 &&
|
categoryField.length > 0 &&
|
||||||
metricFields?.length === 1 &&
|
metricFields?.length === 1 &&
|
||||||
(isMobile ? dataSource?.length <= 5 : dataSource?.length <= 10) &&
|
(isMobile ? dataSource?.length <= 5 : dataSource?.length <= 10) &&
|
||||||
dataSource.every(item => item[metricFields[0].bizName] > 0);
|
dataSource.every(item => item[metricFields[0].bizName] > 0);
|
||||||
|
|||||||
@@ -299,21 +299,22 @@ const ModelCreateForm: React.FC<CreateFormProps> = ({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const columnFields: any[] = columns.map((item: IDataSource.IExecuteSqlColumn) => {
|
const fieldMap = new Map(
|
||||||
|
fieldsClassifyList.map(field => [field.fieldName, field])
|
||||||
|
);
|
||||||
|
columns.forEach((item: IDataSource.IExecuteSqlColumn) => {
|
||||||
const { type, nameEn, comment } = item;
|
const { type, nameEn, comment } = item;
|
||||||
const oldItem =
|
const existingField = fieldMap.get(nameEn);
|
||||||
fieldsClassifyList.find((oItem) => {
|
|
||||||
return oItem.fieldName === item.nameEn;
|
fieldMap.set(nameEn, {
|
||||||
}) || {};
|
...existingField,
|
||||||
return {
|
|
||||||
...oldItem,
|
|
||||||
bizName: nameEn,
|
bizName: nameEn,
|
||||||
fieldName: nameEn,
|
fieldName: nameEn,
|
||||||
dataType: type,
|
dataType: type,
|
||||||
comment,
|
comment,
|
||||||
};
|
|
||||||
});
|
});
|
||||||
setFields(columnFields || []);
|
});
|
||||||
|
setFields(Array.from(fieldMap.values()));
|
||||||
};
|
};
|
||||||
|
|
||||||
const formatterIdentifiers = (identifiersList: any[] = []) => {
|
const formatterIdentifiers = (identifiersList: any[] = []) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user