[improvement][project] supersonic 0.7.0 version backend update (#20)

Co-authored-by: kanedai <kanedai@tencent.com>
This commit is contained in:
daikon
2023-07-31 11:09:58 +08:00
committed by GitHub
parent 078a81038f
commit e2b2d31429
675 changed files with 13089 additions and 13536 deletions

View File

@@ -0,0 +1,63 @@
package com.tencent.supersonic;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.chat.api.pojo.request.QueryRequest;
import com.tencent.supersonic.chat.service.ChatService;
import com.tencent.supersonic.chat.service.QueryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class ConfigureDemo implements ApplicationListener<ApplicationReadyEvent> {
@Autowired
private QueryService queryService;
@Autowired
private ChatService chatService;
private User user = User.getFakeUser();
public void addSampleChats()throws Exception {
chatService.addChat(user, "样例对话1");
QueryRequest queryRequest = new QueryRequest();
queryRequest.setQueryText("超音数 访问次数");
queryRequest.setChatId(1);
queryRequest.setUser(User.getFakeUser());
queryService.executeQuery(queryRequest);
queryRequest.setQueryText("按部门统计");
queryService.executeQuery(queryRequest);
queryRequest.setQueryText("查询近30天");
queryService.executeQuery(queryRequest);
}
public void addSampleChats2() throws Exception {
chatService.addChat(user, "样例对话2");
QueryRequest queryRequest = new QueryRequest();
queryRequest.setChatId(2);
queryRequest.setUser(User.getFakeUser());
queryRequest.setQueryText("alice 停留时长");
queryService.executeQuery(queryRequest);
queryRequest.setQueryText("对比alice和lucy的访问次数");
queryService.executeQuery(queryRequest);
queryRequest.setQueryText("访问次数最高的部门");
queryService.executeQuery(queryRequest);
}
@Override
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
try {
addSampleChats();
addSampleChats2();
} catch (Exception e) {
log.error("Failed to add sample chats");
}
}
}

View File

