mirror of
https://github.com/tencentmusic/supersonic.git
synced 2026-04-28 03:14:18 +08:00
[improvement][headless]Release brand new version of Translator module.
This commit is contained in:
@@ -53,14 +53,14 @@ public class S2VisitsDemo extends S2BaseDemo {
|
||||
|
||||
// create metrics and dimensions
|
||||
DimensionResp departmentDimension = getDimension("department", userModel);
|
||||
MetricResp metricPv = getMetric("pv", pvUvModel);
|
||||
MetricResp metricUv = addMetric_uv(pvUvModel, departmentDimension);
|
||||
|
||||
DimensionResp pageDimension = getDimension("page", stayTimeModel);
|
||||
DimensionResp pageDimension = getDimension("visits_page", stayTimeModel);
|
||||
updateDimension(stayTimeModel, pageDimension);
|
||||
DimensionResp userDimension = getDimension("user_name", userModel);
|
||||
updateMetric(stayTimeModel, departmentDimension, userDimension);
|
||||
updateMetric_pv(pvUvModel, departmentDimension, userDimension, metricPv);
|
||||
addMetric_uv(pvUvModel, departmentDimension);
|
||||
MetricResp metricPv = addMetric_pv(pvUvModel, departmentDimension, userDimension);
|
||||
|
||||
addMetric_pv_avg(metricPv, metricUv, departmentDimension, pvUvModel);
|
||||
|
||||
// create dict conf for dimensions
|
||||
enableDimensionValue(departmentDimension);
|
||||
@@ -69,7 +69,7 @@ public class S2VisitsDemo extends S2BaseDemo {
|
||||
// create data set
|
||||
DataSetResp s2DataSet = addDataSet(s2Domain);
|
||||
addAuthGroup_1(stayTimeModel);
|
||||
addAuthGroup_2(pvUvModel);
|
||||
addAuthGroup_2(stayTimeModel);
|
||||
|
||||
// create terms and plugin
|
||||
addTerm(s2Domain);
|
||||
@@ -162,12 +162,11 @@ public class S2VisitsDemo extends S2BaseDemo {
|
||||
modelReq.setAdminOrgs(Collections.emptyList());
|
||||
ModelDetail modelDetail = new ModelDetail();
|
||||
List<Identify> identifiers = new ArrayList<>();
|
||||
identifiers.add(new Identify("用户", IdentifyType.primary.name(), "user_name", 1));
|
||||
identifiers.add(new Identify("用户名", IdentifyType.primary.name(), "user_name", 1));
|
||||
modelDetail.setIdentifiers(identifiers);
|
||||
|
||||
List<Dimension> dimensions = new ArrayList<>();
|
||||
dimensions.add(new Dimension("部门", "department", DimensionType.categorical, 1));
|
||||
// dimensions.add(new Dimension("用户", "user_name", DimensionType.categorical, 1));
|
||||
modelDetail.setDimensions(dimensions);
|
||||
List<Field> fields = Lists.newArrayList();
|
||||
fields.add(Field.builder().fieldName("user_name").dataType("Varchar").build());
|
||||
@@ -175,7 +174,7 @@ public class S2VisitsDemo extends S2BaseDemo {
|
||||
modelDetail.setFields(fields);
|
||||
modelDetail.setMeasures(Collections.emptyList());
|
||||
modelDetail.setQueryType("sql_query");
|
||||
modelDetail.setSqlQuery("select user_name,department from s2_user_department");
|
||||
modelDetail.setSqlQuery("select * from s2_user_department");
|
||||
modelReq.setModelDetail(modelDetail);
|
||||
return modelService.createModel(modelReq, defaultUser);
|
||||
}
|
||||
@@ -197,28 +196,19 @@ public class S2VisitsDemo extends S2BaseDemo {
|
||||
modelDetail.setIdentifiers(identifiers);
|
||||
|
||||
List<Dimension> dimensions = new ArrayList<>();
|
||||
Dimension dimension1 = new Dimension("", "imp_date", DimensionType.partition_time, 0);
|
||||
Dimension dimension1 = new Dimension("数据日期", "imp_date", DimensionType.partition_time, 1);
|
||||
dimension1.setTypeParams(new DimensionTimeTypeParams());
|
||||
dimensions.add(dimension1);
|
||||
Dimension dimension2 = new Dimension("", "page", DimensionType.categorical, 0);
|
||||
dimension2.setExpr("page");
|
||||
dimensions.add(dimension2);
|
||||
modelDetail.setDimensions(dimensions);
|
||||
List<Measure> measures = new ArrayList<>();
|
||||
Measure measure1 = new Measure("访问次数", "pv", AggOperatorEnum.SUM.name(), 1);
|
||||
measures.add(measure1);
|
||||
Measure measure2 = new Measure("访问用户数", "user_id", AggOperatorEnum.SUM.name(), 0);
|
||||
measures.add(measure2);
|
||||
modelDetail.setMeasures(measures);
|
||||
List<Field> fields = Lists.newArrayList();
|
||||
fields.add(Field.builder().fieldName("user_name").dataType("Varchar").build());
|
||||
fields.add(Field.builder().fieldName("imp_date").dataType("Date").build());
|
||||
fields.add(Field.builder().fieldName("page").dataType("Varchar").build());
|
||||
fields.add(Field.builder().fieldName("pv").dataType("Long").build());
|
||||
fields.add(Field.builder().fieldName("user_id").dataType("Varchar").build());
|
||||
modelDetail.setFields(fields);
|
||||
modelDetail.setSqlQuery("SELECT imp_date, user_name, page, 1 as pv, "
|
||||
+ "user_name as user_id FROM s2_pv_uv_statis");
|
||||
modelDetail.setSqlQuery("SELECT * FROM s2_pv_uv_statis");
|
||||
modelDetail.setQueryType("sql_query");
|
||||
modelReq.setModelDetail(modelDetail);
|
||||
return modelService.createModel(modelReq, defaultUser);
|
||||
@@ -231,20 +221,20 @@ public class S2VisitsDemo extends S2BaseDemo {
|
||||
modelReq.setDescription("停留时长统计");
|
||||
modelReq.setDomainId(s2Domain.getId());
|
||||
modelReq.setDatabaseId(s2Database.getId());
|
||||
modelReq.setViewers(Arrays.asList("admin", "tom", "jack"));
|
||||
modelReq.setViewers(Arrays.asList("admin", "jack"));
|
||||
modelReq.setViewOrgs(Collections.singletonList("1"));
|
||||
modelReq.setAdmins(Collections.singletonList("admin"));
|
||||
modelReq.setAdminOrgs(Collections.emptyList());
|
||||
List<Identify> identifiers = new ArrayList<>();
|
||||
ModelDetail modelDetail = new ModelDetail();
|
||||
identifiers.add(new Identify("用户", IdentifyType.foreign.name(), "user_name", 0));
|
||||
identifiers.add(new Identify("用户名", IdentifyType.foreign.name(), "user_name", 0));
|
||||
modelDetail.setIdentifiers(identifiers);
|
||||
|
||||
List<Dimension> dimensions = new ArrayList<>();
|
||||
Dimension dimension1 = new Dimension("数据日期", "imp_date", DimensionType.partition_time, 1);
|
||||
Dimension dimension1 = new Dimension("数据日期", "imp_date", DimensionType.partition_time, 0);
|
||||
dimension1.setTypeParams(new DimensionTimeTypeParams());
|
||||
dimensions.add(dimension1);
|
||||
Dimension dimension2 = new Dimension("页面", "page", DimensionType.categorical, 1);
|
||||
Dimension dimension2 = new Dimension("页面", "visits_page", DimensionType.categorical, 1);
|
||||
dimension2.setExpr("page");
|
||||
dimensions.add(dimension2);
|
||||
modelDetail.setDimensions(dimensions);
|
||||
@@ -259,8 +249,7 @@ public class S2VisitsDemo extends S2BaseDemo {
|
||||
fields.add(Field.builder().fieldName("page").dataType("Varchar").build());
|
||||
fields.add(Field.builder().fieldName("stay_hours").dataType("Double").build());
|
||||
modelDetail.setFields(fields);
|
||||
modelDetail
|
||||
.setSqlQuery("select imp_date,user_name,stay_hours,page from s2_stay_time_statis");
|
||||
modelDetail.setSqlQuery("select * from s2_stay_time_statis");
|
||||
modelDetail.setQueryType("sql_query");
|
||||
modelReq.setModelDetail(modelDetail);
|
||||
return modelService.createModel(modelReq, defaultUser);
|
||||
@@ -295,49 +284,23 @@ public class S2VisitsDemo extends S2BaseDemo {
|
||||
dimensionService.updateDimension(dimensionReq, defaultUser);
|
||||
}
|
||||
|
||||
private void updateMetric(ModelResp stayTimeModel, DimensionResp departmentDimension,
|
||||
private MetricResp addMetric_pv(ModelResp pvUvModel, DimensionResp departmentDimension,
|
||||
DimensionResp userDimension) throws Exception {
|
||||
MetricResp stayHoursMetric = metricService.getMetric(stayTimeModel.getId(), "stay_hours");
|
||||
MetricReq metricReq = new MetricReq();
|
||||
metricReq.setModelId(stayTimeModel.getId());
|
||||
metricReq.setId(stayHoursMetric.getId());
|
||||
metricReq.setName("停留时长");
|
||||
metricReq.setBizName("stay_hours");
|
||||
metricReq.setSensitiveLevel(SensitiveLevelEnum.HIGH.getCode());
|
||||
metricReq.setDescription("停留时长");
|
||||
metricReq.setClassifications(Collections.singletonList("核心指标"));
|
||||
MetricDefineByMeasureParams metricTypeParams = new MetricDefineByMeasureParams();
|
||||
metricTypeParams.setExpr("stay_hours");
|
||||
List<Measure> measures = new ArrayList<>();
|
||||
Measure measure = new Measure("停留时长", "stay_hours", AggOperatorEnum.SUM.getOperator(), 0);
|
||||
measures.add(measure);
|
||||
metricTypeParams.setMeasures(measures);
|
||||
metricReq.setMetricDefineByMeasureParams(metricTypeParams);
|
||||
metricReq.setMetricDefineType(MetricDefineType.MEASURE);
|
||||
metricReq.setRelateDimension(getRelateDimension(
|
||||
Lists.newArrayList(departmentDimension.getId(), userDimension.getId())));
|
||||
metricService.updateMetric(metricReq, defaultUser);
|
||||
}
|
||||
|
||||
private void updateMetric_pv(ModelResp pvUvModel, DimensionResp departmentDimension,
|
||||
DimensionResp userDimension, MetricResp metricPv) throws Exception {
|
||||
MetricReq metricReq = new MetricReq();
|
||||
metricReq.setModelId(pvUvModel.getId());
|
||||
metricReq.setId(metricPv.getId());
|
||||
metricReq.setName("访问次数");
|
||||
metricReq.setBizName("pv");
|
||||
metricReq.setDescription("一段时间内用户的访问次数");
|
||||
MetricDefineByMeasureParams metricTypeParams = new MetricDefineByMeasureParams();
|
||||
metricTypeParams.setExpr("pv");
|
||||
List<Measure> measures = new ArrayList<>();
|
||||
Measure measure = new Measure("访问次数", "pv", AggOperatorEnum.SUM.getOperator(), 0);
|
||||
measures.add(measure);
|
||||
metricTypeParams.setMeasures(measures);
|
||||
metricReq.setMetricDefineByMeasureParams(metricTypeParams);
|
||||
metricReq.setMetricDefineType(MetricDefineType.MEASURE);
|
||||
MetricDefineByFieldParams metricTypeParams = new MetricDefineByFieldParams();
|
||||
metricTypeParams.setExpr("count(1)");
|
||||
// List<FieldParam> fieldParams = new ArrayList<>();
|
||||
// fieldParams.add(new FieldParam("imp_date"));
|
||||
// metricTypeParams.setFields(fieldParams);
|
||||
metricReq.setMetricDefineByFieldParams(metricTypeParams);
|
||||
metricReq.setMetricDefineType(MetricDefineType.FIELD);
|
||||
metricReq.setRelateDimension(getRelateDimension(
|
||||
Lists.newArrayList(departmentDimension.getId(), userDimension.getId())));
|
||||
metricService.updateMetric(metricReq, defaultUser);
|
||||
return metricService.createMetric(metricReq, defaultUser);
|
||||
}
|
||||
|
||||
private MetricResp addMetric_uv(ModelResp uvModel, DimensionResp departmentDimension)
|
||||
@@ -361,6 +324,31 @@ public class S2VisitsDemo extends S2BaseDemo {
|
||||
return metricService.createMetric(metricReq, defaultUser);
|
||||
}
|
||||
|
||||
private MetricResp addMetric_pv_avg(MetricResp metricPv, MetricResp metricUv,
|
||||
DimensionResp departmentDimension, ModelResp pvModel) throws Exception {
|
||||
MetricReq metricReq = new MetricReq();
|
||||
metricReq.setModelId(pvModel.getId());
|
||||
metricReq.setName("人均访问次数");
|
||||
metricReq.setBizName("pv_avg");
|
||||
metricReq.setSensitiveLevel(SensitiveLevelEnum.HIGH.getCode());
|
||||
metricReq.setDescription("每个用户平均访问的次数");
|
||||
metricReq.setClassifications(Collections.singletonList("核心指标"));
|
||||
metricReq.setAlias("平均访问次数");
|
||||
MetricDefineByMetricParams metricTypeParams = new MetricDefineByMetricParams();
|
||||
metricTypeParams.setExpr("pv/uv");
|
||||
List<MetricParam> metrics = new ArrayList<>();
|
||||
MetricParam pv = new MetricParam(metricPv.getId(), metricPv.getBizName());
|
||||
MetricParam uv = new MetricParam(metricUv.getId(), metricUv.getBizName());
|
||||
metrics.add(pv);
|
||||
metrics.add(uv);
|
||||
metricTypeParams.setMetrics(metrics);
|
||||
metricReq.setMetricDefineByMetricParams(metricTypeParams);
|
||||
metricReq.setMetricDefineType(MetricDefineType.METRIC);
|
||||
metricReq.setRelateDimension(
|
||||
getRelateDimension(Lists.newArrayList(departmentDimension.getId())));
|
||||
return metricService.createMetric(metricReq, defaultUser);
|
||||
}
|
||||
|
||||
private DataSetResp addDataSet(DomainResp s2Domain) {
|
||||
DataSetReq dataSetReq = new DataSetReq();
|
||||
dataSetReq.setName("超音数数据集");
|
||||
@@ -409,15 +397,14 @@ public class S2VisitsDemo extends S2BaseDemo {
|
||||
authService.addOrUpdateAuthGroup(authGroupReq);
|
||||
}
|
||||
|
||||
private void addAuthGroup_2(ModelResp pvuvModel) {
|
||||
private void addAuthGroup_2(ModelResp model) {
|
||||
AuthGroup authGroupReq = new AuthGroup();
|
||||
authGroupReq.setModelId(pvuvModel.getId());
|
||||
authGroupReq.setModelId(model.getId());
|
||||
authGroupReq.setName("tom_row_permission");
|
||||
|
||||
List<AuthRule> authRules = new ArrayList<>();
|
||||
authGroupReq.setAuthRules(authRules);
|
||||
authGroupReq.setDimensionFilters(Collections.singletonList("user_name = 'tom'"));
|
||||
authGroupReq.setDimensionFilterDescription("用户名='tom'");
|
||||
authGroupReq.setAuthorizedUsers(Collections.singletonList("tom"));
|
||||
authGroupReq.setAuthorizedDepartmentIds(Collections.emptyList());
|
||||
authService.addOrUpdateAuthGroup(authGroupReq);
|
||||
|
||||
@@ -26,18 +26,20 @@ com.tencent.supersonic.headless.chat.parser.llm.DataSetResolver=\
|
||||
|
||||
### headless-core SPIs
|
||||
|
||||
com.tencent.supersonic.headless.core.translator.parser.QueryParser=\
|
||||
com.tencent.supersonic.headless.core.translator.parser.DefaultDimValueParser,\
|
||||
com.tencent.supersonic.headless.core.translator.parser.SqlVariableParser,\
|
||||
com.tencent.supersonic.headless.core.translator.parser.SqlQueryParser,\
|
||||
com.tencent.supersonic.headless.core.translator.parser.StructQueryParser,\
|
||||
com.tencent.supersonic.headless.core.translator.parser.MetricRatioParser,\
|
||||
com.tencent.supersonic.headless.core.translator.parser.OntologyQueryParser
|
||||
|
||||
com.tencent.supersonic.headless.core.translator.optimizer.QueryOptimizer=\
|
||||
com.tencent.supersonic.headless.core.translator.optimizer.DbDialectOptimizer,\
|
||||
com.tencent.supersonic.headless.core.translator.optimizer.ResultLimitOptimizer
|
||||
|
||||
com.tencent.supersonic.headless.core.translator.parser.QueryParser=\
|
||||
com.tencent.supersonic.headless.core.translator.parser.SqlVariableParser,\
|
||||
com.tencent.supersonic.headless.core.translator.parser.StructQueryParser,\
|
||||
com.tencent.supersonic.headless.core.translator.parser.SqlQueryParser,\
|
||||
com.tencent.supersonic.headless.core.translator.parser.DefaultDimValueParser,\
|
||||
com.tencent.supersonic.headless.core.translator.parser.DimExpressionParser,\
|
||||
com.tencent.supersonic.headless.core.translator.parser.MetricExpressionParser,\
|
||||
com.tencent.supersonic.headless.core.translator.parser.MetricRatioParser,\
|
||||
com.tencent.supersonic.headless.core.translator.parser.OntologyQueryParser
|
||||
|
||||
com.tencent.supersonic.headless.core.executor.QueryExecutor=\
|
||||
com.tencent.supersonic.headless.core.executor.JdbcExecutor
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ public class MetricTest extends BaseTest {
|
||||
@Test
|
||||
@SetSystemProperty(key = "s2.test", value = "true")
|
||||
public void testMetricModel() throws Exception {
|
||||
QueryResult actualResult = submitNewChat("超音数 访问次数", agent.getId());
|
||||
QueryResult actualResult = submitNewChat("超音数访问次数", agent.getId());
|
||||
|
||||
QueryResult expectedResult = new QueryResult();
|
||||
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
|
||||
@@ -57,6 +57,29 @@ public class MetricTest extends BaseTest {
|
||||
|
||||
assertQueryResult(expectedResult, actualResult);
|
||||
assert actualResult.getQueryResults().size() == 1;
|
||||
assert actualResult.getQuerySql().contains("s2_pv_uv_statis");
|
||||
}
|
||||
|
||||
@Test
|
||||
@SetSystemProperty(key = "s2.test", value = "true")
|
||||
public void testDerivedMetricModel() throws Exception {
|
||||
QueryResult actualResult = submitNewChat("超音数 人均访问次数", agent.getId());
|
||||
|
||||
QueryResult expectedResult = new QueryResult();
|
||||
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
|
||||
expectedResult.setChatContext(expectedParseInfo);
|
||||
|
||||
expectedResult.setQueryMode(MetricModelQuery.QUERY_MODE);
|
||||
expectedParseInfo.setAggType(NONE);
|
||||
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("人均访问次数"));
|
||||
|
||||
expectedParseInfo.setDateInfo(
|
||||
DataUtils.getDateConf(DateConf.DateMode.BETWEEN, unit, period, startDay, endDay));
|
||||
expectedParseInfo.setQueryType(QueryType.AGGREGATE);
|
||||
|
||||
assertQueryResult(expectedResult, actualResult);
|
||||
assert actualResult.getQueryResults().size() == 1;
|
||||
assert actualResult.getQuerySql().contains("s2_pv_uv_statis");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -73,9 +96,9 @@ public class MetricTest extends BaseTest {
|
||||
|
||||
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
|
||||
|
||||
SchemaElement userElement = getSchemaElementByName(schema.getDimensions(), "用户");
|
||||
SchemaElement userElement = getSchemaElementByName(schema.getDimensions(), "用户名");
|
||||
expectedParseInfo.getDimensionFilters().add(DataUtils.getFilter("user_name",
|
||||
FilterOperatorEnum.EQUALS, "alice", "用户", userElement.getId()));
|
||||
FilterOperatorEnum.EQUALS, "alice", "用户名", userElement.getId()));
|
||||
|
||||
expectedParseInfo.setDateInfo(
|
||||
DataUtils.getDateConf(DateConf.DateMode.BETWEEN, unit, period, startDay, endDay));
|
||||
@@ -83,11 +106,60 @@ public class MetricTest extends BaseTest {
|
||||
|
||||
assertQueryResult(expectedResult, actualResult);
|
||||
assert actualResult.getQueryResults().size() == 1;
|
||||
assert actualResult.getQuerySql().contains("s2_pv_uv_statis");
|
||||
}
|
||||
|
||||
@Test
|
||||
@SetSystemProperty(key = "s2.test", value = "true")
|
||||
public void testMetricGroupBy() throws Exception {
|
||||
QueryResult actualResult = submitNewChat("近7天超音数各用户的访问次数", agent.getId());
|
||||
|
||||
QueryResult expectedResult = new QueryResult();
|
||||
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
|
||||
expectedResult.setChatContext(expectedParseInfo);
|
||||
|
||||
expectedResult.setQueryMode(MetricGroupByQuery.QUERY_MODE);
|
||||
expectedParseInfo.setAggType(NONE);
|
||||
|
||||
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
|
||||
expectedParseInfo.getDimensions().add(DataUtils.getSchemaElement("用户名"));
|
||||
|
||||
expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.BETWEEN, 7,
|
||||
DatePeriodEnum.DAY, startDay, endDay));
|
||||
expectedParseInfo.setQueryType(QueryType.AGGREGATE);
|
||||
|
||||
assertQueryResult(expectedResult, actualResult);
|
||||
assert actualResult.getQueryResults().size() == 6;
|
||||
assert actualResult.getQuerySql().contains("s2_pv_uv_statis");
|
||||
}
|
||||
|
||||
@Test
|
||||
@SetSystemProperty(key = "s2.test", value = "true")
|
||||
public void testMetricGroupByAndJoin() throws Exception {
|
||||
QueryResult actualResult = submitNewChat("近7天超音数各部门的访问次数", agent.getId());
|
||||
|
||||
QueryResult expectedResult = new QueryResult();
|
||||
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
|
||||
expectedResult.setChatContext(expectedParseInfo);
|
||||
|
||||
expectedResult.setQueryMode(MetricGroupByQuery.QUERY_MODE);
|
||||
expectedParseInfo.setAggType(NONE);
|
||||
|
||||
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
|
||||
expectedParseInfo.getDimensions().add(DataUtils.getSchemaElement("部门"));
|
||||
|
||||
expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.BETWEEN, 7,
|
||||
DatePeriodEnum.DAY, startDay, endDay));
|
||||
expectedParseInfo.setQueryType(QueryType.AGGREGATE);
|
||||
|
||||
assertQueryResult(expectedResult, actualResult);
|
||||
assert actualResult.getQueryResults().size() == 4;
|
||||
assert actualResult.getQuerySql().contains("s2_pv_uv_statis");
|
||||
}
|
||||
|
||||
@Test
|
||||
@SetSystemProperty(key = "s2.test", value = "true")
|
||||
public void testMetricGroupByAndMultiJoin() throws Exception {
|
||||
QueryResult actualResult = submitNewChat("近7天超音数各部门的访问次数和停留时长", agent.getId());
|
||||
|
||||
QueryResult expectedResult = new QueryResult();
|
||||
@@ -107,6 +179,9 @@ public class MetricTest extends BaseTest {
|
||||
|
||||
assertQueryResult(expectedResult, actualResult);
|
||||
assert actualResult.getQueryResults().size() == 4;
|
||||
assert actualResult.getQuerySql().contains("s2_pv_uv_statis");
|
||||
assert actualResult.getQuerySql().contains("s2_user_department");
|
||||
assert actualResult.getQuerySql().contains("s2_stay_time_statis");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -120,14 +195,14 @@ public class MetricTest extends BaseTest {
|
||||
expectedResult.setQueryMode(MetricFilterQuery.QUERY_MODE);
|
||||
expectedParseInfo.setAggType(NONE);
|
||||
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
|
||||
expectedParseInfo.getDimensions().add(DataUtils.getSchemaElement("用户"));
|
||||
expectedParseInfo.getDimensions().add(DataUtils.getSchemaElement("用户名"));
|
||||
List<String> list = new ArrayList<>();
|
||||
list.add("alice");
|
||||
list.add("lucy");
|
||||
|
||||
SchemaElement userElement = getSchemaElementByName(schema.getDimensions(), "用户");
|
||||
SchemaElement userElement = getSchemaElementByName(schema.getDimensions(), "用户名");
|
||||
QueryFilter dimensionFilter = DataUtils.getFilter("user_name", FilterOperatorEnum.IN, list,
|
||||
"用户", userElement.getId());
|
||||
"用户名", userElement.getId());
|
||||
expectedParseInfo.getDimensionFilters().add(dimensionFilter);
|
||||
|
||||
expectedParseInfo.setDateInfo(
|
||||
@@ -151,7 +226,7 @@ public class MetricTest extends BaseTest {
|
||||
expectedParseInfo.setAggType(MAX);
|
||||
|
||||
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
|
||||
expectedParseInfo.getDimensions().add(DataUtils.getSchemaElement("用户"));
|
||||
expectedParseInfo.getDimensions().add(DataUtils.getSchemaElement("用户名"));
|
||||
|
||||
expectedParseInfo.setDateInfo(
|
||||
DataUtils.getDateConf(3, DateConf.DateMode.BETWEEN, DatePeriodEnum.DAY));
|
||||
@@ -161,6 +236,7 @@ public class MetricTest extends BaseTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@SetSystemProperty(key = "s2.test", value = "true")
|
||||
public void testMetricGroupBySum() throws Exception {
|
||||
QueryResult actualResult = submitNewChat("近7天超音数各部门的访问次数总和", agent.getId());
|
||||
QueryResult expectedResult = new QueryResult();
|
||||
@@ -197,10 +273,10 @@ public class MetricTest extends BaseTest {
|
||||
expectedResult.setQueryMode(MetricFilterQuery.QUERY_MODE);
|
||||
expectedParseInfo.setAggType(NONE);
|
||||
|
||||
SchemaElement userElement = getSchemaElementByName(schema.getDimensions(), "用户");
|
||||
SchemaElement userElement = getSchemaElementByName(schema.getDimensions(), "用户名");
|
||||
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
|
||||
expectedParseInfo.getDimensionFilters().add(DataUtils.getFilter("user_name",
|
||||
FilterOperatorEnum.EQUALS, "alice", "用户", userElement.getId()));
|
||||
FilterOperatorEnum.EQUALS, "alice", "用户名", userElement.getId()));
|
||||
|
||||
expectedParseInfo.setDateInfo(
|
||||
DataUtils.getDateConf(DateConf.DateMode.BETWEEN, 1, period, startDay, startDay));
|
||||
|
||||
@@ -95,7 +95,7 @@ public class BaseTest extends BaseApplication {
|
||||
queryStructReq.setQueryType(queryType);
|
||||
Aggregator aggregator = new Aggregator();
|
||||
aggregator.setFunc(AggOperatorEnum.SUM);
|
||||
aggregator.setColumn("pv");
|
||||
aggregator.setColumn("stay_hours");
|
||||
queryStructReq.setAggregators(Arrays.asList(aggregator));
|
||||
|
||||
if (CollectionUtils.isNotEmpty(groups)) {
|
||||
@@ -111,7 +111,7 @@ public class BaseTest extends BaseApplication {
|
||||
|
||||
List<Order> orders = new ArrayList<>();
|
||||
Order order = new Order();
|
||||
order.setColumn("pv");
|
||||
order.setColumn("stay_hours");
|
||||
orders.add(order);
|
||||
queryStructReq.setOrders(orders);
|
||||
return queryStructReq;
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
package com.tencent.supersonic.headless;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.FieldRemovedReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.MetricResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.UnAvailableItemResp;
|
||||
import com.tencent.supersonic.headless.server.service.ModelService;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class ModelSchemaTest extends BaseTest {
|
||||
|
||||
@Autowired
|
||||
private ModelService modelService;
|
||||
|
||||
@Test
|
||||
void testGetUnAvailableItem() {
|
||||
FieldRemovedReq fieldRemovedReq = new FieldRemovedReq();
|
||||
fieldRemovedReq.setModelId(2L);
|
||||
fieldRemovedReq.setFields(Lists.newArrayList("pv"));
|
||||
UnAvailableItemResp unAvailableItemResp = modelService.getUnAvailableItem(fieldRemovedReq);
|
||||
List<Long> expectedUnAvailableMetricId = Lists.newArrayList(1L);
|
||||
List<Long> actualUnAvailableMetricId =
|
||||
unAvailableItemResp.getMetricResps().stream().map(MetricResp::getId)
|
||||
.sorted(Comparator.naturalOrder()).collect(Collectors.toList());
|
||||
Assertions.assertEquals(expectedUnAvailableMetricId, actualUnAvailableMetricId);
|
||||
}
|
||||
}
|
||||
@@ -22,25 +22,12 @@ public class QueryByMetricTest extends BaseTest {
|
||||
@Autowired
|
||||
protected MetricService metricService;
|
||||
|
||||
@Test
|
||||
public void testWithMetricAndDimensionBizNames() throws Exception {
|
||||
QueryMetricReq queryMetricReq = new QueryMetricReq();
|
||||
queryMetricReq.setMetricNames(Arrays.asList("stay_hours", "pv"));
|
||||
queryMetricReq.setDimensionNames(Arrays.asList("user_name", "department"));
|
||||
queryMetricReq.getFilters().add(Filter.builder().name("imp_date")
|
||||
.operator(FilterOperatorEnum.MINOR_THAN_EQUALS).relation(Filter.Relation.FILTER)
|
||||
.value(LocalDate.now().toString()).build());
|
||||
SemanticQueryResp queryResp = queryByMetric(queryMetricReq, User.getDefaultUser());
|
||||
Assert.assertNotNull(queryResp.getResultList());
|
||||
Assert.assertEquals(6, queryResp.getResultList().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
@SetSystemProperty(key = "s2.test", value = "true")
|
||||
public void testWithMetricAndDimensionNames() throws Exception {
|
||||
QueryMetricReq queryMetricReq = new QueryMetricReq();
|
||||
queryMetricReq.setMetricNames(Arrays.asList("停留时长", "访问次数"));
|
||||
queryMetricReq.setDimensionNames(Arrays.asList("用户", "部门"));
|
||||
queryMetricReq.setDimensionNames(Arrays.asList("用户名", "部门"));
|
||||
queryMetricReq.getFilters()
|
||||
.add(Filter.builder().name("数据日期").operator(FilterOperatorEnum.MINOR_THAN_EQUALS)
|
||||
.relation(Filter.Relation.FILTER).value(LocalDate.now().toString())
|
||||
@@ -51,21 +38,23 @@ public class QueryByMetricTest extends BaseTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@SetSystemProperty(key = "s2.test", value = "true")
|
||||
public void testWithDomainId() throws Exception {
|
||||
QueryMetricReq queryMetricReq = new QueryMetricReq();
|
||||
queryMetricReq.setDomainId(1L);
|
||||
queryMetricReq.setMetricNames(Arrays.asList("stay_hours", "pv"));
|
||||
queryMetricReq.setDimensionNames(Arrays.asList("user_name", "department"));
|
||||
queryMetricReq.getFilters().add(Filter.builder().name("imp_date")
|
||||
.operator(FilterOperatorEnum.MINOR_THAN_EQUALS).relation(Filter.Relation.FILTER)
|
||||
.value(LocalDate.now().toString()).build());
|
||||
queryMetricReq.setMetricNames(Arrays.asList("停留时长", "访问次数"));
|
||||
queryMetricReq.setDimensionNames(Arrays.asList("用户名", "部门"));
|
||||
queryMetricReq.getFilters()
|
||||
.add(Filter.builder().name("数据日期").operator(FilterOperatorEnum.MINOR_THAN_EQUALS)
|
||||
.relation(Filter.Relation.FILTER).value(LocalDate.now().toString())
|
||||
.build());
|
||||
SemanticQueryResp queryResp = queryByMetric(queryMetricReq, User.getDefaultUser());
|
||||
Assert.assertNotNull(queryResp.getResultList());
|
||||
Assert.assertEquals(6, queryResp.getResultList().size());
|
||||
|
||||
queryMetricReq.setDomainId(2L);
|
||||
queryMetricReq.setMetricNames(Arrays.asList("stay_hours", "pv"));
|
||||
queryMetricReq.setDimensionNames(Arrays.asList("user_name", "department"));
|
||||
queryMetricReq.setMetricNames(Arrays.asList("停留时长", "访问次数"));
|
||||
queryMetricReq.setDimensionNames(Arrays.asList("用户名", "部门"));
|
||||
assertThrows(IllegalArgumentException.class,
|
||||
() -> queryByMetric(queryMetricReq, User.getDefaultUser()));
|
||||
}
|
||||
@@ -76,9 +65,10 @@ public class QueryByMetricTest extends BaseTest {
|
||||
queryMetricReq.setDomainId(1L);
|
||||
queryMetricReq.setMetricIds(Arrays.asList(1L, 3L));
|
||||
queryMetricReq.setDimensionIds(Arrays.asList(1L, 2L));
|
||||
queryMetricReq.getFilters().add(Filter.builder().name("imp_date")
|
||||
.operator(FilterOperatorEnum.MINOR_THAN_EQUALS).relation(Filter.Relation.FILTER)
|
||||
.value(LocalDate.now().toString()).build());
|
||||
queryMetricReq.getFilters()
|
||||
.add(Filter.builder().name("数据日期").operator(FilterOperatorEnum.MINOR_THAN_EQUALS)
|
||||
.relation(Filter.Relation.FILTER).value(LocalDate.now().toString())
|
||||
.build());
|
||||
SemanticQueryResp queryResp = queryByMetric(queryMetricReq, User.getDefaultUser());
|
||||
Assert.assertNotNull(queryResp.getResultList());
|
||||
Assert.assertEquals(6, queryResp.getResultList().size());
|
||||
|
||||
@@ -19,11 +19,11 @@ public class QueryBySqlTest extends BaseTest {
|
||||
@Test
|
||||
public void testDetailQuery() throws Exception {
|
||||
SemanticQueryResp semanticQueryResp =
|
||||
queryBySql("SELECT 用户,访问次数 FROM 超音数PVUV统计 WHERE 用户='alice' ");
|
||||
queryBySql("SELECT 用户名,访问次数 FROM 超音数PVUV统计 WHERE 用户名='alice' ");
|
||||
|
||||
assertEquals(2, semanticQueryResp.getColumns().size());
|
||||
QueryColumn firstColumn = semanticQueryResp.getColumns().get(0);
|
||||
assertEquals("用户", firstColumn.getName());
|
||||
assertEquals("用户名", firstColumn.getName());
|
||||
QueryColumn secondColumn = semanticQueryResp.getColumns().get(1);
|
||||
assertEquals("访问次数", secondColumn.getName());
|
||||
assertTrue(semanticQueryResp.getResultList().size() > 0);
|
||||
@@ -87,17 +87,6 @@ public class QueryBySqlTest extends BaseTest {
|
||||
assertTrue(result2.isUseCache());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBizNameQuery() throws Exception {
|
||||
SemanticQueryResp result1 =
|
||||
queryBySql("SELECT SUM(pv) FROM 超音数PVUV统计 WHERE department ='HR'");
|
||||
SemanticQueryResp result2 = queryBySql("SELECT SUM(访问次数) FROM 超音数PVUV统计 WHERE 部门 ='HR'");
|
||||
assertEquals(1, result1.getColumns().size());
|
||||
assertEquals(1, result2.getColumns().size());
|
||||
assertEquals(result1.getColumns().get(0), result2.getColumns().get(0));
|
||||
assertEquals(result1.getResultList(), result2.getResultList());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAuthorization_model() {
|
||||
User alice = DataUtils.getUserAlice();
|
||||
@@ -108,27 +97,16 @@ public class QueryBySqlTest extends BaseTest {
|
||||
|
||||
@Test
|
||||
public void testAuthorization_sensitive_metric() throws Exception {
|
||||
User tom = DataUtils.getUserTom();
|
||||
User tom = DataUtils.getUserAlice();
|
||||
assertThrows(InvalidPermissionException.class,
|
||||
() -> queryBySql("SELECT SUM(stay_hours) FROM 停留时长统计 WHERE department ='HR'",
|
||||
tom));
|
||||
() -> queryBySql("SELECT pv_avg FROM 停留时长统计 WHERE department ='HR'", tom));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAuthorization_sensitive_metric_jack() throws Exception {
|
||||
User jack = DataUtils.getUserJack();
|
||||
SemanticQueryResp semanticQueryResp =
|
||||
queryBySql("SELECT SUM(stay_hours) FROM 停留时长统计", jack);
|
||||
SemanticQueryResp semanticQueryResp = queryBySql("SELECT SUM(停留时长) FROM 停留时长统计", jack);
|
||||
Assertions.assertTrue(semanticQueryResp.getResultList().size() > 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAuthorization_row_permission() throws Exception {
|
||||
User tom = DataUtils.getUserTom();
|
||||
SemanticQueryResp semanticQueryResp =
|
||||
queryBySql("SELECT SUM(pv) FROM 超音数PVUV统计 WHERE department ='HR'", tom);
|
||||
Assertions.assertNotNull(semanticQueryResp.getQueryAuthorization().getMessage());
|
||||
Assertions.assertTrue(semanticQueryResp.getSql().contains("user_name = 'tom'")
|
||||
|| semanticQueryResp.getSql().contains("`user_name` = 'tom'"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,11 +14,7 @@ import com.tencent.supersonic.headless.core.cache.QueryCache;
|
||||
import com.tencent.supersonic.headless.core.utils.ComponentFactory;
|
||||
import com.tencent.supersonic.util.DataUtils;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.MethodOrderer;
|
||||
import org.junit.jupiter.api.Order;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestMethodOrder;
|
||||
import org.junit.jupiter.api.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -32,13 +28,14 @@ import static org.junit.Assert.assertTrue;
|
||||
|
||||
@Slf4j
|
||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||
@Disabled
|
||||
public class QueryByStructTest extends BaseTest {
|
||||
|
||||
@Test
|
||||
@Order(0)
|
||||
public void testCacheQuery() {
|
||||
QueryStructReq queryStructReq1 = buildQueryStructReq(Arrays.asList("department"));
|
||||
QueryStructReq queryStructReq2 = buildQueryStructReq(Arrays.asList("department"));
|
||||
QueryStructReq queryStructReq1 = buildQueryStructReq(Arrays.asList("部门"));
|
||||
QueryStructReq queryStructReq2 = buildQueryStructReq(Arrays.asList("部门"));
|
||||
QueryCache queryCache = ComponentFactory.getQueryCache();
|
||||
String cacheKey1 = queryCache.getCacheKey(queryStructReq1);
|
||||
String cacheKey2 = queryCache.getCacheKey(queryStructReq2);
|
||||
@@ -48,16 +45,14 @@ public class QueryByStructTest extends BaseTest {
|
||||
@Test
|
||||
public void testDetailQuery() throws Exception {
|
||||
QueryStructReq queryStructReq =
|
||||
buildQueryStructReq(Arrays.asList("user_name", "department"), QueryType.DETAIL);
|
||||
buildQueryStructReq(Arrays.asList("用户名", "部门"), QueryType.DETAIL);
|
||||
SemanticQueryResp semanticQueryResp =
|
||||
semanticLayerService.queryByReq(queryStructReq, User.getDefaultUser());
|
||||
assertEquals(3, semanticQueryResp.getColumns().size());
|
||||
QueryColumn firstColumn = semanticQueryResp.getColumns().get(0);
|
||||
assertEquals("用户", firstColumn.getName());
|
||||
assertEquals("用户名", firstColumn.getName());
|
||||
QueryColumn secondColumn = semanticQueryResp.getColumns().get(1);
|
||||
assertEquals("部门", secondColumn.getName());
|
||||
QueryColumn thirdColumn = semanticQueryResp.getColumns().get(2);
|
||||
assertEquals("访问次数", thirdColumn.getName());
|
||||
assertTrue(semanticQueryResp.getResultList().size() > 0);
|
||||
}
|
||||
|
||||
@@ -68,26 +63,26 @@ public class QueryByStructTest extends BaseTest {
|
||||
semanticLayerService.queryByReq(queryStructReq, User.getDefaultUser());
|
||||
assertEquals(1, semanticQueryResp.getColumns().size());
|
||||
QueryColumn queryColumn = semanticQueryResp.getColumns().get(0);
|
||||
assertEquals("访问次数", queryColumn.getName());
|
||||
assertEquals("停留时长", queryColumn.getName());
|
||||
assertEquals(1, semanticQueryResp.getResultList().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGroupByQuery() throws Exception {
|
||||
QueryStructReq queryStructReq = buildQueryStructReq(Arrays.asList("department"));
|
||||
QueryStructReq queryStructReq = buildQueryStructReq(Arrays.asList("部门"));
|
||||
SemanticQueryResp result =
|
||||
semanticLayerService.queryByReq(queryStructReq, User.getDefaultUser());
|
||||
assertEquals(2, result.getColumns().size());
|
||||
QueryColumn firstColumn = result.getColumns().get(0);
|
||||
QueryColumn secondColumn = result.getColumns().get(1);
|
||||
assertEquals("部门", firstColumn.getName());
|
||||
assertEquals("访问次数", secondColumn.getName());
|
||||
assertEquals("停留时长", secondColumn.getName());
|
||||
assertNotNull(result.getResultList().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFilterQuery() throws Exception {
|
||||
QueryStructReq queryStructReq = buildQueryStructReq(Arrays.asList("department"));
|
||||
QueryStructReq queryStructReq = buildQueryStructReq(Arrays.asList("部门"));
|
||||
List<Filter> dimensionFilters = new ArrayList<>();
|
||||
Filter filter = new Filter();
|
||||
filter.setName("部门");
|
||||
@@ -103,16 +98,16 @@ public class QueryByStructTest extends BaseTest {
|
||||
QueryColumn firstColumn = result.getColumns().get(0);
|
||||
QueryColumn secondColumn = result.getColumns().get(1);
|
||||
assertEquals("部门", firstColumn.getName());
|
||||
assertEquals("访问次数", secondColumn.getName());
|
||||
assertEquals("停留时长", secondColumn.getName());
|
||||
assertEquals(1, result.getResultList().size());
|
||||
assertEquals("HR", result.getResultList().get(0).get("department").toString());
|
||||
assertEquals("HR", result.getResultList().get(0).get("部门").toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAuthorization_model() {
|
||||
User alice = DataUtils.getUserAlice();
|
||||
setDomainNotOpenToAll();
|
||||
QueryStructReq queryStructReq1 = buildQueryStructReq(Arrays.asList("department"));
|
||||
QueryStructReq queryStructReq1 = buildQueryStructReq(Arrays.asList("部门"));
|
||||
assertThrows(InvalidPermissionException.class,
|
||||
() -> semanticLayerService.queryByReq(queryStructReq1, alice));
|
||||
}
|
||||
@@ -122,9 +117,8 @@ public class QueryByStructTest extends BaseTest {
|
||||
User tom = DataUtils.getUserTom();
|
||||
Aggregator aggregator = new Aggregator();
|
||||
aggregator.setFunc(AggOperatorEnum.SUM);
|
||||
aggregator.setColumn("stay_hours");
|
||||
QueryStructReq queryStructReq =
|
||||
buildQueryStructReq(Arrays.asList("department"), aggregator);
|
||||
aggregator.setColumn("人均访问次数");
|
||||
QueryStructReq queryStructReq = buildQueryStructReq(Arrays.asList("部门"), aggregator);
|
||||
assertThrows(InvalidPermissionException.class,
|
||||
() -> semanticLayerService.queryByReq(queryStructReq, tom));
|
||||
}
|
||||
@@ -134,11 +128,11 @@ public class QueryByStructTest extends BaseTest {
|
||||
User tom = DataUtils.getUserTom();
|
||||
Aggregator aggregator = new Aggregator();
|
||||
aggregator.setFunc(AggOperatorEnum.SUM);
|
||||
aggregator.setColumn("pv");
|
||||
aggregator.setColumn("停留时长");
|
||||
QueryStructReq queryStructReq1 =
|
||||
buildQueryStructReq(Collections.singletonList("department"), aggregator);
|
||||
buildQueryStructReq(Collections.singletonList("部门"), aggregator);
|
||||
SemanticQueryResp semanticQueryResp = semanticLayerService.queryByReq(queryStructReq1, tom);
|
||||
Assertions.assertNotNull(semanticQueryResp.getQueryAuthorization().getMessage());
|
||||
Assertions.assertTrue(semanticQueryResp.getSql().contains("user_name = 'tom'"));
|
||||
Assertions.assertTrue(semanticQueryResp.getSql().contains("用户名 = 'tom'"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
package com.tencent.supersonic.headless;
|
||||
|
||||
import com.tencent.supersonic.common.pojo.User;
|
||||
import com.tencent.supersonic.demo.S2VisitsDemo;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.SemanticTranslateResp;
|
||||
import com.tencent.supersonic.headless.chat.utils.QueryReqBuilder;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Optional;
|
||||
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class TranslateTest extends BaseTest {
|
||||
|
||||
private Long dataSetId;
|
||||
|
||||
@BeforeEach
|
||||
public void init() {
|
||||
agent = getAgentByName(S2VisitsDemo.AGENT_NAME);
|
||||
schema = schemaService.getSemanticSchema(agent.getDataSetIds());
|
||||
Optional<Long> id = agent.getDataSetIds().stream().findFirst();
|
||||
dataSetId = id.orElse(1L);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSqlExplain() throws Exception {
|
||||
String sql = "SELECT 部门, SUM(访问次数) AS 访问次数 FROM 超音数PVUV统计 GROUP BY 部门 ";
|
||||
SemanticTranslateResp explain = semanticLayerService
|
||||
.translate(QueryReqBuilder.buildS2SQLReq(sql, dataSetId), User.getDefaultUser());
|
||||
assertNotNull(explain);
|
||||
assertNotNull(explain.getQuerySQL());
|
||||
assertTrue(explain.getQuerySQL().contains("department"));
|
||||
assertTrue(explain.getQuerySQL().contains("pv"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStructExplain() throws Exception {
|
||||
QueryStructReq queryStructReq =
|
||||
buildQueryStructReq(Collections.singletonList("department"));
|
||||
SemanticTranslateResp explain =
|
||||
semanticLayerService.translate(queryStructReq, User.getDefaultUser());
|
||||
assertNotNull(explain);
|
||||
assertNotNull(explain.getQuerySQL());
|
||||
assertTrue(explain.getQuerySQL().contains("department"));
|
||||
assertTrue(explain.getQuerySQL().contains("pv"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
package com.tencent.supersonic.headless;
|
||||
|
||||
import com.tencent.supersonic.common.pojo.User;
|
||||
import com.tencent.supersonic.demo.S2VisitsDemo;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.SemanticTranslateResp;
|
||||
import com.tencent.supersonic.headless.chat.utils.QueryReqBuilder;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junitpioneer.jupiter.SetSystemProperty;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Objects;
|
||||
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class TranslatorTest extends BaseTest {
|
||||
|
||||
private Long dataSetId;
|
||||
|
||||
@BeforeEach
|
||||
public void init() {
|
||||
agent = getAgentByName(S2VisitsDemo.AGENT_NAME);
|
||||
schema = schemaService.getSemanticSchema(agent.getDataSetIds());
|
||||
if (Objects.nonNull(agent)) {
|
||||
dataSetId = agent.getDataSetIds().stream().findFirst().get();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSql() throws Exception {
|
||||
String sql =
|
||||
"SELECT SUM(访问次数) AS _总访问次数_ FROM 超音数数据集 WHERE 数据日期 >= '2024-11-15' AND 数据日期 <= '2024-12-15'";
|
||||
SemanticTranslateResp explain = semanticLayerService
|
||||
.translate(QueryReqBuilder.buildS2SQLReq(sql, dataSetId), User.getDefaultUser());
|
||||
assertNotNull(explain);
|
||||
assertNotNull(explain.getQuerySQL());
|
||||
assertTrue(explain.getQuerySQL().contains("count(1)"));
|
||||
executeSql(explain.getQuerySQL());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSql_1() throws Exception {
|
||||
String sql = "SELECT 部门, SUM(访问次数) AS 总访问次数 FROM 超音数PVUV统计 GROUP BY 部门 ";
|
||||
SemanticTranslateResp explain = semanticLayerService
|
||||
.translate(QueryReqBuilder.buildS2SQLReq(sql, dataSetId), User.getDefaultUser());
|
||||
assertNotNull(explain);
|
||||
assertNotNull(explain.getQuerySQL());
|
||||
assertTrue(explain.getQuerySQL().contains("department"));
|
||||
assertTrue(explain.getQuerySQL().contains("count(1)"));
|
||||
executeSql(explain.getQuerySQL());
|
||||
}
|
||||
|
||||
@Test
|
||||
@SetSystemProperty(key = "s2.test", value = "true")
|
||||
public void testSql_2() throws Exception {
|
||||
String sql =
|
||||
"WITH _department_visits_ AS (SELECT 部门, SUM(访问次数) AS _total_visits_ FROM 超音数数据集 WHERE 数据日期 >= '2024-11-15' AND 数据日期 <= '2024-12-15' GROUP BY 部门) SELECT 部门 FROM _department_visits_ ORDER BY _total_visits_ DESC LIMIT 2";
|
||||
SemanticTranslateResp explain = semanticLayerService
|
||||
.translate(QueryReqBuilder.buildS2SQLReq(sql, dataSetId), User.getDefaultUser());
|
||||
assertNotNull(explain);
|
||||
assertNotNull(explain.getQuerySQL());
|
||||
assertTrue(explain.getQuerySQL().toLowerCase().contains("department"));
|
||||
assertTrue(explain.getQuerySQL().toLowerCase().contains("count(1)"));
|
||||
executeSql(explain.getQuerySQL());
|
||||
}
|
||||
|
||||
@Test
|
||||
@SetSystemProperty(key = "s2.test", value = "true")
|
||||
public void testSql_3() throws Exception {
|
||||
String sql =
|
||||
"WITH recent_data AS (SELECT 用户名, 访问次数 FROM 超音数数据集 WHERE 部门 = 'marketing' AND 数据日期 >= '2024-12-01' AND 数据日期 <= '2024-12-15') SELECT 用户名 FROM recent_data ORDER BY 访问次数 DESC LIMIT 1";
|
||||
SemanticTranslateResp explain = semanticLayerService
|
||||
.translate(QueryReqBuilder.buildS2SQLReq(sql, dataSetId), User.getDefaultUser());
|
||||
assertNotNull(explain);
|
||||
assertNotNull(explain.getQuerySQL());
|
||||
assertTrue(explain.getQuerySQL().toLowerCase().contains("department"));
|
||||
assertTrue(explain.getQuerySQL().toLowerCase().contains("count(1)"));
|
||||
executeSql(explain.getQuerySQL());
|
||||
}
|
||||
|
||||
@Test
|
||||
@SetSystemProperty(key = "s2.test", value = "true")
|
||||
public void testSql_unionALL() throws Exception {
|
||||
String sql = new String(
|
||||
Files.readAllBytes(
|
||||
Paths.get(ClassLoader.getSystemResource("sql/testUnion.sql").toURI())),
|
||||
StandardCharsets.UTF_8);
|
||||
SemanticTranslateResp explain = semanticLayerService
|
||||
.translate(QueryReqBuilder.buildS2SQLReq(sql, dataSetId), User.getDefaultUser());
|
||||
assertNotNull(explain);
|
||||
assertNotNull(explain.getQuerySQL());
|
||||
assertTrue(explain.getQuerySQL().contains("department"));
|
||||
assertTrue(explain.getQuerySQL().contains("pv"));
|
||||
executeSql(explain.getQuerySQL());
|
||||
}
|
||||
|
||||
@Test
|
||||
@SetSystemProperty(key = "s2.test", value = "true")
|
||||
public void testSql_with() throws Exception {
|
||||
String sql = new String(
|
||||
Files.readAllBytes(
|
||||
Paths.get(ClassLoader.getSystemResource("sql/testWith.sql").toURI())),
|
||||
StandardCharsets.UTF_8);
|
||||
SemanticTranslateResp explain = semanticLayerService
|
||||
.translate(QueryReqBuilder.buildS2SQLReq(sql, dataSetId), User.getDefaultUser());
|
||||
assertNotNull(explain);
|
||||
assertNotNull(explain.getQuerySQL());
|
||||
executeSql(explain.getQuerySQL());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -74,6 +74,7 @@ public class DataUtils {
|
||||
public static DateConf getDateConf(DateConf.DateMode dateMode, Integer unit,
|
||||
DatePeriodEnum period, String startDate, String endDate) {
|
||||
DateConf dateInfo = new DateConf();
|
||||
dateInfo.setDateField("imp_date");
|
||||
dateInfo.setUnit(unit);
|
||||
dateInfo.setDateMode(dateMode);
|
||||
dateInfo.setPeriod(period);
|
||||
|
||||
34
launchers/standalone/src/test/resources/sql/testUnion.sql
Normal file
34
launchers/standalone/src/test/resources/sql/testUnion.sql
Normal file
@@ -0,0 +1,34 @@
|
||||
WITH
|
||||
recent_week AS (
|
||||
SELECT
|
||||
SUM(访问次数) AS _访问次数_,
|
||||
COUNT(DISTINCT 用户名) AS _访问用户数_
|
||||
FROM
|
||||
超音数数据集
|
||||
WHERE
|
||||
数据日期 >= '2024-12-20'
|
||||
AND 数据日期 <= '2024-12-27'
|
||||
),
|
||||
first_week_december AS (
|
||||
SELECT
|
||||
SUM(访问次数) AS _访问次数_,
|
||||
COUNT(DISTINCT 用户名) AS _访问用户数_
|
||||
FROM
|
||||
超音数数据集
|
||||
WHERE
|
||||
数据日期 >= '2024-12-01'
|
||||
AND 数据日期 <= '2024-12-07'
|
||||
)
|
||||
SELECT
|
||||
'最近7天' AS _时间段_,
|
||||
_访问次数_,
|
||||
_访问用户数_
|
||||
FROM
|
||||
recent_week
|
||||
UNION ALL
|
||||
SELECT
|
||||
'12月第一个星期' AS _时间段_,
|
||||
_访问次数_,
|
||||
_访问用户数_
|
||||
FROM
|
||||
first_week_december
|
||||
29
launchers/standalone/src/test/resources/sql/testWith.sql
Normal file
29
launchers/standalone/src/test/resources/sql/testWith.sql
Normal file
@@ -0,0 +1,29 @@
|
||||
WITH
|
||||
weekly_visits AS (
|
||||
SELECT
|
||||
YEAR (数据日期) AS _year_,
|
||||
WEEK (数据日期) AS _week_,
|
||||
SUM(访问次数) AS total_visits
|
||||
FROM
|
||||
超音数数据集
|
||||
WHERE
|
||||
(
|
||||
数据日期 >= '2024-11-18'
|
||||
AND 数据日期 <= '2024-11-25'
|
||||
)
|
||||
GROUP BY
|
||||
YEAR (数据日期),
|
||||
WEEK (数据日期)
|
||||
)
|
||||
SELECT
|
||||
_year_,
|
||||
_week_,
|
||||
total_visits
|
||||
FROM
|
||||
weekly_visits
|
||||
WHERE
|
||||
(_year_ = YEAR (CURRENT_DATE))
|
||||
ORDER BY
|
||||
total_visits DESC
|
||||
LIMIT
|
||||
1
|
||||
Reference in New Issue
Block a user