TRANSLATING阶段主要是将语义SQL转换为物理SQL。
代码流转过程:
ChatWorkflowEngine.start() ------》ChatWorkflowEngine.performTranslating() ------》S2SemanticLayerService.translate() ------》DefaultSemanticTranslator.translate()------》OntologyQueryParser.parse()------》SqlBuilder.buildOntoLogySql()。
1、SqlBuilder
SqlBuilder是一个基于Apache Calcite框架的SQL构建器,负责将语义查询转换为物理SQL语句。它支持多模型关联查询、连接优化和跨数据库引擎兼容。
java
public String buildOntologySql(QueryStatement queryStatement) throws Exception {
OntologyQuery ontologyQuery = queryStatement.getOntologyQuery();
Ontology ontology = queryStatement.getOntology();
if (ontologyQuery.getLimit() == null) {
ontologyQuery.setLimit(0L);
}
Set<ModelResp> dataModels = ontologyQuery.getModels();
if (dataModels == null || dataModels.isEmpty()) {
throw new Exception("data model not found");
}
TableView tableView;
if (!CollectionUtils.isEmpty(ontology.getJoinRelations()) && dataModels.size() > 1) {
Set<ModelResp> models = probeRelatedModels(dataModels, queryStatement.getOntology());
tableView = render(ontologyQuery, models, scope, schema);
} else {
tableView = render(ontologyQuery, dataModels, scope, schema);
}
SqlNode parserNode = tableView.build();
DatabaseResp database = queryStatement.getOntology().getDatabase();
EngineType engineType = EngineType.fromString(database.getType());
try {
parserNode = optimizeParseNode(parserNode, engineType);
} catch (Exception e) {
// failure in optimization phase doesn't affect the query result,
// just ignore it
log.error("optimizeParseNode error", e);
}
return SemanticNode.getSql(parserNode, engineType);
}