first commit

This commit is contained in:
jerryjzhang
2023-06-12 18:44:01 +08:00
commit dc4fc69b57
879 changed files with 573090 additions and 0 deletions

74
semantic/api/pom.xml Normal file
View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.tencent.supersonic</groupId>
<artifactId>semantic</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>semantic-api</artifactId>
<dependencies>
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>${clickhouse.jdbc.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.tencent.supersonic</groupId>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.tencent.supersonic</groupId>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.tencent.supersonic</groupId>
<artifactId>auth-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,109 @@
package com.tencent.supersonic.semantic.api.core.enums;
import com.tencent.supersonic.common.constant.Constants;
import java.util.HashSet;
import java.util.Set;
public enum DataTypeEnum {
MYSQL("mysql", "mysql", "com.mysql.cj.jdbc.Driver", "`", "`", "'", "'"),
HIVE2("hive2", "hive", "org.apache.hive.jdbc.HiveDriver", "`", "`", "`", "`"),
ORACLE("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\""),
SQLSERVER("sqlserver", "sqlserver", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "\"", "\"", "\"", "\""),
H2("h2", "h2", "org.h2.Driver", "`", "`", "\"", "\""),
PHOENIX("phoenix", "hbase phoenix", "org.apache.phoenix.jdbc.PhoenixDriver", "", "", "\"", "\""),
MONGODB("mongo", "mongodb", "mongodb.jdbc.MongoDriver", "`", "`", "\"", "\""),
ELASTICSEARCH("elasticsearch", "elasticsearch", "com.amazon.opendistroforelasticsearch.jdbc.Driver", "", "", "'",
"'"),
PRESTO("presto", "presto", "com.facebook.presto.jdbc.PrestoDriver", "\"", "\"", "\"", "\""),
MOONBOX("moonbox", "moonbox", "moonbox.jdbc.MbDriver", "`", "`", "`", "`"),
CASSANDRA("cassandra", "cassandra", "com.github.adejanovski.cassandra.jdbc.CassandraDriver", "", "", "'", "'"),
CLICKHOUSE("clickhouse", "clickhouse", "ru.yandex.clickhouse.ClickHouseDriver", "", "", "\"", "\""),
KYLIN("kylin", "kylin", "org.apache.kylin.jdbc.Driver", "\"", "\"", "\"", "\""),
VERTICA("vertica", "vertica", "com.vertica.jdbc.Driver", "", "", "'", "'"),
HANA("sap", "sap hana", "com.sap.db.jdbc.Driver", "", "", "'", "'"),
IMPALA("impala", "impala", "com.cloudera.impala.jdbc41.Driver", "", "", "'", "'"),
TDENGINE("TAOS", "TAOS", "com.taosdata.jdbc.TSDBDriver", "'", "'", "\"", "\"");
private String feature;
private String desc;
private String driver;
private String keywordPrefix;
private String keywordSuffix;
private String aliasPrefix;
private String aliasSuffix;
DataTypeEnum(String feature, String desc, String driver, String keywordPrefix, String keywordSuffix,
String aliasPrefix, String aliasSuffix) {
this.feature = feature;
this.desc = desc;
this.driver = driver;
this.keywordPrefix = keywordPrefix;
this.keywordSuffix = keywordSuffix;
this.aliasPrefix = aliasPrefix;
this.aliasSuffix = aliasSuffix;
}
public static DataTypeEnum urlOf(String jdbcUrl) throws RuntimeException {
String url = jdbcUrl.toLowerCase().trim();
for (DataTypeEnum dataTypeEnum : values()) {
if (url.startsWith(String.format(Constants.JDBC_PREFIX_FORMATTER, dataTypeEnum.feature))) {
return dataTypeEnum;
}
}
return null;
}
public static Set<String> getAllSupportedDatasourceNameSet() {
Set<String> datasourceSet = new HashSet<>();
for (DataTypeEnum datasource : values()) {
datasourceSet.add(datasource.getFeature());
}
return datasourceSet;
}
public String getFeature() {
return feature;
}
public String getDesc() {
return desc;
}
public String getDriver() {
return driver;
}
public String getKeywordPrefix() {
return keywordPrefix;
}
public String getKeywordSuffix() {
return keywordSuffix;
}
public String getAliasPrefix() {
return aliasPrefix;
}
public String getAliasSuffix() {
return aliasSuffix;
}
}

View File

@@ -0,0 +1,10 @@
package com.tencent.supersonic.semantic.api.core.enums;
public enum DimensionTypeEnum {
categorical,
time
}

View File

@@ -0,0 +1,17 @@
package com.tencent.supersonic.semantic.api.core.enums;
public enum MetricTypeEnum {
EXPR("expr");
private String name;
MetricTypeEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
}

View File

@@ -0,0 +1,33 @@
package com.tencent.supersonic.semantic.api.core.enums;
public enum OperatorEnum {
MAX("MAX"),
MIN("MIN"),
AVG("AVG"),
SUM("SUM"),
DISTINCT("DISTINCT"),
TOPN("TOPN"),
PERCENTILE("PERCENTILE"),
UNKNOWN("UNKNOWN");
OperatorEnum(String operator) {
this.operator = operator;
}
private String operator;
public String getOperator() {
return operator;
}
}

View File

@@ -0,0 +1,35 @@
package com.tencent.supersonic.semantic.api.core.enums;
public enum QueryTypeBackEnum {
NORMAL("NORMAL", 0),
PRE_FLUSH("PRE_FLUSH", 1);
private String value;
private Integer state;
QueryTypeBackEnum(String value, Integer state) {
this.value = value;
this.state = state;
}
public String getValue() {
return value;
}
public Integer getState() {
return state;
}
public static QueryTypeBackEnum of(String src) {
for (QueryTypeBackEnum operatorEnum : QueryTypeBackEnum.values()) {
if (src.toUpperCase().contains(operatorEnum.value)) {
return operatorEnum;
}
}
return null;
}
}

View File

@@ -0,0 +1,29 @@
package com.tencent.supersonic.semantic.api.core.enums;
public enum QueryTypeEnum {
SQL("SQL"),
STRUCT("STRUCT");
private String value;
QueryTypeEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public static QueryTypeEnum of(String src) {
for (QueryTypeEnum operatorEnum : QueryTypeEnum.values()) {
if (src.toUpperCase().contains(operatorEnum.value)) {
return operatorEnum;
}
}
return null;
}
}

View File

@@ -0,0 +1,28 @@
package com.tencent.supersonic.semantic.api.core.enums;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public enum TimeDimensionEnum {
DAY("sys_imp_date"),
WEEK("sys_imp_week"),
MONTH("sys_imp_month");
private String name;
TimeDimensionEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static List<String> getNameList() {
return Arrays.stream(TimeDimensionEnum.values()).map(TimeDimensionEnum::getName).collect(Collectors.toList());
}
}

View File

@@ -0,0 +1,13 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import lombok.Data;
@Data
public class DataFormat {
private boolean needMultiply100;
private Integer decimalPlaces;
}

View File

@@ -0,0 +1,23 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import java.util.List;
import lombok.Data;
@Data
public class DatasourceDetail {
private String queryType;
private String sqlQuery;
private String tableQuery;
private List<Identify> identifiers;
private List<Dim> dimensions;
private List<Measure> measures;
}

View File

@@ -0,0 +1,19 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import com.tencent.supersonic.common.constant.Constants;
import java.util.List;
import lombok.Data;
@Data
public class DatasourceType {
private String name;
private String prefix;
private List<String> versions;
public DatasourceType(String name, List<String> versions) {
this.name = name;
this.prefix = String.format(Constants.JDBC_PREFIX_FORMATTER, name);
this.versions = versions;
}
}

View File

@@ -0,0 +1,36 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import com.tencent.supersonic.common.constant.Constants;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dim {
private String name;
private String type;
private String expr;
private String dateFormat = Constants.DAY_FORMAT;
private DimensionTimeTypeParams typeParams;
private Integer isCreateDimension = 0;
private String bizName;
public static Dim getDefault() {
return new Dim("日期", "time", "2023-05-28",
Constants.DAY_FORMAT,
new DimensionTimeTypeParams("true", "day"),
0, "imp_date"
);
}
}

View File

@@ -0,0 +1,17 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DimensionTimeTypeParams {
private String isPrimary;
private String timeGranularity;
}

View File

@@ -0,0 +1,22 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Identify {
private String name;
/**
* like primary, foreign
*/
private String type;
private String bizName;
}

View File

@@ -0,0 +1,17 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NonNull;
import lombok.ToString;
@Data
@AllArgsConstructor
@ToString
public class ItemDateFilter {
private List<Long> itemIds;
@NonNull
private String type;
}

View File

@@ -0,0 +1,32 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Measure {
private String name;
private String agg;
private String expr;
private String constraint;
private String alias;
private String createMetric;
private String bizName;
private Integer isCreateMetric = 0;
private Long datasourceId;
}

View File

@@ -0,0 +1,13 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import java.util.List;
import lombok.Data;
@Data
public class MetricTypeParams {
private List<Measure> measures;
private String expr;
}

View File

@@ -0,0 +1,20 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@AllArgsConstructor
@Data
@ToString
@NoArgsConstructor
public class QueryAuthorization {
private String domainName;
private List<String> dimensionFilters;
private List<String> dimensionFiltersDesc;
private String message;
}

View File

@@ -0,0 +1,26 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class QueryColumn {
private String name;
private String type;
private String nameEn;
private String showType;
private Boolean authorized = true;
public void setType(String type) {
this.type = type == null ? null : type;
}
public QueryColumn(String nameEn, String type) {
this.type = type;
this.nameEn = nameEn;
}
}

View File

@@ -0,0 +1,17 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class QueryResult<T> implements Serializable {
private int pageNo = -1;
private int pageSize = -1;
private long totalCount = -1;
private List<T> resultList = new ArrayList<T>();
}

View File

@@ -0,0 +1,219 @@
package com.tencent.supersonic.semantic.api.core.pojo;
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;
@Data
@ToString
public class QueryStat {
private Long id;
private String traceId;
private Long domainId;
private String user;
private String createdAt;
/**
* corresponding type, such as sql, struct, etc
*/
private String queryType;
/**
* NORMAL, PRE_FLUSH
*/
private Integer queryTypeBack;
private String querySqlCmd;
private String querySqlCmdMd5;
private String queryStructCmd;
private String queryStructCmdMd5;
private String sql;
private String sqlMd5;
private String queryEngine;
private Long startTime;
private Long elapsedMs;
private String queryState;
private Boolean nativeQuery;
private String startDate;
private String endDate;
private String dimensions;
private String metrics;
private String selectCols;
private String aggCols;
private String filterCols;
private String groupByCols;
private String orderByCols;
private Boolean useResultCache;
private Boolean useSqlCache;
private String sqlCacheKey;
private String resultCacheKey;
public QueryStat setQuerySqlCmdMd5(String querySqlCmdMd5) {
this.querySqlCmdMd5 = querySqlCmdMd5;
return this;
}
public QueryStat setQueryStructCmdMd5(String queryStructCmdMd5) {
this.queryStructCmdMd5 = queryStructCmdMd5;
return this;
}
public QueryStat setStartTime(Long startTime) {
this.startTime = startTime;
return this;
}
public QueryStat setQueryTypeBack(Integer queryTypeBack) {
this.queryTypeBack = queryTypeBack;
return this;
}
public QueryStat setNativeQuery(Boolean nativeQuery) {
this.nativeQuery = nativeQuery;
return this;
}
public QueryStat setTraceId(String traceId) {
this.traceId = traceId;
return this;
}
public QueryStat setClassId(Long domainId) {
this.domainId = domainId;
return this;
}
public QueryStat setUser(String user) {
this.user = user;
return this;
}
public QueryStat setQueryType(String queryType) {
this.queryType = queryType;
return this;
}
public QueryStat setQuerySqlCmd(String querySqlCmd) {
this.querySqlCmd = querySqlCmd;
return this;
}
public QueryStat setQueryStructCmd(String queryStructCmd) {
this.queryStructCmd = queryStructCmd;
return this;
}
public QueryStat setSql(String sql) {
this.sql = sql;
return this;
}
public QueryStat setSqlMd5(String sqlMd5) {
this.sqlMd5 = sqlMd5;
return this;
}
public QueryStat setQueryEngine(String queryEngine) {
this.queryEngine = queryEngine;
return this;
}
public QueryStat setElapsedMs(Long elapsedMs) {
this.elapsedMs = elapsedMs;
return this;
}
public QueryStat setQueryState(String queryState) {
this.queryState = queryState;
return this;
}
public QueryStat setStartDate(String startDate) {
this.startDate = startDate;
return this;
}
public QueryStat setEndDate(String endDate) {
this.endDate = endDate;
return this;
}
public QueryStat setDimensions(String dimensions) {
this.dimensions = dimensions;
return this;
}
public QueryStat setMetrics(String metrics) {
this.metrics = metrics;
return this;
}
public QueryStat setSelectCols(String selectCols) {
this.selectCols = selectCols;
return this;
}
public QueryStat setAggCols(String aggCols) {
this.aggCols = aggCols;
return this;
}
public QueryStat setFilterCols(String filterCols) {
this.filterCols = filterCols;
return this;
}
public QueryStat setGroupByCols(String groupByCols) {
this.groupByCols = groupByCols;
return this;
}
public QueryStat setOrderByCols(String orderByCols) {
this.orderByCols = orderByCols;
return this;
}
public QueryStat setUseResultCache(Boolean useResultCache) {
this.useResultCache = useResultCache;
return this;
}
public QueryStat setUseSqlCache(Boolean useSqlCache) {
this.useSqlCache = useSqlCache;
return this;
}
public QueryStat setSqlCacheKey(String sqlCacheKey) {
this.sqlCacheKey = sqlCacheKey;
return this;
}
public QueryStat setResultCacheKey(String resultCacheKey) {
this.resultCacheKey = resultCacheKey;
return this;
}
public QueryStat setId(Long id) {
this.id = id;
return this;
}
public QueryStat setCreatedAt(String createdAt) {
this.createdAt = createdAt;
return this;
}
public List<String> getMetricListBizName() {
if (Objects.isNull(metrics)) {
return Lists.newArrayList();
}
return JSONObject.parseArray(metrics, String.class);
}
public List<String> getDimensionListBizName() {
return JSONObject.parseArray(dimensions, String.class);
}
}

View File

@@ -0,0 +1,23 @@
package com.tencent.supersonic.semantic.api.core.pojo;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
@AllArgsConstructor
public class RecordInfo {
private String createdBy;
private String updatedBy;
private Date createdAt;
private Date updatedAt;
}

View File

@@ -0,0 +1,25 @@
package com.tencent.supersonic.semantic.api.core.pojo.yaml;
import java.util.List;
import lombok.Data;
@Data
public class DatasourceYamlTpl {
private String name;
private Long sourceId;
private String sqlQuery;
private String tableQuery;
private List<IdentifyYamlTpl> identifiers;
private List<DimensionYamlTpl> dimensions;
private List<MeasureYamlTpl> measures;
}

View File

@@ -0,0 +1,13 @@
package com.tencent.supersonic.semantic.api.core.pojo.yaml;
import lombok.Data;
@Data
public class DimensionTimeTypeParamsTpl {
private String isPrimary;
private String timeGranularity;
}

View File

@@ -0,0 +1,20 @@
package com.tencent.supersonic.semantic.api.core.pojo.yaml;
import lombok.Data;
@Data
public class DimensionYamlTpl {
private String name;
private String owners;
private String type;
private String expr;
private DimensionTimeTypeParamsTpl typeParams;
}

View File

@@ -0,0 +1,20 @@
package com.tencent.supersonic.semantic.api.core.pojo.yaml;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class IdentifyYamlTpl {
private String name;
/**
* 主键 primary 外键 foreign
*/
private String type;
}

View File

@@ -0,0 +1,25 @@
package com.tencent.supersonic.semantic.api.core.pojo.yaml;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MeasureYamlTpl {
private String name;
private String agg;
private String expr;
private String constraint;
private String alias;
private String createMetric;
}

View File

@@ -0,0 +1,14 @@
package com.tencent.supersonic.semantic.api.core.pojo.yaml;
import java.util.List;
import lombok.Data;
@Data
public class MetricTypeParamsYamlTpl {
private List<MeasureYamlTpl> measures;
private String expr;
}

View File

@@ -0,0 +1,20 @@
package com.tencent.supersonic.semantic.api.core.pojo.yaml;
import java.util.List;
import lombok.Data;
@Data
public class MetricYamlTpl {
private String name;
private List<String> owners;
private String type;
private MetricTypeParamsYamlTpl typeParams;
}

View File

@@ -0,0 +1,39 @@
package com.tencent.supersonic.semantic.api.core.request;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
@Data
public class DatabaseReq {
private Long id;
private Long domainId;
private String name;
private String type;
private String host;
private String port;
private String username;
private String password;
private String database;
private String description;
private String url;
public String getUrl() {
if (StringUtils.isNotBlank(url)) {
return url;
}
return String.format("jdbc:%s://%s:%s", type, host, port);
}
}

View File

@@ -0,0 +1,23 @@
package com.tencent.supersonic.semantic.api.core.request;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class DatasourceRelaReq {
private Long id;
@NotNull(message = "class id cat not be null")
private Long domainId;
@NotNull(message = "datasource id cat not be null")
private Long datasourceFrom;
@NotNull(message = "datasource id cat not be null")
private Long datasourceTo;
@NotNull(message = "join key cat not be null")
private String joinKey;
}

View File

@@ -0,0 +1,33 @@
package com.tencent.supersonic.semantic.api.core.request;
import com.tencent.supersonic.semantic.api.core.pojo.Dim;
import com.tencent.supersonic.semantic.api.core.pojo.Identify;
import com.tencent.supersonic.semantic.api.core.pojo.Measure;
import com.tencent.supersonic.common.pojo.SchemaItem;
import java.util.List;
import lombok.Data;
@Data
public class DatasourceReq extends SchemaItem {
private Long databaseId;
private String queryType;
private String sqlQuery;
private String sqlTable;
private Long domainId;
private List<Identify> identifiers;
private List<Dim> dimensions;
private List<Measure> measures;
}

View File

@@ -0,0 +1,30 @@
package com.tencent.supersonic.semantic.api.core.request;
import java.util.ArrayList;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class DateInfoReq {
private String type;
private Long itemId;
private String dateFormat;
private String startDate;
private String endDate;
private List<String> unavailableDateList = new ArrayList<>();
public DateInfoReq(String type, Long itemId, String dateFormat, String startDate, String endDate) {
this.type = type;
this.itemId = itemId;
this.dateFormat = dateFormat;
this.startDate = startDate;
this.endDate = endDate;
}
}

View File

@@ -0,0 +1,24 @@
package com.tencent.supersonic.semantic.api.core.request;
import com.tencent.supersonic.common.pojo.SchemaItem;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class DimensionReq extends SchemaItem {
private Long domainId;
private String type;
@NotNull(message = "expr can not be null")
private String expr;
private Long datasourceId;
//DATE ID CATEGORY
private String semanticType = "CATEGORY";
}

View File

@@ -0,0 +1,24 @@
package com.tencent.supersonic.semantic.api.core.request;
import com.tencent.supersonic.common.pojo.SchemaItem;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class DomainReq extends SchemaItem {
private Long parentId = 0L;
private Integer isOpen = 0;
private List<String> viewers = new ArrayList<>();
private List<String> viewOrgs = new ArrayList<>();
private List<String> admins = new ArrayList<>();
private List<String> adminOrgs = new ArrayList<>();
}

View File

@@ -0,0 +1,13 @@
package com.tencent.supersonic.semantic.api.core.request;
import java.util.List;
import lombok.Data;
@Data
public class DomainSchemaFilterReq {
/**
* if domainIds is empty, get all domain info
*/
private List<Long> domainIds;
}

View File

@@ -0,0 +1,12 @@
package com.tencent.supersonic.semantic.api.core.request;
import lombok.Data;
@Data
public class DomainUpdateReq extends DomainReq {
private Long id;
}

View File

@@ -0,0 +1,13 @@
package com.tencent.supersonic.semantic.api.core.request;
import com.tencent.supersonic.common.pojo.SchemaItem;
import lombok.Data;
@Data
public class MetricBaseReq extends SchemaItem {
private Long domainId;
}

View File

@@ -0,0 +1,12 @@
package com.tencent.supersonic.semantic.api.core.request;
import com.tencent.supersonic.semantic.api.core.pojo.MetricTypeParams;
import lombok.Data;
@Data
public class MetricReq extends MetricBaseReq {
private MetricTypeParams typeParams;
}

View File

@@ -0,0 +1,11 @@
package com.tencent.supersonic.semantic.api.core.request;
import lombok.Data;
@Data
public class PageDimensionReq extends PageSchemaItemReq {
}

View File

@@ -0,0 +1,11 @@
package com.tencent.supersonic.semantic.api.core.request;
import lombok.Data;
@Data
public class PageMetricReq extends PageSchemaItemReq {
}

View File

@@ -0,0 +1,16 @@
package com.tencent.supersonic.semantic.api.core.request;
import com.tencent.supersonic.common.request.PageBaseReq;
import lombok.Data;
@Data
public class PageSchemaItemReq extends PageBaseReq {
private Long id;
private String name;
private String bizName;
private String createdBy;
private Long domainId;
private Integer sensitiveLevel;
private Integer status;
}

View File

@@ -0,0 +1,23 @@
package com.tencent.supersonic.semantic.api.core.request;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class SqlExecuteReq {
@NotNull(message = "domainId can not be null")
private Long domainId;
@NotBlank(message = "sql can not be blank")
private String sql;
public String getSql() {
return String.format(" select * from ( %s ) a limit 1000 ", sql);
}
}

View File

@@ -0,0 +1,25 @@
package com.tencent.supersonic.semantic.api.core.request;
import java.util.Date;
import lombok.Data;
@Data
public class ViewInfoReq {
private Long id;
private Long domainId;
private String type;
private Date createdAt;
private String createdBy;
private Date updatedAt;
private String updatedBy;
private String config;
}

View File

@@ -0,0 +1,49 @@
package com.tencent.supersonic.semantic.api.core.response;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class DatabaseResp {
private Long id;
private String name;
private String type;
private String url;
private String username;
private String password;
private String database;
public String getHost() {
Pattern p = Pattern.compile("jdbc:(?<db>\\w+):.*((//)|@)(?<host>.+):(?<port>\\d+).*");
Matcher m = p.matcher(url);
if (m.find()) {
return m.group("host");
}
return "";
}
public String getPort() {
Pattern p = Pattern.compile("jdbc:(?<db>\\w+):.*((//)|@)(?<host>.+):(?<port>\\d+).*");
Matcher m = p.matcher(url);
if (m.find()) {
return m.group("port");
}
return "";
}
}

View File

@@ -0,0 +1,27 @@
package com.tencent.supersonic.semantic.api.core.response;
import java.util.Date;
import lombok.Data;
@Data
public class DatasourceRelaResp {
private Long id;
private Long domainId;
private Long datasourceFrom;
private Long datasourceTo;
private String joinKey;
private Date createdAt;
private String createdBy;
private Date updatedAt;
private String updatedBy;
}

View File

@@ -0,0 +1,17 @@
package com.tencent.supersonic.semantic.api.core.response;
import com.tencent.supersonic.semantic.api.core.pojo.DatasourceDetail;
import com.tencent.supersonic.common.pojo.SchemaItem;
import lombok.Data;
@Data
public class DatasourceResp extends SchemaItem {
private Long domainId;
private Long databaseId;
private DatasourceDetail datasourceDetail;
}

View File

@@ -0,0 +1,10 @@
package com.tencent.supersonic.semantic.api.core.response;
import lombok.Data;
@Data
public class DimSchemaResp extends DimensionResp {
private Long useCnt = 0L;
}

View File

@@ -0,0 +1,28 @@
package com.tencent.supersonic.semantic.api.core.response;
import com.tencent.supersonic.common.pojo.SchemaItem;
import lombok.Data;
@Data
public class DimensionResp extends SchemaItem {
private Long domainId;
private String type;
private String expr;
private String fullPath;
private Long datasourceId;
private String datasourceName;
private String datasourceBizName;
//DATE ID CATEGORY
private String semanticType;
}

View File

@@ -0,0 +1,27 @@
package com.tencent.supersonic.semantic.api.core.response;
import com.tencent.supersonic.common.pojo.SchemaItem;
import java.util.List;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class DomainResp extends SchemaItem {
private Long parentId;
private String fullPath;
private List<String> viewers;
private List<String> viewOrgs;
private List<String> admins;
private List<String> adminOrgs;
private Integer isOpen = 0;
}

View File

@@ -0,0 +1,18 @@
package com.tencent.supersonic.semantic.api.core.response;
import java.util.List;
import lombok.Data;
@Data
public class DomainSchemaRelaResp {
private Long domainId;
private DatasourceResp datasource;
private List<MetricResp> metrics;
private List<DimensionResp> dimensions;
}

View File

@@ -0,0 +1,17 @@
package com.tencent.supersonic.semantic.api.core.response;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DomainSchemaResp extends DomainResp {
private List<String> entityNames;
private List<MetricSchemaResp> metrics;
private List<DimSchemaResp> dimensions;
}

View File

@@ -0,0 +1,22 @@
package com.tencent.supersonic.semantic.api.core.response;
import java.util.ArrayList;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
/**
* @author: kanedai
* @date: 2023/3/29
*/
@Data
@AllArgsConstructor
@ToString
public class ItemDateResp {
private String dateFormat;
private String startDate;
private String endDate;
private List<String> unavailableDateList = new ArrayList<>();
}

View File

@@ -0,0 +1,28 @@
package com.tencent.supersonic.semantic.api.core.response;
import lombok.Data;
@Data
public class MeasureResp {
private String name;
//sum max min avg count distinct
private String agg;
private String expr;
private String constraint;
private String alias;
private Long datasourceId;
private String datasourceName;
private String datasourceBizName;
private String bizName;
}

View File

@@ -0,0 +1,29 @@
package com.tencent.supersonic.semantic.api.core.response;
import com.tencent.supersonic.semantic.api.core.pojo.DataFormat;
import com.tencent.supersonic.semantic.api.core.pojo.MetricTypeParams;
import com.tencent.supersonic.common.pojo.SchemaItem;
import lombok.Data;
@Data
public class MetricResp extends SchemaItem {
private Long domainId;
private String domainName;
//measure_proxy ratio expr cumulative derived
private String type;
private MetricTypeParams typeParams;
private String fullPath;
private String dataFormatType;
private DataFormat dataFormat;
}

View File

@@ -0,0 +1,10 @@
package com.tencent.supersonic.semantic.api.core.response;
import lombok.Data;
@Data
public class MetricSchemaResp extends MetricResp {
private Long useCnt = 0L;
}

View File

@@ -0,0 +1,20 @@
package com.tencent.supersonic.semantic.api.core.response;
import com.tencent.supersonic.semantic.api.core.pojo.QueryAuthorization;
import com.tencent.supersonic.semantic.api.core.pojo.QueryColumn;
import com.tencent.supersonic.semantic.api.core.pojo.QueryResult;
import java.util.List;
import java.util.Map;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class QueryResultWithSchemaResp extends QueryResult<Map<String, Object>> {
List<QueryColumn> columns;
String sql;
QueryAuthorization queryAuthorization;
}

View File

@@ -0,0 +1,28 @@
package com.tencent.supersonic.semantic.api.core.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class SqlParserResp {
private String sql = "";
private String sourceId = "";
private String errMsg = "";
private Boolean ok;
public boolean isOk() {
this.ok = "".equals(errMsg) && !"".equals(sql);
return ok;
}
public SqlParserResp error(String msg) {
this.setErrMsg(msg);
return this;
}
}

View File

@@ -0,0 +1,45 @@
package com.tencent.supersonic.semantic.api.query.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
public enum FilterOperatorEnum {
IN("IN"),
NOT_IN("NOT_IN"),
EQUALS("="),
BETWEEN("BETWEEN"),
GREATER_THAN(">"),
GREATER_THAN_EQUALS(">="),
IS_NULL("IS_NULL"),
IS_NOT_NULL("IS_NOT_NULL"),
LIKE("LIKE"),
MINOR_THAN("<"),
MINOR_THAN_EQUALS("<="),
NOT_EQUALS("!="),
SQL_PART("SQL_PART"),
EXISTS("EXISTS");
private String value;
FilterOperatorEnum(String value) {
this.value = value;
}
@JsonValue
public String getValue() {
return value;
}
@JsonCreator
public static FilterOperatorEnum getSqlOperator(String type) {
for (FilterOperatorEnum operatorEnum : FilterOperatorEnum.values()) {
if (operatorEnum.value.equalsIgnoreCase(type) || operatorEnum.name().equalsIgnoreCase(type)) {
return operatorEnum;
}
}
return null;
}
}

View File

@@ -0,0 +1,18 @@
package com.tencent.supersonic.semantic.api.query.pojo;
import lombok.Data;
@Data
public class Cache {
private Boolean cache = true;
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"cache\":")
.append(cache);
sb.append('}');
return sb.toString();
}
}

