mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-14 13:47:09 +00:00
[improvement][headless]Clean code logic of headless core.
This commit is contained in:
@@ -34,7 +34,7 @@ import com.tencent.supersonic.headless.core.cache.QueryCache;
|
||||
import com.tencent.supersonic.headless.core.executor.QueryExecutor;
|
||||
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
|
||||
import com.tencent.supersonic.headless.core.translator.SemanticTranslator;
|
||||
import com.tencent.supersonic.headless.core.translator.calcite.s2sql.SemanticModel;
|
||||
import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Ontology;
|
||||
import com.tencent.supersonic.headless.core.utils.ComponentFactory;
|
||||
import com.tencent.supersonic.headless.server.annotation.S2DataPermission;
|
||||
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
|
||||
@@ -51,6 +51,7 @@ import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -271,23 +272,6 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
||||
return metricService.getMetrics(metaFilter);
|
||||
}
|
||||
|
||||
private QueryStatement buildSqlQueryStatement(QuerySqlReq querySqlReq, User user)
|
||||
throws Exception {
|
||||
// If dataSetId or DataSetName is empty, parse dataSetId from the SQL
|
||||
if (querySqlReq.needGetDataSetId()) {
|
||||
Long dataSetId = dataSetService.getDataSetIdFromSql(querySqlReq.getSql(), user);
|
||||
querySqlReq.setDataSetId(dataSetId);
|
||||
}
|
||||
SchemaFilterReq filter = buildSchemaFilterReq(querySqlReq);
|
||||
SemanticSchemaResp semanticSchemaResp = schemaService.fetchSemanticSchema(filter);
|
||||
QueryStatement queryStatement = queryReqConverter.convert(querySqlReq, semanticSchemaResp);
|
||||
queryStatement.setModelIds(querySqlReq.getModelIds());
|
||||
queryStatement.setEnableOptimize(queryUtils.enableOptimize());
|
||||
queryStatement.setSemanticSchemaResp(semanticSchemaResp);
|
||||
queryStatement.setSemanticModel(semanticSchemaManager.getSemanticModel(semanticSchemaResp));
|
||||
return queryStatement;
|
||||
}
|
||||
|
||||
private QueryStatement buildQueryStatement(SemanticQueryReq semanticQueryReq, User user)
|
||||
throws Exception {
|
||||
QueryStatement queryStatement = null;
|
||||
@@ -310,18 +294,29 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
||||
return queryStatement;
|
||||
}
|
||||
|
||||
private QueryStatement buildSqlQueryStatement(QuerySqlReq querySqlReq, User user) {
|
||||
// If dataSetId or DataSetName is empty, parse dataSetId from the SQL
|
||||
if (querySqlReq.needGetDataSetId()) {
|
||||
Long dataSetId = dataSetService.getDataSetIdFromSql(querySqlReq.getSql(), user);
|
||||
querySqlReq.setDataSetId(dataSetId);
|
||||
}
|
||||
SchemaFilterReq filter = buildSchemaFilterReq(querySqlReq);
|
||||
SemanticSchemaResp semanticSchemaResp = schemaService.fetchSemanticSchema(filter);
|
||||
return queryReqConverter.buildQueryStatement(querySqlReq, semanticSchemaResp);
|
||||
}
|
||||
|
||||
private QueryStatement buildStructQueryStatement(QueryStructReq queryStructReq) {
|
||||
SchemaFilterReq filter = buildSchemaFilterReq(queryStructReq);
|
||||
SemanticSchemaResp semanticSchemaResp = schemaService.fetchSemanticSchema(filter);
|
||||
QueryStatement queryStatement = new QueryStatement();
|
||||
QueryParam queryParam = new QueryParam();
|
||||
queryReqConverter.convert(queryStructReq, queryParam);
|
||||
BeanUtils.copyProperties(queryStructReq, queryParam);
|
||||
queryStatement.setQueryParam(queryParam);
|
||||
queryStatement.setIsS2SQL(false);
|
||||
queryStatement.setEnableOptimize(queryUtils.enableOptimize());
|
||||
queryStatement.setDataSetId(queryStructReq.getDataSetId());
|
||||
queryStatement.setSemanticSchemaResp(semanticSchemaResp);
|
||||
queryStatement.setSemanticModel(semanticSchemaManager.getSemanticModel(semanticSchemaResp));
|
||||
queryStatement.setOntology(semanticSchemaManager.buildOntology(semanticSchemaResp));
|
||||
return queryStatement;
|
||||
}
|
||||
|
||||
@@ -330,9 +325,9 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
||||
List<QueryStatement> sqlParsers = new ArrayList<>();
|
||||
for (QueryStructReq queryStructReq : queryMultiStructReq.getQueryStructReqs()) {
|
||||
QueryStatement queryStatement = buildQueryStatement(queryStructReq, user);
|
||||
SemanticModel semanticModel = queryStatement.getSemanticModel();
|
||||
Ontology ontology = queryStatement.getOntology();
|
||||
queryStatement.setModelIds(queryStructReq.getModelIds());
|
||||
queryStatement.setSemanticModel(semanticModel);
|
||||
queryStatement.setOntology(ontology);
|
||||
queryStatement.setEnableOptimize(queryUtils.enableOptimize());
|
||||
semanticTranslator.translate(queryStatement);
|
||||
sqlParsers.add(queryStatement);
|
||||
|
||||
@@ -18,7 +18,7 @@ import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Materializa
|
||||
import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Measure;
|
||||
import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Metric;
|
||||
import com.tencent.supersonic.headless.core.translator.calcite.s2sql.MetricTypeParams;
|
||||
import com.tencent.supersonic.headless.core.translator.calcite.s2sql.SemanticModel;
|
||||
import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Ontology;
|
||||
import com.tencent.supersonic.headless.core.translator.calcite.schema.S2SemanticSchema;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.DataModelYamlTpl;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.DimensionTimeTypeParamsTpl;
|
||||
@@ -57,9 +57,9 @@ public class SemanticSchemaManager {
|
||||
this.schemaService = schemaService;
|
||||
}
|
||||
|
||||
public SemanticModel getSemanticModel(SemanticSchemaResp semanticSchemaResp) {
|
||||
SemanticModel semanticModel = new SemanticModel();
|
||||
semanticModel.setSchemaKey(semanticSchemaResp.getSchemaKey());
|
||||
public Ontology buildOntology(SemanticSchemaResp semanticSchemaResp) {
|
||||
Ontology ontology = new Ontology();
|
||||
ontology.setSchemaKey(semanticSchemaResp.getSchemaKey());
|
||||
Map<String, List<DimensionYamlTpl>> dimensionYamlTpls = new HashMap<>();
|
||||
List<DataModelYamlTpl> dataModelYamlTpls = new ArrayList<>();
|
||||
List<MetricYamlTpl> metricYamlTpls = new ArrayList<>();
|
||||
@@ -67,36 +67,35 @@ public class SemanticSchemaManager {
|
||||
schemaService.getSchemaYamlTpl(semanticSchemaResp, dimensionYamlTpls, dataModelYamlTpls,
|
||||
metricYamlTpls, modelIdName);
|
||||
DatabaseResp databaseResp = semanticSchemaResp.getDatabaseResp();
|
||||
semanticModel.setDatabase(DatabaseConverter.convert(databaseResp));
|
||||
ontology.setDatabase(DatabaseConverter.convert(databaseResp));
|
||||
if (!CollectionUtils.isEmpty(semanticSchemaResp.getModelRelas())) {
|
||||
semanticModel.setJoinRelations(
|
||||
ontology.setJoinRelations(
|
||||
getJoinRelation(semanticSchemaResp.getModelRelas(), modelIdName));
|
||||
}
|
||||
if (!dataModelYamlTpls.isEmpty()) {
|
||||
Map<String, DataModel> dataSourceMap =
|
||||
dataModelYamlTpls.stream().map(SemanticSchemaManager::getDatasource).collect(
|
||||
Collectors.toMap(DataModel::getName, item -> item, (k1, k2) -> k1));
|
||||
semanticModel.setDatasourceMap(dataSourceMap);
|
||||
ontology.setDatasourceMap(dataSourceMap);
|
||||
}
|
||||
if (!dimensionYamlTpls.isEmpty()) {
|
||||
Map<String, List<Dimension>> dimensionMap = new HashMap<>();
|
||||
for (Map.Entry<String, List<DimensionYamlTpl>> entry : dimensionYamlTpls.entrySet()) {
|
||||
dimensionMap.put(entry.getKey(), getDimensions(entry.getValue()));
|
||||
}
|
||||
semanticModel.setDimensionMap(dimensionMap);
|
||||
ontology.setDimensionMap(dimensionMap);
|
||||
}
|
||||
if (!metricYamlTpls.isEmpty()) {
|
||||
semanticModel.setMetrics(getMetrics(metricYamlTpls));
|
||||
ontology.setMetrics(getMetrics(metricYamlTpls));
|
||||
}
|
||||
return semanticModel;
|
||||
return ontology;
|
||||
}
|
||||
|
||||
public SemanticModel getTagSemanticModel(SemanticSchemaResp semanticSchemaResp)
|
||||
throws Exception {
|
||||
public Ontology getTagSemanticModel(SemanticSchemaResp semanticSchemaResp) throws Exception {
|
||||
if (CollectionUtils.isEmpty(semanticSchemaResp.getTags())) {
|
||||
throw new Exception("semanticSchemaResp tag is empty");
|
||||
}
|
||||
SemanticModel semanticModel = getSemanticModel(semanticSchemaResp);
|
||||
Ontology ontology = buildOntology(semanticSchemaResp);
|
||||
// Map<String, List<Dimension>> dimensions = new HashMap<>();
|
||||
Map<Long, List<TagResp>> tagMap = new HashMap<>();
|
||||
for (TagResp tagResp : semanticSchemaResp.getTags()) {
|
||||
@@ -105,24 +104,24 @@ public class SemanticSchemaManager {
|
||||
}
|
||||
tagMap.get(tagResp.getModelId()).add(tagResp);
|
||||
}
|
||||
if (Objects.nonNull(semanticModel.getDatasourceMap())
|
||||
&& !semanticModel.getDatasourceMap().isEmpty()) {
|
||||
for (Map.Entry<String, DataModel> entry : semanticModel.getDatasourceMap().entrySet()) {
|
||||
if (Objects.nonNull(ontology.getDatasourceMap())
|
||||
&& !ontology.getDatasourceMap().isEmpty()) {
|
||||
for (Map.Entry<String, DataModel> entry : ontology.getDatasourceMap().entrySet()) {
|
||||
List<Dimension> modelDimensions = new ArrayList<>();
|
||||
if (!semanticModel.getDimensionMap().containsKey(entry.getKey())) {
|
||||
semanticModel.getDimensionMap().put(entry.getKey(), modelDimensions);
|
||||
if (!ontology.getDimensionMap().containsKey(entry.getKey())) {
|
||||
ontology.getDimensionMap().put(entry.getKey(), modelDimensions);
|
||||
} else {
|
||||
modelDimensions = semanticModel.getDimensionMap().get(entry.getKey());
|
||||
modelDimensions = ontology.getDimensionMap().get(entry.getKey());
|
||||
}
|
||||
if (tagMap.containsKey(entry.getValue().getId())) {
|
||||
for (TagResp tagResp : tagMap.get(entry.getValue().getId())) {
|
||||
addTagModel(tagResp, modelDimensions, semanticModel.getMetrics());
|
||||
addTagModel(tagResp, modelDimensions, ontology.getMetrics());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return semanticModel;
|
||||
return ontology;
|
||||
}
|
||||
|
||||
private void addTagModel(TagResp tagResp, List<Dimension> modelDimensions,
|
||||
|
||||
@@ -29,6 +29,7 @@ import com.tencent.supersonic.headless.core.adaptor.db.DbAdaptorFactory;
|
||||
import com.tencent.supersonic.headless.core.pojo.DataSetQueryParam;
|
||||
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
|
||||
import com.tencent.supersonic.headless.core.utils.SqlGenerateUtils;
|
||||
import com.tencent.supersonic.headless.server.manager.SemanticSchemaManager;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
@@ -58,8 +59,14 @@ public class QueryReqConverter {
|
||||
@Autowired
|
||||
private SqlGenerateUtils sqlGenerateUtils;
|
||||
|
||||
public QueryStatement convert(QuerySqlReq querySQLReq, SemanticSchemaResp semanticSchemaResp)
|
||||
throws Exception {
|
||||
@Autowired
|
||||
private QueryUtils queryUtils;
|
||||
|
||||
@Autowired
|
||||
private SemanticSchemaManager semanticSchemaManager;
|
||||
|
||||
public QueryStatement buildQueryStatement(QuerySqlReq querySQLReq,
|
||||
SemanticSchemaResp semanticSchemaResp) {
|
||||
|
||||
if (semanticSchemaResp == null) {
|
||||
return new QueryStatement();
|
||||
@@ -87,17 +94,14 @@ public class QueryReqConverter {
|
||||
List<String> metrics =
|
||||
metricSchemas.stream().map(m -> m.getBizName()).collect(Collectors.toList());
|
||||
QueryStructReq queryStructReq = new QueryStructReq();
|
||||
|
||||
MetricTable metricTable = new MetricTable();
|
||||
metricTable.setMetrics(metrics);
|
||||
|
||||
metricTable.getMetrics().addAll(metrics);
|
||||
Set<String> dimensions = getDimensions(semanticSchemaResp, allFields);
|
||||
|
||||
metricTable.setDimensions(new ArrayList<>(dimensions));
|
||||
|
||||
metricTable.getDimensions().addAll(dimensions);
|
||||
metricTable.setAlias(tableName.toLowerCase());
|
||||
// if metric empty , fill model default
|
||||
if (CollectionUtils.isEmpty(metricTable.getMetrics())) {
|
||||
metricTable.setMetrics(new ArrayList<>());
|
||||
metricTable.getMetrics().add(sqlGenerateUtils.generateInternalMetricName(
|
||||
getDefaultModel(semanticSchemaResp, metricTable.getDimensions())));
|
||||
} else {
|
||||
@@ -122,14 +126,15 @@ public class QueryReqConverter {
|
||||
}
|
||||
// 7. do deriveMetric
|
||||
generateDerivedMetric(semanticSchemaResp, aggOption, result);
|
||||
// 8.physicalSql by ParseSqlReq
|
||||
|
||||
// 8.physicalSql by ParseSqlReq
|
||||
queryStructReq.setDateInfo(queryStructUtils.getDateConfBySql(querySQLReq.getSql()));
|
||||
queryStructReq.setDataSetId(querySQLReq.getDataSetId());
|
||||
queryStructReq.setQueryType(getQueryType(aggOption));
|
||||
log.debug("QueryReqConverter queryStructReq[{}]", queryStructReq);
|
||||
QueryParam queryParam = new QueryParam();
|
||||
convert(queryStructReq, queryParam);
|
||||
BeanUtils.copyProperties(queryStructReq, queryParam);
|
||||
|
||||
QueryStatement queryStatement = new QueryStatement();
|
||||
queryStatement.setQueryParam(queryParam);
|
||||
queryStatement.setDataSetQueryParam(result);
|
||||
@@ -137,17 +142,14 @@ public class QueryReqConverter {
|
||||
queryStatement.setMinMaxTime(queryStructUtils.getBeginEndTime(queryStructReq));
|
||||
queryStatement.setDataSetId(querySQLReq.getDataSetId());
|
||||
queryStatement.setLimit(querySQLReq.getLimit());
|
||||
queryStatement.setModelIds(querySQLReq.getModelIds());
|
||||
queryStatement.setEnableOptimize(queryUtils.enableOptimize());
|
||||
queryStatement.setSemanticSchemaResp(semanticSchemaResp);
|
||||
queryStatement.setOntology(semanticSchemaManager.buildOntology(semanticSchemaResp));
|
||||
|
||||
return queryStatement;
|
||||
}
|
||||
|
||||
public void convert(QueryStructReq queryStructReq, QueryParam queryParam) {
|
||||
BeanUtils.copyProperties(queryStructReq, queryParam);
|
||||
queryParam.setOrders(queryStructReq.getOrders());
|
||||
queryParam.setMetrics(queryStructReq.getMetrics());
|
||||
queryParam.setGroups(queryStructReq.getGroups());
|
||||
}
|
||||
|
||||
private AggOption getAggOption(QuerySqlReq databaseReq, List<MetricSchemaResp> metricSchemas) {
|
||||
String sql = databaseReq.getSql();
|
||||
if (!SqlSelectFunctionHelper.hasAggregateFunction(sql) && !SqlSelectHelper.hasGroupBy(sql)
|
||||
|
||||
Reference in New Issue
Block a user