@@ -6,9 +6,6 @@ import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfigurat
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* StandaloneLauncher
**/
@SpringBootApplication(scanBasePackages = {"com.tencent.supersonic"},
exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
@EnableScheduling

View File

@@ -1,23 +1,25 @@
com.tencent.supersonic.chat.api.component.SchemaMapper=\
com.tencent.supersonic.chat.application.mapper.HanlpSchemaMapper, \
com.tencent.supersonic.chat.application.mapper.DatabaseSchemaMapper, \
com.tencent.supersonic.chat.application.mapper.QueryFilterMapper
com.tencent.supersonic.chat.mapper.HanlpDictMapper, \
com.tencent.supersonic.chat.mapper.FuzzyNameMapper, \
com.tencent.supersonic.chat.mapper.QueryFilterMapper
com.tencent.supersonic.chat.api.component.SemanticParser=\
com.tencent.supersonic.chat.application.parser.DomainSemanticParser, \
com.tencent.supersonic.chat.application.parser.TimeSemanticParser, \
com.tencent.supersonic.chat.application.parser.AggregateSemanticParser, \
com.tencent.supersonic.chat.application.parser.LLMSemanticParser
com.tencent.supersonic.chat.parser.rule.QueryModeParser, \
com.tencent.supersonic.chat.parser.rule.ContextInheritParser, \
com.tencent.supersonic.chat.parser.rule.TimeRangeParser, \
com.tencent.supersonic.chat.parser.rule.AggregateTypeParser, \
com.tencent.supersonic.chat.parser.embedding.EmbeddingBasedParser, \
com.tencent.supersonic.chat.parser.function.FunctionBasedParser
com.tencent.supersonic.chat.api.component.SemanticLayer=\
com.tencent.supersonic.chat.infrastructure.semantic.LocalSemanticLayerImpl
com.tencent.supersonic.knowledge.semantic.LocalSemanticLayer
com.tencent.supersonic.chat.application.query.QuerySelector=\
com.tencent.supersonic.chat.application.query.HeuristicQuerySelector
com.tencent.supersonic.chat.query.QuerySelector=\
com.tencent.supersonic.chat.query.HeuristicQuerySelector
com.tencent.supersonic.chat.application.parser.DomainResolver=\
com.tencent.supersonic.chat.application.parser.HeuristicDomainResolver
com.tencent.supersonic.chat.parser.function.DomainResolver=\
com.tencent.supersonic.chat.parser.function.HeuristicDomainResolver
com.tencent.supersonic.auth.authentication.domain.interceptor.AuthenticationInterceptor=\
com.tencent.supersonic.auth.authentication.domain.interceptor.DefaultAuthenticationInterceptor

View File

@@ -0,0 +1,9 @@
周杰伦 _2_7 9000
周深 _2_7 8000
周传雄 _2_7 7000
周华建 _2_7 6000
陈奕迅 _2_7 8000
林俊杰 _2_7 7000
张碧晨 _2_7 7000
程响 _2_7 7000
Taylor#Swift _2_7 7000

View File

@@ -1,34 +1,25 @@
-- chat data
-- sample user
insert into s2_user (id, `name`, password, display_name, email) values (1, 'admin','admin','admin','admin@xx.com');
insert into s2_user (id, `name`, password, display_name, email) values (2, 'jack','123456','jack','jack@xx.com');
insert into s2_user (id, `name`, password, display_name, email) values (3, 'tom','123456','tom','tom@xx.com');
insert into s2_user (id, `name`, password, display_name, email) values (4, 'lucy','123456','lucy','lucy@xx.com');
--insert into s2_chat_config (`id` ,`domain_id` ,`default_metrics`,`visibility`,`entity_info` ,`dictionary_info`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) values (1,1,'[{"metricId":1,"unit":7,"period":"DAY"}]','{"blackDimIdList":[],"blackMetricIdList":[]}','{"entityIds":[2],"names":["用户","用户姓名"],"detailData":{"dimensionIds":[1,2],"metricIds":[2]}}','[{"itemId":1,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":2,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":3,"type":"DIMENSION","blackList":[],"isDictInfo":true}]','2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1);
insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`, `recommended_questions`, `created_at`,`updated_at`,`created_by`,`updated_by`,`status` )
values (1,1,
'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":7,"period":"DAY"},"entity":null}',
'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":7,"period":"DAY"}}',
'[{"question":"超音数访问次数"},{"question":"超音数访问人数"},{"question":"超音数按部门访问次数"}]',
'2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1);
insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` )
values (1,1,'{"visibility":{"blackDimIdList":[1],"blackMetricIdList":[2]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":1,"period":"DAY"},"entity":null}',
'{"visibility":{"blackDimIdList":[3],"blackMetricIdList":[3]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":1,"period":"DAY"}}',
'2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1);
insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` )
values (2,2,'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"},"entity":{"entityId":1,"names":["歌手","艺人"]}}',
'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"}}',
'2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1);
values (2,2,
'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"},"entity":{"entityId":7,"names":["歌手","艺人"]}}',
'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"}}',
'2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1);
insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator,last_question,is_delete,is_top) values (1, '超音数访问统计','2023-06-10 10:00:52.495','2023-06-10 10:00:52','admin','您好欢迎使用内容智能小Q','0','0');
insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator,last_question,is_delete,is_top) values (2, '用户访问统计','2023-06-10 10:01:04.528','2023-06-10 10:01:04','admin','您好欢迎使用内容智能小Q','0','0');
insert into s2_plugin (id, `type`, `domain`, pattern, parse_mode, `name`, created_at, created_by, updated_at, updated_by, config) VALUES (1, 'WEB_PAGE', 1, '访问情况', 'EMBEDDING_RECALL', '访问情况', '2023-06-11 19:36:47', 'admin', '2023-06-21 15:26:46', 'admin', '{"params":{"487C128A":"2"}, "url":"www.test.com"}');
insert into s2_chat_context (chat_id, modified_at , `user`, `query_text`, `semantic_parse` ,ext_data) VALUES(1, '2023-06-10 10:40:49.877', 'admin', '访问', '{"queryMode":"METRIC_ORDERBY","aggType":"NONE","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"nativeQuery":false}', 'admin');
insert into s2_chat_context (chat_id, modified_at , `user`, `query_text`, `semantic_parse` ,ext_data) VALUES(2, '2023-06-10 10:42:02.184', 'null', '访问', '{"queryMode":"METRIC_ORDERBY","aggType":"NONE","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"nativeQuery":false}', 'null');
insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(1, '2023-06-10 10:39:55.178', '超音数 访问次数', 'admin',0,1,'{"queryMode":"METRIC_DOMAIN","querySql":"SELECT `sys_imp_date` , `pv` FROM ( SELECT `sys_imp_date` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` FROM ( SELECT `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_f370` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_DOMAIN","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","pv":11},{"sys_imp_date":"2023-06-04","pv":14},{"sys_imp_date":"2023-06-05","pv":1},{"sys_imp_date":"2023-06-06","pv":19},{"sys_imp_date":"2023-06-07","pv":18},{"sys_imp_date":"2023-06-08","pv":24},{"sys_imp_date":"2023-06-09","pv":23}]}',0,'');
insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(2, '2023-06-10 10:40:12.259', '按页面', 'admin',0,1,'{"queryMode":"METRIC_ORDERBY","querySql":"SELECT `sys_imp_date` , `page` , `pv` FROM ( SELECT `sys_imp_date` , `page` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` , `page` FROM ( SELECT `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` , `page` AS `page` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_ecf5` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` , `page` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"页面","type":"VARCHAR","nameEn":"page","showType":"CATEGORY","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_ORDERBY","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","page":"p1","pv":2},{"sys_imp_date":"2023-06-03","page":"p2","pv":3},{"sys_imp_date":"2023-06-03","page":"p3","pv":2},{"sys_imp_date":"2023-06-03","page":"p4","pv":1},{"sys_imp_date":"2023-06-03","page":"p5","pv":3},{"sys_imp_date":"2023-06-04","page":"p1","pv":3},{"sys_imp_date":"2023-06-04","page":"p2","pv":1},{"sys_imp_date":"2023-06-04","page":"p3","pv":2},{"sys_imp_date":"2023-06-04","page":"p4","pv":4},{"sys_imp_date":"2023-06-04","page":"p5","pv":4}]}',0,'');
insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(3, '2023-06-10 10:40:49.877', '访问', 'admin',0,1,'{"queryMode":"METRIC_ORDERBY","querySql":"SELECT `sys_imp_date` , `page` , `uv` , `pv` FROM ( SELECT `sys_imp_date` , `page` , `s2_pv_uv_statis_uv` AS `uv` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT COUNT ( DISTINCT `s2_pv_uv_statis_uv` ) AS `s2_pv_uv_statis_uv` , SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` , `page` FROM ( SELECT `uv` AS `s2_pv_uv_statis_uv` , `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` , `page` AS `page` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_022c` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` , `page` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"页面","type":"VARCHAR","nameEn":"page","showType":"CATEGORY","authorized":true},{"name":"访问人数","type":"BIGINT","nameEn":"uv","showType":"NUMBER","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_ORDERBY","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","page":"p1","uv":2,"pv":2},{"sys_imp_date":"2023-06-03","page":"p2","uv":3,"pv":3},{"sys_imp_date":"2023-06-03","page":"p3","uv":2,"pv":2},{"sys_imp_date":"2023-06-03","page":"p4","uv":1,"pv":1},{"sys_imp_date":"2023-06-03","page":"p5","uv":3,"pv":3},{"sys_imp_date":"2023-06-04","page":"p1","uv":2,"pv":3},{"sys_imp_date":"2023-06-04","page":"p2","uv":1,"pv":1},{"sys_imp_date":"2023-06-04","page":"p3","uv":2,"pv":2},{"sys_imp_date":"2023-06-04","page":"p4","uv":3,"pv":4},{"sys_imp_date":"2023-06-04","page":"p5","uv":3,"pv":4}]}',0,'');
insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(4, '2023-06-10 10:41:18.589','alice 访问次数','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `pv` FROM ( SELECT `sys_imp_date` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` FROM ( SELECT `user_name` , `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_b825` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","pv":2},{"sys_imp_date":"2023-06-04","pv":2},{"sys_imp_date":"2023-06-06","pv":2},{"sys_imp_date":"2023-06-07","pv":2},{"sys_imp_date":"2023-06-08","pv":5},{"sys_imp_date":"2023-06-09","pv":2}]}',0,'');
insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(5, '2023-06-10 10:41:48.211','停留时长','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}',0,'');
insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(6, '2023-06-10 10:42:02.184','访问','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}',0,'');
-- semantic data
-- sample models
insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(1, 1, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin');
insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(2, 2, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin');
insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, '停留时长统计', 's2_stay_time_statis', '停留时长统计', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_stay_time_statis_stay_hours","expr":"stay_hours","isCreateMetric":1,"name":"停留时长"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, page,user_name,stay_hours FROM s2_stay_time_statis"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin');
@@ -38,7 +29,7 @@ insert into s2_datasource (id , domain_id, `name`, biz_name, description, da
insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, 1, 2, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin');
insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(2, 1, 1, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin');
insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(3, 1, 2, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin');
insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(1, 1, 3, '部门', 'department', '部门', 1, 0, 'categorical', NULL, 'department', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY');
insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type, dim_value_maps) VALUES(1, 1, 3, '部门', 'department', '部门', 1, 0, 'categorical', NULL, 'department', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY', '[{"alias":["人力资源","人力"],"bizName":"人力资源","techName":"HR"},{"alias":["营销","销售"],"bizName":"营销部门","techName":"sales"}]');
insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(2, 1, 1, '用户名', 'user_name', '用户名', 1, 0, 'primary', NULL, 'user_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY');
insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(3, 1, 2, '页面', 'page', '页面', 1, 2, 'categorical', NULL, 'page', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY');
insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(4, 2, 4, '活跃区域', 'act_area', '活跃区域', 1, 2, 'categorical', NULL, 'act_area', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY');
@@ -47,12 +38,12 @@ insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, descr
insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(7, 2, 4, '歌手名', 'singer_name', '歌手名', 1, 2, 'categorical', NULL, 'singer_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY');
insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(1, '超音数', 'supersonic', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' );
insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(2, '艺人库', 'singer', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' );
insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(1, 1, '停留时长', 'stay_hours', '停留时长', 1, 2, 'expr', '{"expr":"s2_stay_time_statis_stay_hours","measures":[{"agg":"sum","expr":"stay_hours","isCreateMetric":1,"datasourceId":1,"bizName":"s2_stay_time_statis_stay_hours","name":"s2_stay_time_statis_stay_hours"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL );
insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(2, 1, '访问次数', 'pv', '访问次数', 1, 0, 'expr', ' {"expr":"s2_pv_uv_statis_pv","measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","datasourceId":2,"expr":"pv","isCreateMetric":1,"name":"s2_pv_uv_statis_pv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL );
insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(3, 1, '访问人数', 'uv', '访问人数', 1, 0, 'expr', ' {"expr":"s2_pv_uv_statis_uv","measures":[{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","datasourceId":2,"expr":"uv","isCreateMetric":1,"name":"s2_pv_uv_statis_uv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL );
insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(4, 2, '播放量', 'js_play_cnt', '播放量', 1, 2, 'expr', '{"expr":"music_js_play_cnt","measures":[{"agg":"sum","expr":"js_play_cnt","isCreateMetric":1,"datasourceId":4,"bizName":"music_js_play_cnt","name":"music_js_play_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL );
insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(5, 2, '下载量', 'down_cnt', '下载量', 1, 0, 'expr', ' {"expr":"music_down_cnt","measures":[{"agg":"sum","bizName":"music_down_cnt","datasourceId":4,"expr":"down_cnt","isCreateMetric":1,"name":"music_down_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL );
insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(6, 2, '收藏量', 'favor_cnt', '收藏量', 1, 0, 'expr', ' {"expr":"music_favor_cnt","measures":[{"agg":"sum","bizName":"music_favor_cnt","datasourceId":4,"expr":"favor_cnt","isCreateMetric":1,"name":"music_favor_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL );
insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(1, 1, '停留时长', 'stay_hours', '停留时长', 1, 2, 'ATOMIC', '{"expr":"s2_stay_time_statis_stay_hours","measures":[{"agg":"sum","expr":"stay_hours","isCreateMetric":1,"datasourceId":1,"bizName":"s2_stay_time_statis_stay_hours","name":"s2_stay_time_statis_stay_hours"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL );
insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(2, 1, '访问次数', 'pv', '访问次数', 1, 0, 'ATOMIC', ' {"expr":"s2_pv_uv_statis_pv","measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","datasourceId":2,"expr":"pv","isCreateMetric":1,"name":"s2_pv_uv_statis_pv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL );
insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(3, 1, '访问人数', 'uv', '访问人数', 1, 0, 'ATOMIC', ' {"expr":"s2_pv_uv_statis_uv","measures":[{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","datasourceId":2,"expr":"uv","isCreateMetric":1,"name":"s2_pv_uv_statis_uv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL );
insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(4, 2, '播放量', 'js_play_cnt', '播放量', 1, 2, 'ATOMIC', '{"expr":"music_js_play_cnt","measures":[{"agg":"sum","expr":"js_play_cnt","isCreateMetric":1,"datasourceId":4,"bizName":"music_js_play_cnt","name":"music_js_play_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL );
insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(5, 2, '下载量', 'down_cnt', '下载量', 1, 0, 'ATOMIC', ' {"expr":"music_down_cnt","measures":[{"agg":"sum","bizName":"music_down_cnt","datasourceId":4,"expr":"down_cnt","isCreateMetric":1,"name":"music_down_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL );
insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(6, 2, '收藏量', 'favor_cnt', '收藏量', 1, 0, 'ATOMIC', ' {"expr":"music_favor_cnt","measures":[{"agg":"sum","bizName":"music_favor_cnt","datasourceId":4,"expr":"favor_cnt","isCreateMetric":1,"name":"music_favor_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL );
insert into s2_available_date_info(`item_id` ,`type` ,`date_format` ,`start_date` ,`end_date` ,`unavailable_date` ,`created_at` ,`created_by` ,`updated_at` ,`updated_by` )
values (1, 'dimension', 'yyyy-MM-dd', DATEADD('DAY', -28, CURRENT_DATE()), DATEADD('DAY', -1, CURRENT_DATE()), '[]', '2023-06-01', 'admin', '2023-06-01', 'admin');
@@ -66,6 +57,7 @@ values (1, '{"domainId":"1","name":"admin-permission","groupId":1,"authRules":[{
insert into s2_auth_groups (group_id, config)
values (2, '{"domainId":"1","name":"tom_sales_permission","groupId":2,"authRules":[{"metrics":["stay_hours"],"dimensions":["page"]}],"dimensionFilters":["department in (''sales'')"],"dimensionFilterDescription":"开通 tom sales部门权限", "authorizedUsers":["tom"],"authorizedDepartmentIds":[]}');
-- sample data
INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000);
INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000);
INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000);

View File

@@ -44,6 +44,7 @@ CREATE TABLE IF NOT EXISTS `s2_chat_config` (
`domain_id` INT DEFAULT NULL ,
`chat_detail_config` varchar(655) ,
`chat_agg_config` varchar(655) ,
`recommended_questions` varchar(1500) ,
`created_at` TIMESTAMP NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
@@ -117,6 +118,7 @@ CREATE TABLE IF NOT EXISTS `s2_domain` (
`is_open` TINYINT DEFAULT NULL , -- whether the domain is public
`viewer` varchar(3000) DEFAULT NULL , -- domain available users
`view_org` varchar(3000) DEFAULT NULL , -- domain available organization
`entity` varchar(500) DEFAULT NULL , -- domain entity info
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_domain IS 'domain basic information';
@@ -127,6 +129,7 @@ CREATE TABLE `s2_database` (
`domain_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`description` varchar(500) DEFAULT NULL ,
`version` varchar(64) DEFAULT NULL ,
`type` varchar(20) NOT NULL , -- type: mysql,clickhouse,tdw
`config` varchar(655) NOT NULL ,
`created_at` TIMESTAMP NOT NULL ,
@@ -201,6 +204,7 @@ CREATE TABLE IF NOT EXISTS `s2_dimension` (
`semantic_type` varchar(20) NOT NULL, -- semantic type: DATE, ID, CATEGORY
`alias` varchar(500) DEFAULT NULL,
`default_values` varchar(500) DEFAULT NULL,
`dim_value_maps` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_dimension IS 'dimension information table';
@@ -310,6 +314,23 @@ CREATE TABLE IF NOT EXISTS `s2_available_date_info` (
COMMENT ON TABLE s2_dimension IS 'dimension information table';
CREATE TABLE IF NOT EXISTS `s2_plugin`
(
`id` INT AUTO_INCREMENT,
`type` varchar(50) NULL,
`domain` varchar(100) NULL,
`pattern` varchar(500) NULL,
`parse_mode` varchar(100) NULL,
`name` varchar(100) NULL,
`created_at` TIMESTAMP NULL,
`created_by` varchar(100) null,
`updated_at` TIMESTAMP NULL,
`updated_by` varchar(100) NULL,
`config` LONGVARCHAR NULL,
PRIMARY KEY (`id`)
); COMMENT ON TABLE s2_plugin IS 'plugin information table';
-------demo for semantic and chat
CREATE TABLE IF NOT EXISTS `s2_user_department` (
`user_name` varchar(200) NOT NULL,

View File

@@ -0,0 +1,301 @@
create table supersonic_sit.s2_auth_groups
(
group_id int not null
primary key,
config varchar(2048) null
)
collate = utf8mb4_unicode_ci;
create table supersonic_sit.s2_available_date_info
(
id int auto_increment
primary key,
item_id int not null,
type varchar(255) not null,
date_format varchar(64) not null,
start_date varchar(64) null,
end_date varchar(64) null,
unavailable_date text null,
created_at timestamp default CURRENT_TIMESTAMP not null,
created_by varchar(100) not null,
updated_at timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP,
updated_by varchar(100) not null,
status int default 0 null
)
collate = utf8mb4_unicode_ci;
create table supersonic_sit.s2_chat
(
chat_id bigint(8) auto_increment
primary key,
chat_name varchar(100) null,
create_time datetime null,
last_time datetime null,
creator varchar(30) null,
last_question varchar(200) null,
is_delete int(2) default 0 null comment 'is deleted',
is_top int(2) default 0 null comment 'is top'
)
charset = utf8;
create table supersonic_sit.s2_chat_config
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`domain_id` bigint(20) DEFAULT NULL COMMENT '主题域id',
`chat_detail_config` mediumtext COMMENT '明细模式配置信息',
`chat_agg_config` mediumtext COMMENT '指标模式配置信息',
`recommended_questions` mediumtext COMMENT '推荐问题配置',
`created_at` datetime NOT NULL COMMENT '创建时间',
`updated_at` datetime NOT NULL COMMENT '更新时间',
`created_by` varchar(100) NOT NULL COMMENT '创建人',
`updated_by` varchar(100) NOT NULL COMMENT '更新人',
`status` int(10) NOT NULL COMMENT '主题域扩展信息状态, 0-删除1-生效',
PRIMARY KEY (`id`)
)
comment '主题域扩展信息表' charset = utf8;
create table supersonic_sit.s2_chat_context
(
chat_id bigint not null comment 'context chat id'
primary key,
modified_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'row modify time',
user varchar(64) null comment 'row modify user',
query_text text null comment 'query text',
semantic_parse text null comment 'parse data',
ext_data text null comment 'extend data'
)
charset = utf8;
create table supersonic_sit.s2_chat_query
(
question_id bigint auto_increment
primary key,
create_time timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP,
query_text mediumtext null,
user_name varchar(150) null,
query_state int(1) null,
chat_id bigint not null,
query_response mediumtext not null,
score int default 0 null,
feedback varchar(1024) default '' null
)
charset = utf8;
create table supersonic_sit.s2_database
(
id bigint auto_increment
primary key,
domain_id bigint not null comment '主题域ID',
name varchar(255) not null comment '名称',
description varchar(500) null comment '描述',
version varchar(64) null comment '版本',
type varchar(20) not null comment '类型 mysql,clickhouse,tdw',
config text not null comment '配置信息',
created_at datetime not null comment '创建时间',
created_by varchar(100) not null comment '创建人',
updated_at datetime not null comment '更新时间',
updated_by varchar(100) not null comment '更新人'
)
comment '数据库实例表' charset = utf8;
create table supersonic_sit.s2_datasource
(
id bigint auto_increment
primary key,
domain_id bigint not null comment '主题域ID',
name varchar(255) not null comment '数据源名称',
biz_name varchar(255) not null comment '内部名称',
description varchar(500) null comment '数据源描述',
database_id bigint not null comment '数据库实例ID',
datasource_detail mediumtext not null comment '数据源配置',
created_at datetime not null comment '创建时间',
created_by varchar(100) not null comment '创建人',
updated_at datetime not null comment '更新时间',
updated_by varchar(100) not null comment '更新人'
)
charset = utf8;
create table supersonic_sit.s2_datasource_rela
(
id bigint auto_increment
primary key,
domain_id bigint null,
datasource_from bigint null,
datasource_to bigint null,
join_key varchar(100) null,
created_at datetime null,
created_by varchar(100) null,
updated_at datetime null,
updated_by varchar(100) null
)
charset = utf8;
create table supersonic_sit.s2_dimension
(
id bigint auto_increment comment '维度ID'
primary key,
domain_id bigint not null comment '主题域id',
datasource_id bigint not null comment '所属数据源id',
name varchar(255) not null comment '维度名称',
biz_name varchar(255) not null comment '字段名称',
description varchar(500) not null comment '描述',
status int(10) not null comment '维度状态,0正常,1下架,2删除',
sensitive_level int(10) null comment '敏感级别',
type varchar(50) not null comment '维度类型 categorical,time',
type_params text null comment '类型参数',
expr text not null comment '表达式',
created_at datetime not null comment '创建时间',
created_by varchar(100) not null comment '创建人',
updated_at datetime not null comment '更新时间',
updated_by varchar(100) not null comment '更新人',
semantic_type varchar(20) not null comment '语义类型DATE, ID, CATEGORY',
alias varchar(500) collate utf8_unicode_ci null,
default_values varchar(500) DEFAULT NULL,
dim_value_maps varchar(500) DEFAULT NULL
)
comment '维度表' charset = utf8;
create table supersonic_sit.s2_domain
(
id bigint auto_increment comment '自增ID'
primary key,
name varchar(255) null comment '主题域名称',
biz_name varchar(255) null comment '内部名称',
parent_id bigint default 0 null comment '父主题域ID',
status int(10) not null comment '主题域状态',
created_at datetime null comment '创建时间',
created_by varchar(100) null comment '创建人',
updated_at datetime null comment '更新时间',
updated_by varchar(100) null comment '更新人',
admin varchar(3000) null comment '主题域管理员',
admin_org varchar(3000) null comment '主题域管理员组织',
is_open int null comment '主题域是否公开',
viewer varchar(3000) null comment '主题域可用用户',
view_org varchar(3000) null comment '主题域可用组织',
entity varchar(500) DEFAULT NULL COMMENT '主题域实体信息'
)
comment '主题域基础信息表' charset = utf8;
create table supersonic_sit.s2_domain_extend
(
id bigint unsigned auto_increment
primary key,
domain_id bigint null comment '主题域id',
default_metrics varchar(655) null comment '默认指标',
visibility mediumtext null comment '不可见的维度/指标信息',
entity_info mediumtext null comment '实体信息',
dictionary_info mediumtext null comment '字典相关的维度设置信息',
created_at datetime not null comment '创建时间',
updated_at datetime not null comment '更新时间',
created_by varchar(100) not null comment '创建人',
updated_by varchar(100) not null comment '更新人',
status int(10) not null comment '主题域扩展信息状态, 0-删除1-生效'
)
comment '主题域扩展信息表' collate = utf8mb4_unicode_ci;
create table supersonic_sit.s2_metric
(
id bigint auto_increment
primary key,
domain_id bigint not null comment '主体域ID',
name varchar(255) not null comment '指标名称',
biz_name varchar(255) not null comment '字段名称',
description varchar(500) null comment '描述',
status int(10) not null comment '指标状态,0正常,1下架,2删除',
sensitive_level int(10) not null comment '敏感级别',
type varchar(50) not null comment '指标类型 proxy,expr',
type_params text not null comment '类型参数',
created_at datetime not null comment '创建时间',
created_by varchar(100) not null comment '创建人',
updated_at datetime not null comment '更新时间',
updated_by varchar(100) not null comment '更新人',
data_format_type varchar(50) null comment '数值类型',
data_format varchar(500) null comment '数值类型参数',
alias varchar(500) collate utf8_unicode_ci null
)
comment '指标表' charset = utf8;
create table supersonic_sit.s2_query_stat_info
(
id bigint unsigned auto_increment
primary key,
trace_id varchar(200) null comment '查询标识',
domain_id bigint null comment '主题域ID',
user varchar(200) null comment '执行sql的用户',
created_at datetime default CURRENT_TIMESTAMP null comment '创建时间',
query_type varchar(200) null comment '查询对应的场景',
query_type_back int(10) default 0 null comment '查询类型, 0-正常查询, 1-预刷类型',
query_sql_cmd mediumtext null comment '对应查询的struct',
sql_cmd_md5 varchar(200) null comment 'sql md5值',
query_struct_cmd mediumtext null comment '对应查询的struct',
struct_cmd_md5 varchar(200) null comment 'sql md5值',
`sql` mediumtext null comment '对应查询的sql',
sql_md5 varchar(200) null comment 'sql md5值',
query_engine varchar(20) null comment '查询引擎',
elapsed_ms bigint(10) null comment '查询耗时',
query_state varchar(20) null comment '查询最终状态',
native_query int(10) null comment '1-明细查询,0-聚合查询',
start_date varchar(50) null comment 'sql开始日期',
end_date varchar(50) null comment 'sql结束日期',
dimensions mediumtext null comment 'sql 涉及的维度',
metrics mediumtext null comment 'sql 涉及的指标',
select_cols mediumtext null comment 'sql select部分涉及的标签',
agg_cols mediumtext null comment 'sql agg部分涉及的标签',
filter_cols mediumtext null comment 'sql where部分涉及的标签',
group_by_cols mediumtext null comment 'sql grouy by部分涉及的标签',
order_by_cols mediumtext null comment 'sql order by部分涉及的标签',
use_result_cache tinyint(1) default -1 null comment '是否命中sql缓存',
use_sql_cache tinyint(1) default -1 null comment '是否命中sql缓存',
sql_cache_key mediumtext null comment '缓存的key',
result_cache_key mediumtext null comment '缓存的key'
)
comment '查询统计信息表' collate = utf8mb4_unicode_ci;
create index domain_index
on supersonic_sit.s2_query_stat_info (domain_id);
create table supersonic_sit.s2_semantic_pasre_info
(
id bigint unsigned auto_increment
primary key,
trace_id varchar(200) not null comment '查询标识',
domain_id bigint not null comment '主体域ID',
dimensions mediumtext null comment '查询相关的维度信息',
metrics mediumtext null comment '查询相关的指标信息',
orders mediumtext null comment '查询相关的排序信息',
filters mediumtext null comment '查询相关的过滤信息',
date_info mediumtext null comment '查询相关的日期信息',
`limit` bigint not null comment '查询相关的limit信息',
native_query tinyint(1) default 0 not null comment '1-明细查询,0-聚合查询',
`sql` mediumtext null comment '解析后的sql',
created_at datetime not null comment '创建时间',
created_by varchar(100) not null comment '创建人',
status int(10) not null comment '运行状态',
elapsed_ms bigint(10) null comment 'sql解析耗时'
) comment '语义层sql解析信息表' charset = utf8;
create table supersonic_sit.s2_view_info
(
id bigint auto_increment
primary key,
domain_id bigint null,
type varchar(20) null comment 'datasource、dimension、metric',
config text null comment 'config detail',
created_at datetime null,
created_by varchar(100) null,
updated_at datetime null,
updated_by varchar(100) not null
) charset = utf8;
CREATE TABLE `s2_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`display_name` varchar(100) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

View File

@@ -0,0 +1 @@
alter table s2_domain add column `entity`varchar(500) DEFAULT NULL COMMENT '主题域实体信息';

View File

@@ -0,0 +1,8 @@
FROM docker-images.music.woa.com/di_base_img/tme_di_base_centos:8_7
MAINTAINER admin
ADD ../../../../target/launchers-standalone-*.gz /app/
RUN ls -l /app/launchers-standalone-*/bin/
ENV TZ=Asia/Shanghai
ENV LANG C.UTF-8
EXPOSE 9082
ENTRYPOINT ["sh","-c","/app/launchers-standalone-0.6-SNAPSHOT/bin/run.sh && tail -f /dev/null"]

View File

@@ -0,0 +1,112 @@
package com.tencent.supersonic.integration;
import com.tencent.supersonic.StandaloneLauncher;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.chat.api.pojo.ChatContext;
import com.tencent.supersonic.chat.api.pojo.SchemaElement;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.chat.api.pojo.request.QueryRequest;
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
import com.tencent.supersonic.chat.api.pojo.response.QueryState;
import com.tencent.supersonic.chat.service.ChatService;
import com.tencent.supersonic.chat.service.ConfigService;
import com.tencent.supersonic.chat.service.QueryService;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.util.DataUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import java.time.LocalDate;
import java.util.Comparator;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = StandaloneLauncher.class)
@ActiveProfiles("local")
public class BaseQueryTest {
protected final int unit = 7;
protected final String startDay = LocalDate.now().plusDays(-unit).toString();
protected final String endDay = LocalDate.now().plusDays(-1).toString();
@Autowired
@Qualifier("chatQueryService")
protected QueryService queryService;
@Autowired
protected ChatService chatService;
@Autowired
protected ConfigService configService;
protected Integer getNewChat(String chatName) {
chatService.addChat(User.getFakeUser(), chatName);
Optional<Long> chatId = chatService.getAll(User.getFakeUser().getName()).stream().map(c -> c.getChatId()).sorted(Comparator.reverseOrder()).findFirst();
if (chatId.isPresent()) {
return chatId.get().intValue();
}
return 1;
}
protected QueryResult submitMultiTurnChat(String queryText) throws Exception {
QueryRequest queryContextReq = DataUtils.getQueryContextReq(20, queryText);
return queryService.executeQuery(queryContextReq);
}
protected QueryResult submitNewChat(String queryText) throws Exception {
chatService.addChat(User.getFakeUser(), RandomStringUtils.random(5));
ChatContext chatContext = chatService.getOrCreateContext(10);
chatContext.setParseInfo(new SemanticParseInfo());
chatService.updateContext(chatContext);
QueryRequest queryContextReq = DataUtils.getQueryContextReq(10, queryText);
return queryService.executeQuery(queryContextReq);
}
protected void assertSchemaElements(Set<SchemaElement> expected, Set<SchemaElement> actual) {
Set<String> expectedNames = expected.stream().map(s -> s.getName())
.filter(s -> s != null).collect(Collectors.toSet());
Set<String> actualNames = actual.stream().map(s -> s.getName())
.filter(s -> s != null).collect(Collectors.toSet());
assertEquals(expectedNames, actualNames);
}
protected void assertDateConf(DateConf expected, DateConf actual) {
Boolean timeFilterExist = expected.getStartDate().equals(actual.getStartDate())
&& expected.getEndDate().equals(actual.getEndDate())
&& expected.getDateMode().equals(actual.getDateMode())
|| expected.getUnit().equals(actual.getUnit()) &&
expected.getDateMode().equals(actual.getDateMode()) &&
expected.getPeriod().equals(actual.getPeriod());
assertTrue(timeFilterExist);
}
protected void assertQueryResult(QueryResult expected, QueryResult actual) {
SemanticParseInfo expectedParseInfo = expected.getChatContext();
SemanticParseInfo actualParseInfo = actual.getChatContext();
assertEquals(QueryState.SUCCESS, actual.getQueryState());
assertEquals(expected.getQueryMode(), actual.getQueryMode());
assertEquals(expectedParseInfo.getAggType(), actualParseInfo.getAggType());
assertSchemaElements(expectedParseInfo.getMetrics(), actualParseInfo.getMetrics());
assertSchemaElements(expectedParseInfo.getDimensions(), actualParseInfo.getDimensions());
assertEquals(expectedParseInfo.getDimensionFilters(), actualParseInfo.getDimensionFilters());
assertEquals(expectedParseInfo.getMetricFilters(), actualParseInfo.getMetricFilters());
assertDateConf(expectedParseInfo.getDateInfo(), actualParseInfo.getDateInfo());
}
}

View File

@@ -0,0 +1,42 @@
package com.tencent.supersonic.integration;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.chat.api.pojo.request.QueryFilter;
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
import com.tencent.supersonic.chat.query.rule.entity.EntityFilterQuery;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
import com.tencent.supersonic.util.DataUtils;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.NONE;
public class EntityQueryTest extends BaseQueryTest {
@Test
public void queryTest_ENTITY_LIST_FILTER()throws Exception {
QueryResult actualResult = submitNewChat("爱情、流行类型的艺人");
QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
expectedResult.setChatContext(expectedParseInfo);
expectedResult.setQueryMode(EntityFilterQuery.QUERY_MODE);
expectedParseInfo.setAggType(NONE);
List<String> list = new ArrayList<>();
list.add("爱情");
list.add("流行");
QueryFilter dimensionFilter = DataUtils.getFilter("genre", FilterOperatorEnum.IN, list, "风格", 6L);
expectedParseInfo.getDimensionFilters().add(dimensionFilter);
expectedParseInfo.setDateInfo(DataUtils.getDateConf(1, DateConf.DateMode.RECENT_UNITS, "DAY"));
expectedParseInfo.setNativeQuery(true);
assertQueryResult(expectedResult, actualResult);
}
}

View File

@@ -0,0 +1,220 @@
package com.tencent.supersonic.integration;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.chat.api.pojo.request.QueryFilter;
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
import com.tencent.supersonic.chat.config.ChatConfigEditReqReq;
import com.tencent.supersonic.chat.config.ChatConfigResp;
import com.tencent.supersonic.chat.config.ItemVisibility;
import com.tencent.supersonic.chat.query.rule.metric.MetricDomainQuery;
import com.tencent.supersonic.chat.query.rule.metric.MetricFilterQuery;
import com.tencent.supersonic.chat.query.rule.metric.MetricGroupByQuery;
import com.tencent.supersonic.chat.query.rule.metric.MetricTopNQuery;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
import com.tencent.supersonic.util.DataUtils;
import org.junit.Test;
import org.springframework.beans.BeanUtils;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.*;
public class MetricQueryTest extends BaseQueryTest {
@Test
public void queryTest_METRIC_FILTER() throws Exception {
QueryResult actualResult = submitNewChat("alice的访问次数");
QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
expectedResult.setChatContext(expectedParseInfo);
expectedResult.setQueryMode(MetricFilterQuery.QUERY_MODE);
expectedParseInfo.setAggType(NONE);
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
expectedParseInfo.getDimensionFilters().add(DataUtils.getFilter("user_name",
FilterOperatorEnum.EQUALS, "alice", "用户名", 2L));
expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.BETWEEN_CONTINUOUS, startDay, endDay));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
@Test
public void queryTest_METRIC_DOMAIN() throws Exception {
QueryResult actualResult = submitNewChat("超音数的访问次数");
QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
expectedResult.setChatContext(expectedParseInfo);
expectedResult.setQueryMode(MetricDomainQuery.QUERY_MODE);
expectedParseInfo.setAggType(NONE);
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.BETWEEN_CONTINUOUS, startDay, endDay));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
@Test
public void queryTest_METRIC_GROUPBY() throws Exception {
QueryResult actualResult = submitNewChat("超音数各部门的访问次数");
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_CONTINUOUS, startDay, endDay));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
@Test
public void queryTest_METRIC_FILTER_COMPARE() throws Exception {
QueryResult actualResult = submitNewChat("对比alice和lucy的访问次数");
QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
expectedResult.setChatContext(expectedParseInfo);
expectedResult.setQueryMode(MetricFilterQuery.QUERY_MODE);
expectedParseInfo.setAggType(NONE);
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
List<String> list = new ArrayList<>();
list.add("alice");
list.add("lucy");
QueryFilter dimensionFilter = DataUtils.getFilter("user_name", FilterOperatorEnum.IN, list, "用户名", 2L);
expectedParseInfo.getDimensionFilters().add(dimensionFilter);
expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.BETWEEN_CONTINUOUS, startDay, endDay));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
@Test
public void queryTest_METRIC_TOPN() throws Exception {
QueryResult actualResult = submitNewChat("近3天访问次数最多的用户");
QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
expectedResult.setChatContext(expectedParseInfo);
expectedResult.setQueryMode(MetricTopNQuery.QUERY_MODE);
expectedParseInfo.setAggType(SUM);
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
expectedParseInfo.getDimensions().add(DataUtils.getSchemaElement("用户名"));
expectedParseInfo.setDateInfo(DataUtils.getDateConf(3, DateConf.DateMode.RECENT_UNITS, "DAY"));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
@Test
public void queryTest_METRIC_GROUPBY_SUM() throws Exception {
QueryResult actualResult = submitNewChat("超音数各部门的访问次数总和");
QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
expectedResult.setChatContext(expectedParseInfo);
expectedResult.setQueryMode(MetricGroupByQuery.QUERY_MODE);
expectedParseInfo.setAggType(SUM);
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
expectedParseInfo.getDimensions().add(DataUtils.getSchemaElement("部门"));
expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.BETWEEN_CONTINUOUS, startDay, endDay));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
@Test
public void queryTest_METRIC_FILTER_TIME() throws Exception {
DateFormat format = new SimpleDateFormat("yyyy-mm-dd");
DateFormat textFormat = new SimpleDateFormat("yyyy年mm月dd日");
String dateStr = textFormat.format(format.parse(startDay));
QueryResult actualResult = submitNewChat(String.format("想知道{}alice的访问次数", dateStr));
QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
expectedResult.setChatContext(expectedParseInfo);
expectedResult.setQueryMode(MetricFilterQuery.QUERY_MODE);
expectedParseInfo.setAggType(NONE);
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
expectedParseInfo.getDimensionFilters().add(DataUtils.getFilter("user_name",
FilterOperatorEnum.EQUALS, "alice", "用户名", 2L));
expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.BETWEEN_CONTINUOUS, startDay, startDay));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
@Test
public void queryTest_CONFIG_VISIBILITY() throws Exception {
// 1. round_1 use blacklist
ChatConfigResp chatConfig = configService.fetchConfigByDomainId(1L);
ChatConfigEditReqReq extendEditCmd = new ChatConfigEditReqReq();
BeanUtils.copyProperties(chatConfig, extendEditCmd);
// add blacklist
List<Long> blackMetrics = Arrays.asList(3L);
extendEditCmd.getChatAggConfig().getVisibility().setBlackMetricIdList(blackMetrics);
configService.editConfig(extendEditCmd, User.getFakeUser());
QueryResult actualResult = submitNewChat("超音数访问人数、访问次数");
QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
expectedResult.setChatContext(expectedParseInfo);
expectedResult.setQueryMode(MetricDomainQuery.QUERY_MODE);
expectedParseInfo.setAggType(NONE);
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.BETWEEN_CONTINUOUS, startDay, endDay));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
// 2. round_2 no blacklist
// remove blacklist
extendEditCmd.getChatAggConfig().setVisibility(new ItemVisibility());
configService.editConfig(extendEditCmd, User.getFakeUser());
actualResult = submitNewChat("超音数访问人数、访问次数");
expectedParseInfo.getMetrics().clear();
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问人数"));
assertQueryResult(expectedResult, actualResult);
}
}

View File

@@ -1,444 +0,0 @@
package com.tencent.supersonic.integration;
import com.tencent.supersonic.StandaloneLauncher;
import com.tencent.supersonic.chat.api.pojo.Filter;
import com.tencent.supersonic.chat.api.request.QueryContextReq;
import com.tencent.supersonic.chat.api.response.QueryResultResp;
import com.tencent.supersonic.chat.application.query.MetricCompare;
import com.tencent.supersonic.chat.application.query.MetricDomain;
import com.tencent.supersonic.chat.application.query.MetricFilter;
import com.tencent.supersonic.chat.application.query.MetricGroupBy;
import com.tencent.supersonic.chat.domain.service.QueryService;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.SchemaItem;
import com.tencent.supersonic.common.util.json.JsonUtil;
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
import com.tencent.supersonic.util.DataUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = StandaloneLauncher.class)
@ActiveProfiles("local")
public class MultiTurnQueryTest {
private static final Logger LOGGER = LoggerFactory.getLogger(MultiTurnQueryTest.class);
@Autowired
@Qualifier("chatQueryService")
private QueryService queryService;
//case:alice的访问次数->停留时长呢?->想知道lucy的,queryMode:METRIC_FILTER
@Test
public void queryTest1() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1,"alice的访问次数");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric);
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist = DataUtils.compareDateDimension(dimensions);
assertThat(dimensionExist).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters = queryResultResp.getChatContext().getDimensionFilters();
Filter dimensionFilter = DataUtils.getFilter("user_name", FilterOperatorEnum.EQUALS, "alice", "用户名", 2L);
Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter);
assertThat(dimensionFilterExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
queryContextReq = DataUtils.getQueryContextReq(1,"停留时长呢?");
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics1 = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric1 = DataUtils.getSchemaItem(1L, "停留时长", "stay_hours");
Boolean metricExist1 = DataUtils.compareSchemaItem(metrics1, schemaItemMetric1);
assertThat(metricExist1).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions1 = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist1 = DataUtils.compareDateDimension(dimensions1);
assertThat(dimensionExist1).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters1 = queryResultResp.getChatContext().getDimensionFilters();
Filter dimensionFilter1 = DataUtils.getFilter("user_name", FilterOperatorEnum.EQUALS, "alice", "用户名", 2L);
Boolean dimensionFilterExist1 = DataUtils.compareDimensionFilter(dimensionFilters1, dimensionFilter1);
assertThat(dimensionFilterExist1).isEqualTo(true);
//assert 时间filter
DateConf dateInfo1 = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist1 = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo1);
assertThat(timeFilterExist1).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
queryContextReq = DataUtils.getQueryContextReq(1,"想知道lucy的");
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics2 = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric2 = DataUtils.getSchemaItem(1L, "停留时长", "stay_hours");
Boolean metricExist2 = DataUtils.compareSchemaItem(metrics2, schemaItemMetric2);
assertThat(metricExist2).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions2 = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist2 = DataUtils.compareDateDimension(dimensions2);
assertThat(dimensionExist2).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters2 = queryResultResp.getChatContext().getDimensionFilters();
Filter dimensionFilter2 = DataUtils.getFilter("user_name", FilterOperatorEnum.EQUALS, "lucy", "用户名", 2L);
Boolean dimensionFilterExist2 = DataUtils.compareDimensionFilter(dimensionFilters2, dimensionFilter2);
;
assertThat(dimensionFilterExist2).isEqualTo(true);
//assert 时间filter
DateConf dateInfo2 = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist2 = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo2);
assertThat(timeFilterExist2).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
}
//case:超音数的访问次数->按部门的呢->p2的呢
@Test
public void queryTest2() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(2,"超音数的访问次数");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricDomain.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric);
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist = DataUtils.compareDateDimension(dimensions);
assertThat(dimensionExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
queryContextReq = DataUtils.getQueryContextReq(2,"按部门的呢");
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricGroupBy.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics1 = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric1 = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist1 = DataUtils.compareSchemaItem(metrics1, schemaItemMetric1);
assertThat(metricExist1).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions1 = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist1 = DataUtils.compareDateDimension(dimensions1);
assertThat(dimensionExist1).isEqualTo(true);
SchemaItem schemaItemDimension2 = DataUtils.getSchemaItem(1L, "部门", "department");
Boolean dimensionExist2 = DataUtils.compareSchemaItem(dimensions1, schemaItemDimension2);
assertThat(dimensionExist2).isEqualTo(true);
//assert 时间filter
DateConf dateInfo1 = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist1 = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo1);
assertThat(timeFilterExist1).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
queryContextReq = DataUtils.getQueryContextReq(2,"p2的呢");
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics2 = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric2 = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist2 = DataUtils.compareSchemaItem(metrics2, schemaItemMetric2);
assertThat(metricExist2).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions2 = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist3 = DataUtils.compareDateDimension(dimensions2);
assertThat(dimensionExist3).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters2 = queryResultResp.getChatContext().getDimensionFilters();
Filter dimensionFilter2 = DataUtils.getFilter("page", FilterOperatorEnum.EQUALS, "p2", "页面", 3L);
Boolean dimensionFilterExist2 = DataUtils.compareDimensionFilter(dimensionFilters2, dimensionFilter2);
assertThat(dimensionFilterExist2).isEqualTo(true);
//assert 时间filter
DateConf dateInfo2 = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist2 = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo2);
assertThat(timeFilterExist2).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
}
//alice的访问次数->对比alice和lucy呢->他是哪个部门的呢
@Test
public void queryTest3() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1,"alice的访问次数");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric);
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist = DataUtils.compareDateDimension(dimensions);
assertThat(dimensionExist).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters = queryResultResp.getChatContext().getDimensionFilters();
Filter dimensionFilter = DataUtils.getFilter("user_name", FilterOperatorEnum.EQUALS, "alice", "用户名", 2L);
Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter);
assertThat(dimensionFilterExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
queryContextReq = DataUtils.getQueryContextReq(1,"对比alice和lucy呢");
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricCompare.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics1 = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric1 = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist1 = DataUtils.compareSchemaItem(metrics1, schemaItemMetric1);
assertThat(metricExist1).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions1 = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist1 = DataUtils.compareDateDimension(dimensions1);
assertThat(dimensionExist1).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters1 = queryResultResp.getChatContext().getDimensionFilters();
List<String> list = new ArrayList<>();
list.add("alice");
list.add("lucy");
Filter dimensionFilter1 = DataUtils.getFilter("user_name", FilterOperatorEnum.IN, list, "用户名", 2L);
Boolean dimensionFilterExist1 = DataUtils.compareDimensionFilter(dimensionFilters1, dimensionFilter1);
assertThat(dimensionFilterExist1).isEqualTo(true);
//assert 时间filter
DateConf dateInfo1 = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist1 = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo1);
assertThat(timeFilterExist1).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
queryContextReq = DataUtils.getQueryContextReq(1,"他是哪个部门的呢");
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics2 = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric2 = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist2 = DataUtils.compareSchemaItem(metrics2, schemaItemMetric2);
assertThat(metricExist2).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions2 = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist2 = DataUtils.compareDateDimension(dimensions2);
assertThat(dimensionExist2).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters2 = queryResultResp.getChatContext().getDimensionFilters();
List<String> list1 = new ArrayList<>();
list1.add("alice");
list1.add("lucy");
Filter dimensionFilter2 = DataUtils.getFilter("user_name", FilterOperatorEnum.IN, list1, "用户名", 2L);
Boolean dimensionFilterExist2 = DataUtils.compareDimensionFilter(dimensionFilters2, dimensionFilter2);
assertThat(dimensionFilterExist2).isEqualTo(true);
//assert 时间filter
DateConf dateInfo2 = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist2 = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo2);
assertThat(timeFilterExist2).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
}
}

View File

@@ -0,0 +1,154 @@
package com.tencent.supersonic.integration;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
import com.tencent.supersonic.chat.query.rule.metric.MetricFilterQuery;
import com.tencent.supersonic.chat.query.rule.metric.MetricGroupByQuery;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
import com.tencent.supersonic.util.DataUtils;
import org.junit.Test;
import org.junit.jupiter.api.Order;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.NONE;
public class MultiTurnsTest extends BaseQueryTest {
@Test
@Order(1)
public void queryTest_01() throws Exception {
QueryResult actualResult = submitMultiTurnChat("alice的访问次数");
QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
expectedResult.setChatContext(expectedParseInfo);
expectedResult.setQueryMode(MetricFilterQuery.QUERY_MODE);
expectedParseInfo.setAggType(NONE);
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
expectedParseInfo.getDimensionFilters().add(DataUtils.getFilter("user_name",
FilterOperatorEnum.EQUALS, "alice", "用户名", 2L));
expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.BETWEEN_CONTINUOUS, startDay, endDay));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
@Test
@Order(2)
public void queryTest_02() throws Exception {
QueryResult actualResult = submitMultiTurnChat("停留时长呢");
QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
expectedResult.setChatContext(expectedParseInfo);
expectedResult.setQueryMode(MetricFilterQuery.QUERY_MODE);
expectedParseInfo.setAggType(NONE);
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("停留时长"));
expectedParseInfo.getDimensionFilters().add(DataUtils.getFilter("user_name",
FilterOperatorEnum.EQUALS, "alice", "用户名", 2L));
expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.BETWEEN_CONTINUOUS, startDay, endDay));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
@Test
@Order(3)
public void queryTest_03() throws Exception {
QueryResult actualResult = submitMultiTurnChat("lucy的如何");
QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
expectedResult.setChatContext(expectedParseInfo);
expectedResult.setQueryMode(MetricFilterQuery.QUERY_MODE);
expectedParseInfo.setAggType(NONE);
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("停留时长"));
expectedParseInfo.getDimensionFilters().add(DataUtils.getFilter("user_name",
FilterOperatorEnum.EQUALS, "lucy", "用户名", 2L));
expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.BETWEEN_CONTINUOUS, startDay, endDay));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
@Test
@Order(4)
public void queryTest_04() throws Exception {
QueryResult actualResult = submitMultiTurnChat("按部门统计");
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_CONTINUOUS, startDay, endDay));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
@Test
@Order(5)
public void queryTest_05() throws Exception {
DateFormat format = new SimpleDateFormat("yyyy-mm-dd");
DateFormat textFormat = new SimpleDateFormat("yyyy年mm月dd日");
QueryResult actualResult = submitMultiTurnChat(textFormat.format(format.parse(startDay)));
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_CONTINUOUS, startDay, startDay));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
@Test
@Order(6)
public void queryTest_06() throws Exception {
QueryResult actualResult = submitMultiTurnChat("近30天");
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(30, DateConf.DateMode.RECENT_UNITS, "DAY"));
expectedParseInfo.setNativeQuery(false);
assertQueryResult(expectedResult, actualResult);
}
}