View File

@@ -0,0 +1,83 @@
package com.tencent.supersonic.semantic.api.query.pojo;
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
import java.util.Arrays;
import java.util.List;
import lombok.Data;
@Data
public class Criterion {
private String column;
private FilterOperatorEnum operator;
private Object value;
private List<Object> values;
private String dataType;
public enum NumericDataType {
TINYINT("TINYINT"),
SMALLINT("SMALLINT"),
MEDIUMINT("MEDIUMINT"),
INT("INT"),
INTEGER("INTEGER"),
BIGINT("BIGINT"),
FLOAT("FLOAT"),
DOUBLE("DOUBLE"),
DECIMAL("DECIMAL"),
NUMERIC("NUMERIC"),
;
private String type;
NumericDataType(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
public enum StringDataType {
VARCHAR("VARCHAR"),
STRING("STRING"),
;
private String type;
StringDataType(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
public Criterion(String column, FilterOperatorEnum operator, Object value, String dataType) {
super();
this.column = column;
this.operator = operator;
this.value = value;
this.dataType = dataType;
if (FilterOperatorEnum.BETWEEN.name().equals(operator) || FilterOperatorEnum.IN.name().equals(operator)
|| FilterOperatorEnum.NOT_IN.name().equals(operator)) {
this.values = (List) value;
}
}
public boolean isNeedApostrophe() {
return Arrays.stream(StringDataType.values())
.filter(value -> this.dataType.equalsIgnoreCase(value.getType())).findFirst()
.isPresent();
}
}

View File

@@ -0,0 +1,63 @@
package com.tencent.supersonic.semantic.api.query.pojo;
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Filter {
public enum Relation {
FILTER, OR, AND
}
private Relation relation = Relation.FILTER;
private String bizName;
private String name;
private FilterOperatorEnum operator;
private Object value;
private List<Filter> children;
public Filter(String bizName, FilterOperatorEnum operator, Object value) {
this.bizName = bizName;
this.operator = operator;
this.value = value;
}
public Filter(Relation relation, String bizName, FilterOperatorEnum operator, Object value) {
this.relation = relation;
this.bizName = bizName;
this.operator = operator;
this.value = value;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"relation\":")
.append(relation);
sb.append(",\"bizName\":\"")
.append(bizName).append('\"');
sb.append(",\"name\":\"")
.append(name).append('\"');
sb.append(",\"operator\":")
.append(operator);
sb.append(",\"value\":")
.append(value);
sb.append(",\"children\":")
.append(children);
sb.append('}');
return sb.toString();
}
}

View File

@@ -0,0 +1,16 @@
package com.tencent.supersonic.semantic.api.query.pojo;
import java.util.List;
import lombok.Data;
@Data
public class Materialization {
private String name;
private String destination;
private String destinationType;
private List<String> depends;
private List<String> metrics;
private List<String> dimensions;
}

View File

@@ -0,0 +1,15 @@
package com.tencent.supersonic.semantic.api.query.pojo;
import java.util.List;
import lombok.Data;
@Data
public class MetricTable {
private String alias;
private List<String> metrics;
private List<String> dimensions;
private String where;
private boolean isAgg = false;
}

View File

@@ -0,0 +1,34 @@
package com.tencent.supersonic.semantic.api.query.pojo;
import javax.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class Param {
@NotBlank(message = "Invald parameter name")
private String name;
@NotBlank(message = "Invalid parameter value")
private String value;
public Param() {
}
public Param(String name, String value) {
this.name = name;
this.value = value;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"name\":\"")
.append(name).append('\"');
sb.append(",\"value\":\"")
.append(value).append('\"');
sb.append('}');
return sb.toString();
}
}

View File

@@ -0,0 +1,21 @@
package com.tencent.supersonic.semantic.api.query.request;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@NoArgsConstructor
public class ItemUseReq {
private String startTime;
private Long domainId;
private Boolean cacheEnable = true;
private String metric;
public ItemUseReq(String startTime, Long domainId) {
this.startTime = startTime;
this.domainId = domainId;
}
}

View File

@@ -0,0 +1,19 @@
package com.tencent.supersonic.semantic.api.query.request;
import com.tencent.supersonic.common.pojo.ColumnOrder;
import java.util.List;
import java.util.Map;
import lombok.Data;
@Data
public class MetricReq {
private List<String> metrics;
private List<String> dimensions;
private String rootPath = "";
private Map<String, String> variables;
private String where;
private Long limit;
private List<ColumnOrder> order;
}

View File

@@ -0,0 +1,24 @@
package com.tencent.supersonic.semantic.api.query.request;
import com.tencent.supersonic.semantic.api.query.pojo.MetricTable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.Data;
@Data
public class ParseSqlReq {
private String rootPath = "";
private Map<String, String> variables;
private String sql;
private List<MetricTable> tables;
public Map<String, String> getVariables() {
if (variables == null) {
variables = new HashMap<>();
}
return variables;
}
}

View File

@@ -0,0 +1,24 @@
package com.tencent.supersonic.semantic.api.query.request;
import com.alibaba.fastjson.JSONObject;
import java.util.List;
import lombok.Data;
import lombok.ToString;
import org.apache.commons.codec.digest.DigestUtils;
@Data
@ToString
public class QueryMultiStructReq {
List<QueryStructReq> queryStructCmds;
public String toCustomizedString() {
return JSONObject.toJSONString(queryStructCmds);
}
public String generateCommandMd5() {
return DigestUtils.md5Hex(this.toCustomizedString());
}
}

View File

@@ -0,0 +1,17 @@
package com.tencent.supersonic.semantic.api.query.request;
import java.util.Map;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class QuerySqlReq {
private Long domainId;
private String sql;
private Map<String, String> variables;
}

View File

@@ -0,0 +1,132 @@
package com.tencent.supersonic.semantic.api.query.request;
import com.google.common.collect.Lists;
import com.tencent.supersonic.semantic.api.query.pojo.Cache;
import com.tencent.supersonic.semantic.api.query.pojo.Filter;
import com.tencent.supersonic.semantic.api.query.pojo.Param;
import com.tencent.supersonic.common.pojo.Aggregator;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.Order;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import lombok.Data;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.logging.log4j.util.Strings;
import org.springframework.util.CollectionUtils;
@Data
public class QueryStructReq {
private Long domainId;
private List<String> groups = new ArrayList<>();
private List<Aggregator> aggregators = new ArrayList<>();
private List<Order> orders = new ArrayList<>();
private List<Filter> dimensionFilters = new ArrayList<>();
private List<Filter> metricFilters = new ArrayList<>();
private List<Param> params = new ArrayList<>();
private DateConf dateInfo;
private Long limit = 2000L;
private Boolean nativeQuery = false;
private Cache cacheInfo;
public List<String> getGroups() {
if (!CollectionUtils.isEmpty(this.groups)) {
this.groups = groups.stream().filter(group -> !Strings.isEmpty(group)).collect(Collectors.toList());
}
if (CollectionUtils.isEmpty(this.groups)) {
this.groups = Lists.newArrayList();
}
return this.groups;
}
public List<String> getMetrics() {
List<String> metrics = Lists.newArrayList();
if (!CollectionUtils.isEmpty(this.aggregators)) {
metrics = aggregators.stream().map(Aggregator::getColumn).collect(Collectors.toList());
}
return metrics;
}
public List<Order> getOrders() {
if (orders == null) {
return Lists.newArrayList();
}
return orders;
}
public List<Param> getParams() {
if (params == null) {
return Lists.newArrayList();
}
return params;
}
public String toCustomizedString() {
StringBuilder stringBuilder = new StringBuilder("{");
stringBuilder.append("\"domainId\":")
.append(domainId);
stringBuilder.append(",\"groups\":")
.append(groups);
stringBuilder.append(",\"aggregators\":")
.append(aggregators);
stringBuilder.append(",\"orders\":")
.append(orders);
stringBuilder.append(",\"filters\":")
.append(dimensionFilters);
stringBuilder.append(",\"dateInfo\":")
.append(dateInfo);
stringBuilder.append(",\"params\":")
.append(params);
stringBuilder.append(",\"limit\":")
.append(limit);
stringBuilder.append(",\"nativeQuery\":")
.append(nativeQuery);
stringBuilder.append('}');
return stringBuilder.toString();
}
public String generateCommandMd5() {
return DigestUtils.md5Hex(this.toCustomizedString());
}
public List<Filter> getOriginalFilter() {
return dimensionFilters;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"domainId\":")
.append(domainId);
sb.append(",\"groups\":")
.append(groups);
sb.append(",\"aggregators\":")
.append(aggregators);
sb.append(",\"orders\":")
.append(orders);
sb.append(",\"dimensionFilters\":")
.append(dimensionFilters);
sb.append(",\"metricFilters\":")
.append(metricFilters);
sb.append(",\"params\":")
.append(params);
sb.append(",\"dateInfo\":")
.append(dateInfo);
sb.append(",\"limit\":")
.append(limit);
sb.append(",\"nativeQuery\":")
.append(nativeQuery);
sb.append(",\"cacheInfo\":")
.append(cacheInfo);
sb.append('}');
return sb.toString();
}
}

View File

@@ -0,0 +1,24 @@
package com.tencent.supersonic.semantic.api.query.response;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@NoArgsConstructor
@ToString
public class ItemUseResp {
private Long domainId;
private String type;
private Long itemId;
private String bizName;
private Long useCnt;
public ItemUseResp(Long domainId, String type, String bizName, Long useCnt) {
this.domainId = domainId;
this.type = type;
this.bizName = bizName;
this.useCnt = useCnt;
}
}