(improvement)(headless)Refactor headless to abstract SemanticTranslator explicitly.

This commit is contained in:
jerryjzhang
2024-06-21 20:20:22 +08:00
parent 5af76fa7dc
commit e293be3ebf
104 changed files with 469 additions and 574 deletions

View File

@@ -30,7 +30,7 @@ import com.tencent.supersonic.headless.api.pojo.response.QueryResult;
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.core.config.AggregatorConfig; import com.tencent.supersonic.headless.core.config.AggregatorConfig;
import com.tencent.supersonic.headless.chat.utils.QueryReqBuilder; import com.tencent.supersonic.headless.chat.utils.QueryReqBuilder;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.time.DayOfWeek; import java.time.DayOfWeek;
import java.time.LocalDate; import java.time.LocalDate;
@@ -48,6 +48,7 @@ import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@@ -133,7 +134,7 @@ public class MetricRatioProcessor implements ExecuteResultProcessor {
queryStructReq.setGroups(new ArrayList<>(Arrays.asList(dateField))); queryStructReq.setGroups(new ArrayList<>(Arrays.asList(dateField)));
queryStructReq.setDateInfo(getRatioDateConf(aggOperatorEnum, semanticParseInfo, queryResult)); queryStructReq.setDateInfo(getRatioDateConf(aggOperatorEnum, semanticParseInfo, queryResult));
queryStructReq.setConvertToSql(false); queryStructReq.setConvertToSql(false);
QueryService queryService = ContextUtils.getBean(QueryService.class); SemanticLayerService queryService = ContextUtils.getBean(SemanticLayerService.class);
SemanticQueryResp queryResp = queryService.queryByReq(queryStructReq, user); SemanticQueryResp queryResp = queryService.queryByReq(queryStructReq, user);
MetricInfo metricInfo = new MetricInfo(); MetricInfo metricInfo = new MetricInfo();
metricInfo.setStatistics(new HashMap<>()); metricInfo.setStatistics(new HashMap<>());

View File

@@ -1,11 +1,11 @@
package com.tencent.supersonic.headless.core.executor.accelerator; package com.tencent.supersonic.headless.core.executor;
import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper; import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper;
import com.tencent.supersonic.headless.core.parser.calcite.Configuration; import com.tencent.supersonic.headless.core.translator.calcite.Configuration;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.TimeRange; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.TimeRange;
import com.tencent.supersonic.headless.core.parser.calcite.schema.DataSourceTable; import com.tencent.supersonic.headless.core.translator.calcite.schema.DataSourceTable;
import com.tencent.supersonic.headless.core.parser.calcite.schema.DataSourceTable.Builder; import com.tencent.supersonic.headless.core.translator.calcite.schema.DataSourceTable.Builder;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SchemaBuilder; import com.tencent.supersonic.headless.core.translator.calcite.schema.SchemaBuilder;
import com.tencent.supersonic.headless.core.pojo.Materialization; import com.tencent.supersonic.headless.core.pojo.Materialization;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;

View File

@@ -4,11 +4,14 @@ import com.tencent.supersonic.common.util.ContextUtils;
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.core.pojo.Database; import com.tencent.supersonic.headless.core.pojo.Database;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import com.tencent.supersonic.headless.core.utils.ComponentFactory;
import com.tencent.supersonic.headless.core.utils.SqlUtils; import com.tencent.supersonic.headless.core.utils.SqlUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings; import org.apache.logging.log4j.util.Strings;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Objects;
@Component("JdbcExecutor") @Component("JdbcExecutor")
@Slf4j @Slf4j
public class JdbcExecutor implements QueryExecutor { public class JdbcExecutor implements QueryExecutor {
@@ -19,6 +22,17 @@ public class JdbcExecutor implements QueryExecutor {
@Override @Override
public SemanticQueryResp execute(QueryStatement queryStatement) { public SemanticQueryResp execute(QueryStatement queryStatement) {
// accelerate query if possible
for (QueryAccelerator queryAccelerator : ComponentFactory.getQueryAccelerators()) {
if (queryAccelerator.check(queryStatement)) {
SemanticQueryResp semanticQueryResp = queryAccelerator.query(queryStatement);
if (Objects.nonNull(semanticQueryResp) && !semanticQueryResp.getResultList().isEmpty()) {
log.info("query by Accelerator {}", queryAccelerator.getClass().getSimpleName());
return semanticQueryResp;
}
}
}
SqlUtils sqlUtils = ContextUtils.getBean(SqlUtils.class); SqlUtils sqlUtils = ContextUtils.getBean(SqlUtils.class);
if (Strings.isEmpty(queryStatement.getSourceId())) { if (Strings.isEmpty(queryStatement.getSourceId())) {
log.warn("data base id is empty"); log.warn("data base id is empty");

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.executor.accelerator; package com.tencent.supersonic.headless.core.executor;
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;

View File

@@ -4,7 +4,7 @@ import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
/** /**
* Query data or execute sql from a query engine * QueryExecutor submits SQL to the database engine and performs acceleration if necessary.
*/ */
public interface QueryExecutor { public interface QueryExecutor {

View File

@@ -1,12 +0,0 @@
package com.tencent.supersonic.headless.core.parser;
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
/**
* A query parser takes semantic query request and generates SQL to be executed.
*/
public interface QueryParser {
void parse(QueryStatement queryStatement) throws Exception;
}

View File

@@ -1,9 +0,0 @@
package com.tencent.supersonic.headless.core.parser;
import com.tencent.supersonic.headless.api.pojo.enums.AggOption;
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
public interface SqlParser {
QueryStatement explain(QueryStatement queryStatement, AggOption aggOption) throws Exception;
}

View File

@@ -1,6 +0,0 @@
package com.tencent.supersonic.headless.core.parser.calcite.schema;
public interface SemanticItem {
public String getName();
}

View File

@@ -1,10 +0,0 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema;
public interface Optimization {
public void visit(SemanticSchema semanticSchema);
}

View File

@@ -1,43 +0,0 @@
package com.tencent.supersonic.headless.core.planner;
import com.tencent.supersonic.headless.core.executor.QueryExecutor;
import com.tencent.supersonic.headless.core.executor.accelerator.QueryAccelerator;
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import com.tencent.supersonic.headless.core.utils.ComponentFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class DefaultQueryPlanner implements QueryPlanner {
public QueryExecutor plan(QueryStatement queryStatement) {
optimize(queryStatement);
return route(queryStatement);
}
private void optimize(QueryStatement queryStatement) {
for (QueryOptimizer queryOptimizer : ComponentFactory.getQueryOptimizers()) {
queryOptimizer.rewrite(queryStatement);
}
}
public QueryExecutor route(QueryStatement queryStatement) {
for (QueryExecutor queryExecutor : ComponentFactory.getQueryExecutors()) {
if (queryExecutor.accept(queryStatement)) {
return queryExecutor;
}
}
return null;
}
@Override
public QueryAccelerator accelerate(QueryStatement queryStatement) {
for (QueryAccelerator queryAccelerator : ComponentFactory.getQueryAccelerators()) {
if (queryAccelerator.check(queryStatement)) {
return queryAccelerator;
}
}
return null;
}
}

View File

@@ -1,10 +0,0 @@
package com.tencent.supersonic.headless.core.planner;
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
/**
* A query optimizer rewrites QueryStatement with a set of optimization rules
*/
public interface QueryOptimizer {
void rewrite(QueryStatement queryStatement);
}

View File

@@ -1,17 +0,0 @@
package com.tencent.supersonic.headless.core.planner;
import com.tencent.supersonic.headless.core.executor.QueryExecutor;
import com.tencent.supersonic.headless.core.executor.accelerator.QueryAccelerator;
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
/**
* A query planner takes parsed QueryStatement and generates an optimized execution plan.
* It interacts with the optimizer to determine the most efficient way to execute the query.
*/
public interface QueryPlanner {
QueryExecutor plan(QueryStatement queryStatement);
QueryExecutor route(QueryStatement queryStatement);
QueryAccelerator accelerate(QueryStatement queryStatement);
}

View File

@@ -2,7 +2,7 @@ package com.tencent.supersonic.headless.core.pojo;
import com.tencent.supersonic.headless.api.pojo.QueryParam; import com.tencent.supersonic.headless.api.pojo.QueryParam;
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.SemanticModel; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.SemanticModel;
import lombok.Data; import lombok.Data;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Triple; import org.apache.commons.lang3.tuple.Triple;

View File

@@ -1,19 +1,18 @@
package com.tencent.supersonic.headless.core.parser; package com.tencent.supersonic.headless.core.translator;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.tencent.supersonic.common.util.StringUtil;
import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper; import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper;
import com.tencent.supersonic.common.util.StringUtil;
import com.tencent.supersonic.headless.api.pojo.MetricTable; import com.tencent.supersonic.headless.api.pojo.MetricTable;
import com.tencent.supersonic.headless.api.pojo.QueryParam; import com.tencent.supersonic.headless.api.pojo.QueryParam;
import com.tencent.supersonic.headless.api.pojo.enums.AggOption; import com.tencent.supersonic.headless.api.pojo.enums.AggOption;
import com.tencent.supersonic.headless.core.parser.converter.HeadlessConverter;
import com.tencent.supersonic.headless.core.pojo.DataSetQueryParam; import com.tencent.supersonic.headless.core.pojo.DataSetQueryParam;
import com.tencent.supersonic.headless.core.pojo.MetricQueryParam; import com.tencent.supersonic.headless.core.pojo.MetricQueryParam;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import com.tencent.supersonic.headless.core.translator.converter.QueryConverter;
import com.tencent.supersonic.headless.core.utils.ComponentFactory; import com.tencent.supersonic.headless.core.utils.ComponentFactory;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@@ -24,8 +23,23 @@ import java.util.stream.Collectors;
@Component @Component
@Slf4j @Slf4j
@Primary public class DefaultSemanticTranslator implements SemanticTranslator {
public class DefaultQueryParser implements QueryParser {
public void translate(QueryStatement queryStatement) {
try {
parse(queryStatement);
optimize(queryStatement);
queryStatement.setOk(true);
} catch (Exception e) {
queryStatement.setOk(false);
}
}
public void optimize(QueryStatement queryStatement) {
for (QueryOptimizer queryOptimizer : ComponentFactory.getQueryOptimizers()) {
queryOptimizer.rewrite(queryStatement);
}
}
public void parse(QueryStatement queryStatement) throws Exception { public void parse(QueryStatement queryStatement) throws Exception {
QueryParam queryParam = queryStatement.getQueryParam(); QueryParam queryParam = queryStatement.getQueryParam();
@@ -36,7 +50,7 @@ public class DefaultQueryParser implements QueryParser {
queryStatement.setMetricQueryParam(new MetricQueryParam()); queryStatement.setMetricQueryParam(new MetricQueryParam());
} }
log.debug("SemanticConverter before [{}]", queryParam); log.debug("SemanticConverter before [{}]", queryParam);
for (HeadlessConverter headlessConverter : ComponentFactory.getSemanticConverters()) { for (QueryConverter headlessConverter : ComponentFactory.getQueryConverters()) {
if (headlessConverter.accept(queryStatement)) { if (headlessConverter.accept(queryStatement)) {
log.info("SemanticConverter accept [{}]", headlessConverter.getClass().getName()); log.info("SemanticConverter accept [{}]", headlessConverter.getClass().getName());
headlessConverter.convert(queryStatement); headlessConverter.convert(queryStatement);
@@ -45,10 +59,10 @@ public class DefaultQueryParser implements QueryParser {
log.debug("SemanticConverter after {} {} {}", queryParam, queryStatement.getDataSetQueryParam(), log.debug("SemanticConverter after {} {} {}", queryParam, queryStatement.getDataSetQueryParam(),
queryStatement.getMetricQueryParam()); queryStatement.getMetricQueryParam());
if (!queryStatement.getDataSetQueryParam().getSql().isEmpty()) { if (!queryStatement.getDataSetQueryParam().getSql().isEmpty()) {
queryStatement = parser(queryStatement.getDataSetQueryParam(), queryStatement); doParse(queryStatement.getDataSetQueryParam(), queryStatement);
} else { } else {
queryStatement.getMetricQueryParam().setNativeQuery(queryParam.getQueryType().isNativeAggQuery()); queryStatement.getMetricQueryParam().setNativeQuery(queryParam.getQueryType().isNativeAggQuery());
queryStatement = parser(queryStatement); doParse(queryStatement);
} }
if (Strings.isNullOrEmpty(queryStatement.getSql()) if (Strings.isNullOrEmpty(queryStatement.getSql())
|| Strings.isNullOrEmpty(queryStatement.getSourceId())) { || Strings.isNullOrEmpty(queryStatement.getSourceId())) {
@@ -61,14 +75,15 @@ public class DefaultQueryParser implements QueryParser {
} }
} }
public QueryStatement parser(DataSetQueryParam dataSetQueryParam, QueryStatement queryStatement) { public QueryStatement doParse(DataSetQueryParam dataSetQueryParam, QueryStatement queryStatement) {
log.info("parser MetricReq [{}] ", dataSetQueryParam); log.info("parser MetricReq [{}] ", dataSetQueryParam);
try { try {
if (!CollectionUtils.isEmpty(dataSetQueryParam.getTables())) { if (!CollectionUtils.isEmpty(dataSetQueryParam.getTables())) {
List<String[]> tables = new ArrayList<>(); List<String[]> tables = new ArrayList<>();
boolean isSingleTable = dataSetQueryParam.getTables().size() == 1; boolean isSingleTable = dataSetQueryParam.getTables().size() == 1;
for (MetricTable metricTable : dataSetQueryParam.getTables()) { for (MetricTable metricTable : dataSetQueryParam.getTables()) {
QueryStatement tableSql = parserSql(metricTable, isSingleTable, dataSetQueryParam, queryStatement); QueryStatement tableSql = parserSql(metricTable, isSingleTable,
dataSetQueryParam, queryStatement);
if (isSingleTable && Objects.nonNull(tableSql.getDataSetQueryParam()) if (isSingleTable && Objects.nonNull(tableSql.getDataSetQueryParam())
&& !tableSql.getDataSetSimplifySql().isEmpty()) { && !tableSql.getDataSetSimplifySql().isEmpty()) {
queryStatement.setSql(tableSql.getDataSetSimplifySql()); queryStatement.setSql(tableSql.getDataSetSimplifySql());
@@ -101,15 +116,16 @@ public class DefaultQueryParser implements QueryParser {
return queryStatement; return queryStatement;
} }
public QueryStatement parser(QueryStatement queryStatement) { public QueryStatement doParse(QueryStatement queryStatement) {
return parser(queryStatement, AggOption.getAggregation(queryStatement.getMetricQueryParam().isNativeQuery())); return doParse(queryStatement, AggOption.getAggregation(
queryStatement.getMetricQueryParam().isNativeQuery()));
} }
public QueryStatement parser(QueryStatement queryStatement, AggOption isAgg) { public QueryStatement doParse(QueryStatement queryStatement, AggOption isAgg) {
MetricQueryParam metricQueryParam = queryStatement.getMetricQueryParam(); MetricQueryParam metricQueryParam = queryStatement.getMetricQueryParam();
log.info("parser metricQueryReq [{}] isAgg [{}]", metricQueryParam, isAgg); log.info("parser metricQueryReq [{}] isAgg [{}]", metricQueryParam, isAgg);
try { try {
return ComponentFactory.getSqlParser().explain(queryStatement, isAgg); ComponentFactory.getQueryParser().parse(queryStatement, isAgg);
} catch (Exception e) { } catch (Exception e) {
queryStatement.setErrMsg(e.getMessage()); queryStatement.setErrMsg(e.getMessage());
log.error("parser error metricQueryReq[{}] error [{}]", metricQueryParam, e); log.error("parser error metricQueryReq[{}] error [{}]", metricQueryParam, e);
@@ -118,8 +134,8 @@ public class DefaultQueryParser implements QueryParser {
} }
private QueryStatement parserSql(MetricTable metricTable, Boolean isSingleMetricTable, private QueryStatement parserSql(MetricTable metricTable, Boolean isSingleMetricTable,
DataSetQueryParam dataSetQueryParam, DataSetQueryParam dataSetQueryParam,
QueryStatement queryStatement) throws Exception { QueryStatement queryStatement) throws Exception {
MetricQueryParam metricReq = new MetricQueryParam(); MetricQueryParam metricReq = new MetricQueryParam();
metricReq.setMetrics(metricTable.getMetrics()); metricReq.setMetrics(metricTable.getMetrics());
metricReq.setDimensions(metricTable.getDimensions()); metricReq.setDimensions(metricTable.getDimensions());
@@ -136,7 +152,7 @@ public class DefaultQueryParser implements QueryParser {
tableSql.setDataSetSql(dataSetQueryParam.getSql()); tableSql.setDataSetSql(dataSetQueryParam.getSql());
tableSql.setDataSetAlias(metricTable.getAlias()); tableSql.setDataSetAlias(metricTable.getAlias());
} }
tableSql = parser(tableSql, metricTable.getAggOption()); tableSql = doParse(tableSql, metricTable.getAggOption());
if (!tableSql.isOk()) { if (!tableSql.isOk()) {
throw new Exception(String.format("parser table [%s] error [%s]", metricTable.getAlias(), throw new Exception(String.format("parser table [%s] error [%s]", metricTable.getAlias(),
tableSql.getErrMsg())); tableSql.getErrMsg()));

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.planner; package com.tencent.supersonic.headless.core.translator;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.tencent.supersonic.headless.api.pojo.QueryParam; import com.tencent.supersonic.headless.api.pojo.QueryParam;

View File

@@ -0,0 +1,11 @@
package com.tencent.supersonic.headless.core.translator;
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
/**
* A query optimizer rewrites physical SQL by following a set of
* optimization rules, trying to derive the most efficient query.
*/
public interface QueryOptimizer {
void rewrite(QueryStatement queryStatement);
}

View File

@@ -0,0 +1,11 @@
package com.tencent.supersonic.headless.core.translator;
import com.tencent.supersonic.headless.api.pojo.enums.AggOption;
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
/**
* A query parser generates physical SQL for the QueryStatement.
*/
public interface QueryParser {
void parse(QueryStatement queryStatement, AggOption aggOption) throws Exception;
}

View File

@@ -0,0 +1,13 @@
package com.tencent.supersonic.headless.core.translator;
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
/**
* SemanticTranslator converts semantic query statement into SQL statement that
* can be executed against physical data models.
*/
public interface SemanticTranslator {
void translate(QueryStatement queryStatement);
}

View File

@@ -1,13 +1,13 @@
package com.tencent.supersonic.headless.core.parser.calcite; package com.tencent.supersonic.headless.core.translator.calcite;
import com.tencent.supersonic.headless.api.pojo.enums.AggOption; import com.tencent.supersonic.headless.api.pojo.enums.AggOption;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.pojo.MetricQueryParam; import com.tencent.supersonic.headless.core.pojo.MetricQueryParam;
import com.tencent.supersonic.headless.core.parser.SqlParser; import com.tencent.supersonic.headless.core.translator.QueryParser;
import com.tencent.supersonic.headless.core.parser.calcite.planner.AggPlanner; import com.tencent.supersonic.headless.core.translator.calcite.planner.AggPlanner;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.SemanticModel; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.SemanticModel;
import com.tencent.supersonic.headless.core.parser.calcite.schema.RuntimeOptions; import com.tencent.supersonic.headless.core.translator.calcite.schema.RuntimeOptions;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -17,17 +17,17 @@ import java.util.Objects;
/** /**
* the calcite parse implements * the calcite parse implements
*/ */
@Component("CalciteSqlParser") @Component("CalciteQueryParser")
@Slf4j @Slf4j
public class CalciteSqlParser implements SqlParser { public class CalciteQueryParser implements QueryParser {
@Override @Override
public QueryStatement explain(QueryStatement queryStatement, AggOption isAgg) throws Exception { public void parse(QueryStatement queryStatement, AggOption isAgg) throws Exception {
MetricQueryParam metricReq = queryStatement.getMetricQueryParam(); MetricQueryParam metricReq = queryStatement.getMetricQueryParam();
SemanticModel semanticModel = queryStatement.getSemanticModel(); SemanticModel semanticModel = queryStatement.getSemanticModel();
if (semanticModel == null) { if (semanticModel == null) {
queryStatement.setErrMsg("semanticSchema not found"); queryStatement.setErrMsg("semanticSchema not found");
return queryStatement; return;
} }
queryStatement.setMetricQueryParam(metricReq); queryStatement.setMetricQueryParam(metricReq);
SemanticSchema semanticSchema = getSemanticSchema(semanticModel, queryStatement); SemanticSchema semanticSchema = getSemanticSchema(semanticModel, queryStatement);
@@ -47,7 +47,6 @@ public class CalciteSqlParser implements SqlParser {
queryStatement.setDataSetSimplifySql(simplifySql); queryStatement.setDataSetSimplifySql(simplifySql);
} }
} }
return queryStatement;
} }
private SemanticSchema getSemanticSchema(SemanticModel semanticModel, QueryStatement queryStatement) { private SemanticSchema getSemanticSchema(SemanticModel semanticModel, QueryStatement queryStatement) {

View File

@@ -1,10 +1,10 @@
package com.tencent.supersonic.headless.core.parser.calcite; package com.tencent.supersonic.headless.core.translator.calcite;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSqlDialect; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSqlDialect;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSqlTypeFactoryImpl; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSqlTypeFactoryImpl;
import com.tencent.supersonic.headless.core.parser.calcite.schema.ViewExpanderImpl; import com.tencent.supersonic.headless.core.translator.calcite.schema.ViewExpanderImpl;
import com.tencent.supersonic.headless.core.utils.SqlDialectFactory; import com.tencent.supersonic.headless.core.utils.SqlDialectFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;

View File

@@ -1,20 +1,20 @@
package com.tencent.supersonic.headless.core.parser.calcite.planner; package com.tencent.supersonic.headless.core.translator.calcite.planner;
import com.tencent.supersonic.headless.api.pojo.enums.AggOption; import com.tencent.supersonic.headless.api.pojo.enums.AggOption;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.parser.calcite.Configuration; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Constants;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Constants; import com.tencent.supersonic.headless.core.translator.calcite.schema.SchemaBuilder;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SchemaBuilder; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.SemanticNode;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.sql.render.FilterRender;
import com.tencent.supersonic.headless.core.parser.calcite.sql.Renderer; import com.tencent.supersonic.headless.core.translator.calcite.sql.render.OutputRender;
import com.tencent.supersonic.headless.core.parser.calcite.sql.TableView; import com.tencent.supersonic.headless.core.translator.calcite.sql.render.SourceRender;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.DataSourceNode; import com.tencent.supersonic.headless.core.translator.calcite.Configuration;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.SemanticNode; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataSource;
import com.tencent.supersonic.headless.core.parser.calcite.sql.render.FilterRender; import com.tencent.supersonic.headless.core.translator.calcite.sql.Renderer;
import com.tencent.supersonic.headless.core.parser.calcite.sql.render.OutputRender; import com.tencent.supersonic.headless.core.translator.calcite.sql.TableView;
import com.tencent.supersonic.headless.core.parser.calcite.sql.render.SourceRender; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.DataSourceNode;
import com.tencent.supersonic.headless.core.pojo.Database; import com.tencent.supersonic.headless.core.pojo.Database;
import com.tencent.supersonic.headless.core.pojo.MetricQueryParam; import com.tencent.supersonic.headless.core.pojo.MetricQueryParam;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
@@ -24,6 +24,7 @@ import java.util.List;
import java.util.ListIterator; import java.util.ListIterator;
import java.util.Objects; import java.util.Objects;
import java.util.Stack; import java.util.Stack;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.parser.SqlParser; import org.apache.calcite.sql.parser.SqlParser;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.planner; package com.tencent.supersonic.headless.core.translator.calcite.planner;
import com.tencent.supersonic.headless.api.pojo.enums.AggOption; import com.tencent.supersonic.headless.api.pojo.enums.AggOption;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
public class Constants { public class Constants {

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import java.util.Arrays; import java.util.Arrays;

View File

@@ -1,9 +1,11 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticItem; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticItem;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import java.util.List; import java.util.List;
import lombok.Builder; import lombok.Builder;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import java.util.List; import java.util.List;
import lombok.Builder; import lombok.Builder;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;

View File

@@ -1,7 +1,7 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticItem; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticItem;
import java.util.List; import java.util.List;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import java.util.List; import java.util.List;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import com.tencent.supersonic.headless.core.pojo.Database; import com.tencent.supersonic.headless.core.pojo.Database;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.s2sql; package com.tencent.supersonic.headless.core.translator.calcite.s2sql;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.schema; package com.tencent.supersonic.headless.core.translator.calcite.schema;
import java.util.ArrayList; import java.util.ArrayList;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.schema; package com.tencent.supersonic.headless.core.translator.calcite.schema;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;

View File

@@ -1,9 +1,9 @@
package com.tencent.supersonic.headless.core.parser.calcite.schema; package com.tencent.supersonic.headless.core.translator.calcite.schema;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.parser.calcite.Configuration; import com.tencent.supersonic.headless.core.translator.calcite.Configuration;
import com.tencent.supersonic.headless.core.parser.calcite.sql.S2SQLSqlValidatorImpl; import com.tencent.supersonic.headless.core.translator.calcite.sql.S2SQLSqlValidatorImpl;
import org.apache.calcite.jdbc.CalciteSchema; import org.apache.calcite.jdbc.CalciteSchema;
import org.apache.calcite.prepare.CalciteCatalogReader; import org.apache.calcite.prepare.CalciteCatalogReader;
import org.apache.calcite.prepare.Prepare; import org.apache.calcite.prepare.Prepare;

View File

@@ -0,0 +1,6 @@
package com.tencent.supersonic.headless.core.translator.calcite.schema;
public interface SemanticItem {
public String getName();
}

View File

@@ -1,12 +1,12 @@
package com.tencent.supersonic.headless.core.parser.calcite.schema; package com.tencent.supersonic.headless.core.translator.calcite.schema;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Materialization; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Materialization;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Metric;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Dimension; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.SemanticModel;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.JoinRelation; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataSource;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Metric; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Dimension;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.SemanticModel; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.JoinRelation;
import org.apache.calcite.schema.Schema; import org.apache.calcite.schema.Schema;
import org.apache.calcite.schema.SchemaVersion; import org.apache.calcite.schema.SchemaVersion;
import org.apache.calcite.schema.Table; import org.apache.calcite.schema.Table;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.schema; package com.tencent.supersonic.headless.core.translator.calcite.schema;
import org.apache.calcite.sql.fun.SqlLibrary; import org.apache.calcite.sql.fun.SqlLibrary;
import org.apache.calcite.sql.validate.SqlConformance; import org.apache.calcite.sql.validate.SqlConformance;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.schema; package com.tencent.supersonic.headless.core.translator.calcite.schema;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import org.apache.calcite.sql.SqlDialect; import org.apache.calcite.sql.SqlDialect;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.schema; package com.tencent.supersonic.headless.core.translator.calcite.schema;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import org.apache.calcite.rel.type.RelDataTypeSystem; import org.apache.calcite.rel.type.RelDataTypeSystem;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.schema; package com.tencent.supersonic.headless.core.translator.calcite.schema;
import org.apache.calcite.plan.RelOptTable; import org.apache.calcite.plan.RelOptTable;
import org.apache.calcite.rel.RelRoot; import org.apache.calcite.rel.RelRoot;

View File

@@ -0,0 +1,10 @@
package com.tencent.supersonic.headless.core.translator.calcite.sql;
import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
public interface Optimization {
public void visit(SemanticSchema semanticSchema);
}

View File

@@ -1,22 +1,23 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql; package com.tencent.supersonic.headless.core.translator.calcite.sql;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.pojo.MetricQueryParam; import com.tencent.supersonic.headless.core.pojo.MetricQueryParam;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.MeasureNode; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Dimension;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.MetricNode; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Identify;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.SemanticNode; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Measure;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Dimension; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Metric;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Identify; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Measure; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.MeasureNode;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Metric; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.MetricNode;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.SemanticNode;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataSource;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.Data; import lombok.Data;
import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.sql.validate.SqlValidatorScope;
@@ -48,7 +49,7 @@ public abstract class Renderer {
} }
public static MetricNode buildMetricNode(String metric, DataSource datasource, SqlValidatorScope scope, public static MetricNode buildMetricNode(String metric, DataSource datasource, SqlValidatorScope scope,
SemanticSchema schema, boolean nonAgg, String alias) throws Exception { SemanticSchema schema, boolean nonAgg, String alias) throws Exception {
Optional<Metric> metricOpt = getMetricByName(metric, schema); Optional<Metric> metricOpt = getMetricByName(metric, schema);
MetricNode metricNode = new MetricNode(); MetricNode metricNode = new MetricNode();
EngineType engineType = EngineType.fromString(datasource.getType()); EngineType engineType = EngineType.fromString(datasource.getType());

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql; package com.tencent.supersonic.headless.core.translator.calcite.sql;
import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.sql.SqlOperatorTable; import org.apache.calcite.sql.SqlOperatorTable;

View File

@@ -1,6 +1,6 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql; package com.tencent.supersonic.headless.core.translator.calcite.sql;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataSource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.node; package com.tencent.supersonic.headless.core.translator.calcite.sql.node;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import java.util.Objects; import java.util.Objects;

View File

@@ -1,18 +1,18 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.node; package com.tencent.supersonic.headless.core.translator.calcite.sql.node;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper; import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.parser.calcite.Configuration; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Constants;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Constants; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Dimension;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Identify;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Dimension; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.JoinRelation;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Identify; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Measure;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.JoinRelation; import com.tencent.supersonic.headless.core.translator.calcite.schema.SchemaBuilder;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Measure; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SchemaBuilder; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.extend.LateralViewExplodeNode;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.Configuration;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.extend.LateralViewExplodeNode; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataSource;
import com.tencent.supersonic.headless.core.pojo.MetricQueryParam; import com.tencent.supersonic.headless.core.pojo.MetricQueryParam;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -25,6 +25,7 @@ import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.calcite.sql.SqlBasicCall; import org.apache.calcite.sql.SqlBasicCall;
import org.apache.calcite.sql.SqlDataTypeSpec; import org.apache.calcite.sql.SqlDataTypeSpec;
@@ -148,7 +149,7 @@ public class DataSourceNode extends SemanticNode {
} }
public static void getQueryDimensionMeasure(SemanticSchema schema, MetricQueryParam metricCommand, public static void getQueryDimensionMeasure(SemanticSchema schema, MetricQueryParam metricCommand,
Set<String> queryDimension, List<String> measures) { Set<String> queryDimension, List<String> measures) {
queryDimension.addAll(metricCommand.getDimensions().stream() queryDimension.addAll(metricCommand.getDimensions().stream()
.map(d -> d.contains(Constants.DIMENSION_IDENTIFY) ? d.split(Constants.DIMENSION_IDENTIFY)[1] : d) .map(d -> d.contains(Constants.DIMENSION_IDENTIFY) ? d.split(Constants.DIMENSION_IDENTIFY)[1] : d)
.collect(Collectors.toSet())); .collect(Collectors.toSet()));

View File

@@ -1,11 +1,13 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.node; package com.tencent.supersonic.headless.core.translator.calcite.sql.node;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Constants; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Constants;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Dimension; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Dimension;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.sql.validate.SqlValidatorScope;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.node; package com.tencent.supersonic.headless.core.translator.calcite.sql.node;
import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlCall;
import org.apache.calcite.sql.SqlInternalOperator; import org.apache.calcite.sql.SqlInternalOperator;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.node; package com.tencent.supersonic.headless.core.translator.calcite.sql.node;
import java.util.Set; import java.util.Set;
import org.apache.calcite.sql.SqlBasicCall; import org.apache.calcite.sql.SqlBasicCall;

View File

@@ -1,12 +1,13 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.node; package com.tencent.supersonic.headless.core.translator.calcite.sql.node;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Identify; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Identify;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Identify.Type;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.sql.validate.SqlValidatorScope;
@@ -26,7 +27,7 @@ public class IdentifyNode extends SemanticNode {
Optional<Identify> identify = identifies.stream().filter(i -> i.getName().equalsIgnoreCase(name)) Optional<Identify> identify = identifies.stream().filter(i -> i.getName().equalsIgnoreCase(name))
.findFirst(); .findFirst();
if (identify.isPresent()) { if (identify.isPresent()) {
return Type.FOREIGN.name().equalsIgnoreCase(identify.get().getType()); return Identify.Type.FOREIGN.name().equalsIgnoreCase(identify.get().getType());
} }
return false; return false;
} }
@@ -35,7 +36,7 @@ public class IdentifyNode extends SemanticNode {
Optional<Identify> identify = identifies.stream().filter(i -> i.getName().equalsIgnoreCase(name)) Optional<Identify> identify = identifies.stream().filter(i -> i.getName().equalsIgnoreCase(name))
.findFirst(); .findFirst();
if (identify.isPresent()) { if (identify.isPresent()) {
return Type.PRIMARY.name().equalsIgnoreCase(identify.get().getType()); return Identify.Type.PRIMARY.name().equalsIgnoreCase(identify.get().getType());
} }
return false; return false;
} }

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.node; package com.tencent.supersonic.headless.core.translator.calcite.sql.node;
import lombok.Data; import lombok.Data;
import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNode;

View File

@@ -1,8 +1,8 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.node; package com.tencent.supersonic.headless.core.translator.calcite.sql.node;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Measure; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Measure;
import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.sql.validate.SqlValidatorScope;

View File

@@ -1,12 +1,14 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.node; package com.tencent.supersonic.headless.core.translator.calcite.sql.node;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Metric; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Metric;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import lombok.Data; import lombok.Data;
import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.sql.validate.SqlValidatorScope;

View File

@@ -1,12 +1,12 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.node; package com.tencent.supersonic.headless.core.translator.calcite.sql.node;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.parser.calcite.Configuration; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Constants;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Constants; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.sql.optimizer.FilterToGroupScanRule;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSqlDialect; import com.tencent.supersonic.headless.core.translator.calcite.Configuration;
import com.tencent.supersonic.headless.core.parser.calcite.sql.optimizer.FilterToGroupScanRule; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSqlDialect;
import com.tencent.supersonic.headless.core.utils.SqlDialectFactory; import com.tencent.supersonic.headless.core.utils.SqlDialectFactory;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelOptPlanner;
@@ -407,7 +407,7 @@ public abstract class SemanticNode {
} }
public static SqlNode optimize(SqlValidatorScope scope, SemanticSchema schema, SqlNode sqlNode, public static SqlNode optimize(SqlValidatorScope scope, SemanticSchema schema, SqlNode sqlNode,
EngineType engineType) { EngineType engineType) {
try { try {
HepProgramBuilder hepProgramBuilder = new HepProgramBuilder(); HepProgramBuilder hepProgramBuilder = new HepProgramBuilder();
SemanticSqlDialect sqlDialect = SqlDialectFactory.getSqlDialect(engineType); SemanticSqlDialect sqlDialect = SqlDialectFactory.getSqlDialect(engineType);

View File

@@ -1,6 +1,6 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.node.extend; package com.tencent.supersonic.headless.core.translator.calcite.sql.node.extend;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.ExtendNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.ExtendNode;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;

View File

@@ -1,6 +1,6 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.optimizer; package com.tencent.supersonic.headless.core.translator.calcite.sql.optimizer;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;

View File

@@ -1,23 +1,24 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.render; package com.tencent.supersonic.headless.core.translator.calcite.sql.render;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.pojo.MetricQueryParam; import com.tencent.supersonic.headless.core.pojo.MetricQueryParam;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Constants; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Metric;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Metric; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Constants;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataSource;
import com.tencent.supersonic.headless.core.parser.calcite.sql.Renderer; import com.tencent.supersonic.headless.core.translator.calcite.sql.Renderer;
import com.tencent.supersonic.headless.core.parser.calcite.sql.TableView; import com.tencent.supersonic.headless.core.translator.calcite.sql.TableView;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.FilterNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.FilterNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.MetricNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.MetricNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.SemanticNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.SemanticNode;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlIdentifier;
import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.parser.SqlParserPos;
@@ -30,7 +31,7 @@ public class FilterRender extends Renderer {
@Override @Override
public void render(MetricQueryParam metricCommand, List<DataSource> dataSources, SqlValidatorScope scope, public void render(MetricQueryParam metricCommand, List<DataSource> dataSources, SqlValidatorScope scope,
SemanticSchema schema, boolean nonAgg) throws Exception { SemanticSchema schema, boolean nonAgg) throws Exception {
TableView tableView = super.tableView; TableView tableView = super.tableView;
SqlNode filterNode = null; SqlNode filterNode = null;
List<String> queryMetrics = new ArrayList<>(metricCommand.getMetrics()); List<String> queryMetrics = new ArrayList<>(metricCommand.getMetrics());

View File

@@ -1,23 +1,23 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.render; package com.tencent.supersonic.headless.core.translator.calcite.sql.render;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.pojo.MetricQueryParam; import com.tencent.supersonic.headless.core.pojo.MetricQueryParam;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Constants; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Identify;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Materialization;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Dimension; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Metric;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Identify; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.JoinRelation; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Constants;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Materialization; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataSource;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Metric; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Dimension;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.JoinRelation;
import com.tencent.supersonic.headless.core.parser.calcite.sql.Renderer; import com.tencent.supersonic.headless.core.translator.calcite.sql.Renderer;
import com.tencent.supersonic.headless.core.parser.calcite.sql.TableView; import com.tencent.supersonic.headless.core.translator.calcite.sql.TableView;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.AggFunctionNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.AggFunctionNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.DataSourceNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.DataSourceNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.FilterNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.FilterNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.IdentifyNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.IdentifyNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.MetricNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.MetricNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.SemanticNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.SemanticNode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.calcite.sql.JoinConditionType; import org.apache.calcite.sql.JoinConditionType;
import org.apache.calcite.sql.SqlBasicCall; import org.apache.calcite.sql.SqlBasicCall;
@@ -50,7 +50,7 @@ public class JoinRender extends Renderer {
@Override @Override
public void render(MetricQueryParam metricCommand, List<DataSource> dataSources, SqlValidatorScope scope, public void render(MetricQueryParam metricCommand, List<DataSource> dataSources, SqlValidatorScope scope,
SemanticSchema schema, boolean nonAgg) throws Exception { SemanticSchema schema, boolean nonAgg) throws Exception {
String queryWhere = metricCommand.getWhere(); String queryWhere = metricCommand.getWhere();
EngineType engineType = EngineType.fromString(schema.getSemanticModel().getDatabase().getType()); EngineType engineType = EngineType.fromString(schema.getSemanticModel().getDatabase().getType());
Set<String> whereFields = new HashSet<>(); Set<String> whereFields = new HashSet<>();

View File

@@ -1,17 +1,18 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.render; package com.tencent.supersonic.headless.core.translator.calcite.sql.render;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.pojo.MetricQueryParam; import com.tencent.supersonic.headless.core.pojo.MetricQueryParam;
import com.tencent.supersonic.common.pojo.ColumnOrder; import com.tencent.supersonic.common.pojo.ColumnOrder;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataSource;
import com.tencent.supersonic.headless.core.parser.calcite.sql.Renderer; import com.tencent.supersonic.headless.core.translator.calcite.sql.Renderer;
import com.tencent.supersonic.headless.core.parser.calcite.sql.TableView; import com.tencent.supersonic.headless.core.translator.calcite.sql.TableView;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.MetricNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.MetricNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.SemanticNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.SemanticNode;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlNodeList;
import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.sql.fun.SqlStdOperatorTable;
@@ -26,7 +27,7 @@ public class OutputRender extends Renderer {
@Override @Override
public void render(MetricQueryParam metricCommand, List<DataSource> dataSources, SqlValidatorScope scope, public void render(MetricQueryParam metricCommand, List<DataSource> dataSources, SqlValidatorScope scope,
SemanticSchema schema, boolean nonAgg) throws Exception { SemanticSchema schema, boolean nonAgg) throws Exception {
TableView selectDataSet = super.tableView; TableView selectDataSet = super.tableView;
EngineType engineType = EngineType.fromString(schema.getSemanticModel().getDatabase().getType()); EngineType engineType = EngineType.fromString(schema.getSemanticModel().getDatabase().getType());
for (String dimension : metricCommand.getDimensions()) { for (String dimension : metricCommand.getDimensions()) {

View File

@@ -1,25 +1,25 @@
package com.tencent.supersonic.headless.core.parser.calcite.sql.render; package com.tencent.supersonic.headless.core.translator.calcite.sql.render;
import static com.tencent.supersonic.headless.core.parser.calcite.s2sql.Constants.DIMENSION_DELIMITER; import static com.tencent.supersonic.headless.core.translator.calcite.s2sql.Constants.DIMENSION_DELIMITER;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Constants; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Identify;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Materialization;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Dimension; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Measure;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Identify; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Metric;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Materialization; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Measure; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Constants;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Metric; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataSource;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Dimension;
import com.tencent.supersonic.headless.core.parser.calcite.sql.Renderer; import com.tencent.supersonic.headless.core.translator.calcite.sql.Renderer;
import com.tencent.supersonic.headless.core.parser.calcite.sql.TableView; import com.tencent.supersonic.headless.core.translator.calcite.sql.TableView;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.DataSourceNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.DataSourceNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.DimensionNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.DimensionNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.FilterNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.FilterNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.IdentifyNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.IdentifyNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.MetricNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.MetricNode;
import com.tencent.supersonic.headless.core.parser.calcite.sql.node.SemanticNode; import com.tencent.supersonic.headless.core.translator.calcite.sql.node.SemanticNode;
import com.tencent.supersonic.headless.core.pojo.MetricQueryParam; import com.tencent.supersonic.headless.core.pojo.MetricQueryParam;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@@ -32,6 +32,7 @@ import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.sql.validate.SqlValidatorScope;
@@ -44,9 +45,9 @@ import org.springframework.util.CollectionUtils;
public class SourceRender extends Renderer { public class SourceRender extends Renderer {
public static TableView renderOne(String alias, List<String> fieldWheres, public static TableView renderOne(String alias, List<String> fieldWheres,
List<String> reqMetrics, List<String> reqDimensions, List<String> reqMetrics, List<String> reqDimensions,
String queryWhere, DataSource datasource, SqlValidatorScope scope, String queryWhere, DataSource datasource, SqlValidatorScope scope,
SemanticSchema schema, boolean nonAgg) throws Exception { SemanticSchema schema, boolean nonAgg) throws Exception {
TableView dataSet = new TableView(); TableView dataSet = new TableView();
TableView output = new TableView(); TableView output = new TableView();

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.core.parser.converter; package com.tencent.supersonic.headless.core.translator.converter;
import com.tencent.supersonic.common.pojo.Aggregator; import com.tencent.supersonic.common.pojo.Aggregator;
import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.Constants;
@@ -27,7 +27,7 @@ import org.springframework.util.CollectionUtils;
*/ */
@Component("CalculateAggConverter") @Component("CalculateAggConverter")
@Slf4j @Slf4j
public class CalculateAggConverter implements HeadlessConverter { public class CalculateAggConverter implements QueryConverter {
public interface EngineSql { public interface EngineSql {
@@ -100,13 +100,10 @@ public class CalculateAggConverter implements HeadlessConverter {
@Override @Override
public void convert(QueryStatement queryStatement) throws Exception { public void convert(QueryStatement queryStatement) throws Exception {
DataSetQueryParam sqlCommend = queryStatement.getDataSetQueryParam();
Database database = queryStatement.getSemanticModel().getDatabase(); Database database = queryStatement.getSemanticModel().getDatabase();
DataSetQueryParam dataSetQueryParam = generateSqlCommend(queryStatement, DataSetQueryParam dataSetQueryParam = generateSqlCommend(queryStatement,
EngineType.fromString(database.getType().toUpperCase()), database.getVersion()); EngineType.fromString(database.getType().toUpperCase()), database.getVersion());
sqlCommend.setSql(dataSetQueryParam.getSql()); queryStatement.setDataSetQueryParam(dataSetQueryParam);
sqlCommend.setTables(dataSetQueryParam.getTables());
sqlCommend.setSupportWith(dataSetQueryParam.isSupportWith());
} }
/** /**

View File

@@ -1,11 +1,11 @@
package com.tencent.supersonic.headless.core.parser.converter; package com.tencent.supersonic.headless.core.translator.converter;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum; import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
import com.tencent.supersonic.common.jsqlparser.SqlAddHelper; import com.tencent.supersonic.common.jsqlparser.SqlAddHelper;
import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper; import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper;
import com.tencent.supersonic.headless.api.pojo.MetricTable; import com.tencent.supersonic.headless.api.pojo.MetricTable;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Dimension; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Dimension;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Expression;
@@ -23,7 +23,7 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
@Component("DefaultDimValueConverter") @Component("DefaultDimValueConverter")
public class DefaultDimValueConverter implements HeadlessConverter { public class DefaultDimValueConverter implements QueryConverter {
@Override @Override
public boolean accept(QueryStatement queryStatement) { public boolean accept(QueryStatement queryStatement) {

View File

@@ -1,9 +1,9 @@
package com.tencent.supersonic.headless.core.parser.converter; package com.tencent.supersonic.headless.core.translator.converter;
import com.tencent.supersonic.common.pojo.ColumnOrder; import com.tencent.supersonic.common.pojo.ColumnOrder;
import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.ContextUtils;
import com.tencent.supersonic.headless.api.pojo.QueryParam; import com.tencent.supersonic.headless.api.pojo.QueryParam;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataSource;
import com.tencent.supersonic.headless.core.pojo.MetricQueryParam; import com.tencent.supersonic.headless.core.pojo.MetricQueryParam;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import com.tencent.supersonic.headless.core.utils.SqlGenerateUtils; import com.tencent.supersonic.headless.core.utils.SqlGenerateUtils;
@@ -16,11 +16,11 @@ import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
/** /**
* HeadlessConverter default implement * QueryConverter default implement
*/ */
@Component("ParserDefaultConverter") @Component("ParserDefaultConverter")
@Slf4j @Slf4j
public class ParserDefaultConverter implements HeadlessConverter { public class ParserDefaultConverter implements QueryConverter {
@Override @Override
public boolean accept(QueryStatement queryStatement) { public boolean accept(QueryStatement queryStatement) {

View File

@@ -1,11 +1,11 @@
package com.tencent.supersonic.headless.core.parser.converter; package com.tencent.supersonic.headless.core.translator.converter;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
/** /**
* to supplement,translate the request Body * to supplement,translate the request Body
*/ */
public interface HeadlessConverter { public interface QueryConverter {
boolean accept(QueryStatement queryStatement); boolean accept(QueryStatement queryStatement);

View File

@@ -1,9 +1,9 @@
package com.tencent.supersonic.headless.core.parser.converter; package com.tencent.supersonic.headless.core.translator.converter;
import com.tencent.supersonic.headless.api.pojo.enums.ModelDefineType; import com.tencent.supersonic.headless.api.pojo.enums.ModelDefineType;
import com.tencent.supersonic.headless.api.pojo.response.ModelResp; import com.tencent.supersonic.headless.api.pojo.response.ModelResp;
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataSource;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import com.tencent.supersonic.headless.core.utils.SqlVariableParseUtils; import com.tencent.supersonic.headless.core.utils.SqlVariableParseUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -15,7 +15,7 @@ import java.util.Objects;
@Slf4j @Slf4j
@Component("SqlVariableParseConverter") @Component("SqlVariableParseConverter")
public class SqlVariableParseConverter implements HeadlessConverter { public class SqlVariableParseConverter implements QueryConverter {
@Override @Override
public boolean accept(QueryStatement queryStatement) { public boolean accept(QueryStatement queryStatement) {

View File

@@ -3,42 +3,46 @@ package com.tencent.supersonic.headless.core.utils;
import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.ContextUtils;
import com.tencent.supersonic.headless.core.cache.QueryCache; import com.tencent.supersonic.headless.core.cache.QueryCache;
import com.tencent.supersonic.headless.core.executor.QueryExecutor; import com.tencent.supersonic.headless.core.executor.QueryExecutor;
import com.tencent.supersonic.headless.core.executor.accelerator.QueryAccelerator; import com.tencent.supersonic.headless.core.executor.QueryAccelerator;
import com.tencent.supersonic.headless.core.parser.SqlParser; import com.tencent.supersonic.headless.core.translator.QueryParser;
import com.tencent.supersonic.headless.core.parser.converter.HeadlessConverter; import com.tencent.supersonic.headless.core.translator.converter.QueryConverter;
import com.tencent.supersonic.headless.core.planner.QueryOptimizer; import com.tencent.supersonic.headless.core.translator.QueryOptimizer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.core.io.support.SpringFactoriesLoader;
/** /**
* HeadlessConverter QueryOptimizer QueryExecutor object factory * QueryConverter QueryOptimizer QueryExecutor object factory
*/ */
@Slf4j @Slf4j
public class ComponentFactory { public class ComponentFactory {
private static List<HeadlessConverter> headlessConverters = new ArrayList<>(); private static List<QueryConverter> queryConverters = new ArrayList<>();
private static Map<String, QueryOptimizer> queryOptimizers = new HashMap<>(); private static Map<String, QueryOptimizer> queryOptimizers = new HashMap<>();
private static List<QueryExecutor> queryExecutors = new ArrayList<>(); private static List<QueryExecutor> queryExecutors = new ArrayList<>();
private static List<QueryAccelerator> queryAccelerators = new ArrayList<>(); private static List<QueryAccelerator> queryAccelerators = new ArrayList<>();
private static SqlParser sqlParser; private static QueryParser queryParser;
private static QueryCache queryCache; private static QueryCache queryCache;
static { static {
initSemanticConverter(); initQueryConverter();
initQueryOptimizer(); initQueryOptimizer();
initQueryExecutors(); initQueryExecutors();
initQueryAccelerators();
initQueryParser();
initQueryCache();
} }
public static List<HeadlessConverter> getSemanticConverters() { public static List<QueryConverter> getQueryConverters() {
if (headlessConverters.isEmpty()) { if (queryConverters.isEmpty()) {
initSemanticConverter(); initQueryConverter();
} }
return headlessConverters; return queryConverters;
} }
public static List<QueryOptimizer> getQueryOptimizers() { public static List<QueryOptimizer> getQueryOptimizers() {
@@ -62,11 +66,11 @@ public class ComponentFactory {
return queryAccelerators; return queryAccelerators;
} }
public static SqlParser getSqlParser() { public static QueryParser getQueryParser() {
if (sqlParser == null) { if (queryParser == null) {
initQueryParser(); initQueryParser();
} }
return sqlParser; return queryParser;
} }
public static QueryCache getQueryCache() { public static QueryCache getQueryCache() {
@@ -98,12 +102,12 @@ public class ComponentFactory {
init(QueryAccelerator.class, queryAccelerators); init(QueryAccelerator.class, queryAccelerators);
} }
private static void initSemanticConverter() { private static void initQueryConverter() {
init(HeadlessConverter.class, headlessConverters); init(QueryConverter.class, queryConverters);
} }
private static void initQueryParser() { private static void initQueryParser() {
sqlParser = init(SqlParser.class); queryParser = init(QueryParser.class);
} }
private static void initQueryCache() { private static void initQueryCache() {

View File

@@ -1,7 +1,7 @@
package com.tencent.supersonic.headless.core.utils; package com.tencent.supersonic.headless.core.utils;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSqlDialect; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSqlDialect;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;

View File

@@ -2,7 +2,7 @@ package com.tencent.supersonic.chat.core.parser.aggregate;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.tencent.supersonic.headless.api.pojo.enums.AggOption; import com.tencent.supersonic.headless.api.pojo.enums.AggOption;
import com.tencent.supersonic.headless.core.parser.calcite.CalciteSqlParser; import com.tencent.supersonic.headless.core.translator.calcite.CalciteQueryParser;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.testng.Assert; import org.testng.Assert;
@@ -459,9 +459,9 @@ public class CalciteSqlParserTest {
+ " }\n" + " }\n"
+ "}"; + "}";
QueryStatement queryStatement = JSON.parseObject(json, QueryStatement.class); QueryStatement queryStatement = JSON.parseObject(json, QueryStatement.class);
CalciteSqlParser calciteSqlParser = new CalciteSqlParser(); CalciteQueryParser calciteSqlParser = new CalciteQueryParser();
QueryStatement explain = calciteSqlParser.explain(queryStatement, AggOption.DEFAULT); calciteSqlParser.parse(queryStatement, AggOption.DEFAULT);
Assert.assertEquals(explain.getSql().trim().replaceAll("\\s+", ""), Assert.assertEquals(queryStatement.getSql().trim().replaceAll("\\s+", ""),
"SELECT`imp_date`AS`sys_imp_date`,SUM(1)AS`pv`" "SELECT`imp_date`AS`sys_imp_date`,SUM(1)AS`pv`"
+ "FROM" + "FROM"
+ "`s2_pv_uv_statis`" + "`s2_pv_uv_statis`"

View File

@@ -46,7 +46,7 @@ public class DimValueAspect {
@Autowired @Autowired
private DimensionService dimensionService; private DimensionService dimensionService;
@Around("execution(* com.tencent.supersonic.headless.server.service.QueryService.queryByReq(..))") @Around("execution(* com.tencent.supersonic.headless.server.service.SemanticLayerService.queryByReq(..))")
public Object handleDimValue(ProceedingJoinPoint joinPoint) throws Throwable { public Object handleDimValue(ProceedingJoinPoint joinPoint) throws Throwable {
if (!dimensionValueMapEnable) { if (!dimensionValueMapEnable) {
log.debug("dimensionValueMapEnable is false, skip dimensionValueMap"); log.debug("dimensionValueMapEnable is false, skip dimensionValueMap");

View File

@@ -33,7 +33,7 @@ public class MetricDrillDownChecker {
@Autowired @Autowired
private MetricService metricService; private MetricService metricService;
@Around("execution(* com.tencent.supersonic.headless.core.parser.QueryParser.parse(..))") @Around("execution(* com.tencent.supersonic.headless.core.translator.DefaultSemanticTranslator.parse(..))")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] objects = joinPoint.getArgs(); Object[] objects = joinPoint.getArgs();
QueryStatement queryStatement = (QueryStatement) objects[0]; QueryStatement queryStatement = (QueryStatement) objects[0];

View File

@@ -7,19 +7,19 @@ import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType;
import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp; import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp;
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
import com.tencent.supersonic.headless.api.pojo.response.TagResp; import com.tencent.supersonic.headless.api.pojo.response.TagResp;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Constants; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Constants;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataSource;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataType; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DataType;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Dimension; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Dimension;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DimensionTimeTypeParams; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.DimensionTimeTypeParams;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Identify; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Identify;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.JoinRelation; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.JoinRelation;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Materialization.TimePartType; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Materialization.TimePartType;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Measure; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Measure;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Metric; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.Metric;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.MetricTypeParams; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.MetricTypeParams;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.SemanticModel; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.SemanticModel;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import com.tencent.supersonic.headless.server.pojo.yaml.DataModelYamlTpl; import com.tencent.supersonic.headless.server.pojo.yaml.DataModelYamlTpl;
import com.tencent.supersonic.headless.server.pojo.yaml.DimensionTimeTypeParamsTpl; import com.tencent.supersonic.headless.server.pojo.yaml.DimensionTimeTypeParamsTpl;
import com.tencent.supersonic.headless.server.pojo.yaml.DimensionYamlTpl; import com.tencent.supersonic.headless.server.pojo.yaml.DimensionYamlTpl;
@@ -29,7 +29,7 @@ import com.tencent.supersonic.headless.server.pojo.yaml.MeasureYamlTpl;
import com.tencent.supersonic.headless.server.pojo.yaml.MetricParamYamlTpl; import com.tencent.supersonic.headless.server.pojo.yaml.MetricParamYamlTpl;
import com.tencent.supersonic.headless.server.pojo.yaml.MetricTypeParamsYamlTpl; import com.tencent.supersonic.headless.server.pojo.yaml.MetricTypeParamsYamlTpl;
import com.tencent.supersonic.headless.server.pojo.yaml.MetricYamlTpl; import com.tencent.supersonic.headless.server.pojo.yaml.MetricYamlTpl;
import com.tencent.supersonic.headless.server.service.Catalog; import com.tencent.supersonic.headless.server.service.CatalogService;
import com.tencent.supersonic.headless.server.utils.DatabaseConverter; import com.tencent.supersonic.headless.server.utils.DatabaseConverter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@@ -51,9 +51,9 @@ import org.springframework.util.CollectionUtils;
@Service @Service
public class SemanticSchemaManager { public class SemanticSchemaManager {
private final Catalog catalog; private final CatalogService catalog;
public SemanticSchemaManager(Catalog catalog) { public SemanticSchemaManager(CatalogService catalog) {
this.catalog = catalog; this.catalog = catalog;
} }

View File

@@ -13,7 +13,7 @@ import com.tencent.supersonic.headless.chat.QueryContext;
import com.tencent.supersonic.headless.chat.query.QueryManager; import com.tencent.supersonic.headless.chat.query.QueryManager;
import com.tencent.supersonic.headless.chat.query.SemanticQuery; import com.tencent.supersonic.headless.chat.query.SemanticQuery;
import com.tencent.supersonic.headless.chat.query.llm.s2sql.LLMSqlQuery; import com.tencent.supersonic.headless.chat.query.llm.s2sql.LLMSqlQuery;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -65,7 +65,7 @@ public class SqlInfoProcessor implements ResultProcessor {
} }
semanticQuery.setParseInfo(parseInfo); semanticQuery.setParseInfo(parseInfo);
SemanticQueryReq semanticQueryReq = semanticQuery.buildSemanticQueryReq(); SemanticQueryReq semanticQueryReq = semanticQuery.buildSemanticQueryReq();
QueryService queryService = ContextUtils.getBean(QueryService.class); SemanticLayerService queryService = ContextUtils.getBean(SemanticLayerService.class);
ExplainSqlReq<Object> explainSqlReq = ExplainSqlReq.builder().queryReq(semanticQueryReq) ExplainSqlReq<Object> explainSqlReq = ExplainSqlReq.builder().queryReq(semanticQueryReq)
.queryTypeEnum(QueryMethod.SQL).build(); .queryTypeEnum(QueryMethod.SQL).build();
ExplainResp explain = queryService.explain(explainSqlReq, queryContext.getUser()); ExplainResp explain = queryService.explain(explainSqlReq, queryContext.getUser());

View File

@@ -15,7 +15,7 @@ import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.server.pojo.DimensionFilter; import com.tencent.supersonic.headless.server.pojo.DimensionFilter;
import com.tencent.supersonic.headless.server.pojo.MetaFilter; import com.tencent.supersonic.headless.server.pojo.MetaFilter;
import com.tencent.supersonic.headless.server.service.DimensionService; import com.tencent.supersonic.headless.server.service.DimensionService;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@@ -38,7 +38,7 @@ public class DimensionController {
private DimensionService dimensionService; private DimensionService dimensionService;
@Autowired @Autowired
private QueryService queryService; private SemanticLayerService queryService;
/** /**

View File

@@ -5,7 +5,7 @@ import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.headless.api.pojo.request.QueryDataSetReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDataSetReq;
import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq;
import com.tencent.supersonic.headless.server.service.DataSetService; import com.tencent.supersonic.headless.server.service.DataSetService;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@@ -24,7 +24,7 @@ public class DataSetQueryApiController {
@Autowired @Autowired
private DataSetService dataSetService; private DataSetService dataSetService;
@Autowired @Autowired
private QueryService queryService; private SemanticLayerService queryService;
@PostMapping("/dataSet") @PostMapping("/dataSet")
public Object queryByDataSet(@RequestBody QueryDataSetReq queryDataSetReq, public Object queryByDataSet(@RequestBody QueryDataSetReq queryDataSetReq,

View File

@@ -8,7 +8,7 @@ import com.tencent.supersonic.headless.api.pojo.request.QueryMetricReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.server.service.DownloadService; import com.tencent.supersonic.headless.server.service.DownloadService;
import com.tencent.supersonic.headless.server.service.MetricService; import com.tencent.supersonic.headless.server.service.MetricService;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@@ -25,7 +25,7 @@ import javax.servlet.http.HttpServletResponse;
public class MetricQueryApiController { public class MetricQueryApiController {
@Autowired @Autowired
private QueryService queryService; private SemanticLayerService queryService;
@Autowired @Autowired
private MetricService metricService; private MetricService metricService;

View File

@@ -8,7 +8,7 @@ import com.tencent.supersonic.headless.api.pojo.request.QuerySqlsReq;
import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq;
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.server.service.ChatQueryService; import com.tencent.supersonic.headless.server.service.ChatQueryService;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -30,7 +30,7 @@ import java.util.stream.Collectors;
public class SqlQueryApiController { public class SqlQueryApiController {
@Autowired @Autowired
private QueryService queryService; private SemanticLayerService queryService;
@Autowired @Autowired
private ChatQueryService chatQueryService; private ChatQueryService chatQueryService;

View File

@@ -3,9 +3,10 @@ package com.tencent.supersonic.headless.server.rest.api;
import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@@ -19,7 +20,7 @@ import org.springframework.web.bind.annotation.RestController;
public class TagQueryApiController { public class TagQueryApiController {
@Autowired @Autowired
private QueryService queryService; private SemanticLayerService queryService;
@PostMapping("/tag") @PostMapping("/tag")
public Object queryByTag(@RequestBody QueryStructReq queryStructReq, public Object queryByTag(@RequestBody QueryStructReq queryStructReq,

View File

@@ -18,7 +18,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
public interface Catalog { public interface CatalogService {
DimensionResp getDimension(String bizName, Long modelId); DimensionResp getDimension(String bizName, Long modelId);

View File

@@ -14,7 +14,7 @@ import com.tencent.supersonic.headless.api.pojo.response.ParseResp;
import com.tencent.supersonic.headless.api.pojo.response.QueryResult; import com.tencent.supersonic.headless.api.pojo.response.QueryResult;
/*** /***
* QueryService for query and search * SemanticLayerService for query and search
*/ */
public interface ChatQueryService { public interface ChatQueryService {

View File

@@ -1,6 +1,8 @@
package com.tencent.supersonic.headless.server.service; package com.tencent.supersonic.headless.server.service;
import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.headless.api.pojo.DataSetSchema;
import com.tencent.supersonic.headless.api.pojo.SemanticSchema;
import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq; import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq;
import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq; import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq;
@@ -11,7 +13,12 @@ import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import java.util.List; import java.util.List;
public interface QueryService { public interface SemanticLayerService {
SemanticSchema getSemanticSchema();
DataSetSchema getDataSetSchema(Long id);
SemanticQueryResp queryByReq(SemanticQueryReq queryReq, User user) throws Exception; SemanticQueryResp queryByReq(SemanticQueryReq queryReq, User user) throws Exception;
//List<SemanticQueryResp> queryByReqs(List<SemanticQueryReq> queryReqs, User user) throws Exception; //List<SemanticQueryResp> queryByReqs(List<SemanticQueryReq> queryReqs, User user) throws Exception;

View File

@@ -18,7 +18,7 @@ import com.tencent.supersonic.headless.server.pojo.MetaFilter;
import com.tencent.supersonic.headless.server.pojo.yaml.DataModelYamlTpl; import com.tencent.supersonic.headless.server.pojo.yaml.DataModelYamlTpl;
import com.tencent.supersonic.headless.server.pojo.yaml.DimensionYamlTpl; import com.tencent.supersonic.headless.server.pojo.yaml.DimensionYamlTpl;
import com.tencent.supersonic.headless.server.pojo.yaml.MetricYamlTpl; import com.tencent.supersonic.headless.server.pojo.yaml.MetricYamlTpl;
import com.tencent.supersonic.headless.server.service.Catalog; import com.tencent.supersonic.headless.server.service.CatalogService;
import com.tencent.supersonic.headless.server.service.DatabaseService; import com.tencent.supersonic.headless.server.service.DatabaseService;
import com.tencent.supersonic.headless.server.service.DimensionService; import com.tencent.supersonic.headless.server.service.DimensionService;
import com.tencent.supersonic.headless.server.service.MetricService; import com.tencent.supersonic.headless.server.service.MetricService;
@@ -38,7 +38,7 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
@Component @Component
public class CatalogImpl implements Catalog { public class CatalogImpl implements CatalogService {
private final DatabaseService databaseService; private final DatabaseService databaseService;
private final ModelService modelService; private final ModelService modelService;

View File

@@ -56,7 +56,7 @@ import com.tencent.supersonic.headless.server.persistence.dataobject.StatisticsD
import com.tencent.supersonic.headless.server.service.ChatContextService; import com.tencent.supersonic.headless.server.service.ChatContextService;
import com.tencent.supersonic.headless.server.service.ChatQueryService; import com.tencent.supersonic.headless.server.service.ChatQueryService;
import com.tencent.supersonic.headless.server.service.DataSetService; import com.tencent.supersonic.headless.server.service.DataSetService;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import com.tencent.supersonic.headless.server.service.WorkflowService; import com.tencent.supersonic.headless.server.service.WorkflowService;
import com.tencent.supersonic.headless.server.utils.ComponentFactory; import com.tencent.supersonic.headless.server.utils.ComponentFactory;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -99,7 +99,7 @@ public class ChatQueryServiceImpl implements ChatQueryService {
@Autowired @Autowired
private KnowledgeBaseService knowledgeBaseService; private KnowledgeBaseService knowledgeBaseService;
@Autowired @Autowired
private QueryService queryService; private SemanticLayerService queryService;
@Autowired @Autowired
private DataSetService dataSetService; private DataSetService dataSetService;
@Autowired @Autowired

View File

@@ -28,7 +28,7 @@ import com.tencent.supersonic.headless.server.pojo.MetaFilter;
import com.tencent.supersonic.headless.server.service.DimensionService; import com.tencent.supersonic.headless.server.service.DimensionService;
import com.tencent.supersonic.headless.server.service.DownloadService; import com.tencent.supersonic.headless.server.service.DownloadService;
import com.tencent.supersonic.headless.server.service.MetricService; import com.tencent.supersonic.headless.server.service.MetricService;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -64,10 +64,10 @@ public class DownloadServiceImpl implements DownloadService {
private DimensionService dimensionService; private DimensionService dimensionService;
private QueryService queryService; private SemanticLayerService queryService;
public DownloadServiceImpl(MetricService metricService, public DownloadServiceImpl(MetricService metricService,
DimensionService dimensionService, QueryService queryService) { DimensionService dimensionService, SemanticLayerService queryService) {
this.metricService = metricService; this.metricService = metricService;
this.dimensionService = dimensionService; this.dimensionService = dimensionService;
this.queryService = queryService; this.queryService = queryService;

View File

@@ -21,7 +21,7 @@ import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq;
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.server.service.FlightService; import com.tencent.supersonic.headless.server.service.FlightService;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import com.tencent.supersonic.headless.server.utils.FlightUtils; import com.tencent.supersonic.headless.server.utils.FlightUtils;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.sql.ResultSet; import java.sql.ResultSet;
@@ -84,13 +84,13 @@ public class FlightServiceImpl extends BasicFlightSqlProducer implements FlightS
private final String nameHeaderKey = "name"; private final String nameHeaderKey = "name";
private final String passwordHeaderKey = "password"; private final String passwordHeaderKey = "password";
private final Calendar defaultCalendar = JdbcToArrowUtils.getUtcCalendar(); private final Calendar defaultCalendar = JdbcToArrowUtils.getUtcCalendar();
private final QueryService queryService; private final SemanticLayerService queryService;
private final AuthenticationConfig authenticationConfig; private final AuthenticationConfig authenticationConfig;
private final UserService userService; private final UserService userService;
public FlightServiceImpl(QueryService queryService, public FlightServiceImpl(SemanticLayerService queryService,
AuthenticationConfig authenticationConfig, AuthenticationConfig authenticationConfig,
UserService userService) { UserService userService) {
this.queryService = queryService; this.queryService = queryService;
this.authenticationConfig = authenticationConfig; this.authenticationConfig = authenticationConfig;

View File

@@ -5,8 +5,10 @@ import com.google.common.collect.Sets;
import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum;
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum; import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
import com.tencent.supersonic.headless.api.pojo.DataSetSchema;
import com.tencent.supersonic.headless.api.pojo.Dim; import com.tencent.supersonic.headless.api.pojo.Dim;
import com.tencent.supersonic.headless.api.pojo.QueryParam; import com.tencent.supersonic.headless.api.pojo.QueryParam;
import com.tencent.supersonic.headless.api.pojo.SemanticSchema;
import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq; import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq;
import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq; import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq;
@@ -23,19 +25,16 @@ import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
import com.tencent.supersonic.headless.core.cache.QueryCache; import com.tencent.supersonic.headless.core.cache.QueryCache;
import com.tencent.supersonic.headless.core.executor.QueryExecutor; import com.tencent.supersonic.headless.core.executor.QueryExecutor;
import com.tencent.supersonic.headless.core.executor.accelerator.QueryAccelerator; import com.tencent.supersonic.headless.core.translator.SemanticTranslator;
import com.tencent.supersonic.headless.core.parser.DefaultQueryParser; import com.tencent.supersonic.headless.core.translator.calcite.s2sql.SemanticModel;
import com.tencent.supersonic.headless.core.parser.QueryParser;
import com.tencent.supersonic.headless.core.parser.calcite.s2sql.SemanticModel;
import com.tencent.supersonic.headless.core.planner.QueryPlanner;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import com.tencent.supersonic.headless.core.utils.ComponentFactory; import com.tencent.supersonic.headless.core.utils.ComponentFactory;
import com.tencent.supersonic.headless.server.annotation.S2DataPermission; import com.tencent.supersonic.headless.server.annotation.S2DataPermission;
import com.tencent.supersonic.headless.server.manager.SemanticSchemaManager; import com.tencent.supersonic.headless.server.manager.SemanticSchemaManager;
import com.tencent.supersonic.headless.server.service.AppService; import com.tencent.supersonic.headless.server.service.CatalogService;
import com.tencent.supersonic.headless.server.service.Catalog;
import com.tencent.supersonic.headless.server.service.DataSetService; import com.tencent.supersonic.headless.server.service.DataSetService;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SchemaService;
import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import com.tencent.supersonic.headless.server.utils.QueryReqConverter; import com.tencent.supersonic.headless.server.utils.QueryReqConverter;
import com.tencent.supersonic.headless.server.utils.QueryUtils; import com.tencent.supersonic.headless.server.utils.QueryUtils;
import com.tencent.supersonic.headless.server.utils.StatUtils; import com.tencent.supersonic.headless.server.utils.StatUtils;
@@ -51,37 +50,42 @@ import java.util.Objects;
@Service @Service
@Slf4j @Slf4j
public class QueryServiceImpl implements QueryService { public class SemanticLayerServiceImpl implements SemanticLayerService {
private StatUtils statUtils; private StatUtils statUtils;
private final QueryUtils queryUtils; private final QueryUtils queryUtils;
private final QueryReqConverter queryReqConverter; private final QueryReqConverter queryReqConverter;
private final Catalog catalog; private final CatalogService catalog;
private final AppService appService;
private final SemanticSchemaManager semanticSchemaManager; private final SemanticSchemaManager semanticSchemaManager;
private final QueryParser queryParser;
private final QueryPlanner queryPlanner;
private final DataSetService dataSetService; private final DataSetService dataSetService;
private final SchemaService schemaService;
private final SemanticTranslator semanticTranslator;
public QueryServiceImpl( public SemanticLayerServiceImpl(
StatUtils statUtils, StatUtils statUtils,
QueryUtils queryUtils, QueryUtils queryUtils,
QueryReqConverter queryReqConverter, QueryReqConverter queryReqConverter,
Catalog catalog, CatalogService catalog,
AppService appService,
SemanticSchemaManager semanticSchemaManager, SemanticSchemaManager semanticSchemaManager,
DefaultQueryParser queryParser, DataSetService dataSetService,
QueryPlanner queryPlanner, SchemaService schemaService,
DataSetService dataSetService) { SemanticTranslator semanticTranslator) {
this.statUtils = statUtils; this.statUtils = statUtils;
this.queryUtils = queryUtils; this.queryUtils = queryUtils;
this.queryReqConverter = queryReqConverter; this.queryReqConverter = queryReqConverter;
this.catalog = catalog; this.catalog = catalog;
this.appService = appService;
this.semanticSchemaManager = semanticSchemaManager; this.semanticSchemaManager = semanticSchemaManager;
this.queryParser = queryParser;
this.queryPlanner = queryPlanner;
this.dataSetService = dataSetService; this.dataSetService = dataSetService;
this.schemaService = schemaService;
this.semanticTranslator = semanticTranslator;
}
public SemanticSchema getSemanticSchema() {
return new SemanticSchema(schemaService.getDataSetSchema());
}
public DataSetSchema getDataSetSchema(Long id) {
return schemaService.getDataSetSchema(id);
} }
@Override @Override
@@ -179,7 +183,7 @@ public class QueryServiceImpl implements QueryService {
queryStatement.setModelIds(queryStructReq.getModelIds()); queryStatement.setModelIds(queryStructReq.getModelIds());
queryStatement.setSemanticModel(semanticModel); queryStatement.setSemanticModel(semanticModel);
queryStatement.setEnableOptimize(queryUtils.enableOptimize()); queryStatement.setEnableOptimize(queryUtils.enableOptimize());
queryStatement = plan(queryStatement); semanticTranslator.translate(queryStatement);
sqlParsers.add(queryStatement); sqlParsers.add(queryStatement);
} }
log.info("multi sqlParser:{}", sqlParsers); log.info("multi sqlParser:{}", sqlParsers);
@@ -210,11 +214,8 @@ public class QueryServiceImpl implements QueryService {
public <T> ExplainResp explain(ExplainSqlReq<T> explainSqlReq, User user) throws Exception { public <T> ExplainResp explain(ExplainSqlReq<T> explainSqlReq, User user) throws Exception {
T queryReq = explainSqlReq.getQueryReq(); T queryReq = explainSqlReq.getQueryReq();
QueryStatement queryStatement = buildQueryStatement((SemanticQueryReq) queryReq, user); QueryStatement queryStatement = buildQueryStatement((SemanticQueryReq) queryReq, user);
queryStatement = plan(queryStatement); semanticTranslator.translate(queryStatement);
return getExplainResp(queryStatement);
}
private ExplainResp getExplainResp(QueryStatement queryStatement) {
String sql = ""; String sql = "";
if (Objects.nonNull(queryStatement)) { if (Objects.nonNull(queryStatement)) {
sql = queryStatement.getSql(); sql = queryStatement.getSql();
@@ -240,33 +241,20 @@ public class QueryServiceImpl implements QueryService {
return querySqlReq; return querySqlReq;
} }
private QueryStatement plan(QueryStatement queryStatement) throws Exception {
queryParser.parse(queryStatement);
queryPlanner.plan(queryStatement);
return queryStatement;
}
private SemanticQueryResp query(QueryStatement queryStatement) throws Exception { private SemanticQueryResp query(QueryStatement queryStatement) throws Exception {
SemanticQueryResp semanticQueryResp = null; SemanticQueryResp semanticQueryResp = null;
try { try {
//1 parse //1 translate
queryParser.parse(queryStatement); semanticTranslator.translate(queryStatement);
//2 plan
QueryExecutor queryExecutor = queryPlanner.plan(queryStatement); //2 execute
//3 accelerate for (QueryExecutor queryExecutor : ComponentFactory.getQueryExecutors()) {
QueryAccelerator queryAccelerator = queryPlanner.accelerate(queryStatement); if (queryExecutor.accept(queryStatement)) {
if (queryAccelerator != null) { semanticQueryResp = queryExecutor.execute(queryStatement);
semanticQueryResp = queryAccelerator.query(queryStatement); queryUtils.fillItemNameInfo(semanticQueryResp, queryStatement.getSemanticSchemaResp());
if (Objects.nonNull(semanticQueryResp) && !semanticQueryResp.getResultList().isEmpty()) {
log.info("query by Accelerator {}", queryAccelerator.getClass().getSimpleName());
return semanticQueryResp;
} }
} }
//4 execute
if (queryExecutor != null) {
semanticQueryResp = queryExecutor.execute(queryStatement);
queryUtils.fillItemNameInfo(semanticQueryResp, queryStatement.getSemanticSchemaResp());
}
return semanticQueryResp; return semanticQueryResp;
} catch (Exception e) { } catch (Exception e) {
log.error("exception in query, e: ", e); log.error("exception in query, e: ", e);

View File

@@ -19,7 +19,7 @@ import com.tencent.supersonic.headless.api.pojo.request.QueryFilter;
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.chat.utils.QueryReqBuilder; import com.tencent.supersonic.headless.chat.utils.QueryReqBuilder;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import com.tencent.supersonic.headless.server.service.SchemaService; import com.tencent.supersonic.headless.server.service.SchemaService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -44,7 +44,7 @@ public class SemanticService {
private SchemaService schemaService; private SchemaService schemaService;
@Autowired @Autowired
private QueryService queryService; private SemanticLayerService queryService;
public SemanticSchema getSemanticSchema() { public SemanticSchema getSemanticSchema() {
return new SemanticSchema(schemaService.getDataSetSchema()); return new SemanticSchema(schemaService.getDataSetSchema());

View File

@@ -15,7 +15,7 @@ import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.api.pojo.response.TagResp; import com.tencent.supersonic.headless.api.pojo.response.TagResp;
import com.tencent.supersonic.headless.core.utils.SqlGenerateUtils; import com.tencent.supersonic.headless.core.utils.SqlGenerateUtils;
import com.tencent.supersonic.headless.server.service.ModelService; import com.tencent.supersonic.headless.server.service.ModelService;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import com.tencent.supersonic.headless.server.service.TagMetaService; import com.tencent.supersonic.headless.server.service.TagMetaService;
import com.tencent.supersonic.headless.server.service.TagQueryService; import com.tencent.supersonic.headless.server.service.TagQueryService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -42,11 +42,11 @@ public class TagQueryServiceImpl implements TagQueryService {
private final String tagValueAlias = "internalTagCount"; private final String tagValueAlias = "internalTagCount";
private final String maxDateAlias = "internalMaxDate"; private final String maxDateAlias = "internalMaxDate";
private final TagMetaService tagMetaService; private final TagMetaService tagMetaService;
private final QueryService queryService; private final SemanticLayerService queryService;
private final ModelService modelService; private final ModelService modelService;
private final SqlGenerateUtils sqlGenerateUtils; private final SqlGenerateUtils sqlGenerateUtils;
public TagQueryServiceImpl(TagMetaService tagMetaService, QueryService queryService, public TagQueryServiceImpl(TagMetaService tagMetaService, SemanticLayerService queryService,
ModelService modelService, SqlGenerateUtils sqlGenerateUtils) { ModelService modelService, SqlGenerateUtils sqlGenerateUtils) {
this.tagMetaService = tagMetaService; this.tagMetaService = tagMetaService;
this.queryService = queryService; this.queryService = queryService;

View File

@@ -13,7 +13,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* HeadlessConverter QueryOptimizer QueryExecutor object factory * QueryConverter QueryOptimizer QueryExecutor object factory
*/ */
@Slf4j @Slf4j
public class ComponentFactory { public class ComponentFactory {

View File

@@ -38,7 +38,7 @@ import com.tencent.supersonic.headless.server.persistence.dataobject.DictTaskDO;
import com.tencent.supersonic.headless.server.service.DimensionService; import com.tencent.supersonic.headless.server.service.DimensionService;
import com.tencent.supersonic.headless.server.service.MetricService; import com.tencent.supersonic.headless.server.service.MetricService;
import com.tencent.supersonic.headless.server.service.ModelService; import com.tencent.supersonic.headless.server.service.ModelService;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import com.tencent.supersonic.headless.server.service.TagMetaService; import com.tencent.supersonic.headless.server.service.TagMetaService;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
@@ -81,13 +81,13 @@ public class DictUtils {
private final DimensionService dimensionService; private final DimensionService dimensionService;
private final MetricService metricService; private final MetricService metricService;
private final QueryService queryService; private final SemanticLayerService queryService;
private final ModelService modelService; private final ModelService modelService;
private final TagMetaService tagMetaService; private final TagMetaService tagMetaService;
public DictUtils(DimensionService dimensionService, public DictUtils(DimensionService dimensionService,
MetricService metricService, MetricService metricService,
QueryService queryService, SemanticLayerService queryService,
ModelService modelService, ModelService modelService,
@Lazy TagMetaService tagMetaService) { @Lazy TagMetaService tagMetaService) {
this.dimensionService = dimensionService; this.dimensionService = dimensionService;

View File

@@ -19,7 +19,7 @@ import com.tencent.supersonic.headless.api.pojo.response.MetricResp;
import com.tencent.supersonic.headless.api.pojo.response.MetricSchemaResp; import com.tencent.supersonic.headless.api.pojo.response.MetricSchemaResp;
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
import com.tencent.supersonic.headless.server.pojo.MetaFilter; import com.tencent.supersonic.headless.server.pojo.MetaFilter;
import com.tencent.supersonic.headless.server.service.Catalog; import com.tencent.supersonic.headless.server.service.CatalogService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Triple; import org.apache.commons.lang3.tuple.Triple;
@@ -62,12 +62,12 @@ public class QueryStructUtils {
private final DateModeUtils dateModeUtils; private final DateModeUtils dateModeUtils;
private final SqlFilterUtils sqlFilterUtils; private final SqlFilterUtils sqlFilterUtils;
private final Catalog catalog; private final CatalogService catalog;
private String variablePrefix = "'${"; private String variablePrefix = "'${";
public QueryStructUtils( public QueryStructUtils(
DateModeUtils dateModeUtils, DateModeUtils dateModeUtils,
SqlFilterUtils sqlFilterUtils, @Lazy Catalog catalog) { SqlFilterUtils sqlFilterUtils, @Lazy CatalogService catalog) {
this.dateModeUtils = dateModeUtils; this.dateModeUtils = dateModeUtils;
this.sqlFilterUtils = sqlFilterUtils; this.sqlFilterUtils = sqlFilterUtils;

View File

@@ -4,8 +4,8 @@ import com.tencent.supersonic.common.pojo.ColumnOrder;
import com.tencent.supersonic.headless.api.pojo.enums.AggOption; import com.tencent.supersonic.headless.api.pojo.enums.AggOption;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.api.pojo.response.SqlParserResp; import com.tencent.supersonic.headless.api.pojo.response.SqlParserResp;
import com.tencent.supersonic.headless.core.parser.calcite.planner.AggPlanner; import com.tencent.supersonic.headless.core.translator.calcite.planner.AggPlanner;
import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.translator.calcite.schema.SemanticSchema;
import com.tencent.supersonic.headless.core.pojo.MetricQueryParam; import com.tencent.supersonic.headless.core.pojo.MetricQueryParam;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import com.tencent.supersonic.headless.server.manager.SemanticSchemaManager; import com.tencent.supersonic.headless.server.manager.SemanticSchemaManager;

View File

@@ -25,21 +25,21 @@ com.tencent.supersonic.headless.chat.parser.llm.DataSetResolver=\
### headless-core SPIs ### headless-core SPIs
com.tencent.supersonic.headless.core.parser.converter.HeadlessConverter=\ com.tencent.supersonic.headless.core.translator.converter.QueryConverter=\
com.tencent.supersonic.headless.core.parser.converter.DefaultDimValueConverter,\ com.tencent.supersonic.headless.core.translator.converter.DefaultDimValueConverter,\
com.tencent.supersonic.headless.core.parser.converter.SqlVariableParseConverter,\ com.tencent.supersonic.headless.core.translator.converter.SqlVariableParseConverter,\
com.tencent.supersonic.headless.core.parser.converter.CalculateAggConverter,\ com.tencent.supersonic.headless.core.translator.converter.CalculateAggConverter,\
com.tencent.supersonic.headless.core.parser.converter.ParserDefaultConverter com.tencent.supersonic.headless.core.translator.converter.ParserDefaultConverter
com.tencent.supersonic.headless.core.planner.QueryOptimizer=\ com.tencent.supersonic.headless.core.translator.QueryOptimizer=\
com.tencent.supersonic.headless.core.planner.DetailQueryOptimizer com.tencent.supersonic.headless.core.translator.DetailQueryOptimizer
com.tencent.supersonic.headless.core.translator.QueryParser=\
com.tencent.supersonic.headless.core.translator.calcite.CalciteQueryParser
com.tencent.supersonic.headless.core.executor.QueryExecutor=\ com.tencent.supersonic.headless.core.executor.QueryExecutor=\
com.tencent.supersonic.headless.core.executor.JdbcExecutor com.tencent.supersonic.headless.core.executor.JdbcExecutor
com.tencent.supersonic.headless.core.parser.SqlParser=\
com.tencent.supersonic.headless.core.parser.calcite.CalciteSqlParser
com.tencent.supersonic.headless.core.cache.QueryCache=\ com.tencent.supersonic.headless.core.cache.QueryCache=\
com.tencent.supersonic.headless.core.cache.DefaultQueryCache com.tencent.supersonic.headless.core.cache.DefaultQueryCache

View File

@@ -84,7 +84,7 @@ public class Text2SQLEval extends BaseTest {
AgentConfig agentConfig = new AgentConfig(); AgentConfig agentConfig = new AgentConfig();
agentConfig.getTools().add(getLLMQueryTool()); agentConfig.getTools().add(getLLMQueryTool());
agent.setAgentConfig(JSONObject.toJSONString(agentConfig)); agent.setAgentConfig(JSONObject.toJSONString(agentConfig));
agent.setLlmConfig(getLLMConfig(LLMType.GPT)); agent.setLlmConfig(getLLMConfig(LLMType.DEEPSEEK));
MultiTurnConfig multiTurnConfig = new MultiTurnConfig(); MultiTurnConfig multiTurnConfig = new MultiTurnConfig();
multiTurnConfig.setEnableMultiTurn(enableMultiturn); multiTurnConfig.setEnableMultiTurn(enableMultiturn);
agent.setMultiTurnConfig(multiTurnConfig); agent.setMultiTurnConfig(multiTurnConfig);
@@ -146,4 +146,5 @@ public class Text2SQLEval extends BaseTest {
return new LLMConfig("open_ai", return new LLMConfig("open_ai",
baseUrl, apiKey, modelName, temperature); baseUrl, apiKey, modelName, temperature);
} }
} }

View File

@@ -12,7 +12,7 @@ import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq;
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.SemanticLayerService;
import com.tencent.supersonic.util.DataUtils; import com.tencent.supersonic.util.DataUtils;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -26,14 +26,14 @@ import static java.time.LocalDate.now;
public class BaseTest extends BaseApplication { public class BaseTest extends BaseApplication {
@Autowired @Autowired
protected QueryService queryService; protected SemanticLayerService semanticLayerService;
protected SemanticQueryResp queryBySql(String sql) throws Exception { protected SemanticQueryResp queryBySql(String sql) throws Exception {
return queryBySql(sql, User.getFakeUser()); return queryBySql(sql, User.getFakeUser());
} }
protected SemanticQueryResp queryBySql(String sql, User user) throws Exception { protected SemanticQueryResp queryBySql(String sql, User user) throws Exception {
return queryService.queryByReq(buildQuerySqlReq(sql), user); return semanticLayerService.queryByReq(buildQuerySqlReq(sql), user);
} }
protected SemanticQueryReq buildQuerySqlReq(String sql) { protected SemanticQueryReq buildQuerySqlReq(String sql) {

View File

@@ -25,7 +25,7 @@ public class ExplainTest extends BaseTest {
.queryTypeEnum(QueryMethod.SQL) .queryTypeEnum(QueryMethod.SQL)
.queryReq(QueryReqBuilder.buildS2SQLReq(sql, DataUtils.getMetricAgentView())) .queryReq(QueryReqBuilder.buildS2SQLReq(sql, DataUtils.getMetricAgentView()))
.build(); .build();
ExplainResp explain = queryService.explain(explainSqlReq, User.getFakeUser()); ExplainResp explain = semanticLayerService.explain(explainSqlReq, User.getFakeUser());
assertNotNull(explain); assertNotNull(explain);
assertNotNull(explain.getSql()); assertNotNull(explain.getSql());
assertTrue(explain.getSql().contains("department")); assertTrue(explain.getSql().contains("department"));
@@ -39,7 +39,7 @@ public class ExplainTest extends BaseTest {
.queryTypeEnum(QueryMethod.STRUCT) .queryTypeEnum(QueryMethod.STRUCT)
.queryReq(queryStructReq) .queryReq(queryStructReq)
.build(); .build();
ExplainResp explain = queryService.explain(explainSqlReq, User.getFakeUser()); ExplainResp explain = semanticLayerService.explain(explainSqlReq, User.getFakeUser());
assertNotNull(explain); assertNotNull(explain);
assertNotNull(explain.getSql()); assertNotNull(explain.getSql());
assertTrue(explain.getSql().contains("department")); assertTrue(explain.getSql().contains("department"));

Some files were not shown because too many files have changed in this diff Show More