View File

@@ -1,567 +0,0 @@
package com.tencent.supersonic.integration;
import com.tencent.supersonic.StandaloneLauncher;
import com.tencent.supersonic.chat.api.pojo.Filter;
import com.tencent.supersonic.chat.api.request.QueryContextReq;
import com.tencent.supersonic.chat.api.response.QueryResultResp;
import com.tencent.supersonic.chat.application.query.*;
import com.tencent.supersonic.common.enums.AggregateTypeEnum;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.SchemaItem;
import com.tencent.supersonic.common.util.json.JsonUtil;
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
import com.tencent.supersonic.util.DataUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import com.tencent.supersonic.chat.domain.service.QueryService;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = StandaloneLauncher.class)
@ActiveProfiles("local")
public class QueryTest {
private static final Logger LOGGER = LoggerFactory.getLogger(QueryTest.class);
@Autowired
@Qualifier("chatQueryService")
private QueryService queryService;
//case:alice的访问次数,queryMode:METRIC_FILTER,
@Test
public void queryTest_01() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1, "alice的访问次数");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric);
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist = DataUtils.compareDateDimension(dimensions);
assertThat(dimensionExist).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters = queryResultResp.getChatContext().getDimensionFilters();
Filter dimensionFilter = DataUtils.getFilter("user_name", FilterOperatorEnum.EQUALS, "alice", "用户名", 2L);
Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter);
assertThat(dimensionFilterExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
}
//case:超音数的访问次数,queryMode:METRIC_DOMAIN
@Test
public void queryTest_02() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(2, "超音数的访问次数");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricDomain.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric);
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist = DataUtils.compareDateDimension(dimensions);
assertThat(dimensionExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
}
//case:超音数各部门的访问次数,queryMode:METRIC_GROUPBY
@Test
public void queryTest_03() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1, "超音数各部门的访问次数");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricGroupBy.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric);
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist = DataUtils.compareDateDimension(dimensions);
assertThat(dimensionExist).isEqualTo(true);
SchemaItem schemaItemDimension1 = DataUtils.getSchemaItem(1L, "部门", "department");
Boolean dimensionExist1 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension1);
assertThat(dimensionExist1).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
}
//case:对比alice和lucy的访问次数,queryMode:METRIC_COMPARE
@Test
public void queryTest_04() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1, "对比alice和lucy的访问次数");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricCompare.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric);
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist = DataUtils.compareDateDimension(dimensions);
assertThat(dimensionExist).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters = queryResultResp.getChatContext().getDimensionFilters();
List<String> list = new ArrayList<>();
list.add("alice");
list.add("lucy");
Filter dimensionFilter = DataUtils.getFilter("user_name", FilterOperatorEnum.IN, list, "用户名", 2L);
Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter);
assertThat(dimensionFilterExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
}
//case:近3天访问次数最多的用户,queryMode:ENTITY_detail
@Test
public void queryTest_05() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(2, "艺人周杰伦的代表作");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp);
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), EntityDetail.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(2L);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
SchemaItem schemaItemDimension = DataUtils.getSchemaItem(5L, "代表作", "song_name");
Boolean dimensionExist = DataUtils.compareSchemaItem(dimensions, schemaItemDimension);
assertThat(dimensionExist).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters = queryResultResp.getChatContext().getDimensionFilters();
Filter dimensionFilter = DataUtils.getFilter("singer_name", FilterOperatorEnum.EQUALS, "周杰伦", "歌手名", 7L);
Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter);
assertThat(dimensionFilterExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(1, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(true);
}
//case:近3天访问次数最多的用户名,queryMode:METRIC_ORDERBY
@Test
public void queryTest_06() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(2, "近3天访问次数最多的用户名");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricOrderBy.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), AggregateTypeEnum.MAX);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric);
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
SchemaItem schemaItemDimension = DataUtils.getSchemaItem(2L, "用户名", "user_name");
Boolean dimensionExist = DataUtils.compareSchemaItem(dimensions, schemaItemDimension);
assertThat(dimensionExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(3, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
}
//case:播放量最多的艺人,queryMode:ENTITY_LIST_TOPN
@Test
public void queryTest_07() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(2, "播放量最多的艺人");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp);
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), EntityListTopN.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), AggregateTypeEnum.MAX);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(2L);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
SchemaItem schemaItemDimension = DataUtils.getSchemaItem(7L, "歌手名", "singer_name");
Boolean dimensionExist = DataUtils.compareSchemaItem(dimensions, schemaItemDimension);
assertThat(dimensionExist).isEqualTo(true);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = DataUtils.getSchemaItem(4L, "播放量", "js_play_cnt");
Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric);
assertThat(metricExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(1, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(true);
}
//case:超音数各部门的访问次数总和,queryMode:METRIC_GROUPBY,aggType:sum
@Test
public void queryTest_09() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1, "超音数各部门的访问次数总和");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricGroupBy.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), AggregateTypeEnum.SUM);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv");
Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric);
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
Boolean dimensionExist = DataUtils.compareDateDimension(dimensions);
assertThat(dimensionExist).isEqualTo(true);
SchemaItem schemaItemDimension1 = DataUtils.getSchemaItem(1L, "部门", "department");
Boolean dimensionExist1 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension1);
assertThat(dimensionExist1).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
;
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
}
@Test
public void queryTest_10() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(2, "爱情、流行类型的艺人");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), EntityListFilter.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(2L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = DataUtils.getSchemaItem(4L, "播放量", "js_play_cnt");
Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric);
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
SchemaItem schemaItemDimension = DataUtils.getSchemaItem(7L, "歌手名", "singer_name");
Boolean dimensionExist = DataUtils.compareSchemaItem(dimensions, schemaItemDimension);
assertThat(dimensionExist).isEqualTo(true);
SchemaItem schemaItemDimension1 = DataUtils.getSchemaItem(6L, "风格", "genre");
Boolean dimensionExist1 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension1);
assertThat(dimensionExist1).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters = queryResultResp.getChatContext().getDimensionFilters();
List<String> list = new ArrayList<>();
list.add("爱情");
list.add("流行");
Filter dimensionFilter = DataUtils.getFilter("genre", FilterOperatorEnum.IN, list, "风格", 6L);
Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter);
assertThat(dimensionFilterExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(1, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(true);
}
//case:近3天访问次数最多的用户,queryMode:ENTITY_detail
@Test
public void queryTest_11() {
QueryContextReq queryContextReq = DataUtils.getQueryContextReq(1, "艺人周杰伦的代表作、风格、活跃区域");
QueryResultResp queryResultResp = new QueryResultResp();
try {
queryResultResp = queryService.executeQuery(queryContextReq);
} catch (Exception e) {
}
LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp);
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), EntityDetail.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(2L);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
SchemaItem schemaItemDimension = DataUtils.getSchemaItem(5L, "代表作", "song_name");
Boolean dimensionExist = DataUtils.compareSchemaItem(dimensions, schemaItemDimension);
assertThat(dimensionExist).isEqualTo(true);
SchemaItem schemaItemDimension1 = DataUtils.getSchemaItem(4L, "活跃区域", "act_area");
Boolean dimensionExist1 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension1);
assertThat(dimensionExist1).isEqualTo(true);
SchemaItem schemaItemDimension2 = DataUtils.getSchemaItem(6L, "风格", "genre");
Boolean dimensionExist2 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension2);
assertThat(dimensionExist2).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters = queryResultResp.getChatContext().getDimensionFilters();
Filter dimensionFilter = DataUtils.getFilter("singer_name", FilterOperatorEnum.EQUALS, "周杰伦", "歌手名", 7L);
Boolean dimensionFilterExist = DataUtils.compareDimensionFilter(dimensionFilters, dimensionFilter);
assertThat(dimensionFilterExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = DataUtils.getDateConf(1, DateConf.DateMode.RECENT_UNITS, "DAY");
Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(true);
}
// @Test
// public void queryTest_11() {
// QueryContextReq queryContextReq = DataUtils.getQueryContextReq("最近4天HR部门的访问人数");
// try {
// QueryResultResp queryResultResp = queryService.executeQuery(queryContextReq);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
//case:各部门对各页面的访问次数,queryMode:METRIC_GROUPBY
// @Test
// public void queryTest_08() {
// QueryContextReq queryContextReq = DataUtils.getQueryContextReq(3, "各部门对各页面的访问次数");
// QueryResultResp queryResultResp = new QueryResultResp();
// try {
// queryResultResp = queryService.executeQuery(queryContextReq);
// } catch (Exception e) {
//
// }
// LOGGER.info("QueryResultResp queryResultResp:{}", JsonUtil.toString(queryResultResp));
// //assert queryState
// Assert.assertEquals(queryResultResp.getQueryState(), 0);
// //assert queryMode
// Assert.assertEquals(queryResultResp.getQueryMode(), MetricGroupBy.QUERY_MODE);
// //assert aggType
// Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
// //assert 主题域Id
// assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//
// //assert 指标
// Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
// SchemaItem schemaItemMetric = DataUtils.getSchemaItem(2L, "访问次数", "pv");
// Boolean metricExist = DataUtils.compareSchemaItem(metrics, schemaItemMetric);
// assertThat(metricExist).isEqualTo(true);
//
// //assert 维度
// Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
// Boolean dimensionExist = DataUtils.compareDateDimension(dimensions);
// assertThat(dimensionExist).isEqualTo(true);
//
// SchemaItem schemaItemDimension1 = DataUtils.getSchemaItem(1L, "部门", "department");
// Boolean dimensionExist1 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension1);
// assertThat(dimensionExist1).isEqualTo(true);
//
// SchemaItem schemaItemDimension2 = DataUtils.getSchemaItem(3L, "页面", "page");
// Boolean dimensionExist2 = DataUtils.compareSchemaItem(dimensions, schemaItemDimension2);
// assertThat(dimensionExist2).isEqualTo(true);
//
//
// //assert 时间filter
// DateConf dateInfo = DataUtils.getDateConf(7, DateConf.DateMode.RECENT_UNITS, "DAY");
// Boolean timeFilterExist = DataUtils.compareDate(queryResultResp.getChatContext().getDateInfo(), dateInfo);
// assertThat(timeFilterExist).isEqualTo(true);
//
// //assert nativeQuery
// assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
//
// }
}

