mirror of
https://github.com/tencentmusic/supersonic.git
synced 2026-04-26 18:24:20 +08:00
[improvement][headless]Introduce DerivedMetricConverter and optimize metric creation in S2VisitsDemo.
This commit is contained in:
@@ -58,6 +58,27 @@ public class MetricTest extends BaseTest {
|
||||
assert actualResult.getQueryResults().size() == 1;
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMetricFilter() throws Exception {
|
||||
QueryResult actualResult = submitNewChat("alice的访问次数", agent.getId());
|
||||
@@ -71,9 +92,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));
|
||||
@@ -118,14 +139,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(
|
||||
@@ -149,7 +170,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));
|
||||
@@ -195,10 +216,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));
|
||||
|
||||
@@ -78,7 +78,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)) {
|
||||
@@ -93,7 +93,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, 4L);
|
||||
List<Long> actualUnAvailableMetricId =
|
||||
unAvailableItemResp.getMetricResps().stream().map(MetricResp::getId)
|
||||
.sorted(Comparator.naturalOrder()).collect(Collectors.toList());
|
||||
Assertions.assertEquals(expectedUnAvailableMetricId, actualUnAvailableMetricId);
|
||||
}
|
||||
}
|
||||
@@ -40,7 +40,7 @@ public class QueryByMetricTest extends BaseTest {
|
||||
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())
|
||||
|
||||
@@ -18,11 +18,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);
|
||||
@@ -106,10 +106,9 @@ 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
|
||||
@@ -120,13 +119,4 @@ public class QueryBySqlTest extends BaseTest {
|
||||
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'"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,11 +53,9 @@ public class QueryByStructTest extends BaseTest {
|
||||
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,7 +66,7 @@ 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());
|
||||
}
|
||||
|
||||
@@ -81,7 +79,7 @@ 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());
|
||||
assertNotNull(result.getResultList().size());
|
||||
}
|
||||
|
||||
@@ -103,7 +101,7 @@ 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());
|
||||
}
|
||||
@@ -122,7 +120,7 @@ public class QueryByStructTest extends BaseTest {
|
||||
User tom = DataUtils.getUserTom();
|
||||
Aggregator aggregator = new Aggregator();
|
||||
aggregator.setFunc(AggOperatorEnum.SUM);
|
||||
aggregator.setColumn("stay_hours");
|
||||
aggregator.setColumn("pv_avg");
|
||||
QueryStructReq queryStructReq =
|
||||
buildQueryStructReq(Arrays.asList("department"), aggregator);
|
||||
assertThrows(InvalidPermissionException.class,
|
||||
@@ -134,7 +132,7 @@ public class QueryByStructTest extends BaseTest {
|
||||
User tom = DataUtils.getUserTom();
|
||||
Aggregator aggregator = new Aggregator();
|
||||
aggregator.setFunc(AggOperatorEnum.SUM);
|
||||
aggregator.setColumn("pv");
|
||||
aggregator.setColumn("stay_hours");
|
||||
QueryStructReq queryStructReq1 =
|
||||
buildQueryStructReq(Collections.singletonList("department"), aggregator);
|
||||
SemanticQueryResp semanticQueryResp = semanticLayerService.queryByReq(queryStructReq1, tom);
|
||||
|
||||
@@ -46,6 +46,6 @@ public class TranslateTest extends BaseTest {
|
||||
assertNotNull(explain);
|
||||
assertNotNull(explain.getQuerySQL());
|
||||
assertTrue(explain.getQuerySQL().contains("department"));
|
||||
assertTrue(explain.getQuerySQL().contains("pv"));
|
||||
assertTrue(explain.getQuerySQL().contains("stay_hours"));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user