(improvement)(headless) Modify the headless module structure to api, core and server (#588)

Co-authored-by: jolunoluo
This commit is contained in:
LXW
2024-01-02 16:43:28 +08:00
committed by GitHub
parent af1c560cc4
commit e7f13572d7
352 changed files with 2296 additions and 2675 deletions

View File

@@ -1,28 +1,69 @@
<?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">
<modelVersion>4.0.0</modelVersion>
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>headless</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>headless-api</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- <dependency>-->
<!-- <groupId>ru.yandex.clickhouse</groupId>-->
<!-- <artifactId>clickhouse-jdbc</artifactId>-->
<!-- <version>${clickhouse.jdbc.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>${clickhouse.jdbc.version}</version>
<!-- use uber jar with all dependencies included, change classifier to http for smaller jar -->
<classifier>all</classifier>
</dependency>
<dependency>
<groupId>com.tencent.supersonic</groupId>
<artifactId>headless-query</artifactId>
<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.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>auth-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
</project>

View File

@@ -1,43 +0,0 @@
package com.tencent.supersonic.headless.api.rest;
import com.tencent.supersonic.headless.api.service.ApiQueryService;
import com.tencent.supersonic.headless.common.model.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.headless.common.query.request.MetaQueryApiReq;
import com.tencent.supersonic.headless.common.query.request.QueryApiReq;
import com.tencent.supersonic.headless.common.query.request.QueryStructReq;
import com.tencent.supersonic.headless.common.query.response.ApiQueryResultResp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("/api/semantic/apiQuery")
@Slf4j
public class ApiQueryController {
@Autowired
private ApiQueryService apiQueryService;
@PostMapping("/metricDataQueryById")
public ApiQueryResultResp metricDataQueryById(@RequestBody QueryApiReq queryApiReq,
HttpServletRequest request) throws Exception {
return apiQueryService.metricDataQueryById(queryApiReq, request);
}
@PostMapping("/metaQuery")
public Object metaQuery(@RequestBody MetaQueryApiReq metaQueryApiReq, HttpServletRequest request) {
return apiQueryService.metaQuery(metaQueryApiReq, request);
}
@PostMapping("/dataQueryByStruct")
public QueryResultWithSchemaResp dataQueryByStruct(QueryStructReq queryStructReq,
HttpServletRequest request) throws Exception {
return apiQueryService.dataQueryByStruct(queryStructReq, request);
}
}

View File

@@ -1,47 +0,0 @@
package com.tencent.supersonic.headless.api.service;
import com.tencent.supersonic.headless.common.model.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.headless.common.query.request.MetaQueryApiReq;
import com.tencent.supersonic.headless.common.query.request.QueryApiReq;
import com.tencent.supersonic.headless.common.query.request.QueryStructReq;
import com.tencent.supersonic.headless.common.query.response.ApiQueryResultResp;
import com.tencent.supersonic.headless.api.annotation.ApiHeaderCheck;
import javax.servlet.http.HttpServletRequest;
/**
* Api service for other apps to query meta info and data
*/
public interface ApiQueryService {
/**
* Query the metric data based on the metric id.
* The data will be drilled down based on the information configured when applying for the APP.
* @param queryApiReq
* @param request
* @return
* @throws Exception
*/
@ApiHeaderCheck
ApiQueryResultResp metricDataQueryById(QueryApiReq queryApiReq, HttpServletRequest request) throws Exception;
/**
* Query data based on structure
* @param queryStructReq
* @param request
* @return
* @throws Exception
*/
@ApiHeaderCheck
QueryResultWithSchemaResp dataQueryByStruct(QueryStructReq queryStructReq,
HttpServletRequest request) throws Exception;
/**
* Query the meta information of the metric, dimension and tag
* @param metaQueryApiReq
* @param request
* @return
*/
@ApiHeaderCheck
Object metaQuery(MetaQueryApiReq metaQueryApiReq, HttpServletRequest request);
}

View File

@@ -1,177 +0,0 @@
package com.tencent.supersonic.headless.api.service.impl;
import com.google.common.collect.Lists;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.common.pojo.Aggregator;
import com.tencent.supersonic.common.pojo.Constants;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.enums.ApiItemType;
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
import com.tencent.supersonic.headless.api.aspect.ApiHeaderCheckAspect;
import com.tencent.supersonic.headless.api.service.ApiQueryService;
import com.tencent.supersonic.headless.api.service.AppService;
import com.tencent.supersonic.headless.common.model.pojo.Item;
import com.tencent.supersonic.headless.common.model.response.AppDetailResp;
import com.tencent.supersonic.headless.common.model.response.DimensionResp;
import com.tencent.supersonic.headless.common.model.response.MetricResp;
import com.tencent.supersonic.headless.common.model.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.headless.common.query.pojo.ApiQuerySingleResult;
import com.tencent.supersonic.headless.common.query.request.MetaQueryApiReq;
import com.tencent.supersonic.headless.common.query.request.QueryApiReq;
import com.tencent.supersonic.headless.common.query.request.QueryStructReq;
import com.tencent.supersonic.headless.common.query.response.ApiQueryResultResp;
import com.tencent.supersonic.headless.model.domain.DimensionService;
import com.tencent.supersonic.headless.model.domain.MetricService;
import com.tencent.supersonic.headless.model.domain.pojo.DimensionFilter;
import com.tencent.supersonic.headless.model.domain.pojo.MetaFilter;
import com.tencent.supersonic.headless.api.annotation.ApiHeaderCheck;
import com.tencent.supersonic.headless.query.service.QueryService;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@Service
public class ApiQueryServiceImpl implements ApiQueryService {
private static final long result_size = 10000;
private AppService appService;
private MetricService metricService;
private DimensionService dimensionService;
private QueryService queryService;
public ApiQueryServiceImpl(AppService appService,
MetricService metricService,
DimensionService dimensionService,
QueryService queryService) {
this.appService = appService;
this.metricService = metricService;
this.dimensionService = dimensionService;
this.queryService = queryService;
}
@Override
@ApiHeaderCheck
public ApiQueryResultResp metricDataQueryById(QueryApiReq queryApiReq,
HttpServletRequest request) throws Exception {
AppDetailResp appDetailResp = getAppDetailResp(request);
authCheck(appDetailResp, queryApiReq.getIds(), ApiItemType.METRIC);
List<ApiQuerySingleResult> results = Lists.newArrayList();
Map<Long, Item> map = appDetailResp.getConfig().getItems().stream()
.collect(Collectors.toMap(Item::getId, i -> i));
for (Long id : queryApiReq.getIds()) {
Item item = map.get(id);
ApiQuerySingleResult apiQuerySingleResult = dataQuery(appDetailResp.getId(),
item, queryApiReq.getDateConf());
results.add(apiQuerySingleResult);
}
return ApiQueryResultResp.builder().results(results).build();
}
@Override
@ApiHeaderCheck
public QueryResultWithSchemaResp dataQueryByStruct(QueryStructReq queryStructReq,
HttpServletRequest request) throws Exception {
AppDetailResp appDetailResp = getAppDetailResp(request);
structAuthCheck(appDetailResp, queryStructReq);
return queryService.queryByStruct(queryStructReq, User.getAppUser(appDetailResp.getId()));
}
@Override
@ApiHeaderCheck
public Object metaQuery(MetaQueryApiReq metaQueryApiReq, HttpServletRequest request) {
AppDetailResp appDetailResp = getAppDetailResp(request);
MetaFilter metaFilter = new MetaFilter();
metaFilter.setIds(metaQueryApiReq.getIds());
if (ApiItemType.METRIC.equals(metaQueryApiReq.getType())) {
authCheck(appDetailResp, metaQueryApiReq.getIds(), ApiItemType.METRIC);
return metricService.getMetrics(metaFilter);
} else if (ApiItemType.DIMENSION.equals(metaQueryApiReq.getType())) {
authCheck(appDetailResp, metaQueryApiReq.getIds(), ApiItemType.DIMENSION);
return dimensionService.getDimensions(metaFilter);
} else if (ApiItemType.TAG.equals(metaQueryApiReq.getType())) {
throw new InvalidArgumentException("标签元数据类型正在支持中");
}
throw new InvalidArgumentException("不支持的元数据类型:" + metaQueryApiReq.getType());
}
private ApiQuerySingleResult dataQuery(Integer appId, Item item, DateConf dateConf) throws Exception {
MetricResp metricResp = metricService.getMetric(item.getId());
List<Item> items = item.getRelateItems();
List<DimensionResp> dimensionResps = Lists.newArrayList();
if (!CollectionUtils.isEmpty(items)) {
List<Long> ids = items.stream().map(Item::getId).collect(Collectors.toList());
DimensionFilter dimensionFilter = new DimensionFilter();
dimensionFilter.setIds(ids);
dimensionResps = dimensionService.getDimensions(dimensionFilter);
}
QueryStructReq queryStructReq = buildQueryStructReq(dimensionResps, metricResp, dateConf);
QueryResultWithSchemaResp queryResultWithSchemaResp =
queryService.queryByStruct(queryStructReq, User.getAppUser(appId));
ApiQuerySingleResult apiQuerySingleResult = new ApiQuerySingleResult();
apiQuerySingleResult.setItem(item);
apiQuerySingleResult.setResult(queryResultWithSchemaResp);
return apiQuerySingleResult;
}
private AppDetailResp getAppDetailResp(HttpServletRequest request) {
int appId = Integer.parseInt(request.getHeader(ApiHeaderCheckAspect.APPID));
return appService.getApp(appId);
}
private void authCheck(AppDetailResp appDetailResp, List<Long> ids, ApiItemType type) {
Set<Long> idsInApp = appDetailResp.getConfig().getAllItems().stream()
.filter(item -> type.equals(item.getType())).map(Item::getId).collect(Collectors.toSet());
if (!idsInApp.containsAll(ids)) {
throw new InvalidArgumentException("查询范围超过应用申请范围, 请检查");
}
}
private void structAuthCheck(AppDetailResp appDetailResp, QueryStructReq queryStructReq) {
List<Long> metricIdsToQuery = metricService.getMetrics(new MetaFilter(queryStructReq.getModelIds()))
.stream().filter(metricResp -> queryStructReq.getMetrics().contains(metricResp.getBizName()))
.map(MetricResp::getId).collect(Collectors.toList());
List<Long> dimensionIdsToQuery = dimensionService.getDimensions(new MetaFilter(queryStructReq.getModelIds()))
.stream().filter(dimensionResp -> queryStructReq.getGroups().contains(dimensionResp.getBizName()))
.map(DimensionResp::getId).collect(Collectors.toList());
authCheck(appDetailResp, metricIdsToQuery, ApiItemType.METRIC);
authCheck(appDetailResp, dimensionIdsToQuery, ApiItemType.DIMENSION);
}
private QueryStructReq buildQueryStructReq(List<DimensionResp> dimensionResps,
MetricResp metricResp, DateConf dateConf) {
Set<Long> modelIds = dimensionResps.stream().map(DimensionResp::getModelId).collect(Collectors.toSet());
modelIds.add(metricResp.getModelId());
QueryStructReq queryStructReq = new QueryStructReq();
queryStructReq.setGroups(dimensionResps.stream()
.map(DimensionResp::getBizName).collect(Collectors.toList()));
queryStructReq.getGroups().add(0, getTimeDimension(dateConf));
Aggregator aggregator = new Aggregator();
aggregator.setColumn(metricResp.getBizName());
queryStructReq.setAggregators(Lists.newArrayList(aggregator));
queryStructReq.setDateInfo(dateConf);
queryStructReq.setModelIds(modelIds);
queryStructReq.setLimit(result_size);
return queryStructReq;
}
private String getTimeDimension(DateConf dateConf) {
if (Constants.MONTH.equals(dateConf.getPeriod())) {
return TimeDimensionEnum.MONTH.getName();
} else if (Constants.WEEK.equals(dateConf.getPeriod())) {
return TimeDimensionEnum.WEEK.getName();
} else {
return TimeDimensionEnum.DAY.getName();
}
}
}

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.enums;
package com.tencent.supersonic.headless.common.core.enums;
public enum AggOption {
NATIVE,

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.enums;
package com.tencent.supersonic.headless.common.core.enums;
public enum QueryOptMode {

View File

@@ -1,7 +1,7 @@
package com.tencent.supersonic.headless.common.model.enums;
package com.tencent.supersonic.headless.common.core.enums;
public enum QueryTypeBackEnum {
public enum QueryTypeBack {
NORMAL("NORMAL", 0),
PRE_FLUSH("PRE_FLUSH", 1);
@@ -9,13 +9,13 @@ public enum QueryTypeBackEnum {
private String value;
private Integer state;
QueryTypeBackEnum(String value, Integer state) {
QueryTypeBack(String value, Integer state) {
this.value = value;
this.state = state;
}
public static QueryTypeBackEnum of(String src) {
for (QueryTypeBackEnum operatorEnum : QueryTypeBackEnum.values()) {
public static QueryTypeBack of(String src) {
for (QueryTypeBack operatorEnum : QueryTypeBack.values()) {
if (src.toUpperCase().contains(operatorEnum.value)) {
return operatorEnum;
}

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.pojo;
package com.tencent.supersonic.headless.common.core.pojo;
import lombok.Data;

View File

@@ -1,9 +1,10 @@
package com.tencent.supersonic.headless.common.query.pojo;
package com.tencent.supersonic.headless.common.core.pojo;
import com.tencent.supersonic.headless.common.query.enums.AggOption;
import java.util.List;
import com.tencent.supersonic.headless.common.core.enums.AggOption;
import lombok.Data;
import java.util.List;
@Data
public class MetricTable {

View File

@@ -1,9 +1,9 @@
package com.tencent.supersonic.headless.common.query.pojo;
import javax.validation.constraints.NotBlank;
package com.tencent.supersonic.headless.common.core.pojo;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class Param {

View File

@@ -0,0 +1,15 @@
package com.tencent.supersonic.headless.common.core.pojo;
import com.tencent.supersonic.headless.common.server.pojo.Item;
import com.tencent.supersonic.headless.common.server.response.QueryResultWithSchemaResp;
import lombok.Data;
@Data
public class SingleItemQueryResult {
private Item item;
private QueryResultWithSchemaResp result;
}

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.request;
package com.tencent.supersonic.headless.common.core.request;
import com.tencent.supersonic.common.pojo.DateConf;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.request;
package com.tencent.supersonic.headless.common.core.request;
import lombok.Data;

View File

@@ -1,6 +1,6 @@
package com.tencent.supersonic.headless.common.query.request;
package com.tencent.supersonic.headless.common.core.request;
import com.tencent.supersonic.headless.common.model.enums.QueryTypeEnum;
import com.tencent.supersonic.headless.common.server.enums.QueryType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -14,7 +14,7 @@ import lombok.ToString;
@NoArgsConstructor
public class ExplainSqlReq<T> {
private QueryTypeEnum queryTypeEnum;
private QueryType queryTypeEnum;
private T queryReq;
}

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.request;
package com.tencent.supersonic.headless.common.core.request;
import java.util.List;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.request;
package com.tencent.supersonic.headless.common.core.request;
import com.tencent.supersonic.common.pojo.enums.ApiItemType;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.request;
package com.tencent.supersonic.headless.common.core.request;
import com.tencent.supersonic.common.pojo.ColumnOrder;
import java.util.List;

View File

@@ -1,6 +1,6 @@
package com.tencent.supersonic.headless.common.query.request;
package com.tencent.supersonic.headless.common.core.request;
import com.tencent.supersonic.headless.common.query.pojo.MetricTable;
import com.tencent.supersonic.headless.common.core.pojo.MetricTable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.request;
package com.tencent.supersonic.headless.common.core.request;
import com.tencent.supersonic.common.pojo.DateConf;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.request;
package com.tencent.supersonic.headless.common.core.request;
import com.tencent.supersonic.common.pojo.DateConf;
import lombok.Data;
@@ -7,11 +7,14 @@ import javax.validation.constraints.NotEmpty;
import java.util.List;
@Data
public class QueryApiReq {
public class QueryItemReq {
@NotEmpty(message = "ids不可为空")
private List<Long> ids;
private DateConf dateConf = new DateConf();
//result size of single id
private Long limit;
}

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.request;
package com.tencent.supersonic.headless.common.core.request;
import com.alibaba.fastjson.JSONObject;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.request;
package com.tencent.supersonic.headless.common.core.request;
import com.google.common.collect.Lists;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.request;
package com.tencent.supersonic.headless.common.core.request;
import com.google.common.collect.Lists;
import com.tencent.supersonic.common.pojo.Aggregator;
@@ -12,8 +12,8 @@ import com.tencent.supersonic.common.util.ContextUtils;
import com.tencent.supersonic.common.util.DateModeUtils;
import com.tencent.supersonic.common.util.SqlFilterUtils;
import com.tencent.supersonic.common.util.jsqlparser.SqlParserAddHelper;
import com.tencent.supersonic.headless.common.query.pojo.Cache;
import com.tencent.supersonic.headless.common.query.pojo.Param;
import com.tencent.supersonic.headless.common.core.pojo.Cache;
import com.tencent.supersonic.headless.common.core.pojo.Param;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;

View File

@@ -0,0 +1,15 @@
package com.tencent.supersonic.headless.common.core.response;
import com.tencent.supersonic.headless.common.core.pojo.SingleItemQueryResult;
import lombok.Builder;
import lombok.Data;
import java.util.List;
@Data
@Builder
public class ItemQueryResultResp {
private List<SingleItemQueryResult> results;
}

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.query.response;
package com.tencent.supersonic.headless.common.core.response;
import lombok.Data;
import lombok.NoArgsConstructor;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.core.response;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@@ -1,6 +1,6 @@
package com.tencent.supersonic.headless.common.model.enums;
package com.tencent.supersonic.headless.common.server.enums;
public enum AppStatusEnum {
public enum AppStatus {
INIT(0),
ONLINE(1),
@@ -10,7 +10,7 @@ public enum AppStatusEnum {
private Integer code;
AppStatusEnum(Integer code) {
AppStatus(Integer code) {
this.code = code;
}
@@ -18,12 +18,12 @@ public enum AppStatusEnum {
return code;
}
public static AppStatusEnum fromCode(Integer code) {
for (AppStatusEnum appStatusEnum : AppStatusEnum.values()) {
public static AppStatus fromCode(Integer code) {
for (AppStatus appStatusEnum : AppStatus.values()) {
if (appStatusEnum.getCode().equals(code)) {
return appStatusEnum;
}
}
return AppStatusEnum.UNKNOWN;
return AppStatus.UNKNOWN;
}
}

View File

@@ -1,11 +1,11 @@
package com.tencent.supersonic.headless.common.model.enums;
package com.tencent.supersonic.headless.common.server.enums;
import com.tencent.supersonic.common.pojo.Constants;
import java.util.HashSet;
import java.util.Set;
public enum DataTypeEnum {
public enum DataType {
MYSQL("mysql", "mysql", "com.mysql.cj.jdbc.Driver", "`", "`", "'", "'"),
@@ -50,8 +50,8 @@ public enum DataTypeEnum {
private String aliasPrefix;
private String aliasSuffix;
DataTypeEnum(String feature, String desc, String driver, String keywordPrefix, String keywordSuffix,
String aliasPrefix, String aliasSuffix) {
DataType(String feature, String desc, String driver, String keywordPrefix, String keywordSuffix,
String aliasPrefix, String aliasSuffix) {
this.feature = feature;
this.desc = desc;
this.driver = driver;
@@ -61,9 +61,9 @@ public enum DataTypeEnum {
this.aliasSuffix = aliasSuffix;
}
public static DataTypeEnum urlOf(String jdbcUrl) throws RuntimeException {
public static DataType urlOf(String jdbcUrl) throws RuntimeException {
String url = jdbcUrl.toLowerCase().trim();
for (DataTypeEnum dataTypeEnum : values()) {
for (DataType dataTypeEnum : values()) {
if (url.startsWith(String.format(Constants.JDBC_PREFIX_FORMATTER, dataTypeEnum.feature))) {
return dataTypeEnum;
}
@@ -73,7 +73,7 @@ public enum DataTypeEnum {
public static Set<String> getAllSupportedDatasourceNameSet() {
Set<String> datasourceSet = new HashSet<>();
for (DataTypeEnum datasource : values()) {
for (DataType datasource : values()) {
datasourceSet.add(datasource.getFeature());
}
return datasourceSet;

View File

@@ -0,0 +1,9 @@
package com.tencent.supersonic.headless.common.server.enums;
public enum DimensionType {
categorical,
time
}

View File

@@ -0,0 +1,8 @@
package com.tencent.supersonic.headless.common.server.enums;
public enum IdentifyType {
primary,
foreign,
}

View File

@@ -0,0 +1,9 @@
package com.tencent.supersonic.headless.common.server.enums;
public enum MetricType {
ATOMIC,
DERIVED
}

View File

@@ -1,14 +1,14 @@
package com.tencent.supersonic.headless.common.model.enums;
package com.tencent.supersonic.headless.common.server.enums;
import java.util.Objects;
public enum ModelSourceTypeEnum {
public enum ModelSourceType {
FULL,
PARTITION,
ZIPPER;
public static ModelSourceTypeEnum of(String src) {
for (ModelSourceTypeEnum modelSourceTypeEnum : ModelSourceTypeEnum.values()) {
public static ModelSourceType of(String src) {
for (ModelSourceType modelSourceTypeEnum : ModelSourceType.values()) {
if (Objects.nonNull(src) && src.equalsIgnoreCase(modelSourceTypeEnum.name())) {
return modelSourceTypeEnum;
}
@@ -16,12 +16,12 @@ public enum ModelSourceTypeEnum {
return null;
}
public static boolean isZipper(ModelSourceTypeEnum modelSourceTypeEnum) {
public static boolean isZipper(ModelSourceType modelSourceTypeEnum) {
return Objects.nonNull(modelSourceTypeEnum) && ZIPPER.equals(modelSourceTypeEnum);
}
public static boolean isZipper(String str) {
ModelSourceTypeEnum modelSourceTypeEnum = of(str);
ModelSourceType modelSourceTypeEnum = of(str);
return Objects.nonNull(modelSourceTypeEnum) && isZipper(modelSourceTypeEnum);
}
}

View File

@@ -1,19 +1,19 @@
package com.tencent.supersonic.headless.common.model.enums;
package com.tencent.supersonic.headless.common.server.enums;
public enum QueryTypeEnum {
public enum QueryType {
SQL("SQL"),
STRUCT("STRUCT");
private String value;
QueryTypeEnum(String value) {
QueryType(String value) {
this.value = value;
}
public static QueryTypeEnum of(String src) {
for (QueryTypeEnum operatorEnum : QueryTypeEnum.values()) {
public static QueryType of(String src) {
for (QueryType operatorEnum : QueryType.values()) {
if (src.toUpperCase().contains(operatorEnum.value)) {
return operatorEnum;
}

View File

@@ -0,0 +1,10 @@
package com.tencent.supersonic.headless.common.server.enums;
public enum SemanticType {
CATEGORY,
ID,
DATE,
NUMBER
}

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import com.google.common.collect.Lists;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import com.tencent.supersonic.common.pojo.Constants;
import lombok.AllArgsConstructor;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import com.google.common.collect.Lists;
import com.tencent.supersonic.common.pojo.enums.ApiItemType;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import java.util.List;
import lombok.AllArgsConstructor;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import com.tencent.supersonic.common.pojo.RecordInfo;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import java.util.List;
import com.google.common.collect.Lists;

View File

@@ -1,7 +1,7 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import com.google.common.collect.Lists;
import com.tencent.supersonic.headless.common.model.enums.DimensionTypeEnum;
import com.tencent.supersonic.headless.common.server.enums.DimensionType;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
@@ -37,7 +37,7 @@ public class ModelDetail {
return Lists.newArrayList();
}
return dimensions.stream()
.filter(dim -> DimensionTypeEnum.time.name().equalsIgnoreCase(dim.getType()))
.filter(dim -> DimensionType.time.name().equalsIgnoreCase(dim.getType()))
.collect(Collectors.toList());
}

View File

@@ -1,10 +1,11 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import lombok.Data;
import lombok.ToString;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import lombok.ToString;
@Data
@ToString

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.pojo;
package com.tencent.supersonic.headless.common.server.pojo;
import com.google.common.base.Objects;
import com.tencent.supersonic.common.pojo.RecordInfo;

View File

@@ -1,9 +1,9 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import com.google.common.collect.Lists;
import com.tencent.supersonic.common.pojo.PageBaseReq;
import com.tencent.supersonic.headless.common.model.enums.AppStatusEnum;
import com.tencent.supersonic.headless.common.server.enums.AppStatus;
import lombok.Data;
import org.springframework.util.CollectionUtils;
@@ -15,7 +15,7 @@ public class AppQueryReq extends PageBaseReq {
private String name;
private List<AppStatusEnum> appStatus;
private List<AppStatus> appStatus;
private String createdBy;
@@ -23,7 +23,7 @@ public class AppQueryReq extends PageBaseReq {
if (CollectionUtils.isEmpty(appStatus)) {
return Lists.newArrayList();
}
return appStatus.stream().map(AppStatusEnum::getCode).collect(Collectors.toList());
return appStatus.stream().map(AppStatus::getCode).collect(Collectors.toList());
}
}

View File

@@ -1,7 +1,7 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import com.tencent.supersonic.common.pojo.RecordInfo;
import com.tencent.supersonic.headless.common.model.pojo.AppConfig;
import com.tencent.supersonic.headless.common.server.pojo.AppConfig;
import lombok.Data;
import org.springframework.util.CollectionUtils;

View File

@@ -1,7 +1,7 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import com.google.common.collect.Lists;
import com.tencent.supersonic.headless.common.model.enums.DataTypeEnum;
import com.tencent.supersonic.headless.common.server.enums.DataType;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
@@ -46,7 +46,7 @@ public class DatabaseReq {
} else {
databaseUrl = "/" + database;
}
if (type.equalsIgnoreCase(DataTypeEnum.MYSQL.getFeature())) {
if (type.equalsIgnoreCase(DataType.MYSQL.getFeature())) {
return String.format("jdbc:%s://%s:%s%s?sessionVariables=sql_mode='IGNORE_SPACE'&allowMultiQueries=true",
type, host, port, databaseUrl);
}

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import java.util.ArrayList;
import java.util.List;

View File

@@ -1,8 +1,8 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import com.tencent.supersonic.common.pojo.enums.DataTypeEnums;
import com.tencent.supersonic.headless.common.model.pojo.DimValueMap;
import com.tencent.supersonic.headless.common.model.pojo.SchemaItem;
import com.tencent.supersonic.headless.common.server.pojo.DimValueMap;
import com.tencent.supersonic.headless.common.server.pojo.SchemaItem;
import lombok.Data;
import javax.validation.constraints.NotNull;

View File

@@ -1,7 +1,7 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import com.tencent.supersonic.headless.common.model.pojo.SchemaItem;
import com.tencent.supersonic.headless.common.server.pojo.SchemaItem;
import lombok.Data;
import java.util.ArrayList;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import lombok.Data;
import java.util.List;

View File

@@ -1,8 +1,8 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import com.tencent.supersonic.common.pojo.DataFormat;
import com.tencent.supersonic.headless.common.model.pojo.RelateDimension;
import com.tencent.supersonic.headless.common.model.pojo.SchemaItem;
import com.tencent.supersonic.headless.common.server.pojo.RelateDimension;
import com.tencent.supersonic.headless.common.server.pojo.SchemaItem;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;

View File

@@ -1,28 +1,28 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import com.tencent.supersonic.headless.common.model.enums.MetricTypeEnum;
import com.tencent.supersonic.headless.common.model.pojo.Measure;
import com.tencent.supersonic.headless.common.model.pojo.MetricTypeParams;
import com.tencent.supersonic.headless.common.server.enums.MetricType;
import com.tencent.supersonic.headless.common.server.pojo.Measure;
import com.tencent.supersonic.headless.common.server.pojo.MetricTypeParams;
import lombok.Data;
import java.util.List;
@Data
public class MetricReq extends MetricBaseReq {
private MetricTypeEnum metricType;
private MetricType metricType;
private MetricTypeParams typeParams;
public MetricTypeEnum getMetricType() {
public MetricType getMetricType() {
if (metricType != null) {
return metricType;
}
List<Measure> measureList = typeParams.getMeasures();
if (measureList.size() == 1 && typeParams.getExpr().trim().equalsIgnoreCase(measureList.get(0).getBizName())) {
return MetricTypeEnum.ATOMIC;
return MetricType.ATOMIC;
} else if (measureList.size() >= 1) {
return MetricTypeEnum.DERIVED;
return MetricType.DERIVED;
}
throw new RuntimeException("measure can not be none");
}

View File

@@ -1,11 +1,11 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import com.google.common.collect.Lists;
import com.tencent.supersonic.headless.common.model.pojo.Dim;
import com.tencent.supersonic.headless.common.model.pojo.DrillDownDimension;
import com.tencent.supersonic.headless.common.model.pojo.ModelDetail;
import com.tencent.supersonic.headless.common.model.pojo.SchemaItem;
import com.tencent.supersonic.headless.common.server.pojo.Dim;
import com.tencent.supersonic.headless.common.server.pojo.DrillDownDimension;
import com.tencent.supersonic.headless.common.server.pojo.ModelDetail;
import com.tencent.supersonic.headless.common.server.pojo.SchemaItem;
import lombok.Data;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import com.google.common.collect.Lists;
import com.tencent.supersonic.common.pojo.PageBaseReq;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import javax.validation.constraints.NotBlank;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.request;
package com.tencent.supersonic.headless.common.server.request;
import java.util.Date;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import lombok.Data;

View File

@@ -1,10 +1,10 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import com.google.common.collect.Lists;
import com.tencent.supersonic.common.pojo.RecordInfo;
import com.tencent.supersonic.headless.common.model.enums.AppStatusEnum;
import com.tencent.supersonic.headless.common.model.pojo.AppConfig;
import com.tencent.supersonic.headless.common.server.enums.AppStatus;
import com.tencent.supersonic.headless.common.server.pojo.AppConfig;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
@@ -21,7 +21,7 @@ public class AppResp extends RecordInfo {
private String description;
private AppStatusEnum appStatus;
private AppStatus appStatus;
private AppConfig config;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.google.common.collect.Lists;
import com.tencent.supersonic.common.pojo.RecordInfo;
import lombok.AllArgsConstructor;
@@ -10,6 +7,10 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Data
@AllArgsConstructor

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import lombok.Data;
import lombok.ToString;

View File

@@ -1,9 +1,9 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import com.tencent.supersonic.common.pojo.enums.DataTypeEnums;
import com.tencent.supersonic.headless.common.model.pojo.DimValueMap;
import com.tencent.supersonic.headless.common.model.pojo.SchemaItem;
import com.tencent.supersonic.headless.common.server.pojo.DimValueMap;
import com.tencent.supersonic.headless.common.server.pojo.SchemaItem;
import lombok.Data;
import lombok.ToString;

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import com.tencent.supersonic.headless.common.model.pojo.Entity;
import com.tencent.supersonic.headless.common.model.pojo.SchemaItem;
import com.tencent.supersonic.headless.common.server.pojo.Entity;
import com.tencent.supersonic.headless.common.server.pojo.SchemaItem;
import lombok.Data;
import lombok.ToString;
import java.util.List;
import java.util.Objects;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class DomainResp extends SchemaItem {

View File

@@ -1,12 +1,13 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;
@Data
@ToString
@Builder

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import lombok.Data;

View File

@@ -1,14 +1,14 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.tencent.supersonic.common.pojo.DataFormat;
import com.tencent.supersonic.headless.common.model.pojo.DrillDownDimension;
import com.tencent.supersonic.headless.common.model.pojo.Measure;
import com.tencent.supersonic.headless.common.model.pojo.MetricTypeParams;
import com.tencent.supersonic.headless.common.model.pojo.RelateDimension;
import com.tencent.supersonic.headless.common.model.pojo.SchemaItem;
import com.tencent.supersonic.headless.common.server.pojo.DrillDownDimension;
import com.tencent.supersonic.headless.common.server.pojo.Measure;
import com.tencent.supersonic.headless.common.server.pojo.MetricTypeParams;
import com.tencent.supersonic.headless.common.server.pojo.RelateDimension;
import com.tencent.supersonic.headless.common.server.pojo.SchemaItem;
import lombok.Data;
import lombok.ToString;
import org.apache.commons.collections.CollectionUtils;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import lombok.Data;
import lombok.ToString;

View File

@@ -1,11 +1,11 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import com.google.common.collect.Lists;
import com.tencent.supersonic.headless.common.model.pojo.Dim;
import com.tencent.supersonic.headless.common.model.pojo.DrillDownDimension;
import com.tencent.supersonic.headless.common.model.pojo.Identify;
import com.tencent.supersonic.headless.common.model.pojo.ModelDetail;
import com.tencent.supersonic.headless.common.model.pojo.SchemaItem;
import com.tencent.supersonic.headless.common.server.pojo.Dim;
import com.tencent.supersonic.headless.common.server.pojo.DrillDownDimension;
import com.tencent.supersonic.headless.common.server.pojo.Identify;
import com.tencent.supersonic.headless.common.server.pojo.ModelDetail;
import com.tencent.supersonic.headless.common.server.pojo.SchemaItem;
import lombok.Data;
import org.springframework.util.CollectionUtils;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import lombok.Data;

View File

@@ -1,7 +1,7 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import com.tencent.supersonic.common.pojo.ModelRela;
import com.tencent.supersonic.headless.common.model.pojo.Identify;
import com.tencent.supersonic.headless.common.server.pojo.Identify;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

View File

@@ -1,11 +1,11 @@
package com.tencent.supersonic.headless.common.model.response;
package com.tencent.supersonic.headless.common.server.response;
import com.google.common.collect.Lists;
import com.tencent.supersonic.common.pojo.QueryAuthorization;
import com.tencent.supersonic.common.pojo.QueryColumn;
import com.tencent.supersonic.headless.common.model.enums.SemanticTypeEnum;
import com.tencent.supersonic.headless.common.model.pojo.QueryResult;
import com.tencent.supersonic.headless.common.server.enums.SemanticType;
import com.tencent.supersonic.headless.common.server.pojo.QueryResult;
import lombok.Data;
import lombok.ToString;
import java.util.List;
@@ -22,13 +22,13 @@ public class QueryResultWithSchemaResp extends QueryResult<Map<String, Object>>
public List<QueryColumn> getMetricColumns() {
return columns.stream()
.filter(queryColumn -> SemanticTypeEnum.NUMBER.name().equals(queryColumn.getShowType()))
.filter(queryColumn -> SemanticType.NUMBER.name().equals(queryColumn.getShowType()))
.collect(Collectors.toList());
}
public List<QueryColumn> getDimensionColumns() {
return columns.stream()
.filter(queryColumn -> !SemanticTypeEnum.NUMBER.name().equals(queryColumn.getShowType()))
.filter(queryColumn -> !SemanticType.NUMBER.name().equals(queryColumn.getShowType()))
.collect(Collectors.toList());
}
}

View File

@@ -1,69 +0,0 @@
<?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>headless</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>headless-common</artifactId>
<dependencies>
<!-- <dependency>-->
<!-- <groupId>ru.yandex.clickhouse</groupId>-->
<!-- <artifactId>clickhouse-jdbc</artifactId>-->
<!-- <version>${clickhouse.jdbc.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>${clickhouse.jdbc.version}</version>
<!-- use uber jar with all dependencies included, change classifier to http for smaller jar -->
<classifier>all</classifier>
</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.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>auth-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

View File

@@ -1,10 +0,0 @@
package com.tencent.supersonic.headless.common.model.enums;
public enum DimensionTypeEnum {
categorical,
time
}

View File

@@ -1,9 +0,0 @@
package com.tencent.supersonic.headless.common.model.enums;
public enum IdentifyTypeEnum {
primary,
foreign,
}

View File

@@ -1,9 +0,0 @@
package com.tencent.supersonic.headless.common.model.enums;
public enum MetricTypeEnum {
ATOMIC,
DERIVED
}

View File

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

View File

@@ -1,10 +0,0 @@
package com.tencent.supersonic.headless.common.model.enums;
public enum SemanticTypeEnum {
CATEGORY,
ID,
DATE,
NUMBER
}

View File

@@ -1,19 +0,0 @@
package com.tencent.supersonic.headless.common.model.pojo;
import com.tencent.supersonic.common.pojo.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

@@ -1,15 +0,0 @@
package com.tencent.supersonic.headless.common.query.pojo;
import com.tencent.supersonic.headless.common.model.pojo.Item;
import com.tencent.supersonic.headless.common.model.response.QueryResultWithSchemaResp;
import lombok.Data;
@Data
public class ApiQuerySingleResult {
private Item item;
private QueryResultWithSchemaResp result;
}

View File

@@ -1,16 +0,0 @@
package com.tencent.supersonic.headless.common.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

@@ -1,14 +0,0 @@
package com.tencent.supersonic.headless.common.query.request;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.headless.common.model.pojo.Item;
import lombok.Data;
@Data
public class QueryApiPreviewReq {
private Item item;
private DateConf dateConf = new DateConf();
}

View File

@@ -1,15 +0,0 @@
package com.tencent.supersonic.headless.common.query.response;
import com.tencent.supersonic.headless.common.query.pojo.ApiQuerySingleResult;
import lombok.Builder;
import lombok.Data;
import java.util.List;
@Data
@Builder
public class ApiQueryResultResp {
private List<ApiQuerySingleResult> results;
}

View File

@@ -9,7 +9,7 @@
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>headless-query</artifactId>
<artifactId>headless-core</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
@@ -38,7 +38,7 @@
</dependency>
<dependency>
<groupId>com.tencent.supersonic</groupId>
<artifactId>headless-common</artifactId>
<artifactId>headless-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
@@ -62,7 +62,7 @@
</dependency>
<dependency>
<groupId>com.tencent.supersonic</groupId>
<artifactId>headless-model</artifactId>
<artifactId>headless-server</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.api.annotation;
package com.tencent.supersonic.headless.core.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.query.annotation;
package com.tencent.supersonic.headless.core.annotation;
import java.lang.annotation.Target;
import java.lang.annotation.RetentionPolicy;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.query.annotation;
package com.tencent.supersonic.headless.core.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;

View File

@@ -1,11 +1,11 @@
package com.tencent.supersonic.headless.api.aspect;
package com.tencent.supersonic.headless.core.aspect;
import com.tencent.supersonic.common.pojo.Pair;
import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
import com.tencent.supersonic.common.util.SignatureUtils;
import com.tencent.supersonic.headless.api.service.AppService;
import com.tencent.supersonic.headless.common.model.enums.AppStatusEnum;
import com.tencent.supersonic.headless.common.model.response.AppDetailResp;
import com.tencent.supersonic.headless.common.server.enums.AppStatus;
import com.tencent.supersonic.headless.common.server.response.AppDetailResp;
import com.tencent.supersonic.headless.server.service.AppService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
@@ -33,7 +33,7 @@ public class ApiHeaderCheckAspect {
@Autowired
private AppService appService;
@Pointcut("@annotation(com.tencent.supersonic.headless.api.annotation.ApiHeaderCheck)")
@Pointcut("@annotation(com.tencent.supersonic.headless.core.annotation.ApiHeaderCheck)")
private void apiPermissionCheck() {
}
@@ -62,7 +62,7 @@ public class ApiHeaderCheckAspect {
if (appDetailResp == null) {
throw new InvalidArgumentException("该appId对应的应用不存在");
}
if (!AppStatusEnum.ONLINE.equals(appDetailResp.getAppStatus())) {
if (!AppStatus.ONLINE.equals(appDetailResp.getAppStatus())) {
throw new InvalidArgumentException("该应用暂时为非在线状态");
}
Pair<Boolean, String> checkResult = SignatureUtils.isValidSignature(appId, appDetailResp.getAppSecret(),

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.query.service;
package com.tencent.supersonic.headless.core.aspect;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -16,14 +16,14 @@ import com.tencent.supersonic.common.pojo.QueryColumn;
import com.tencent.supersonic.common.pojo.enums.AuthType;
import com.tencent.supersonic.common.pojo.enums.SensitiveLevelEnum;
import com.tencent.supersonic.common.pojo.exception.InvalidPermissionException;
import com.tencent.supersonic.headless.common.model.response.DimensionResp;
import com.tencent.supersonic.headless.common.model.response.MetricResp;
import com.tencent.supersonic.headless.common.model.response.ModelResp;
import com.tencent.supersonic.headless.common.model.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.headless.model.domain.DimensionService;
import com.tencent.supersonic.headless.model.domain.MetricService;
import com.tencent.supersonic.headless.model.domain.ModelService;
import com.tencent.supersonic.headless.model.domain.pojo.MetaFilter;
import com.tencent.supersonic.headless.common.server.response.DimensionResp;
import com.tencent.supersonic.headless.common.server.response.MetricResp;
import com.tencent.supersonic.headless.common.server.response.ModelResp;
import com.tencent.supersonic.headless.common.server.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.headless.server.pojo.MetaFilter;
import com.tencent.supersonic.headless.server.service.DimensionService;
import com.tencent.supersonic.headless.server.service.MetricService;
import com.tencent.supersonic.headless.server.service.ModelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -41,7 +41,7 @@ import java.util.stream.Collectors;
@Service
@Slf4j
public class AuthCommonService {
public class AuthCheckBaseAspect {
private static final ObjectMapper MAPPER = new ObjectMapper().setDateFormat(
new SimpleDateFormat(Constants.DAY_FORMAT));
@Autowired

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.headless.query.utils;
package com.tencent.supersonic.headless.core.aspect;
import com.google.common.collect.Lists;
import com.tencent.supersonic.common.pojo.Filter;
@@ -8,13 +8,13 @@ import com.tencent.supersonic.common.util.JsonUtil;
import com.tencent.supersonic.common.util.jsqlparser.FieldExpression;
import com.tencent.supersonic.common.util.jsqlparser.SqlParserReplaceHelper;
import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper;
import com.tencent.supersonic.headless.common.model.pojo.DimValueMap;
import com.tencent.supersonic.headless.common.model.response.DimensionResp;
import com.tencent.supersonic.headless.common.model.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.headless.common.query.request.QueryS2SQLReq;
import com.tencent.supersonic.headless.common.query.request.QueryStructReq;
import com.tencent.supersonic.headless.model.domain.DimensionService;
import com.tencent.supersonic.headless.model.domain.pojo.MetaFilter;
import com.tencent.supersonic.headless.common.core.request.QueryS2SQLReq;
import com.tencent.supersonic.headless.common.core.request.QueryStructReq;
import com.tencent.supersonic.headless.common.server.pojo.DimValueMap;
import com.tencent.supersonic.headless.common.server.response.DimensionResp;
import com.tencent.supersonic.headless.common.server.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.headless.server.pojo.MetaFilter;
import com.tencent.supersonic.headless.server.service.DimensionService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.util.Strings;
@@ -47,7 +47,7 @@ public class DimValueAspect {
@Autowired
private DimensionService dimensionService;
@Around("execution(* com.tencent.supersonic.headless.query.service.QueryServiceImpl.queryBySql(..))")
@Around("execution(* com.tencent.supersonic.headless.core.service.impl.QueryServiceImpl.queryBySql(..))")
public Object handleSqlDimValue(ProceedingJoinPoint joinPoint) throws Throwable {
if (!dimensionValueMapSqlEnable) {
log.debug("sql dimensionValueMapEnable is false, skip dimensionValueMap");
@@ -133,9 +133,9 @@ public class DimValueAspect {
filedNameToValueMap.put(fieldName, map);
}
@Around("execution(* com.tencent.supersonic.headless.query.rest.QueryController.queryByStruct(..))"
+ " || execution(* com.tencent.supersonic.headless.query.service.QueryService.queryByStruct(..))"
+ " || execution(* com.tencent.supersonic.headless.query.service.QueryService.queryByStructWithAuth(..))")
@Around("execution(* com.tencent.supersonic.headless.core.rest.QueryController.queryByStruct(..))"
+ " || execution(* com.tencent.supersonic.headless.core.service.QueryService.queryByStruct(..))"
+ " || execution(* com.tencent.supersonic.headless.core.service.QueryService.queryByStructWithAuth(..))")
public Object handleDimValue(ProceedingJoinPoint joinPoint) throws Throwable {
if (!dimensionValueMapEnable) {

Some files were not shown because too many files have changed in this diff Show More