View File

@@ -0,0 +1,34 @@
package com.tencent.supersonic.integration.plugin;
import com.tencent.supersonic.StandaloneLauncher;
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
import com.tencent.supersonic.chat.api.pojo.response.QueryState;
import com.tencent.supersonic.chat.query.plugin.WebBase;
import com.tencent.supersonic.chat.query.plugin.webpage.WebPageQuery;
import com.tencent.supersonic.chat.query.plugin.webpage.WebPageResponse;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = StandaloneLauncher.class)
@ActiveProfiles("local")
@Slf4j
public class BasePluginTest {
protected void assertPluginRecognizeResult(QueryResult queryResult) {
Assert.assertEquals(queryResult.getQueryState(), QueryState.SUCCESS);
Assert.assertEquals(queryResult.getQueryMode(), WebPageQuery.QUERY_MODE);
WebPageResponse webPageResponse = (WebPageResponse) queryResult.getResponse();
WebBase webPage = webPageResponse.getWebPage();
Assert.assertEquals(webPage.getUrl(), "www.test.com");
Map<String, Object> valueParams = webPage.getValueParams();
Assert.assertEquals(valueParams.get("name"), "alice");
}
}

View File

@@ -0,0 +1,32 @@
package com.tencent.supersonic.integration.plugin;
import com.google.common.collect.Lists;
import com.tencent.supersonic.chat.parser.embedding.EmbeddingConfig;
import com.tencent.supersonic.chat.parser.embedding.EmbeddingResp;
import com.tencent.supersonic.chat.parser.embedding.RecallRetrieval;
import com.tencent.supersonic.chat.plugin.PluginManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import static org.mockito.Mockito.when;
@Configuration
@Slf4j
public class PluginMockConfiguration {
public static void mockEmbeddingRecognize(PluginManager pluginManager, String text, String id) {
EmbeddingResp embeddingResp = new EmbeddingResp();
RecallRetrieval embeddingRetrieval = new RecallRetrieval();
embeddingRetrieval.setId(id);
embeddingRetrieval.setPresetId(id);
embeddingRetrieval.setDistance("0.15");
embeddingResp.setQuery(text);
embeddingResp.setRetrieval(Lists.newArrayList(embeddingRetrieval));
when(pluginManager.recognize(text)).thenReturn(embeddingResp);
}
public static void mockEmbeddingUrl(EmbeddingConfig embeddingConfig) {
when(embeddingConfig.getUrl()).thenReturn("test");
}
}

