mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-12 12:37:55 +00:00
(improvement)(headless)Refactor headless to abstract SemanticTranslator explicitly.
This commit is contained in:
@@ -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<>());
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -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");
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -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 {
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
package com.tencent.supersonic.headless.core.parser.calcite.schema;
|
|
||||||
|
|
||||||
public interface SemanticItem {
|
|
||||||
|
|
||||||
public String getName();
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -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()));
|
||||||
@@ -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;
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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) {
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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 {
|
||||||
|
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.tencent.supersonic.headless.core.translator.calcite.schema;
|
||||||
|
|
||||||
|
public interface SemanticItem {
|
||||||
|
|
||||||
|
public String getName();
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -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) {
|
||||||
@@ -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) {
|
||||||
@@ -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);
|
||||||
|
|
||||||
@@ -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) {
|
||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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`"
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
@@ -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 {
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,11 +84,11 @@ 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;
|
||||||
|
|||||||
@@ -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 = queryAccelerator.query(queryStatement);
|
|
||||||
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);
|
semanticQueryResp = queryExecutor.execute(queryStatement);
|
||||||
queryUtils.fillItemNameInfo(semanticQueryResp, queryStatement.getSemanticSchemaResp());
|
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);
|
||||||
@@ -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());
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user