diff --git a/common/src/main/META-INF/spring.factories b/common/src/main/META-INF/spring.factories index 381f79ce8..5e31f845b 100644 --- a/common/src/main/META-INF/spring.factories +++ b/common/src/main/META-INF/spring.factories @@ -1,2 +1,2 @@ -com.tencent.supersonic.headless.server.cache.CacheManager=\ - com.tencent.supersonic.headless.server.cache.CaffeineCacheManager +com.tencent.supersonic.headless.core.cache.CacheManager=\ + com.tencent.supersonic.headless.core.cache.CaffeineCacheManager diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/config/CacheCommonConfig.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/CacheCommonConfig.java similarity index 90% rename from headless/server/src/main/java/com/tencent/supersonic/headless/server/config/CacheCommonConfig.java rename to headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/CacheCommonConfig.java index c6f3c1f0c..9261c7072 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/config/CacheCommonConfig.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/CacheCommonConfig.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.server.config; +package com.tencent.supersonic.headless.core.cache; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/cache/CacheManager.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/CacheManager.java similarity index 79% rename from headless/server/src/main/java/com/tencent/supersonic/headless/server/cache/CacheManager.java rename to headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/CacheManager.java index 852860e13..4bb488bcb 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/cache/CacheManager.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/CacheManager.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.server.cache; +package com.tencent.supersonic.headless.core.cache; public interface CacheManager { diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/config/CaffeineCacheConfig.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/CaffeineCacheConfig.java similarity index 96% rename from headless/server/src/main/java/com/tencent/supersonic/headless/server/config/CaffeineCacheConfig.java rename to headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/CaffeineCacheConfig.java index 7d5640296..ac5c85e64 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/config/CaffeineCacheConfig.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/CaffeineCacheConfig.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.server.config; +package com.tencent.supersonic.headless.core.cache; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/cache/CaffeineCacheManager.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/CaffeineCacheManager.java similarity index 92% rename from headless/server/src/main/java/com/tencent/supersonic/headless/server/cache/CaffeineCacheManager.java rename to headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/CaffeineCacheManager.java index 43e9e8de5..0dfe1047f 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/cache/CaffeineCacheManager.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/CaffeineCacheManager.java @@ -1,9 +1,8 @@ -package com.tencent.supersonic.headless.server.cache; +package com.tencent.supersonic.headless.core.cache; import com.github.benmanes.caffeine.cache.Cache; import com.google.common.base.Joiner; -import com.tencent.supersonic.headless.server.config.CacheCommonConfig; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Autowired; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/cache/QueryCache.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/QueryCache.java similarity index 98% rename from headless/server/src/main/java/com/tencent/supersonic/headless/server/cache/QueryCache.java rename to headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/QueryCache.java index de213f75b..7c6a1bf8e 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/cache/QueryCache.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/cache/QueryCache.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.server.cache; +package com.tencent.supersonic.headless.core.cache; import com.tencent.supersonic.headless.api.pojo.Cache; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/DefaultQueryParser.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/DefaultQueryParser.java new file mode 100644 index 000000000..da0d8701b --- /dev/null +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/DefaultQueryParser.java @@ -0,0 +1,153 @@ +package com.tencent.supersonic.headless.core.parser; + +import com.google.common.base.Strings; +import com.tencent.supersonic.common.util.StringUtil; +import com.tencent.supersonic.headless.api.enums.AggOption; +import com.tencent.supersonic.headless.api.pojo.MetricTable; +import com.tencent.supersonic.headless.api.request.MetricQueryReq; +import com.tencent.supersonic.headless.api.request.ParseSqlReq; +import com.tencent.supersonic.headless.api.request.QueryStructReq; +import com.tencent.supersonic.headless.api.request.SqlExecuteReq; +import com.tencent.supersonic.headless.core.parser.converter.HeadlessConverter; +import com.tencent.supersonic.headless.core.pojo.QueryStatement; +import com.tencent.supersonic.headless.core.utils.ComponentFactory; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +@Component +@Slf4j +@Primary +public class DefaultQueryParser implements QueryParser { + + public void parse(QueryStatement queryStatement) throws Exception { + QueryStructReq queryStructReq = queryStatement.getQueryStructReq(); + if (Objects.isNull(queryStatement.getParseSqlReq())) { + queryStatement.setParseSqlReq(new ParseSqlReq()); + } + if (Objects.isNull(queryStatement.getMetricReq())) { + queryStatement.setMetricReq(new MetricQueryReq()); + } + log.info("SemanticConverter before [{}]", queryStructReq); + for (HeadlessConverter headlessConverter : ComponentFactory.getSemanticConverters()) { + if (headlessConverter.accept(queryStatement)) { + log.info("SemanticConverter accept [{}]", headlessConverter.getClass().getName()); + headlessConverter.convert(queryStatement); + } + } + log.info("SemanticConverter after {} {} {}", queryStructReq, queryStatement.getParseSqlReq(), + queryStatement.getMetricReq()); + if (!queryStatement.getParseSqlReq().getSql().isEmpty()) { + queryStatement = parser(queryStatement.getParseSqlReq(), queryStatement); + } else { + queryStatement.getMetricReq().setNativeQuery(queryStructReq.getQueryType().isNativeAggQuery()); + queryStatement = parser(queryStatement); + } + if (Strings.isNullOrEmpty(queryStatement.getSql()) + || Strings.isNullOrEmpty(queryStatement.getSourceId())) { + throw new RuntimeException("parse Exception: " + queryStatement.getErrMsg()); + } + String querySql = + Objects.nonNull(queryStatement.getEnableLimitWrapper()) && queryStatement.getEnableLimitWrapper() + ? String.format(SqlExecuteReq.LIMIT_WRAPPER, + queryStatement.getSql()) + : queryStatement.getSql(); + queryStatement.setSql(querySql); + } + + public QueryStatement parser(ParseSqlReq parseSqlReq, QueryStatement queryStatement) { + log.info("parser MetricReq [{}] ", parseSqlReq); + try { + if (!CollectionUtils.isEmpty(parseSqlReq.getTables())) { + List tables = new ArrayList<>(); + Boolean isSingleTable = parseSqlReq.getTables().size() == 1; + for (MetricTable metricTable : parseSqlReq.getTables()) { + QueryStatement metricTableSql = parserSql(metricTable, isSingleTable, parseSqlReq, queryStatement); + if (isSingleTable && Objects.nonNull(metricTableSql.getViewSimplifySql()) + && !metricTableSql.getViewSimplifySql().isEmpty()) { + queryStatement.setSql(metricTableSql.getViewSimplifySql()); + queryStatement.setParseSqlReq(parseSqlReq); + return queryStatement; + } + tables.add(new String[]{metricTable.getAlias(), metricTableSql.getSql()}); + } + if (!tables.isEmpty()) { + String sql = ""; + if (parseSqlReq.isSupportWith()) { + sql = "with " + String.join(",", + tables.stream().map(t -> String.format("%s as (%s)", t[0], t[1])).collect( + Collectors.toList())) + "\n" + parseSqlReq.getSql(); + } else { + sql = parseSqlReq.getSql(); + for (String[] tb : tables) { + sql = StringUtils.replace(sql, tb[0], + "(" + tb[1] + ") " + (parseSqlReq.isWithAlias() ? "" : tb[0]), -1); + } + } + queryStatement.setSql(sql); + queryStatement.setParseSqlReq(parseSqlReq); + return queryStatement; + } + } + } catch (Exception e) { + log.error("physicalSql error {}", e); + queryStatement.setErrMsg(e.getMessage()); + } + return queryStatement; + } + + public QueryStatement parser(QueryStatement queryStatement) { + return parser(queryStatement, AggOption.getAggregation(queryStatement.getMetricReq().isNativeQuery())); + } + + public QueryStatement parser(QueryStatement queryStatement, AggOption isAgg) { + MetricQueryReq metricQueryReq = queryStatement.getMetricReq(); + log.info("parser metricQueryReq [{}] isAgg [{}]", metricQueryReq, isAgg); + if (metricQueryReq.getRootPath().isEmpty()) { + queryStatement.setErrMsg("rootPath empty"); + return queryStatement; + } + try { + return ComponentFactory.getSqlParser().explain(queryStatement, isAgg); + } catch (Exception e) { + queryStatement.setErrMsg(e.getMessage()); + log.error("parser error metricQueryReq[{}] error [{}]", metricQueryReq, e); + } + return queryStatement; + } + + private QueryStatement parserSql(MetricTable metricTable, Boolean isSingleMetricTable, ParseSqlReq parseSqlReq, + QueryStatement queryStatement) throws Exception { + MetricQueryReq metricReq = new MetricQueryReq(); + metricReq.setMetrics(metricTable.getMetrics()); + metricReq.setDimensions(metricTable.getDimensions()); + metricReq.setWhere(StringUtil.formatSqlQuota(metricTable.getWhere())); + metricReq.setNativeQuery(!AggOption.isAgg(metricTable.getAggOption())); + metricReq.setRootPath(parseSqlReq.getRootPath()); + QueryStatement tableSql = new QueryStatement(); + tableSql.setIsS2SQL(false); + tableSql.setMetricReq(metricReq); + tableSql.setMinMaxTime(queryStatement.getMinMaxTime()); + tableSql.setEnableOptimize(queryStatement.getEnableOptimize()); + tableSql.setModelIds(queryStatement.getModelIds()); + tableSql.setSemanticModel(queryStatement.getSemanticModel()); + if (isSingleMetricTable) { + tableSql.setViewSql(parseSqlReq.getSql()); + tableSql.setViewAlias(metricTable.getAlias()); + } + tableSql = parser(tableSql, metricTable.getAggOption()); + if (!tableSql.isOk()) { + throw new Exception(String.format("parser table [%s] error [%s]", metricTable.getAlias(), + tableSql.getErrMsg())); + } + queryStatement.setSourceId(tableSql.getSourceId()); + return tableSql; + } + +} diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/QueryParser.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/QueryParser.java index 197f9a677..993fd4cda 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/QueryParser.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/QueryParser.java @@ -1,156 +1,12 @@ package com.tencent.supersonic.headless.core.parser; -import com.google.common.base.Strings; -import com.tencent.supersonic.common.util.StringUtil; -import com.tencent.supersonic.headless.api.enums.AggOption; -import com.tencent.supersonic.headless.api.pojo.MetricTable; -import com.tencent.supersonic.headless.api.request.MetricQueryReq; -import com.tencent.supersonic.headless.api.request.ParseSqlReq; -import com.tencent.supersonic.headless.api.request.QueryStructReq; -import com.tencent.supersonic.headless.api.request.SqlExecuteReq; import com.tencent.supersonic.headless.core.pojo.QueryStatement; -import com.tencent.supersonic.headless.core.utils.ComponentFactory; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; /** - * logical parse from ParseSqlReq or MetricReq + * A query parser takes semantic query request and generates SQL to be executed. */ -@Component -@Slf4j -@Primary -public class QueryParser { +public interface QueryParser { - public QueryStatement parse(QueryStatement queryStatement) throws Exception { - QueryStructReq queryStructReq = queryStatement.getQueryStructReq(); - if (Objects.isNull(queryStatement.getParseSqlReq())) { - queryStatement.setParseSqlReq(new ParseSqlReq()); - } - if (Objects.isNull(queryStatement.getMetricReq())) { - queryStatement.setMetricReq(new MetricQueryReq()); - } - log.info("SemanticConverter before [{}]", queryStructReq); - for (HeadlessConverter headlessConverter : ComponentFactory.getSemanticConverters()) { - if (headlessConverter.accept(queryStatement)) { - log.info("SemanticConverter accept [{}]", headlessConverter.getClass().getName()); - headlessConverter.convert(queryStatement); - } - } - log.info("SemanticConverter after {} {} {}", queryStructReq, queryStatement.getParseSqlReq(), - queryStatement.getMetricReq()); - if (!queryStatement.getParseSqlReq().getSql().isEmpty()) { - queryStatement = parser(queryStatement.getParseSqlReq(), queryStatement); - } else { - queryStatement.getMetricReq().setNativeQuery(queryStructReq.getQueryType().isNativeAggQuery()); - queryStatement = parser(queryStatement); - } - if (Strings.isNullOrEmpty(queryStatement.getSql()) - || Strings.isNullOrEmpty(queryStatement.getSourceId())) { - throw new RuntimeException("parse Exception: " + queryStatement.getErrMsg()); - } - String querySql = - Objects.nonNull(queryStatement.getEnableLimitWrapper()) && queryStatement.getEnableLimitWrapper() - ? String.format(SqlExecuteReq.LIMIT_WRAPPER, - queryStatement.getSql()) - : queryStatement.getSql(); - queryStatement.setSql(querySql); - return queryStatement; - } - - public QueryStatement parser(ParseSqlReq parseSqlReq, QueryStatement queryStatement) { - log.info("parser MetricReq [{}] ", parseSqlReq); - try { - if (!CollectionUtils.isEmpty(parseSqlReq.getTables())) { - List tables = new ArrayList<>(); - Boolean isSingleTable = parseSqlReq.getTables().size() == 1; - for (MetricTable metricTable : parseSqlReq.getTables()) { - QueryStatement metricTableSql = parserSql(metricTable, isSingleTable, parseSqlReq, queryStatement); - if (isSingleTable && Objects.nonNull(metricTableSql.getViewSimplifySql()) - && !metricTableSql.getViewSimplifySql().isEmpty()) { - queryStatement.setSql(metricTableSql.getViewSimplifySql()); - queryStatement.setParseSqlReq(parseSqlReq); - return queryStatement; - } - tables.add(new String[]{metricTable.getAlias(), metricTableSql.getSql()}); - } - if (!tables.isEmpty()) { - String sql = ""; - if (parseSqlReq.isSupportWith()) { - sql = "with " + String.join(",", - tables.stream().map(t -> String.format("%s as (%s)", t[0], t[1])).collect( - Collectors.toList())) + "\n" + parseSqlReq.getSql(); - } else { - sql = parseSqlReq.getSql(); - for (String[] tb : tables) { - sql = StringUtils.replace(sql, tb[0], - "(" + tb[1] + ") " + (parseSqlReq.isWithAlias() ? "" : tb[0]), -1); - } - } - queryStatement.setSql(sql); - queryStatement.setParseSqlReq(parseSqlReq); - return queryStatement; - } - } - } catch (Exception e) { - log.error("physicalSql error {}", e); - queryStatement.setErrMsg(e.getMessage()); - } - return queryStatement; - } - - public QueryStatement parser(QueryStatement queryStatement) { - return parser(queryStatement, AggOption.getAggregation(queryStatement.getMetricReq().isNativeQuery())); - } - - public QueryStatement parser(QueryStatement queryStatement, AggOption isAgg) { - MetricQueryReq metricQueryReq = queryStatement.getMetricReq(); - log.info("parser metricQueryReq [{}] isAgg [{}]", metricQueryReq, isAgg); - if (metricQueryReq.getRootPath().isEmpty()) { - queryStatement.setErrMsg("rootPath empty"); - return queryStatement; - } - try { - return ComponentFactory.getSqlParser().explain(queryStatement, isAgg); - } catch (Exception e) { - queryStatement.setErrMsg(e.getMessage()); - log.error("parser error metricQueryReq[{}] error [{}]", metricQueryReq, e); - } - return queryStatement; - } - - private QueryStatement parserSql(MetricTable metricTable, Boolean isSingleMetricTable, ParseSqlReq parseSqlReq, - QueryStatement queryStatement) throws Exception { - MetricQueryReq metricReq = new MetricQueryReq(); - metricReq.setMetrics(metricTable.getMetrics()); - metricReq.setDimensions(metricTable.getDimensions()); - metricReq.setWhere(StringUtil.formatSqlQuota(metricTable.getWhere())); - metricReq.setNativeQuery(!AggOption.isAgg(metricTable.getAggOption())); - metricReq.setRootPath(parseSqlReq.getRootPath()); - QueryStatement tableSql = new QueryStatement(); - tableSql.setIsS2SQL(false); - tableSql.setMetricReq(metricReq); - tableSql.setMinMaxTime(queryStatement.getMinMaxTime()); - tableSql.setEnableOptimize(queryStatement.getEnableOptimize()); - tableSql.setModelIds(queryStatement.getModelIds()); - tableSql.setSemanticModel(queryStatement.getSemanticModel()); - if (isSingleMetricTable) { - tableSql.setViewSql(parseSqlReq.getSql()); - tableSql.setViewAlias(metricTable.getAlias()); - } - tableSql = parser(tableSql, metricTable.getAggOption()); - if (!tableSql.isOk()) { - throw new Exception(String.format("parser table [%s] error [%s]", metricTable.getAlias(), - tableSql.getErrMsg())); - } - queryStatement.setSourceId(tableSql.getSourceId()); - return tableSql; - } + void parse(QueryStatement queryStatement) throws Exception; } diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/CalculateAggConverter.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/CalculateAggConverter.java index 2afc17e0d..edcb95084 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/CalculateAggConverter.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/CalculateAggConverter.java @@ -10,7 +10,6 @@ import com.tencent.supersonic.headless.api.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.MetricTable; import com.tencent.supersonic.headless.api.request.ParseSqlReq; import com.tencent.supersonic.headless.api.request.QueryStructReq; -import com.tencent.supersonic.headless.core.parser.HeadlessConverter; import com.tencent.supersonic.headless.core.pojo.Database; import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.utils.SqlGenerateUtils; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/DefaultDimValueConverter.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/DefaultDimValueConverter.java index 4b3247498..389ad476f 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/DefaultDimValueConverter.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/DefaultDimValueConverter.java @@ -3,7 +3,6 @@ package com.tencent.supersonic.headless.core.parser.converter; import com.tencent.supersonic.common.pojo.Filter; import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.headless.api.request.QueryStructReq; -import com.tencent.supersonic.headless.core.parser.HeadlessConverter; import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Dimension; import com.tencent.supersonic.headless.core.pojo.QueryStatement; import lombok.extern.slf4j.Slf4j; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/HeadlessConverter.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/HeadlessConverter.java similarity index 81% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/HeadlessConverter.java rename to headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/HeadlessConverter.java index e20b544bb..b9371ddd7 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/HeadlessConverter.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/HeadlessConverter.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.core.parser; +package com.tencent.supersonic.headless.core.parser.converter; import com.tencent.supersonic.headless.core.pojo.QueryStatement; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/ParserDefaultConverter.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/ParserDefaultConverter.java index 7bc29c712..11686969e 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/ParserDefaultConverter.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/parser/converter/ParserDefaultConverter.java @@ -4,7 +4,6 @@ import com.tencent.supersonic.common.pojo.ColumnOrder; import com.tencent.supersonic.headless.api.pojo.Param; import com.tencent.supersonic.headless.api.request.MetricQueryReq; import com.tencent.supersonic.headless.api.request.QueryStructReq; -import com.tencent.supersonic.headless.core.parser.HeadlessConverter; import com.tencent.supersonic.headless.core.parser.calcite.s2sql.DataSource; import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.utils.SqlGenerateUtils; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/DefaultQueryPlanner.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/DefaultQueryPlanner.java new file mode 100644 index 000000000..0696ad086 --- /dev/null +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/DefaultQueryPlanner.java @@ -0,0 +1,32 @@ +package com.tencent.supersonic.headless.core.planner; + +import com.tencent.supersonic.headless.core.executor.QueryExecutor; +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; + } +} diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/DetailQuery.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/DetailQueryOptimizer.java similarity index 87% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/DetailQuery.java rename to headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/DetailQueryOptimizer.java index 0877100f3..b1206db8e 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/DetailQuery.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/DetailQueryOptimizer.java @@ -14,11 +14,12 @@ import java.util.stream.Collectors; * Remove the default metric added by the system when the query only has dimensions */ @Slf4j -@Component("DetailQuery") -public class DetailQuery implements QueryOptimizer { +@Component("DetailQueryOptimizer") +public class DetailQueryOptimizer implements QueryOptimizer { @Override - public void rewrite(QueryStructReq queryStructCmd, QueryStatement queryStatement) { + public void rewrite(QueryStatement queryStatement) { + QueryStructReq queryStructCmd = queryStatement.getQueryStructReq(); String sqlRaw = queryStatement.getSql().trim(); if (Strings.isNullOrEmpty(sqlRaw)) { throw new RuntimeException("sql is empty or null"); diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/QueryOptimizer.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/QueryOptimizer.java index cf5b37c81..d8a4ceab3 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/QueryOptimizer.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/QueryOptimizer.java @@ -1,11 +1,10 @@ package com.tencent.supersonic.headless.core.planner; -import com.tencent.supersonic.headless.api.request.QueryStructReq; import com.tencent.supersonic.headless.core.pojo.QueryStatement; /** - * the interface that rewrites QueryStatement with some optimization rules + * A query optimizer rewrites QueryStatement with a set of optimization rules */ public interface QueryOptimizer { - void rewrite(QueryStructReq queryStructCmd, QueryStatement queryStatement); + void rewrite(QueryStatement queryStatement); } diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/QueryPlanner.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/QueryPlanner.java index 1808cb6ad..5400e4c0e 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/QueryPlanner.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/planner/QueryPlanner.java @@ -2,31 +2,13 @@ package com.tencent.supersonic.headless.core.planner; import com.tencent.supersonic.headless.core.executor.QueryExecutor; 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 QueryPlanner { +/** + * 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); - public QueryExecutor plan(QueryStatement queryStatement) { - optimizer(queryStatement); - return route(queryStatement); - } - - public void optimizer(QueryStatement queryStatement) { - for (QueryOptimizer queryOptimizer : ComponentFactory.getQueryOptimizers()) { - queryOptimizer.rewrite(queryStatement.getQueryStructReq(), queryStatement); - } - } - - public QueryExecutor route(QueryStatement queryStatement) { - for (QueryExecutor queryExecutor : ComponentFactory.getQueryExecutors()) { - if (queryExecutor.accept(queryStatement)) { - return queryExecutor; - } - } - return null; - } + QueryExecutor route(QueryStatement queryStatement); } diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/ComponentFactory.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/ComponentFactory.java index 66310bca1..f94338c6c 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/ComponentFactory.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/ComponentFactory.java @@ -3,9 +3,9 @@ package com.tencent.supersonic.headless.core.utils; import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.headless.core.executor.JdbcExecutor; import com.tencent.supersonic.headless.core.executor.QueryExecutor; -import com.tencent.supersonic.headless.core.planner.DetailQuery; +import com.tencent.supersonic.headless.core.planner.DetailQueryOptimizer; import com.tencent.supersonic.headless.core.planner.QueryOptimizer; -import com.tencent.supersonic.headless.core.parser.HeadlessConverter; +import com.tencent.supersonic.headless.core.parser.converter.HeadlessConverter; import com.tencent.supersonic.headless.core.parser.SqlParser; import com.tencent.supersonic.headless.core.parser.calcite.CalciteSqlParser; import com.tencent.supersonic.headless.core.parser.converter.CalculateAggConverter; @@ -74,7 +74,7 @@ public class ComponentFactory { } private static void initQueryOptimizer() { - queryOptimizers.put("DetailQuery", getBean("DetailQuery", DetailQuery.class)); + queryOptimizers.put("DetailQueryOptimizer", getBean("DetailQueryOptimizer", DetailQueryOptimizer.class)); } private static void initQueryExecutors() { diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/manager/DimensionYamlManager.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/DimensionYamlManager.java similarity index 90% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/manager/DimensionYamlManager.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/DimensionYamlManager.java index 92ca4acb0..830836310 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/manager/DimensionYamlManager.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/DimensionYamlManager.java @@ -1,9 +1,9 @@ -package com.tencent.supersonic.headless.core.manager; +package com.tencent.supersonic.headless.server.manager; import com.tencent.supersonic.headless.api.enums.IdentifyType; import com.tencent.supersonic.headless.api.response.DimensionResp; -import com.tencent.supersonic.headless.core.pojo.yaml.DimensionYamlTpl; +import com.tencent.supersonic.headless.server.pojo.yaml.DimensionYamlTpl; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/manager/MetricYamlManager.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/MetricYamlManager.java similarity index 90% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/manager/MetricYamlManager.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/MetricYamlManager.java index f9e4d1b60..ba65e6ac6 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/manager/MetricYamlManager.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/MetricYamlManager.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.core.manager; +package com.tencent.supersonic.headless.server.manager; import com.google.common.collect.Lists; import com.tencent.supersonic.headless.api.enums.MetricDefineType; @@ -9,11 +9,11 @@ import com.tencent.supersonic.headless.api.pojo.MetricDefineByMeasureParams; import com.tencent.supersonic.headless.api.pojo.MetricDefineByMetricParams; import com.tencent.supersonic.headless.api.pojo.MetricParam; import com.tencent.supersonic.headless.api.response.MetricResp; -import com.tencent.supersonic.headless.core.pojo.yaml.FieldParamYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MeasureYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MetricParamYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MetricTypeParamsYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MetricYamlTpl; +import com.tencent.supersonic.headless.server.pojo.yaml.FieldParamYamlTpl; +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.MetricTypeParamsYamlTpl; +import com.tencent.supersonic.headless.server.pojo.yaml.MetricYamlTpl; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/manager/ModelYamlManager.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/ModelYamlManager.java similarity index 91% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/manager/ModelYamlManager.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/ModelYamlManager.java index 91ae2590b..f15e97dbb 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/manager/ModelYamlManager.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/ModelYamlManager.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.core.manager; +package com.tencent.supersonic.headless.server.manager; import com.tencent.supersonic.headless.api.enums.DatasourceQuery; import com.tencent.supersonic.headless.api.enums.ModelSourceType; @@ -10,11 +10,11 @@ import com.tencent.supersonic.headless.api.response.DatabaseResp; import com.tencent.supersonic.headless.api.response.ModelResp; import com.tencent.supersonic.headless.core.adaptor.db.DbAdaptor; import com.tencent.supersonic.headless.core.adaptor.db.DbAdaptorFactory; -import com.tencent.supersonic.headless.core.pojo.yaml.DataModelYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.DimensionTimeTypeParamsTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.DimensionYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.IdentifyYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MeasureYamlTpl; +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.DimensionYamlTpl; +import com.tencent.supersonic.headless.server.pojo.yaml.IdentifyYamlTpl; +import com.tencent.supersonic.headless.server.pojo.yaml.MeasureYamlTpl; import com.tencent.supersonic.headless.core.utils.SysTimeDimensionBuilder; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java index e7bf45b87..5613ceb68 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java @@ -20,15 +20,15 @@ import com.tencent.supersonic.headless.core.parser.calcite.s2sql.Metric; import com.tencent.supersonic.headless.core.parser.calcite.s2sql.MetricTypeParams; import com.tencent.supersonic.headless.core.parser.calcite.s2sql.SemanticModel; import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; -import com.tencent.supersonic.headless.core.pojo.yaml.DataModelYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.DimensionTimeTypeParamsTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.DimensionYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.FieldParamYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.IdentifyYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MeasureYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MetricParamYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MetricTypeParamsYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MetricYamlTpl; +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.DimensionYamlTpl; +import com.tencent.supersonic.headless.server.pojo.yaml.FieldParamYamlTpl; +import com.tencent.supersonic.headless.server.pojo.yaml.IdentifyYamlTpl; +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.MetricTypeParamsYamlTpl; +import com.tencent.supersonic.headless.server.pojo.yaml.MetricYamlTpl; import com.tencent.supersonic.headless.server.service.Catalog; import com.tencent.supersonic.headless.server.utils.DatabaseConverter; import java.util.ArrayList; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/DataModelYamlTpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DataModelYamlTpl.java similarity index 91% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/DataModelYamlTpl.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DataModelYamlTpl.java index 2b00e52d3..af89bbdb2 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/DataModelYamlTpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DataModelYamlTpl.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.core.pojo.yaml; +package com.tencent.supersonic.headless.server.pojo.yaml; import com.tencent.supersonic.headless.api.enums.ModelSourceType; import com.tencent.supersonic.headless.api.pojo.Field; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/DimensionTimeTypeParamsTpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DimensionTimeTypeParamsTpl.java similarity index 71% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/DimensionTimeTypeParamsTpl.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DimensionTimeTypeParamsTpl.java index 39ccea7c1..7d4f5084a 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/DimensionTimeTypeParamsTpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DimensionTimeTypeParamsTpl.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.core.pojo.yaml; +package com.tencent.supersonic.headless.server.pojo.yaml; import lombok.Data; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/DimensionYamlTpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DimensionYamlTpl.java similarity index 87% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/DimensionYamlTpl.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DimensionYamlTpl.java index 0ff5d1e6a..85efdeaa2 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/DimensionYamlTpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/DimensionYamlTpl.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.core.pojo.yaml; +package com.tencent.supersonic.headless.server.pojo.yaml; import com.tencent.supersonic.common.pojo.enums.DataTypeEnums; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/FieldParamYamlTpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/FieldParamYamlTpl.java similarity index 62% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/FieldParamYamlTpl.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/FieldParamYamlTpl.java index 26a08bdbf..f701fe54c 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/FieldParamYamlTpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/FieldParamYamlTpl.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.core.pojo.yaml; +package com.tencent.supersonic.headless.server.pojo.yaml; import lombok.Data; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/IdentifyYamlTpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/IdentifyYamlTpl.java similarity index 82% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/IdentifyYamlTpl.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/IdentifyYamlTpl.java index 5e2744676..cd612cf04 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/IdentifyYamlTpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/IdentifyYamlTpl.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.core.pojo.yaml; +package com.tencent.supersonic.headless.server.pojo.yaml; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/MeasureYamlTpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/MeasureYamlTpl.java similarity index 85% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/MeasureYamlTpl.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/MeasureYamlTpl.java index e2088f8f2..aa797d5c9 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/MeasureYamlTpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/MeasureYamlTpl.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.core.pojo.yaml; +package com.tencent.supersonic.headless.server.pojo.yaml; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/MetricParamYamlTpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/MetricParamYamlTpl.java similarity index 66% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/MetricParamYamlTpl.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/MetricParamYamlTpl.java index 9f84ae9c7..2b2cbace3 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/MetricParamYamlTpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/MetricParamYamlTpl.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.core.pojo.yaml; +package com.tencent.supersonic.headless.server.pojo.yaml; import lombok.Data; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/MetricTypeParamsYamlTpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/MetricTypeParamsYamlTpl.java similarity index 86% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/MetricTypeParamsYamlTpl.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/MetricTypeParamsYamlTpl.java index 5fc59ca81..05deab95f 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/MetricTypeParamsYamlTpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/MetricTypeParamsYamlTpl.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.core.pojo.yaml; +package com.tencent.supersonic.headless.server.pojo.yaml; import lombok.Data; import org.apache.commons.compress.utils.Lists; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/MetricYamlTpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/MetricYamlTpl.java similarity index 79% rename from headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/MetricYamlTpl.java rename to headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/MetricYamlTpl.java index 41c5dc0a3..d60038ef2 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/pojo/yaml/MetricYamlTpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/yaml/MetricYamlTpl.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.headless.core.pojo.yaml; +package com.tencent.supersonic.headless.server.pojo.yaml; import lombok.Data; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/Catalog.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/Catalog.java index c7d8b7af2..260cab482 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/Catalog.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/Catalog.java @@ -8,9 +8,9 @@ import com.tencent.supersonic.headless.api.response.DimensionResp; import com.tencent.supersonic.headless.api.response.MetricResp; import com.tencent.supersonic.headless.api.response.ModelResp; import com.tencent.supersonic.headless.api.response.ModelSchemaResp; -import com.tencent.supersonic.headless.core.pojo.yaml.DataModelYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.DimensionYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MetricYamlTpl; +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.MetricYamlTpl; import com.tencent.supersonic.headless.server.pojo.MetaFilter; import java.util.List; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/ModelService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/ModelService.java index 9c8062208..b0327b279 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/ModelService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/ModelService.java @@ -12,9 +12,9 @@ import com.tencent.supersonic.headless.api.response.DatabaseResp; import com.tencent.supersonic.headless.api.response.ModelResp; import com.tencent.supersonic.headless.api.response.ModelSchemaResp; import com.tencent.supersonic.headless.api.response.UnAvailableItemResp; -import com.tencent.supersonic.headless.core.pojo.yaml.DataModelYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.DimensionYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MetricYamlTpl; +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.MetricYamlTpl; import com.tencent.supersonic.headless.server.pojo.ModelFilter; import java.util.List; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/CatalogImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/CatalogImpl.java index da0823a99..d7de1d371 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/CatalogImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/CatalogImpl.java @@ -9,9 +9,9 @@ import com.tencent.supersonic.headless.api.response.DimensionResp; import com.tencent.supersonic.headless.api.response.MetricResp; import com.tencent.supersonic.headless.api.response.ModelResp; import com.tencent.supersonic.headless.api.response.ModelSchemaResp; -import com.tencent.supersonic.headless.core.pojo.yaml.DataModelYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.DimensionYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MetricYamlTpl; +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.MetricYamlTpl; import com.tencent.supersonic.headless.server.pojo.MetaFilter; import com.tencent.supersonic.headless.server.service.Catalog; import com.tencent.supersonic.headless.server.service.DatabaseService; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ModelServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ModelServiceImpl.java index f3bb0046f..accab3969 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ModelServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ModelServiceImpl.java @@ -31,12 +31,12 @@ import com.tencent.supersonic.headless.api.response.MetricSchemaResp; import com.tencent.supersonic.headless.api.response.ModelResp; import com.tencent.supersonic.headless.api.response.ModelSchemaResp; import com.tencent.supersonic.headless.api.response.UnAvailableItemResp; -import com.tencent.supersonic.headless.core.manager.DimensionYamlManager; -import com.tencent.supersonic.headless.core.manager.MetricYamlManager; -import com.tencent.supersonic.headless.core.manager.ModelYamlManager; -import com.tencent.supersonic.headless.core.pojo.yaml.DataModelYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.DimensionYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MetricYamlTpl; +import com.tencent.supersonic.headless.server.manager.DimensionYamlManager; +import com.tencent.supersonic.headless.server.manager.MetricYamlManager; +import com.tencent.supersonic.headless.server.manager.ModelYamlManager; +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.MetricYamlTpl; import com.tencent.supersonic.headless.server.persistence.dataobject.DateInfoDO; import com.tencent.supersonic.headless.server.persistence.dataobject.ModelDO; import com.tencent.supersonic.headless.server.persistence.repository.DateInfoRepository; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/QueryServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/QueryServiceImpl.java index 4777cef77..2916dc752 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/QueryServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/QueryServiceImpl.java @@ -37,6 +37,7 @@ import com.tencent.supersonic.headless.api.response.ModelResp; import com.tencent.supersonic.headless.api.response.ModelSchemaResp; import com.tencent.supersonic.headless.api.response.SemanticQueryResp; import com.tencent.supersonic.headless.core.executor.QueryExecutor; +import com.tencent.supersonic.headless.core.parser.DefaultQueryParser; 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; @@ -44,7 +45,7 @@ import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.server.annotation.S2SQLDataPermission; import com.tencent.supersonic.headless.server.annotation.StructDataPermission; import com.tencent.supersonic.headless.server.aspect.ApiHeaderCheckAspect; -import com.tencent.supersonic.headless.server.cache.QueryCache; +import com.tencent.supersonic.headless.core.cache.QueryCache; import com.tencent.supersonic.headless.server.manager.SemanticSchemaManager; import com.tencent.supersonic.headless.server.pojo.DimensionFilter; import com.tencent.supersonic.headless.server.service.AppService; @@ -96,7 +97,7 @@ public class QueryServiceImpl implements QueryService { AppService appService, QueryCache queryCache, SemanticSchemaManager semanticSchemaManager, - QueryParser queryParser, + DefaultQueryParser queryParser, QueryPlanner queryPlanner) { this.statUtils = statUtils; this.queryUtils = queryUtils; @@ -259,8 +260,8 @@ public class QueryServiceImpl implements QueryService { List sqlParsers = new ArrayList<>(); for (QueryStructReq queryStructReq : queryMultiStructReq.getQueryStructReqs()) { QueryStatement queryStatement = buildQueryStatement(queryStructReq); - queryStatement = queryParser.parse(queryStatement); - queryPlanner.optimizer(queryStatement); + queryParser.parse(queryStatement); + queryPlanner.plan(queryStatement); sqlParsers.add(queryStatement); } log.info("multi sqlParser:{}", sqlParsers); @@ -456,9 +457,9 @@ public class QueryServiceImpl implements QueryService { } private QueryStatement plan(QueryStatement queryStatement) throws Exception { - queryStatement = queryParser.parse(queryStatement); + queryParser.parse(queryStatement); log.info("queryStatement:{}", queryStatement); - queryPlanner.optimizer(queryStatement); + queryPlanner.plan(queryStatement); return queryStatement; } @@ -467,7 +468,7 @@ public class QueryServiceImpl implements QueryService { log.info("[QueryStatement:{}]", queryStatement); try { //1 parse - queryStatement = queryParser.parse(queryStatement); + queryParser.parse(queryStatement); //2 plan QueryExecutor queryExecutor = queryPlanner.plan(queryStatement); //3 execute diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/QueryUtils.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/QueryUtils.java index 5da568d31..20523c598 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/QueryUtils.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/QueryUtils.java @@ -14,7 +14,7 @@ import com.tencent.supersonic.headless.api.response.MetricResp; import com.tencent.supersonic.headless.api.response.SemanticQueryResp; import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.utils.SqlGenerateUtils; -import com.tencent.supersonic.headless.server.cache.CacheManager; +import com.tencent.supersonic.headless.core.cache.CacheManager; import com.tencent.supersonic.headless.server.pojo.MetaFilter; import com.tencent.supersonic.headless.server.service.Catalog; import java.util.Arrays; diff --git a/headless/server/src/test/java/com/tencent/supersonic/headless/server/calcite/HeadlessParserServiceTest.java b/headless/server/src/test/java/com/tencent/supersonic/headless/server/calcite/HeadlessParserServiceTest.java index c942db3a0..f19089572 100644 --- a/headless/server/src/test/java/com/tencent/supersonic/headless/server/calcite/HeadlessParserServiceTest.java +++ b/headless/server/src/test/java/com/tencent/supersonic/headless/server/calcite/HeadlessParserServiceTest.java @@ -8,13 +8,13 @@ import com.tencent.supersonic.headless.api.response.SqlParserResp; import com.tencent.supersonic.headless.core.parser.calcite.planner.AggPlanner; import com.tencent.supersonic.headless.core.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.headless.core.pojo.QueryStatement; -import com.tencent.supersonic.headless.core.pojo.yaml.DataModelYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.DimensionTimeTypeParamsTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.DimensionYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.IdentifyYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MeasureYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MetricTypeParamsYamlTpl; -import com.tencent.supersonic.headless.core.pojo.yaml.MetricYamlTpl; +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.DimensionYamlTpl; +import com.tencent.supersonic.headless.server.pojo.yaml.IdentifyYamlTpl; +import com.tencent.supersonic.headless.server.pojo.yaml.MeasureYamlTpl; +import com.tencent.supersonic.headless.server.pojo.yaml.MetricTypeParamsYamlTpl; +import com.tencent.supersonic.headless.server.pojo.yaml.MetricYamlTpl; import com.tencent.supersonic.headless.server.manager.SemanticSchemaManager; import lombok.extern.slf4j.Slf4j;