View File

@@ -0,0 +1,52 @@
package com.tencent.supersonic.integration.plugin;
import com.tencent.supersonic.chat.api.pojo.request.QueryFilter;
import com.tencent.supersonic.chat.api.pojo.request.QueryFilters;
import com.tencent.supersonic.chat.api.pojo.request.QueryRequest;
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
import com.tencent.supersonic.chat.parser.embedding.EmbeddingConfig;
import com.tencent.supersonic.chat.plugin.PluginManager;
import com.tencent.supersonic.chat.service.QueryService;
import com.tencent.supersonic.util.DataUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.mock.mockito.MockBean;
public class PluginRecognizeTest extends BasePluginTest{
@MockBean
private EmbeddingConfig embeddingConfig;
@MockBean
protected PluginManager pluginManager;
@Autowired
@Qualifier("chatQueryService")
private QueryService queryService;
@Test
public void webPageRecognize() throws Exception {
PluginMockConfiguration.mockEmbeddingRecognize(pluginManager, "最近的访问情况怎么样","1");
PluginMockConfiguration.mockEmbeddingUrl(embeddingConfig);
QueryRequest queryContextReq = DataUtils.getQueryContextReq(1000, "alice最近的访问情况怎么样");
QueryResult queryResult = queryService.executeQuery(queryContextReq);
assertPluginRecognizeResult(queryResult);
}
@Test
public void webPageRecognizeWithQueryFilter() throws Exception {
PluginMockConfiguration.mockEmbeddingRecognize(pluginManager, "在超音数最近的情况怎么样","1");
PluginMockConfiguration.mockEmbeddingUrl(embeddingConfig);
QueryRequest queryRequest = DataUtils.getQueryContextReq(1000, "在超音数最近的情况怎么样");
QueryFilters queryFilters = new QueryFilters();
QueryFilter queryFilter = new QueryFilter();
queryFilter.setElementID(2L);
queryFilter.setValue("alice");
queryFilters.getFilters().add(queryFilter);
queryRequest.setQueryFilters(queryFilters);
QueryResult queryResult = queryService.executeQuery(queryRequest);
assertPluginRecognizeResult(queryResult);
}
}

