(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

@@ -27,13 +27,13 @@
</dependency>
<dependency>
<groupId>com.tencent.supersonic</groupId>
<artifactId>headless-query</artifactId>
<artifactId>headless-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.tencent.supersonic</groupId>
<artifactId>headless-model</artifactId>
<artifactId>headless-server</artifactId>
<version>${project.version}</version>
</dependency>

View File

@@ -54,13 +54,13 @@
</dependency>
<dependency>
<groupId>com.tencent.supersonic</groupId>
<artifactId>headless-query</artifactId>
<artifactId>headless-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.tencent.supersonic</groupId>
<artifactId>headless-model</artifactId>
<artifactId>headless-server</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>

View File

@@ -6,18 +6,18 @@ import com.tencent.supersonic.common.pojo.JoinCondition;
import com.tencent.supersonic.common.pojo.ModelRela;
import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum;
import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum;
import com.tencent.supersonic.headless.common.model.enums.DimensionTypeEnum;
import com.tencent.supersonic.headless.common.model.enums.IdentifyTypeEnum;
import com.tencent.supersonic.headless.common.model.pojo.Dim;
import com.tencent.supersonic.headless.common.model.pojo.DimensionTimeTypeParams;
import com.tencent.supersonic.headless.common.model.pojo.Identify;
import com.tencent.supersonic.headless.common.model.pojo.Measure;
import com.tencent.supersonic.headless.common.model.pojo.ModelDetail;
import com.tencent.supersonic.headless.common.model.request.DomainReq;
import com.tencent.supersonic.headless.common.model.request.ModelReq;
import com.tencent.supersonic.headless.model.domain.DomainService;
import com.tencent.supersonic.headless.model.domain.ModelRelaService;
import com.tencent.supersonic.headless.model.domain.ModelService;
import com.tencent.supersonic.headless.common.server.enums.DimensionType;
import com.tencent.supersonic.headless.common.server.enums.IdentifyType;
import com.tencent.supersonic.headless.common.server.pojo.Dim;
import com.tencent.supersonic.headless.common.server.pojo.DimensionTimeTypeParams;
import com.tencent.supersonic.headless.common.server.pojo.Identify;
import com.tencent.supersonic.headless.common.server.pojo.Measure;
import com.tencent.supersonic.headless.common.server.pojo.ModelDetail;
import com.tencent.supersonic.headless.common.server.request.DomainReq;
import com.tencent.supersonic.headless.common.server.request.ModelReq;
import com.tencent.supersonic.headless.server.service.DomainService;
import com.tencent.supersonic.headless.server.service.ModelRelaService;
import com.tencent.supersonic.headless.server.service.ModelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -84,14 +84,14 @@ public class BenchMarkDemoDataLoader {
modelReq.setAdminOrgs(Collections.emptyList());
ModelDetail modelDetail = new ModelDetail();
List<Dim> dimensions = new ArrayList<>();
Dim dimension1 = new Dim("", "imp_date", DimensionTypeEnum.time.name(), 0);
Dim dimension1 = new Dim("", "imp_date", DimensionType.time.name(), 0);
dimension1.setTypeParams(new DimensionTimeTypeParams());
dimensions.add(dimension1);
dimensions.add(new Dim("活跃区域", "most_popular_in", DimensionTypeEnum.categorical.name(), 1));
dimensions.add(new Dim("活跃区域", "most_popular_in", DimensionType.categorical.name(), 1));
modelDetail.setDimensions(dimensions);
List<Identify> identifiers = new ArrayList<>();
identifiers.add(new Identify("音乐类型名称", IdentifyTypeEnum.primary.name(), "g_name"));
identifiers.add(new Identify("音乐类型名称", IdentifyType.primary.name(), "g_name"));
modelDetail.setIdentifiers(identifiers);
List<Measure> measures = new ArrayList<>();
@@ -114,13 +114,13 @@ public class BenchMarkDemoDataLoader {
modelReq.setDatabaseId(1L);
ModelDetail modelDetail = new ModelDetail();
List<Dim> dimensions = new ArrayList<>();
dimensions.add(new Dim("国籍", "country", DimensionTypeEnum.categorical.name(), 1));
dimensions.add(new Dim("性别", "gender", DimensionTypeEnum.categorical.name(), 1));
dimensions.add(new Dim("国籍", "country", DimensionType.categorical.name(), 1));
dimensions.add(new Dim("性别", "gender", DimensionType.categorical.name(), 1));
modelDetail.setDimensions(dimensions);
List<Identify> identifiers = new ArrayList<>();
identifiers.add(new Identify("艺术家名称", IdentifyTypeEnum.primary.name(), "artist_name"));
identifiers.add(new Identify("音乐类型名称", IdentifyTypeEnum.foreign.name(), "g_name"));
identifiers.add(new Identify("艺术家名称", IdentifyType.primary.name(), "artist_name"));
identifiers.add(new Identify("音乐类型名称", IdentifyType.foreign.name(), "g_name"));
modelDetail.setIdentifiers(identifiers);
modelDetail.setMeasures(Collections.emptyList());
@@ -140,13 +140,13 @@ public class BenchMarkDemoDataLoader {
modelReq.setDatabaseId(1L);
ModelDetail modelDetail = new ModelDetail();
List<Dim> dimensions = new ArrayList<>();
dimensions.add(new Dim("持续时间", "duration", DimensionTypeEnum.categorical.name(), 1));
dimensions.add(new Dim("文件格式", "formats", DimensionTypeEnum.categorical.name(), 1));
dimensions.add(new Dim("持续时间", "duration", DimensionType.categorical.name(), 1));
dimensions.add(new Dim("文件格式", "formats", DimensionType.categorical.name(), 1));
modelDetail.setDimensions(dimensions);
List<Identify> identifiers = new ArrayList<>();
identifiers.add(new Identify("歌曲ID", IdentifyTypeEnum.primary.name(), "f_id"));
identifiers.add(new Identify("艺术家名称", IdentifyTypeEnum.foreign.name(), "artist_name"));
identifiers.add(new Identify("歌曲ID", IdentifyType.primary.name(), "f_id"));
identifiers.add(new Identify("艺术家名称", IdentifyType.foreign.name(), "artist_name"));
modelDetail.setIdentifiers(identifiers);
modelDetail.setMeasures(Collections.emptyList());
@@ -166,19 +166,19 @@ public class BenchMarkDemoDataLoader {
modelReq.setDatabaseId(1L);
ModelDetail modelDetail = new ModelDetail();
List<Dim> dimensions = new ArrayList<>();
Dim dimension1 = new Dim("", "imp_date", DimensionTypeEnum.time.name(), 0);
Dim dimension1 = new Dim("", "imp_date", DimensionType.time.name(), 0);
dimension1.setTypeParams(new DimensionTimeTypeParams());
dimensions.add(dimension1);
dimensions.add(new Dim("国家", "country", DimensionTypeEnum.categorical.name(), 1));
dimensions.add(new Dim("语种", "languages", DimensionTypeEnum.categorical.name(), 1));
dimensions.add(new Dim("发行时间", "releasedate", DimensionTypeEnum.categorical.name(), 1));
dimensions.add(new Dim("国家", "country", DimensionType.categorical.name(), 1));
dimensions.add(new Dim("语种", "languages", DimensionType.categorical.name(), 1));
dimensions.add(new Dim("发行时间", "releasedate", DimensionType.categorical.name(), 1));
modelDetail.setDimensions(dimensions);
List<Identify> identifiers = new ArrayList<>();
identifiers.add(new Identify("歌曲名称", IdentifyTypeEnum.primary.name(), "song_name"));
identifiers.add(new Identify("歌曲ID", IdentifyTypeEnum.foreign.name(), "f_id"));
identifiers.add(new Identify("艺术家名称", IdentifyTypeEnum.foreign.name(), "artist_name"));
identifiers.add(new Identify("艺术家名称", IdentifyTypeEnum.foreign.name(), "artist_name"));
identifiers.add(new Identify("歌曲名称", IdentifyType.primary.name(), "song_name"));
identifiers.add(new Identify("歌曲ID", IdentifyType.foreign.name(), "f_id"));
identifiers.add(new Identify("艺术家名称", IdentifyType.foreign.name(), "artist_name"));
identifiers.add(new Identify("艺术家名称", IdentifyType.foreign.name(), "artist_name"));
modelDetail.setIdentifiers(identifiers);

View File

@@ -1,6 +1,6 @@
package com.tencent.supersonic;
import com.tencent.supersonic.headless.model.domain.DomainService;
import com.tencent.supersonic.headless.server.service.DomainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

View File

@@ -12,27 +12,27 @@ import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum;
import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum;
import com.tencent.supersonic.common.pojo.enums.SensitiveLevelEnum;
import com.tencent.supersonic.common.pojo.enums.StatusEnum;
import com.tencent.supersonic.headless.common.model.enums.DataTypeEnum;
import com.tencent.supersonic.headless.common.model.enums.DimensionTypeEnum;
import com.tencent.supersonic.headless.common.model.enums.IdentifyTypeEnum;
import com.tencent.supersonic.headless.common.model.enums.SemanticTypeEnum;
import com.tencent.supersonic.headless.common.model.pojo.Dim;
import com.tencent.supersonic.headless.common.model.pojo.DimensionTimeTypeParams;
import com.tencent.supersonic.headless.common.model.pojo.Identify;
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.ModelDetail;
import com.tencent.supersonic.headless.common.model.request.DatabaseReq;
import com.tencent.supersonic.headless.common.model.request.DimensionReq;
import com.tencent.supersonic.headless.common.model.request.DomainReq;
import com.tencent.supersonic.headless.common.model.request.MetricReq;
import com.tencent.supersonic.headless.common.model.request.ModelReq;
import com.tencent.supersonic.headless.model.domain.DatabaseService;
import com.tencent.supersonic.headless.model.domain.DimensionService;
import com.tencent.supersonic.headless.model.domain.DomainService;
import com.tencent.supersonic.headless.model.domain.MetricService;
import com.tencent.supersonic.headless.model.domain.ModelRelaService;
import com.tencent.supersonic.headless.model.domain.ModelService;
import com.tencent.supersonic.headless.common.server.enums.DataType;
import com.tencent.supersonic.headless.common.server.enums.DimensionType;
import com.tencent.supersonic.headless.common.server.enums.IdentifyType;
import com.tencent.supersonic.headless.common.server.enums.SemanticType;
import com.tencent.supersonic.headless.common.server.pojo.Dim;
import com.tencent.supersonic.headless.common.server.pojo.DimensionTimeTypeParams;
import com.tencent.supersonic.headless.common.server.pojo.Identify;
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.ModelDetail;
import com.tencent.supersonic.headless.common.server.request.DatabaseReq;
import com.tencent.supersonic.headless.common.server.request.DimensionReq;
import com.tencent.supersonic.headless.common.server.request.DomainReq;
import com.tencent.supersonic.headless.common.server.request.MetricReq;
import com.tencent.supersonic.headless.common.server.request.ModelReq;
import com.tencent.supersonic.headless.server.service.DatabaseService;
import com.tencent.supersonic.headless.server.service.DimensionService;
import com.tencent.supersonic.headless.server.service.DomainService;
import com.tencent.supersonic.headless.server.service.MetricService;
import com.tencent.supersonic.headless.server.service.ModelRelaService;
import com.tencent.supersonic.headless.server.service.ModelService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -93,11 +93,11 @@ public class ModelDemoDataLoader {
databaseReq.setName("数据实例");
databaseReq.setDescription("样例数据库实例");
if (StringUtils.isNotBlank(url)
&& url.toLowerCase().contains(DataTypeEnum.MYSQL.getFeature().toLowerCase())) {
databaseReq.setType(DataTypeEnum.MYSQL.getFeature());
&& url.toLowerCase().contains(DataType.MYSQL.getFeature().toLowerCase())) {
databaseReq.setType(DataType.MYSQL.getFeature());
databaseReq.setVersion("5.7");
} else {
databaseReq.setType(DataTypeEnum.H2.getFeature());
databaseReq.setType(DataType.H2.getFeature());
}
databaseReq.setUrl(url);
databaseReq.setUsername(dataSourceProperties.getUsername());
@@ -131,12 +131,12 @@ public class ModelDemoDataLoader {
modelReq.setAdminOrgs(Collections.emptyList());
ModelDetail modelDetail = new ModelDetail();
List<Identify> identifiers = new ArrayList<>();
identifiers.add(new Identify("用户", IdentifyTypeEnum.primary.name(), "user_name"));
identifiers.add(new Identify("用户", IdentifyType.primary.name(), "user_name"));
modelDetail.setIdentifiers(identifiers);
List<Dim> dimensions = new ArrayList<>();
dimensions.add(new Dim("部门", "department",
DimensionTypeEnum.categorical.name(), 1));
DimensionType.categorical.name(), 1));
modelDetail.setDimensions(dimensions);
modelDetail.setMeasures(Collections.emptyList());
@@ -159,14 +159,14 @@ public class ModelDemoDataLoader {
modelReq.setAdminOrgs(Collections.emptyList());
List<Identify> identifiers = new ArrayList<>();
ModelDetail modelDetail = new ModelDetail();
identifiers.add(new Identify("用户名", IdentifyTypeEnum.primary.name(), "s2_pv_uv_statis_user_name"));
identifiers.add(new Identify("用户名", IdentifyType.primary.name(), "s2_pv_uv_statis_user_name"));
modelDetail.setIdentifiers(identifiers);
List<Dim> dimensions = new ArrayList<>();
Dim dimension1 = new Dim("", "imp_date", DimensionTypeEnum.time.name(), 0);
Dim dimension1 = new Dim("", "imp_date", DimensionType.time.name(), 0);
dimension1.setTypeParams(new DimensionTimeTypeParams());
dimensions.add(dimension1);
Dim dimension2 = new Dim("", "page", DimensionTypeEnum.categorical.name(), 0);
Dim dimension2 = new Dim("", "page", DimensionType.categorical.name(), 0);
dimension2.setExpr("page");
dimensions.add(dimension2);
modelDetail.setDimensions(dimensions);
@@ -199,14 +199,14 @@ public class ModelDemoDataLoader {
modelReq.setAdminOrgs(Collections.emptyList());
List<Identify> identifiers = new ArrayList<>();
ModelDetail modelDetail = new ModelDetail();
identifiers.add(new Identify("用户名称", IdentifyTypeEnum.primary.name(), "stay_hours_user_name"));
identifiers.add(new Identify("用户名称", IdentifyType.primary.name(), "stay_hours_user_name"));
modelDetail.setIdentifiers(identifiers);
List<Dim> dimensions = new ArrayList<>();
Dim dimension1 = new Dim("", "imp_date", DimensionTypeEnum.time.name(), 0);
Dim dimension1 = new Dim("", "imp_date", DimensionType.time.name(), 0);
dimension1.setTypeParams(new DimensionTimeTypeParams());
dimensions.add(dimension1);
Dim dimension2 = new Dim("页面", "page", DimensionTypeEnum.categorical.name(), 1);
Dim dimension2 = new Dim("页面", "page", DimensionType.categorical.name(), 1);
dimension2.setExpr("page");
dimensions.add(dimension2);
modelDetail.setDimensions(dimensions);
@@ -274,21 +274,21 @@ public class ModelDemoDataLoader {
modelReq.setAdminOrgs(Collections.emptyList());
ModelDetail modelDetail = new ModelDetail();
List<Identify> identifiers = new ArrayList<>();
Identify identify = new Identify("歌手名", IdentifyTypeEnum.primary.name(), "singer_name");
Identify identify = new Identify("歌手名", IdentifyType.primary.name(), "singer_name");
identify.setEntityNames(Lists.newArrayList("歌手", "艺人"));
identifiers.add(identify);
modelDetail.setIdentifiers(identifiers);
List<Dim> dimensions = new ArrayList<>();
Dim dimension1 = new Dim("", "imp_date", DimensionTypeEnum.time.name(), 0);
Dim dimension1 = new Dim("", "imp_date", DimensionType.time.name(), 0);
dimension1.setTypeParams(new DimensionTimeTypeParams());
dimensions.add(dimension1);
dimensions.add(new Dim("活跃区域", "act_area",
DimensionTypeEnum.categorical.name(), 1, 1));
DimensionType.categorical.name(), 1, 1));
dimensions.add(new Dim("代表作", "song_name",
DimensionTypeEnum.categorical.name(), 1));
DimensionType.categorical.name(), 1));
dimensions.add(new Dim("风格", "genre",
DimensionTypeEnum.categorical.name(), 1, 1));
DimensionType.categorical.name(), 1, 1));
modelDetail.setDimensions(dimensions);
Measure measure1 = new Measure("播放量", "js_play_cnt", "sum", 1);
@@ -305,13 +305,13 @@ public class ModelDemoDataLoader {
public void updateDimension() throws Exception {
DimensionReq dimensionReq = new DimensionReq();
dimensionReq.setModelId(1L);
dimensionReq.setType(DimensionTypeEnum.categorical.name());
dimensionReq.setType(DimensionType.categorical.name());
dimensionReq.setId(4L);
dimensionReq.setName("页面");
dimensionReq.setBizName("page");
dimensionReq.setModelId(3L);
dimensionReq.setAlias("page");
dimensionReq.setSemanticType(SemanticTypeEnum.CATEGORY.name());
dimensionReq.setSemanticType(SemanticType.CATEGORY.name());
dimensionReq.setSensitiveLevel(2);
dimensionReq.setDescription("页面");
dimensionReq.setExpr("page");

View File

@@ -3,15 +3,16 @@ package com.tencent.supersonic.integration.model;
import com.google.common.collect.Lists;
import com.tencent.supersonic.StandaloneLauncher;
import com.tencent.supersonic.common.pojo.enums.SensitiveLevelEnum;
import com.tencent.supersonic.headless.common.model.enums.MetricTypeEnum;
import com.tencent.supersonic.headless.common.model.response.MetricResp;
import com.tencent.supersonic.headless.model.domain.MetricService;
import com.tencent.supersonic.headless.model.domain.pojo.MetricFilter;
import com.tencent.supersonic.headless.common.server.enums.MetricType;
import com.tencent.supersonic.headless.common.server.response.MetricResp;
import com.tencent.supersonic.headless.server.pojo.MetricFilter;
import com.tencent.supersonic.headless.server.service.MetricService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import java.util.List;
@SpringBootTest(classes = StandaloneLauncher.class)
@@ -24,7 +25,7 @@ public class MetricServiceImplTest {
@Test
void getMetrics() {
MetricFilter metricFilter = new MetricFilter();
metricFilter.setType(MetricTypeEnum.ATOMIC.name());
metricFilter.setType(MetricType.ATOMIC.name());
metricFilter.setModelIds(Lists.newArrayList(1L));
metricFilter.setSensitiveLevel(SensitiveLevelEnum.LOW.ordinal());
List<MetricResp> metricResps = metricService.getMetrics(metricFilter);