Squashed commit of the following: (#598)

This commit is contained in:
jipeli
2024-01-04 22:00:55 +08:00
committed by GitHub
parent 602b9547b8
commit 72bd79fe73
40 changed files with 128 additions and 9 deletions

View File

@@ -1,5 +1,10 @@
package com.tencent.supersonic.headless.api.enums; package com.tencent.supersonic.headless.api.enums;
/**
* Aggregation type of metric when query metric without aggregation method
* NATIVE: will not use Aggregation
* DEFAULT: will use the aggregation method define in the model
*/
public enum AggOption { public enum AggOption {
NATIVE, NATIVE,
AGGREGATION, AGGREGATION,

View File

@@ -1,6 +1,10 @@
package com.tencent.supersonic.headless.api.enums; package com.tencent.supersonic.headless.api.enums;
/**
* model datasource define type:
* sql_query : view sql begin as select
* table_query: dbName.tableName
*/
public enum DatasourceQuery { public enum DatasourceQuery {
SQL_QUERY("sql_query"), SQL_QUERY("sql_query"),

View File

@@ -1,7 +1,12 @@
package com.tencent.supersonic.headless.api.enums; package com.tencent.supersonic.headless.api.enums;
import java.util.Objects; import java.util.Objects;
/**
* model source table type:
* FULL: table without time partition
* PARTITION: table with partition field
* ZIPPER: table with slowly changing dimension
*/
public enum ModelSourceType { public enum ModelSourceType {
FULL, FULL,
PARTITION, PARTITION,

View File

@@ -1,6 +1,8 @@
package com.tencent.supersonic.headless.core.adaptor.db; package com.tencent.supersonic.headless.core.adaptor.db;
/**
* Adapters for different query engines to obtain table, field, and time formatting methods
*/
public abstract class DbAdaptor { public abstract class DbAdaptor {
public abstract String getDateFormat(String dateType, String dateFormat, String column); public abstract String getDateFormat(String dateType, String dateFormat, String column);

View File

@@ -3,6 +3,9 @@ package com.tencent.supersonic.headless.core.executor;
import com.tencent.supersonic.headless.api.response.QueryResultWithSchemaResp; import com.tencent.supersonic.headless.api.response.QueryResultWithSchemaResp;
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
*/
public interface QueryExecutor { public interface QueryExecutor {
boolean accept(QueryStatement queryStatement); boolean accept(QueryStatement queryStatement);

View File

@@ -13,7 +13,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* manager to handle the dimension
*/
@Slf4j @Slf4j
@Service @Service
public class DimensionYamlManager { public class DimensionYamlManager {

View File

@@ -15,7 +15,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* manager to handle the metric
*/
@Slf4j @Slf4j
@Service @Service
public class MetricYamlManager { public class MetricYamlManager {

View File

@@ -24,7 +24,9 @@ import org.springframework.util.CollectionUtils;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* manager to handle the model
*/
@Service @Service
@Slf4j @Slf4j
public class ModelYamlManager { public class ModelYamlManager {

View File

@@ -10,6 +10,9 @@ import org.springframework.util.CollectionUtils;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* Remove the default metric added by the system when the query only has dimensions
*/
@Slf4j @Slf4j
@Component("DetailQuery") @Component("DetailQuery")
public class DetailQuery implements QueryOptimizer { public class DetailQuery implements QueryOptimizer {

View File

@@ -3,6 +3,9 @@ package com.tencent.supersonic.headless.core.optimizer;
import com.tencent.supersonic.headless.api.request.QueryStructReq; import com.tencent.supersonic.headless.api.request.QueryStructReq;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
/**
* the interface that rewrites QueryStatement with some optimization rules
*/
public interface QueryOptimizer { public interface QueryOptimizer {
void rewrite(QueryStructReq queryStructCmd, QueryStatement queryStatement); void rewrite(QueryStructReq queryStructCmd, QueryStatement queryStatement);
} }

View File

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

View File

@@ -19,6 +19,9 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* logical parse from ParseSqlReq or MetricReq
*/
@Component @Component
@Slf4j @Slf4j
@Primary @Primary

View File

@@ -10,6 +10,9 @@ import com.tencent.supersonic.headless.core.parser.calcite.schema.RuntimeOptions
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/**
* the calcite parse implements
*/
@Component("CalciteSqlParser") @Component("CalciteSqlParser")
public class CalciteSqlParser implements SqlParser { public class CalciteSqlParser implements SqlParser {

View File

@@ -36,6 +36,9 @@ import org.apache.calcite.sql2rel.SqlToRelConverter;
import org.apache.calcite.tools.FrameworkConfig; import org.apache.calcite.tools.FrameworkConfig;
import org.apache.calcite.tools.Frameworks; import org.apache.calcite.tools.Frameworks;
/**
* global configuration of the calcite
*/
public class Configuration { public class Configuration {
public static Properties configProperties = new Properties(); public static Properties configProperties = new Properties();
@@ -94,7 +97,8 @@ public class Configuration {
return SqlToRelConverter.config() return SqlToRelConverter.config()
.withHintStrategyTable(strategies) .withHintStrategyTable(strategies)
.withTrimUnusedFields(true) .withTrimUnusedFields(true)
.withExpand(true); .withExpand(true)
.addRelBuilderConfigTransform(c -> c.withSimplify(false));
} }
public static SqlToRelConverter getSqlToRelConverter(SqlValidatorScope scope, SqlValidator sqlValidator, public static SqlToRelConverter getSqlToRelConverter(SqlValidatorScope scope, SqlValidator sqlValidator,

View File

@@ -36,6 +36,9 @@ import java.util.ListIterator;
import java.util.Objects; import java.util.Objects;
import java.util.Stack; import java.util.Stack;
/**
* parsing from query dimensions and metrics
*/
@Slf4j @Slf4j
public class AggPlanner implements Planner { public class AggPlanner implements Planner {

View File

@@ -5,6 +5,9 @@ import com.tencent.supersonic.headless.api.enums.AggOption;
import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import com.tencent.supersonic.headless.core.parser.calcite.schema.HeadlessSchema; import com.tencent.supersonic.headless.core.parser.calcite.schema.HeadlessSchema;
/**
* parse and generate SQL and other execute information
*/
public interface Planner { public interface Planner {
public void explain(QueryStatement queryStatement, AggOption aggOption) throws Exception; public void explain(QueryStatement queryStatement, AggOption aggOption) throws Exception;

View File

@@ -22,6 +22,9 @@ import org.apache.calcite.schema.TranslatableTable;
import org.apache.calcite.schema.impl.AbstractTable; import org.apache.calcite.schema.impl.AbstractTable;
import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.sql.type.SqlTypeName;
/**
* customize the AbstractTable
*/
public class DataSourceTable extends AbstractTable implements ScannableTable, TranslatableTable { public class DataSourceTable extends AbstractTable implements ScannableTable, TranslatableTable {
private final String tableName; private final String tableName;

View File

@@ -16,6 +16,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public class HeadlessSchema extends AbstractSchema { public class HeadlessSchema extends AbstractSchema {
private final String rootPath; private final String rootPath;

View File

@@ -4,6 +4,9 @@ import org.apache.calcite.sql.fun.SqlLibrary;
import org.apache.calcite.sql.validate.SqlConformance; import org.apache.calcite.sql.validate.SqlConformance;
import org.apache.calcite.sql.validate.SqlConformanceEnum; import org.apache.calcite.sql.validate.SqlConformanceEnum;
/**
* customize the SqlConformance
*/
public class HeadlessSqlConformance implements SqlConformance { public class HeadlessSqlConformance implements SqlConformance {
@Override @Override

View File

@@ -4,6 +4,9 @@ import java.nio.charset.Charset;
import org.apache.calcite.rel.type.RelDataTypeSystem; import org.apache.calcite.rel.type.RelDataTypeSystem;
import org.apache.calcite.sql.type.SqlTypeFactoryImpl; import org.apache.calcite.sql.type.SqlTypeFactoryImpl;
/**
* customize the SqlTypeFactoryImpl
*/
public class HeadlessSqlTypeFactoryImpl extends SqlTypeFactoryImpl { public class HeadlessSqlTypeFactoryImpl extends SqlTypeFactoryImpl {
public HeadlessSqlTypeFactoryImpl(RelDataTypeSystem typeSystem) { public HeadlessSqlTypeFactoryImpl(RelDataTypeSystem typeSystem) {

View File

@@ -10,6 +10,9 @@ import org.apache.calcite.sql.SqlWriter;
import org.apache.calcite.sql.validate.SqlConformance; import org.apache.calcite.sql.validate.SqlConformance;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
/**
* customize the SqlDialect
*/
public class SemanticSqlDialect extends SqlDialect { public class SemanticSqlDialect extends SqlDialect {
public static final Context DEFAULT_CONTEXT = SqlDialect.EMPTY_CONTEXT public static final Context DEFAULT_CONTEXT = SqlDialect.EMPTY_CONTEXT

View File

@@ -5,6 +5,9 @@ import org.apache.calcite.plan.RelOptTable;
import org.apache.calcite.rel.RelRoot; import org.apache.calcite.rel.RelRoot;
import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataType;
/**
* customize the ViewExpander
*/
public class ViewExpanderImpl implements RelOptTable.ViewExpander { public class ViewExpanderImpl implements RelOptTable.ViewExpander {
public ViewExpanderImpl() { public ViewExpanderImpl() {
} }

View File

@@ -20,6 +20,9 @@ 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;
/**
* process TableView
*/
@Data @Data
public abstract class Renderer { public abstract class Renderer {

View File

@@ -5,6 +5,9 @@ import org.apache.calcite.sql.SqlOperatorTable;
import org.apache.calcite.sql.validate.SqlValidatorCatalogReader; import org.apache.calcite.sql.validate.SqlValidatorCatalogReader;
import org.apache.calcite.sql.validate.SqlValidatorImpl; import org.apache.calcite.sql.validate.SqlValidatorImpl;
/**
* customize the SqlValidatorImpl
*/
public class S2SQLSqlValidatorImpl extends SqlValidatorImpl { public class S2SQLSqlValidatorImpl extends SqlValidatorImpl {
public S2SQLSqlValidatorImpl(SqlOperatorTable opTab, SqlValidatorCatalogReader catalogReader, public S2SQLSqlValidatorImpl(SqlOperatorTable opTab, SqlValidatorCatalogReader catalogReader,

View File

@@ -12,6 +12,9 @@ import org.apache.calcite.sql.SqlNodeList;
import org.apache.calcite.sql.SqlSelect; import org.apache.calcite.sql.SqlSelect;
import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.parser.SqlParserPos;
/**
* basic query project
*/
@Data @Data
public class TableView { public class TableView {

View File

@@ -42,6 +42,9 @@ import org.apache.calcite.sql.validate.SqlValidatorScope;
import org.apache.calcite.sql2rel.SqlToRelConverter; import org.apache.calcite.sql2rel.SqlToRelConverter;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
/**
* model item node
*/
public abstract class SemanticNode { public abstract class SemanticNode {
public static Set<SqlKind> AGGREGATION_KIND = new HashSet<>(); public static Set<SqlKind> AGGREGATION_KIND = new HashSet<>();

View File

@@ -11,6 +11,9 @@ import org.apache.calcite.sql.SqlNodeList;
import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlOperator;
import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.SqlWriter;
/**
* extend node to handle lateral explode view
*/
public class LateralViewExplodeNode extends ExtendNode { public class LateralViewExplodeNode extends ExtendNode {
public final String sqlNameView = "view"; public final String sqlNameView = "view";

View File

@@ -26,6 +26,10 @@ import org.apache.calcite.util.ImmutableBitSet;
import org.apache.calcite.util.Pair; import org.apache.calcite.util.Pair;
import org.apache.commons.lang3.tuple.Triple; import org.apache.commons.lang3.tuple.Triple;
/**
* push down the time filter into group using the RuntimeOptions defined minMaxTime
*
*/
public class FilterToGroupScanRule extends RelRule<Config> public class FilterToGroupScanRule extends RelRule<Config>
implements TransformationRule { implements TransformationRule {

View File

@@ -23,6 +23,9 @@ import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* process query specified filtering information
*/
public class FilterRender extends Renderer { public class FilterRender extends Renderer {
@Override @Override

View File

@@ -41,6 +41,9 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* process the join conditions when the source number is greater than 1
*/
@Slf4j @Slf4j
public class JoinRender extends Renderer { public class JoinRender extends Renderer {

View File

@@ -18,6 +18,9 @@ import org.apache.calcite.sql.parser.SqlParserPos;
import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.sql.validate.SqlValidatorScope;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
/**
* process the query result items from query request
*/
public class OutputRender extends Renderer { public class OutputRender extends Renderer {
@Override @Override

View File

@@ -32,6 +32,9 @@ import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* process the table view from the defined data model schema
*/
@Slf4j @Slf4j
public class SourceRender extends Renderer { public class SourceRender extends Renderer {

View File

@@ -24,7 +24,9 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* supplement the QueryStatement when query with custom aggregation method
*/
@Component("CalculateAggConverter") @Component("CalculateAggConverter")
@Slf4j @Slf4j
public class CalculateAggConverter implements HeadlessConverter { public class CalculateAggConverter implements HeadlessConverter {

View File

@@ -17,6 +17,9 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* HeadlessConverter default implement
*/
@Component("ParserDefaultConverter") @Component("ParserDefaultConverter")
@Slf4j @Slf4j
public class ParserDefaultConverter implements HeadlessConverter { public class ParserDefaultConverter implements HeadlessConverter {

View File

@@ -16,6 +16,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* HeadlessConverter QueryOptimizer QueryExecutor object factory
*/
public class ComponentFactory { public class ComponentFactory {
private static List<HeadlessConverter> headlessConverters = new ArrayList<>(); private static List<HeadlessConverter> headlessConverters = new ArrayList<>();

View File

@@ -11,6 +11,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* transform query results to return the users
*/
public class DataTransformUtils { public class DataTransformUtils {
public static List<Map<String, Object>> transform(List<Map<String, Object>> originalData, String metric, public static List<Map<String, Object>> transform(List<Map<String, Object>> originalData, String metric,

View File

@@ -27,6 +27,9 @@ import static com.tencent.supersonic.common.pojo.Constants.NEW_LINE_CHAR;
import static com.tencent.supersonic.common.pojo.Constants.PATTERN_JDBC_TYPE; import static com.tencent.supersonic.common.pojo.Constants.PATTERN_JDBC_TYPE;
import static com.tencent.supersonic.common.pojo.Constants.SPACE; import static com.tencent.supersonic.common.pojo.Constants.SPACE;
/**
* tools functions about jdbc
*/
@Slf4j @Slf4j
public class JdbcDataSourceUtils { public class JdbcDataSourceUtils {

View File

@@ -35,6 +35,9 @@ import static com.tencent.supersonic.common.pojo.Constants.MONTH;
import static com.tencent.supersonic.common.pojo.Constants.UNDERLINE; import static com.tencent.supersonic.common.pojo.Constants.UNDERLINE;
import static com.tencent.supersonic.common.pojo.Constants.WEEK; import static com.tencent.supersonic.common.pojo.Constants.WEEK;
/**
* tools functions to analyze queryStructReq
*/
@Component @Component
@Slf4j @Slf4j
public class SqlGenerateUtils { public class SqlGenerateUtils {

View File

@@ -29,7 +29,9 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/**
* tools functions about sql query
*/
@Slf4j @Slf4j
@Component @Component
public class SqlUtils { public class SqlUtils {

View File

@@ -9,6 +9,9 @@ import lombok.extern.slf4j.Slf4j;
import java.util.List; import java.util.List;
/**
* generate system time dimension tools
*/
@Slf4j @Slf4j
public class SysTimeDimensionBuilder { public class SysTimeDimensionBuilder {