View File

@@ -1,35 +1,56 @@
package com.tencent.supersonic.util;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.chat.api.pojo.Filter;
import com.tencent.supersonic.chat.api.request.QueryContextReq;
import com.tencent.supersonic.chat.api.pojo.SchemaElement;
import com.tencent.supersonic.chat.api.pojo.SchemaElementType;
import com.tencent.supersonic.chat.api.pojo.request.QueryFilter;
import com.tencent.supersonic.chat.api.pojo.request.QueryRequest;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.SchemaItem;
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
import java.util.Set;
public class DataUtils {
public static QueryContextReq getQueryContextReq(Integer id,String query) {
QueryContextReq queryContextReq = new QueryContextReq();
public static QueryRequest getQueryContextReq(Integer id, String query) {
QueryRequest queryContextReq = new QueryRequest();
queryContextReq.setQueryText(query);//"alice的访问次数"
queryContextReq.setChatId(id);
queryContextReq.setUser(new User(1L, "admin", "admin", "admin@email"));
return queryContextReq;
}
public static SchemaItem getSchemaItem(Long id, String name, String bizName) {
SchemaItem schemaItem = new SchemaItem();
schemaItem.setId(id);
schemaItem.setName(name);
schemaItem.setBizName(bizName);
return schemaItem;
public static SchemaElement getSchemaElement(String name) {
return SchemaElement.builder()
.name(name)
.build();
}
public static Filter getFilter(String bizName, FilterOperatorEnum filterOperatorEnum, Object value, String name,
Long elementId) {
Filter filter = new Filter();
public static SchemaElement getMetric(Long domainId, Long id, String name, String bizName) {
return SchemaElement.builder()
.domain(domainId)
.id(id)
.name(name)
.bizName(bizName)
.useCnt(0L)
.type(SchemaElementType.METRIC)
.build();
}
public static SchemaElement getDimension(Long domainId, Long id, String name, String bizName) {
return SchemaElement.builder()
.domain(domainId)
.id(id)
.name(name)
.bizName(bizName)
.useCnt(null)
.type(SchemaElementType.DIMENSION)
.build();
}
public static QueryFilter getFilter(String bizName, FilterOperatorEnum filterOperatorEnum, Object value, String name,
Long elementId) {
QueryFilter filter = new QueryFilter();
filter.setBizName(bizName);
filter.setOperator(filterOperatorEnum);
filter.setValue(value);
@@ -46,6 +67,13 @@ public class DataUtils {
return dateInfo;
}
public static DateConf getDateConf(DateConf.DateMode dateMode, String startDate, String endDate) {
DateConf dateInfo = new DateConf();
dateInfo.setDateMode(dateMode);
dateInfo.setStartDate(startDate);
dateInfo.setEndDate(endDate);
return dateInfo;
}
public static Boolean compareDate(DateConf dateInfo1, DateConf dateInfo2) {
Boolean timeFilterExist = dateInfo1.getUnit().equals(dateInfo2.getUnit()) &&
@@ -54,23 +82,11 @@ public class DataUtils {
return timeFilterExist;
}
public static Boolean compareSchemaItem(Set<SchemaItem> metrics, SchemaItem schemaItemMetric) {
Boolean metricExist = false;
for (SchemaItem schemaItem : metrics) {
if(schemaItem.getBizName().equals(schemaItemMetric.getBizName()))
if (schemaItem.getId()!=null&&schemaItem.getId().equals(schemaItemMetric.getId()) &&
schemaItem.getName()!=null&&schemaItem.getName().equals(schemaItemMetric.getName()) ) {
metricExist = true;
}
}
return metricExist;
}
public static Boolean compareDateDimension(Set<SchemaItem> dimensions) {
SchemaItem schemaItemDimension = new SchemaItem();
public static Boolean compareDateDimension(Set<SchemaElement> dimensions) {
SchemaElement schemaItemDimension = new SchemaElement();
schemaItemDimension.setBizName("sys_imp_date");
Boolean dimensionExist = false;
for (SchemaItem schemaItem : dimensions) {
for (SchemaElement schemaItem : dimensions) {
if (schemaItem.getBizName().equals(schemaItemDimension.getBizName())) {
dimensionExist = true;
}
@@ -78,9 +94,9 @@ public class DataUtils {
return dimensionExist;
}
public static Boolean compareDimensionFilter(Set<Filter> dimensionFilters, Filter dimensionFilter) {
public static Boolean compareDimensionFilter(Set<QueryFilter> dimensionFilters, QueryFilter dimensionFilter) {
Boolean dimensionFilterExist = false;
for (Filter filter : dimensionFilters) {
for (QueryFilter filter : dimensionFilters) {
if (filter.getBizName().equals(dimensionFilter.getBizName()) &&
filter.getOperator().equals(dimensionFilter.getOperator()) &&
filter.getValue().toString().equals(dimensionFilter.getValue().toString()) &&

View File

@@ -1,20 +1,21 @@
com.tencent.supersonic.chat.api.component.SchemaMapper=\
com.tencent.supersonic.chat.application.mapper.HanlpSchemaMapper
com.tencent.supersonic.chat.mapper.HanlpDictMapper
com.tencent.supersonic.chat.api.component.SemanticParser=\
com.tencent.supersonic.chat.application.parser.DomainSemanticParser, \
com.tencent.supersonic.chat.application.parser.TimeSemanticParser, \
com.tencent.supersonic.chat.application.parser.AggregateSemanticParser
# com.tencent.supersonic.chat.application.parser.LLMSemanticParser
com.tencent.supersonic.chat.parser.rule.QueryModeParser, \
com.tencent.supersonic.chat.parser.rule.ContextInheritParser, \
com.tencent.supersonic.chat.parser.rule.TimeRangeParser, \
com.tencent.supersonic.chat.parser.rule.AggregateTypeParser
# com.tencent.supersonic.chat.parser.llm.DSLQueryFunction
com.tencent.supersonic.chat.api.component.QueryProcessor=\
com.tencent.supersonic.chat.application.processor.SemanticQueryProcessor
com.tencent.supersonic.chat.api.component.SemanticLayer=\
com.tencent.supersonic.chat.infrastructure.semantic.LocalSemanticLayerImpl
com.tencent.supersonic.knowledge.semantic.LocalSemanticLayer
com.tencent.supersonic.chat.application.query.QuerySelector=\
com.tencent.supersonic.chat.application.query.HeuristicQuerySelector
com.tencent.supersonic.chat.query.QuerySelector=\
com.tencent.supersonic.chat.query.HeuristicQuerySelector
com.tencent.supersonic.chat.application.query.DomainResolver=\
com.tencent.supersonic.chat.application.query.HeuristicDomainResolver

View File

@@ -6,8 +6,8 @@ insert into s2_user (id, `name`, password, display_name, email) values (4, 'lucy
--insert into s2_chat_config (`id` ,`domain_id` ,`default_metrics`,`visibility`,`entity_info` ,`dictionary_info`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) values (1,1,'[{"metricId":1,"unit":7,"period":"DAY"}]','{"blackDimIdList":[],"blackMetricIdList":[]}','{"entityIds":[2],"names":["用户","用户姓名"],"detailData":{"dimensionIds":[1,2],"metricIds":[2]}}','[{"itemId":1,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":2,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":3,"type":"DIMENSION","blackList":[],"isDictInfo":true}]','2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1);
insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` )
values (1,1,'{"visibility":{"blackDimIdList":[1],"blackMetricIdList":[2]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":1,"period":"DAY"},"entity":null}',
'{"visibility":{"blackDimIdList":[3],"blackMetricIdList":[3]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":1,"period":"DAY"}}',
values (1,1,'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":7,"period":"DAY"},"entity":null}',
'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"ratioMetricIds":[2],"unit":7,"period":"DAY"}}',
'2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1);
insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` )
values (2,2,'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"},"entity":{"entityId":1,"names":["歌手","艺人"]}}',
@@ -27,6 +27,8 @@ insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,
insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(5, '2023-06-10 10:41:48.211','停留时长','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}',0,'');
insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(6, '2023-06-10 10:42:02.184','访问','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}',0,'');
insert into s2_plugin (id, `type`, `domain`, pattern, parse_mode, `name`, created_at, created_by, updated_at, updated_by, config) VALUES (1, 'WEB_PAGE', 1, '访问情况', 'EMBEDDING_RECALL', '访问情况', '2023-06-11 19:36:47', 'admin', '2023-06-21 15:26:46', 'admin', '{"params":{"name":"2"}, "url":"www.test.com"}');
insert into s2_plugin (id, `type`, `domain`, pattern, parse_mode, `name`, created_at, created_by, updated_at, updated_by, config) VALUES (2, 'WEB_PAGE', 2, '播放表现', 'EMBEDDING_RECALL', '播放表现', '2023-06-11 19:36:47', 'admin', '2023-06-21 15:26:46', 'admin', '{"params":{"name":"7"}, "url":"www.test.com"}');
-- semantic data
insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(1, 1, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin');

View File

@@ -44,6 +44,7 @@ CREATE TABLE IF NOT EXISTS `s2_chat_config` (
`domain_id` INT DEFAULT NULL ,
`chat_detail_config` varchar(655) ,
`chat_agg_config` varchar(655) ,
`recommended_questions` varchar(1500) ,
`created_at` TIMESTAMP NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
@@ -117,6 +118,7 @@ CREATE TABLE IF NOT EXISTS `s2_domain` (
`is_open` TINYINT DEFAULT NULL , -- whether the domain is public
`viewer` varchar(3000) DEFAULT NULL , -- domain available users
`view_org` varchar(3000) DEFAULT NULL , -- domain available organization
`entity` varchar(500) DEFAULT NULL , -- domain entity info
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_domain IS 'domain basic information';
@@ -127,6 +129,7 @@ CREATE TABLE `s2_database` (
`domain_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`description` varchar(500) DEFAULT NULL ,
`version` varchar(64) DEFAULT NULL ,
`type` varchar(20) NOT NULL , -- type: mysql,clickhouse,tdw
`config` varchar(655) NOT NULL ,
`created_at` TIMESTAMP NOT NULL ,
@@ -201,6 +204,7 @@ CREATE TABLE IF NOT EXISTS `s2_dimension` (
`semantic_type` varchar(20) NOT NULL, -- semantic type: DATE, ID, CATEGORY
`alias` varchar(500) DEFAULT NULL,
`default_values` varchar(500) DEFAULT NULL,
`dim_value_maps` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_dimension IS 'dimension information table';
@@ -309,6 +313,22 @@ CREATE TABLE IF NOT EXISTS `s2_available_date_info` (
);
COMMENT ON TABLE s2_dimension IS 'dimension information table';
CREATE TABLE IF NOT EXISTS `s2_plugin`
(
`id` INT AUTO_INCREMENT,
`type` varchar(50) NULL,
`domain` varchar(100) NULL,
`pattern` varchar(500) NULL,
`parse_mode` varchar(100) NULL,
`name` varchar(100) NULL,
`created_at` TIMESTAMP NULL,
`created_by` varchar(100) null,
`updated_at` TIMESTAMP NULL,
`updated_by` varchar(100) NULL,
`config` LONGVARCHAR NULL,
PRIMARY KEY (`id`)
); COMMENT ON TABLE s2_plugin IS 'plugin information table';
-------demo for semantic and chat
CREATE TABLE IF NOT EXISTS `s2_user_department` (