From 40ba179703fe587fe40649ec8cba34112a4eea45 Mon Sep 17 00:00:00 2001 From: jipeli <54889677+jipeli@users.noreply.github.com> Date: Mon, 16 Oct 2023 22:07:45 +0800 Subject: [PATCH] (feature)(semantic) add materialization optimizer (#239) Co-authored-by: jipengli --- .../common/pojo/enums/AggOperatorEnum.java | 1 + .../common/pojo/enums/DataTypeEnums.java | 45 + .../supersonic/common/util/StringUtil.java | 8 + .../common/util/calcite/SqlParseUtils.java | 69 +- .../util/jsqlparser/FilterRemoveVisitor.java | 96 ++ .../jsqlparser/SqlParserRemoveHelper.java | 19 + .../jsqlparser/SqlParserSelectHelper.java | 62 +- launchers/standalone/pom.xml | 6 + .../src/main/resources/db/schema-h2.sql | 64 + .../src/main/resources/db/schema-mysql.sql | 66 + .../src/main/resources/db/sql-update.sql | 9 +- .../src/test/resources/db/schema-h2.sql | 66 + .../enums/ElementFrequencyEnum.java | 8 + .../enums/ElementTypeEnum.java | 11 + .../enums/MaterializedTypeEnum.java | 7 + .../enums/UpdateCycleEnum.java | 8 + .../pojo/MaterializationConfFilter.java | 17 + .../pojo/MaterializationDateFilter.java | 16 + .../pojo/MaterializationFilter.java | 25 + .../pojo/MaterializationRecordFilter.java | 28 + .../request/MaterializationElementReq.java | 25 + .../request/MaterializationRecordReq.java | 24 + .../request/MaterializationReq.java | 26 + .../request/MaterializationSourceReq.java | 12 + .../response/MaterializationDateResp.java | 20 + .../MaterializationElementModelResp.java | 18 + .../response/MaterializationElementResp.java | 23 + .../response/MaterializationRecordResp.java | 24 + .../response/MaterializationResp.java | 25 + .../response/MaterializationSourceResp.java | 35 + .../api/model/enums/QueryOptMode.java | 8 + .../semantic/api/model/pojo/Dim.java | 13 + .../semantic/api/model/pojo/QueryStat.java | 8 + .../api/model/request/DimensionReq.java | 3 + .../api/model/response/DatasourceResp.java | 2 + .../api/model/response/DimensionResp.java | 3 + semantic/materialization/pom.xml | 39 + .../MaterializationConfServiceImpl.java | 490 +++++++ .../MaterializationRecordServiceImpl.java | 80 ++ .../domain/MaterializationConfService.java | 44 + .../domain/MaterializationRecordService.java | 27 + .../domain/dataobject/MaterializationDO.java | 145 ++ .../dataobject/MaterializationDOExample.java | 1112 ++++++++++++++++ .../MaterializationDOWithBLOBs.java | 33 + .../dataobject/MaterializationElementDO.java | 95 ++ .../MaterializationElementDOExample.java | 992 ++++++++++++++ .../MaterializationElementDOKey.java | 33 + .../MaterializationElementDOWithBLOBs.java | 23 + .../dataobject/MaterializationRecordDO.java | 168 +++ .../MaterializationRecordDOExample.java | 1172 +++++++++++++++++ .../domain/pojo/Materialization.java | 28 + .../domain/pojo/MaterializationElement.java | 23 + .../domain/pojo/MaterializationRecord.java | 23 + .../MaterializationElementRepository.java | 17 + .../MaterializationRecordRepository.java | 18 + .../repository/MaterializationRepository.java | 17 + .../utils/MaterializationConverter.java | 146 ++ .../utils/MaterializationPartitionHelper.java | 78 ++ .../utils/MaterializationRecordConverter.java | 57 + .../domain/utils/MaterializationUtils.java | 8 + .../utils/MaterializationZipperUtils.java | 85 ++ .../mapper/MaterializationDOCustomMapper.java | 13 + .../mapper/MaterializationDOMapper.java | 31 + .../MaterializationElementDOMapper.java | 35 + .../mapper/MaterializationRecordDOMapper.java | 33 + .../MaterializationElementRepositoryImpl.java | 82 ++ .../MaterializationRecordRepositoryImpl.java | 113 ++ .../MaterializationRepositoryImpl.java | 63 + .../rest/MaterializationConfController.java | 111 ++ .../rest/MaterializationRecordController.java | 76 ++ .../mapper/MaterializationDOCustomMapper.xml | 95 ++ .../mapper/MaterializationDOMapper.xml | 324 +++++ .../mapper/MaterializationElementDOMapper.xml | 291 ++++ .../mapper/MaterializationRecordDOMapper.xml | 336 +++++ .../model/application/ModelServiceImpl.java | 5 +- .../model/domain/dataobject/DatasourceDO.java | 8 + .../model/domain/dataobject/DimensionDO.java | 15 +- .../semantic/model/domain/pojo/Dimension.java | 4 + .../domain/utils/DatasourceConverter.java | 6 +- .../domain/utils/DimensionConverter.java | 11 + .../model/domain/utils/MetricConverter.java | 7 +- .../resources/mapper/DatasourceDOMapper.xml | 3 +- .../resources/mapper/DimensionDOMapper.xml | 24 +- semantic/pom.xml | 1 + semantic/query/pom.xml | 6 + .../semantic/query/optimizer/DetailQuery.java | 6 +- .../query/optimizer/MaterializationQuery.java | 349 +++++ .../semantic/query/parser/QueryParser.java | 11 +- .../parser/calcite/CalciteSqlParser.java | 3 +- .../query/parser/calcite/Configuration.java | 41 +- .../parser/calcite/SemanticSchemaManager.java | 14 +- .../query/parser/calcite/dsl/Constants.java | 2 + .../query/parser/calcite/dsl/DataSource.java | 5 + .../query/parser/calcite/dsl/Dimension.java | 2 + .../parser/calcite/dsl/Materialization.java | 51 + .../calcite/dsl/MaterializationElement.java | 12 + .../query/parser/calcite/dsl/Measure.java | 2 + .../parser/calcite/dsl/SemanticModel.java | 1 + .../query/parser/calcite/dsl/TimeRange.java | 11 + .../parser/calcite/planner/AggPlanner.java | 14 +- .../planner/MaterializationPlanner.java | 340 +++++ .../query/parser/calcite/planner/Planner.java | 7 +- .../parser/calcite/schema/SchemaBuilder.java | 28 + .../parser/calcite/schema/SemanticSchema.java | 16 + .../query/parser/calcite/sql/TableView.java | 1 - .../calcite/sql/node/DataSourceNode.java | 2 +- .../parser/calcite/sql/node/SemanticNode.java | 14 +- .../parser/calcite/sql/render/JoinRender.java | 103 +- .../parser/convert/QueryReqConverter.java | 19 +- .../persistence/pojo/QueryStatement.java | 10 + .../semantic/query/rest/QueryController.java | 3 +- .../semantic/query/rest/SchemaController.java | 17 + .../query/service/MaterializationService.java | 11 + .../service/MaterializationServiceImpl.java | 140 ++ .../semantic/query/service/QueryService.java | 6 + .../query/service/QueryServiceImpl.java | 7 + .../query/service/SemanticQueryEngine.java | 5 +- .../service/SemanticQueryEngineImpl.java | 10 +- .../query/utils/ComponentFactory.java | 27 +- .../semantic/query/utils/DateUtils.java | 104 +- .../query/utils/QueryStructUtils.java | 233 +++- .../semantic/query/utils/SqlFilterUtils.java | 2 +- .../semantic/query/utils/StatUtils.java | 16 +- .../src/main/resources/mapper/StatMapper.xml | 5 +- .../calcite/MaterializationQueryTest.java | 57 + .../calcite/SemanticParserServiceTest.java | 10 +- 126 files changed, 9172 insertions(+), 91 deletions(-) create mode 100644 common/src/main/java/com/tencent/supersonic/common/pojo/enums/DataTypeEnums.java create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FilterRemoveVisitor.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/ElementFrequencyEnum.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/ElementTypeEnum.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/MaterializedTypeEnum.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/UpdateCycleEnum.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationConfFilter.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationDateFilter.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationFilter.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationRecordFilter.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationElementReq.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationRecordReq.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationReq.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationSourceReq.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationDateResp.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationElementModelResp.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationElementResp.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationRecordResp.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationResp.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationSourceResp.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/enums/QueryOptMode.java create mode 100644 semantic/materialization/pom.xml create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/application/MaterializationConfServiceImpl.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/application/MaterializationRecordServiceImpl.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/MaterializationConfService.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/MaterializationRecordService.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationDO.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationDOExample.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationDOWithBLOBs.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDO.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDOExample.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDOKey.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDOWithBLOBs.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationRecordDO.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationRecordDOExample.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/pojo/Materialization.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/pojo/MaterializationElement.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/pojo/MaterializationRecord.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/repository/MaterializationElementRepository.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/repository/MaterializationRecordRepository.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/repository/MaterializationRepository.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationConverter.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationPartitionHelper.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationRecordConverter.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationUtils.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationZipperUtils.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationDOCustomMapper.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationDOMapper.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationElementDOMapper.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationRecordDOMapper.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/repository/MaterializationElementRepositoryImpl.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/repository/MaterializationRecordRepositoryImpl.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/repository/MaterializationRepositoryImpl.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/rest/MaterializationConfController.java create mode 100644 semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/rest/MaterializationRecordController.java create mode 100644 semantic/materialization/src/main/resources/mapper/MaterializationDOCustomMapper.xml create mode 100644 semantic/materialization/src/main/resources/mapper/MaterializationDOMapper.xml create mode 100644 semantic/materialization/src/main/resources/mapper/MaterializationElementDOMapper.xml create mode 100644 semantic/materialization/src/main/resources/mapper/MaterializationRecordDOMapper.xml create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/optimizer/MaterializationQuery.java create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/dsl/Materialization.java create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/dsl/MaterializationElement.java create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/dsl/TimeRange.java create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/planner/MaterializationPlanner.java create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/MaterializationService.java create mode 100644 semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/MaterializationServiceImpl.java create mode 100644 semantic/query/src/test/java/com/tencent/supersonic/semantic/query/domain/calcite/MaterializationQueryTest.java diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/enums/AggOperatorEnum.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/AggOperatorEnum.java index b4ce1357f..5931dd76a 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/enums/AggOperatorEnum.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/AggOperatorEnum.java @@ -11,6 +11,7 @@ public enum AggOperatorEnum { SUM("SUM"), COUNT_DISTINCT("COUNT_DISTINCT"), + DISTINCT("DISTINCT"), TOPN("TOPN"), diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/enums/DataTypeEnums.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/DataTypeEnums.java new file mode 100644 index 000000000..8e4eb25c8 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/DataTypeEnums.java @@ -0,0 +1,45 @@ +package com.tencent.supersonic.common.pojo.enums; + +public enum DataTypeEnums { + + ARRAY("ARRAY"), + + MAP("MAP"), + + JSON("JSON"), + + VARCHAR("VARCHAR"), + + DATE("DATE"), + + BIGINT("BIGINT"), + + INT("INT"), + + DOUBLE("DOUBLE"), + + FLOAT("FLOAT"), + + DECIMAL("DECIMAL"), + + UNKNOWN("unknown"); + + private String type; + + DataTypeEnums(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public static DataTypeEnums of(String type) { + for (DataTypeEnums typeEnum : DataTypeEnums.values()) { + if (typeEnum.getType().equalsIgnoreCase(type)) { + return typeEnum; + } + } + return DataTypeEnums.UNKNOWN; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/StringUtil.java b/common/src/main/java/com/tencent/supersonic/common/util/StringUtil.java index 7aa7c2938..c5a8a0ca0 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/StringUtil.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/StringUtil.java @@ -1,6 +1,7 @@ package com.tencent.supersonic.common.util; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; @Slf4j @@ -17,4 +18,11 @@ public class StringUtil { return String.format(SPACE_WRAPPER, value); } + public static String formatSqlQuota(String where) { + if (StringUtils.isEmpty(where)) { + return where; + } + return where.replace("\"", "\\\\\""); + } + } \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java index f85ef63ed..59841caec 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java @@ -1,7 +1,10 @@ package com.tencent.supersonic.common.util.calcite; + +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -13,6 +16,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlOrderBy; import org.apache.calcite.sql.SqlSelect; +import org.apache.calcite.sql.fun.SqlCase; import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.sql.parser.SqlParseException; import org.apache.calcite.sql.parser.SqlParser; @@ -40,7 +44,6 @@ public class SqlParseUtils { handlerSQL(sqlNode, sqlParserInfo); - sqlParserInfo.setAllFields(sqlParserInfo.getAllFields().stream().distinct().collect(Collectors.toList())); sqlParserInfo.setSelectFields( @@ -298,5 +301,69 @@ public class SqlParseUtils { return null; } + public static Set getFilterField(String where) { + Set result = new HashSet<>(); + try { + + SqlParser parser = SqlParser.create(where); + SqlNode sqlNode = parser.parseExpression(); + getFieldByExpression(sqlNode, result); + return result; + } catch (SqlParseException e) { + throw new RuntimeException("getSqlParseInfo", e); + } + } + + public static void getFieldByExpression(SqlNode sqlNode, Set fields) { + if (sqlNode instanceof SqlIdentifier) { + SqlIdentifier sqlIdentifier = (SqlIdentifier) sqlNode; + fields.add(sqlIdentifier.names.get(0).toLowerCase()); + return; + } + if (sqlNode instanceof SqlBasicCall) { + SqlBasicCall sqlBasicCall = (SqlBasicCall) sqlNode; + for (SqlNode operand : sqlBasicCall.getOperandList()) { + getFieldByExpression(operand, fields); + } + } + } + + public static Map getCaseExprFields(String expr) { + SqlParser parser = SqlParser.create(expr); + Map ret = new HashMap(); + try { + SqlNode sqlNodeCase = parser.parseExpression(); + if (sqlNodeCase instanceof SqlCase) { + SqlCase sqlCase = (SqlCase) sqlNodeCase; + if (CollectionUtils.isEmpty(sqlCase.getThenOperands()) || CollectionUtils.isEmpty( + sqlCase.getWhenOperands())) { + return ret; + } + SqlDialect dialect = new S2MysqlSqlDialect(S2MysqlSqlDialect.DEFAULT_CONTEXT); + int i = 0; + for (SqlNode sqlNode : sqlCase.getWhenOperands().getList()) { + if (sqlNode instanceof SqlBasicCall) { + SqlBasicCall when = (SqlBasicCall) sqlNode; + if (!org.springframework.util.CollectionUtils.isEmpty(when.getOperandList()) + && when.getOperandList().size() > 1) { + String value = when.getOperandList().get(1).toSqlString(dialect).getSql(); + if (sqlCase.getThenOperands().get(i) != null) { + if (sqlCase.getThenOperands().get(i) instanceof SqlIdentifier) { + SqlIdentifier sqlIdentifier = (SqlIdentifier) sqlCase.getThenOperands().get(i); + String field = sqlIdentifier.getSimple(); + ret.put(value, field); + } + } + } + } + i++; + } + } + } catch (SqlParseException e) { + throw new RuntimeException("getSqlParseInfo", e); + } + return ret; + } + } diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FilterRemoveVisitor.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FilterRemoveVisitor.java new file mode 100644 index 000000000..88ca87a47 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FilterRemoveVisitor.java @@ -0,0 +1,96 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import java.util.List; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.expression.operators.relational.GreaterThan; +import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals; +import net.sf.jsqlparser.expression.operators.relational.InExpression; +import net.sf.jsqlparser.expression.operators.relational.MinorThan; +import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals; +import net.sf.jsqlparser.schema.Column; +import org.apache.commons.lang3.StringUtils; + +public class FilterRemoveVisitor extends ExpressionVisitorAdapter { + + private List filedNames; + + public FilterRemoveVisitor(List filedNames) { + this.filedNames = filedNames; + } + + private boolean isRemove(Expression leftExpression) { + if (!(leftExpression instanceof Column)) { + return false; + } + Column leftColumnName = (Column) leftExpression; + String columnName = leftColumnName.getColumnName(); + if (StringUtils.isEmpty(columnName)) { + return false; + } + if (!filedNames.contains(columnName)) { + return false; + } + return true; + } + + @Override + public void visit(EqualsTo expr) { + if (!isRemove(expr.getLeftExpression())) { + return; + } + expr.setRightExpression(new LongValue(1L)); + expr.setLeftExpression(new LongValue(1L)); + } + + @Override + public void visit(MinorThan expr) { + if (!isRemove(expr.getLeftExpression())) { + return; + } + expr.setRightExpression(new LongValue(1L)); + expr.setLeftExpression(new LongValue(0L)); + } + + + @Override + public void visit(MinorThanEquals expr) { + if (!isRemove(expr.getLeftExpression())) { + return; + } + expr.setRightExpression(new LongValue(1L)); + expr.setLeftExpression(new LongValue(1L)); + } + + + @Override + public void visit(GreaterThan expr) { + if (!isRemove(expr.getLeftExpression())) { + return; + } + expr.setRightExpression(new LongValue(0L)); + expr.setLeftExpression(new LongValue(1L)); + } + + @Override + public void visit(GreaterThanEquals expr) { + if (!isRemove(expr.getLeftExpression())) { + return; + } + expr.setRightExpression(new LongValue(1L)); + expr.setLeftExpression(new LongValue(1L)); + } + + @Override + public void visit(InExpression expr) { + if (!isRemove(expr.getLeftExpression())) { + return; + } + expr.setNot(false); + expr.setRightExpression(new LongValue(1L)); + expr.setLeftExpression(new LongValue(1L)); + } + +} \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserRemoveHelper.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserRemoveHelper.java index 53663bf82..f62a7fe28 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserRemoveHelper.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserRemoveHelper.java @@ -1,5 +1,6 @@ package com.tencent.supersonic.common.util.jsqlparser; +import java.util.List; import java.util.Set; import lombok.extern.slf4j.Slf4j; import net.sf.jsqlparser.JSQLParserException; @@ -96,5 +97,23 @@ public class SqlParserRemoveHelper { } } + public static String removeWhere(String sql, List fields) { + Select selectStatement = SqlParserSelectHelper.getSelect(sql); + SelectBody selectBody = selectStatement.getSelectBody(); + if (!(selectBody instanceof PlainSelect)) { + return sql; + } + PlainSelect plainSelect = (PlainSelect) selectBody; + Expression where = plainSelect.getWhere(); + + if (where == null) { + return sql; + } else { + where.accept(new FilterRemoveVisitor(fields)); + plainSelect.setWhere(where); + } + return selectStatement.toString(); + } + } diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java index 9eff5ddb7..82a1cc6d9 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java @@ -10,10 +10,14 @@ import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; import net.sf.jsqlparser.expression.Function; +import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.conditional.OrExpression; import net.sf.jsqlparser.expression.operators.conditional.XorExpression; import net.sf.jsqlparser.expression.operators.relational.ComparisonOperator; +import net.sf.jsqlparser.expression.operators.relational.GreaterThan; +import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals; +import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; @@ -27,6 +31,7 @@ import net.sf.jsqlparser.statement.select.SelectExpressionItem; import net.sf.jsqlparser.statement.select.SelectItem; import net.sf.jsqlparser.statement.select.SelectVisitorAdapter; import net.sf.jsqlparser.statement.select.SubSelect; +import org.apache.commons.lang3.tuple.ImmutablePair; import org.springframework.util.CollectionUtils; /** @@ -259,14 +264,7 @@ public class SqlParserSelectHelper { } public static String getTableName(String sql) { - Select selectStatement = getSelect(sql); - if (selectStatement == null) { - return null; - } - SelectBody selectBody = selectStatement.getSelectBody(); - PlainSelect plainSelect = (PlainSelect) selectBody; - - Table table = (Table) plainSelect.getFromItem(); + Table table = getTable(sql); return table.getName(); } @@ -341,5 +339,53 @@ public class SqlParserSelectHelper { } return ""; } + + public static Expression getTimeFilter(List> times, String columnBegin, + String columnEnd) { + Expression expression = null; + for (ImmutablePair t : times) { + Expression expr = null; + ComparisonOperator left = new MinorThanEquals(); + if (t.left.equals(t.right)) { + left.setLeftExpression(new Column(columnBegin)); + left.setRightExpression(new StringValue(t.left)); + ComparisonOperator right = new GreaterThan(); + right.setLeftExpression(new Column(columnEnd)); + right.setRightExpression(new StringValue(t.right)); + expr = new AndExpression(left, right); + } else { + left.setLeftExpression(new StringValue(t.left)); + left.setRightExpression(new Column(columnEnd)); + ComparisonOperator right = new GreaterThanEquals(); + right.setLeftExpression(new StringValue(t.right)); + right.setRightExpression(new Column(columnBegin)); + expr = new AndExpression(left, right); + } + if (expression == null) { + expression = expr; + continue; + } + expression = new OrExpression(expression, expr); + } + return expression; + } + + public static Table getTable(String sql) { + Select selectStatement = getSelect(sql); + if (selectStatement == null) { + return null; + } + SelectBody selectBody = selectStatement.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) selectBody; + + Table table = (Table) plainSelect.getFromItem(); + return table; + } + + public static String getDbTableName(String sql) { + Table table = getTable(sql); + return table.getFullyQualifiedName(); + } + } diff --git a/launchers/standalone/pom.xml b/launchers/standalone/pom.xml index bc9d9d245..9e0be8595 100644 --- a/launchers/standalone/pom.xml +++ b/launchers/standalone/pom.xml @@ -63,6 +63,12 @@ semantic-model ${project.version} + + + com.tencent.supersonic + semantic-materialization + ${project.version} + com.tencent.supersonic auth-api diff --git a/launchers/standalone/src/main/resources/db/schema-h2.sql b/launchers/standalone/src/main/resources/db/schema-h2.sql index 77ec86bc1..1cbe237b6 100644 --- a/launchers/standalone/src/main/resources/db/schema-h2.sql +++ b/launchers/standalone/src/main/resources/db/schema-h2.sql @@ -160,6 +160,7 @@ CREATE TABLE IF NOT EXISTS `s2_datasource` ( `description` varchar(500) DEFAULT NULL , `database_id` INT NOT NULL , `datasource_detail` LONGVARCHAR NOT NULL , + `depends` varchar(500) DEFAULT NULL , `created_at` TIMESTAMP NOT NULL , `created_by` varchar(100) NOT NULL , `updated_at` TIMESTAMP NOT NULL , @@ -208,6 +209,7 @@ CREATE TABLE IF NOT EXISTS `s2_dimension` ( `description` varchar(500) NOT NULL , `status` INT NOT NULL , -- status, 0 is normal, 1 is off the shelf, 2 is deleted `sensitive_level` INT DEFAULT NULL , + `data_type` varchar(50) DEFAULT NULL , -- type date,array,varchar `type` varchar(50) NOT NULL , -- type categorical,time `type_params` LONGVARCHAR DEFAULT NULL , `expr` LONGVARCHAR NOT NULL , -- expression @@ -283,6 +285,7 @@ CREATE TABLE `s2_query_stat_info` ( `use_sql_cache` TINYINT DEFAULT '-1' , -- whether to hit the sql cache `sql_cache_key`LONGVARCHAR , -- sql cache key `result_cache_key`LONGVARCHAR , -- result cache key + `query_opt_mode` varchar(50) DEFAULT NULL , PRIMARY KEY (`id`) ) ; COMMENT ON TABLE s2_query_stat_info IS 'query statistics table'; @@ -459,4 +462,65 @@ COMMENT ON TABLE song IS 'song'; -- benchmark +create table s2_materialization +( + id int AUTO_INCREMENT , + name varchar(255) not null, + materialized_type varchar(255) not null , + update_cycle varchar(255) , + model_id bigint , + database_id bigint not null , + level int not null default 0 , + status int not null default 1 , + destination_table varchar(255) not null , + date_info varchar(255) null , + entities varchar(255) null , + principals varchar(255) DEFAULT NULL , + created_at TIMESTAMP null, + created_by varchar(100) null, + updated_at TIMESTAMP null, + updated_by varchar(100) not null, + description varchar(255) null, + primary key (id) +) ; + +create table s2_materialization_element +( + id bigint not null , + type varchar(255) not null , + materialization_id bigint not null , + depends varchar(255) DEFAULT NULL, + element_type varchar(255) DEFAULT NULL , + default_value varchar(255) DEFAULT NULL , + outlier varchar(255) DEFAULT NULL , + frequency varchar(255) DEFAULT NULL , + created_at TIMESTAMP null, + created_by varchar(100) null, + updated_at TIMESTAMP null, + updated_by varchar(100) not null, + description varchar(255) null , + status int not null default 1 , + PRIMARY KEY (id, type, materialization_id) +) ; + +CREATE TABLE s2_materialization_record +( + `id` bigint NOT NULL AUTO_INCREMENT , + `materialization_id` bigint NOT null , + `element_type` varchar(255) not null , + `element_id` bigint DEFAULT NULL , + `element_name` varchar(255) not null , + `data_time` varchar(64) DEFAULT NULL , + `state` varchar(255) DEFAULT NULL , + `task_id` varchar(255) DEFAULT NULL, + `created_at` TIMESTAMP null, + `updated_at` TIMESTAMP null, + `created_by` varchar(100) null, + `updated_by` varchar(100) not null, + `retry_count` bigint NOT NULL default 0, + `source_count` bigint NOT NULL default 0, + `sink_count` bigint NOT NULL default 0, + `message` varchar(255) , + PRIMARY KEY (`id`) +); diff --git a/launchers/standalone/src/main/resources/db/schema-mysql.sql b/launchers/standalone/src/main/resources/db/schema-mysql.sql index 3e6ff801d..bcb54e345 100644 --- a/launchers/standalone/src/main/resources/db/schema-mysql.sql +++ b/launchers/standalone/src/main/resources/db/schema-mysql.sql @@ -141,6 +141,7 @@ CREATE TABLE `s2_datasource` ( `description` varchar(500) DEFAULT NULL COMMENT '数据源描述', `database_id` bigint(20) NOT NULL COMMENT '数据库实例ID', `datasource_detail` mediumtext NOT NULL COMMENT '数据源配置', + `depends` text DEFAULT NULL COMMENT '上游依赖标识', `created_at` datetime NOT NULL COMMENT '创建时间', `created_by` varchar(100) NOT NULL COMMENT '创建人', `updated_at` datetime NOT NULL COMMENT '更新时间', @@ -205,6 +206,7 @@ CREATE TABLE `s2_dimension` ( `sensitive_level` int(10) DEFAULT NULL COMMENT '敏感级别', `type` varchar(50) NOT NULL COMMENT '维度类型 categorical,time', `type_params` text COMMENT '类型参数', + `data_type` varchar(50) DEFAULT null comment '维度数据类型 varchar、array', `expr` text NOT NULL COMMENT '表达式', `created_at` datetime NOT NULL COMMENT '创建时间', `created_by` varchar(100) NOT NULL COMMENT '创建人', @@ -328,6 +330,7 @@ CREATE TABLE `s2_query_stat_info` ( `use_sql_cache` tinyint(1) DEFAULT '-1' COMMENT '是否命中sql缓存', `sql_cache_key` mediumtext COLLATE utf8mb4_unicode_ci COMMENT '缓存的key', `result_cache_key` mediumtext COLLATE utf8mb4_unicode_ci COMMENT '缓存的key', + `query_opt_mode` varchar(20) null comment '优化模式', PRIMARY KEY (`id`), KEY `domain_index` (`model_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='查询统计信息表'; @@ -376,3 +379,66 @@ create table s2_user ); insert into s2_user (id, `name`, password, display_name, email, is_admin) values (1, 'admin','admin','admin','admin@xx.com', 1); + + +CREATE TABLE `s2_materialization` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL COMMENT '物化名称', + `materialized_type` varchar(255) NOT NULL COMMENT '物化类型 partition 分区 zipper 拉链 ', + `update_cycle` varchar(255) DEFAULT NULL COMMENT '更新周期,天更新、周更新、月更新', + `model_id` bigint(20) DEFAULT NULL, + `database_id` bigint(20) NOT NULL COMMENT '数据库实例ID', + `level` int(11) NOT NULL DEFAULT '0' COMMENT '优先级,数值越大优先级越高', + `status` int(11) NOT NULL DEFAULT '1' COMMENT '0-废弃,1-使用中', + `destination_table` varchar(255) NOT NULL COMMENT '物化表名称', + `date_info` mediumtext COMMENT '时间字段', + `entities` mediumtext COMMENT 'primary字段', + `principals` varchar(255) DEFAULT NULL COMMENT '责任人', + `created_at` datetime DEFAULT NULL, + `created_by` varchar(100) DEFAULT NULL, + `updated_at` datetime DEFAULT NULL, + `updated_by` varchar(100) NOT NULL, + `description` mediumtext COMMENT '备注说明', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; +CREATE TABLE `s2_materialization_element` +( + `id` bigint(20) NOT NULL COMMENT 'element类型对应id', + `type` varchar(255) NOT NULL COMMENT 'element类型 metric、dimension', + `materialization_id` bigint(20) NOT NULL COMMENT '关联s2_materialization主键', + `depends` text COMMENT '上游依赖标识', + `element_type` varchar(255) DEFAULT NULL COMMENT 'varchar,double,bigint,int,array', + `default_value` varchar(255) DEFAULT NULL COMMENT '默认值', + `outlier` varchar(255) DEFAULT NULL COMMENT '异常值', + `frequency` varchar(255) DEFAULT NULL COMMENT '变化频率, UNKNOWN, HIGH, LOW', + `created_at` datetime DEFAULT NULL, + `created_by` varchar(100) DEFAULT NULL, + `updated_at` datetime DEFAULT NULL, + `updated_by` varchar(100) NOT NULL, + `description` mediumtext COMMENT '备注说明', + `status` int(11) NOT NULL DEFAULT '1' COMMENT '0-废弃,1-使用中', + PRIMARY KEY (`id`, `type`, `materialization_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `s2_materialization_record` +( + `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键id', + `materialization_id` bigint(20) NOT NULL COMMENT '物化配置ID', + `element_type` varchar(255) NOT NULL COMMENT 'element类型 metric、dimension', + `element_id` bigint(20) DEFAULT NULL COMMENT '数据名字: 例如标签名、指标名', + `element_name` varchar(255) NOT NULL COMMENT 'element 名称', + `data_time` varchar(64) DEFAULT NULL COMMENT '数据时间', + `state` varchar(255) DEFAULT NULL COMMENT '任务运行状态', + `task_id` varchar(255) DEFAULT NULL COMMENT '任务id', + `created_at` datetime DEFAULT NULL, + `updated_at` datetime DEFAULT NULL, + `created_by` varchar(100) DEFAULT NULL, + `updated_by` varchar(100) NOT NULL, + `retry_count` bigint(20) NOT NULL DEFAULT '0', + `source_count` bigint(20) NOT NULL DEFAULT '0', + `sink_count` bigint(20) NOT NULL DEFAULT '0', + `message` text COMMENT '信息', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_id` (`materialization_id`,`element_type`,`element_id`,`data_time`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + diff --git a/launchers/standalone/src/main/resources/db/sql-update.sql b/launchers/standalone/src/main/resources/db/sql-update.sql index d43478c5e..5132f22cc 100644 --- a/launchers/standalone/src/main/resources/db/sql-update.sql +++ b/launchers/standalone/src/main/resources/db/sql-update.sql @@ -58,4 +58,11 @@ alter table s2_user add is_admin int null; --20230926 alter table s2_model add drill_down_dimensions varchar(500) null; -alter table s2_metric add relate_dimensions varchar(500) null; \ No newline at end of file +alter table s2_metric add relate_dimensions varchar(500) null; + + +--20231013 +alter table s2_dimension add column data_type varchar(50) not null DEFAULT 'varchar' comment '维度数据类型 varchar、array'; +alter table s2_query_stat_info add column `query_opt_mode` varchar(20) DEFAULT NULL COMMENT '优化模式'; +alter table s2_datasource add column depends text COMMENT '上游依赖标识' after datasource_detail; + diff --git a/launchers/standalone/src/test/resources/db/schema-h2.sql b/launchers/standalone/src/test/resources/db/schema-h2.sql index 5da8f62d2..b6e0a758c 100644 --- a/launchers/standalone/src/test/resources/db/schema-h2.sql +++ b/launchers/standalone/src/test/resources/db/schema-h2.sql @@ -174,6 +174,7 @@ CREATE TABLE IF NOT EXISTS `s2_datasource` ( `biz_name` varchar(255) NOT NULL , `description` varchar(500) DEFAULT NULL , `database_id` INT NOT NULL , + `depends` varchar(500) DEFAULT NULL , `datasource_detail` LONGVARCHAR NOT NULL , `created_at` TIMESTAMP NOT NULL , `created_by` varchar(100) NOT NULL , @@ -223,6 +224,7 @@ CREATE TABLE IF NOT EXISTS `s2_dimension` ( `description` varchar(500) NOT NULL , `status` INT NOT NULL , -- status, 0 is normal, 1 is off the shelf, 2 is deleted `sensitive_level` INT DEFAULT NULL , + `data_type` varchar(50) DEFAULT NULL , -- type date,array,varchar `type` varchar(50) NOT NULL , -- type categorical,time `type_params` LONGVARCHAR DEFAULT NULL , `expr` LONGVARCHAR NOT NULL , -- expression @@ -287,6 +289,7 @@ CREATE TABLE `s2_query_stat_info` ( `native_query` INT DEFAULT NULL, -- 1-detail query, 0-aggregation query `start_date` varchar(50) DEFAULT NULL, `end_date` varchar(50) DEFAULT NULL, + `query_opt_mode` varchar(50) DEFAULT NULL, `dimensions`LONGVARCHAR , -- dimensions involved in sql `metrics`LONGVARCHAR , -- metric involved in sql `select_cols`LONGVARCHAR , @@ -398,6 +401,69 @@ COMMENT ON TABLE singer IS 'singer_info'; +create table s2_materialization +( + id int AUTO_INCREMENT , + name varchar(255) not null, + materialized_type varchar(255) not null , + update_cycle varchar(255) , + model_id bigint , + database_id bigint not null , + level int not null default 0 , + status int not null default 1 , + destination_table varchar(255) not null , + date_info varchar(255) null , + entities varchar(255) null , + principals varchar(255) DEFAULT NULL , + created_at TIMESTAMP null, + created_by varchar(100) null, + updated_at TIMESTAMP null, + updated_by varchar(100) not null, + description varchar(255) null, + primary key (id) +) ; + +create table s2_materialization_element +( + id bigint not null , + type varchar(255) not null , + materialization_id bigint not null , + depends varchar(255) DEFAULT NULL, + element_type varchar(255) DEFAULT NULL , + default_value varchar(255) DEFAULT NULL , + outlier varchar(255) DEFAULT NULL , + frequency varchar(255) DEFAULT NULL , + created_at TIMESTAMP null, + created_by varchar(100) null, + updated_at TIMESTAMP null, + updated_by varchar(100) not null, + description varchar(255) null , + status int not null default 1 , + PRIMARY KEY (id, type, materialization_id) +) ; + +CREATE TABLE s2_materialization_record +( + `id` bigint NOT NULL AUTO_INCREMENT , + `materialization_id` bigint NOT null , + `element_type` varchar(255) not null , + `element_id` bigint DEFAULT NULL , + `element_name` varchar(255) not null , + `data_time` varchar(64) DEFAULT NULL , + `state` varchar(255) DEFAULT NULL , + `task_id` varchar(255) DEFAULT NULL, + `created_at` TIMESTAMP null, + `updated_at` TIMESTAMP null, + `created_by` varchar(100) null, + `updated_by` varchar(100) not null, + `retry_count` bigint NOT NULL default 0, + `source_count` bigint NOT NULL default 0, + `sink_count` bigint NOT NULL default 0, + `message` varchar(255) , + PRIMARY KEY (`id`) +); + + diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/ElementFrequencyEnum.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/ElementFrequencyEnum.java new file mode 100644 index 000000000..3e89b1732 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/ElementFrequencyEnum.java @@ -0,0 +1,8 @@ +package com.tencent.supersonic.semantic.api.materialization.enums; + +public enum ElementFrequencyEnum { + + UNKNOWN, + HIGH, + LOW +} diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/ElementTypeEnum.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/ElementTypeEnum.java new file mode 100644 index 000000000..b07d90524 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/ElementTypeEnum.java @@ -0,0 +1,11 @@ +package com.tencent.supersonic.semantic.api.materialization.enums; + +public enum ElementTypeEnum { + + VARCHAR, + DOUBLE, + BIGINT, + INT, + DATE, + ARRAY +} diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/MaterializedTypeEnum.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/MaterializedTypeEnum.java new file mode 100644 index 000000000..6e1dcae16 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/MaterializedTypeEnum.java @@ -0,0 +1,7 @@ +package com.tencent.supersonic.semantic.api.materialization.enums; + +public enum MaterializedTypeEnum { + FULL, + PARTITION, + ZIPPER +} diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/UpdateCycleEnum.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/UpdateCycleEnum.java new file mode 100644 index 000000000..254be941b --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/enums/UpdateCycleEnum.java @@ -0,0 +1,8 @@ +package com.tencent.supersonic.semantic.api.materialization.enums; + + +public enum UpdateCycleEnum { + DAY, + WEEK, + MONTH +} \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationConfFilter.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationConfFilter.java new file mode 100644 index 000000000..62508f6f8 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationConfFilter.java @@ -0,0 +1,17 @@ +package com.tencent.supersonic.semantic.api.materialization.pojo; + +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class MaterializationConfFilter extends MaterializationFilter { + + private Long id; + private Boolean containElements = false; + + private TypeEnums type; + private Long materializationId; + private Long elementId; +} \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationDateFilter.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationDateFilter.java new file mode 100644 index 000000000..3608bb8ff --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationDateFilter.java @@ -0,0 +1,16 @@ +package com.tencent.supersonic.semantic.api.materialization.pojo; + +import lombok.Data; + +import java.util.Date; +import java.util.List; + + +@Data +public class MaterializationDateFilter { + + private Long modelId; + private List dimensions; + private List metrics; + private Date createdAt; +} \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationFilter.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationFilter.java new file mode 100644 index 000000000..32ae3760a --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationFilter.java @@ -0,0 +1,25 @@ +package com.tencent.supersonic.semantic.api.materialization.pojo; + +import com.tencent.supersonic.semantic.api.materialization.enums.MaterializedTypeEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.UpdateCycleEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MaterializationFilter { + + private Long materializationId; + private String name; + private MaterializedTypeEnum materializedType; + private UpdateCycleEnum updateCycle; + private Long modelId; + private Long databaseId; + private Integer level; + private String createdBy; + private String destinationTable; +} \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationRecordFilter.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationRecordFilter.java new file mode 100644 index 000000000..de5286d3e --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/pojo/MaterializationRecordFilter.java @@ -0,0 +1,28 @@ +package com.tencent.supersonic.semantic.api.materialization.pojo; + + +import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import java.util.List; +import lombok.Builder; +import lombok.Data; + +import java.util.Date; + +@Data +@Builder +public class MaterializationRecordFilter { + + private Long id; + private Long materializationId; + private TypeEnums elementType; + private Long elementId; + private String elementName; + private List taskStatus; + private String taskId; + private String createdBy; + private Date createdAt; + private String startDataTime; + private String endDataTime; + private List materializationIds; +} \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationElementReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationElementReq.java new file mode 100644 index 000000000..8faedd9f2 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationElementReq.java @@ -0,0 +1,25 @@ +package com.tencent.supersonic.semantic.api.materialization.request; + + +import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementFrequencyEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementTypeEnum; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class MaterializationElementReq extends RecordInfo { + private Long id; + private TypeEnums type; + private Long materializationId; + private String depends; + private ElementTypeEnum elementType; + private String defaultValue; + private String outlier; + private ElementFrequencyEnum frequency; + private String description; + private StatusEnum status; +} \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationRecordReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationRecordReq.java new file mode 100644 index 000000000..cf1ccf54e --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationRecordReq.java @@ -0,0 +1,24 @@ +package com.tencent.supersonic.semantic.api.materialization.request; + + +import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import lombok.Data; + +@Data +public class MaterializationRecordReq extends RecordInfo { + + private Long id; + private Long materializationId; + private TypeEnums elementType; + private Long elementId; + private String elementName; + private String dataTime; + private TaskStatusEnum taskStatus; + private String taskId; + private Long retryCount; + private Long sourceCount; + private Long sinkCount; + private String message; +} \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationReq.java new file mode 100644 index 000000000..606718467 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationReq.java @@ -0,0 +1,26 @@ +package com.tencent.supersonic.semantic.api.materialization.request; + +import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.MaterializedTypeEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.UpdateCycleEnum; +import lombok.Data; + +import java.util.List; + +@Data +public class MaterializationReq extends RecordInfo { + private Long id; + private String name; + private MaterializedTypeEnum materializedType; + private UpdateCycleEnum updateCycle; + private Long modelId; + private Long databaseId; + private Integer level; + private String destinationTable; + private String dateInfo; + private String entities; + private List principals; + private String description; + private StatusEnum status; +} \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationSourceReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationSourceReq.java new file mode 100644 index 000000000..ac14b6568 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/request/MaterializationSourceReq.java @@ -0,0 +1,12 @@ +package com.tencent.supersonic.semantic.api.materialization.request; + + +import lombok.Data; + +@Data +public class MaterializationSourceReq { + + private Long materializationId = 0L; + private Long dataSourceId = 0L; + private String dataTime; +} diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationDateResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationDateResp.java new file mode 100644 index 000000000..48a530c21 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationDateResp.java @@ -0,0 +1,20 @@ +package com.tencent.supersonic.semantic.api.materialization.response; + +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class MaterializationDateResp { + + private Long modelId; + private TypeEnums elementType; + private Long elementId; + private String elementName; + private String dateFormat; + private String startDate; + private String endDate; + private List unavailableDateList = new ArrayList<>(); +} \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationElementModelResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationElementModelResp.java new file mode 100644 index 000000000..d67479e76 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationElementModelResp.java @@ -0,0 +1,18 @@ +package com.tencent.supersonic.semantic.api.materialization.response; + +import com.google.common.collect.Lists; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import com.tencent.supersonic.semantic.api.model.pojo.Measure; +import java.util.List; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class MaterializationElementModelResp { + private Long id; + private TypeEnums type; + private String bizName; + private String expr; + private List measures = Lists.newArrayList(); +} diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationElementResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationElementResp.java new file mode 100644 index 000000000..57e85dd52 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationElementResp.java @@ -0,0 +1,23 @@ +package com.tencent.supersonic.semantic.api.materialization.response; + + +import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementFrequencyEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementTypeEnum; +import lombok.Data; + +@Data +public class MaterializationElementResp extends RecordInfo { + + private Long id; + private TypeEnums type; + private Long materializationId; + private String depends; + private ElementTypeEnum elementType; + private String defaultValue; + private String outlier; + private ElementFrequencyEnum frequency; + private String description; + private String bizName; +} \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationRecordResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationRecordResp.java new file mode 100644 index 000000000..5a561d0d3 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationRecordResp.java @@ -0,0 +1,24 @@ +package com.tencent.supersonic.semantic.api.materialization.response; + + +import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import lombok.Data; + +@Data +public class MaterializationRecordResp extends RecordInfo { + + private Long id; + private Long materializationId; + private TypeEnums elementType; + private Long elementId; + private String elementName; + private String dataTime; + private TaskStatusEnum taskStatus; + private String taskId; + private Integer retryCount; + private Long sourceCount; + private Long sinkCount; + private String message; +} \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationResp.java new file mode 100644 index 000000000..af71dbddd --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationResp.java @@ -0,0 +1,25 @@ +package com.tencent.supersonic.semantic.api.materialization.response; + +import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.semantic.api.materialization.enums.MaterializedTypeEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.UpdateCycleEnum; +import lombok.Data; + +import java.util.List; + +@Data +public class MaterializationResp extends RecordInfo { + private Long id; + private String name; + private MaterializedTypeEnum materializedType; + private UpdateCycleEnum updateCycle; + private Long modelId; + private Long databaseId; + private Integer level; + private String destinationTable; + private String dateInfo; + private String entities; + private List principals; + private String description; + private List materializationElementRespList; +} \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationSourceResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationSourceResp.java new file mode 100644 index 000000000..f56360613 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/materialization/response/MaterializationSourceResp.java @@ -0,0 +1,35 @@ +package com.tencent.supersonic.semantic.api.materialization.response; + +import com.tencent.supersonic.semantic.api.materialization.enums.MaterializedTypeEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.UpdateCycleEnum; +import com.tencent.supersonic.semantic.api.model.response.DatabaseResp; +import java.util.List; +import java.util.Map; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class MaterializationSourceResp { + + private Long materializationId; + private Long dataSourceId; + private Long modelId; + private String sql; + private List fields; + private String sourceDb; + private String sourceTable; + + private String dateInfo; + private String entities; + private MaterializedTypeEnum materializedType; + private UpdateCycleEnum updateCycle; + private DatabaseResp databaseResp; + private String depends; + private Map dimensions; + private Map metrics; +} diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/enums/QueryOptMode.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/enums/QueryOptMode.java new file mode 100644 index 000000000..080af6901 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/enums/QueryOptMode.java @@ -0,0 +1,8 @@ +package com.tencent.supersonic.semantic.api.model.enums; + +public enum QueryOptMode { + + NONE, + + MATERIALIZATION +} diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/Dim.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/Dim.java index 63396ac77..33ee6acec 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/Dim.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/Dim.java @@ -25,6 +25,8 @@ public class Dim { private String bizName; + private String description; + public Dim(String name, String bizName, String type, Integer isCreateDimension) { this.name = name; this.type = type; @@ -32,6 +34,17 @@ public class Dim { this.bizName = bizName; } + public Dim(String name, String type, String expr, String dateFormat, DimensionTimeTypeParams typeParams, + Integer isCreateDimension, String bizName) { + this.name = name; + this.type = type; + this.expr = expr; + this.dateFormat = dateFormat; + this.typeParams = typeParams; + this.isCreateDimension = isCreateDimension; + this.bizName = bizName; + } + public static Dim getDefault() { return new Dim("日期", "time", "2023-05-28", Constants.DAY_FORMAT, diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/QueryStat.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/QueryStat.java index b9819ac69..04f34dff7 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/QueryStat.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/QueryStat.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import java.util.List; import java.util.Objects; + import lombok.Data; import lombok.ToString; @@ -48,6 +49,13 @@ public class QueryStat { private Boolean useSqlCache; private String sqlCacheKey; private String resultCacheKey; + private String queryOptMode; + + + public QueryStat setQueryOptMode(String queryOptMode) { + this.queryOptMode = queryOptMode; + return this; + } public QueryStat setQuerySqlCmdMd5(String querySqlCmdMd5) { this.querySqlCmdMd5 = querySqlCmdMd5; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DimensionReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DimensionReq.java index 18db7e743..3b069b6df 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DimensionReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DimensionReq.java @@ -1,5 +1,6 @@ package com.tencent.supersonic.semantic.api.model.request; +import com.tencent.supersonic.common.pojo.enums.DataTypeEnums; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; @@ -30,4 +31,6 @@ public class DimensionReq extends SchemaItem { private List defaultValues; private List dimValueMaps; + + private DataTypeEnums dataType; } diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DatasourceResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DatasourceResp.java index ff6e484df..0bac0b8e0 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DatasourceResp.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DatasourceResp.java @@ -13,6 +13,8 @@ public class DatasourceResp extends SchemaItem { private DatasourceDetail datasourceDetail; + private String depends; + } diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DimensionResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DimensionResp.java index 8fd7c8608..f6bc5f5d7 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DimensionResp.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DimensionResp.java @@ -1,6 +1,7 @@ package com.tencent.supersonic.semantic.api.model.response; +import com.tencent.supersonic.common.pojo.enums.DataTypeEnums; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; @@ -36,4 +37,6 @@ public class DimensionResp extends SchemaItem { private List dimValueMaps; + private DataTypeEnums dataType; + } diff --git a/semantic/materialization/pom.xml b/semantic/materialization/pom.xml new file mode 100644 index 000000000..17bd618d5 --- /dev/null +++ b/semantic/materialization/pom.xml @@ -0,0 +1,39 @@ + + + + semantic + com.tencent.supersonic + ${revision} + + 4.0.0 + + semantic-materialization + + + com.tencent.supersonic + semantic-api + ${project.version} + compile + + + org.mybatis + mybatis + + + commons-beanutils + commons-beanutils + 1.9.4 + + + com.tencent.supersonic + semantic-model + ${project.version} + compile + + + + + + \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/application/MaterializationConfServiceImpl.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/application/MaterializationConfServiceImpl.java new file mode 100644 index 000000000..31ac51daa --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/application/MaterializationConfServiceImpl.java @@ -0,0 +1,490 @@ +package com.tencent.supersonic.semantic.materialization.application; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementFrequencyEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementTypeEnum; +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationConfFilter; +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationFilter; +import com.tencent.supersonic.semantic.api.materialization.request.MaterializationElementReq; +import com.tencent.supersonic.semantic.api.materialization.request.MaterializationReq; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationElementModelResp; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationElementResp; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationResp; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationSourceResp; +import com.tencent.supersonic.semantic.api.model.pojo.Measure; +import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; +import com.tencent.supersonic.semantic.api.model.request.ModelSchemaFilterReq; +import com.tencent.supersonic.semantic.api.model.response.DatasourceResp; +import com.tencent.supersonic.semantic.api.model.response.DimSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.MeasureResp; +import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; +import com.tencent.supersonic.semantic.materialization.domain.MaterializationConfService; +import com.tencent.supersonic.semantic.materialization.domain.pojo.Materialization; +import com.tencent.supersonic.semantic.materialization.domain.pojo.MaterializationElement; +import com.tencent.supersonic.semantic.materialization.domain.repository.MaterializationElementRepository; +import com.tencent.supersonic.semantic.materialization.domain.repository.MaterializationRepository; +import com.tencent.supersonic.semantic.materialization.domain.utils.MaterializationConverter; +import com.tencent.supersonic.semantic.materialization.domain.utils.MaterializationUtils; +import com.tencent.supersonic.semantic.materialization.domain.utils.MaterializationZipperUtils; +import com.tencent.supersonic.semantic.model.domain.DatasourceService; +import com.tencent.supersonic.semantic.model.domain.ModelService; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + + +@Slf4j +@Service +public class MaterializationConfServiceImpl implements MaterializationConfService { + + private final MaterializationRepository materializationRepository; + private final MaterializationElementRepository materializationElementRepository; + private final ModelService modelService; + private final DatasourceService datasourceService; + private String typeAndIdSplit = "_"; + + public MaterializationConfServiceImpl(MaterializationRepository materializationRepository, + MaterializationElementRepository materializationElementRepository, + ModelService modelService, DatasourceService datasourceService) { + this.materializationRepository = materializationRepository; + this.materializationElementRepository = materializationElementRepository; + + this.modelService = modelService; + this.datasourceService = datasourceService; + } + + @Override + public Boolean addMaterializationConf(MaterializationReq materializationReq, User user) { + log.info("materializationReq:{}, user:{}", JsonUtil.toString(materializationReq), JsonUtil.toString(user)); + Materialization materialization = MaterializationConverter.materializationReq2Bean(materializationReq); + RecordInfo recordInfo = new RecordInfo().createdBy(user.getName()); + BeanUtils.copyProperties(recordInfo, materialization); + return materializationRepository.insert(materialization); + } + + @Override + public Boolean updateMaterializationConf(MaterializationReq materializationReq, User user) { + Materialization materialization = MaterializationConverter.materializationReq2Bean(materializationReq); + RecordInfo recordInfo = new RecordInfo().updatedBy(user.getName()); + BeanUtils.copyProperties(recordInfo, materialization); + return materializationRepository.update(materialization); + } + + @Override + public List getMaterializationResp(MaterializationFilter filter, User user) { + return materializationRepository.getMaterializationResp(filter); + } + + public MaterializationResp getMaterializationRespById(Long materializationId, User user) { + MaterializationResp materializationResp = new MaterializationResp(); + MaterializationConfFilter filter = new MaterializationConfFilter(); + filter.setMaterializationId(materializationId); + filter.setContainElements(true); + List materializationRespList = queryMaterializationConf(filter, user); + if (CollectionUtils.isEmpty(materializationRespList)) { + return materializationResp; + } + return materializationRespList.get(0); + } + + + @Override + public Boolean addMaterializationElementConf(MaterializationElementReq materializationElementReq, User user) { + log.info("materializationElementReq:{}, user:{}", JsonUtil.toString(materializationElementReq), + JsonUtil.toString(user)); + MaterializationElement materializationElement = MaterializationConverter + .materializationElementReq2Bean(materializationElementReq); + RecordInfo recordInfo = new RecordInfo().createdBy(user.getName()); + BeanUtils.copyProperties(recordInfo, materializationElement); + return materializationElementRepository.insert(materializationElement); + } + + @Override + public Boolean updateMaterializationElementConf(MaterializationElementReq materializationElementReq, User user) { + MaterializationElement materializationElement = MaterializationConverter + .materializationElementReq2Bean(materializationElementReq); + RecordInfo recordInfo = new RecordInfo().updatedBy(user.getName()); + BeanUtils.copyProperties(recordInfo, materializationElement); + return materializationElementRepository.update(materializationElement); + } + + @Override + public List queryMaterializationConf(MaterializationConfFilter filter, User user) { + MaterializationFilter materializationFilter = MaterializationFilter.builder().build(); + BeanUtils.copyProperties(filter, materializationFilter); + List materializationRespList = getMaterializationResp(materializationFilter, user); + if (!CollectionUtils.isEmpty(materializationRespList) && filter.getContainElements()) { + Map keyAndSchemaItemPair = generateSchemaItem(filter, user); + materializationRespList.stream().forEach(materializationResp -> { + filter.setMaterializationId(materializationResp.getId()); + List materializationElementRespList = materializationElementRepository + .getMaterializationElementResp(filter); + fillElementInfo(materializationElementRespList, keyAndSchemaItemPair); + materializationResp.setMaterializationElementRespList(materializationElementRespList); + }); + } + + return materializationRespList; + } + + private void fillElementInfo(List materializationElementRespList, + Map keyAndSchemaItemPair) { + if (CollectionUtils.isEmpty(materializationElementRespList) || Objects.isNull(keyAndSchemaItemPair)) { + return; + } + materializationElementRespList.stream().forEach(materializationElementResp -> { + String key = materializationElementResp.getType() + typeAndIdSplit + materializationElementResp.getId(); + SchemaItem schemaItem = keyAndSchemaItemPair.getOrDefault(key, null); + if (Objects.nonNull(schemaItem)) { + materializationElementResp.setBizName(schemaItem.getBizName()); + } + }); + } + + private Map generateSchemaItem(MaterializationConfFilter filter, User user) { + return generateSchemaItem(filter); + } + + private Map generateSchemaItem(MaterializationConfFilter filter) { + Map keyAndSchemaItemPair = new HashMap<>(); + + ModelSchemaFilterReq modelFilter = new ModelSchemaFilterReq(); + List modelIds = new ArrayList<>(); + if (Objects.nonNull(filter.getModelId())) { + modelIds.add(filter.getModelId()); + } + List modelSchemaRespList = modelService.fetchModelSchema(modelFilter); + if (!CollectionUtils.isEmpty(modelSchemaRespList)) { + modelSchemaRespList.stream().forEach(modelSchemaResp -> { + List dimensions = modelSchemaResp.getDimensions(); + List metrics = modelSchemaResp.getMetrics(); + if (!CollectionUtils.isEmpty(dimensions)) { + dimensions.stream().forEach(dimSchemaResp -> { + SchemaItem schemaItem = new SchemaItem(); + BeanUtils.copyProperties(dimSchemaResp, schemaItem); + String key = TypeEnums.DIMENSION.name() + typeAndIdSplit + dimSchemaResp.getId(); + keyAndSchemaItemPair.put(key, schemaItem); + }); + } + + if (!CollectionUtils.isEmpty(metrics)) { + metrics.stream().forEach(metricSchemaResp -> { + SchemaItem schemaItem = new SchemaItem(); + BeanUtils.copyProperties(metricSchemaResp, schemaItem); + String key = TypeEnums.METRIC.name() + typeAndIdSplit + metricSchemaResp.getId(); + keyAndSchemaItemPair.put(key, schemaItem); + }); + } + }); + } + return keyAndSchemaItemPair; + } + + @Override + public List getMaterializationByModel(Long modelId) { + MaterializationFilter filter = new MaterializationConfFilter(); + filter.setModelId(modelId); + List materializationRespList = materializationRepository.getMaterializationResp(filter); + MaterializationConfFilter materializationConfFilter = new MaterializationConfFilter(); + if (!CollectionUtils.isEmpty(materializationRespList)) { + materializationRespList.stream().forEach(materializationResp -> { + materializationConfFilter.setMaterializationId(materializationResp.getId()); + List materializationElementRespList = materializationElementRepository + .getMaterializationElementResp(materializationConfFilter); + materializationResp.setMaterializationElementRespList(materializationElementRespList); + }); + } + return materializationRespList; + } + + @Override + public List getMaterializationByTable(Long databaseId, String destinationTable) { + MaterializationFilter filter = new MaterializationConfFilter(); + filter.setDestinationTable(destinationTable); + filter.setDatabaseId(databaseId); + List materializationRespList = materializationRepository.getMaterializationResp(filter); + if (!CollectionUtils.isEmpty(materializationRespList)) { + return materializationRespList.stream().map(m -> m.getId()).collect(Collectors.toList()); + } + return new ArrayList<>(); + } + + @Override + public String generateCreateSql(Long materializationId, User user) { + MaterializationConfFilter filter = new MaterializationConfFilter(); + filter.setMaterializationId(materializationId); + filter.setContainElements(true); + List materializationRespList = queryMaterializationConf(filter, user); + if (CollectionUtils.isEmpty(materializationRespList)) { + log.warn("materializationRespList is empty, materializationId:{}", materializationId); + return ""; + } + // 获取db 连接信息 + MaterializationResp materializationResp = materializationRespList.get(0); + + return generateCreateSql(materializationResp); + } + + private String generateCreateSql(MaterializationResp materializationResp) { + MaterializationUtils materializationUtils = new MaterializationZipperUtils(); + return materializationUtils.generateCreateSql(materializationResp); + } + + @Override + public Boolean initMaterializationElementConf(MaterializationConfFilter filter, User user) { + Long materializationId = filter.getMaterializationId(); + MaterializationResp materializationResp = getMaterializationRespById(materializationId, user); + Long modelId = materializationResp.getModelId(); + ModelSchemaResp modelSchemaResp = modelService.fetchSingleModelSchema(modelId); + + doDimensionMaterializationLogic(modelSchemaResp.getDimensions(), materializationResp, user); + + return true; + } + + private void doDimensionMaterializationLogic(List dimensions, + MaterializationResp materializationResp, User user) { + if (CollectionUtils.isEmpty(dimensions)) { + return; + } + Long materializationId = materializationResp.getId(); + cleanMaterializationElement(materializationId, user); + for (DimSchemaResp dimSchemaResp : dimensions) { + MaterializationElementReq materializationElementReq = MaterializationElementReq.builder() + .id(dimSchemaResp.getId()) + .type(TypeEnums.DIMENSION) + .materializationId(materializationId) + .elementType(ElementTypeEnum.VARCHAR) + .frequency(ElementFrequencyEnum.LOW) + .status(StatusEnum.ONLINE) + .description(dimSchemaResp.getDescription()) + .build(); + + addMaterializationElementConf(materializationElementReq, user); + } + MaterializationConfFilter filter = new MaterializationConfFilter(); + filter.setMaterializationId(materializationId); + + MaterializationResp materializationRespNew = getMaterializationRespById(materializationId, user); + String createSql = generateCreateSql(materializationRespNew); + log.info("createSql:{}", createSql); + + } + + private Boolean cleanMaterializationElement(Long materializationId, User user) { + log.info("cleanMaterializationElement materializationId:{}", materializationId); + return materializationElementRepository.cleanMaterializationElement(materializationId); + } + + + @Override + public List getMaterializationElementModels(Long materializationId, User user) { + MaterializationResp materializationResp = materializationRepository.getMaterialization(materializationId); + MaterializationConfFilter filter = new MaterializationConfFilter(); + filter.setMaterializationId(materializationId); + List materializationElementRespList = materializationElementRepository + .getMaterializationElementResp(filter); + List materializationElementModelRespList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(materializationElementRespList)) { + ModelSchemaFilterReq modelFilter = new ModelSchemaFilterReq(); + modelFilter.setModelIds(Arrays.asList(materializationResp.getModelId())); + List modelSchemaRespList = modelService.fetchModelSchema(modelFilter); + List measureRespList = datasourceService.getMeasureListOfModel( + materializationResp.getModelId()); + Map dimSchemaRespMap = new HashMap<>(); + Map metricSchemaRespHashMap = new HashMap<>(); + if (!CollectionUtils.isEmpty(modelSchemaRespList)) { + modelSchemaRespList.stream().forEach(modelSchemaResp -> { + List dimensions = modelSchemaResp.getDimensions(); + List metrics = modelSchemaResp.getMetrics(); + if (!CollectionUtils.isEmpty(dimensions)) { + dimensions.stream().forEach(dimSchemaResp -> { + String key = TypeEnums.DIMENSION.name() + typeAndIdSplit + dimSchemaResp.getId(); + dimSchemaRespMap.put(key, dimSchemaResp); + }); + } + if (!CollectionUtils.isEmpty(metrics)) { + metrics.stream().forEach(metricSchemaResp -> { + String key = TypeEnums.METRIC.name() + typeAndIdSplit + metricSchemaResp.getId(); + metricSchemaRespHashMap.put(key, metricSchemaResp); + }); + } + }); + } + materializationElementRespList.stream().forEach(materializationElementResp -> { + String key = materializationElementResp.getType() + typeAndIdSplit + materializationElementResp.getId(); + DimSchemaResp schemaItem = dimSchemaRespMap.getOrDefault(key, null); + MaterializationElementModelResp materializationElementModelResp = MaterializationElementModelResp + .builder() + .type(materializationElementResp.getType()) + .id(materializationElementResp.getId()) + .build(); + if (Objects.nonNull(schemaItem)) { + materializationElementModelResp.setBizName(schemaItem.getBizName()); + materializationElementModelResp.setExpr(schemaItem.getExpr()); + materializationElementModelRespList.add(materializationElementModelResp); + } else { + MetricSchemaResp metricSchemaResp = metricSchemaRespHashMap.getOrDefault(key, null); + if (Objects.nonNull(metricSchemaResp)) { + materializationElementModelResp.setBizName(metricSchemaResp.getBizName()); + materializationElementModelResp.setExpr(metricSchemaResp.getTypeParams().getExpr()); + materializationElementModelResp.setMeasures(metricSchemaResp.getTypeParams().getMeasures()); + materializationElementModelResp.getMeasures().forEach(m -> { + m.setExpr(getDataSourceMeasure(measureRespList, m.getBizName())); + }); + materializationElementModelRespList.add(materializationElementModelResp); + } + } + }); + } + return materializationElementModelRespList; + } + + @Override + public List getMaterializationSourceResp( + Long materializationId) { + + MaterializationResp materializationResp = materializationRepository.getMaterialization( + materializationId); + Long modelId = materializationResp.getModelId(); + List modelDataSources = datasourceService.getDatasourceList(modelId); + + Set dataSourceIds = new HashSet<>(); + Map> dataSourceDimensions = new HashMap<>(); + Map> dataSourceMetrics = new HashMap<>(); + MaterializationConfFilter materializationConfFilter = new MaterializationConfFilter(); + materializationConfFilter.setMaterializationId(materializationId); + List materializationElementRespList = materializationElementRepository + .getMaterializationElementResp(materializationConfFilter); + if (!CollectionUtils.isEmpty(materializationElementRespList)) { + ModelSchemaFilterReq modelSchemaFilterReq = new ModelSchemaFilterReq(); + modelSchemaFilterReq.setModelIds(Arrays.asList(modelId)); + List modelSchemaRespList = modelService.fetchModelSchema(modelSchemaFilterReq); + List measureRespList = datasourceService.getMeasureListOfModel(modelId); + Set dimensionIds = new HashSet<>(); + Set metricIds = new HashSet<>(); + materializationElementRespList.stream().forEach(e -> { + if (e.getType().equals(TypeEnums.DIMENSION)) { + dimensionIds.add(e.getId()); + } + if (e.getType().equals(TypeEnums.METRIC)) { + metricIds.add(e.getId()); + } + }); + modelSchemaRespList.stream().forEach(m -> { + m.getDimensions().stream().filter(mm -> dimensionIds.contains(mm.getId())).forEach(mm -> { + if (!dataSourceDimensions.containsKey(mm.getDatasourceId())) { + dataSourceDimensions.put(mm.getDatasourceId(), new HashMap<>()); + } + dataSourceDimensions.get(mm.getDatasourceId()).put(mm.getId(), mm.getBizName()); + dataSourceIds.add(mm.getDatasourceId()); + }); + m.getMetrics().stream().filter(mm -> metricIds.contains(mm.getId())).forEach(mm -> { + Long sourceId = 0L; + for (Measure measure : mm.getTypeParams().getMeasures()) { + sourceId = getSourceIdByMeasure(measureRespList, measure.getBizName()); + if (sourceId > 0) { + break; + } + } + if (sourceId > 0) { + if (!dataSourceMetrics.containsKey(sourceId)) { + dataSourceMetrics.put(sourceId, new HashMap<>()); + } + dataSourceMetrics.get(sourceId).put(mm.getId(), mm.getBizName()); + dataSourceIds.add(sourceId); + } + }); + }); + } + List materializationSourceResps = new ArrayList<>(); + for (Long sourceId : dataSourceIds) { + Optional datasourceResp = modelDataSources.stream().filter(d -> d.getId().equals(sourceId)) + .findFirst(); + if (datasourceResp.isPresent()) { + MaterializationSourceResp materializationSourceResp = MaterializationSourceResp.builder() + .dataSourceId(sourceId) + .materializationId(materializationId) + .modelId(modelId) + .depends(datasourceResp.get().getDepends()) + .materializedType(materializationResp.getMaterializedType()) + .entities(materializationResp.getEntities()) + .dateInfo(materializationResp.getDateInfo()) + .updateCycle(materializationResp.getUpdateCycle()) + .build(); + setDataSourceDb(datasourceResp.get(), materializationSourceResp); + materializationSourceResp.setMetrics( + dataSourceMetrics.containsKey(sourceId) ? dataSourceMetrics.get(sourceId) + : new HashMap<>()); + materializationSourceResp.setDimensions( + dataSourceDimensions.containsKey(sourceId) ? dataSourceDimensions.get(sourceId) + : new HashMap<>()); + materializationSourceResps.add(materializationSourceResp); + } + } + return materializationSourceResps; + } + + public Long getSourceIdByMeasure(List measureRespList, String bizName) { + if (!CollectionUtils.isEmpty(measureRespList)) { + Optional measure = measureRespList.stream() + .filter(m -> m.getBizName().equalsIgnoreCase(bizName)).findFirst(); + if (measure.isPresent()) { + return measure.get().getDatasourceId(); + } + } + return 0L; + } + + private void setDataSourceDb(DatasourceResp datasourceResp, MaterializationSourceResp materializationSourceResp) { + if (Objects.nonNull(datasourceResp.getDatasourceDetail())) { + String dbTable = ""; + if (Objects.nonNull(datasourceResp.getDatasourceDetail().getTableQuery()) + && !datasourceResp.getDatasourceDetail().getTableQuery().isEmpty()) { + dbTable = datasourceResp.getDatasourceDetail().getTableQuery(); + } + if (Objects.nonNull(datasourceResp.getDatasourceDetail().getSqlQuery()) + && !datasourceResp.getDatasourceDetail().getSqlQuery().isEmpty()) { + dbTable = SqlParserSelectHelper.getDbTableName(datasourceResp.getDatasourceDetail().getSqlQuery()); + } + if (!dbTable.isEmpty()) { + String[] db = dbTable.split("\\."); + if (db.length > 1) { + materializationSourceResp.setSourceDb(db[0]); + materializationSourceResp.setSourceTable(db[1]); + } + } + } + } + + + private String getDataSourceMeasure(List measureRespList, String bizName) { + if (!CollectionUtils.isEmpty(measureRespList)) { + Optional measure = measureRespList.stream() + .filter(m -> m.getBizName().equalsIgnoreCase(bizName)).findFirst(); + if (measure.isPresent()) { + return measure.get().getExpr(); + } + } + return ""; + } + + +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/application/MaterializationRecordServiceImpl.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/application/MaterializationRecordServiceImpl.java new file mode 100644 index 000000000..8cd0f6448 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/application/MaterializationRecordServiceImpl.java @@ -0,0 +1,80 @@ +package com.tencent.supersonic.semantic.materialization.application; + + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationDateFilter; +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationRecordFilter; +import com.tencent.supersonic.semantic.api.materialization.request.MaterializationRecordReq; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationDateResp; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationRecordResp; +import com.tencent.supersonic.semantic.materialization.domain.MaterializationRecordService; +import com.tencent.supersonic.semantic.materialization.domain.pojo.MaterializationRecord; +import com.tencent.supersonic.semantic.materialization.domain.repository.MaterializationRecordRepository; +import com.tencent.supersonic.semantic.materialization.domain.utils.MaterializationRecordConverter; +import java.util.Arrays; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class MaterializationRecordServiceImpl implements MaterializationRecordService { + + private final MaterializationRecordRepository repository; + + public MaterializationRecordServiceImpl(MaterializationRecordRepository materializationRecordRepository) { + this.repository = materializationRecordRepository; + } + + @Override + public Boolean addMaterializationRecord(MaterializationRecordReq materializationRecordReq, User user) { + log.info("materializationRecordReq:{}, user:{}", JsonUtil.toString(materializationRecordReq), + JsonUtil.toString(user)); + MaterializationRecord materializationRecord = MaterializationRecordConverter.req2Bean(materializationRecordReq); + RecordInfo recordInfo = new RecordInfo().createdBy(user.getName()); + BeanUtils.copyProperties(recordInfo, materializationRecord); + return repository.insertMaterializationRecord(materializationRecord); + } + + @Override + public Boolean updateMaterializationRecord(MaterializationRecordReq materializationRecordReq, User user) { + log.info("materializationRecordReq:{}, user:{}", JsonUtil.toString(materializationRecordReq), + JsonUtil.toString(user)); + MaterializationRecord materializationRecord = MaterializationRecordConverter.req2Bean(materializationRecordReq); + RecordInfo recordInfo = new RecordInfo().updatedBy(user.getName()); + BeanUtils.copyProperties(recordInfo, materializationRecord); + return repository.updateMaterializationRecord(materializationRecord); + } + + @Override + public List getMaterializationRecordList(MaterializationRecordFilter filter, User user) { + return repository.getMaterializationRecordList(filter); + } + + @Override + public Long getMaterializationRecordCount(MaterializationRecordFilter filter, User user) { + return repository.getCount(filter); + } + + @Override + public List fetchMaterializationDate(MaterializationDateFilter filter, User user) { + return null; + } + + @Override + public List fetchMaterializationDate(List materializationIds, String elementName, + String startTime, String endTime) { + MaterializationRecordFilter materializationRecordFilter = MaterializationRecordFilter.builder() + .taskStatus(Arrays.asList(TaskStatusEnum.SUCCESS)) + .elementName(elementName) + .materializationIds(materializationIds) + .startDataTime(startTime) + .endDataTime(endTime).build(); + return repository.getMaterializationRecordList(materializationRecordFilter); + } + +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/MaterializationConfService.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/MaterializationConfService.java new file mode 100644 index 000000000..fd50893e2 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/MaterializationConfService.java @@ -0,0 +1,44 @@ +package com.tencent.supersonic.semantic.materialization.domain; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationConfFilter; +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationFilter; +import com.tencent.supersonic.semantic.api.materialization.request.MaterializationElementReq; +import com.tencent.supersonic.semantic.api.materialization.request.MaterializationReq; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationElementModelResp; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationResp; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationSourceResp; +import com.tencent.supersonic.semantic.api.model.response.MeasureResp; +import java.util.List; + +public interface MaterializationConfService { + + Boolean addMaterializationConf(MaterializationReq materializationReq, User user); + + Boolean updateMaterializationConf(MaterializationReq materializationReq, User user); + + List getMaterializationResp(MaterializationFilter filter, User user); + + + Boolean addMaterializationElementConf(MaterializationElementReq materializationElementReq, User user); + + Boolean updateMaterializationElementConf(MaterializationElementReq materializationElementReq, User user); + + List queryMaterializationConf(MaterializationConfFilter filter, User user); + + List getMaterializationByModel(Long modelId); + + List getMaterializationByTable(Long databaseId, String destinationTable); + + String generateCreateSql(Long materializationId, User user); + + Boolean initMaterializationElementConf(MaterializationConfFilter filter, User user); + + List getMaterializationElementModels(Long materializationId, User user); + + List getMaterializationSourceResp(Long materializationId); + + Long getSourceIdByMeasure(List measureRespList, String bizName); + + +} diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/MaterializationRecordService.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/MaterializationRecordService.java new file mode 100644 index 000000000..8eb6ea2ec --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/MaterializationRecordService.java @@ -0,0 +1,27 @@ +package com.tencent.supersonic.semantic.materialization.domain; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationDateFilter; +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationRecordFilter; +import com.tencent.supersonic.semantic.api.materialization.request.MaterializationRecordReq; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationDateResp; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationRecordResp; +import java.util.List; + +public interface MaterializationRecordService { + + Boolean addMaterializationRecord(MaterializationRecordReq materializationRecord, User user); + + Boolean updateMaterializationRecord(MaterializationRecordReq materializationRecord, User user); + + List getMaterializationRecordList(MaterializationRecordFilter filter, User user); + + Long getMaterializationRecordCount(MaterializationRecordFilter filter, User user); + + List fetchMaterializationDate(MaterializationDateFilter filter, User user); + + List fetchMaterializationDate(List materializationIds, String elementName, + String startTime, String endTime); + + +} diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationDO.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationDO.java new file mode 100644 index 000000000..5989f471b --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationDO.java @@ -0,0 +1,145 @@ +package com.tencent.supersonic.semantic.materialization.domain.dataobject; + +import java.util.Date; + +public class MaterializationDO { + private Long id; + + private String name; + + private String materializedType; + + private String updateCycle; + + private Long modelId; + + private Long databaseId; + + private Integer level; + + private Integer status; + + private String destinationTable; + + private String principals; + + private Date createdAt; + + private String createdBy; + + private Date updatedAt; + + private String updatedBy; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + public String getMaterializedType() { + return materializedType; + } + + public void setMaterializedType(String materializedType) { + this.materializedType = materializedType == null ? null : materializedType.trim(); + } + + public String getUpdateCycle() { + return updateCycle; + } + + public void setUpdateCycle(String updateCycle) { + this.updateCycle = updateCycle == null ? null : updateCycle.trim(); + } + + public Long getModelId() { + return modelId; + } + + public void setModelId(Long modelId) { + this.modelId = modelId; + } + + public Long getDatabaseId() { + return databaseId; + } + + public void setDatabaseId(Long databaseId) { + this.databaseId = databaseId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getDestinationTable() { + return destinationTable; + } + + public void setDestinationTable(String destinationTable) { + this.destinationTable = destinationTable == null ? null : destinationTable.trim(); + } + + public String getPrincipals() { + return principals; + } + + public void setPrincipals(String principals) { + this.principals = principals == null ? null : principals.trim(); + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy == null ? null : createdBy.trim(); + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy == null ? null : updatedBy.trim(); + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationDOExample.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationDOExample.java new file mode 100644 index 000000000..94c607e17 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationDOExample.java @@ -0,0 +1,1112 @@ +package com.tencent.supersonic.semantic.materialization.domain.dataobject; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class MaterializationDOExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public MaterializationDOExample() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andNameIsNull() { + addCriterion("name is null"); + return (Criteria) this; + } + + public Criteria andNameIsNotNull() { + addCriterion("name is not null"); + return (Criteria) this; + } + + public Criteria andNameEqualTo(String value) { + addCriterion("name =", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotEqualTo(String value) { + addCriterion("name <>", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThan(String value) { + addCriterion("name >", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThanOrEqualTo(String value) { + addCriterion("name >=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThan(String value) { + addCriterion("name <", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThanOrEqualTo(String value) { + addCriterion("name <=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLike(String value) { + addCriterion("name like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotLike(String value) { + addCriterion("name not like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameIn(List values) { + addCriterion("name in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameNotIn(List values) { + addCriterion("name not in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameBetween(String value1, String value2) { + addCriterion("name between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andNameNotBetween(String value1, String value2) { + addCriterion("name not between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeIsNull() { + addCriterion("materialized_type is null"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeIsNotNull() { + addCriterion("materialized_type is not null"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeEqualTo(String value) { + addCriterion("materialized_type =", value, "materializedType"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeNotEqualTo(String value) { + addCriterion("materialized_type <>", value, "materializedType"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeGreaterThan(String value) { + addCriterion("materialized_type >", value, "materializedType"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeGreaterThanOrEqualTo(String value) { + addCriterion("materialized_type >=", value, "materializedType"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeLessThan(String value) { + addCriterion("materialized_type <", value, "materializedType"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeLessThanOrEqualTo(String value) { + addCriterion("materialized_type <=", value, "materializedType"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeLike(String value) { + addCriterion("materialized_type like", value, "materializedType"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeNotLike(String value) { + addCriterion("materialized_type not like", value, "materializedType"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeIn(List values) { + addCriterion("materialized_type in", values, "materializedType"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeNotIn(List values) { + addCriterion("materialized_type not in", values, "materializedType"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeBetween(String value1, String value2) { + addCriterion("materialized_type between", value1, value2, "materializedType"); + return (Criteria) this; + } + + public Criteria andMaterializedTypeNotBetween(String value1, String value2) { + addCriterion("materialized_type not between", value1, value2, "materializedType"); + return (Criteria) this; + } + + public Criteria andUpdateCycleIsNull() { + addCriterion("update_cycle is null"); + return (Criteria) this; + } + + public Criteria andUpdateCycleIsNotNull() { + addCriterion("update_cycle is not null"); + return (Criteria) this; + } + + public Criteria andUpdateCycleEqualTo(String value) { + addCriterion("update_cycle =", value, "updateCycle"); + return (Criteria) this; + } + + public Criteria andUpdateCycleNotEqualTo(String value) { + addCriterion("update_cycle <>", value, "updateCycle"); + return (Criteria) this; + } + + public Criteria andUpdateCycleGreaterThan(String value) { + addCriterion("update_cycle >", value, "updateCycle"); + return (Criteria) this; + } + + public Criteria andUpdateCycleGreaterThanOrEqualTo(String value) { + addCriterion("update_cycle >=", value, "updateCycle"); + return (Criteria) this; + } + + public Criteria andUpdateCycleLessThan(String value) { + addCriterion("update_cycle <", value, "updateCycle"); + return (Criteria) this; + } + + public Criteria andUpdateCycleLessThanOrEqualTo(String value) { + addCriterion("update_cycle <=", value, "updateCycle"); + return (Criteria) this; + } + + public Criteria andUpdateCycleLike(String value) { + addCriterion("update_cycle like", value, "updateCycle"); + return (Criteria) this; + } + + public Criteria andUpdateCycleNotLike(String value) { + addCriterion("update_cycle not like", value, "updateCycle"); + return (Criteria) this; + } + + public Criteria andUpdateCycleIn(List values) { + addCriterion("update_cycle in", values, "updateCycle"); + return (Criteria) this; + } + + public Criteria andUpdateCycleNotIn(List values) { + addCriterion("update_cycle not in", values, "updateCycle"); + return (Criteria) this; + } + + public Criteria andUpdateCycleBetween(String value1, String value2) { + addCriterion("update_cycle between", value1, value2, "updateCycle"); + return (Criteria) this; + } + + public Criteria andUpdateCycleNotBetween(String value1, String value2) { + addCriterion("update_cycle not between", value1, value2, "updateCycle"); + return (Criteria) this; + } + + public Criteria andModelIdIsNull() { + addCriterion("model_id is null"); + return (Criteria) this; + } + + public Criteria andModelIdIsNotNull() { + addCriterion("model_id is not null"); + return (Criteria) this; + } + + public Criteria andModelIdEqualTo(Long value) { + addCriterion("model_id =", value, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdNotEqualTo(Long value) { + addCriterion("model_id <>", value, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdGreaterThan(Long value) { + addCriterion("model_id >", value, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdGreaterThanOrEqualTo(Long value) { + addCriterion("model_id >=", value, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdLessThan(Long value) { + addCriterion("model_id <", value, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdLessThanOrEqualTo(Long value) { + addCriterion("model_id <=", value, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdIn(List values) { + addCriterion("model_id in", values, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdNotIn(List values) { + addCriterion("model_id not in", values, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdBetween(Long value1, Long value2) { + addCriterion("model_id between", value1, value2, "modelId"); + return (Criteria) this; + } + + public Criteria andModelIdNotBetween(Long value1, Long value2) { + addCriterion("model_id not between", value1, value2, "modelId"); + return (Criteria) this; + } + + public Criteria andDatabaseIdIsNull() { + addCriterion("database_id is null"); + return (Criteria) this; + } + + public Criteria andDatabaseIdIsNotNull() { + addCriterion("database_id is not null"); + return (Criteria) this; + } + + public Criteria andDatabaseIdEqualTo(Long value) { + addCriterion("database_id =", value, "databaseId"); + return (Criteria) this; + } + + public Criteria andDatabaseIdNotEqualTo(Long value) { + addCriterion("database_id <>", value, "databaseId"); + return (Criteria) this; + } + + public Criteria andDatabaseIdGreaterThan(Long value) { + addCriterion("database_id >", value, "databaseId"); + return (Criteria) this; + } + + public Criteria andDatabaseIdGreaterThanOrEqualTo(Long value) { + addCriterion("database_id >=", value, "databaseId"); + return (Criteria) this; + } + + public Criteria andDatabaseIdLessThan(Long value) { + addCriterion("database_id <", value, "databaseId"); + return (Criteria) this; + } + + public Criteria andDatabaseIdLessThanOrEqualTo(Long value) { + addCriterion("database_id <=", value, "databaseId"); + return (Criteria) this; + } + + public Criteria andDatabaseIdIn(List values) { + addCriterion("database_id in", values, "databaseId"); + return (Criteria) this; + } + + public Criteria andDatabaseIdNotIn(List values) { + addCriterion("database_id not in", values, "databaseId"); + return (Criteria) this; + } + + public Criteria andDatabaseIdBetween(Long value1, Long value2) { + addCriterion("database_id between", value1, value2, "databaseId"); + return (Criteria) this; + } + + public Criteria andDatabaseIdNotBetween(Long value1, Long value2) { + addCriterion("database_id not between", value1, value2, "databaseId"); + return (Criteria) this; + } + + public Criteria andLevelIsNull() { + addCriterion("level is null"); + return (Criteria) this; + } + + public Criteria andLevelIsNotNull() { + addCriterion("level is not null"); + return (Criteria) this; + } + + public Criteria andLevelEqualTo(Integer value) { + addCriterion("level =", value, "level"); + return (Criteria) this; + } + + public Criteria andLevelNotEqualTo(Integer value) { + addCriterion("level <>", value, "level"); + return (Criteria) this; + } + + public Criteria andLevelGreaterThan(Integer value) { + addCriterion("level >", value, "level"); + return (Criteria) this; + } + + public Criteria andLevelGreaterThanOrEqualTo(Integer value) { + addCriterion("level >=", value, "level"); + return (Criteria) this; + } + + public Criteria andLevelLessThan(Integer value) { + addCriterion("level <", value, "level"); + return (Criteria) this; + } + + public Criteria andLevelLessThanOrEqualTo(Integer value) { + addCriterion("level <=", value, "level"); + return (Criteria) this; + } + + public Criteria andLevelIn(List values) { + addCriterion("level in", values, "level"); + return (Criteria) this; + } + + public Criteria andLevelNotIn(List values) { + addCriterion("level not in", values, "level"); + return (Criteria) this; + } + + public Criteria andLevelBetween(Integer value1, Integer value2) { + addCriterion("level between", value1, value2, "level"); + return (Criteria) this; + } + + public Criteria andLevelNotBetween(Integer value1, Integer value2) { + addCriterion("level not between", value1, value2, "level"); + return (Criteria) this; + } + + public Criteria andStatusIsNull() { + addCriterion("status is null"); + return (Criteria) this; + } + + public Criteria andStatusIsNotNull() { + addCriterion("status is not null"); + return (Criteria) this; + } + + public Criteria andStatusEqualTo(Integer value) { + addCriterion("status =", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotEqualTo(Integer value) { + addCriterion("status <>", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusGreaterThan(Integer value) { + addCriterion("status >", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusGreaterThanOrEqualTo(Integer value) { + addCriterion("status >=", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLessThan(Integer value) { + addCriterion("status <", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLessThanOrEqualTo(Integer value) { + addCriterion("status <=", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusIn(List values) { + addCriterion("status in", values, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotIn(List values) { + addCriterion("status not in", values, "status"); + return (Criteria) this; + } + + public Criteria andStatusBetween(Integer value1, Integer value2) { + addCriterion("status between", value1, value2, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotBetween(Integer value1, Integer value2) { + addCriterion("status not between", value1, value2, "status"); + return (Criteria) this; + } + + public Criteria andDestinationTableIsNull() { + addCriterion("destination_table is null"); + return (Criteria) this; + } + + public Criteria andDestinationTableIsNotNull() { + addCriterion("destination_table is not null"); + return (Criteria) this; + } + + public Criteria andDestinationTableEqualTo(String value) { + addCriterion("destination_table =", value, "destinationTable"); + return (Criteria) this; + } + + public Criteria andDestinationTableNotEqualTo(String value) { + addCriterion("destination_table <>", value, "destinationTable"); + return (Criteria) this; + } + + public Criteria andDestinationTableGreaterThan(String value) { + addCriterion("destination_table >", value, "destinationTable"); + return (Criteria) this; + } + + public Criteria andDestinationTableGreaterThanOrEqualTo(String value) { + addCriterion("destination_table >=", value, "destinationTable"); + return (Criteria) this; + } + + public Criteria andDestinationTableLessThan(String value) { + addCriterion("destination_table <", value, "destinationTable"); + return (Criteria) this; + } + + public Criteria andDestinationTableLessThanOrEqualTo(String value) { + addCriterion("destination_table <=", value, "destinationTable"); + return (Criteria) this; + } + + public Criteria andDestinationTableLike(String value) { + addCriterion("destination_table like", value, "destinationTable"); + return (Criteria) this; + } + + public Criteria andDestinationTableNotLike(String value) { + addCriterion("destination_table not like", value, "destinationTable"); + return (Criteria) this; + } + + public Criteria andDestinationTableIn(List values) { + addCriterion("destination_table in", values, "destinationTable"); + return (Criteria) this; + } + + public Criteria andDestinationTableNotIn(List values) { + addCriterion("destination_table not in", values, "destinationTable"); + return (Criteria) this; + } + + public Criteria andDestinationTableBetween(String value1, String value2) { + addCriterion("destination_table between", value1, value2, "destinationTable"); + return (Criteria) this; + } + + public Criteria andDestinationTableNotBetween(String value1, String value2) { + addCriterion("destination_table not between", value1, value2, "destinationTable"); + return (Criteria) this; + } + + public Criteria andPrincipalsIsNull() { + addCriterion("principals is null"); + return (Criteria) this; + } + + public Criteria andPrincipalsIsNotNull() { + addCriterion("principals is not null"); + return (Criteria) this; + } + + public Criteria andPrincipalsEqualTo(String value) { + addCriterion("principals =", value, "principals"); + return (Criteria) this; + } + + public Criteria andPrincipalsNotEqualTo(String value) { + addCriterion("principals <>", value, "principals"); + return (Criteria) this; + } + + public Criteria andPrincipalsGreaterThan(String value) { + addCriterion("principals >", value, "principals"); + return (Criteria) this; + } + + public Criteria andPrincipalsGreaterThanOrEqualTo(String value) { + addCriterion("principals >=", value, "principals"); + return (Criteria) this; + } + + public Criteria andPrincipalsLessThan(String value) { + addCriterion("principals <", value, "principals"); + return (Criteria) this; + } + + public Criteria andPrincipalsLessThanOrEqualTo(String value) { + addCriterion("principals <=", value, "principals"); + return (Criteria) this; + } + + public Criteria andPrincipalsLike(String value) { + addCriterion("principals like", value, "principals"); + return (Criteria) this; + } + + public Criteria andPrincipalsNotLike(String value) { + addCriterion("principals not like", value, "principals"); + return (Criteria) this; + } + + public Criteria andPrincipalsIn(List values) { + addCriterion("principals in", values, "principals"); + return (Criteria) this; + } + + public Criteria andPrincipalsNotIn(List values) { + addCriterion("principals not in", values, "principals"); + return (Criteria) this; + } + + public Criteria andPrincipalsBetween(String value1, String value2) { + addCriterion("principals between", value1, value2, "principals"); + return (Criteria) this; + } + + public Criteria andPrincipalsNotBetween(String value1, String value2) { + addCriterion("principals not between", value1, value2, "principals"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNull() { + addCriterion("created_at is null"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNotNull() { + addCriterion("created_at is not null"); + return (Criteria) this; + } + + public Criteria andCreatedAtEqualTo(Date value) { + addCriterion("created_at =", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotEqualTo(Date value) { + addCriterion("created_at <>", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThan(Date value) { + addCriterion("created_at >", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("created_at >=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThan(Date value) { + addCriterion("created_at <", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThanOrEqualTo(Date value) { + addCriterion("created_at <=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtIn(List values) { + addCriterion("created_at in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotIn(List values) { + addCriterion("created_at not in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtBetween(Date value1, Date value2) { + addCriterion("created_at between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotBetween(Date value1, Date value2) { + addCriterion("created_at not between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedByIsNull() { + addCriterion("created_by is null"); + return (Criteria) this; + } + + public Criteria andCreatedByIsNotNull() { + addCriterion("created_by is not null"); + return (Criteria) this; + } + + public Criteria andCreatedByEqualTo(String value) { + addCriterion("created_by =", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotEqualTo(String value) { + addCriterion("created_by <>", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByGreaterThan(String value) { + addCriterion("created_by >", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByGreaterThanOrEqualTo(String value) { + addCriterion("created_by >=", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLessThan(String value) { + addCriterion("created_by <", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLessThanOrEqualTo(String value) { + addCriterion("created_by <=", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLike(String value) { + addCriterion("created_by like", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotLike(String value) { + addCriterion("created_by not like", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByIn(List values) { + addCriterion("created_by in", values, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotIn(List values) { + addCriterion("created_by not in", values, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByBetween(String value1, String value2) { + addCriterion("created_by between", value1, value2, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotBetween(String value1, String value2) { + addCriterion("created_by not between", value1, value2, "createdBy"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNull() { + addCriterion("updated_at is null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNotNull() { + addCriterion("updated_at is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtEqualTo(Date value) { + addCriterion("updated_at =", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotEqualTo(Date value) { + addCriterion("updated_at <>", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThan(Date value) { + addCriterion("updated_at >", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("updated_at >=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThan(Date value) { + addCriterion("updated_at <", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThanOrEqualTo(Date value) { + addCriterion("updated_at <=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIn(List values) { + addCriterion("updated_at in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotIn(List values) { + addCriterion("updated_at not in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtBetween(Date value1, Date value2) { + addCriterion("updated_at between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotBetween(Date value1, Date value2) { + addCriterion("updated_at not between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedByIsNull() { + addCriterion("updated_by is null"); + return (Criteria) this; + } + + public Criteria andUpdatedByIsNotNull() { + addCriterion("updated_by is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedByEqualTo(String value) { + addCriterion("updated_by =", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotEqualTo(String value) { + addCriterion("updated_by <>", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByGreaterThan(String value) { + addCriterion("updated_by >", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByGreaterThanOrEqualTo(String value) { + addCriterion("updated_by >=", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLessThan(String value) { + addCriterion("updated_by <", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLessThanOrEqualTo(String value) { + addCriterion("updated_by <=", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLike(String value) { + addCriterion("updated_by like", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotLike(String value) { + addCriterion("updated_by not like", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByIn(List values) { + addCriterion("updated_by in", values, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotIn(List values) { + addCriterion("updated_by not in", values, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByBetween(String value1, String value2) { + addCriterion("updated_by between", value1, value2, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotBetween(String value1, String value2) { + addCriterion("updated_by not between", value1, value2, "updatedBy"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationDOWithBLOBs.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationDOWithBLOBs.java new file mode 100644 index 000000000..7e99fd660 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationDOWithBLOBs.java @@ -0,0 +1,33 @@ +package com.tencent.supersonic.semantic.materialization.domain.dataobject; + +public class MaterializationDOWithBLOBs extends MaterializationDO { + private String dateInfo; + + private String entities; + + private String description; + + public String getDateInfo() { + return dateInfo; + } + + public void setDateInfo(String dateInfo) { + this.dateInfo = dateInfo == null ? null : dateInfo.trim(); + } + + public String getEntities() { + return entities; + } + + public void setEntities(String entities) { + this.entities = entities == null ? null : entities.trim(); + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description == null ? null : description.trim(); + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDO.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDO.java new file mode 100644 index 000000000..a0a20a824 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDO.java @@ -0,0 +1,95 @@ +package com.tencent.supersonic.semantic.materialization.domain.dataobject; + +import java.util.Date; + +public class MaterializationElementDO extends MaterializationElementDOKey { + private String elementType; + + private String defaultValue; + + private String outlier; + + private String frequency; + + private Date createdAt; + + private String createdBy; + + private Date updatedAt; + + private String updatedBy; + + private Integer status; + + public String getElementType() { + return elementType; + } + + public void setElementType(String elementType) { + this.elementType = elementType == null ? null : elementType.trim(); + } + + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue == null ? null : defaultValue.trim(); + } + + public String getOutlier() { + return outlier; + } + + public void setOutlier(String outlier) { + this.outlier = outlier == null ? null : outlier.trim(); + } + + public String getFrequency() { + return frequency; + } + + public void setFrequency(String frequency) { + this.frequency = frequency == null ? null : frequency.trim(); + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy == null ? null : createdBy.trim(); + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy == null ? null : updatedBy.trim(); + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDOExample.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDOExample.java new file mode 100644 index 000000000..5683b0626 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDOExample.java @@ -0,0 +1,992 @@ +package com.tencent.supersonic.semantic.materialization.domain.dataobject; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class MaterializationElementDOExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public MaterializationElementDOExample() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andTypeIsNull() { + addCriterion("type is null"); + return (Criteria) this; + } + + public Criteria andTypeIsNotNull() { + addCriterion("type is not null"); + return (Criteria) this; + } + + public Criteria andTypeEqualTo(String value) { + addCriterion("type =", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotEqualTo(String value) { + addCriterion("type <>", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeGreaterThan(String value) { + addCriterion("type >", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeGreaterThanOrEqualTo(String value) { + addCriterion("type >=", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLessThan(String value) { + addCriterion("type <", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLessThanOrEqualTo(String value) { + addCriterion("type <=", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeLike(String value) { + addCriterion("type like", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotLike(String value) { + addCriterion("type not like", value, "type"); + return (Criteria) this; + } + + public Criteria andTypeIn(List values) { + addCriterion("type in", values, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotIn(List values) { + addCriterion("type not in", values, "type"); + return (Criteria) this; + } + + public Criteria andTypeBetween(String value1, String value2) { + addCriterion("type between", value1, value2, "type"); + return (Criteria) this; + } + + public Criteria andTypeNotBetween(String value1, String value2) { + addCriterion("type not between", value1, value2, "type"); + return (Criteria) this; + } + + public Criteria andMaterializationIdIsNull() { + addCriterion("materialization_id is null"); + return (Criteria) this; + } + + public Criteria andMaterializationIdIsNotNull() { + addCriterion("materialization_id is not null"); + return (Criteria) this; + } + + public Criteria andMaterializationIdEqualTo(Long value) { + addCriterion("materialization_id =", value, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdNotEqualTo(Long value) { + addCriterion("materialization_id <>", value, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdGreaterThan(Long value) { + addCriterion("materialization_id >", value, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdGreaterThanOrEqualTo(Long value) { + addCriterion("materialization_id >=", value, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdLessThan(Long value) { + addCriterion("materialization_id <", value, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdLessThanOrEqualTo(Long value) { + addCriterion("materialization_id <=", value, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdIn(List values) { + addCriterion("materialization_id in", values, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdNotIn(List values) { + addCriterion("materialization_id not in", values, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdBetween(Long value1, Long value2) { + addCriterion("materialization_id between", value1, value2, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdNotBetween(Long value1, Long value2) { + addCriterion("materialization_id not between", value1, value2, "materializationId"); + return (Criteria) this; + } + + public Criteria andElementTypeIsNull() { + addCriterion("element_type is null"); + return (Criteria) this; + } + + public Criteria andElementTypeIsNotNull() { + addCriterion("element_type is not null"); + return (Criteria) this; + } + + public Criteria andElementTypeEqualTo(String value) { + addCriterion("element_type =", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeNotEqualTo(String value) { + addCriterion("element_type <>", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeGreaterThan(String value) { + addCriterion("element_type >", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeGreaterThanOrEqualTo(String value) { + addCriterion("element_type >=", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeLessThan(String value) { + addCriterion("element_type <", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeLessThanOrEqualTo(String value) { + addCriterion("element_type <=", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeLike(String value) { + addCriterion("element_type like", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeNotLike(String value) { + addCriterion("element_type not like", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeIn(List values) { + addCriterion("element_type in", values, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeNotIn(List values) { + addCriterion("element_type not in", values, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeBetween(String value1, String value2) { + addCriterion("element_type between", value1, value2, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeNotBetween(String value1, String value2) { + addCriterion("element_type not between", value1, value2, "elementType"); + return (Criteria) this; + } + + public Criteria andDefaultValueIsNull() { + addCriterion("default_value is null"); + return (Criteria) this; + } + + public Criteria andDefaultValueIsNotNull() { + addCriterion("default_value is not null"); + return (Criteria) this; + } + + public Criteria andDefaultValueEqualTo(String value) { + addCriterion("default_value =", value, "defaultValue"); + return (Criteria) this; + } + + public Criteria andDefaultValueNotEqualTo(String value) { + addCriterion("default_value <>", value, "defaultValue"); + return (Criteria) this; + } + + public Criteria andDefaultValueGreaterThan(String value) { + addCriterion("default_value >", value, "defaultValue"); + return (Criteria) this; + } + + public Criteria andDefaultValueGreaterThanOrEqualTo(String value) { + addCriterion("default_value >=", value, "defaultValue"); + return (Criteria) this; + } + + public Criteria andDefaultValueLessThan(String value) { + addCriterion("default_value <", value, "defaultValue"); + return (Criteria) this; + } + + public Criteria andDefaultValueLessThanOrEqualTo(String value) { + addCriterion("default_value <=", value, "defaultValue"); + return (Criteria) this; + } + + public Criteria andDefaultValueLike(String value) { + addCriterion("default_value like", value, "defaultValue"); + return (Criteria) this; + } + + public Criteria andDefaultValueNotLike(String value) { + addCriterion("default_value not like", value, "defaultValue"); + return (Criteria) this; + } + + public Criteria andDefaultValueIn(List values) { + addCriterion("default_value in", values, "defaultValue"); + return (Criteria) this; + } + + public Criteria andDefaultValueNotIn(List values) { + addCriterion("default_value not in", values, "defaultValue"); + return (Criteria) this; + } + + public Criteria andDefaultValueBetween(String value1, String value2) { + addCriterion("default_value between", value1, value2, "defaultValue"); + return (Criteria) this; + } + + public Criteria andDefaultValueNotBetween(String value1, String value2) { + addCriterion("default_value not between", value1, value2, "defaultValue"); + return (Criteria) this; + } + + public Criteria andOutlierIsNull() { + addCriterion("outlier is null"); + return (Criteria) this; + } + + public Criteria andOutlierIsNotNull() { + addCriterion("outlier is not null"); + return (Criteria) this; + } + + public Criteria andOutlierEqualTo(String value) { + addCriterion("outlier =", value, "outlier"); + return (Criteria) this; + } + + public Criteria andOutlierNotEqualTo(String value) { + addCriterion("outlier <>", value, "outlier"); + return (Criteria) this; + } + + public Criteria andOutlierGreaterThan(String value) { + addCriterion("outlier >", value, "outlier"); + return (Criteria) this; + } + + public Criteria andOutlierGreaterThanOrEqualTo(String value) { + addCriterion("outlier >=", value, "outlier"); + return (Criteria) this; + } + + public Criteria andOutlierLessThan(String value) { + addCriterion("outlier <", value, "outlier"); + return (Criteria) this; + } + + public Criteria andOutlierLessThanOrEqualTo(String value) { + addCriterion("outlier <=", value, "outlier"); + return (Criteria) this; + } + + public Criteria andOutlierLike(String value) { + addCriterion("outlier like", value, "outlier"); + return (Criteria) this; + } + + public Criteria andOutlierNotLike(String value) { + addCriterion("outlier not like", value, "outlier"); + return (Criteria) this; + } + + public Criteria andOutlierIn(List values) { + addCriterion("outlier in", values, "outlier"); + return (Criteria) this; + } + + public Criteria andOutlierNotIn(List values) { + addCriterion("outlier not in", values, "outlier"); + return (Criteria) this; + } + + public Criteria andOutlierBetween(String value1, String value2) { + addCriterion("outlier between", value1, value2, "outlier"); + return (Criteria) this; + } + + public Criteria andOutlierNotBetween(String value1, String value2) { + addCriterion("outlier not between", value1, value2, "outlier"); + return (Criteria) this; + } + + public Criteria andFrequencyIsNull() { + addCriterion("frequency is null"); + return (Criteria) this; + } + + public Criteria andFrequencyIsNotNull() { + addCriterion("frequency is not null"); + return (Criteria) this; + } + + public Criteria andFrequencyEqualTo(String value) { + addCriterion("frequency =", value, "frequency"); + return (Criteria) this; + } + + public Criteria andFrequencyNotEqualTo(String value) { + addCriterion("frequency <>", value, "frequency"); + return (Criteria) this; + } + + public Criteria andFrequencyGreaterThan(String value) { + addCriterion("frequency >", value, "frequency"); + return (Criteria) this; + } + + public Criteria andFrequencyGreaterThanOrEqualTo(String value) { + addCriterion("frequency >=", value, "frequency"); + return (Criteria) this; + } + + public Criteria andFrequencyLessThan(String value) { + addCriterion("frequency <", value, "frequency"); + return (Criteria) this; + } + + public Criteria andFrequencyLessThanOrEqualTo(String value) { + addCriterion("frequency <=", value, "frequency"); + return (Criteria) this; + } + + public Criteria andFrequencyLike(String value) { + addCriterion("frequency like", value, "frequency"); + return (Criteria) this; + } + + public Criteria andFrequencyNotLike(String value) { + addCriterion("frequency not like", value, "frequency"); + return (Criteria) this; + } + + public Criteria andFrequencyIn(List values) { + addCriterion("frequency in", values, "frequency"); + return (Criteria) this; + } + + public Criteria andFrequencyNotIn(List values) { + addCriterion("frequency not in", values, "frequency"); + return (Criteria) this; + } + + public Criteria andFrequencyBetween(String value1, String value2) { + addCriterion("frequency between", value1, value2, "frequency"); + return (Criteria) this; + } + + public Criteria andFrequencyNotBetween(String value1, String value2) { + addCriterion("frequency not between", value1, value2, "frequency"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNull() { + addCriterion("created_at is null"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNotNull() { + addCriterion("created_at is not null"); + return (Criteria) this; + } + + public Criteria andCreatedAtEqualTo(Date value) { + addCriterion("created_at =", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotEqualTo(Date value) { + addCriterion("created_at <>", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThan(Date value) { + addCriterion("created_at >", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("created_at >=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThan(Date value) { + addCriterion("created_at <", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThanOrEqualTo(Date value) { + addCriterion("created_at <=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtIn(List values) { + addCriterion("created_at in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotIn(List values) { + addCriterion("created_at not in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtBetween(Date value1, Date value2) { + addCriterion("created_at between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotBetween(Date value1, Date value2) { + addCriterion("created_at not between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedByIsNull() { + addCriterion("created_by is null"); + return (Criteria) this; + } + + public Criteria andCreatedByIsNotNull() { + addCriterion("created_by is not null"); + return (Criteria) this; + } + + public Criteria andCreatedByEqualTo(String value) { + addCriterion("created_by =", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotEqualTo(String value) { + addCriterion("created_by <>", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByGreaterThan(String value) { + addCriterion("created_by >", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByGreaterThanOrEqualTo(String value) { + addCriterion("created_by >=", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLessThan(String value) { + addCriterion("created_by <", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLessThanOrEqualTo(String value) { + addCriterion("created_by <=", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLike(String value) { + addCriterion("created_by like", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotLike(String value) { + addCriterion("created_by not like", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByIn(List values) { + addCriterion("created_by in", values, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotIn(List values) { + addCriterion("created_by not in", values, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByBetween(String value1, String value2) { + addCriterion("created_by between", value1, value2, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotBetween(String value1, String value2) { + addCriterion("created_by not between", value1, value2, "createdBy"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNull() { + addCriterion("updated_at is null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNotNull() { + addCriterion("updated_at is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtEqualTo(Date value) { + addCriterion("updated_at =", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotEqualTo(Date value) { + addCriterion("updated_at <>", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThan(Date value) { + addCriterion("updated_at >", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("updated_at >=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThan(Date value) { + addCriterion("updated_at <", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThanOrEqualTo(Date value) { + addCriterion("updated_at <=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIn(List values) { + addCriterion("updated_at in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotIn(List values) { + addCriterion("updated_at not in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtBetween(Date value1, Date value2) { + addCriterion("updated_at between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotBetween(Date value1, Date value2) { + addCriterion("updated_at not between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedByIsNull() { + addCriterion("updated_by is null"); + return (Criteria) this; + } + + public Criteria andUpdatedByIsNotNull() { + addCriterion("updated_by is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedByEqualTo(String value) { + addCriterion("updated_by =", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotEqualTo(String value) { + addCriterion("updated_by <>", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByGreaterThan(String value) { + addCriterion("updated_by >", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByGreaterThanOrEqualTo(String value) { + addCriterion("updated_by >=", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLessThan(String value) { + addCriterion("updated_by <", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLessThanOrEqualTo(String value) { + addCriterion("updated_by <=", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLike(String value) { + addCriterion("updated_by like", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotLike(String value) { + addCriterion("updated_by not like", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByIn(List values) { + addCriterion("updated_by in", values, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotIn(List values) { + addCriterion("updated_by not in", values, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByBetween(String value1, String value2) { + addCriterion("updated_by between", value1, value2, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotBetween(String value1, String value2) { + addCriterion("updated_by not between", value1, value2, "updatedBy"); + return (Criteria) this; + } + + public Criteria andStatusIsNull() { + addCriterion("status is null"); + return (Criteria) this; + } + + public Criteria andStatusIsNotNull() { + addCriterion("status is not null"); + return (Criteria) this; + } + + public Criteria andStatusEqualTo(Integer value) { + addCriterion("status =", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotEqualTo(Integer value) { + addCriterion("status <>", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusGreaterThan(Integer value) { + addCriterion("status >", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusGreaterThanOrEqualTo(Integer value) { + addCriterion("status >=", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLessThan(Integer value) { + addCriterion("status <", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLessThanOrEqualTo(Integer value) { + addCriterion("status <=", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusIn(List values) { + addCriterion("status in", values, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotIn(List values) { + addCriterion("status not in", values, "status"); + return (Criteria) this; + } + + public Criteria andStatusBetween(Integer value1, Integer value2) { + addCriterion("status between", value1, value2, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotBetween(Integer value1, Integer value2) { + addCriterion("status not between", value1, value2, "status"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDOKey.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDOKey.java new file mode 100644 index 000000000..fcd9e26fe --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDOKey.java @@ -0,0 +1,33 @@ +package com.tencent.supersonic.semantic.materialization.domain.dataobject; + +public class MaterializationElementDOKey { + private Long id; + + private String type; + + private Long materializationId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type == null ? null : type.trim(); + } + + public Long getMaterializationId() { + return materializationId; + } + + public void setMaterializationId(Long materializationId) { + this.materializationId = materializationId; + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDOWithBLOBs.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDOWithBLOBs.java new file mode 100644 index 000000000..9e2542ccf --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationElementDOWithBLOBs.java @@ -0,0 +1,23 @@ +package com.tencent.supersonic.semantic.materialization.domain.dataobject; + +public class MaterializationElementDOWithBLOBs extends MaterializationElementDO { + private String depends; + + private String description; + + public String getDepends() { + return depends; + } + + public void setDepends(String depends) { + this.depends = depends == null ? null : depends.trim(); + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description == null ? null : description.trim(); + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationRecordDO.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationRecordDO.java new file mode 100644 index 000000000..42ee0fa4d --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationRecordDO.java @@ -0,0 +1,168 @@ +package com.tencent.supersonic.semantic.materialization.domain.dataobject; + +import lombok.Data; + +import java.util.Date; + +@Data +public class MaterializationRecordDO { + private Long id; + + private Long materializationId; + + private String elementType; + + private Long elementId; + + private String elementName; + + private String dataTime; + + private String state; + + private String taskId; + + private Date createdAt; + + private Date updatedAt; + + private String createdBy; + + private String updatedBy; + + private Long retryCount; + + private Long sourceCount; + + private Long sinkCount; + + private String message; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getMaterializationId() { + return materializationId; + } + + public void setMaterializationId(Long materializationId) { + this.materializationId = materializationId; + } + + public String getElementType() { + return elementType; + } + + public void setElementType(String elementType) { + this.elementType = elementType == null ? null : elementType.trim(); + } + + public Long getElementId() { + return elementId; + } + + public void setElementId(Long elementId) { + this.elementId = elementId; + } + + public String getElementName() { + return elementName; + } + + public void setElementName(String elementName) { + this.elementName = elementName == null ? null : elementName.trim(); + } + + public String getDataTime() { + return dataTime; + } + + public void setDataTime(String dataTime) { + this.dataTime = dataTime == null ? null : dataTime.trim(); + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state == null ? null : state.trim(); + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId == null ? null : taskId.trim(); + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy == null ? null : createdBy.trim(); + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy == null ? null : updatedBy.trim(); + } + + public Long getRetryCount() { + return retryCount; + } + + public void setRetryCount(Long retryCount) { + this.retryCount = retryCount; + } + + public Long getSourceCount() { + return sourceCount; + } + + public void setSourceCount(Long sourceCount) { + this.sourceCount = sourceCount; + } + + public Long getSinkCount() { + return sinkCount; + } + + public void setSinkCount(Long sinkCount) { + this.sinkCount = sinkCount; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message == null ? null : message.trim(); + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationRecordDOExample.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationRecordDOExample.java new file mode 100644 index 000000000..5bc55894d --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/dataobject/MaterializationRecordDOExample.java @@ -0,0 +1,1172 @@ +package com.tencent.supersonic.semantic.materialization.domain.dataobject; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class MaterializationRecordDOExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public MaterializationRecordDOExample() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andMaterializationIdIsNull() { + addCriterion("materialization_id is null"); + return (Criteria) this; + } + + public Criteria andMaterializationIdIsNotNull() { + addCriterion("materialization_id is not null"); + return (Criteria) this; + } + + public Criteria andMaterializationIdEqualTo(Long value) { + addCriterion("materialization_id =", value, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdNotEqualTo(Long value) { + addCriterion("materialization_id <>", value, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdGreaterThan(Long value) { + addCriterion("materialization_id >", value, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdGreaterThanOrEqualTo(Long value) { + addCriterion("materialization_id >=", value, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdLessThan(Long value) { + addCriterion("materialization_id <", value, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdLessThanOrEqualTo(Long value) { + addCriterion("materialization_id <=", value, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdIn(List values) { + addCriterion("materialization_id in", values, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdNotIn(List values) { + addCriterion("materialization_id not in", values, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdBetween(Long value1, Long value2) { + addCriterion("materialization_id between", value1, value2, "materializationId"); + return (Criteria) this; + } + + public Criteria andMaterializationIdNotBetween(Long value1, Long value2) { + addCriterion("materialization_id not between", value1, value2, "materializationId"); + return (Criteria) this; + } + + public Criteria andElementTypeIsNull() { + addCriterion("element_type is null"); + return (Criteria) this; + } + + public Criteria andElementTypeIsNotNull() { + addCriterion("element_type is not null"); + return (Criteria) this; + } + + public Criteria andElementTypeEqualTo(String value) { + addCriterion("element_type =", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeNotEqualTo(String value) { + addCriterion("element_type <>", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeGreaterThan(String value) { + addCriterion("element_type >", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeGreaterThanOrEqualTo(String value) { + addCriterion("element_type >=", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeLessThan(String value) { + addCriterion("element_type <", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeLessThanOrEqualTo(String value) { + addCriterion("element_type <=", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeLike(String value) { + addCriterion("element_type like", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeNotLike(String value) { + addCriterion("element_type not like", value, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeIn(List values) { + addCriterion("element_type in", values, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeNotIn(List values) { + addCriterion("element_type not in", values, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeBetween(String value1, String value2) { + addCriterion("element_type between", value1, value2, "elementType"); + return (Criteria) this; + } + + public Criteria andElementTypeNotBetween(String value1, String value2) { + addCriterion("element_type not between", value1, value2, "elementType"); + return (Criteria) this; + } + + public Criteria andElementIdIsNull() { + addCriterion("element_id is null"); + return (Criteria) this; + } + + public Criteria andElementIdIsNotNull() { + addCriterion("element_id is not null"); + return (Criteria) this; + } + + public Criteria andElementIdEqualTo(Long value) { + addCriterion("element_id =", value, "elementId"); + return (Criteria) this; + } + + public Criteria andElementIdNotEqualTo(Long value) { + addCriterion("element_id <>", value, "elementId"); + return (Criteria) this; + } + + public Criteria andElementIdGreaterThan(Long value) { + addCriterion("element_id >", value, "elementId"); + return (Criteria) this; + } + + public Criteria andElementIdGreaterThanOrEqualTo(Long value) { + addCriterion("element_id >=", value, "elementId"); + return (Criteria) this; + } + + public Criteria andElementIdLessThan(Long value) { + addCriterion("element_id <", value, "elementId"); + return (Criteria) this; + } + + public Criteria andElementIdLessThanOrEqualTo(Long value) { + addCriterion("element_id <=", value, "elementId"); + return (Criteria) this; + } + + public Criteria andElementIdIn(List values) { + addCriterion("element_id in", values, "elementId"); + return (Criteria) this; + } + + public Criteria andElementIdNotIn(List values) { + addCriterion("element_id not in", values, "elementId"); + return (Criteria) this; + } + + public Criteria andElementIdBetween(Long value1, Long value2) { + addCriterion("element_id between", value1, value2, "elementId"); + return (Criteria) this; + } + + public Criteria andElementIdNotBetween(Long value1, Long value2) { + addCriterion("element_id not between", value1, value2, "elementId"); + return (Criteria) this; + } + + public Criteria andElementNameIsNull() { + addCriterion("element_name is null"); + return (Criteria) this; + } + + public Criteria andElementNameIsNotNull() { + addCriterion("element_name is not null"); + return (Criteria) this; + } + + public Criteria andElementNameEqualTo(String value) { + addCriterion("element_name =", value, "elementName"); + return (Criteria) this; + } + + public Criteria andElementNameNotEqualTo(String value) { + addCriterion("element_name <>", value, "elementName"); + return (Criteria) this; + } + + public Criteria andElementNameGreaterThan(String value) { + addCriterion("element_name >", value, "elementName"); + return (Criteria) this; + } + + public Criteria andElementNameGreaterThanOrEqualTo(String value) { + addCriterion("element_name >=", value, "elementName"); + return (Criteria) this; + } + + public Criteria andElementNameLessThan(String value) { + addCriterion("element_name <", value, "elementName"); + return (Criteria) this; + } + + public Criteria andElementNameLessThanOrEqualTo(String value) { + addCriterion("element_name <=", value, "elementName"); + return (Criteria) this; + } + + public Criteria andElementNameLike(String value) { + addCriterion("element_name like", value, "elementName"); + return (Criteria) this; + } + + public Criteria andElementNameNotLike(String value) { + addCriterion("element_name not like", value, "elementName"); + return (Criteria) this; + } + + public Criteria andElementNameIn(List values) { + addCriterion("element_name in", values, "elementName"); + return (Criteria) this; + } + + public Criteria andElementNameNotIn(List values) { + addCriterion("element_name not in", values, "elementName"); + return (Criteria) this; + } + + public Criteria andElementNameBetween(String value1, String value2) { + addCriterion("element_name between", value1, value2, "elementName"); + return (Criteria) this; + } + + public Criteria andElementNameNotBetween(String value1, String value2) { + addCriterion("element_name not between", value1, value2, "elementName"); + return (Criteria) this; + } + + public Criteria andDataTimeIsNull() { + addCriterion("data_time is null"); + return (Criteria) this; + } + + public Criteria andDataTimeIsNotNull() { + addCriterion("data_time is not null"); + return (Criteria) this; + } + + public Criteria andDataTimeEqualTo(String value) { + addCriterion("data_time =", value, "dataTime"); + return (Criteria) this; + } + + public Criteria andDataTimeNotEqualTo(String value) { + addCriterion("data_time <>", value, "dataTime"); + return (Criteria) this; + } + + public Criteria andDataTimeGreaterThan(String value) { + addCriterion("data_time >", value, "dataTime"); + return (Criteria) this; + } + + public Criteria andDataTimeGreaterThanOrEqualTo(String value) { + addCriterion("data_time >=", value, "dataTime"); + return (Criteria) this; + } + + public Criteria andDataTimeLessThan(String value) { + addCriterion("data_time <", value, "dataTime"); + return (Criteria) this; + } + + public Criteria andDataTimeLessThanOrEqualTo(String value) { + addCriterion("data_time <=", value, "dataTime"); + return (Criteria) this; + } + + public Criteria andDataTimeLike(String value) { + addCriterion("data_time like", value, "dataTime"); + return (Criteria) this; + } + + public Criteria andDataTimeNotLike(String value) { + addCriterion("data_time not like", value, "dataTime"); + return (Criteria) this; + } + + public Criteria andDataTimeIn(List values) { + addCriterion("data_time in", values, "dataTime"); + return (Criteria) this; + } + + public Criteria andDataTimeNotIn(List values) { + addCriterion("data_time not in", values, "dataTime"); + return (Criteria) this; + } + + public Criteria andDataTimeBetween(String value1, String value2) { + addCriterion("data_time between", value1, value2, "dataTime"); + return (Criteria) this; + } + + public Criteria andDataTimeNotBetween(String value1, String value2) { + addCriterion("data_time not between", value1, value2, "dataTime"); + return (Criteria) this; + } + + public Criteria andStateIsNull() { + addCriterion("state is null"); + return (Criteria) this; + } + + public Criteria andStateIsNotNull() { + addCriterion("state is not null"); + return (Criteria) this; + } + + public Criteria andStateEqualTo(String value) { + addCriterion("state =", value, "state"); + return (Criteria) this; + } + + public Criteria andStateNotEqualTo(String value) { + addCriterion("state <>", value, "state"); + return (Criteria) this; + } + + public Criteria andStateGreaterThan(String value) { + addCriterion("state >", value, "state"); + return (Criteria) this; + } + + public Criteria andStateGreaterThanOrEqualTo(String value) { + addCriterion("state >=", value, "state"); + return (Criteria) this; + } + + public Criteria andStateLessThan(String value) { + addCriterion("state <", value, "state"); + return (Criteria) this; + } + + public Criteria andStateLessThanOrEqualTo(String value) { + addCriterion("state <=", value, "state"); + return (Criteria) this; + } + + public Criteria andStateLike(String value) { + addCriterion("state like", value, "state"); + return (Criteria) this; + } + + public Criteria andStateNotLike(String value) { + addCriterion("state not like", value, "state"); + return (Criteria) this; + } + + public Criteria andStateIn(List values) { + addCriterion("state in", values, "state"); + return (Criteria) this; + } + + public Criteria andStateNotIn(List values) { + addCriterion("state not in", values, "state"); + return (Criteria) this; + } + + public Criteria andStateBetween(String value1, String value2) { + addCriterion("state between", value1, value2, "state"); + return (Criteria) this; + } + + public Criteria andStateNotBetween(String value1, String value2) { + addCriterion("state not between", value1, value2, "state"); + return (Criteria) this; + } + + public Criteria andTaskIdIsNull() { + addCriterion("task_id is null"); + return (Criteria) this; + } + + public Criteria andTaskIdIsNotNull() { + addCriterion("task_id is not null"); + return (Criteria) this; + } + + public Criteria andTaskIdEqualTo(String value) { + addCriterion("task_id =", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdNotEqualTo(String value) { + addCriterion("task_id <>", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdGreaterThan(String value) { + addCriterion("task_id >", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdGreaterThanOrEqualTo(String value) { + addCriterion("task_id >=", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdLessThan(String value) { + addCriterion("task_id <", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdLessThanOrEqualTo(String value) { + addCriterion("task_id <=", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdLike(String value) { + addCriterion("task_id like", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdNotLike(String value) { + addCriterion("task_id not like", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdIn(List values) { + addCriterion("task_id in", values, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdNotIn(List values) { + addCriterion("task_id not in", values, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdBetween(String value1, String value2) { + addCriterion("task_id between", value1, value2, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdNotBetween(String value1, String value2) { + addCriterion("task_id not between", value1, value2, "taskId"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNull() { + addCriterion("created_at is null"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNotNull() { + addCriterion("created_at is not null"); + return (Criteria) this; + } + + public Criteria andCreatedAtEqualTo(Date value) { + addCriterion("created_at =", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotEqualTo(Date value) { + addCriterion("created_at <>", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThan(Date value) { + addCriterion("created_at >", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("created_at >=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThan(Date value) { + addCriterion("created_at <", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThanOrEqualTo(Date value) { + addCriterion("created_at <=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtIn(List values) { + addCriterion("created_at in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotIn(List values) { + addCriterion("created_at not in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtBetween(Date value1, Date value2) { + addCriterion("created_at between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotBetween(Date value1, Date value2) { + addCriterion("created_at not between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNull() { + addCriterion("updated_at is null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNotNull() { + addCriterion("updated_at is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtEqualTo(Date value) { + addCriterion("updated_at =", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotEqualTo(Date value) { + addCriterion("updated_at <>", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThan(Date value) { + addCriterion("updated_at >", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("updated_at >=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThan(Date value) { + addCriterion("updated_at <", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThanOrEqualTo(Date value) { + addCriterion("updated_at <=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIn(List values) { + addCriterion("updated_at in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotIn(List values) { + addCriterion("updated_at not in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtBetween(Date value1, Date value2) { + addCriterion("updated_at between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotBetween(Date value1, Date value2) { + addCriterion("updated_at not between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andCreatedByIsNull() { + addCriterion("created_by is null"); + return (Criteria) this; + } + + public Criteria andCreatedByIsNotNull() { + addCriterion("created_by is not null"); + return (Criteria) this; + } + + public Criteria andCreatedByEqualTo(String value) { + addCriterion("created_by =", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotEqualTo(String value) { + addCriterion("created_by <>", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByGreaterThan(String value) { + addCriterion("created_by >", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByGreaterThanOrEqualTo(String value) { + addCriterion("created_by >=", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLessThan(String value) { + addCriterion("created_by <", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLessThanOrEqualTo(String value) { + addCriterion("created_by <=", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLike(String value) { + addCriterion("created_by like", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotLike(String value) { + addCriterion("created_by not like", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByIn(List values) { + addCriterion("created_by in", values, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotIn(List values) { + addCriterion("created_by not in", values, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByBetween(String value1, String value2) { + addCriterion("created_by between", value1, value2, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotBetween(String value1, String value2) { + addCriterion("created_by not between", value1, value2, "createdBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByIsNull() { + addCriterion("updated_by is null"); + return (Criteria) this; + } + + public Criteria andUpdatedByIsNotNull() { + addCriterion("updated_by is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedByEqualTo(String value) { + addCriterion("updated_by =", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotEqualTo(String value) { + addCriterion("updated_by <>", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByGreaterThan(String value) { + addCriterion("updated_by >", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByGreaterThanOrEqualTo(String value) { + addCriterion("updated_by >=", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLessThan(String value) { + addCriterion("updated_by <", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLessThanOrEqualTo(String value) { + addCriterion("updated_by <=", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLike(String value) { + addCriterion("updated_by like", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotLike(String value) { + addCriterion("updated_by not like", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByIn(List values) { + addCriterion("updated_by in", values, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotIn(List values) { + addCriterion("updated_by not in", values, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByBetween(String value1, String value2) { + addCriterion("updated_by between", value1, value2, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotBetween(String value1, String value2) { + addCriterion("updated_by not between", value1, value2, "updatedBy"); + return (Criteria) this; + } + + public Criteria andRetryCountIsNull() { + addCriterion("retry_count is null"); + return (Criteria) this; + } + + public Criteria andRetryCountIsNotNull() { + addCriterion("retry_count is not null"); + return (Criteria) this; + } + + public Criteria andRetryCountEqualTo(Long value) { + addCriterion("retry_count =", value, "retryCount"); + return (Criteria) this; + } + + public Criteria andRetryCountNotEqualTo(Long value) { + addCriterion("retry_count <>", value, "retryCount"); + return (Criteria) this; + } + + public Criteria andRetryCountGreaterThan(Long value) { + addCriterion("retry_count >", value, "retryCount"); + return (Criteria) this; + } + + public Criteria andRetryCountGreaterThanOrEqualTo(Long value) { + addCriterion("retry_count >=", value, "retryCount"); + return (Criteria) this; + } + + public Criteria andRetryCountLessThan(Long value) { + addCriterion("retry_count <", value, "retryCount"); + return (Criteria) this; + } + + public Criteria andRetryCountLessThanOrEqualTo(Long value) { + addCriterion("retry_count <=", value, "retryCount"); + return (Criteria) this; + } + + public Criteria andRetryCountIn(List values) { + addCriterion("retry_count in", values, "retryCount"); + return (Criteria) this; + } + + public Criteria andRetryCountNotIn(List values) { + addCriterion("retry_count not in", values, "retryCount"); + return (Criteria) this; + } + + public Criteria andRetryCountBetween(Long value1, Long value2) { + addCriterion("retry_count between", value1, value2, "retryCount"); + return (Criteria) this; + } + + public Criteria andRetryCountNotBetween(Long value1, Long value2) { + addCriterion("retry_count not between", value1, value2, "retryCount"); + return (Criteria) this; + } + + public Criteria andSourceCountIsNull() { + addCriterion("source_count is null"); + return (Criteria) this; + } + + public Criteria andSourceCountIsNotNull() { + addCriterion("source_count is not null"); + return (Criteria) this; + } + + public Criteria andSourceCountEqualTo(Long value) { + addCriterion("source_count =", value, "sourceCount"); + return (Criteria) this; + } + + public Criteria andSourceCountNotEqualTo(Long value) { + addCriterion("source_count <>", value, "sourceCount"); + return (Criteria) this; + } + + public Criteria andSourceCountGreaterThan(Long value) { + addCriterion("source_count >", value, "sourceCount"); + return (Criteria) this; + } + + public Criteria andSourceCountGreaterThanOrEqualTo(Long value) { + addCriterion("source_count >=", value, "sourceCount"); + return (Criteria) this; + } + + public Criteria andSourceCountLessThan(Long value) { + addCriterion("source_count <", value, "sourceCount"); + return (Criteria) this; + } + + public Criteria andSourceCountLessThanOrEqualTo(Long value) { + addCriterion("source_count <=", value, "sourceCount"); + return (Criteria) this; + } + + public Criteria andSourceCountIn(List values) { + addCriterion("source_count in", values, "sourceCount"); + return (Criteria) this; + } + + public Criteria andSourceCountNotIn(List values) { + addCriterion("source_count not in", values, "sourceCount"); + return (Criteria) this; + } + + public Criteria andSourceCountBetween(Long value1, Long value2) { + addCriterion("source_count between", value1, value2, "sourceCount"); + return (Criteria) this; + } + + public Criteria andSourceCountNotBetween(Long value1, Long value2) { + addCriterion("source_count not between", value1, value2, "sourceCount"); + return (Criteria) this; + } + + public Criteria andSinkCountIsNull() { + addCriterion("sink_count is null"); + return (Criteria) this; + } + + public Criteria andSinkCountIsNotNull() { + addCriterion("sink_count is not null"); + return (Criteria) this; + } + + public Criteria andSinkCountEqualTo(Long value) { + addCriterion("sink_count =", value, "sinkCount"); + return (Criteria) this; + } + + public Criteria andSinkCountNotEqualTo(Long value) { + addCriterion("sink_count <>", value, "sinkCount"); + return (Criteria) this; + } + + public Criteria andSinkCountGreaterThan(Long value) { + addCriterion("sink_count >", value, "sinkCount"); + return (Criteria) this; + } + + public Criteria andSinkCountGreaterThanOrEqualTo(Long value) { + addCriterion("sink_count >=", value, "sinkCount"); + return (Criteria) this; + } + + public Criteria andSinkCountLessThan(Long value) { + addCriterion("sink_count <", value, "sinkCount"); + return (Criteria) this; + } + + public Criteria andSinkCountLessThanOrEqualTo(Long value) { + addCriterion("sink_count <=", value, "sinkCount"); + return (Criteria) this; + } + + public Criteria andSinkCountIn(List values) { + addCriterion("sink_count in", values, "sinkCount"); + return (Criteria) this; + } + + public Criteria andSinkCountNotIn(List values) { + addCriterion("sink_count not in", values, "sinkCount"); + return (Criteria) this; + } + + public Criteria andSinkCountBetween(Long value1, Long value2) { + addCriterion("sink_count between", value1, value2, "sinkCount"); + return (Criteria) this; + } + + public Criteria andSinkCountNotBetween(Long value1, Long value2) { + addCriterion("sink_count not between", value1, value2, "sinkCount"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/pojo/Materialization.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/pojo/Materialization.java new file mode 100644 index 000000000..51ace0bf0 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/pojo/Materialization.java @@ -0,0 +1,28 @@ +package com.tencent.supersonic.semantic.materialization.domain.pojo; + + +import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.MaterializedTypeEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.UpdateCycleEnum; +import lombok.Data; + +import java.util.List; + +@Data +public class Materialization extends RecordInfo { + + private Long id; + private String name; + private MaterializedTypeEnum materializedType; + private UpdateCycleEnum updateCycle; + private Long modelId; + private Long databaseId; + private Integer level; + private String destinationTable; + private String dateInfo; + private String entities; + private List principals; + private String description; + private StatusEnum status = StatusEnum.ONLINE; +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/pojo/MaterializationElement.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/pojo/MaterializationElement.java new file mode 100644 index 000000000..51112c7d6 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/pojo/MaterializationElement.java @@ -0,0 +1,23 @@ +package com.tencent.supersonic.semantic.materialization.domain.pojo; + + +import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementFrequencyEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementTypeEnum; +import lombok.Data; + +@Data +public class MaterializationElement extends RecordInfo { + private Long id; + private TypeEnums type; + private Long materializationId; + private String depends; + private ElementTypeEnum elementType; + private String defaultValue; + private String outlier; + private ElementFrequencyEnum frequency; + private String description; + private StatusEnum status; +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/pojo/MaterializationRecord.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/pojo/MaterializationRecord.java new file mode 100644 index 000000000..333f4fe7e --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/pojo/MaterializationRecord.java @@ -0,0 +1,23 @@ +package com.tencent.supersonic.semantic.materialization.domain.pojo; + +import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import lombok.Data; + +@Data +public class MaterializationRecord extends RecordInfo { + + private Long id; + private Long materializationId; + private TypeEnums elementType; + private Long elementId; + private String elementName; + private String dataTime; + private TaskStatusEnum taskStatus; + private String taskId; + private Long retryCount; + private Long sourceCount; + private Long sinkCount; + private String message; +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/repository/MaterializationElementRepository.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/repository/MaterializationElementRepository.java new file mode 100644 index 000000000..7ea85d579 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/repository/MaterializationElementRepository.java @@ -0,0 +1,17 @@ +package com.tencent.supersonic.semantic.materialization.domain.repository; + +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationConfFilter; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationElementResp; +import com.tencent.supersonic.semantic.materialization.domain.pojo.MaterializationElement; + +import java.util.List; + +public interface MaterializationElementRepository { + Boolean insert(MaterializationElement materializationElement); + + Boolean update(MaterializationElement materializationElement); + + List getMaterializationElementResp(MaterializationConfFilter filter); + + Boolean cleanMaterializationElement(Long materializationId); +} diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/repository/MaterializationRecordRepository.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/repository/MaterializationRecordRepository.java new file mode 100644 index 000000000..f568bc806 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/repository/MaterializationRecordRepository.java @@ -0,0 +1,18 @@ +package com.tencent.supersonic.semantic.materialization.domain.repository; + +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationRecordFilter; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationRecordResp; +import com.tencent.supersonic.semantic.materialization.domain.pojo.MaterializationRecord; + +import java.util.List; + +public interface MaterializationRecordRepository { + + Boolean insertMaterializationRecord(MaterializationRecord materializationRecord); + + Boolean updateMaterializationRecord(MaterializationRecord materializationRecord); + + List getMaterializationRecordList(MaterializationRecordFilter filter); + + long getCount(MaterializationRecordFilter filter); +} diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/repository/MaterializationRepository.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/repository/MaterializationRepository.java new file mode 100644 index 000000000..2987dc9c2 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/repository/MaterializationRepository.java @@ -0,0 +1,17 @@ +package com.tencent.supersonic.semantic.materialization.domain.repository; + +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationFilter; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationResp; +import com.tencent.supersonic.semantic.materialization.domain.pojo.Materialization; + +import java.util.List; + +public interface MaterializationRepository { + Boolean insert(Materialization materialization); + + Boolean update(Materialization materialization); + + List getMaterializationResp(MaterializationFilter filter); + + MaterializationResp getMaterialization(Long id); +} diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationConverter.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationConverter.java new file mode 100644 index 000000000..b5c5f96d8 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationConverter.java @@ -0,0 +1,146 @@ +package com.tencent.supersonic.semantic.materialization.domain.utils; + +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import com.tencent.supersonic.common.util.BeanMapper; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementFrequencyEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementTypeEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.MaterializedTypeEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.UpdateCycleEnum; +import com.tencent.supersonic.semantic.api.materialization.request.MaterializationElementReq; +import com.tencent.supersonic.semantic.api.materialization.request.MaterializationReq; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationElementResp; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationResp; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationDOWithBLOBs; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationElementDOWithBLOBs; +import com.tencent.supersonic.semantic.materialization.domain.pojo.Materialization; +import com.tencent.supersonic.semantic.materialization.domain.pojo.MaterializationElement; +import org.apache.logging.log4j.util.Strings; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Objects; + +@Component +public class MaterializationConverter { + + public static Materialization materializationReq2Bean(MaterializationReq materializationReq) { + Materialization materialization = new Materialization(); + BeanUtils.copyProperties(materializationReq, materialization); + return materialization; + } + + public static MaterializationDOWithBLOBs materialization2DO(Materialization materialization) { + MaterializationDOWithBLOBs materializationDOWithBLOBs = new MaterializationDOWithBLOBs(); + BeanUtils.copyProperties(materialization, materializationDOWithBLOBs); + if (Objects.nonNull(materialization.getMaterializedType())) { + materializationDOWithBLOBs.setMaterializedType(materialization.getMaterializedType().name()); + } + if (Objects.nonNull(materialization.getUpdateCycle())) { + materializationDOWithBLOBs.setUpdateCycle(materialization.getUpdateCycle().name()); + } + if (Objects.nonNull(materialization.getStatus())) { + materializationDOWithBLOBs.setStatus(materialization.getStatus().getCode()); + } + if (!CollectionUtils.isEmpty(materialization.getPrincipals())) { + materializationDOWithBLOBs.setPrincipals(JsonUtil.toString(materialization.getPrincipals())); + } + return materializationDOWithBLOBs; + } + + public static MaterializationElementDOWithBLOBs materialization2DO(MaterializationElement materializationElement) { + MaterializationElementDOWithBLOBs materializationElementDO = new MaterializationElementDOWithBLOBs(); + BeanUtils.copyProperties(materializationElement, materializationElementDO); + if (Objects.nonNull(materializationElement.getElementType())) { + materializationElementDO.setElementType(materializationElement.getElementType().name()); + } + if (Objects.nonNull(materializationElement.getType())) { + materializationElementDO.setType(materializationElement.getType().getName()); + } + if (Objects.nonNull(materializationElement.getStatus())) { + materializationElementDO.setStatus(materializationElement.getStatus().getCode()); + } + if (Objects.nonNull(materializationElement.getFrequency())) { + materializationElementDO.setFrequency(materializationElement.getFrequency().name()); + } + + return materializationElementDO; + } + + public static MaterializationDOWithBLOBs convert(MaterializationDOWithBLOBs materializationDO, + Materialization materialization) { + BeanMapper.mapper(materialization, materializationDO); + if (Objects.nonNull(materialization.getMaterializedType())) { + materializationDO.setMaterializedType(materialization.getMaterializedType().name()); + } + if (Objects.nonNull(materialization.getUpdateCycle())) { + materializationDO.setUpdateCycle(materialization.getUpdateCycle().name()); + } + if (Objects.nonNull(materialization.getStatus())) { + materializationDO.setStatus(materialization.getStatus().getCode()); + } + if (!CollectionUtils.isEmpty(materialization.getPrincipals())) { + materializationDO.setPrincipals(JsonUtil.toString(materialization.getPrincipals())); + } + return materializationDO; + } + + public static MaterializationElementDOWithBLOBs convert(MaterializationElementDOWithBLOBs materializationElementDO, + MaterializationElement materializationElement) { + BeanMapper.mapper(materializationElement, materializationElementDO); + if (Objects.nonNull(materializationElement.getType())) { + materializationElementDO.setType(materializationElement.getType().name()); + } + if (Objects.nonNull(materializationElement.getElementType())) { + materializationElementDO.setElementType(materializationElement.getElementType().name()); + } + if (Objects.nonNull(materializationElement.getFrequency())) { + materializationElementDO.setFrequency(materializationElement.getFrequency().name()); + } + if (Objects.nonNull(materializationElement.getStatus())) { + materializationElementDO.setStatus(materializationElement.getStatus().getCode()); + } + + return materializationElementDO; + } + + public static MaterializationElement materializationElementReq2Bean(MaterializationElementReq elementReq) { + MaterializationElement materializationElement = new MaterializationElement(); + BeanUtils.copyProperties(elementReq, materializationElement); + return materializationElement; + } + + public static MaterializationResp convert2Resp(MaterializationDOWithBLOBs materializationDO) { + MaterializationResp materializationResp = new MaterializationResp(); + BeanUtils.copyProperties(materializationDO, materializationResp); + if (Strings.isNotEmpty(materializationDO.getMaterializedType())) { + materializationResp.setMaterializedType(Enum.valueOf(MaterializedTypeEnum.class, + materializationDO.getMaterializedType())); + } + if (Strings.isNotEmpty(materializationDO.getUpdateCycle())) { + materializationResp.setUpdateCycle(Enum.valueOf(UpdateCycleEnum.class, materializationDO.getUpdateCycle())); + } + if (Strings.isNotEmpty(materializationDO.getPrincipals())) { + materializationResp.setPrincipals(JsonUtil.toList(materializationDO.getPrincipals(), String.class)); + } + return materializationResp; + } + + public static MaterializationElementResp elementDO2Resp(MaterializationElementDOWithBLOBs elementDO) { + MaterializationElementResp materializationElementResp = new MaterializationElementResp(); + BeanUtils.copyProperties(elementDO, materializationElementResp); + if (Strings.isNotEmpty(elementDO.getType())) { + materializationElementResp.setType(TypeEnums.of(elementDO.getType())); + } + if (Strings.isNotEmpty(elementDO.getElementType())) { + materializationElementResp.setElementType(Enum.valueOf(ElementTypeEnum.class, + elementDO.getElementType())); + } + if (Strings.isNotEmpty(elementDO.getFrequency())) { + materializationElementResp.setFrequency(Enum.valueOf(ElementFrequencyEnum.class, + elementDO.getFrequency())); + } + return materializationElementResp; + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationPartitionHelper.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationPartitionHelper.java new file mode 100644 index 000000000..54b54aaec --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationPartitionHelper.java @@ -0,0 +1,78 @@ +package com.tencent.supersonic.semantic.materialization.domain.utils; + + +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementFrequencyEnum; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationElementResp; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationResp; +import org.apache.logging.log4j.util.Strings; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.StringJoiner; + +public class MaterializationPartitionHelper implements MaterializationUtils { + private String split = "_"; + private String createPatter = "CREATE TABLE `#{tableName}` (\n" + + " `dayno` date NOT NULL COMMENT '日期',\n" + + " `id` int(11) NOT NULL COMMENT 'id',\n" + + " #{columnInfo}\n" + + " ) ENGINE=OLAP\n" + + "UNIQUE KEY(`dayno`, `id`)\n" + + "COMMENT 'OLAP'\n" + + "PARTITION BY RANGE(`dayno`)\n" + + "(PARTITION p20230820 VALUES [('2023-08-20'), ('2023-08-21')),\n" + + "PARTITION p20230821 VALUES [('2023-08-21'), ('2023-08-22')),\n" + + "PARTITION p20230827 VALUES [('2023-08-27'), ('2023-08-28')))\n" + + "DISTRIBUTED BY HASH(`id`) BUCKETS 36\n" + + "PROPERTIES (\n" + + "\"replication_allocation\" = \"tag.location.default: 1\",\n" + + "\"is_being_synced\" = \"false\",\n" + + "\"colocate_with\" = \"#{colocateGroup}\",\n" + + "\"storage_format\" = \"V2\",\n" + + "\"enable_unique_key_merge_on_write\" = \"true\",\n" + + "\"light_schema_change\" = \"true\",\n" + + "\"disable_auto_compaction\" = \"false\",\n" + + "\"enable_single_replica_compaction\" = \"false\"\n" + + ")"; + + @Override + public String generateCreateSql(MaterializationResp materializationResp) { + List materializationElementRespList = materializationResp + .getMaterializationElementRespList(); + if (CollectionUtils.isEmpty(materializationElementRespList)) { + return ""; + } + StringJoiner joiner = new StringJoiner(","); + materializationElementRespList.stream() + .filter(element -> !ElementFrequencyEnum.LOW.equals(element.getFrequency())) + .forEach(element -> { + String type = "double"; + if (TypeEnums.DIMENSION.equals(element.getType())) { + type = "varchar(10000)"; + } + String description = element.getDescription().replace("'", "").replace("\"", ""); + joiner.add( + String.format(" %s %s COMMENT '%s'", element.getBizName(), type, description)); + } + ); + + if (Strings.isEmpty(joiner.toString())) { + return ""; + } + + String colocateGroup = generateColocateGroup(materializationResp); + + return createPatter.replace("#{tableName}", materializationResp.getDestinationTable()) + .replace("#{columnInfo}", joiner.toString()) + .replace("#{colocateGroup}", colocateGroup); + } + + private String generateColocateGroup(MaterializationResp materializationResp) { + String name = materializationResp.getName(); + if (Strings.isNotEmpty(name) && name.contains(split)) { + return name.split(split)[0]; + } + return ""; + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationRecordConverter.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationRecordConverter.java new file mode 100644 index 000000000..79891ebb0 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationRecordConverter.java @@ -0,0 +1,57 @@ +package com.tencent.supersonic.semantic.materialization.domain.utils; + +import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import com.tencent.supersonic.common.util.BeanMapper; +import com.tencent.supersonic.semantic.api.materialization.request.MaterializationRecordReq; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationRecordResp; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationRecordDO; +import com.tencent.supersonic.semantic.materialization.domain.pojo.MaterializationRecord; +import org.apache.logging.log4j.util.Strings; +import org.springframework.beans.BeanUtils; + +import java.util.Objects; + +public class MaterializationRecordConverter { + public static MaterializationRecord req2Bean(MaterializationRecordReq materializationRecordReq) { + MaterializationRecord materializationRecord = new MaterializationRecord(); + BeanUtils.copyProperties(materializationRecordReq, materializationRecord); + return materializationRecord; + } + + public static MaterializationRecordDO materializationRecord2DO(MaterializationRecord materializationRecord) { + MaterializationRecordDO materializationRecordDO = new MaterializationRecordDO(); + BeanUtils.copyProperties(materializationRecord, materializationRecordDO); + if (Objects.nonNull(materializationRecord.getElementType())) { + materializationRecordDO.setElementType(materializationRecord.getElementType().name()); + } + if (Objects.nonNull(materializationRecord.getTaskStatus())) { + materializationRecordDO.setState(materializationRecord.getTaskStatus().name()); + } + return materializationRecordDO; + } + + public static MaterializationRecordDO convert(MaterializationRecordDO materializationRecordDO, + MaterializationRecord materializationRecord) { + BeanMapper.mapper(materializationRecord, materializationRecordDO); + if (Objects.nonNull(materializationRecord.getElementType())) { + materializationRecordDO.setElementType(materializationRecord.getElementType().name()); + } + if (Objects.nonNull(materializationRecord.getTaskStatus())) { + materializationRecordDO.setState(materializationRecord.getTaskStatus().name()); + } + return materializationRecordDO; + } + + public static MaterializationRecordResp materializationRecordDO2Resp(MaterializationRecordDO recordDO) { + MaterializationRecordResp materializationRecordResp = new MaterializationRecordResp(); + BeanUtils.copyProperties(recordDO, materializationRecordResp); + if (Strings.isNotEmpty(recordDO.getElementType())) { + materializationRecordResp.setElementType(TypeEnums.of(recordDO.getElementType())); + } + if (Strings.isNotEmpty(recordDO.getState())) { + materializationRecordResp.setTaskStatus(TaskStatusEnum.of(recordDO.getState())); + } + return materializationRecordResp; + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationUtils.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationUtils.java new file mode 100644 index 000000000..aca96cf09 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationUtils.java @@ -0,0 +1,8 @@ +package com.tencent.supersonic.semantic.materialization.domain.utils; + +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationResp; + +public interface MaterializationUtils { + + String generateCreateSql(MaterializationResp materializationResp); +} diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationZipperUtils.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationZipperUtils.java new file mode 100644 index 000000000..b27e290ce --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/domain/utils/MaterializationZipperUtils.java @@ -0,0 +1,85 @@ +package com.tencent.supersonic.semantic.materialization.domain.utils; + + +import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementFrequencyEnum; +import com.tencent.supersonic.semantic.api.materialization.enums.ElementTypeEnum; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationElementResp; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationResp; +import org.apache.logging.log4j.util.Strings; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Objects; +import java.util.StringJoiner; + +@Component +public class MaterializationZipperUtils implements MaterializationUtils { + + private String split = "_"; + private String createPatter = "CREATE TABLE IF NOT EXISTS `#{tableName}` (\n" + + " `end_date` date NOT NULL COMMENT '日期',\n" + + " `id` int(11) NOT NULL COMMENT 'id',\n" + + " `start_date` date NULL,\n" + + " #{columnInfo}\n" + + " ) ENGINE=OLAP\n" + + "UNIQUE KEY(`end_date`, `id`)\n" + + "COMMENT 'OLAP'\n" + + "PARTITION BY RANGE(`end_date`)\n" + + "(PARTITION p99991230 VALUES [('9999-12-30'), ('9999-12-31')))\n" + + "DISTRIBUTED BY HASH(`id`) BUCKETS 9\n" + + "PROPERTIES (\n" + + "\"replication_allocation\" = \"tag.location.default: 1\",\n" + + "\"is_being_synced\" = \"false\",\n" + + "\"colocate_with\" = \"#{colocateGroup}\",\n" + + "\"storage_format\" = \"V2\",\n" + + "\"enable_unique_key_merge_on_write\" = \"true\",\n" + + "\"light_schema_change\" = \"true\",\n" + + "\"disable_auto_compaction\" = \"false\",\n" + + "\"enable_single_replica_compaction\" = \"false\"\n" + + ");"; + + @Override + public String generateCreateSql(MaterializationResp materializationResp) { + List materializationElementRespList = materializationResp + .getMaterializationElementRespList(); + if (CollectionUtils.isEmpty(materializationElementRespList)) { + return ""; + } + StringJoiner joiner = new StringJoiner(","); + materializationElementRespList.stream() + .filter(element -> TypeEnums.DIMENSION.equals(element.getType()) && ElementFrequencyEnum.LOW.equals( + element.getFrequency())) + .forEach(element -> { + String type = "varchar(10000)"; + if (Objects.nonNull(element.getElementType()) && ElementTypeEnum.DATE.equals( + element.getElementType())) { + type = "date"; + } + String description = element.getDescription().replace("'", "").replace("\"", ""); + joiner.add( + String.format(" %s %s COMMENT '%s'", + element.getBizName(), type, description)); + } + ); + + if (Strings.isEmpty(joiner.toString())) { + return ""; + } + + String colocateGroup = generateColocateGroup(materializationResp); + + return createPatter.replace("#{tableName}", materializationResp.getDestinationTable()) + .replace("#{columnInfo}", joiner.toString()) + .replace("#{colocateGroup}", colocateGroup); + } + + private String generateColocateGroup(MaterializationResp materializationResp) { + String name = materializationResp.getName(); + if (Strings.isNotEmpty(name) && name.contains(split)) { + return name.split(split)[0]; + } + return ""; + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationDOCustomMapper.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationDOCustomMapper.java new file mode 100644 index 000000000..7c05aa877 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationDOCustomMapper.java @@ -0,0 +1,13 @@ +package com.tencent.supersonic.semantic.materialization.infrastructure.mapper; + +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationFilter; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationDOWithBLOBs; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface MaterializationDOCustomMapper { + + List getMaterializationResp(MaterializationFilter filter); +} diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationDOMapper.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationDOMapper.java new file mode 100644 index 000000000..779ca2225 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationDOMapper.java @@ -0,0 +1,31 @@ +package com.tencent.supersonic.semantic.materialization.infrastructure.mapper; + +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationDO; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationDOExample; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationDOWithBLOBs; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface MaterializationDOMapper { + long countByExample(MaterializationDOExample example); + + int deleteByPrimaryKey(Long id); + + int insert(MaterializationDOWithBLOBs record); + + int insertSelective(MaterializationDOWithBLOBs record); + + List selectByExampleWithBLOBs(MaterializationDOExample example); + + List selectByExample(MaterializationDOExample example); + + MaterializationDOWithBLOBs selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(MaterializationDOWithBLOBs record); + + int updateByPrimaryKeyWithBLOBs(MaterializationDOWithBLOBs record); + + int updateByPrimaryKey(MaterializationDO record); +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationElementDOMapper.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationElementDOMapper.java new file mode 100644 index 000000000..ff2f1f507 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationElementDOMapper.java @@ -0,0 +1,35 @@ +package com.tencent.supersonic.semantic.materialization.infrastructure.mapper; + +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationElementDO; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationElementDOExample; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationElementDOKey; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationElementDOWithBLOBs; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + + +@Mapper +public interface MaterializationElementDOMapper { + long countByExample(MaterializationElementDOExample example); + + int deleteByPrimaryKey(MaterializationElementDOKey key); + + int insert(MaterializationElementDOWithBLOBs record); + + int insertSelective(MaterializationElementDOWithBLOBs record); + + List selectByExampleWithBLOBs(MaterializationElementDOExample example); + + List selectByExample(MaterializationElementDOExample example); + + MaterializationElementDOWithBLOBs selectByPrimaryKey(MaterializationElementDOKey key); + + int updateByPrimaryKeySelective(MaterializationElementDOWithBLOBs record); + + int updateByPrimaryKeyWithBLOBs(MaterializationElementDOWithBLOBs record); + + int updateByPrimaryKey(MaterializationElementDO record); + + Boolean cleanMaterializationElement(Long materializationId); +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationRecordDOMapper.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationRecordDOMapper.java new file mode 100644 index 000000000..6ba124599 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/mapper/MaterializationRecordDOMapper.java @@ -0,0 +1,33 @@ +package com.tencent.supersonic.semantic.materialization.infrastructure.mapper; + +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationRecordDO; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationRecordDOExample; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + + +@Mapper +public interface MaterializationRecordDOMapper { + long countByExample(MaterializationRecordDOExample example); + + int deleteByPrimaryKey(Long id); + + int insert(MaterializationRecordDO record); + + int insertSelective(MaterializationRecordDO record); + + List selectByExampleWithBLOBs(MaterializationRecordDOExample example); + + List selectByExample(MaterializationRecordDOExample example); + + MaterializationRecordDO selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(MaterializationRecordDO record); + + int updateByPrimaryKeyWithBLOBs(MaterializationRecordDO record); + + int updateByBizName(MaterializationRecordDO record); + + int updateByPrimaryKey(MaterializationRecordDO record); +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/repository/MaterializationElementRepositoryImpl.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/repository/MaterializationElementRepositoryImpl.java new file mode 100644 index 000000000..ef08df19b --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/repository/MaterializationElementRepositoryImpl.java @@ -0,0 +1,82 @@ +package com.tencent.supersonic.semantic.materialization.infrastructure.repository; + +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationConfFilter; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationElementResp; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationElementDOExample; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationElementDOKey; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationElementDOWithBLOBs; +import com.tencent.supersonic.semantic.materialization.domain.pojo.MaterializationElement; +import com.tencent.supersonic.semantic.materialization.domain.repository.MaterializationElementRepository; +import com.tencent.supersonic.semantic.materialization.domain.utils.MaterializationConverter; +import com.tencent.supersonic.semantic.materialization.infrastructure.mapper.MaterializationElementDOMapper; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Component +public class MaterializationElementRepositoryImpl implements MaterializationElementRepository { + + private final MaterializationElementDOMapper materializationElementDOMapper; + + public MaterializationElementRepositoryImpl(MaterializationElementDOMapper materializationElementDOMapper) { + this.materializationElementDOMapper = materializationElementDOMapper; + } + + @Override + public Boolean insert(MaterializationElement materializationElement) { + MaterializationElementDOWithBLOBs materializationElementDOWithBLOBs = MaterializationConverter + .materialization2DO(materializationElement); + materializationElementDOMapper.insert(materializationElementDOWithBLOBs); + return true; + } + + @Override + public Boolean update(MaterializationElement materializationElement) { + MaterializationElementDOKey key = new MaterializationElementDOKey(); + key.setId(materializationElement.getId()); + if (Objects.nonNull(materializationElement.getType())) { + key.setType(materializationElement.getType().getName()); + } + if (Objects.nonNull(materializationElement.getMaterializationId())) { + key.setMaterializationId(materializationElement.getMaterializationId()); + } + MaterializationElementDOWithBLOBs materializationElementDO = materializationElementDOMapper + .selectByPrimaryKey(key); + MaterializationConverter.convert(materializationElementDO, materializationElement); + materializationElementDOMapper.updateByPrimaryKeyWithBLOBs(MaterializationConverter + .convert(materializationElementDO, materializationElement)); + return true; + } + + @Override + public List getMaterializationElementResp(MaterializationConfFilter filter) { + List materializationElementRespList = new ArrayList<>(); + MaterializationElementDOExample example = new MaterializationElementDOExample(); + MaterializationElementDOExample.Criteria criteria = example.createCriteria(); + if (Objects.nonNull(filter.getType())) { + criteria.andTypeEqualTo(filter.getType().getName()); + } + if (Objects.nonNull(filter.getMaterializationId())) { + criteria.andMaterializationIdEqualTo(filter.getMaterializationId()); + } + if (Objects.nonNull(filter.getElementId())) { + criteria.andIdEqualTo(filter.getElementId()); + } + List materializationElementDOs = materializationElementDOMapper + .selectByExampleWithBLOBs(example); + if (!CollectionUtils.isEmpty(materializationElementDOs)) { + materializationElementDOs.stream().forEach(materializationElementDO -> { + materializationElementRespList.add(MaterializationConverter.elementDO2Resp(materializationElementDO)); + }); + } + return materializationElementRespList; + } + + @Override + public Boolean cleanMaterializationElement(Long materializationId) { + return materializationElementDOMapper.cleanMaterializationElement(materializationId); + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/repository/MaterializationRecordRepositoryImpl.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/repository/MaterializationRecordRepositoryImpl.java new file mode 100644 index 000000000..8226544ec --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/repository/MaterializationRecordRepositoryImpl.java @@ -0,0 +1,113 @@ +package com.tencent.supersonic.semantic.materialization.infrastructure.repository; + + +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationRecordFilter; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationRecordResp; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationRecordDO; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationRecordDOExample; +import com.tencent.supersonic.semantic.materialization.domain.pojo.MaterializationRecord; +import com.tencent.supersonic.semantic.materialization.domain.repository.MaterializationRecordRepository; +import com.tencent.supersonic.semantic.materialization.domain.utils.MaterializationRecordConverter; +import com.tencent.supersonic.semantic.materialization.infrastructure.mapper.MaterializationRecordDOMapper; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +@Component +public class MaterializationRecordRepositoryImpl implements MaterializationRecordRepository { + + private final MaterializationRecordDOMapper mapper; + + public MaterializationRecordRepositoryImpl(MaterializationRecordDOMapper mapper) { + this.mapper = mapper; + } + + @Override + public Boolean insertMaterializationRecord(MaterializationRecord materializationRecord) { + MaterializationRecordDO materializationRecordDO = MaterializationRecordConverter + .materializationRecord2DO(materializationRecord); + mapper.insert(materializationRecordDO); + return true; + } + + @Override + public Boolean updateMaterializationRecord(MaterializationRecord materializationRecord) { + MaterializationRecordDO materializationRecordDO = mapper.selectByPrimaryKey(materializationRecord.getId()); + if (Objects.nonNull(materializationRecordDO)) { + MaterializationRecordConverter.convert(materializationRecordDO, materializationRecord); + } else { + materializationRecordDO = MaterializationRecordConverter.materializationRecord2DO(materializationRecord); + } + + if (Objects.isNull(materializationRecord.getId())) { + mapper.updateByBizName(materializationRecordDO); + } else { + mapper.updateByPrimaryKey(materializationRecordDO); + } + return true; + } + + @Override + public List getMaterializationRecordList(MaterializationRecordFilter filter) { + List materializationRecordRespList = new ArrayList<>(); + MaterializationRecordDOExample example = getExample(filter); + + List materializationRecordDOS = mapper.selectByExampleWithBLOBs(example); + if (!CollectionUtils.isEmpty(materializationRecordDOS)) { + materializationRecordDOS.stream().forEach(recordDO -> materializationRecordRespList.add( + MaterializationRecordConverter.materializationRecordDO2Resp(recordDO))); + } + return materializationRecordRespList; + } + + @Override + public long getCount(MaterializationRecordFilter filter) { + MaterializationRecordDOExample example = getExample(filter); + return mapper.countByExample(example); + } + + private MaterializationRecordDOExample getExample(MaterializationRecordFilter filter) { + MaterializationRecordDOExample example = new MaterializationRecordDOExample(); + MaterializationRecordDOExample.Criteria criteria = example.createCriteria(); + if (Objects.nonNull(filter.getId())) { + criteria.andIdEqualTo(filter.getId()); + } + if (Objects.nonNull(filter.getMaterializationId())) { + criteria.andMaterializationIdEqualTo(filter.getMaterializationId()); + } + if (!CollectionUtils.isEmpty(filter.getMaterializationIds())) { + criteria.andMaterializationIdIn(filter.getMaterializationIds()); + } + if (Objects.nonNull(filter.getElementType())) { + criteria.andElementTypeEqualTo(filter.getElementType().getName()); + } + if (Objects.nonNull(filter.getElementId())) { + criteria.andElementIdEqualTo(filter.getElementId()); + } + if (Objects.nonNull(filter.getElementName())) { + criteria.andElementNameEqualTo(filter.getElementName()); + } + if (Objects.nonNull(filter.getTaskStatus())) { + criteria.andStateIn(filter.getTaskStatus().stream().map(s -> s.getStatus()).collect(Collectors.toList())); + } + if (Objects.nonNull(filter.getTaskId())) { + criteria.andTaskIdEqualTo(filter.getTaskId()); + } + if (Objects.nonNull(filter.getCreatedBy())) { + criteria.andCreatedByEqualTo(filter.getCreatedBy()); + } + if (Objects.nonNull(filter.getCreatedAt())) { + criteria.andCreatedAtGreaterThanOrEqualTo(filter.getCreatedAt()); + } + if (Objects.nonNull(filter.getStartDataTime())) { + criteria.andDataTimeGreaterThanOrEqualTo(filter.getStartDataTime()); + } + if (Objects.nonNull(filter.getEndDataTime())) { + criteria.andDataTimeLessThanOrEqualTo(filter.getEndDataTime()); + } + return example; + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/repository/MaterializationRepositoryImpl.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/repository/MaterializationRepositoryImpl.java new file mode 100644 index 000000000..6f63ef64f --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/infrastructure/repository/MaterializationRepositoryImpl.java @@ -0,0 +1,63 @@ +package com.tencent.supersonic.semantic.materialization.infrastructure.repository; + +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationFilter; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationResp; +import com.tencent.supersonic.semantic.materialization.domain.dataobject.MaterializationDOWithBLOBs; +import com.tencent.supersonic.semantic.materialization.domain.pojo.Materialization; +import com.tencent.supersonic.semantic.materialization.domain.repository.MaterializationRepository; +import com.tencent.supersonic.semantic.materialization.domain.utils.MaterializationConverter; +import com.tencent.supersonic.semantic.materialization.infrastructure.mapper.MaterializationDOCustomMapper; +import com.tencent.supersonic.semantic.materialization.infrastructure.mapper.MaterializationDOMapper; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class MaterializationRepositoryImpl implements MaterializationRepository { + + private final MaterializationDOMapper materializationDOMapper; + private final MaterializationDOCustomMapper materializationDOCustomMapper; + + public MaterializationRepositoryImpl(MaterializationDOMapper materializationDOMapper, + MaterializationDOCustomMapper materializationDOCustomMapper) { + this.materializationDOMapper = materializationDOMapper; + this.materializationDOCustomMapper = materializationDOCustomMapper; + } + + @Override + public Boolean insert(Materialization materialization) { + MaterializationDOWithBLOBs materializationDOWithBLOBs = MaterializationConverter + .materialization2DO(materialization); + materializationDOMapper.insert(materializationDOWithBLOBs); + return true; + } + + @Override + public Boolean update(Materialization materialization) { + MaterializationDOWithBLOBs materializationDOWithBLOBs = materializationDOMapper + .selectByPrimaryKey(materialization.getId()); + materializationDOMapper.updateByPrimaryKeyWithBLOBs(MaterializationConverter + .convert(materializationDOWithBLOBs, materialization)); + return true; + } + + @Override + public List getMaterializationResp(MaterializationFilter filter) { + List materializationRespList = new ArrayList<>(); + List materializationDOWithBLOBsList = materializationDOCustomMapper + .getMaterializationResp(filter); + if (!CollectionUtils.isEmpty(materializationDOWithBLOBsList)) { + materializationDOWithBLOBsList.stream().forEach(materializationDO -> { + materializationRespList.add(MaterializationConverter.convert2Resp(materializationDO)); + }); + } + return materializationRespList; + } + + @Override + public MaterializationResp getMaterialization(Long id) { + return MaterializationConverter.convert2Resp(materializationDOMapper.selectByPrimaryKey(id)); + } +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/rest/MaterializationConfController.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/rest/MaterializationConfController.java new file mode 100644 index 000000000..6478214ad --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/rest/MaterializationConfController.java @@ -0,0 +1,111 @@ +package com.tencent.supersonic.semantic.materialization.rest; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationConfFilter; +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationFilter; +import com.tencent.supersonic.semantic.api.materialization.request.MaterializationElementReq; +import com.tencent.supersonic.semantic.api.materialization.request.MaterializationReq; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationResp; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationSourceResp; +import com.tencent.supersonic.semantic.materialization.domain.MaterializationConfService; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/semantic/materialization/conf") +public class MaterializationConfController { + + private final MaterializationConfService confService; + + public MaterializationConfController(MaterializationConfService confService) { + this.confService = confService; + } + + @PostMapping + public Boolean addMaterializationConf(@RequestBody MaterializationReq materializationReq, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + return confService.addMaterializationConf(materializationReq, user); + } + + @PutMapping + public Boolean updateMaterializationConf(@RequestBody MaterializationReq materializationReq, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + return confService.updateMaterializationConf(materializationReq, user); + } + + @PostMapping("/info") + List getMaterializationResp(@RequestBody MaterializationFilter filter, + HttpServletRequest request, + HttpServletResponse response) { + + User user = UserHolder.findUser(request, response); + return confService.getMaterializationResp(filter, user); + } + + + @PostMapping("/element") + public Boolean addMaterializationElementConf(@RequestBody MaterializationElementReq materializationElementReq, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + return confService.addMaterializationElementConf(materializationElementReq, user); + } + + @PutMapping("/element") + public Boolean updateMaterializationElementConf(@RequestBody MaterializationElementReq materializationElementReq, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + return confService.updateMaterializationElementConf(materializationElementReq, user); + } + + @PutMapping("/element/init") + public Boolean initMaterializationElementConf(@RequestBody MaterializationConfFilter filter, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + return confService.initMaterializationElementConf(filter, user); + } + + @PostMapping("/element/info") + List queryMaterializationConf(@RequestBody MaterializationConfFilter filter, + HttpServletRequest request, + HttpServletResponse response) { + + User user = UserHolder.findUser(request, response); + return confService.queryMaterializationConf(filter, user); + } + + @GetMapping("/table/sql") + String generateCreateSql(@RequestParam(value = "materializationId") Long materializationId, + HttpServletRequest request, + HttpServletResponse response) { + + User user = UserHolder.findUser(request, response); + return confService.generateCreateSql(materializationId, user); + } + + @PostMapping("/source") + List queryElementModel(@RequestBody MaterializationFilter filter, + HttpServletRequest request, + HttpServletResponse response) { + + //User user = UserHolder.findUser(request, response); + return confService.getMaterializationSourceResp(filter.getMaterializationId()); + } + + +} \ No newline at end of file diff --git a/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/rest/MaterializationRecordController.java b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/rest/MaterializationRecordController.java new file mode 100644 index 000000000..865de2bb2 --- /dev/null +++ b/semantic/materialization/src/main/java/com/tencent/supersonic/semantic/materialization/rest/MaterializationRecordController.java @@ -0,0 +1,76 @@ +package com.tencent.supersonic.semantic.materialization.rest; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationDateFilter; +import com.tencent.supersonic.semantic.api.materialization.pojo.MaterializationRecordFilter; +import com.tencent.supersonic.semantic.api.materialization.request.MaterializationRecordReq; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationDateResp; +import com.tencent.supersonic.semantic.api.materialization.response.MaterializationRecordResp; +import com.tencent.supersonic.semantic.materialization.domain.MaterializationRecordService; + +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.PutMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +@RestController +@RequestMapping("/api/semantic/materialization/record") +public class MaterializationRecordController { + + private final MaterializationRecordService recordService; + + public MaterializationRecordController(MaterializationRecordService recordService) { + this.recordService = recordService; + } + + @PostMapping + public Boolean addMaterializationRecord(@RequestBody MaterializationRecordReq materializationRecord, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + return recordService.addMaterializationRecord(materializationRecord, user); + } + + @PutMapping + public Boolean updateMaterializationRecord(@RequestBody MaterializationRecordReq materializationRecord, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + return recordService.updateMaterializationRecord(materializationRecord, user); + } + + @PostMapping("/info") + List getMaterializationRecordList(@RequestBody MaterializationRecordFilter filter, + HttpServletRequest request, + HttpServletResponse response) { + + User user = UserHolder.findUser(request, response); + return recordService.getMaterializationRecordList(filter, user); + } + + @PostMapping("/count") + Long getMaterializationRecordCount(@RequestBody MaterializationRecordFilter filter, + HttpServletRequest request, + HttpServletResponse response) { + + User user = UserHolder.findUser(request, response); + return recordService.getMaterializationRecordCount(filter, user); + } + + @PostMapping("/info/date") + List fetchMaterializationDate(@RequestBody MaterializationDateFilter filter, + HttpServletRequest request, + HttpServletResponse response) { + + User user = UserHolder.findUser(request, response); + return recordService.fetchMaterializationDate(filter, user); + } + + +} \ No newline at end of file diff --git a/semantic/materialization/src/main/resources/mapper/MaterializationDOCustomMapper.xml b/semantic/materialization/src/main/resources/mapper/MaterializationDOCustomMapper.xml new file mode 100644 index 000000000..308ce140c --- /dev/null +++ b/semantic/materialization/src/main/resources/mapper/MaterializationDOCustomMapper.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, name, materialized_type, update_cycle, model_id, database_id, level, status, + destination_table, principals, created_at, created_by, updated_at, updated_by + + + date_info, entities, description + + + + \ No newline at end of file diff --git a/semantic/materialization/src/main/resources/mapper/MaterializationDOMapper.xml b/semantic/materialization/src/main/resources/mapper/MaterializationDOMapper.xml new file mode 100644 index 000000000..3a809feaf --- /dev/null +++ b/semantic/materialization/src/main/resources/mapper/MaterializationDOMapper.xml @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, name, materialized_type, update_cycle, model_id, database_id, level, status, + destination_table, principals, created_at, created_by, updated_at, updated_by + + + date_info, entities, description + + + + + + delete from s2_materialization + where id = #{id,jdbcType=BIGINT} + + + insert into s2_materialization (id, name, materialized_type, + update_cycle, model_id, database_id, + level, status, destination_table, + principals, created_at, created_by, + updated_at, updated_by, date_info, + entities, description) + values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{materializedType,jdbcType=VARCHAR}, + #{updateCycle,jdbcType=VARCHAR}, #{modelId,jdbcType=BIGINT}, #{databaseId,jdbcType=BIGINT}, + #{level,jdbcType=INTEGER}, #{status,jdbcType=INTEGER}, #{destinationTable,jdbcType=VARCHAR}, + #{principals,jdbcType=VARCHAR}, #{createdAt,jdbcType=TIMESTAMP}, #{createdBy,jdbcType=VARCHAR}, + #{updatedAt,jdbcType=TIMESTAMP}, #{updatedBy,jdbcType=VARCHAR}, #{dateInfo,jdbcType=LONGVARCHAR}, + #{entities,jdbcType=LONGVARCHAR}, #{description,jdbcType=LONGVARCHAR}) + + + + insert into s2_materialization + + + id, + + + name, + + + materialized_type, + + + update_cycle, + + + model_id, + + + database_id, + + + level, + + + status, + + + destination_table, + + + principals, + + + created_at, + + + created_by, + + + updated_at, + + + updated_by, + + + date_info, + + + entities, + + + description, + + + + + #{id,jdbcType=BIGINT}, + + + #{name,jdbcType=VARCHAR}, + + + #{materializedType,jdbcType=VARCHAR}, + + + #{updateCycle,jdbcType=VARCHAR}, + + + #{modelId,jdbcType=BIGINT}, + + + #{databaseId,jdbcType=BIGINT}, + + + #{level,jdbcType=INTEGER}, + + + #{status,jdbcType=INTEGER}, + + + #{destinationTable,jdbcType=VARCHAR}, + + + #{principals,jdbcType=VARCHAR}, + + + #{createdAt,jdbcType=TIMESTAMP}, + + + #{createdBy,jdbcType=VARCHAR}, + + + #{updatedAt,jdbcType=TIMESTAMP}, + + + #{updatedBy,jdbcType=VARCHAR}, + + + #{dateInfo,jdbcType=LONGVARCHAR}, + + + #{entities,jdbcType=LONGVARCHAR}, + + + #{description,jdbcType=LONGVARCHAR}, + + + + + + update s2_materialization + + + name = #{name,jdbcType=VARCHAR}, + + + materialized_type = #{materializedType,jdbcType=VARCHAR}, + + + update_cycle = #{updateCycle,jdbcType=VARCHAR}, + + + model_id = #{modelId,jdbcType=BIGINT}, + + + database_id = #{databaseId,jdbcType=BIGINT}, + + + level = #{level,jdbcType=INTEGER}, + + + status = #{status,jdbcType=INTEGER}, + + + destination_table = #{destinationTable,jdbcType=VARCHAR}, + + + principals = #{principals,jdbcType=VARCHAR}, + + + created_at = #{createdAt,jdbcType=TIMESTAMP}, + + + created_by = #{createdBy,jdbcType=VARCHAR}, + + + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + + + updated_by = #{updatedBy,jdbcType=VARCHAR}, + + + date_info = #{dateInfo,jdbcType=LONGVARCHAR}, + + + entities = #{entities,jdbcType=LONGVARCHAR}, + + + description = #{description,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update s2_materialization + set name = #{name,jdbcType=VARCHAR}, + materialized_type = #{materializedType,jdbcType=VARCHAR}, + update_cycle = #{updateCycle,jdbcType=VARCHAR}, + model_id = #{modelId,jdbcType=BIGINT}, + database_id = #{databaseId,jdbcType=BIGINT}, + level = #{level,jdbcType=INTEGER}, + status = #{status,jdbcType=INTEGER}, + destination_table = #{destinationTable,jdbcType=VARCHAR}, + principals = #{principals,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + date_info = #{dateInfo,jdbcType=LONGVARCHAR}, + entities = #{entities,jdbcType=LONGVARCHAR}, + description = #{description,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=BIGINT} + + + update s2_materialization + set name = #{name,jdbcType=VARCHAR}, + materialized_type = #{materializedType,jdbcType=VARCHAR}, + update_cycle = #{updateCycle,jdbcType=VARCHAR}, + model_id = #{modelId,jdbcType=BIGINT}, + database_id = #{databaseId,jdbcType=BIGINT}, + level = #{level,jdbcType=INTEGER}, + status = #{status,jdbcType=INTEGER}, + destination_table = #{destinationTable,jdbcType=VARCHAR}, + principals = #{principals,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/semantic/materialization/src/main/resources/mapper/MaterializationElementDOMapper.xml b/semantic/materialization/src/main/resources/mapper/MaterializationElementDOMapper.xml new file mode 100644 index 000000000..68ede5560 --- /dev/null +++ b/semantic/materialization/src/main/resources/mapper/MaterializationElementDOMapper.xml @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, type, materialization_id, element_type, default_value, outlier, frequency, created_at, + created_by, updated_at, updated_by, status + + + depends, description + + + + + + delete from s2_materialization_element + where id = #{id,jdbcType=BIGINT} + and type = #{type,jdbcType=VARCHAR} + and materialization_id = #{materializationId,jdbcType=BIGINT} + + + insert into s2_materialization_element (id, type, materialization_id, + element_type, default_value, outlier, + frequency, created_at, created_by, + updated_at, updated_by, status, + depends, description) + values (#{id,jdbcType=BIGINT}, #{type,jdbcType=VARCHAR}, #{materializationId,jdbcType=BIGINT}, + #{elementType,jdbcType=VARCHAR}, #{defaultValue,jdbcType=VARCHAR}, #{outlier,jdbcType=VARCHAR}, + #{frequency,jdbcType=VARCHAR}, #{createdAt,jdbcType=TIMESTAMP}, #{createdBy,jdbcType=VARCHAR}, + #{updatedAt,jdbcType=TIMESTAMP}, #{updatedBy,jdbcType=VARCHAR}, #{status,jdbcType=INTEGER}, + #{depends,jdbcType=LONGVARCHAR}, #{description,jdbcType=LONGVARCHAR}) + + + insert into s2_materialization_element + + + id, + + + type, + + + materialization_id, + + + element_type, + + + default_value, + + + outlier, + + + frequency, + + + created_at, + + + created_by, + + + updated_at, + + + updated_by, + + + status, + + + depends, + + + description, + + + + + #{id,jdbcType=BIGINT}, + + + #{type,jdbcType=VARCHAR}, + + + #{materializationId,jdbcType=BIGINT}, + + + #{elementType,jdbcType=VARCHAR}, + + + #{defaultValue,jdbcType=VARCHAR}, + + + #{outlier,jdbcType=VARCHAR}, + + + #{frequency,jdbcType=VARCHAR}, + + + #{createdAt,jdbcType=TIMESTAMP}, + + + #{createdBy,jdbcType=VARCHAR}, + + + #{updatedAt,jdbcType=TIMESTAMP}, + + + #{updatedBy,jdbcType=VARCHAR}, + + + #{status,jdbcType=INTEGER}, + + + #{depends,jdbcType=LONGVARCHAR}, + + + #{description,jdbcType=LONGVARCHAR}, + + + + + + update s2_materialization_element + + + element_type = #{elementType,jdbcType=VARCHAR}, + + + default_value = #{defaultValue,jdbcType=VARCHAR}, + + + outlier = #{outlier,jdbcType=VARCHAR}, + + + frequency = #{frequency,jdbcType=VARCHAR}, + + + created_at = #{createdAt,jdbcType=TIMESTAMP}, + + + created_by = #{createdBy,jdbcType=VARCHAR}, + + + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + + + updated_by = #{updatedBy,jdbcType=VARCHAR}, + + + status = #{status,jdbcType=INTEGER}, + + + depends = #{depends,jdbcType=LONGVARCHAR}, + + + description = #{description,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + and type = #{type,jdbcType=VARCHAR} + and materialization_id = #{materializationId,jdbcType=BIGINT} + + + update s2_materialization_element + set element_type = #{elementType,jdbcType=VARCHAR}, + default_value = #{defaultValue,jdbcType=VARCHAR}, + outlier = #{outlier,jdbcType=VARCHAR}, + frequency = #{frequency,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + status = #{status,jdbcType=INTEGER}, + depends = #{depends,jdbcType=LONGVARCHAR}, + description = #{description,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=BIGINT} + and type = #{type,jdbcType=VARCHAR} + and materialization_id = #{materializationId,jdbcType=BIGINT} + + + update s2_materialization_element + set element_type = #{elementType,jdbcType=VARCHAR}, + default_value = #{defaultValue,jdbcType=VARCHAR}, + outlier = #{outlier,jdbcType=VARCHAR}, + frequency = #{frequency,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + status = #{status,jdbcType=INTEGER} + where id = #{id,jdbcType=BIGINT} + and type = #{type,jdbcType=VARCHAR} + and materialization_id = #{materializationId,jdbcType=BIGINT} + + + + delete from s2_materialization_element + where materialization_id = #{materializationId} + + \ No newline at end of file diff --git a/semantic/materialization/src/main/resources/mapper/MaterializationRecordDOMapper.xml b/semantic/materialization/src/main/resources/mapper/MaterializationRecordDOMapper.xml new file mode 100644 index 000000000..c32cfdc68 --- /dev/null +++ b/semantic/materialization/src/main/resources/mapper/MaterializationRecordDOMapper.xml @@ -0,0 +1,336 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, materialization_id, element_type, element_id, element_name, data_time, state, + task_id, created_at, updated_at, created_by, updated_by, retry_count, source_count, + sink_count + + + message + + + + + + delete from s2_materialization_record + where id = #{id,jdbcType=BIGINT} + + + insert into s2_materialization_record (id, materialization_id, element_type, + element_id, element_name, data_time, + state, task_id, created_at, + updated_at, created_by, updated_by, + retry_count, source_count, sink_count, + message) + values (#{id,jdbcType=BIGINT}, #{materializationId,jdbcType=BIGINT}, #{elementType,jdbcType=VARCHAR}, + #{elementId,jdbcType=BIGINT}, #{elementName,jdbcType=VARCHAR}, #{dataTime,jdbcType=VARCHAR}, + #{state,jdbcType=VARCHAR}, #{taskId,jdbcType=VARCHAR}, #{createdAt,jdbcType=TIMESTAMP}, + #{updatedAt,jdbcType=TIMESTAMP}, #{createdBy,jdbcType=VARCHAR}, #{updatedBy,jdbcType=VARCHAR}, + #{retryCount,jdbcType=BIGINT}, #{sourceCount,jdbcType=BIGINT}, #{sinkCount,jdbcType=BIGINT}, + #{message,jdbcType=LONGVARCHAR}) + ON DUPLICATE KEY UPDATE + updated_at = #{updatedAt}, retry_count = retry_count + 1 + + + insert into s2_materialization_record + + + id, + + + materialization_id, + + + element_type, + + + element_id, + + + element_name, + + + data_time, + + + state, + + + task_id, + + + created_at, + + + updated_at, + + + created_by, + + + updated_by, + + + retry_count, + + + source_count, + + + sink_count, + + + message, + + + + + #{id,jdbcType=BIGINT}, + + + #{materializationId,jdbcType=BIGINT}, + + + #{elementType,jdbcType=VARCHAR}, + + + #{elementId,jdbcType=BIGINT}, + + + #{elementName,jdbcType=VARCHAR}, + + + #{dataTime,jdbcType=VARCHAR}, + + + #{state,jdbcType=VARCHAR}, + + + #{taskId,jdbcType=VARCHAR}, + + + #{createdAt,jdbcType=TIMESTAMP}, + + + #{updatedAt,jdbcType=TIMESTAMP}, + + + #{createdBy,jdbcType=VARCHAR}, + + + #{updatedBy,jdbcType=VARCHAR}, + + + #{retryCount,jdbcType=BIGINT}, + + + #{sourceCount,jdbcType=BIGINT}, + + + #{sinkCount,jdbcType=BIGINT}, + + + #{message,jdbcType=LONGVARCHAR}, + + + + + + update s2_materialization_record + + + materialization_id = #{materializationId,jdbcType=BIGINT}, + + + element_type = #{elementType,jdbcType=VARCHAR}, + + + element_id = #{elementId,jdbcType=BIGINT}, + + + element_name = #{elementName,jdbcType=VARCHAR}, + + + data_time = #{dataTime,jdbcType=VARCHAR}, + + + state = #{state,jdbcType=VARCHAR}, + + + task_id = #{taskId,jdbcType=VARCHAR}, + + + created_at = #{createdAt,jdbcType=TIMESTAMP}, + + + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + + + created_by = #{createdBy,jdbcType=VARCHAR}, + + + updated_by = #{updatedBy,jdbcType=VARCHAR}, + + + retry_count = #{retryCount,jdbcType=BIGINT}, + + + source_count = #{sourceCount,jdbcType=BIGINT}, + + + sink_count = #{sinkCount,jdbcType=BIGINT}, + + + message = #{message,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update s2_materialization_record + set materialization_id = #{materializationId,jdbcType=BIGINT}, + element_type = #{elementType,jdbcType=VARCHAR}, + element_id = #{elementId,jdbcType=BIGINT}, + element_name = #{elementName,jdbcType=VARCHAR}, + data_time = #{dataTime,jdbcType=VARCHAR}, + state = #{state,jdbcType=VARCHAR}, + task_id = #{taskId,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + retry_count = #{retryCount,jdbcType=BIGINT}, + source_count = #{sourceCount,jdbcType=BIGINT}, + sink_count = #{sinkCount,jdbcType=BIGINT}, + message = #{message,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=BIGINT} + + + + update s2_materialization_record + set + element_id = #{elementId,jdbcType=BIGINT}, + state = #{state,jdbcType=VARCHAR}, + task_id = #{taskId,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + retry_count = #{retryCount,jdbcType=BIGINT}, + source_count = #{sourceCount,jdbcType=BIGINT}, + sink_count = #{sinkCount,jdbcType=BIGINT}, + message = #{message,jdbcType=LONGVARCHAR} + where + materialization_id = #{materializationId} + AND element_type = #{elementType} + AND element_name = #{elementName} + AND data_time = #{dataTime} + + + + update s2_materialization_record + set materialization_id = #{materializationId,jdbcType=BIGINT}, + element_type = #{elementType,jdbcType=VARCHAR}, + element_id = #{elementId,jdbcType=BIGINT}, + element_name = #{elementName,jdbcType=VARCHAR}, + data_time = #{dataTime,jdbcType=VARCHAR}, + state = #{state,jdbcType=VARCHAR}, + task_id = #{taskId,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + retry_count = #{retryCount,jdbcType=BIGINT}, + source_count = #{sourceCount,jdbcType=BIGINT}, + sink_count = #{sinkCount,jdbcType=BIGINT} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java index 9ef0b75d7..8dbe43511 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java @@ -228,8 +228,9 @@ public class ModelServiceImpl implements ModelService { @Override public Map getModelFullPathMap() { - return getModelList().stream().filter(Objects::nonNull).collect(Collectors.toMap(ModelResp::getId, - ModelResp::getFullPath, (k1, k2) -> k1)); + return getModelList().stream().filter(m -> m != null && m.getFullPath() != null) + .collect(Collectors.toMap(ModelResp::getId, + ModelResp::getFullPath, (k1, k2) -> k1)); } @Override diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceDO.java index 883d24070..3064b6e55 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceDO.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceDO.java @@ -58,6 +58,8 @@ public class DatasourceDO { */ private String datasourceDetail; + private String depends; + /** * @return id @@ -253,5 +255,11 @@ public class DatasourceDO { this.datasourceDetail = datasourceDetail == null ? null : datasourceDetail.trim(); } + public void setDepends(String depends) { + this.depends = depends; + } + public String getDepends() { + return depends; + } } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDO.java index 13f6896f7..870e5e681 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDO.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDO.java @@ -98,6 +98,11 @@ public class DimensionDO { */ private String expr; + /** + * 数据类型 + */ + private String dataType; + /** * 维度ID * @@ -431,4 +436,12 @@ public class DimensionDO { public void setExpr(String expr) { this.expr = expr == null ? null : expr.trim(); } -} + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } +} \ No newline at end of file diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Dimension.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Dimension.java index e7aa2cde7..972ba9bb6 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Dimension.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Dimension.java @@ -1,9 +1,11 @@ package com.tencent.supersonic.semantic.model.domain.pojo; +import com.tencent.supersonic.common.pojo.enums.DataTypeEnums; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; import lombok.Data; + import java.util.List; @Data @@ -26,4 +28,6 @@ public class Dimension extends SchemaItem { private List dimValueMaps; + private DataTypeEnums dataType; + } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DatasourceConverter.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DatasourceConverter.java index 1a0b77bef..cc1602bb0 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DatasourceConverter.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DatasourceConverter.java @@ -3,6 +3,8 @@ package com.tencent.supersonic.semantic.model.domain.utils; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.semantic.api.model.enums.MetricTypeEnum; import com.tencent.supersonic.semantic.api.model.pojo.DatasourceDetail; import com.tencent.supersonic.semantic.api.model.pojo.Dim; @@ -15,13 +17,12 @@ import com.tencent.supersonic.semantic.api.model.request.MetricReq; import com.tencent.supersonic.semantic.api.model.response.DatasourceRelaResp; import com.tencent.supersonic.semantic.api.model.response.DatasourceResp; import com.tencent.supersonic.semantic.api.model.response.MeasureResp; -import com.tencent.supersonic.common.pojo.enums.StatusEnum; -import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.semantic.model.domain.dataobject.DatasourceDO; import com.tencent.supersonic.semantic.model.domain.dataobject.DatasourceRelaDO; import com.tencent.supersonic.semantic.model.domain.pojo.Datasource; import java.util.Date; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; @@ -108,6 +109,7 @@ public class DatasourceConverter { dimensionReq.setModelId(datasource.getModelId()); dimensionReq.setExpr(dim.getBizName()); dimensionReq.setType("categorical"); + dimensionReq.setDescription(Objects.isNull(dim.getDescription()) ? "" : dim.getDescription()); return dimensionReq; } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DimensionConverter.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DimensionConverter.java index 4b07cde55..45275ffb8 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DimensionConverter.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DimensionConverter.java @@ -1,6 +1,7 @@ package com.tencent.supersonic.semantic.model.domain.utils; import com.alibaba.fastjson.JSONObject; +import com.tencent.supersonic.common.pojo.enums.DataTypeEnums; import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; import com.tencent.supersonic.semantic.api.model.yaml.DimensionYamlTpl; @@ -14,6 +15,7 @@ import com.tencent.supersonic.semantic.model.domain.pojo.Dimension; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; @@ -35,6 +37,9 @@ public class DimensionConverter { } else { dimensionDO.setDimValueMaps(JSONObject.toJSONString(new ArrayList<>())); } + if (Objects.nonNull(dimension.getDataType())) { + dimensionDO.setDataType(dimension.getDataType().getType()); + } return dimensionDO; } @@ -43,6 +48,9 @@ public class DimensionConverter { BeanUtils.copyProperties(dimension, dimensionDO); dimensionDO.setDefaultValues(JSONObject.toJSONString(dimension.getDefaultValues())); dimensionDO.setDimValueMaps(JSONObject.toJSONString(dimension.getDimValueMaps())); + if (Objects.nonNull(dimension.getDataType())) { + dimensionDO.setDataType(dimension.getDataType().getType()); + } return dimensionDO; } @@ -65,6 +73,9 @@ public class DimensionConverter { if (Strings.isNotEmpty(dimensionDO.getDimValueMaps())) { dimensionResp.setDimValueMaps(JsonUtil.toList(dimensionDO.getDimValueMaps(), DimValueMap.class)); } + if (Strings.isNotEmpty(dimensionDO.getDataType())) { + dimensionResp.setDataType(DataTypeEnums.of(dimensionDO.getDataType())); + } return dimensionResp; } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/MetricConverter.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/MetricConverter.java index 8f194f6ac..7b51b195f 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/MetricConverter.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/MetricConverter.java @@ -77,7 +77,12 @@ public class MetricConverter { RelateDimension.class)); return metricResp; } - + public static Metric convert2Metric(MetricDO metricDO) { + Metric metric = new Metric(); + BeanUtils.copyProperties(metricDO, metric); + metric.setTypeParams(JSONObject.parseObject(metricDO.getTypeParams(), MetricTypeParams.class)); + return metric; + } public static MetricYamlTpl convert2MetricYamlTpl(Metric metric) { MetricYamlTpl metricYamlTpl = new MetricYamlTpl(); diff --git a/semantic/model/src/main/resources/mapper/DatasourceDOMapper.xml b/semantic/model/src/main/resources/mapper/DatasourceDOMapper.xml index a90461395..35c422518 100644 --- a/semantic/model/src/main/resources/mapper/DatasourceDOMapper.xml +++ b/semantic/model/src/main/resources/mapper/DatasourceDOMapper.xml @@ -12,6 +12,7 @@ + @@ -47,7 +48,7 @@ id, model_id, name, biz_name, description, database_id, created_at, created_by, updated_at, - updated_by + updated_by,depends datasource_detail diff --git a/semantic/model/src/main/resources/mapper/DimensionDOMapper.xml b/semantic/model/src/main/resources/mapper/DimensionDOMapper.xml index 117bb5bc4..6e9d99892 100644 --- a/semantic/model/src/main/resources/mapper/DimensionDOMapper.xml +++ b/semantic/model/src/main/resources/mapper/DimensionDOMapper.xml @@ -19,6 +19,7 @@ + @@ -56,7 +57,7 @@ id, model_id, datasource_id, name, biz_name, description, status, sensitive_level, type, created_at, created_by, updated_at, updated_by, semantic_type, alias, default_values, - dim_value_maps + dim_value_maps, data_type type_params, expr @@ -113,14 +114,14 @@ created_at, created_by, updated_at, updated_by, semantic_type, alias, default_values, dim_value_maps, type_params, - expr) + expr, data_type) values (#{id,jdbcType=BIGINT}, #{modelId,jdbcType=BIGINT}, #{datasourceId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{bizName,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{status,jdbcType=INTEGER}, #{sensitiveLevel,jdbcType=INTEGER}, #{type,jdbcType=VARCHAR}, #{createdAt,jdbcType=TIMESTAMP}, #{createdBy,jdbcType=VARCHAR}, #{updatedAt,jdbcType=TIMESTAMP}, #{updatedBy,jdbcType=VARCHAR}, #{semanticType,jdbcType=VARCHAR}, #{alias,jdbcType=VARCHAR}, - #{defaultValues,jdbcType=VARCHAR}, #{dimValueMaps,jdbcType=VARCHAR}, #{typeParams,jdbcType=LONGVARCHAR}, - #{expr,jdbcType=LONGVARCHAR}) + #{defaultValues,jdbcType=VARCHAR}, #{dimValueMaps,jdbcType=VARCHAR}, #{typeParams,jdbcType=LONGVARCHAR}, + #{expr,jdbcType=LONGVARCHAR}, #{dataType,jdbcType=VARCHAR}) insert into s2_dimension @@ -182,6 +183,9 @@ expr, + + data_type, + @@ -241,6 +245,9 @@ #{expr,jdbcType=LONGVARCHAR}, + + #{dataType,jdbcType=VARCHAR}, +