[improvement][launcher]Refactor unit tests and demo data. (#1935)

This commit is contained in:
Jun Zhang
2024-12-01 21:08:26 +08:00
committed by GitHub
parent 639d1a78da
commit 0fc29304a8
67 changed files with 2181 additions and 2373 deletions

View File

@@ -1,5 +1,8 @@
package com.tencent.supersonic.chat.server.persistence.dataobject; package com.tencent.supersonic.chat.server.persistence.dataobject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import lombok.ToString; import lombok.ToString;
@@ -7,9 +10,10 @@ import java.util.Date;
@Data @Data
@ToString @ToString
@TableName("s2_chat_config")
public class ChatConfigDO { public class ChatConfigDO {
/** database auto-increment primary key */ @TableId(type = IdType.AUTO)
private Long id; private Long id;
private Long modelId; private Long modelId;

View File

@@ -1,15 +1,21 @@
package com.tencent.supersonic.chat.server.persistence.dataobject; package com.tencent.supersonic.chat.server.persistence.dataobject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.time.Instant; import java.time.Instant;
@Data @Data
@TableName("s2_chat_context")
public class ChatContextDO implements Serializable { public class ChatContextDO implements Serializable {
@TableId
private Integer chatId; private Integer chatId;
private Instant modifiedAt; private Instant modifiedAt;
@TableField("query_user")
private String user; private String user;
private String queryText; private String queryText;
private String semanticParse; private String semanticParse;

View File

@@ -1,5 +1,6 @@
package com.tencent.supersonic.chat.server.persistence.mapper; package com.tencent.supersonic.chat.server.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tencent.supersonic.chat.server.config.ChatConfigFilterInternal; import com.tencent.supersonic.chat.server.config.ChatConfigFilterInternal;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatConfigDO; import com.tencent.supersonic.chat.server.persistence.dataobject.ChatConfigDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@@ -7,11 +8,7 @@ import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
@Mapper @Mapper
public interface ChatConfigMapper { public interface ChatConfigMapper extends BaseMapper<ChatConfigDO> {
Long addConfig(ChatConfigDO chaConfigPO);
Long editConfig(ChatConfigDO chaConfigPO);
List<ChatConfigDO> search(ChatConfigFilterInternal filterInternal); List<ChatConfigDO> search(ChatConfigFilterInternal filterInternal);

View File

@@ -1,14 +1,11 @@
package com.tencent.supersonic.chat.server.persistence.mapper; package com.tencent.supersonic.chat.server.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatContextDO; import com.tencent.supersonic.chat.server.persistence.dataobject.ChatContextDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface ChatContextMapper { public interface ChatContextMapper extends BaseMapper<ChatContextDO> {
ChatContextDO getContextByChatId(Integer chatId); ChatContextDO getContextByChatId(Integer chatId);
int updateContext(ChatContextDO contextDO);
int addContext(ChatContextDO contextDO);
} }

View File

@@ -32,15 +32,15 @@ public class ChatConfigRepositoryImpl implements ChatConfigRepository {
@Override @Override
public Long createConfig(ChatConfig chaConfig) { public Long createConfig(ChatConfig chaConfig) {
ChatConfigDO chaConfigDO = chatConfigHelper.chatConfig2DO(chaConfig); ChatConfigDO chaConfigDO = chatConfigHelper.chatConfig2DO(chaConfig);
chatConfigMapper.addConfig(chaConfigDO); chatConfigMapper.insert(chaConfigDO);
return chaConfigDO.getId(); return chaConfigDO.getId();
} }
@Override @Override
public Long updateConfig(ChatConfig chaConfig) { public Long updateConfig(ChatConfig chaConfig) {
ChatConfigDO chaConfigDO = chatConfigHelper.chatConfig2DO(chaConfig); ChatConfigDO chaConfigDO = chatConfigHelper.chatConfig2DO(chaConfig);
chatConfigMapper.updateById(chaConfigDO);
return chatConfigMapper.editConfig(chaConfigDO); return chaConfigDO.getId();
} }
@Override @Override

View File

@@ -35,12 +35,7 @@ public class ChatContextRepositoryImpl implements ChatContextRepository {
@Override @Override
public void updateContext(ChatContext chatCtx) { public void updateContext(ChatContext chatCtx) {
ChatContextDO context = cast(chatCtx); chatContextMapper.insertOrUpdate(cast(chatCtx));
if (chatContextMapper.getContextByChatId(chatCtx.getChatId()) == null) {
chatContextMapper.addContext(context);
} else {
chatContextMapper.updateContext(context);
}
} }
private ChatContext cast(ChatContextDO contextDO) { private ChatContext cast(ChatContextDO contextDO) {

View File

@@ -20,54 +20,6 @@
<result column="updated_at" property="updatedAt"/> <result column="updated_at" property="updatedAt"/>
</resultMap> </resultMap>
<insert id="addConfig"
parameterType="com.tencent.supersonic.chat.server.persistence.dataobject.ChatConfigDO"
useGeneratedKeys="true" keyProperty="id">
insert into s2_chat_config
(
model_id, `chat_detail_config`, chat_agg_config, recommended_questions, status, llm_examples, created_by, updated_by, created_at, updated_at
)
values
(
#{modelId}, #{chatDetailConfig}, #{chatAggConfig}, #{recommendedQuestions}, #{status}, #{llmExamples}, #{createdBy}, #{updatedBy}, #{createdAt}, #{updatedAt}
)
</insert>
<update id="editConfig">
update s2_chat_config
<set>
`updated_at` = #{updatedAt} ,
<if test="chatDetailConfig != null and chatDetailConfig != ''">
`chat_detail_config` = #{chatDetailConfig} ,
</if>
<if test="chatAggConfig != null and chatAggConfig != ''">
chat_agg_config = #{chatAggConfig} ,
</if>
<if test="recommendedQuestions != null and recommendedQuestions != ''">
recommended_questions = #{recommendedQuestions} ,
</if>
<if test="status != null and status != ''">
status = #{status} ,
</if>
<if test="updatedBy != null and updatedBy != ''">
updated_by = #{updatedBy} ,
</if>
<if test="llmExamples != null and llmExamples != ''">
llm_examples = #{llmExamples} ,
</if>
</set>
<where>
<if test="id != null and id != ''">
id = #{id}
</if>
<if test="modelId != null and modelId != ''">
and model_id = #{modelId}
</if>
</where>
</update>
<select id="search" resultMap="chaConfigDO"> <select id="search" resultMap="chaConfigDO">
select * select *
from s2_chat_config from s2_chat_config

View File

@@ -20,11 +20,4 @@
from s2_chat_context where chat_id=#{chatId} limit 1 from s2_chat_context where chat_id=#{chatId} limit 1
</select> </select>
<insert id="addContext" parameterType="com.tencent.supersonic.chat.server.persistence.dataobject.ChatContextDO" >
insert into s2_chat_context (chat_id,user,query_text,semantic_parse) values (#{chatId}, #{user},#{queryText}, #{semanticParse})
</insert>
<update id="updateContext">
update s2_chat_context set query_text=#{queryText},semantic_parse=#{semanticParse} where chat_id=#{chatId}
</update>
</mapper> </mapper>

View File

@@ -74,7 +74,6 @@ public class SqlValidHelper {
CCJSqlParserUtil.parse(sql); CCJSqlParserUtil.parse(sql);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
log.error("isValidSQL parse:{}", e);
return false; return false;
} }
} }

View File

@@ -17,5 +17,7 @@ public class DbSchema {
private String sql; private String sql;
private String ddl;
private List<DBColumn> dbColumns; private List<DBColumn> dbColumns;
} }

View File

@@ -1,6 +1,7 @@
package com.tencent.supersonic.headless.api.pojo.request; package com.tencent.supersonic.headless.api.pojo.request;
import com.tencent.supersonic.common.pojo.ChatModelConfig; import com.tencent.supersonic.common.pojo.ChatModelConfig;
import com.tencent.supersonic.headless.api.pojo.DbSchema;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@@ -10,12 +11,16 @@ public class ModelBuildReq {
private Long databaseId; private Long databaseId;
private Long domainId;
private String sql; private String sql;
private String db; private String db;
private List<String> tables; private List<String> tables;
private List<DbSchema> dbSchemas;
private boolean buildByLLM; private boolean buildByLLM;
private Integer chatModelId; private Integer chatModelId;

View File

@@ -78,7 +78,9 @@ public class PostgresqlAdaptor extends BaseDbAdaptor {
} }
return o; return o;
}); });
return SqlReplaceHelper.replaceFunction(sql, functionMap, functionCall); sql = SqlReplaceHelper.replaceFunction(sql, functionMap, functionCall);
sql = sql.replaceAll("`", "\"");
return sql;
} }
public List<String> getTables(ConnectInfo connectionInfo, String schemaName) public List<String> getTables(ConnectInfo connectionInfo, String schemaName)

View File

@@ -1,10 +1,15 @@
package com.tencent.supersonic.headless.server.persistence.dataobject; package com.tencent.supersonic.headless.server.persistence.dataobject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
@Data @Data
@TableName("s2_available_date_info")
public class DateInfoDO { public class DateInfoDO {
@TableId(type = IdType.AUTO)
private Long id; private Long id;
private String type; private String type;
private Long itemId; private Long itemId;

View File

@@ -0,0 +1,52 @@
package com.tencent.supersonic.headless.server.persistence.dataobject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("s2_query_stat_info")
public class QueryStatDO {
@TableId(type = IdType.AUTO)
private Long id;
private String traceId;
private Long modelId;
private Long dataSetId;
@TableField("query_user")
private String user;
private String createdAt;
/** corresponding type, such as sql, struct, etc */
private String queryType;
/** NORMAL, PRE_FLUSH */
private Integer queryTypeBack;
private String querySqlCmd;
@TableField("sql_cmd_md5")
private String querySqlCmdMd5;
private String queryStructCmd;
@TableField("struct_cmd_md5")
private String queryStructCmdMd5;
private String sql;
private String sqlMd5;
private String queryEngine;
// private Long startTime;
private Long elapsedMs;
private String queryState;
private Boolean nativeQuery;
private String startDate;
private String endDate;
private String dimensions;
private String metrics;
private String selectCols;
private String aggCols;
private String filterCols;
private String groupByCols;
private String orderByCols;
private Boolean useResultCache;
private Boolean useSqlCache;
private String sqlCacheKey;
private String resultCacheKey;
private String queryOptMode;
}

View File

@@ -1,5 +1,6 @@
package com.tencent.supersonic.headless.server.persistence.mapper; package com.tencent.supersonic.headless.server.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tencent.supersonic.headless.api.pojo.ItemDateFilter; import com.tencent.supersonic.headless.api.pojo.ItemDateFilter;
import com.tencent.supersonic.headless.server.persistence.dataobject.DateInfoDO; import com.tencent.supersonic.headless.server.persistence.dataobject.DateInfoDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@@ -7,9 +8,7 @@ import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
@Mapper @Mapper
public interface DateInfoMapper { public interface DateInfoMapper extends BaseMapper<DateInfoDO> {
Boolean upsertDateInfo(DateInfoDO dateInfoDO);
List<DateInfoDO> getDateInfos(ItemDateFilter itemDateFilter); List<DateInfoDO> getDateInfos(ItemDateFilter itemDateFilter);
} }

View File

@@ -1,15 +1,15 @@
package com.tencent.supersonic.headless.server.persistence.mapper; package com.tencent.supersonic.headless.server.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tencent.supersonic.headless.api.pojo.QueryStat; import com.tencent.supersonic.headless.api.pojo.QueryStat;
import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq; import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq;
import com.tencent.supersonic.headless.server.persistence.dataobject.QueryStatDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
@Mapper @Mapper
public interface StatMapper { public interface StatMapper extends BaseMapper<QueryStatDO> {
Boolean createRecord(QueryStat queryStatInfo);
List<QueryStat> getStatInfo(ItemUseReq itemUseCommend); List<QueryStat> getStatInfo(ItemUseReq itemUseCommend);
} }

View File

@@ -15,4 +15,6 @@ public interface DomainRepository {
List<DomainDO> getDomainList(); List<DomainDO> getDomainList();
DomainDO getDomainById(Long id); DomainDO getDomainById(Long id);
List<DomainDO> getDomainByBizName(String bizName);
} }

View File

@@ -12,5 +12,4 @@ public interface StatRepository {
List<ItemUseResp> getStatInfo(ItemUseReq itemUseCommend); List<ItemUseResp> getStatInfo(ItemUseReq itemUseCommend);
List<QueryStat> getQueryStatInfoWithoutCache(ItemUseReq itemUseCommend);
} }

View File

@@ -66,7 +66,7 @@ public class DateInfoRepositoryImpl implements DateInfoRepository {
private Integer batchUpsert(List<DateInfoDO> dateInfoDOList) { private Integer batchUpsert(List<DateInfoDO> dateInfoDOList) {
Stopwatch stopwatch = Stopwatch.createStarted(); Stopwatch stopwatch = Stopwatch.createStarted();
for (DateInfoDO dateInfoDO : dateInfoDOList) { for (DateInfoDO dateInfoDO : dateInfoDOList) {
dateInfoMapper.upsertDateInfo(dateInfoDO); dateInfoMapper.insertOrUpdate(dateInfoDO);
} }
log.info("before final, elapsed time:{}", stopwatch.elapsed(TimeUnit.MILLISECONDS)); log.info("before final, elapsed time:{}", stopwatch.elapsed(TimeUnit.MILLISECONDS));
return 0; return 0;

View File

@@ -1,5 +1,6 @@
package com.tencent.supersonic.headless.server.persistence.repository.impl; package com.tencent.supersonic.headless.server.persistence.repository.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.tencent.supersonic.headless.server.persistence.dataobject.DomainDO; import com.tencent.supersonic.headless.server.persistence.dataobject.DomainDO;
import com.tencent.supersonic.headless.server.persistence.mapper.DomainDOMapper; import com.tencent.supersonic.headless.server.persistence.mapper.DomainDOMapper;
@@ -43,4 +44,12 @@ public class DomainRepositoryImpl implements DomainRepository {
public DomainDO getDomainById(Long id) { public DomainDO getDomainById(Long id) {
return domainDOMapper.selectById(id); return domainDOMapper.selectById(id);
} }
@Override
public List<DomainDO> getDomainByBizName(String bizName) {
QueryWrapper<DomainDO> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(DomainDO::getBizName, bizName);
return domainDOMapper.selectList(queryWrapper);
}
} }

View File

@@ -6,11 +6,13 @@ import com.tencent.supersonic.common.pojo.enums.TypeEnums;
import com.tencent.supersonic.headless.api.pojo.QueryStat; import com.tencent.supersonic.headless.api.pojo.QueryStat;
import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq; import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq;
import com.tencent.supersonic.headless.api.pojo.response.ItemUseResp; import com.tencent.supersonic.headless.api.pojo.response.ItemUseResp;
import com.tencent.supersonic.headless.server.persistence.dataobject.QueryStatDO;
import com.tencent.supersonic.headless.server.persistence.mapper.StatMapper; import com.tencent.supersonic.headless.server.persistence.mapper.StatMapper;
import com.tencent.supersonic.headless.server.persistence.repository.StatRepository; import com.tencent.supersonic.headless.server.persistence.repository.StatRepository;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.ArrayList; import java.util.ArrayList;
@@ -36,7 +38,9 @@ public class StatRepositoryImpl implements StatRepository {
@Override @Override
public Boolean createRecord(QueryStat queryStatInfo) { public Boolean createRecord(QueryStat queryStatInfo) {
return statMapper.createRecord(queryStatInfo); QueryStatDO queryStatDO = new QueryStatDO();
BeanUtils.copyProperties(queryStatInfo, queryStatDO);
return statMapper.insertOrUpdate(queryStatDO);
} }
@Override @Override
@@ -66,11 +70,6 @@ public class StatRepositoryImpl implements StatRepository {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@Override
public List<QueryStat> getQueryStatInfoWithoutCache(ItemUseReq itemUseCommend) {
return statMapper.getStatInfo(itemUseCommend);
}
private void updateStatMapInfo(Map<String, Long> map, String dimensions, String type, private void updateStatMapInfo(Map<String, Long> map, String dimensions, String type,
Long dataSetId) { Long dataSetId) {
if (StringUtils.isNotEmpty(dimensions)) { if (StringUtils.isNotEmpty(dimensions)) {
@@ -92,14 +91,4 @@ public class StatRepositoryImpl implements StatRepository {
} }
} }
private void updateStatMapInfo(Map<String, Long> map, Long modelId, String type) {
if (Objects.nonNull(modelId)) {
String key = type + AT_SYMBOL + AT_SYMBOL + modelId;
if (map.containsKey(key)) {
map.put(key, map.get(key) + 1);
} else {
map.put(key, 1L);
}
}
}
} }

View File

@@ -50,6 +50,14 @@ public class ModelController {
return true; return true;
} }
@PostMapping("/createModelBatch")
public Boolean createModelBatch(@RequestBody ModelBuildReq modelBuildReq,
HttpServletRequest request, HttpServletResponse response) throws Exception {
User user = UserHolder.findUser(request, response);
modelService.createModel(modelBuildReq, user);
return true;
}
@PostMapping("/updateModel") @PostMapping("/updateModel")
public Boolean updateModel(@RequestBody ModelReq modelReq, HttpServletRequest request, public Boolean updateModel(@RequestBody ModelReq modelReq, HttpServletRequest request,
HttpServletResponse response) throws Exception { HttpServletResponse response) throws Exception {

View File

@@ -2,6 +2,7 @@ package com.tencent.supersonic.headless.server.service;
import com.tencent.supersonic.common.pojo.User; import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.DBColumn; import com.tencent.supersonic.headless.api.pojo.DBColumn;
import com.tencent.supersonic.headless.api.pojo.enums.DataType;
import com.tencent.supersonic.headless.api.pojo.request.DatabaseReq; import com.tencent.supersonic.headless.api.pojo.request.DatabaseReq;
import com.tencent.supersonic.headless.api.pojo.request.ModelBuildReq; import com.tencent.supersonic.headless.api.pojo.request.ModelBuildReq;
import com.tencent.supersonic.headless.api.pojo.request.SqlExecuteReq; import com.tencent.supersonic.headless.api.pojo.request.SqlExecuteReq;
@@ -17,6 +18,8 @@ public interface DatabaseService {
SemanticQueryResp executeSql(String sql, DatabaseResp databaseResp); SemanticQueryResp executeSql(String sql, DatabaseResp databaseResp);
List<DatabaseResp> getDatabaseByType(DataType dataType);
SemanticQueryResp executeSql(SqlExecuteReq sqlExecuteReq, Long id, User user); SemanticQueryResp executeSql(SqlExecuteReq sqlExecuteReq, Long id, User user);
DatabaseResp getDatabase(Long id, User user); DatabaseResp getDatabase(Long id, User user);

View File

@@ -5,6 +5,7 @@ import com.tencent.supersonic.common.pojo.enums.AuthType;
import com.tencent.supersonic.headless.api.pojo.request.DomainReq; import com.tencent.supersonic.headless.api.pojo.request.DomainReq;
import com.tencent.supersonic.headless.api.pojo.request.DomainUpdateReq; import com.tencent.supersonic.headless.api.pojo.request.DomainUpdateReq;
import com.tencent.supersonic.headless.api.pojo.response.DomainResp; import com.tencent.supersonic.headless.api.pojo.response.DomainResp;
import com.tencent.supersonic.headless.server.persistence.dataobject.DomainDO;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -32,5 +33,7 @@ public interface DomainService {
Set<DomainResp> getDomainAuthSet(User user, AuthType authTypeEnum); Set<DomainResp> getDomainAuthSet(User user, AuthType authTypeEnum);
List<DomainDO> getDomainByBizName(String bizName);
Set<DomainResp> getDomainChildren(List<Long> domainId); Set<DomainResp> getDomainChildren(List<Long> domainId);
} }

View File

@@ -23,6 +23,8 @@ public interface ModelService {
ModelResp createModel(ModelReq datasourceReq, User user) throws Exception; ModelResp createModel(ModelReq datasourceReq, User user) throws Exception;
List<ModelResp> createModel(ModelBuildReq modelBuildReq, User user) throws Exception;
ModelResp updateModel(ModelReq datasourceReq, User user) throws Exception; ModelResp updateModel(ModelReq datasourceReq, User user) throws Exception;
List<ModelResp> getModelList(MetaFilter metaFilter); List<ModelResp> getModelList(MetaFilter metaFilter);

View File

@@ -1,11 +1,13 @@
package com.tencent.supersonic.headless.server.service.impl; package com.tencent.supersonic.headless.server.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.tencent.supersonic.common.pojo.QueryColumn; import com.tencent.supersonic.common.pojo.QueryColumn;
import com.tencent.supersonic.common.pojo.User; import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.pojo.enums.EngineType; import com.tencent.supersonic.common.pojo.enums.EngineType;
import com.tencent.supersonic.headless.api.pojo.DBColumn; import com.tencent.supersonic.headless.api.pojo.DBColumn;
import com.tencent.supersonic.headless.api.pojo.enums.DataType;
import com.tencent.supersonic.headless.api.pojo.request.DatabaseReq; import com.tencent.supersonic.headless.api.pojo.request.DatabaseReq;
import com.tencent.supersonic.headless.api.pojo.request.ModelBuildReq; import com.tencent.supersonic.headless.api.pojo.request.ModelBuildReq;
import com.tencent.supersonic.headless.api.pojo.request.SqlExecuteReq; import com.tencent.supersonic.headless.api.pojo.request.SqlExecuteReq;
@@ -131,6 +133,15 @@ public class DatabaseServiceImpl extends ServiceImpl<DatabaseDOMapper, DatabaseD
return databaseResp; return databaseResp;
} }
@Override
public List<DatabaseResp> getDatabaseByType(DataType dataType) {
QueryWrapper<DatabaseDO> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(DatabaseDO::getType, dataType.getFeature());
List<DatabaseDO> list = list(queryWrapper);
return list.stream().map(DatabaseConverter::convertWithPassword)
.collect(Collectors.toList());
}
@Override @Override
public SemanticQueryResp executeSql(SqlExecuteReq sqlExecuteReq, Long id, User user) { public SemanticQueryResp executeSql(SqlExecuteReq sqlExecuteReq, Long id, User user) {
DatabaseResp databaseResp = getDatabase(id); DatabaseResp databaseResp = getDatabase(id);

View File

@@ -179,6 +179,11 @@ public class DomainServiceImpl implements DomainService {
.collect(Collectors.toMap(DomainResp::getId, a -> a, (k1, k2) -> k1)); .collect(Collectors.toMap(DomainResp::getId, a -> a, (k1, k2) -> k1));
} }
@Override
public List<DomainDO> getDomainByBizName(String bizName) {
return domainRepository.getDomainByBizName(bizName);
}
@Override @Override
public Set<DomainResp> getDomainChildren(List<Long> domainIds) { public Set<DomainResp> getDomainChildren(List<Long> domainIds) {
Set<DomainResp> childDomains = new HashSet<>(); Set<DomainResp> childDomains = new HashSet<>();

View File

@@ -125,6 +125,19 @@ public class ModelServiceImpl implements ModelService {
return ModelConverter.convert(modelDO); return ModelConverter.convert(modelDO);
} }
@Override
public List<ModelResp> createModel(ModelBuildReq modelBuildReq, User user) throws Exception {
List<ModelResp> modelResps = Lists.newArrayList();
Map<String, ModelSchema> modelSchemaMap = buildModelSchema(modelBuildReq);
for (Map.Entry<String, ModelSchema> entry : modelSchemaMap.entrySet()) {
ModelReq modelReq =
ModelConverter.convert(entry.getValue(), modelBuildReq, entry.getKey());
ModelResp modelResp = createModel(modelReq, user);
modelResps.add(modelResp);
}
return modelResps;
}
@Override @Override
@Transactional @Transactional
public ModelResp updateModel(ModelReq modelReq, User user) throws Exception { public ModelResp updateModel(ModelReq modelReq, User user) throws Exception {
@@ -231,6 +244,9 @@ public class ModelServiceImpl implements ModelService {
} }
private List<DbSchema> getDbSchemes(ModelBuildReq modelBuildReq) throws SQLException { private List<DbSchema> getDbSchemes(ModelBuildReq modelBuildReq) throws SQLException {
if (!CollectionUtils.isEmpty(modelBuildReq.getDbSchemas())) {
return modelBuildReq.getDbSchemas();
}
Map<String, List<DBColumn>> dbColumnMap = databaseService.getDbColumns(modelBuildReq); Map<String, List<DBColumn>> dbColumnMap = databaseService.getDbColumns(modelBuildReq);
return convert(dbColumnMap, modelBuildReq); return convert(dbColumnMap, modelBuildReq);
} }

View File

@@ -7,6 +7,7 @@ import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.pojo.enums.StatusEnum; import com.tencent.supersonic.common.pojo.enums.StatusEnum;
import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.common.util.BeanMapper;
import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.common.util.JsonUtil;
import com.tencent.supersonic.headless.api.pojo.ColumnSchema;
import com.tencent.supersonic.headless.api.pojo.Dim; import com.tencent.supersonic.headless.api.pojo.Dim;
import com.tencent.supersonic.headless.api.pojo.DrillDownDimension; import com.tencent.supersonic.headless.api.pojo.DrillDownDimension;
import com.tencent.supersonic.headless.api.pojo.Identify; import com.tencent.supersonic.headless.api.pojo.Identify;
@@ -14,11 +15,16 @@ import com.tencent.supersonic.headless.api.pojo.Measure;
import com.tencent.supersonic.headless.api.pojo.MeasureParam; import com.tencent.supersonic.headless.api.pojo.MeasureParam;
import com.tencent.supersonic.headless.api.pojo.MetricDefineByMeasureParams; import com.tencent.supersonic.headless.api.pojo.MetricDefineByMeasureParams;
import com.tencent.supersonic.headless.api.pojo.ModelDetail; import com.tencent.supersonic.headless.api.pojo.ModelDetail;
import com.tencent.supersonic.headless.api.pojo.ModelSchema;
import com.tencent.supersonic.headless.api.pojo.enums.DimensionType; import com.tencent.supersonic.headless.api.pojo.enums.DimensionType;
import com.tencent.supersonic.headless.api.pojo.enums.FieldType;
import com.tencent.supersonic.headless.api.pojo.enums.IdentifyType;
import com.tencent.supersonic.headless.api.pojo.enums.MetricDefineType; import com.tencent.supersonic.headless.api.pojo.enums.MetricDefineType;
import com.tencent.supersonic.headless.api.pojo.enums.ModelDefineType;
import com.tencent.supersonic.headless.api.pojo.enums.SemanticType; import com.tencent.supersonic.headless.api.pojo.enums.SemanticType;
import com.tencent.supersonic.headless.api.pojo.request.DimensionReq; import com.tencent.supersonic.headless.api.pojo.request.DimensionReq;
import com.tencent.supersonic.headless.api.pojo.request.MetricReq; import com.tencent.supersonic.headless.api.pojo.request.MetricReq;
import com.tencent.supersonic.headless.api.pojo.request.ModelBuildReq;
import com.tencent.supersonic.headless.api.pojo.request.ModelReq; import com.tencent.supersonic.headless.api.pojo.request.ModelReq;
import com.tencent.supersonic.headless.api.pojo.response.DomainResp; import com.tencent.supersonic.headless.api.pojo.response.DomainResp;
import com.tencent.supersonic.headless.api.pojo.response.MeasureResp; import com.tencent.supersonic.headless.api.pojo.response.MeasureResp;
@@ -156,6 +162,49 @@ public class ModelConverter {
return dimensionReq; return dimensionReq;
} }
public static ModelReq convert(ModelSchema modelSchema, ModelBuildReq modelBuildReq,
String tableName) {
ModelReq modelReq = new ModelReq();
modelReq.setName(modelSchema.getName());
modelReq.setBizName(modelSchema.getBizName());
modelReq.setDatabaseId(modelBuildReq.getDatabaseId());
modelReq.setDomainId(modelBuildReq.getDomainId());
ModelDetail modelDetail = new ModelDetail();
if (StringUtils.isNotBlank(modelBuildReq.getSql())) {
modelDetail.setQueryType(ModelDefineType.SQL_QUERY.getName());
modelDetail.setSqlQuery(modelBuildReq.getSql());
} else {
modelDetail.setQueryType(ModelDefineType.TABLE_QUERY.getName());
modelDetail.setTableQuery(String.format("%s.%s", modelBuildReq.getDb(), tableName));
}
for (ColumnSchema columnSchema : modelSchema.getColumnSchemas()) {
FieldType fieldType = columnSchema.getFiledType();
if (getIdentifyType(fieldType) != null) {
Identify identify = new Identify(columnSchema.getName(),
getIdentifyType(fieldType).name(), columnSchema.getColumnName(), 1);
modelDetail.getIdentifiers().add(identify);
} else if (FieldType.measure.equals(fieldType)) {
Measure measure = new Measure(columnSchema.getName(), columnSchema.getColumnName(),
columnSchema.getAgg().getOperator(), 1);
modelDetail.getMeasures().add(measure);
} else {
Dim dim = new Dim(columnSchema.getName(), columnSchema.getColumnName(),
DimensionType.valueOf(columnSchema.getFiledType().name()), 1);
modelDetail.getDimensions().add(dim);
}
}
modelReq.setModelDetail(modelDetail);
return modelReq;
}
private static IdentifyType getIdentifyType(FieldType fieldType) {
if (FieldType.foreign_key.equals(fieldType) || FieldType.primary_key.equals(fieldType)) {
return IdentifyType.primary;
} else {
return IdentifyType.foreign;
}
}
public static List<ModelResp> convertList(List<ModelDO> modelDOS) { public static List<ModelResp> convertList(List<ModelDO> modelDOS) {
List<ModelResp> modelDescs = Lists.newArrayList(); List<ModelResp> modelDescs = Lists.newArrayList();
if (!CollectionUtils.isEmpty(modelDOS)) { if (!CollectionUtils.isEmpty(modelDOS)) {

View File

@@ -40,21 +40,6 @@
<result column="query_opt_mode" property="queryOptMode"/> <result column="query_opt_mode" property="queryOptMode"/>
</resultMap> </resultMap>
<insert id="createRecord">
insert into s2_query_stat_info
(
trace_id, model_id, data_set_id, `user`, query_type, query_type_back, query_sql_cmd, sql_cmd_md5, query_struct_cmd, struct_cmd_md5, `sql`, sql_md5, query_engine,
elapsed_ms, query_state, native_query, start_date, end_date, dimensions, metrics, select_cols, agg_cols, filter_cols, group_by_cols,
order_by_cols, use_result_cache, use_sql_cache, sql_cache_key, result_cache_key, query_opt_mode
)
values
(
#{traceId}, #{modelId}, #{dataSetId}, #{user}, #{queryType}, #{queryTypeBack}, #{querySqlCmd}, #{querySqlCmdMd5}, #{queryStructCmd}, #{queryStructCmdMd5}, #{sql}, #{sqlMd5}, #{queryEngine},
#{elapsedMs}, #{queryState}, #{nativeQuery}, #{startDate}, #{endDate}, #{dimensions}, #{metrics}, #{selectCols}, #{aggCols}, #{filterCols}, #{groupByCols},
#{orderByCols}, #{useResultCache}, #{useSqlCache}, #{sqlCacheKey}, #{resultCacheKey}, #{queryOptMode}
)
</insert>
<select id="getStatInfo" <select id="getStatInfo"
resultType="com.tencent.supersonic.headless.api.pojo.QueryStat"> resultType="com.tencent.supersonic.headless.api.pojo.QueryStat">
select * select *

View File

@@ -17,22 +17,6 @@
<result column="date_period" jdbcType="VARCHAR" property="datePeriod"/> <result column="date_period" jdbcType="VARCHAR" property="datePeriod"/>
</resultMap> </resultMap>
<insert id="upsertDateInfo">
insert into s2_available_date_info
(`type`, item_id, date_format, start_date, end_date, unavailable_date, created_by,
updated_by,date_period)
values (#{type}, #{itemId}, #{dateFormat}, #{startDate}, #{endDate}, #{unavailableDateList},
#{createdBy}, #{updatedBy}, #{datePeriod}) ON DUPLICATE KEY
UPDATE
date_format = #{dateFormat},
start_date = #{startDate},
end_date = #{endDate},
unavailable_date = #{unavailableDateList},
created_by = #{createdBy},
updated_by = #{updatedBy},
date_period = #{datePeriod}
</insert>
<select id="getDateInfos" resultMap="BaseResultMap"> <select id="getDateInfos" resultMap="BaseResultMap">
select e.* select e.*
from s2_available_date_info e from s2_available_date_info e

View File

@@ -121,13 +121,7 @@ public abstract class S2BaseDemo implements CommandLineRunner {
DatabaseReq databaseReq = new DatabaseReq(); DatabaseReq databaseReq = new DatabaseReq();
databaseReq.setName("S2数据库DEMO"); databaseReq.setName("S2数据库DEMO");
databaseReq.setDescription("样例数据库实例仅用于体验"); databaseReq.setDescription("样例数据库实例仅用于体验");
if (StringUtils.isNotBlank(url) databaseReq.setType(DataType.POSTGRESQL.getFeature());
&& url.toLowerCase().contains(DataType.MYSQL.getFeature().toLowerCase())) {
databaseReq.setType(DataType.MYSQL.getFeature());
databaseReq.setVersion("5.7");
} else {
databaseReq.setType(DataType.H2.getFeature());
}
databaseReq.setUrl(url); databaseReq.setUrl(url);
databaseReq.setUsername(dataSourceProperties.getUsername()); databaseReq.setUsername(dataSourceProperties.getUsername());
databaseReq databaseReq

View File

@@ -33,6 +33,8 @@ import java.util.*;
@Order(2) @Order(2)
public class S2CompanyDemo extends S2BaseDemo { public class S2CompanyDemo extends S2BaseDemo {
public static final String AGENT_NAME = "企业分析助手";
public void doRun() { public void doRun() {
try { try {
DomainResp domain = addDomain(); DomainResp domain = addDomain();
@@ -45,7 +47,8 @@ public class S2CompanyDemo extends S2BaseDemo {
addModelRela(domain, model_brand_revenue, model_brand, "brand_id"); addModelRela(domain, model_brand_revenue, model_brand, "brand_id");
DataSetResp dataset = addDataSet(domain); DataSetResp dataset = addDataSet(domain);
addAgent(dataset.getId()); Long dataSetId = dataset.getId();
addAgent(dataSetId);
} catch (Exception e) { } catch (Exception e) {
log.error("Failed to add bench mark demo data", e); log.error("Failed to add bench mark demo data", e);
} }
@@ -229,9 +232,9 @@ public class S2CompanyDemo extends S2BaseDemo {
modelRelaService.save(modelRelaReq, defaultUser); modelRelaService.save(modelRelaReq, defaultUser);
} }
private void addAgent(Long dataSetId) { private Agent addAgent(Long dataSetId) {
Agent agent = new Agent(); Agent agent = new Agent();
agent.setName("企业分析助手"); agent.setName(AGENT_NAME);
agent.setDescription("帮忙您对企业的员工数、收入、利润经营指标分析"); agent.setDescription("帮忙您对企业的员工数、收入、利润经营指标分析");
agent.setStatus(1); agent.setStatus(1);
agent.setEnableSearch(1); agent.setEnableSearch(1);
@@ -253,6 +256,6 @@ public class S2CompanyDemo extends S2BaseDemo {
chatAppConfig.values().forEach(app -> app.setChatModelId(demoChatModel.getId())); chatAppConfig.values().forEach(app -> app.setChatModelId(demoChatModel.getId()));
agent.setChatAppConfig(chatAppConfig); agent.setChatAppConfig(chatAppConfig);
agentService.createAgent(agent, defaultUser); return agentService.createAgent(agent, defaultUser);
} }
} }

View File

@@ -45,6 +45,8 @@ import java.util.Map;
@Order(3) @Order(3)
public class S2SingerDemo extends S2BaseDemo { public class S2SingerDemo extends S2BaseDemo {
public static final String AGENT_NAME = "艺人分析助手";
public void doRun() { public void doRun() {
try { try {
DomainResp singerDomain = addDomain(); DomainResp singerDomain = addDomain();
@@ -147,7 +149,7 @@ public class S2SingerDemo extends S2BaseDemo {
private void addAgent(long dataSetId) { private void addAgent(long dataSetId) {
Agent agent = new Agent(); Agent agent = new Agent();
agent.setName("艺人分析助手"); agent.setName(AGENT_NAME);
agent.setDescription("帮忙您对不同流派、区域的艺人做分析查询"); agent.setDescription("帮忙您对不同流派、区域的艺人做分析查询");
agent.setStatus(1); agent.setStatus(1);
agent.setEnableSearch(1); agent.setEnableSearch(1);

View File

@@ -70,6 +70,8 @@ import java.util.Map;
@Order(1) @Order(1)
public class S2VisitsDemo extends S2BaseDemo { public class S2VisitsDemo extends S2BaseDemo {
public static final String AGENT_NAME = "超音数分析助手";
public void doRun() { public void doRun() {
try { try {
// create domain // create domain
@@ -141,7 +143,7 @@ public class S2VisitsDemo extends S2BaseDemo {
private Integer addAgent(long dataSetId) { private Integer addAgent(long dataSetId) {
Agent agent = new Agent(); Agent agent = new Agent();
agent.setName("超音数分析助手"); agent.setName(AGENT_NAME);
agent.setDescription("帮忙您对超音数产品的用户访问情况做分析"); agent.setDescription("帮忙您对超音数产品的用户访问情况做分析");
agent.setStatus(1); agent.setStatus(1);
agent.setEnableSearch(1); agent.setEnableSearch(1);

View File

@@ -11,24 +11,4 @@ spring:
h2: h2:
console: console:
path: /h2-console/semantic path: /h2-console/semantic
enabled: true enabled: true
### Comment out following lines if using MySQL
#spring:
# datasource:
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://localhost:3306/s2_database?user=root
# username: root
# password:
# sql:
# enabled: true
# mode: always
# username: root
# password:
# init:
# schema-locations: classpath:db/schema-mysql.sql,classpath:db/schema-mysql-demo.sql
# data-locations: classpath:db/data-mysql.sql,classpath:db/data-mysql-demo.sql
# h2:
# console:
# path: /h2-console/semantic
# enabled: true

View File

@@ -0,0 +1,14 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
username: root
password:
sql:
init:
enabled: false
mode: always
username: root
password:
schema-locations: classpath:db/schema-mysql.sql,classpath:db/schema-mysql-demo.sql
data-locations: classpath:db/data-mysql.sql,classpath:db/data-mysql-demo.sql

View File

@@ -0,0 +1,14 @@
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/postgres?stringtype=unspecified
username: postgres
password: postgres
sql:
init:
enabled: false
mode: always
username: postgres
password: postgres
schema-locations: classpath:db/schema-postgres.sql,classpath:db/schema-postgres-demo.sql
data-locations: classpath:db/data-postgres.sql,classpath:db/data-postgres-demo.sql

View File

@@ -397,4 +397,8 @@ alter table s2_agent add column `enable_feedback` tinyint DEFAULT 1;
--20241116 --20241116
alter table s2_agent add column `admin` varchar(1000) COLLATE utf8_unicode_ci DEFAULT NULL; alter table s2_agent add column `admin` varchar(1000) COLLATE utf8_unicode_ci DEFAULT NULL;
alter table s2_agent add column `viewer` varchar(1000) COLLATE utf8_unicode_ci DEFAULT NULL; alter table s2_agent add column `viewer` varchar(1000) COLLATE utf8_unicode_ci DEFAULT NULL;
--20241201
ALTER TABLE s2_query_stat_info RENAME COLUMN `user` TO `query_user`;
ALTER TABLE s2_chat_context RENAME COLUMN `user` TO `query_user`;

View File

@@ -1,10 +1,10 @@
-------S2VisitsDemo -------S2VisitsDemo
insert INTO s2_user_department (user_name, department) values ('jack','HR'); MERGE INTO s2_user_department (user_name, department) values ('jack','HR');
insert INTO s2_user_department (user_name, department) values ('tom','sales'); MERGE INTO s2_user_department (user_name, department) values ('tom','sales');
insert INTO s2_user_department (user_name, department) values ('lucy','marketing'); MERGE INTO s2_user_department (user_name, department) values ('lucy','marketing');
insert INTO s2_user_department (user_name, department) values ('john','strategy'); MERGE INTO s2_user_department (user_name, department) values ('john','strategy');
insert INTO s2_user_department (user_name, department) values ('alice','sales'); MERGE INTO s2_user_department (user_name, department) values ('alice','sales');
insert INTO s2_user_department (user_name, department) values ('dean','marketing'); MERGE INTO s2_user_department (user_name, department) values ('dean','marketing');
INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (CURRENT_DATE(), 'lucy', 'p1'); INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (CURRENT_DATE(), 'lucy', 'p1');
INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (CURRENT_DATE(), 'jack', 'p1'); INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (CURRENT_DATE(), 'jack', 'p1');
@@ -1021,45 +1021,37 @@ INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (
-------S2ArtistDemo -------S2ArtistDemo
insert INTO singer (singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES ('周杰伦', '港台','青花瓷','国风',1000000,1000000,1000000); MERGE INTO singer (singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES ('周杰伦', '港台','青花瓷','国风',1000000,1000000,1000000);
insert INTO singer (singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES ('陈奕迅', '港台','爱情转移','流行',1000000,1000000,1000000); MERGE INTO singer (singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES ('陈奕迅', '港台','爱情转移','流行',1000000,1000000,1000000);
insert INTO singer (singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES ('林俊杰', '港台','美人鱼','流行',1000000,1000000,1000000); MERGE INTO singer (singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES ('林俊杰', '港台','美人鱼','流行',1000000,1000000,1000000);
insert INTO singer (singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES ('张碧晨', '内地','光的方向','流行',1000000,1000000,1000000); MERGE INTO singer (singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES ('张碧晨', '内地','光的方向','流行',1000000,1000000,1000000);
insert INTO singer (singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES ('程响', '内地','人间烟火','国风',1000000,1000000,1000000); MERGE INTO singer (singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES ('程响', '内地','人间烟火','国风',1000000,1000000,1000000);
insert INTO singer (singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES ('Taylor Swift', '欧美','Love Story','流行',1000000,1000000,1000000); MERGE INTO singer (singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES ('Taylor Swift', '欧美','Love Story','流行',1000000,1000000,1000000);
insert INTO genre(g_name,rating,most_popular_in) VALUES ('tagore',8,'孟加拉国');
insert INTO genre(g_name,rating,most_popular_in) VALUES ('nazrul',7,'孟加拉国');
insert INTO genre(g_name,rating,most_popular_in) VALUES ('民间',9,'锡尔赫特、吉大港、库斯蒂亚');
insert INTO genre(g_name,rating,most_popular_in) VALUES ('现代',8,'孟加拉国');
insert INTO genre(g_name,rating,most_popular_in) VALUES ('蓝调',7,'加拿大');
insert INTO genre(g_name,rating,most_popular_in) VALUES ('流行',9,'美国');
insert INTO artist(artist_name,citizenship,gender,g_name) VALUES ('Shrikanta','印度','男性','tagore');
insert INTO artist(artist_name,citizenship,gender,g_name) VALUES ('Prity','孟加拉国','女性','nazrul');
insert INTO artist(artist_name,citizenship,gender,g_name) VALUES ('Farida','孟加拉国','女性','民间');
insert INTO artist(artist_name,citizenship,gender,g_name) VALUES ('Topu','印度','女性','现代');
insert INTO artist(artist_name,citizenship,gender,g_name) VALUES ('Enrique','美国','男性','蓝调');
insert INTO artist(artist_name,citizenship,gender,g_name) VALUES ('Michel','英国','男性','流行');
MERGE INTO genre(g_name,rating,most_popular_in) VALUES ('tagore',8,'孟加拉国');
MERGE INTO genre(g_name,rating,most_popular_in) VALUES ('nazrul',7,'孟加拉国');
MERGE INTO genre(g_name,rating,most_popular_in) VALUES ('民间',9,'锡尔赫特、吉大港、库斯蒂亚');
MERGE INTO genre(g_name,rating,most_popular_in) VALUES ('现代',8,'孟加拉国');
MERGE INTO genre(g_name,rating,most_popular_in) VALUES ('蓝调',7,'加拿大');
MERGE INTO genre(g_name,rating,most_popular_in) VALUES ('流行',9,'美国');
-------S2CompanyDemo -------S2CompanyDemo
insert into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_131','微软','西雅图','1975','盖茨','纳德拉',102300000000,210000); MERGE into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_131','微软','西雅图','1975','盖茨','纳德拉',102300000000,210000);
insert into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_132','特斯拉','加州','2003','艾伯哈德','马斯克',376800000000,140473); MERGE into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_132','特斯拉','加州','2003','艾伯哈德','马斯克',376800000000,140473);
insert into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_133','谷歌','加州','1998','拉里佩奇','劈柴',321600000000,182503); MERGE into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_133','谷歌','加州','1998','拉里佩奇','劈柴',321600000000,182503);
insert into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_134','亚马逊','加州','1994','贝索斯','贝索斯',28800000000,950000); MERGE into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_134','亚马逊','加州','1994','贝索斯','贝索斯',28800000000,950000);
insert into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_135','英伟达','杭州','1993','黄仁勋','黄仁勋',67500000000,29000); MERGE into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_135','英伟达','杭州','1993','黄仁勋','黄仁勋',67500000000,29000);
insert into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_131','Office','1990','item_enterprise_13_131','盖茨',50000000); MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_131','Office','1990','item_enterprise_13_131','盖茨',50000000);
insert into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_132','Windows','1991','item_enterprise_13_131','盖茨',50000000); MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_132','Windows','1991','item_enterprise_13_131','盖茨',50000000);
insert into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_133','Model 3','2017','item_enterprise_13_132','马斯克',100000000); MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_133','Model 3','2017','item_enterprise_13_132','马斯克',100000000);
insert into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_134','Model Y','2020','item_enterprise_13_132','马斯克',100000000); MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_134','Model Y','2020','item_enterprise_13_132','马斯克',100000000);
insert into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_135','Google','2003','item_enterprise_13_133','拉里佩奇',50000000); MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_135','Google','2003','item_enterprise_13_133','拉里佩奇',50000000);
insert into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_136','Android','2007','item_enterprise_13_133','拉里佩奇',50000000); MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_136','Android','2007','item_enterprise_13_133','拉里佩奇',50000000);
insert into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_137','aws','2004','item_enterprise_13_134','贝索斯',100000000); MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_137','aws','2004','item_enterprise_13_134','贝索斯',100000000);
insert into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_138','kindle','2007','item_enterprise_13_134','贝索斯',100000000); MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_138','kindle','2007','item_enterprise_13_134','贝索斯',100000000);
insert into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_139','H100','2022','item_enterprise_13_135','黄仁勋',100000000); MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_139','H100','2022','item_enterprise_13_135','黄仁勋',100000000);
insert into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_140','A100','2021','item_enterprise_13_135','黄仁勋',100000000); MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_140','A100','2021','item_enterprise_13_135','黄仁勋',100000000);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_131',12100000000, 2100000000,10,10); insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_131',12100000000, 2100000000,10,10);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_132',12200000000, 2200000000,20,20); insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_132',12200000000, 2200000000,20,20);

View File

@@ -1,10 +1,10 @@
-- S2VisitsDemo -- S2VisitsDemo
insert into s2_user_department (user_name, department) values ('jack','HR'); MERGE into s2_user_department (user_name, department) values ('jack','HR');
insert into s2_user_department (user_name, department) values ('tom','sales'); MERGE into s2_user_department (user_name, department) values ('tom','sales');
insert into s2_user_department (user_name, department) values ('lucy','marketing'); MERGE into s2_user_department (user_name, department) values ('lucy','marketing');
insert into s2_user_department (user_name, department) values ('john','strategy'); MERGE into s2_user_department (user_name, department) values ('john','strategy');
insert into s2_user_department (user_name, department) values ('alice','sales'); MERGE into s2_user_department (user_name, department) values ('alice','sales');
insert into s2_user_department (user_name, department) values ('dean','marketing'); MERGE into s2_user_department (user_name, department) values ('dean','marketing');
INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (CURRENT_DATE(), 'lucy', 'p1'); INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (CURRENT_DATE(), 'lucy', 'p1');
INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (CURRENT_DATE(), 'jack', 'p1'); INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (CURRENT_DATE(), 'jack', 'p1');
@@ -1020,34 +1020,61 @@ INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (
INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATE_SUB(CURRENT_DATE(), INTERVAL 8 DAY), 'lucy', '0.039935860913407284', 'p2'); INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATE_SUB(CURRENT_DATE(), INTERVAL 8 DAY), 'lucy', '0.039935860913407284', 'p2');
-- S2ArtistDemo -- S2ArtistDemo
INSERT INTO singer (singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, favor_cnt) MERGE INTO singer (singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, favor_cnt)
VALUES ('周杰伦', '港台', '青花瓷', '国风', 1000000, 1000000, 1000000); VALUES ('周杰伦', '港台', '青花瓷', '国风', 1000000, 1000000, 1000000);
MERGE INTO singer (singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, favor_cnt)
INSERT INTO singer (singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, favor_cnt)
VALUES ('陈奕迅', '港台', '爱情转移', '流行', 1000000, 1000000, 1000000); VALUES ('陈奕迅', '港台', '爱情转移', '流行', 1000000, 1000000, 1000000);
MERGE INTO singer (singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, favor_cnt)
INSERT INTO singer (singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, favor_cnt)
VALUES ('林俊杰', '港台', '美人鱼', '流行', 1000000, 1000000, 1000000); VALUES ('林俊杰', '港台', '美人鱼', '流行', 1000000, 1000000, 1000000);
MERGE INTO singer (singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, favor_cnt)
INSERT INTO singer (singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, favor_cnt)
VALUES ('张碧晨', '内地', '光的方向', '流行', 1000000, 1000000, 1000000); VALUES ('张碧晨', '内地', '光的方向', '流行', 1000000, 1000000, 1000000);
MERGE INTO singer (singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, favor_cnt)
INSERT INTO singer (singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, favor_cnt)
VALUES ('程响', '内地', '人间烟火', '国风', 1000000, 1000000, 1000000); VALUES ('程响', '内地', '人间烟火', '国风', 1000000, 1000000, 1000000);
MERGE INTO singer (singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, favor_cnt)
INSERT INTO singer (singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, favor_cnt)
VALUES ('Taylor Swift', '欧美', 'Love Story', '流行', 1000000, 1000000, 1000000); VALUES ('Taylor Swift', '欧美', 'Love Story', '流行', 1000000, 1000000, 1000000);
insert into genre(g_name,rating,most_popular_in) VALUES ('tagore',8,'孟加拉国'); MERGE into genre(g_name,rating,most_popular_in) VALUES ('tagore',8,'孟加拉国');
insert into genre(g_name,rating,most_popular_in) VALUES ('nazrul',7,'孟加拉国'); MERGE into genre(g_name,rating,most_popular_in) VALUES ('nazrul',7,'孟加拉国');
insert into genre(g_name,rating,most_popular_in) VALUES ('民间',9,'锡尔赫特、吉大港、库斯蒂亚'); MERGE into genre(g_name,rating,most_popular_in) VALUES ('民间',9,'锡尔赫特、吉大港、库斯蒂亚');
insert into genre(g_name,rating,most_popular_in) VALUES ('现代',8,'孟加拉国'); MERGE into genre(g_name,rating,most_popular_in) VALUES ('现代',8,'孟加拉国');
insert into genre(g_name,rating,most_popular_in) VALUES ('蓝调',7,'加拿大'); MERGE into genre(g_name,rating,most_popular_in) VALUES ('蓝调',7,'加拿大');
insert into genre(g_name,rating,most_popular_in) VALUES ('流行',9,'美国'); MERGE into genre(g_name,rating,most_popular_in) VALUES ('流行',9,'美国');
insert into artist(artist_name,citizenship,gender,g_name) VALUES ('Shrikanta','印度','男性','tagore'); -- S2CompanyDemo
insert into artist(artist_name,citizenship,gender,g_name) VALUES ('Prity','孟加拉国','女性','nazrul'); MERGE into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_131','微软','西雅图','1975','盖茨','纳德拉',102300000000,210000);
insert into artist(artist_name,citizenship,gender,g_name) VALUES ('Farida','孟加拉国','女性','民间'); MERGE into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_132','特斯拉','加州','2003','艾伯哈德','马斯克',376800000000,140473);
insert into artist(artist_name,citizenship,gender,g_name) VALUES ('Topu','印度','女性','现代'); MERGE into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_133','谷歌','加州','1998','拉里佩奇','劈柴',321600000000,182503);
insert into artist(artist_name,citizenship,gender,g_name) VALUES ('Enrique','美国','男性','蓝调'); MERGE into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_134','亚马逊','加州','1994','贝索斯','贝索斯',28800000000,950000);
insert into artist(artist_name,citizenship,gender,g_name) VALUES ('Michel','英国','男性','流行'); MERGE into company(company_id,company_name,headquarter_address,company_established_time,founder,ceo,annual_turnover,employee_count) VALUES ('item_enterprise_13_135','英伟达','杭州','1993','黄仁勋','黄仁勋',67500000000,29000);
MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_131','Office','1990','item_enterprise_13_131','盖茨',50000000);
MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_132','Windows','1991','item_enterprise_13_131','盖茨',50000000);
MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_133','Model 3','2017','item_enterprise_13_132','马斯克',100000000);
MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_134','Model Y','2020','item_enterprise_13_132','马斯克',100000000);
MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_135','Google','2003','item_enterprise_13_133','拉里佩奇',50000000);
MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_136','Android','2007','item_enterprise_13_133','拉里佩奇',50000000);
MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_137','aws','2004','item_enterprise_13_134','贝索斯',100000000);
MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_138','kindle','2007','item_enterprise_13_134','贝索斯',100000000);
MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_139','H100','2022','item_enterprise_13_135','黄仁勋',100000000);
MERGE into brand(brand_id,brand_name,brand_established_time,company_id,legal_representative,registered_capital) VALUES ('item_brand_13_140','A100','2021','item_enterprise_13_135','黄仁勋',100000000);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_131',12100000000, 2100000000,10,10);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_132',12200000000, 2200000000,20,20);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_133',12300000000, 2300000000,30,30);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_134',12400000000, 2400000000,10,10);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_135',12500000000, 2500000000,30,30);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_136',12600000000, 2600000000,40,40);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_137',12700000000, 2700000000,50,50);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_138',12800000000, 2800000000,20,10);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_139',12900000000, 2900000000,60,70);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2023','item_brand_13_140',13000000000, 3000000000,80,100);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2024','item_brand_13_131',13100000000,3100000000, 10,10);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2024','item_brand_13_132',13200000000, 3200000000,20,20);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2024','item_brand_13_133',13300000000, 3300000000,30,30);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2024','item_brand_13_134',13400000000, 3400000000,10,10);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2024','item_brand_13_135',13500000000, 3500000000,30,30);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2024','item_brand_13_136',13600000000, 3600000000,40,40);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2024','item_brand_13_137',13700000000, 3700000000,50,50);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2024','item_brand_13_138',13800000000, 3800000000,20,10);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2024','item_brand_13_139',13900000000, 3900000000,60,70);
insert into brand_revenue(year_time,brand_id,revenue,profit,revenue_growth_year_on_year,profit_growth_year_on_year) VALUES ('2024','item_brand_13_140',14000000000, 4000000000,80,100);

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,20 @@
-- sample user
-- The default value for the password is 123456
insert into s2_user (id, "name", password, salt, display_name, email, is_admin) values (1, 'admin','c3VwZXJzb25pY0BiaWNvbdktJJYWw6A3rEmBUPzbn/6DNeYnD+y3mAwDKEMS3KVT','jGl25bVBBBW96Qi9Te4V3w==','admin','admin@xx.com', 1);
insert into s2_user (id, "name", password, salt, display_name, email) values (2, 'jack','c3VwZXJzb25pY0BiaWNvbWxGalmwa0h/trkh/3CWOYMDiku0Op1VmOfESIKmN0HG','MWERWefm/3hD6kYndF6JIg==','jack','jack@xx.com');
insert into s2_user (id, "name", password, salt, display_name, email) values (3, 'tom','c3VwZXJzb25pY0BiaWNvbVWv0CZ6HzeX8GRUpw0C8NSaQ+0hE/dAcmzRpCFwAqxK','4WCPdcXXgT89QDHLML+3hg==','tom','tom@xx.com');
insert into s2_user (id, "name", password, salt, display_name, email, is_admin) values (4, 'lucy','c3VwZXJzb25pY0BiaWNvbc7Ychfu99lPL7rLmCkf/vgF4RASa4Z++Mxo1qlDCpci','3Jnpqob6uDoGLP9eCAg5Fw==','lucy','lucy@xx.com', 1);
insert into s2_user (id, "name", password, salt, display_name, email) values (5, 'alice','c3VwZXJzb25pY0BiaWNvbe9Z4F2/DVIfAJoN1HwUTuH1KgVuiusvfh7KkWYQSNHk','K9gGyX8OAK8aH8Myj6djqQ==','alice','alice@xx.com');
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', CURRENT_DATE - INTERVAL '28 days', CURRENT_DATE - INTERVAL '1 day', '[]', '2023-06-01', 'admin', '2023-06-01', 'admin');
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 (2, 'dimension', 'yyyy-MM-dd', CURRENT_DATE - INTERVAL '28 days', CURRENT_DATE - INTERVAL '1 day', '[]', '2023-06-01', 'admin', '2023-06-01', 'admin');
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 (3, 'dimension', 'yyyy-MM-dd', CURRENT_DATE - INTERVAL '28 days', CURRENT_DATE - INTERVAL '1 day', '[]', '2023-06-01', 'admin', '2023-06-01', 'admin');
insert into s2_canvas("id", "domain_id", "type", "config" ,"created_at" ,"created_by" ,"updated_at" ,"updated_by" )
values (1, 1, 'modelEdgeRelation', '[{"source":"datasource-1","target":"datasource-3","type":"polyline","id":"edge-0.305251275235679741702883718912","style":{"active":{"stroke":"rgb(95, 149, 255)","lineWidth":1},"selected":{"stroke":"rgb(95, 149, 255)","lineWidth":2,"shadowColor":"rgb(95, 149, 255)","shadowBlur":10,"text-shape":{"fontWeight":500}},"highlight":{"stroke":"rgb(95, 149, 255)","lineWidth":2,"text-shape":{"fontWeight":500}},"inactive":{"stroke":"rgb(234, 234, 234)","lineWidth":1},"disable":{"stroke":"rgb(245, 245, 245)","lineWidth":1},"stroke":"#296df3","endArrow":true},"startPoint":{"x":-94,"y":-137.5,"anchorIndex":0,"id":"-94|||-137.5"},"endPoint":{"x":-234,"y":-45,"anchorIndex":1,"id":"-234|||-45"},"sourceAnchor":2,"targetAnchor":1,"label":"模型关系编辑"},{"source":"datasource-1","target":"datasource-2","type":"polyline","id":"edge-0.466237264629309141702883756359","style":{"active":{"stroke":"rgb(95, 149, 255)","lineWidth":1},"selected":{"stroke":"rgb(95, 149, 255)","lineWidth":2,"shadowColor":"rgb(95, 149, 255)","shadowBlur":10,"text-shape":{"fontWeight":500}},"highlight":{"stroke":"rgb(95, 149, 255)","lineWidth":2,"text-shape":{"fontWeight":500}},"inactive":{"stroke":"rgb(234, 234, 234)","lineWidth":1},"disable":{"stroke":"rgb(245, 245, 245)","lineWidth":1},"stroke":"#296df3","endArrow":true},"startPoint":{"x":-12,"y":-137.5,"anchorIndex":1,"id":"-12|||-137.5"},"endPoint":{"x":85,"y":31.5,"anchorIndex":0,"id":"85|||31.5"},"sourceAnchor":1,"targetAnchor":2,"label":"模型关系编辑"}]', '2023-06-01', 'admin', '2023-06-01', 'admin');

View File

@@ -42,15 +42,6 @@ CREATE TABLE IF NOT EXISTS `genre` (
); );
COMMENT ON TABLE genre IS 'genre'; COMMENT ON TABLE genre IS 'genre';
CREATE TABLE IF NOT EXISTS `artist` (
`artist_name` varchar(50) NOT NULL , -- genre name
`citizenship` varchar(20) ,
`gender` varchar(20) ,
`g_name` varchar(50),
PRIMARY KEY (`artist_name`,`citizenship`)
);
COMMENT ON TABLE artist IS 'artist';
-------S2CompanyDemo -------S2CompanyDemo
CREATE TABLE IF NOT EXISTS `company` ( CREATE TABLE IF NOT EXISTS `company` (
`company_id` varchar(50) NOT NULL , `company_id` varchar(50) NOT NULL ,

View File

@@ -3,7 +3,7 @@ CREATE TABLE IF NOT EXISTS `s2_chat_context`
( (
`chat_id` BIGINT NOT NULL , -- context chat id `chat_id` BIGINT NOT NULL , -- context chat id
`modified_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , -- row modify time `modified_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , -- row modify time
`user` varchar(64) DEFAULT NULL , -- row modify user `query_user` varchar(64) DEFAULT NULL , -- row modify user
`query_text` LONGVARCHAR DEFAULT NULL , -- query text `query_text` LONGVARCHAR DEFAULT NULL , -- query text
`semantic_parse` LONGVARCHAR DEFAULT NULL , -- parse data `semantic_parse` LONGVARCHAR DEFAULT NULL , -- parse data
`ext_data` LONGVARCHAR DEFAULT NULL , -- extend data `ext_data` LONGVARCHAR DEFAULT NULL , -- extend data
@@ -290,7 +290,7 @@ CREATE TABLE IF NOT EXISTS `s2_query_stat_info` (
`trace_id` varchar(200) DEFAULT NULL, -- query unique identifier `trace_id` varchar(200) DEFAULT NULL, -- query unique identifier
`model_id` INT DEFAULT NULL, `model_id` INT DEFAULT NULL,
`data_set_id` INT DEFAULT NULL, `data_set_id` INT DEFAULT NULL,
`user` varchar(200) DEFAULT NULL, `query_user` varchar(200) DEFAULT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP , `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
`query_type` varchar(200) DEFAULT NULL, -- the corresponding scene `query_type` varchar(200) DEFAULT NULL, -- the corresponding scene
`query_type_back` INT DEFAULT '0' , -- query type, 0-normal query, 1-pre-refresh type `query_type_back` INT DEFAULT '0' , -- query type, 0-normal query, 1-pre-refresh type
@@ -322,28 +322,6 @@ CREATE TABLE IF NOT EXISTS `s2_query_stat_info` (
) ; ) ;
COMMENT ON TABLE s2_query_stat_info IS 'query statistics table'; COMMENT ON TABLE s2_query_stat_info IS 'query statistics table';
CREATE TABLE IF NOT EXISTS `s2_semantic_pasre_info` (
`id` INT NOT NULL AUTO_INCREMENT,
`trace_id` varchar(200) NOT NULL ,
`model_id` INT NOT NULL ,
`dimensions`LONGVARCHAR ,
`metrics`LONGVARCHAR ,
`orders`LONGVARCHAR ,
`filters`LONGVARCHAR ,
`date_info`LONGVARCHAR ,
`limit` INT NOT NULL ,
`native_query` TINYINT NOT NULL DEFAULT '0' ,
`sql`LONGVARCHAR ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`status` INT NOT NULL ,
`elapsed_ms` bigINT DEFAULT NULL ,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_semantic_pasre_info IS 'semantic layer sql parsing information table';
CREATE TABLE IF NOT EXISTS `s2_available_date_info` ( CREATE TABLE IF NOT EXISTS `s2_available_date_info` (
`id` INT NOT NULL AUTO_INCREMENT , `id` INT NOT NULL AUTO_INCREMENT ,
`item_id` INT NOT NULL , `item_id` INT NOT NULL ,

View File

@@ -17,6 +17,7 @@ CREATE TABLE IF NOT EXISTS `s2_stay_time_statis` (
`page` varchar(200) NOT NULL `page` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- S2ArtistDemo
CREATE TABLE IF NOT EXISTS `singer` ( CREATE TABLE IF NOT EXISTS `singer` (
`singer_name` varchar(200) NOT NULL, `singer_name` varchar(200) NOT NULL,
`act_area` varchar(200) NOT NULL, `act_area` varchar(200) NOT NULL,
@@ -27,7 +28,6 @@ CREATE TABLE IF NOT EXISTS `singer` (
`favor_cnt` bigint DEFAULT NULL `favor_cnt` bigint DEFAULT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- S2ArtistDemo
CREATE TABLE IF NOT EXISTS `genre` ( CREATE TABLE IF NOT EXISTS `genre` (
`g_name` varchar(20) NOT NULL , -- genre name `g_name` varchar(20) NOT NULL , -- genre name
`rating` INT , `rating` INT ,
@@ -35,31 +35,39 @@ CREATE TABLE IF NOT EXISTS `genre` (
PRIMARY KEY (`g_name`) PRIMARY KEY (`g_name`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `artist` ( -- S2CompanyDemo
`artist_name` varchar(50) NOT NULL , -- genre name CREATE TABLE IF NOT EXISTS `company` (
`citizenship` varchar(20) , `company_id` varchar(50) NOT NULL,
`gender` varchar(20) , `company_name` varchar(50) NOT NULL,
`g_name` varchar(50) `headquarter_address` varchar(50) NOT NULL,
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; `company_established_time` varchar(20) NOT NULL,
`founder` varchar(20) NOT NULL,
`ceo` varchar(20) NOT NULL,
`annual_turnover` bigint(15),
`employee_count` int(7),
PRIMARY KEY (`company_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `files` ( CREATE TABLE IF NOT EXISTS `brand` (
`f_id` bigINT NOT NULL, `brand_id` varchar(50) NOT NULL,
`artist_name` varchar(50) , `brand_name` varchar(50) NOT NULL,
`file_size` varchar(20) , `brand_established_time` varchar(20) NOT NULL,
`duration` varchar(20) , `company_id` varchar(50) NOT NULL,
`formats` varchar(20) , `legal_representative` varchar(20) NOT NULL,
PRIMARY KEY (`f_id`) `registered_capital` bigint(15),
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; PRIMARY KEY (`brand_id`),
KEY `idx_company_id` (`company_id`),
CONSTRAINT `fk_brand_company` FOREIGN KEY (`company_id`) REFERENCES `company` (`company_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `song` ( CREATE TABLE IF NOT EXISTS `brand_revenue` (
`imp_date` varchar(50) , `year_time` varchar(10) NOT NULL,
`song_name` varchar(50) , `brand_id` varchar(50) NOT NULL,
`artist_name` varchar(50) , `revenue` bigint(15) NOT NULL,
`country` varchar(20) , `profit` bigint(15) NOT NULL,
`f_id` bigINT , `revenue_growth_year_on_year` double NOT NULL,
`g_name` varchar(20) , `profit_growth_year_on_year` double NOT NULL,
`rating` int , PRIMARY KEY (`year_time`, `brand_id`),
`languages` varchar(20) , KEY `idx_brand_id` (`brand_id`),
`releasedate` varchar(50) , CONSTRAINT `fk_brand_revenue_brand` FOREIGN KEY (`brand_id`) REFERENCES `brand` (`brand_id`)
`resolution` bigINT NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

View File

@@ -95,7 +95,7 @@ CREATE TABLE IF NOT EXISTS `s2_chat_memory` (
CREATE TABLE IF NOT EXISTS `s2_chat_context` ( CREATE TABLE IF NOT EXISTS `s2_chat_context` (
`chat_id` bigint(20) NOT NULL COMMENT 'context chat id', `chat_id` bigint(20) NOT NULL COMMENT 'context chat id',
`modified_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'row modify time', `modified_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'row modify time',
`user` varchar(64) DEFAULT NULL COMMENT 'row modify user', `query_user` varchar(64) DEFAULT NULL COMMENT 'row modify user',
`query_text` text COMMENT 'query text', `query_text` text COMMENT 'query text',
`semantic_parse` text COMMENT 'parse data', `semantic_parse` text COMMENT 'parse data',
`ext_data` text COMMENT 'extend data', `ext_data` text COMMENT 'extend data',
@@ -327,7 +327,7 @@ CREATE TABLE IF NOT EXISTS `s2_query_stat_info` (
`trace_id` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '查询标识', `trace_id` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '查询标识',
`model_id` bigint(20) DEFAULT NULL, `model_id` bigint(20) DEFAULT NULL,
`data_set_id` bigint(20) DEFAULT NULL, `data_set_id` bigint(20) DEFAULT NULL,
`user` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '执行sql的用户', `query_user` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '执行sql的用户',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`query_type` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '查询对应的场景', `query_type` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '查询对应的场景',
`query_type_back` int(10) DEFAULT '0' COMMENT '查询类型, 0-正常查询, 1-预刷类型', `query_type_back` int(10) DEFAULT '0' COMMENT '查询类型, 0-正常查询, 1-预刷类型',
@@ -359,26 +359,6 @@ CREATE TABLE IF NOT EXISTS `s2_query_stat_info` (
KEY `domain_index` (`model_id`) KEY `domain_index` (`model_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='查询统计信息表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='查询统计信息表';
CREATE TABLE IF NOT EXISTS `s2_semantic_pasre_info` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`trace_id` varchar(200) NOT NULL COMMENT '查询标识',
`domain_id` bigint(20) NOT NULL COMMENT '主体域ID',
`dimensions` mediumtext COMMENT '查询相关的维度信息',
`metrics` mediumtext COMMENT '查询相关的指标信息',
`orders` mediumtext COMMENT '查询相关的排序信息',
`filters` mediumtext COMMENT '查询相关的过滤信息',
`date_info` mediumtext COMMENT '查询相关的日期信息',
`limit` bigint(20) NOT NULL COMMENT '查询相关的limit信息',
`native_query` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1-明细查询,0-聚合查询',
`sql` mediumtext COMMENT '解析后的sql',
`created_at` datetime NOT NULL COMMENT '创建时间',
`created_by` varchar(100) NOT NULL COMMENT '创建人',
`status` tinyint NOT NULL COMMENT '运行状态',
`elapsed_ms` bigint(10) DEFAULT NULL COMMENT 'sql解析耗时',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='语义层sql解析信息表';
CREATE TABLE IF NOT EXISTS `s2_canvas` CREATE TABLE IF NOT EXISTS `s2_canvas`
( (
`id` bigint(20) NOT NULL AUTO_INCREMENT, `id` bigint(20) NOT NULL AUTO_INCREMENT,

View File

@@ -0,0 +1,70 @@
-- S2VisitsDemo
CREATE TABLE IF NOT EXISTS s2_user_department (
user_name varchar(200) NOT NULL,
department varchar(200) NOT NULL
);
CREATE TABLE IF NOT EXISTS s2_pv_uv_statis (
imp_date varchar(200) NOT NULL,
user_name varchar(200) NOT NULL,
page varchar(200) NOT NULL
);
CREATE TABLE IF NOT EXISTS s2_stay_time_statis (
imp_date varchar(200) NOT NULL,
user_name varchar(200) NOT NULL,
stay_hours double precision NOT NULL,
page varchar(200) NOT NULL
);
-- S2ArtistDemo
CREATE TABLE IF NOT EXISTS singer (
singer_name varchar(200) NOT NULL,
act_area varchar(200) NOT NULL,
song_name varchar(200) NOT NULL,
genre varchar(200) NOT NULL,
js_play_cnt bigint DEFAULT NULL,
down_cnt bigint DEFAULT NULL,
favor_cnt bigint DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS genre (
g_name varchar(20) NOT NULL PRIMARY KEY,
rating integer,
most_popular_in varchar(50)
);
-- S2CompanyDemo
CREATE TABLE IF NOT EXISTS company (
company_id varchar(50) NOT NULL,
company_name varchar(50) NOT NULL,
headquarter_address varchar(50) NOT NULL,
company_established_time varchar(20) NOT NULL,
founder varchar(20) NOT NULL,
ceo varchar(20) NOT NULL,
annual_turnover bigint,
employee_count integer,
PRIMARY KEY (company_id)
);
CREATE TABLE IF NOT EXISTS brand (
brand_id varchar(50) NOT NULL,
brand_name varchar(50) NOT NULL,
brand_established_time varchar(20) NOT NULL,
company_id varchar(50) NOT NULL,
legal_representative varchar(20) NOT NULL,
registered_capital bigint,
PRIMARY KEY (brand_id),
CONSTRAINT fk_brand_company FOREIGN KEY (company_id) REFERENCES company (company_id)
);
CREATE TABLE IF NOT EXISTS brand_revenue (
year_time varchar(10) NOT NULL,
brand_id varchar(50) NOT NULL,
revenue bigint NOT NULL,
profit bigint NOT NULL,
revenue_growth_year_on_year double precision NOT NULL,
profit_growth_year_on_year double precision NOT NULL,
PRIMARY KEY (year_time, brand_id),
CONSTRAINT fk_brand_revenue_brand FOREIGN KEY (brand_id) REFERENCES brand (brand_id)
);

View File

@@ -0,0 +1,494 @@
CREATE TABLE IF NOT EXISTS s2_agent (
id SERIAL PRIMARY KEY,
name varchar(100) DEFAULT NULL,
description TEXT DEFAULT NULL,
examples TEXT DEFAULT NULL,
status smallint DEFAULT NULL,
model varchar(100) DEFAULT NULL,
tool_config varchar(6000) DEFAULT NULL,
llm_config varchar(2000) DEFAULT NULL,
chat_model_config text DEFAULT NULL,
visual_config varchar(2000) DEFAULT NULL,
enable_search smallint DEFAULT 1,
enable_feedback smallint DEFAULT 1,
created_by varchar(100) DEFAULT NULL,
created_at timestamp DEFAULT NULL,
updated_by varchar(100) DEFAULT NULL,
updated_at timestamp DEFAULT NULL,
admin varchar(1000) DEFAULT NULL,
viewer varchar(1000) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_auth_groups (
group_id integer NOT NULL PRIMARY KEY,
config varchar(2048) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_available_date_info (
id SERIAL PRIMARY KEY,
item_id integer NOT NULL,
type varchar(255) NOT NULL,
date_format varchar(64) NOT NULL,
date_period varchar(64) DEFAULT NULL,
start_date varchar(64) DEFAULT NULL,
end_date varchar(64) DEFAULT NULL,
unavailable_date text,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
created_by varchar(100) NOT NULL,
updated_at timestamp NULL,
updated_by varchar(100) NOT NULL,
status smallint DEFAULT 0
);
CREATE TABLE IF NOT EXISTS s2_chat (
chat_id SERIAL PRIMARY KEY,
agent_id integer DEFAULT NULL,
chat_name varchar(300) DEFAULT NULL,
create_time timestamp DEFAULT NULL,
last_time timestamp DEFAULT NULL,
creator varchar(30) DEFAULT NULL,
last_question varchar(200) DEFAULT NULL,
is_delete smallint DEFAULT 0,
is_top smallint DEFAULT 0
);
CREATE TABLE IF NOT EXISTS s2_chat_config (
id SERIAL PRIMARY KEY,
model_id bigint DEFAULT NULL,
chat_detail_config text,
chat_agg_config text,
recommended_questions text,
created_at timestamp NOT NULL,
updated_at timestamp NOT NULL,
created_by varchar(100) NOT NULL,
updated_by varchar(100) NOT NULL,
status smallint NOT NULL,
llm_examples text
);
CREATE TABLE IF NOT EXISTS s2_chat_memory (
id SERIAL PRIMARY KEY,
question varchar(655),
side_info TEXT,
agent_id INTEGER,
db_schema TEXT,
s2_sql TEXT,
status char(10),
llm_review char(10),
llm_comment TEXT,
human_review char(10),
human_comment TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
created_by varchar(100) DEFAULT NULL,
updated_by varchar(100) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_chat_context (
chat_id bigint NOT NULL PRIMARY KEY,
modified_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
query_user varchar(64) DEFAULT NULL,
query_text text,
semantic_parse text,
ext_data text
);
CREATE TABLE IF NOT EXISTS s2_chat_parse (
question_id bigint NOT NULL,
chat_id integer NOT NULL,
parse_id integer NOT NULL,
create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
query_text varchar(500) DEFAULT NULL,
user_name varchar(150) DEFAULT NULL,
parse_info text NOT NULL,
is_candidate integer DEFAULT 1,
CONSTRAINT commonIndex UNIQUE (question_id)
);
CREATE TABLE IF NOT EXISTS s2_chat_query (
question_id SERIAL PRIMARY KEY,
agent_id integer DEFAULT NULL,
create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
query_text text,
user_name varchar(150) DEFAULT NULL,
query_state smallint DEFAULT NULL,
chat_id bigint NOT NULL,
query_result text,
score integer DEFAULT 0,
feedback varchar(1024) DEFAULT '',
similar_queries varchar(1024) DEFAULT '',
parse_time_cost varchar(1024) DEFAULT ''
);
CREATE TABLE IF NOT EXISTS s2_chat_statistics (
question_id bigint NOT NULL,
chat_id bigint NOT NULL,
user_name varchar(150) DEFAULT NULL,
query_text varchar(200) DEFAULT NULL,
interface_name varchar(100) DEFAULT NULL,
cost integer DEFAULT 0,
type integer DEFAULT NULL,
create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS s2_chat_model (
id SERIAL PRIMARY KEY,
name varchar(255) NOT NULL,
description varchar(500) DEFAULT NULL,
config text NOT NULL,
created_at timestamp NOT NULL,
created_by varchar(100) NOT NULL,
updated_at timestamp NOT NULL,
updated_by varchar(100) NOT NULL,
admin varchar(500) DEFAULT NULL,
viewer varchar(500) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_database (
id SERIAL PRIMARY KEY,
name varchar(255) NOT NULL,
description varchar(500) DEFAULT NULL,
version varchar(64) DEFAULT NULL,
type varchar(20) NOT NULL,
config text NOT NULL,
created_at timestamp NOT NULL,
created_by varchar(100) NOT NULL,
updated_at timestamp NOT NULL,
updated_by varchar(100) NOT NULL,
admin varchar(500) DEFAULT NULL,
viewer varchar(500) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_dictionary_conf (
id SERIAL PRIMARY KEY,
description varchar(255),
type varchar(255) NOT NULL,
item_id INTEGER NOT NULL,
config text,
status varchar(255) NOT NULL,
created_at timestamp NOT NULL,
created_by varchar(100) NOT NULL
);
CREATE TABLE IF NOT EXISTS s2_dictionary_task (
id SERIAL PRIMARY KEY,
name varchar(255) NOT NULL,
description varchar(255),
type varchar(255) NOT NULL,
item_id INTEGER NOT NULL,
config text,
status varchar(255) NOT NULL,
created_at timestamp DEFAULT CURRENT_TIMESTAMP,
created_by varchar(100) NOT NULL,
elapsed_ms integer DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_dimension (
id SERIAL PRIMARY KEY,
model_id bigint DEFAULT NULL,
name varchar(255) NOT NULL,
biz_name varchar(255) NOT NULL,
description varchar(500) NOT NULL,
status smallint NOT NULL,
sensitive_level integer DEFAULT NULL,
type varchar(50) NOT NULL,
type_params text,
data_type varchar(50) DEFAULT NULL,
expr text NOT NULL,
created_at timestamp NOT NULL,
created_by varchar(100) NOT NULL,
updated_at timestamp NOT NULL,
updated_by varchar(100) NOT NULL,
semantic_type varchar(20) NOT NULL,
alias varchar(500) DEFAULT NULL,
default_values varchar(500) DEFAULT NULL,
dim_value_maps varchar(5000) DEFAULT NULL,
is_tag smallint DEFAULT NULL,
ext varchar(1000) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_domain (
id SERIAL PRIMARY KEY,
name varchar(255) DEFAULT NULL,
biz_name varchar(255) DEFAULT NULL,
parent_id bigint DEFAULT 0,
status smallint NOT NULL,
created_at timestamp DEFAULT NULL,
created_by varchar(100) DEFAULT NULL,
updated_at timestamp DEFAULT NULL,
updated_by varchar(100) DEFAULT NULL,
admin varchar(3000) DEFAULT NULL,
admin_org varchar(3000) DEFAULT NULL,
is_open smallint DEFAULT NULL,
viewer varchar(3000) DEFAULT NULL,
view_org varchar(3000) DEFAULT NULL,
entity varchar(500) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_metric (
id SERIAL PRIMARY KEY,
model_id bigint DEFAULT NULL,
name varchar(255) NOT NULL,
biz_name varchar(255) NOT NULL,
description varchar(500) DEFAULT NULL,
status smallint NOT NULL,
sensitive_level smallint NOT NULL,
type varchar(50) NOT NULL,
type_params text NOT NULL,
created_at timestamp NOT NULL,
created_by varchar(100) NOT NULL,
updated_at timestamp NOT NULL,
updated_by varchar(100) NOT NULL,
data_format_type varchar(50) DEFAULT NULL,
data_format varchar(500) DEFAULT NULL,
alias varchar(500) DEFAULT NULL,
classifications varchar(500) DEFAULT NULL,
relate_dimensions varchar(500) DEFAULT NULL,
ext text DEFAULT NULL,
define_type varchar(50) DEFAULT NULL,
is_publish smallint DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_model (
id SERIAL PRIMARY KEY,
name varchar(100) DEFAULT NULL,
biz_name varchar(100) DEFAULT NULL,
domain_id bigint DEFAULT NULL,
alias varchar(200) DEFAULT NULL,
status smallint DEFAULT NULL,
description varchar(500) DEFAULT NULL,
viewer varchar(500) DEFAULT NULL,
view_org varchar(500) DEFAULT NULL,
admin varchar(500) DEFAULT NULL,
admin_org varchar(500) DEFAULT NULL,
is_open smallint DEFAULT NULL,
created_by varchar(100) DEFAULT NULL,
created_at timestamp DEFAULT NULL,
updated_by varchar(100) DEFAULT NULL,
updated_at timestamp DEFAULT NULL,
entity text,
drill_down_dimensions TEXT DEFAULT NULL,
database_id INTEGER NOT NULL,
model_detail text NOT NULL,
source_type varchar(128) DEFAULT NULL,
depends varchar(500) DEFAULT NULL,
filter_sql varchar(1000) DEFAULT NULL,
tag_object_id integer DEFAULT 0,
ext varchar(1000) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_data_set (
id SERIAL PRIMARY KEY,
domain_id bigint,
name varchar(255),
biz_name varchar(255),
description varchar(255),
status integer,
alias varchar(255),
data_set_detail text,
created_at timestamp,
created_by varchar(255),
updated_at timestamp,
updated_by varchar(255),
query_config varchar(3000),
admin varchar(3000) DEFAULT NULL,
admin_org varchar(3000) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_tag (
id SERIAL PRIMARY KEY,
item_id INTEGER NOT NULL,
type varchar(255) NOT NULL,
created_at timestamp NOT NULL,
created_by varchar(100) NOT NULL,
updated_at timestamp DEFAULT NULL,
updated_by varchar(100) DEFAULT NULL,
ext text DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_tag_object (
id SERIAL PRIMARY KEY,
domain_id bigint DEFAULT NULL,
name varchar(255) NOT NULL,
biz_name varchar(255) NOT NULL,
description varchar(500) DEFAULT NULL,
status smallint NOT NULL DEFAULT 1,
sensitive_level smallint NOT NULL DEFAULT 0,
created_at timestamp NOT NULL,
created_by varchar(100) NOT NULL,
updated_at timestamp NULL,
updated_by varchar(100) NULL,
ext text DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_query_rule (
id SERIAL PRIMARY KEY,
data_set_id bigint,
priority integer NOT NULL DEFAULT 1,
rule_type varchar(255) NOT NULL,
name varchar(255) NOT NULL,
biz_name varchar(255) NOT NULL,
description varchar(500) DEFAULT NULL,
rule text DEFAULT NULL,
action text DEFAULT NULL,
status INTEGER NOT NULL DEFAULT 1,
created_at timestamp NOT NULL,
created_by varchar(100) NOT NULL,
updated_at timestamp DEFAULT NULL,
updated_by varchar(100) DEFAULT NULL,
ext text DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_term (
id SERIAL PRIMARY KEY,
domain_id bigint,
name varchar(255) NOT NULL,
description varchar(500) DEFAULT NULL,
alias varchar(1000) NOT NULL,
related_metrics varchar(1000) DEFAULT NULL,
related_dimensions varchar(1000) DEFAULT NULL,
created_at timestamp NOT NULL,
created_by varchar(100) NOT NULL,
updated_at timestamp DEFAULT NULL,
updated_by varchar(100) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_user_token (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
user_name VARCHAR(255) NOT NULL,
expire_time bigint NOT NULL,
token text NOT NULL,
salt VARCHAR(255) default NULL,
create_time TIMESTAMP NOT NULL,
create_by VARCHAR(255) NOT NULL,
update_time TIMESTAMP default NULL,
update_by VARCHAR(255) NOT NULL,
expire_date_time TIMESTAMP NOT NULL,
UNIQUE (name, user_name)
);
CREATE TABLE IF NOT EXISTS s2_app (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
description VARCHAR(255),
status INTEGER,
config TEXT,
end_date timestamp,
qps INTEGER,
app_secret VARCHAR(255),
owner VARCHAR(255),
created_at timestamp NULL,
updated_at timestamp NULL,
created_by varchar(255) NULL,
updated_by varchar(255) NULL
);
CREATE TABLE IF NOT EXISTS s2_plugin (
id SERIAL PRIMARY KEY,
type varchar(50) DEFAULT NULL,
data_set varchar(100) DEFAULT NULL,
pattern varchar(500) DEFAULT NULL,
parse_mode varchar(100) DEFAULT NULL,
parse_mode_config text,
name varchar(100) DEFAULT NULL,
created_at timestamp DEFAULT NULL,
created_by varchar(100) DEFAULT NULL,
updated_at timestamp DEFAULT NULL,
updated_by varchar(100) DEFAULT NULL,
config text,
comment text
);
CREATE TABLE IF NOT EXISTS s2_query_stat_info (
id SERIAL PRIMARY KEY,
trace_id varchar(200) DEFAULT NULL,
model_id bigint DEFAULT NULL,
data_set_id bigint DEFAULT NULL,
query_user varchar(200) DEFAULT NULL,
created_at timestamp DEFAULT CURRENT_TIMESTAMP,
query_type varchar(200) DEFAULT NULL,
query_type_back integer DEFAULT 0,
query_sql_cmd text,
sql_cmd_md5 varchar(200) DEFAULT NULL,
query_struct_cmd text,
struct_cmd_md5 varchar(200) DEFAULT NULL,
sql text,
sql_md5 varchar(200) DEFAULT NULL,
query_engine varchar(20) DEFAULT NULL,
elapsed_ms bigint DEFAULT NULL,
query_state varchar(20) DEFAULT NULL,
native_query boolean DEFAULT false,
start_date varchar(50) DEFAULT NULL,
end_date varchar(50) DEFAULT NULL,
dimensions text,
metrics text,
select_cols text,
agg_cols text,
filter_cols text,
group_by_cols text,
order_by_cols text,
use_result_cache boolean DEFAULT false,
use_sql_cache boolean DEFAULT false,
sql_cache_key text,
result_cache_key text,
query_opt_mode varchar(20) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS s2_canvas (
id SERIAL PRIMARY KEY,
domain_id bigint DEFAULT NULL,
type varchar(20) DEFAULT NULL,
config text,
created_at timestamp DEFAULT NULL,
created_by varchar(100) DEFAULT NULL,
updated_at timestamp DEFAULT NULL,
updated_by varchar(100) NOT NULL
);
CREATE TABLE IF NOT EXISTS s2_system_config (
id SERIAL PRIMARY KEY,
admin varchar(500),
parameters text
);
CREATE TABLE IF NOT EXISTS s2_model_rela (
id SERIAL PRIMARY KEY,
domain_id bigint,
from_model_id bigint,
to_model_id bigint,
join_type VARCHAR(255),
join_condition VARCHAR(255)
);
CREATE TABLE IF NOT EXISTS s2_collect (
id SERIAL PRIMARY KEY,
type varchar(20) NOT NULL,
username varchar(20) NOT NULL,
collect_id bigint NOT NULL,
create_time timestamp,
update_time timestamp
);
CREATE TABLE IF NOT EXISTS s2_metric_query_default_config (
id SERIAL PRIMARY KEY,
metric_id bigint,
user_name varchar(255) NOT NULL,
default_config varchar(1000) NOT NULL,
created_at timestamp NULL,
updated_at timestamp NULL,
created_by varchar(100) NULL,
updated_by varchar(100) NULL
);
CREATE TABLE IF NOT EXISTS s2_user (
id SERIAL PRIMARY KEY,
name varchar(100) NOT NULL,
display_name varchar(100) NULL,
password varchar(256) NULL,
salt varchar(256) DEFAULT NULL,
email varchar(100) NULL,
is_admin smallint NULL
);

View File

@@ -1,5 +1,4 @@
s2: s2:
schema: schema:
cache: cache:
enable: true enable: true

View File

@@ -6,12 +6,14 @@ import com.tencent.supersonic.chat.api.pojo.request.ChatExecuteReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatParseReq; import com.tencent.supersonic.chat.api.pojo.request.ChatParseReq;
import com.tencent.supersonic.chat.api.pojo.response.ChatParseResp; import com.tencent.supersonic.chat.api.pojo.response.ChatParseResp;
import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
import com.tencent.supersonic.chat.server.agent.Agent;
import com.tencent.supersonic.chat.server.service.AgentService; import com.tencent.supersonic.chat.server.service.AgentService;
import com.tencent.supersonic.chat.server.service.ChatQueryService; import com.tencent.supersonic.chat.server.service.ChatQueryService;
import com.tencent.supersonic.common.pojo.enums.DatePeriodEnum; import com.tencent.supersonic.common.pojo.enums.DatePeriodEnum;
import com.tencent.supersonic.common.service.ChatModelService; import com.tencent.supersonic.common.service.ChatModelService;
import com.tencent.supersonic.headless.api.pojo.SchemaElement; import com.tencent.supersonic.headless.api.pojo.SchemaElement;
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.headless.api.pojo.SemanticSchema;
import com.tencent.supersonic.headless.api.pojo.response.QueryState; import com.tencent.supersonic.headless.api.pojo.response.QueryState;
import com.tencent.supersonic.headless.server.service.SchemaService; import com.tencent.supersonic.headless.server.service.SchemaService;
import com.tencent.supersonic.util.DataUtils; import com.tencent.supersonic.util.DataUtils;
@@ -33,6 +35,9 @@ public class BaseTest extends BaseApplication {
protected final String endDay = LocalDate.now().toString(); protected final String endDay = LocalDate.now().toString();
protected final DatePeriodEnum period = DatePeriodEnum.DAY; protected final DatePeriodEnum period = DatePeriodEnum.DAY;
protected Agent agent;
protected SemanticSchema schema;
@Autowired @Autowired
protected ChatQueryService chatQueryService; protected ChatQueryService chatQueryService;
@Autowired @Autowired
@@ -44,23 +49,14 @@ public class BaseTest extends BaseApplication {
@Value("${s2.demo.enableLLM:false}") @Value("${s2.demo.enableLLM:false}")
protected boolean enableLLM; protected boolean enableLLM;
protected int agentId;
protected List<Long> durations = Lists.newArrayList(); protected List<Long> durations = Lists.newArrayList();
protected QueryResult submitMultiTurnChat(String queryText, Integer agentId, Integer chatId) protected Agent getAgentByName(String agentName) {
throws Exception { Optional<Agent> agent = agentService.getAgents().stream()
ChatParseResp parseResp = submitParse(queryText, agentId, chatId); .filter(a -> a.getName().equals(agentName)).findFirst();
SemanticParseInfo semanticParseInfo = parseResp.getSelectedParses().get(0); return agent.orElse(null);
ChatExecuteReq request =
ChatExecuteReq.builder().queryText(queryText).user(DataUtils.getUser())
.parseId(semanticParseInfo.getId()).queryId(parseResp.getQueryId())
.chatId(chatId).agentId(agentId).saveAnswer(true).build();
QueryResult queryResult = chatQueryService.execute(request);
queryResult.setChatContext(semanticParseInfo);
return queryResult;
} }
protected QueryResult submitNewChat(String queryText, Integer agentId) throws Exception { protected QueryResult submitNewChat(String queryText, Integer agentId) throws Exception {
@@ -79,8 +75,8 @@ public class BaseTest extends BaseApplication {
protected ChatParseResp submitParse(String queryText, Integer agentId, Integer chatId) { protected ChatParseResp submitParse(String queryText, Integer agentId, Integer chatId) {
ChatParseReq chatParseReq = DataUtils.getChatParseReq(chatId, queryText, enableLLM); ChatParseReq chatParseReq =
chatParseReq.setAgentId(agentId); DataUtils.getChatParseReq(chatId, agentId, queryText, enableLLM);
return chatQueryService.parse(chatParseReq); return chatQueryService.parse(chatParseReq);
} }
@@ -111,9 +107,9 @@ public class BaseTest extends BaseApplication {
assertEquals(expectedParseInfo.getDateInfo(), actualParseInfo.getDateInfo()); assertEquals(expectedParseInfo.getDateInfo(), actualParseInfo.getDateInfo());
} }
protected SchemaElement getSchemaElementByName(Set<SchemaElement> elementSet, String name) { protected SchemaElement getSchemaElementByName(List<SchemaElement> elements, String name) {
Optional<SchemaElement> matchElement = Optional<SchemaElement> matchElement =
elementSet.stream().filter(e -> e.getName().equals(name)).findFirst(); elements.stream().filter(e -> e.getName().equals(name)).findFirst();
return matchElement.orElse(null); return matchElement.orElse(null);
} }
} }

View File

@@ -5,13 +5,14 @@ import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum;
import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum;
import com.tencent.supersonic.common.pojo.enums.QueryType; import com.tencent.supersonic.common.pojo.enums.QueryType;
import com.tencent.supersonic.headless.api.pojo.DataSetSchema; import com.tencent.supersonic.demo.S2SingerDemo;
import com.tencent.supersonic.headless.api.pojo.SchemaElement; import com.tencent.supersonic.headless.api.pojo.SchemaElement;
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.headless.api.pojo.request.QueryFilter; import com.tencent.supersonic.headless.api.pojo.request.QueryFilter;
import com.tencent.supersonic.headless.chat.query.rule.detail.DetailDimensionQuery; import com.tencent.supersonic.headless.chat.query.rule.detail.DetailDimensionQuery;
import com.tencent.supersonic.util.DataUtils; import com.tencent.supersonic.util.DataUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junitpioneer.jupiter.SetSystemProperty; import org.junitpioneer.jupiter.SetSystemProperty;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
@@ -20,10 +21,16 @@ import org.springframework.boot.test.context.SpringBootTest;
@Slf4j @Slf4j
public class DetailTest extends BaseTest { public class DetailTest extends BaseTest {
@BeforeEach
public void init() {
agent = getAgentByName(S2SingerDemo.AGENT_NAME);
schema = schemaService.getSemanticSchema(agent.getDataSetIds());
}
@Test @Test
@SetSystemProperty(key = "s2.test", value = "true") @SetSystemProperty(key = "s2.test", value = "true")
public void test_detail_dimension() throws Exception { public void test_detail_dimension() throws Exception {
QueryResult actualResult = submitNewChat("周杰伦流派和代表作", DataUtils.singerAgentId); QueryResult actualResult = submitNewChat("周杰伦流派和代表作", agent.getId());
QueryResult expectedResult = new QueryResult(); QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
@@ -33,7 +40,6 @@ public class DetailTest extends BaseTest {
expectedParseInfo.setQueryType(QueryType.DETAIL); expectedParseInfo.setQueryType(QueryType.DETAIL);
expectedParseInfo.setAggType(AggregateTypeEnum.NONE); expectedParseInfo.setAggType(AggregateTypeEnum.NONE);
DataSetSchema schema = schemaService.getDataSetSchema(DataUtils.singerDatasettId);
SchemaElement singerElement = getSchemaElementByName(schema.getDimensions(), "歌手名"); SchemaElement singerElement = getSchemaElementByName(schema.getDimensions(), "歌手名");
QueryFilter dimensionFilter = DataUtils.getFilter("singer_name", FilterOperatorEnum.EQUALS, QueryFilter dimensionFilter = DataUtils.getFilter("singer_name", FilterOperatorEnum.EQUALS,
@@ -49,7 +55,7 @@ public class DetailTest extends BaseTest {
@Test @Test
public void test_detail_filter() throws Exception { public void test_detail_filter() throws Exception {
QueryResult actualResult = submitNewChat("国风歌手", DataUtils.singerAgentId); QueryResult actualResult = submitNewChat("国风歌手", agent.getId());
QueryResult expectedResult = new QueryResult(); QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
@@ -59,7 +65,6 @@ public class DetailTest extends BaseTest {
expectedParseInfo.setQueryType(QueryType.DETAIL); expectedParseInfo.setQueryType(QueryType.DETAIL);
expectedParseInfo.setAggType(AggregateTypeEnum.NONE); expectedParseInfo.setAggType(AggregateTypeEnum.NONE);
DataSetSchema schema = schemaService.getDataSetSchema(DataUtils.singerDatasettId);
SchemaElement genreElement = getSchemaElementByName(schema.getDimensions(), "流派"); SchemaElement genreElement = getSchemaElementByName(schema.getDimensions(), "流派");
QueryFilter dimensionFilter = DataUtils.getFilter("genre", FilterOperatorEnum.EQUALS, "国风", QueryFilter dimensionFilter = DataUtils.getFilter("genre", FilterOperatorEnum.EQUALS, "国风",
"流派", genreElement.getId()); "流派", genreElement.getId());

View File

@@ -5,7 +5,7 @@ import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.enums.DatePeriodEnum; import com.tencent.supersonic.common.pojo.enums.DatePeriodEnum;
import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum;
import com.tencent.supersonic.common.pojo.enums.QueryType; import com.tencent.supersonic.common.pojo.enums.QueryType;
import com.tencent.supersonic.headless.api.pojo.DataSetSchema; import com.tencent.supersonic.demo.S2VisitsDemo;
import com.tencent.supersonic.headless.api.pojo.SchemaElement; import com.tencent.supersonic.headless.api.pojo.SchemaElement;
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.headless.api.pojo.request.QueryFilter; import com.tencent.supersonic.headless.api.pojo.request.QueryFilter;
@@ -14,6 +14,7 @@ import com.tencent.supersonic.headless.chat.query.rule.metric.MetricGroupByQuery
import com.tencent.supersonic.headless.chat.query.rule.metric.MetricModelQuery; import com.tencent.supersonic.headless.chat.query.rule.metric.MetricModelQuery;
import com.tencent.supersonic.headless.chat.query.rule.metric.MetricTopNQuery; import com.tencent.supersonic.headless.chat.query.rule.metric.MetricTopNQuery;
import com.tencent.supersonic.util.DataUtils; import com.tencent.supersonic.util.DataUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junitpioneer.jupiter.SetSystemProperty; import org.junitpioneer.jupiter.SetSystemProperty;
@@ -31,9 +32,15 @@ import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.SUM;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MetricTest extends BaseTest { public class MetricTest extends BaseTest {
@BeforeEach
public void init() {
agent = getAgentByName(S2VisitsDemo.AGENT_NAME);
schema = schemaService.getSemanticSchema(agent.getDataSetIds());
}
@Test @Test
public void testMetricModel() throws Exception { public void testMetricModel() throws Exception {
QueryResult actualResult = submitNewChat("超音数 访问次数", DataUtils.productAgentId); QueryResult actualResult = submitNewChat("超音数 访问次数", agent.getId());
QueryResult expectedResult = new QueryResult(); QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
@@ -53,7 +60,7 @@ public class MetricTest extends BaseTest {
@Test @Test
public void testMetricFilter() throws Exception { public void testMetricFilter() throws Exception {
QueryResult actualResult = submitNewChat("alice的访问次数", DataUtils.productAgentId); QueryResult actualResult = submitNewChat("alice的访问次数", agent.getId());
QueryResult expectedResult = new QueryResult(); QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
@@ -64,7 +71,6 @@ public class MetricTest extends BaseTest {
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数")); expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
DataSetSchema schema = schemaService.getDataSetSchema(DataUtils.productDatasetId);
SchemaElement userElement = getSchemaElementByName(schema.getDimensions(), "用户"); SchemaElement userElement = getSchemaElementByName(schema.getDimensions(), "用户");
expectedParseInfo.getDimensionFilters().add(DataUtils.getFilter("user_name", expectedParseInfo.getDimensionFilters().add(DataUtils.getFilter("user_name",
FilterOperatorEnum.EQUALS, "alice", "用户", userElement.getId())); FilterOperatorEnum.EQUALS, "alice", "用户", userElement.getId()));
@@ -80,7 +86,7 @@ public class MetricTest extends BaseTest {
@Test @Test
@SetSystemProperty(key = "s2.test", value = "true") @SetSystemProperty(key = "s2.test", value = "true")
public void testMetricGroupBy() throws Exception { public void testMetricGroupBy() throws Exception {
QueryResult actualResult = submitNewChat("近7天超音数各部门的访问次数和停留时长", DataUtils.productAgentId); QueryResult actualResult = submitNewChat("近7天超音数各部门的访问次数和停留时长", agent.getId());
QueryResult expectedResult = new QueryResult(); QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
@@ -103,7 +109,7 @@ public class MetricTest extends BaseTest {
@Test @Test
public void testMetricFilterCompare() throws Exception { public void testMetricFilterCompare() throws Exception {
QueryResult actualResult = submitNewChat("对比alice和lucy的访问次数", DataUtils.productAgentId); QueryResult actualResult = submitNewChat("对比alice和lucy的访问次数", agent.getId());
QueryResult expectedResult = new QueryResult(); QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
@@ -117,7 +123,6 @@ public class MetricTest extends BaseTest {
list.add("alice"); list.add("alice");
list.add("lucy"); list.add("lucy");
DataSetSchema schema = schemaService.getDataSetSchema(DataUtils.productDatasetId);
SchemaElement userElement = getSchemaElementByName(schema.getDimensions(), "用户"); SchemaElement userElement = getSchemaElementByName(schema.getDimensions(), "用户");
QueryFilter dimensionFilter = DataUtils.getFilter("user_name", FilterOperatorEnum.IN, list, QueryFilter dimensionFilter = DataUtils.getFilter("user_name", FilterOperatorEnum.IN, list,
"用户", userElement.getId()); "用户", userElement.getId());
@@ -134,7 +139,7 @@ public class MetricTest extends BaseTest {
@Test @Test
@Order(3) @Order(3)
public void testMetricTopN() throws Exception { public void testMetricTopN() throws Exception {
QueryResult actualResult = submitNewChat("近3天访问次数最多的用户", DataUtils.productAgentId); QueryResult actualResult = submitNewChat("近3天访问次数最多的用户", agent.getId());
QueryResult expectedResult = new QueryResult(); QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
@@ -155,7 +160,7 @@ public class MetricTest extends BaseTest {
@Test @Test
public void testMetricGroupBySum() throws Exception { public void testMetricGroupBySum() throws Exception {
QueryResult actualResult = submitNewChat("近7天超音数各部门的访问次数总和", DataUtils.productAgentId); QueryResult actualResult = submitNewChat("近7天超音数各部门的访问次数总和", agent.getId());
QueryResult expectedResult = new QueryResult(); QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
expectedResult.setChatContext(expectedParseInfo); expectedResult.setChatContext(expectedParseInfo);
@@ -181,7 +186,7 @@ public class MetricTest extends BaseTest {
String dateStr = textFormat.format(format.parse(startDay)); String dateStr = textFormat.format(format.parse(startDay));
QueryResult actualResult = QueryResult actualResult =
submitNewChat(String.format("alice在%s的访问次数", dateStr), DataUtils.productAgentId); submitNewChat(String.format("alice在%s的访问次数", dateStr), agent.getId());
QueryResult expectedResult = new QueryResult(); QueryResult expectedResult = new QueryResult();
SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); SemanticParseInfo expectedParseInfo = new SemanticParseInfo();
@@ -190,7 +195,6 @@ public class MetricTest extends BaseTest {
expectedResult.setQueryMode(MetricFilterQuery.QUERY_MODE); expectedResult.setQueryMode(MetricFilterQuery.QUERY_MODE);
expectedParseInfo.setAggType(NONE); expectedParseInfo.setAggType(NONE);
DataSetSchema schema = schemaService.getDataSetSchema(DataUtils.productDatasetId);
SchemaElement userElement = getSchemaElementByName(schema.getDimensions(), "用户"); SchemaElement userElement = getSchemaElementByName(schema.getDimensions(), "用户");
expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数")); expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数"));
expectedParseInfo.getDimensionFilters().add(DataUtils.getFilter("user_name", expectedParseInfo.getDimensionFilters().add(DataUtils.getFilter("user_name",

View File

@@ -14,26 +14,42 @@ import com.tencent.supersonic.common.pojo.ChatApp;
import com.tencent.supersonic.common.pojo.User; import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.pojo.enums.AppModule; import com.tencent.supersonic.common.pojo.enums.AppModule;
import com.tencent.supersonic.common.util.ChatAppManager; import com.tencent.supersonic.common.util.ChatAppManager;
import com.tencent.supersonic.demo.S2CompanyDemo;
import com.tencent.supersonic.demo.S2VisitsDemo;
import com.tencent.supersonic.headless.chat.corrector.LLMSqlCorrector; import com.tencent.supersonic.headless.chat.corrector.LLMSqlCorrector;
import com.tencent.supersonic.util.DataUtils; import com.tencent.supersonic.util.DataUtils;
import com.tencent.supersonic.util.LLMConfigUtils; import com.tencent.supersonic.util.LLMConfigUtils;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
@TestInstance(TestInstance.Lifecycle.PER_CLASS) @TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestPropertySource(properties = {"s2.demo.enableLLM = true"}) @TestPropertySource(properties = {"s2.demo.enableLLM = true"})
@Disabled @Disabled
public class Text2SQLEval extends BaseTest { public class Text2SQLEval extends BaseTest {
private LLMConfigUtils.LLMType llmType = LLMConfigUtils.LLMType.OLLAMA_LLAMA3; private final LLMConfigUtils.LLMType llmType = LLMConfigUtils.LLMType.OLLAMA_LLAMA3;
private boolean enableLLMCorrection = true; private final boolean enableLLMCorrection = true;
protected final List<Long> dataSetIds = Lists.newArrayList();
@BeforeAll @BeforeAll
public void init() { public void init() {
Agent agent = agentService.createAgent(getLLMAgent(), DataUtils.getUser()); Agent productAgent = getAgentByName(S2VisitsDemo.AGENT_NAME);
agentId = agent.getId(); if (Objects.nonNull(productAgent)) {
dataSetIds.addAll(productAgent.getDataSetIds());
}
Agent companyAgent = getAgentByName(S2CompanyDemo.AGENT_NAME);
if (Objects.nonNull(companyAgent)) {
dataSetIds.addAll(companyAgent.getDataSetIds());
}
agent = agentService.createAgent(getLLMAgent(), DataUtils.getUser());
} }
@AfterAll @AfterAll
@@ -49,7 +65,7 @@ public class Text2SQLEval extends BaseTest {
@Test @Test
public void test_agg() throws Exception { public void test_agg() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
QueryResult result = submitNewChat("近30天总访问次数", agentId); QueryResult result = submitNewChat("近30天总访问次数", agent.getId());
durations.add(System.currentTimeMillis() - start); durations.add(System.currentTimeMillis() - start);
assert result.getQueryColumns().size() == 1; assert result.getQueryColumns().size() == 1;
assert result.getTextResult().contains("511"); assert result.getTextResult().contains("511");
@@ -58,7 +74,7 @@ public class Text2SQLEval extends BaseTest {
@Test @Test
public void test_agg_and_groupby() throws Exception { public void test_agg_and_groupby() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
QueryResult result = submitNewChat("近30日每天的访问次数", agentId); QueryResult result = submitNewChat("近30日每天的访问次数", agent.getId());
durations.add(System.currentTimeMillis() - start); durations.add(System.currentTimeMillis() - start);
assert result.getQueryColumns().size() == 2; assert result.getQueryColumns().size() == 2;
assert result.getQueryResults().size() == 30; assert result.getQueryResults().size() == 30;
@@ -68,7 +84,7 @@ public class Text2SQLEval extends BaseTest {
@Test @Test
public void test_drilldown() throws Exception { public void test_drilldown() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
QueryResult result = submitNewChat("过去30天每个部门的汇总访问次数", agentId); QueryResult result = submitNewChat("过去30天每个部门的汇总访问次数", agent.getId());
durations.add(System.currentTimeMillis() - start); durations.add(System.currentTimeMillis() - start);
assert result.getQueryColumns().size() == 2; assert result.getQueryColumns().size() == 2;
assert result.getQueryResults().size() == 4; assert result.getQueryResults().size() == 4;
@@ -81,7 +97,7 @@ public class Text2SQLEval extends BaseTest {
@Test @Test
public void test_drilldown_and_topN() throws Exception { public void test_drilldown_and_topN() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
QueryResult result = submitNewChat("过去30天访问次数最高的部门top3", agentId); QueryResult result = submitNewChat("过去30天访问次数最高的部门top3", agent.getId());
durations.add(System.currentTimeMillis() - start); durations.add(System.currentTimeMillis() - start);
assert result.getQueryResults().size() == 3; assert result.getQueryResults().size() == 3;
assert result.getTextResult().contains("marketing"); assert result.getTextResult().contains("marketing");
@@ -92,7 +108,7 @@ public class Text2SQLEval extends BaseTest {
@Test @Test
public void test_filter_and_top() throws Exception { public void test_filter_and_top() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
QueryResult result = submitNewChat("近半个月来marketing部门访问量最高的用户是谁", agentId); QueryResult result = submitNewChat("近半个月来marketing部门访问量最高的用户是谁", agent.getId());
durations.add(System.currentTimeMillis() - start); durations.add(System.currentTimeMillis() - start);
assert result.getQueryResults().size() == 1; assert result.getQueryResults().size() == 1;
assert result.getTextResult().contains("dean"); assert result.getTextResult().contains("dean");
@@ -101,7 +117,7 @@ public class Text2SQLEval extends BaseTest {
@Test @Test
public void test_filter() throws Exception { public void test_filter() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
QueryResult result = submitNewChat("近一个月sales部门总访问次数超过10次的用户有哪些", agentId); QueryResult result = submitNewChat("近一个月sales部门总访问次数超过10次的用户有哪些", agent.getId());
durations.add(System.currentTimeMillis() - start); durations.add(System.currentTimeMillis() - start);
assert result.getQueryResults().size() == 2; assert result.getQueryResults().size() == 2;
assert result.getTextResult().contains("alice"); assert result.getTextResult().contains("alice");
@@ -111,7 +127,7 @@ public class Text2SQLEval extends BaseTest {
@Test @Test
public void test_filter_compare() throws Exception { public void test_filter_compare() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
QueryResult result = submitNewChat("alice和lucy过去半个月谁的总停留时长更多", agentId); QueryResult result = submitNewChat("alice和lucy过去半个月谁的总停留时长更多", agent.getId());
durations.add(System.currentTimeMillis() - start); durations.add(System.currentTimeMillis() - start);
assert result.getQueryResults().size() >= 1; assert result.getQueryResults().size() >= 1;
assert result.getTextResult().contains("alice"); assert result.getTextResult().contains("alice");
@@ -120,7 +136,7 @@ public class Text2SQLEval extends BaseTest {
@Test @Test
public void test_term() throws Exception { public void test_term() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
QueryResult result = submitNewChat("过去半个月每个核心用户的总停留时长", agentId); QueryResult result = submitNewChat("过去半个月每个核心用户的总停留时长", agent.getId());
durations.add(System.currentTimeMillis() - start); durations.add(System.currentTimeMillis() - start);
assert result.getQueryResults().size() == 2; assert result.getQueryResults().size() == 2;
assert result.getTextResult().contains("tom"); assert result.getTextResult().contains("tom");
@@ -130,7 +146,7 @@ public class Text2SQLEval extends BaseTest {
@Test @Test
public void test_second_calculation() throws Exception { public void test_second_calculation() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
QueryResult result = submitNewChat("近1个月总访问次数超过100次的部门有几个", agentId); QueryResult result = submitNewChat("近1个月总访问次数超过100次的部门有几个", agent.getId());
durations.add(System.currentTimeMillis() - start); durations.add(System.currentTimeMillis() - start);
assert result.getQueryColumns().size() == 1; assert result.getQueryColumns().size() == 1;
assert result.getTextResult().contains("3"); assert result.getTextResult().contains("3");
@@ -139,7 +155,7 @@ public class Text2SQLEval extends BaseTest {
@Test @Test
public void test_detail_query() throws Exception { public void test_detail_query() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
QueryResult result = submitNewChat("特斯拉旗下有哪些品牌", agentId); QueryResult result = submitNewChat("特斯拉旗下有哪些品牌", agent.getId());
durations.add(System.currentTimeMillis() - start); durations.add(System.currentTimeMillis() - start);
assert result.getQueryColumns().size() >= 1; assert result.getQueryColumns().size() >= 1;
assert result.getTextResult().contains("Model Y"); assert result.getTextResult().contains("Model Y");
@@ -150,14 +166,12 @@ public class Text2SQLEval extends BaseTest {
Agent agent = new Agent(); Agent agent = new Agent();
agent.setName("Agent for Test"); agent.setName("Agent for Test");
ToolConfig toolConfig = new ToolConfig(); ToolConfig toolConfig = new ToolConfig();
DatasetTool datasetTool = new DatasetTool(); DatasetTool datasetTool = new DatasetTool();
datasetTool.setType(AgentToolType.DATASET); datasetTool.setType(AgentToolType.DATASET);
datasetTool.setDataSetIds(Lists.newArrayList(DataUtils.productDatasetId)); datasetTool.setDataSetIds(dataSetIds);
toolConfig.getTools().add(datasetTool); toolConfig.getTools().add(datasetTool);
DatasetTool datasetTool2 = new DatasetTool();
datasetTool2.setType(AgentToolType.DATASET);
datasetTool2.setDataSetIds(Lists.newArrayList(DataUtils.companyDatasetId));
toolConfig.getTools().add(datasetTool2);
agent.setToolConfig(JSONObject.toJSONString(toolConfig)); agent.setToolConfig(JSONObject.toJSONString(toolConfig));
// create chat model for this evaluation // create chat model for this evaluation
ChatModel chatModel = new ChatModel(); ChatModel chatModel = new ChatModel();

View File

@@ -1,6 +1,8 @@
package com.tencent.supersonic.headless; package com.tencent.supersonic.headless;
import com.tencent.supersonic.BaseApplication; import com.tencent.supersonic.BaseApplication;
import com.tencent.supersonic.chat.server.agent.Agent;
import com.tencent.supersonic.chat.server.service.AgentService;
import com.tencent.supersonic.common.pojo.Aggregator; import com.tencent.supersonic.common.pojo.Aggregator;
import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.DateConf.DateMode; import com.tencent.supersonic.common.pojo.DateConf.DateMode;
@@ -8,6 +10,7 @@ import com.tencent.supersonic.common.pojo.Order;
import com.tencent.supersonic.common.pojo.User; import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum;
import com.tencent.supersonic.common.pojo.enums.QueryType; import com.tencent.supersonic.common.pojo.enums.QueryType;
import com.tencent.supersonic.headless.api.pojo.SemanticSchema;
import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq;
@@ -15,6 +18,7 @@ import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService; import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
import com.tencent.supersonic.headless.server.persistence.dataobject.DomainDO; import com.tencent.supersonic.headless.server.persistence.dataobject.DomainDO;
import com.tencent.supersonic.headless.server.persistence.repository.DomainRepository; import com.tencent.supersonic.headless.server.persistence.repository.DomainRepository;
import com.tencent.supersonic.headless.server.service.SchemaService;
import com.tencent.supersonic.util.DataUtils; import com.tencent.supersonic.util.DataUtils;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -22,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Optional;
import static java.time.LocalDate.now; import static java.time.LocalDate.now;
@@ -29,9 +34,22 @@ public class BaseTest extends BaseApplication {
@Autowired @Autowired
protected SemanticLayerService semanticLayerService; protected SemanticLayerService semanticLayerService;
@Autowired @Autowired
private DomainRepository domainRepository; private DomainRepository domainRepository;
@Autowired
protected SchemaService schemaService;
@Autowired
private AgentService agentService;
protected Agent agent;
protected SemanticSchema schema;
protected Agent getAgentByName(String agentName) {
Optional<Agent> agent = agentService.getAgents().stream()
.filter(a -> a.getName().equals(agentName)).findFirst();
return agent.orElse(null);
}
protected SemanticQueryResp queryBySql(String sql) throws Exception { protected SemanticQueryResp queryBySql(String sql) throws Exception {
return queryBySql(sql, User.getDefaultUser()); return queryBySql(sql, User.getDefaultUser());

View File

@@ -22,6 +22,7 @@ import org.junit.jupiter.api.TestMethodOrder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
@@ -135,9 +136,9 @@ public class QueryByStructTest extends BaseTest {
aggregator.setFunc(AggOperatorEnum.SUM); aggregator.setFunc(AggOperatorEnum.SUM);
aggregator.setColumn("pv"); aggregator.setColumn("pv");
QueryStructReq queryStructReq1 = QueryStructReq queryStructReq1 =
buildQueryStructReq(Arrays.asList("department"), aggregator); buildQueryStructReq(Collections.singletonList("department"), aggregator);
SemanticQueryResp semanticQueryResp = semanticLayerService.queryByReq(queryStructReq1, tom); SemanticQueryResp semanticQueryResp = semanticLayerService.queryByReq(queryStructReq1, tom);
Assertions.assertNotNull(semanticQueryResp.getQueryAuthorization().getMessage()); Assertions.assertNotNull(semanticQueryResp.getQueryAuthorization().getMessage());
Assertions.assertTrue(semanticQueryResp.getSql().contains("`user_name` = 'tom'")); Assertions.assertTrue(semanticQueryResp.getSql().contains("user_name = 'tom'"));
} }
} }

View File

@@ -1,25 +1,36 @@
package com.tencent.supersonic.headless; package com.tencent.supersonic.headless;
import com.tencent.supersonic.common.pojo.User; import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.demo.S2VisitsDemo;
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.api.pojo.response.SemanticTranslateResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticTranslateResp;
import com.tencent.supersonic.headless.chat.utils.QueryReqBuilder; import com.tencent.supersonic.headless.chat.utils.QueryReqBuilder;
import com.tencent.supersonic.util.DataUtils; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.util.Arrays; import java.util.Collections;
import java.util.Optional;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
public class TranslateTest extends BaseTest { public class TranslateTest extends BaseTest {
private Long dataSetId;
@BeforeEach
public void init() {
agent = getAgentByName(S2VisitsDemo.AGENT_NAME);
schema = schemaService.getSemanticSchema(agent.getDataSetIds());
Optional<Long> id = agent.getDataSetIds().stream().findFirst();
dataSetId = id.orElse(1L);
}
@Test @Test
public void testSqlExplain() throws Exception { public void testSqlExplain() throws Exception {
String sql = "SELECT 部门, SUM(访问次数) AS 访问次数 FROM 超音数PVUV统计 GROUP BY 部门 "; String sql = "SELECT 部门, SUM(访问次数) AS 访问次数 FROM 超音数PVUV统计 GROUP BY 部门 ";
SemanticTranslateResp explain = semanticLayerService.translate( SemanticTranslateResp explain = semanticLayerService
QueryReqBuilder.buildS2SQLReq(sql, DataUtils.productDatasetId), .translate(QueryReqBuilder.buildS2SQLReq(sql, dataSetId), User.getDefaultUser());
User.getDefaultUser());
assertNotNull(explain); assertNotNull(explain);
assertNotNull(explain.getQuerySQL()); assertNotNull(explain.getQuerySQL());
assertTrue(explain.getQuerySQL().contains("department")); assertTrue(explain.getQuerySQL().contains("department"));
@@ -28,7 +39,8 @@ public class TranslateTest extends BaseTest {
@Test @Test
public void testStructExplain() throws Exception { public void testStructExplain() throws Exception {
QueryStructReq queryStructReq = buildQueryStructReq(Arrays.asList("department")); QueryStructReq queryStructReq =
buildQueryStructReq(Collections.singletonList("department"));
SemanticTranslateResp explain = SemanticTranslateResp explain =
semanticLayerService.translate(queryStructReq, User.getDefaultUser()); semanticLayerService.translate(queryStructReq, User.getDefaultUser());
assertNotNull(explain); assertNotNull(explain);

View File

@@ -15,14 +15,6 @@ import static java.time.LocalDate.now;
public class DataUtils { public class DataUtils {
public static final Integer productAgentId = 1;
public static final Integer companyAgentId = 2;
public static final Integer singerAgentId = 3;
public static final Long productDatasetId = 1L;
public static final Long companyDatasetId = 2L;
public static final Long singerDatasettId = 3L;
public static final Integer ONE_TURNS_CHAT_ID = 10; public static final Integer ONE_TURNS_CHAT_ID = 10;
private static final User user_test = User.getDefaultUser(); private static final User user_test = User.getDefaultUser();
@@ -42,11 +34,12 @@ public class DataUtils {
return User.get(3L, "tom"); return User.get(3L, "tom");
} }
public static ChatParseReq getChatParseReq(Integer id, String query, boolean enableLLM) { public static ChatParseReq getChatParseReq(Integer id, Integer agentId, String query,
boolean enableLLM) {
ChatParseReq chatParseReq = new ChatParseReq(); ChatParseReq chatParseReq = new ChatParseReq();
chatParseReq.setQueryText(query); chatParseReq.setQueryText(query);
chatParseReq.setAgentId(productAgentId);
chatParseReq.setChatId(id); chatParseReq.setChatId(id);
chatParseReq.setAgentId(agentId);
chatParseReq.setUser(user_test); chatParseReq.setUser(user_test);
chatParseReq.setDisableLLM(!enableLLM); chatParseReq.setDisableLLM(!enableLLM);
return chatParseReq; return chatParseReq;

View File

@@ -13,22 +13,34 @@ spring:
path: /h2-console/semantic path: /h2-console/semantic
enabled: true enabled: true
### Comment out following lines if using MySQL ## Comment out following lines if using MySQL
#spring: #spring:
# datasource: # datasource:
# driver-class-name: com.mysql.cj.jdbc.Driver # driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://localhost:3306/s2_database?user=root # url: jdbc:mysql://localhost:3306/mysql
# username: root # username: root
# password: # password:
# sql: # sql:
# enabled: true
# mode: always
# username: root
# password:
# init: # init:
# enabled: false
# mode: always
# username: root
# password:
# schema-locations: classpath:db/schema-mysql.sql,classpath:db/schema-mysql-demo.sql # schema-locations: classpath:db/schema-mysql.sql,classpath:db/schema-mysql-demo.sql
# data-locations: classpath:db/data-mysql.sql,classpath:db/data-mysql-demo.sql # data-locations: classpath:db/data-mysql.sql,classpath:db/data-mysql-demo.sql
# h2:
# console: ## Comment out following lines if using Postgres
# path: /h2-console/semantic #spring:
# enabled: true # datasource:
# driver-class-name: org.postgresql.Driver
# url: jdbc:postgresql://localhost:5432/postgres?stringtype=unspecified
# username: postgres
# password: postgres
# sql:
# init:
# enabled: false
# mode: always
# username: postgres
# password: postgres
# schema-locations: classpath:db/schema-postgres.sql,classpath:db/schema-postgres-demo.sql
# data-locations: classpath:db/data-postgres.sql,classpath:db/data-postgres-demo.sql

View File

@@ -1,40 +0,0 @@
server:
port: 9080
compression:
enabled: true
min-response-size: 1024
mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*
spring:
profiles:
active: local
application:
name: chat
config:
import:
- classpath:s2-config.yaml
main:
allow-circular-references: true
mvc:
pathmatch:
matching-strategy: ANT_PATH_MATCHER
mybatis:
mapper-locations=classpath:mappers/custom/*.xml,classpath*:/mappers/*.xml
logging:
level:
dev.langchain4j: DEBUG
dev.ai4j.openai4j: DEBUG
swagger:
title: 'SuperSonic API Documentation'
base:
package: com.tencent.supersonic
description: 'SuperSonic API Documentation'
url: ''
contact:
name:
email:
url: ''
version: 3.0

File diff suppressed because it is too large Load Diff

View File

@@ -1,22 +0,0 @@
-- sample user
MERGE INTO s2_user (id, `name`, password, salt, display_name, email, is_admin) values (1, 'admin','c3VwZXJzb25pY0BiaWNvbTD12g9wGXESwL7+o7xUW90=','jGl25bVBBBW96Qi9Te4V3w==','admin','admin@xx.com', 1);
MERGE INTO s2_user (id, `name`, password, display_name, email) values (2, 'jack','123456','jack','jack@xx.com');
MERGE INTO s2_user (id, `name`, password, display_name, email) values (3, 'tom','123456','tom','tom@xx.com');
MERGE INTO s2_user (id, `name`, password, display_name, email, is_admin) values (4, 'lucy','123456','lucy','lucy@xx.com', 1);
MERGE INTO s2_user (id, `name`, password, display_name, email) values (5, 'alice','123456','alice','alice@xx.com');
---The default value for the password is 123456
MERGE INTO s2_user (id, `name`, password, salt, display_name, email, is_admin) values (1, 'admin','c3VwZXJzb25pY0BiaWNvbdktJJYWw6A3rEmBUPzbn/6DNeYnD+y3mAwDKEMS3KVT','jGl25bVBBBW96Qi9Te4V3w==','admin','admin@xx.com', 1);
MERGE INTO s2_user (id, `name`, password, salt, display_name, email) values (2, 'jack','c3VwZXJzb25pY0BiaWNvbWxGalmwa0h/trkh/3CWOYMDiku0Op1VmOfESIKmN0HG','MWERWefm/3hD6kYndF6JIg==','jack','jack@xx.com');
MERGE INTO s2_user (id, `name`, password, salt, display_name, email) values (3, 'tom','c3VwZXJzb25pY0BiaWNvbVWv0CZ6HzeX8GRUpw0C8NSaQ+0hE/dAcmzRpCFwAqxK','4WCPdcXXgT89QDHLML+3hg==','tom','tom@xx.com');
MERGE INTO s2_user (id, `name`, password, salt, display_name, email) values (4, 'lucy','c3VwZXJzb25pY0BiaWNvbc7Ychfu99lPL7rLmCkf/vgF4RASa4Z++Mxo1qlDCpci','3Jnpqob6uDoGLP9eCAg5Fw==','lucy','lucy@xx.com');
MERGE INTO s2_user (id, `name`, password, salt, display_name, email) values (5, 'alice','c3VwZXJzb25pY0BiaWNvbe9Z4F2/DVIfAJoN1HwUTuH1KgVuiusvfh7KkWYQSNHk','K9gGyX8OAK8aH8Myj6djqQ==','alice','alice@xx.com');
MERGE INTO s2_available_date_info(`id`,`item_id` ,`type` ,`date_format` ,`start_date` ,`end_date` ,`unavailable_date` ,`created_at` ,`created_by` ,`updated_at` ,`updated_by` )
values (1 , 1, 'dimension', 'yyyy-MM-dd', DATEADD('DAY', -28, CURRENT_DATE()), DATEADD('DAY', -1, CURRENT_DATE()), '[]', '2023-06-01', 'admin', '2023-06-01', 'admin');
MERGE INTO s2_available_date_info(`id`,`item_id` ,`type` ,`date_format` ,`start_date` ,`end_date` ,`unavailable_date` ,`created_at` ,`created_by` ,`updated_at` ,`updated_by` )
values (2 , 2, 'dimension', 'yyyy-MM-dd', DATEADD('DAY', -28, CURRENT_DATE()), DATEADD('DAY', -1, CURRENT_DATE()), '[]', '2023-06-01', 'admin', '2023-06-01', 'admin');
MERGE INTO s2_available_date_info(`id`,`item_id` ,`type` ,`date_format` ,`start_date` ,`end_date` ,`unavailable_date` ,`created_at` ,`created_by` ,`updated_at` ,`updated_by` )
values (3 , 3, 'dimension', 'yyyy-MM-dd', DATEADD('DAY', -28, CURRENT_DATE()), DATEADD('DAY', -1, CURRENT_DATE()), '[]', '2023-06-01', 'admin', '2023-06-01', 'admin');
MERGE INTO s2_canvas(`id`, `domain_id`, `type`, `config` ,`created_at` ,`created_by` ,`updated_at` ,`updated_by` )
values (1, 1, 'modelEdgeRelation', '[{"source":"datasource-1","target":"datasource-3","type":"polyline","id":"edge-0.305251275235679741702883718912","style":{"active":{"stroke":"rgb(95, 149, 255)","lineWidth":1},"selected":{"stroke":"rgb(95, 149, 255)","lineWidth":2,"shadowColor":"rgb(95, 149, 255)","shadowBlur":10,"text-shape":{"fontWeight":500}},"highlight":{"stroke":"rgb(95, 149, 255)","lineWidth":2,"text-shape":{"fontWeight":500}},"inactive":{"stroke":"rgb(234, 234, 234)","lineWidth":1},"disable":{"stroke":"rgb(245, 245, 245)","lineWidth":1},"stroke":"#296df3","endArrow":true},"startPoint":{"x":-94,"y":-137.5,"anchorIndex":0,"id":"-94|||-137.5"},"endPoint":{"x":-234,"y":-45,"anchorIndex":1,"id":"-234|||-45"},"sourceAnchor":2,"targetAnchor":1,"label":"模型关系编辑"},{"source":"datasource-1","target":"datasource-2","type":"polyline","id":"edge-0.466237264629309141702883756359","style":{"active":{"stroke":"rgb(95, 149, 255)","lineWidth":1},"selected":{"stroke":"rgb(95, 149, 255)","lineWidth":2,"shadowColor":"rgb(95, 149, 255)","shadowBlur":10,"text-shape":{"fontWeight":500}},"highlight":{"stroke":"rgb(95, 149, 255)","lineWidth":2,"text-shape":{"fontWeight":500}},"inactive":{"stroke":"rgb(234, 234, 234)","lineWidth":1},"disable":{"stroke":"rgb(245, 245, 245)","lineWidth":1},"stroke":"#296df3","endArrow":true},"startPoint":{"x":-12,"y":-137.5,"anchorIndex":1,"id":"-12|||-137.5"},"endPoint":{"x":85,"y":31.5,"anchorIndex":0,"id":"85|||31.5"},"sourceAnchor":1,"targetAnchor":2,"label":"模型关系编辑"}]', '2023-06-01', 'admin', '2023-06-01', 'admin');

View File

@@ -1,85 +0,0 @@
-------S2VisitsDemo
CREATE TABLE IF NOT EXISTS `s2_user_department` (
`user_name` varchar(200) NOT NULL,
`department` varchar(200) NOT NULL, -- department of user
PRIMARY KEY (`user_name`,`department`)
);
COMMENT ON TABLE s2_user_department IS 'user_department_info';
CREATE TABLE IF NOT EXISTS `s2_pv_uv_statis` (
`imp_date` varchar(200) NOT NULL,
`user_name` varchar(200) NOT NULL,
`page` varchar(200) NOT NULL
);
COMMENT ON TABLE s2_pv_uv_statis IS 's2_pv_uv_statis';
CREATE TABLE IF NOT EXISTS `s2_stay_time_statis` (
`imp_date` varchar(200) NOT NULL,
`user_name` varchar(200) NOT NULL,
`stay_hours` DOUBLE NOT NULL,
`page` varchar(200) NOT NULL
);
COMMENT ON TABLE s2_stay_time_statis IS 's2_stay_time_statis_info';
-------S2ArtistDemo
CREATE TABLE IF NOT EXISTS `singer` (
`singer_name` varchar(200) NOT NULL,
`act_area` varchar(200) NOT NULL,
`song_name` varchar(200) NOT NULL,
`genre` varchar(200) NOT NULL,
`js_play_cnt` bigINT DEFAULT NULL,
`down_cnt` bigINT DEFAULT NULL,
`favor_cnt` bigINT DEFAULT NULL,
PRIMARY KEY (`singer_name`)
);
COMMENT ON TABLE singer IS 'singer_info';
CREATE TABLE IF NOT EXISTS `genre` (
`g_name` varchar(20) NOT NULL , -- genre name
`rating` INT ,
`most_popular_in` varchar(50) ,
PRIMARY KEY (`g_name`)
);
COMMENT ON TABLE genre IS 'genre';
CREATE TABLE IF NOT EXISTS `artist` (
`artist_name` varchar(50) NOT NULL , -- genre name
`citizenship` varchar(20) ,
`gender` varchar(20) ,
`g_name` varchar(50),
PRIMARY KEY (`artist_name`,`citizenship`)
);
COMMENT ON TABLE artist IS 'artist';
-------S2CompanyDemo
CREATE TABLE IF NOT EXISTS `company` (
`company_id` varchar(50) NOT NULL ,
`company_name` varchar(50) NOT NULL ,
`headquarter_address` varchar(50) NOT NULL ,
`company_established_time` varchar(20) NOT NULL ,
`founder` varchar(20) NOT NULL ,
`ceo` varchar(20) NOT NULL ,
`annual_turnover` bigint(15) ,
`employee_count` int(7) ,
PRIMARY KEY (`company_id`)
);
CREATE TABLE IF NOT EXISTS `brand` (
`brand_id` varchar(50) NOT NULL ,
`brand_name` varchar(50) NOT NULL ,
`brand_established_time` varchar(20) NOT NULL ,
`company_id` varchar(50) NOT NULL ,
`legal_representative` varchar(20) NOT NULL ,
`registered_capital` bigint(15) ,
PRIMARY KEY (`brand_id`)
);
CREATE TABLE IF NOT EXISTS `brand_revenue` (
`year_time` varchar(10) NOT NULL ,
`brand_id` varchar(50) NOT NULL ,
`revenue` bigint(15) NOT NULL,
`profit` bigint(15) NOT NULL ,
`revenue_growth_year_on_year` double NOT NULL ,
`profit_growth_year_on_year` double NOT NULL
);

View File

@@ -1,687 +0,0 @@
-- chat tables
CREATE TABLE IF NOT EXISTS `s2_chat_context`
(
`chat_id` BIGINT NOT NULL , -- context chat id
`modified_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , -- row modify time
`user` varchar(64) DEFAULT NULL , -- row modify user
`query_text` LONGVARCHAR DEFAULT NULL , -- query text
`semantic_parse` LONGVARCHAR DEFAULT NULL , -- parse data
`ext_data` LONGVARCHAR DEFAULT NULL , -- extend data
PRIMARY KEY (`chat_id`)
);
CREATE TABLE IF NOT EXISTS `s2_chat`
(
`chat_id` BIGINT auto_increment ,-- AUTO_INCREMENT,
`agent_id` INT DEFAULT NULL,
`chat_name` varchar(100) DEFAULT NULL,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
`last_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
`creator` varchar(30) DEFAULT NULL,
`last_question` varchar(200) DEFAULT NULL,
`is_delete` INT DEFAULT '0' COMMENT 'is deleted',
`is_top` INT DEFAULT '0' COMMENT 'is top',
PRIMARY KEY (`chat_id`)
) ;
CREATE TABLE IF NOT EXISTS `s2_chat_query`
(
`question_id` BIGINT NOT NULL AUTO_INCREMENT,
`agent_id` INT NULL,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`query_text` mediumtext,
`user_name` varchar(150) DEFAULT NULL COMMENT '',
`query_state` int(1) DEFAULT NULL,
`chat_id` BIGINT NOT NULL , -- context chat id
`query_result` mediumtext NOT NULL ,
`score` int DEFAULT '0',
`feedback` varchar(1024) DEFAULT '',
`similar_queries` varchar(1024) DEFAULT '',
`parse_time_cost` varchar(1024) DEFAULT '',
PRIMARY KEY (`question_id`)
);
CREATE TABLE IF NOT EXISTS `s2_chat_parse`
(
`question_id` BIGINT NOT NULL,
`chat_id` INT NOT NULL ,
`parse_id` INT NOT NULL ,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`query_text` varchar(500),
`user_name` varchar(150) DEFAULT NULL COMMENT '',
`parse_info` mediumtext NOT NULL ,
`is_candidate` INT DEFAULT 1 COMMENT '1是candidate,0是selected'
);
CREATE TABLE IF NOT EXISTS `s2_chat_statistics`
(
`question_id` BIGINT NOT NULL,
`chat_id` BIGINT NOT NULL ,
`user_name` varchar(150) DEFAULT NULL COMMENT '',
`query_text` varchar(200),
`interface_name` varchar(100) DEFAULT NULL COMMENT '',
`cost` INT(6) NOT NULL ,
`type` INT NOT NULL ,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS `s2_chat_config` (
`id` INT NOT NULL AUTO_INCREMENT,
`model_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 ,
`updated_by` varchar(100) NOT NULL ,
`status` INT NOT NULL DEFAULT '0' , -- domain extension information status : 0 is normal, 1 is off the shelf, 2 is deleted
`llm_examples` TEXT,
PRIMARY KEY (`id`)
) ;
COMMENT ON TABLE s2_chat_config IS 'chat config information table ';
CREATE TABLE IF NOT EXISTS `s2_chat_memory` (
`id` INT NOT NULL AUTO_INCREMENT,
`question` varchar(655) ,
`agent_id` INT ,
`db_schema` TEXT ,
`s2_sql` TEXT ,
`side_info` TEXT ,
`status` char(10) ,
`llm_review` char(10) ,
`llm_comment` TEXT,
`human_review` char(10) ,
`human_comment` TEXT ,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
`created_by` varchar(100) ,
`updated_by` varchar(100) ,
PRIMARY KEY (`id`)
) ;
COMMENT ON TABLE s2_chat_memory IS 'chat memory table ';
CREATE TABLE IF NOT EXISTS `s2_chat_model`
(
id int AUTO_INCREMENT,
name varchar(100) null,
description varchar(500) null,
`config` varchar(500) NOT NULL ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL,
`admin` varchar(500) NOT NULL,
`viewer` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
); COMMENT ON TABLE s2_chat_model IS 'chat model table';
create table IF NOT EXISTS s2_user
(
id INT AUTO_INCREMENT,
name varchar(100) not null,
display_name varchar(100) null,
password varchar(256) null,
salt varchar(256) NULL,
email varchar(100) null,
is_admin INT null,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_user IS 'user information table';
-- semantic tables
CREATE TABLE IF NOT EXISTS `s2_domain` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` varchar(255) DEFAULT NULL , -- domain name
`biz_name` varchar(255) DEFAULT NULL , -- internal name
`parent_id` INT DEFAULT '0' , -- parent domain ID
`status` INT NOT NULL ,
`created_at` TIMESTAMP DEFAULT NULL ,
`created_by` varchar(100) DEFAULT NULL ,
`updated_at` TIMESTAMP DEFAULT NULL ,
`updated_by` varchar(100) DEFAULT NULL ,
`admin` varchar(3000) DEFAULT NULL , -- domain administrator
`admin_org` varchar(3000) DEFAULT NULL , -- domain administrators organization
`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
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_domain IS 'domain basic information';
CREATE TABLE IF NOT EXISTS `s2_model` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` varchar(255) DEFAULT NULL , -- domain name
`biz_name` varchar(255) DEFAULT NULL , -- internal name
`domain_id` INT DEFAULT '0' , -- parent domain ID
`tag_object_id` INT DEFAULT '0' ,
`alias` varchar(255) DEFAULT NULL , -- internal name
`status` INT DEFAULT NULL,
`description` varchar(500) DEFAULT NULL ,
`created_at` TIMESTAMP DEFAULT NULL ,
`created_by` varchar(100) DEFAULT NULL ,
`updated_at` TIMESTAMP DEFAULT NULL ,
`updated_by` varchar(100) DEFAULT NULL ,
`admin` varchar(3000) DEFAULT NULL , -- domain administrator
`admin_org` varchar(3000) DEFAULT NULL , -- domain administrators organization
`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
`drill_down_dimensions` TEXT DEFAULT NULL , -- drill down dimensions info
`database_id` INT NOT NULL ,
`model_detail` LONGVARCHAR NOT NULL ,
`depends` varchar(500) DEFAULT NULL ,
`source_type` varchar(128) DEFAULT NULL ,
`filter_sql` varchar(1000) DEFAULT NULL ,
`ext` varchar(1000) DEFAULT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_model IS 'model information';
CREATE TABLE IF NOT EXISTS `s2_database` (
`id` INT NOT NULL AUTO_INCREMENT,
`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 ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL,
`admin` varchar(500) NOT NULL,
`viewer` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_database IS 'database instance table';
create table IF NOT EXISTS s2_auth_groups
(
group_id INT,
config varchar(2048),
PRIMARY KEY (`group_id`)
);
CREATE TABLE IF NOT EXISTS `s2_metric` (
`id` INT NOT NULL AUTO_INCREMENT,
`model_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`biz_name` varchar(255) NOT NULL ,
`description` varchar(500) DEFAULT NULL ,
`status` INT NOT NULL ,
`sensitive_level` INT NOT NULL ,
`type` varchar(50) NOT NULL , -- ATOMIC, DERIVED
`type_params` LONGVARCHAR DEFAULT NULL ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL ,
`data_format_type` varchar(50) DEFAULT NULL ,
`data_format` varchar(500) DEFAULT NULL,
`alias` varchar(500) DEFAULT NULL,
`classifications` varchar(500) DEFAULT NULL,
`relate_dimensions` varchar(500) DEFAULT NULL,
`ext` LONGVARCHAR DEFAULT NULL ,
`define_type` varchar(50) NOT NULL, -- MEASURE, FIELD, METRIC
`is_publish` INT,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_metric IS 'metric information table';
CREATE TABLE IF NOT EXISTS `s2_dimension` (
`id` INT NOT NULL AUTO_INCREMENT ,
`model_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`biz_name` varchar(255) NOT NULL ,
`description` varchar(500) NOT NULL ,
`status` INT NOT NULL , -- status, 0 is off the shelf, 1 is normal
`sensitive_level` INT DEFAULT NULL ,
`data_type` varchar(50) DEFAULT NULL , -- type date,array,varchar
`type` varchar(50) NOT NULL , -- type categorical,time
`type_params` LONGVARCHAR DEFAULT NULL ,
`expr` LONGVARCHAR NOT NULL , -- expression
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL ,
`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,
`is_tag` INT DEFAULT NULL,
`ext` varchar(1000) DEFAULT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_dimension IS 'dimension information table';
CREATE TABLE IF NOT EXISTS s2_model_rela
(
id BIGINT AUTO_INCREMENT,
domain_id BIGINT,
from_model_id BIGINT,
to_model_id BIGINT,
join_type VARCHAR(255),
join_condition VARCHAR(255),
PRIMARY KEY (`id`)
);
create table IF NOT EXISTS `s2_canvas` (
id INT auto_increment,
domain_id INT null,
type varchar(20) null comment 'model、dimension、metric',
config LONGVARCHAR null comment 'config detail',
created_at TIMESTAMP null,
created_by varchar(100) null,
updated_at TIMESTAMP null,
updated_by varchar(100) not null,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_canvas IS 'canvas table';
CREATE TABLE IF NOT EXISTS `s2_query_stat_info` (
`id` INT NOT NULL AUTO_INCREMENT,
`trace_id` varchar(200) DEFAULT NULL, -- query unique identifier
`model_id` INT DEFAULT NULL,
`data_set_id` INT DEFAULT NULL,
`user` varchar(200) DEFAULT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
`query_type` varchar(200) DEFAULT NULL, -- the corresponding scene
`query_type_back` INT DEFAULT '0' , -- query type, 0-normal query, 1-pre-refresh type
`query_sql_cmd`LONGVARCHAR , -- sql type request parameter
`sql_cmd_md5` varchar(200) DEFAULT NULL, -- sql type request parameter md5
`query_struct_cmd`LONGVARCHAR , -- struct type request parameter
`struct_cmd_md5` varchar(200) DEFAULT NULL, -- struct type request parameter md5值
`sql`LONGVARCHAR ,
`sql_md5` varchar(200) DEFAULT NULL, -- sql md5
`query_engine` varchar(20) DEFAULT NULL,
`elapsed_ms` bigINT DEFAULT NULL,
`query_state` varchar(20) DEFAULT NULL,
`native_query` INT DEFAULT NULL, -- 1-detail query, 0-aggregation query
`start_date` varchar(50) DEFAULT NULL,
`end_date` varchar(50) DEFAULT NULL,
`dimensions`LONGVARCHAR , -- dimensions involved in sql
`metrics`LONGVARCHAR , -- metric involved in sql
`select_cols`LONGVARCHAR ,
`agg_cols`LONGVARCHAR ,
`filter_cols`LONGVARCHAR ,
`group_by_cols`LONGVARCHAR ,
`order_by_cols`LONGVARCHAR ,
`use_result_cache` TINYINT DEFAULT '-1' , -- whether to hit the result cache
`use_sql_cache` TINYINT DEFAULT '-1' , -- whether to hit the sql cache
`sql_cache_key`LONGVARCHAR , -- sql cache key
`result_cache_key`LONGVARCHAR , -- result cache key
`query_opt_mode` varchar(50) DEFAULT NULL ,
PRIMARY KEY (`id`)
) ;
COMMENT ON TABLE s2_query_stat_info IS 'query statistics table';
CREATE TABLE IF NOT EXISTS `s2_semantic_pasre_info` (
`id` INT NOT NULL AUTO_INCREMENT,
`trace_id` varchar(200) NOT NULL ,
`model_id` INT NOT NULL ,
`dimensions`LONGVARCHAR ,
`metrics`LONGVARCHAR ,
`orders`LONGVARCHAR ,
`filters`LONGVARCHAR ,
`date_info`LONGVARCHAR ,
`limit` INT NOT NULL ,
`native_query` TINYINT NOT NULL DEFAULT '0' ,
`sql`LONGVARCHAR ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`status` INT NOT NULL ,
`elapsed_ms` bigINT DEFAULT NULL ,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_semantic_pasre_info IS 'semantic layer sql parsing information table';
CREATE TABLE IF NOT EXISTS `s2_available_date_info` (
`id` INT NOT NULL AUTO_INCREMENT ,
`item_id` INT NOT NULL ,
`type` varchar(255) NOT NULL ,
`date_format` varchar(64) NOT NULL ,
`start_date` varchar(64) ,
`end_date` varchar(64) ,
`unavailable_date` LONGVARCHAR DEFAULT NULL ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL ,
`date_period` varchar(100) DEFAULT NULL ,
`status` INT DEFAULT '0', -- 1-in use 0 is normal, 1 is off the shelf, 2 is deleted
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_dimension IS 'dimension information table';
CREATE TABLE IF NOT EXISTS `s2_plugin`
(
`id` INT AUTO_INCREMENT,
`type` varchar(50) NULL,
`data_set` varchar(100) NULL,
`pattern` varchar(500) NULL,
`parse_mode` varchar(100) NULL,
`parse_mode_config` LONGVARCHAR 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,
`comment` LONGVARCHAR NULL,
PRIMARY KEY (`id`)
); COMMENT ON TABLE s2_plugin IS 'plugin information table';
CREATE TABLE IF NOT EXISTS s2_agent
(
id int AUTO_INCREMENT,
name varchar(100) null,
description varchar(500) null,
status int null,
examples varchar(500) null,
tool_config varchar(2000) null,
llm_config varchar(2000) null,
chat_model_config varchar(6000) null,
visual_config varchar(2000) null,
created_by varchar(100) null,
created_at TIMESTAMP null,
updated_by varchar(100) null,
updated_at TIMESTAMP null,
enable_search int null,
enable_feedback int null,
admin varchar(1000),
viewer varchar(1000),
PRIMARY KEY (`id`)
); COMMENT ON TABLE s2_agent IS 'agent information table';
-------demo for semantic and chat
CREATE TABLE IF NOT EXISTS `s2_user_department` (
`user_name` varchar(200) NOT NULL,
`department` varchar(200) NOT NULL, -- department of user
PRIMARY KEY (`user_name`,`department`)
);
COMMENT ON TABLE s2_user_department IS 'user_department_info';
CREATE TABLE IF NOT EXISTS `s2_pv_uv_statis` (
`imp_date` varchar(200) NOT NULL,
`user_name` varchar(200) NOT NULL,
`page` varchar(200) NOT NULL
);
COMMENT ON TABLE s2_pv_uv_statis IS 's2_pv_uv_statis';
CREATE TABLE IF NOT EXISTS `s2_stay_time_statis` (
`imp_date` varchar(200) NOT NULL,
`user_name` varchar(200) NOT NULL,
`stay_hours` DOUBLE NOT NULL,
`page` varchar(200) NOT NULL
);
COMMENT ON TABLE s2_stay_time_statis IS 's2_stay_time_statis_info';
CREATE TABLE IF NOT EXISTS `singer` (
`singer_name` varchar(200) NOT NULL,
`act_area` varchar(200) NOT NULL,
`song_name` varchar(200) NOT NULL,
`genre` varchar(200) NOT NULL,
`js_play_cnt` bigINT DEFAULT NULL,
`down_cnt` bigINT DEFAULT NULL,
`favor_cnt` bigINT DEFAULT NULL,
PRIMARY KEY (`singer_name`)
);
COMMENT ON TABLE singer IS 'singer_info';
CREATE TABLE IF NOT EXISTS `s2_dictionary_conf` (
`id` INT NOT NULL AUTO_INCREMENT,
`description` varchar(255) ,
`type` varchar(255) NOT NULL ,
`item_id` INT NOT NULL , -- task Request Parameters md5
`config` LONGVARCHAR , -- remark related information
`status` varchar(255) NOT NULL , -- the final status of the task
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
`created_by` varchar(100) NOT NULL ,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_dictionary_conf IS 'dictionary conf information table';
CREATE TABLE IF NOT EXISTS `s2_dictionary_task` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL , -- task name
`description` varchar(255) ,
`type` varchar(255) NOT NULL ,
`item_id` INT NOT NULL , -- task Request Parameters md5
`config` LONGVARCHAR , -- remark related information
`status` varchar(255) NOT NULL , -- the final status of the task
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
`created_by` varchar(100) NOT NULL ,
`elapsed_ms` bigINT DEFAULT NULL , -- the task takes time in milliseconds
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_dictionary_task IS 'dictionary task information table';
-- benchmark
CREATE TABLE IF NOT EXISTS `genre` (
`g_name` varchar(20) NOT NULL , -- genre name
`rating` INT ,
`most_popular_in` varchar(50) ,
PRIMARY KEY (`g_name`)
);
COMMENT ON TABLE genre IS 'genre';
CREATE TABLE IF NOT EXISTS `artist` (
`artist_name` varchar(50) NOT NULL , -- genre name
`citizenship` varchar(20) ,
`gender` varchar(20) ,
`g_name` varchar(50),
PRIMARY KEY (`artist_name`,`citizenship`)
);
COMMENT ON TABLE artist IS 'artist';
CREATE TABLE IF NOT EXISTS `files` (
`f_id` bigINT NOT NULL,
`artist_name` varchar(50) ,
`file_size` varchar(20) ,
`duration` varchar(20) ,
`formats` varchar(20) ,
PRIMARY KEY (`f_id`)
);
COMMENT ON TABLE files IS 'files';
CREATE TABLE IF NOT EXISTS `song` (
`imp_date` varchar(50) ,
`song_name` varchar(50) ,
`artist_name` varchar(50) ,
`country` varchar(20) ,
`f_id` bigINT ,
`g_name` varchar(20) ,
`rating` INT ,
`languages` varchar(20) ,
`releasedate` varchar(50) ,
`resolution` bigINT NOT NULL,
PRIMARY KEY (`imp_date`,`song_name`)
);
COMMENT ON TABLE song IS 'song';
CREATE TABLE IF NOT EXISTS `company` (
`imp_date` varchar(50) ,
`company_id` varchar(50) NOT NULL ,
`company_name` varchar(50) NOT NULL ,
`headquarter_address` varchar(50) NOT NULL ,
`company_established_time` varchar(20) NOT NULL ,
`founder` varchar(20) NOT NULL ,
`ceo` varchar(20) NOT NULL ,
`annual_turnover` bigint(15) ,
`employee_count` int(7) ,
PRIMARY KEY (`company_id`)
);
CREATE TABLE IF NOT EXISTS `brand` (
`imp_date` varchar(50) ,
`brand_id` varchar(50) NOT NULL ,
`brand_name` varchar(50) NOT NULL ,
`brand_established_time` varchar(20) NOT NULL ,
`company_id` varchar(50) NOT NULL ,
`legal_representative` varchar(20) NOT NULL ,
`registered_capital` bigint(15) ,
PRIMARY KEY (`brand_id`)
);
CREATE TABLE IF NOT EXISTS `company_revenue` (
`imp_date` varchar(50) ,
`company_id` varchar(50) NOT NULL ,
`brand_id` varchar(50) NOT NULL ,
`revenue_proportion` double NOT NULL,
`profit_proportion` double NOT NULL ,
`expenditure_proportion` double NOT NULL
);
CREATE TABLE IF NOT EXISTS `company_brand_revenue` (
`imp_date` varchar(50) ,
`year_time` varchar(10) NOT NULL ,
`brand_id` varchar(50) NOT NULL ,
`revenue` bigint(15) NOT NULL,
`profit` bigint(15) NOT NULL ,
`revenue_growth_year_on_year` double NOT NULL ,
`profit_growth_year_on_year` double NOT NULL
);
CREATE TABLE IF NOT EXISTS s2_system_config
(
id INT PRIMARY KEY AUTO_INCREMENT,
admin varchar(500),
parameters text null
);
CREATE TABLE IF NOT EXISTS `s2_collect` (
`id` bigint NOT NULL AUTO_INCREMENT,
`type` varchar(20) NOT NULL,
`username` varchar(20) NOT NULL,
`collect_id` bigint NOT NULL,
`create_time` TIMESTAMP,
`update_time` TIMESTAMP,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `s2_metric_query_default_config` (
`id` bigint NOT NULL AUTO_INCREMENT,
`metric_id` bigint ,
`user_name` varchar(255) NOT NULL,
`default_config` varchar(1000) NOT NULL,
`created_at` TIMESTAMP null,
`updated_at` TIMESTAMP null,
`created_by` varchar(100) null,
`updated_by` varchar(100) not null,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `s2_app` (
id bigint AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
description VARCHAR(255),
status INT,
config TEXT,
end_date TIMESTAMP,
qps INT,
app_secret VARCHAR(255),
owner VARCHAR(255),
created_at TIMESTAMP,
created_by VARCHAR(255),
updated_at TIMESTAMP,
updated_by VARCHAR(255)
);
CREATE TABLE IF NOT EXISTS `s2_data_set` (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
domain_id BIGINT,
`name` VARCHAR(255),
biz_name VARCHAR(255),
description VARCHAR(255),
status INT,
alias VARCHAR(255),
data_set_detail TEXT,
created_at TIMESTAMP,
created_by VARCHAR(255),
updated_at TIMESTAMP,
updated_by VARCHAR(255),
query_config VARCHAR(3000),
`admin` varchar(3000) DEFAULT NULL,
`admin_org` varchar(3000) DEFAULT NULL,
`query_type` varchar(100) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS `s2_tag` (
`id` INT NOT NULL AUTO_INCREMENT,
`item_id` INT NOT NULL ,
`type` varchar(50) NOT NULL , -- METRIC DIMENSION
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP DEFAULT NULL ,
`updated_by` varchar(100) DEFAULT NULL ,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_tag IS 'tag information';
CREATE TABLE IF NOT EXISTS `s2_tag_object` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`biz_name` varchar(255) NOT NULL ,
`description` varchar(500) DEFAULT NULL ,
`status` INT NOT NULL DEFAULT '1' ,
`sensitive_level` INT NOT NULL DEFAULT '1' ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP DEFAULT NULL ,
`updated_by` varchar(100) DEFAULT NULL ,
`ext` LONGVARCHAR DEFAULT NULL ,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_tag IS 'tag object information';
CREATE TABLE IF NOT EXISTS `s2_query_rule` (
`id` INT NOT NULL AUTO_INCREMENT,
`data_set_id` INT ,
`priority` INT NOT NULL DEFAULT '1' ,
`rule_type` varchar(255) NOT NULL ,
`name` varchar(255) NOT NULL ,
`biz_name` varchar(255) NOT NULL ,
`description` varchar(500) DEFAULT NULL ,
`rule` LONGVARCHAR DEFAULT NULL ,
`action` LONGVARCHAR DEFAULT NULL ,
`status` INT NOT NULL DEFAULT '1' ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP DEFAULT NULL ,
`updated_by` varchar(100) DEFAULT NULL ,
`ext` LONGVARCHAR DEFAULT NULL ,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_query_rule IS 'tag query rule table';
CREATE TABLE IF NOT EXISTS `s2_term` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT ,
`name` varchar(255) NOT NULL ,
`description` varchar(500) DEFAULT NULL ,
`alias` varchar(1000) NOT NULL ,
`related_metrics` varchar(1000) DEFAULT NULL ,
`related_dimensions` varchar(1000) DEFAULT NULL,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP DEFAULT NULL ,
`updated_by` varchar(100) DEFAULT NULL ,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_term IS 'term info';

View File

@@ -1,2 +1,2 @@
root=. root=.
CustomDictionaryPath=data/dictionary/custom/DimValue_1_1.txt;data/dictionary/custom/DimValue_1_2.txt;data/dictionary/custom/DimValue_1_3.txt; CustomDictionaryPath=data/dictionary/custom/DimValue_1_1.txt;data/dictionary/custom/DimValue_1_2.txt;data/dictionary/custom/DimValue_1_3.txt;data/dictionary/custom/DimValue_4_8.txt

View File

@@ -1,5 +1,4 @@
s2: s2:
schema: schema:
cache: cache:
enable: false enable: false
@@ -21,7 +20,7 @@ s2:
date: true date: true
demo: demo:
names: S2VisitsDemo,S2SingerDemo,S2CompanyDemo names: S2VisitsDemo, S2SingerDemo, S2CompanyDemo
enableLLM: false enableLLM: false
authentication: authentication:

View File

@@ -1,50 +0,0 @@
[
{
"question": "比较jackjchen和robinlee今年以来的访问次数",
"sideInfo": "CurrentDate=[2020-12-01],DomainTerms=[<核心用户 COMMENT '核心用户指tom和lucy'>]",
"dbSchema": "DatabaseType=[h2], Table=[超音数产品], PartitionTimeField=[数据日期 FORMAT 'yyyy-MM-dd'], Metrics=[<访问次数 ALIAS 'pv' COMMENT '一段时间内用户的访问次数' AGGREGATE 'SUM'>,<访问用户数 ALIAS 'UV,访问人数,' COMMENT '访问的用户个数' AGGREGATE 'COUNT'>,<人均访问次数 ALIAS '平均访问次数,' COMMENT '每个用户平均访问的次数'>], Dimensions=[<数据日期>], Values[<用户='jackjchen'>,<用户='robinlee'>]",
"sql": "SELECT 用户, 访问次数 FROM 超音数产品 WHERE 用户 IN ('jackjchen', 'robinlee') AND 数据日期 >= '2020-01-01' AND 数据日期 <= '2020-12-01'"
},
{
"question": "超音数近12个月访问人数 按部门",
"sideInfo": "CurrentDate=[2022-11-06]",
"dbSchema": "DatabaseType=[h2], Table=[超音数产品], PartitionTimeField=[数据日期 FORMAT 'yyyy-MM-dd'], Metrics=[<访问次数 ALIAS 'pv' COMMENT '一段时间内用户的访问次数' AGGREGATE 'SUM'>,<访问用户数 ALIAS 'UV,访问人数,' COMMENT '访问的用户个数' AGGREGATE 'COUNT'>,<人均访问次数 ALIAS '平均访问次数,' COMMENT '每个用户平均访问的次数'>], Dimensions=[<部门>,<数据日期>], Values=[]",
"sql": "SELECT 部门, 数据日期, 访问人数 FROM 超音数产品 WHERE 数据日期 >= '2021-11-06' AND 数据日期 <= '2022-11-06'"
},
{
"question": "超音数过去90天美术部、技术研发部的访问时长",
"sideInfo": "CurrentDate=[2023-04-21]",
"dbSchema": "DatabaseType=[h2], Table=[超音数产品], PartitionTimeField=[数据日期 FORMAT 'yyyy-MM-dd'], Metrics=[<访问时长 COMMENT '一段时间内用户的访问时长' AGGREGATE 'SUM'>], Dimensions=[<数据日期>], Values=[<部门='美术部'>,<部门='技术研发部'>]",
"sql": "SELECT 部门, 访问时长 FROM 超音数产品 WHERE 部门 IN ('美术部', '技术研发部') AND 数据日期 >= '2023-01-21' AND 数据日期 <= '2023-04-21'"
},
{
"question": "超音数访问时长小于1小时且来自美术部的用户是哪些",
"sideInfo": "CurrentDate=[2023-07-31],DomainTerms=[<核心用户 COMMENT '用户为tom和lucy'>]",
"dbSchema": "DatabaseType=[h2], Table:[超音数产品], PartitionTimeField=[数据日期 FORMAT 'yyyy-MM-dd'], Metrics:[<访问时长 COMMENT '一段时间内用户的访问时长' AGGREGATE 'SUM'>], Dimensions:[<用户>,<数据日期>], Values:[<部门='美术部'>]",
"sql": "SELECT 用户 FROM 超音数产品 WHERE 部门 = '美术部' AND 访问时长 < 1"
},
{
"question": "超音数本月pv最高的用户有哪些",
"sideInfo": "CurrentDate=[2023-08-31],DomainTerms=[<核心用户 COMMENT '用户为tom和lucy'>]",
"dbSchema": "DatabaseType=[h2], Table=[超音数产品], PartitionTimeField=[数据日期 FORMAT 'yyyy-MM-dd'], Metrics=[<访问次数 ALIAS 'pv' COMMENT '一段时间内用户的访问次数' AGGREGATE 'SUM'>], Dimensions=[<用户>,<数据日期>], Values=[]",
"sql": "SELECT 用户 FROM 超音数产品 WHERE 数据日期 >= '2023-08-01' AND 数据日期 <= '2023-08-31' ORDER BY 访问次数 DESC LIMIT 1"
},
{
"question": "超音数访问次数大于1k的部门是哪些",
"sideInfo": "CurrentDate=[2023-09-14]",
"dbSchema": "DatabaseType=[h2], Table=[超音数产品], PartitionTimeField=[数据日期 FORMAT 'yyyy-MM-dd'], Metrics=[<访问次数 ALIAS 'pv' COMMENT '一段时间内用户的访问次数' AGGREGATE 'SUM'>], Dimensions=[<部门>,<数据日期>], Values=[]",
"sql": "SELECT 部门 FROM 超音数产品 WHERE 访问次数 > 1000"
},
{
"question": "过去半个月核心用户的访问次数",
"sideInfo": "CurrentDate=[2023-09-15],DomainTerms=[<核心用户 COMMENT '用户为alice'>]",
"dbSchema": "DatabaseType=[h2], Table=[超音数产品], PartitionTimeField=[数据日期 FORMAT 'yyyy-MM-dd'], Metrics=[<访问次数 ALIAS 'pv' COMMENT '一段时间内用户的访问次数' AGGREGATE 'SUM'>], Dimensions=[<部门>,<数据日期>], Values=[]",
"sql": "SELECT 用户,SUM(访问次数) FROM 超音数产品 WHERE 用户='alice' AND 数据日期 >= '2023-09-01' AND 数据日期 <= '2023-09-15' GROUP BY 用户"
},
{
"question": "过去半个月忠实用户有哪一些",
"sideInfo": "CurrentDate=[2023-09-15],DomainTerms=[<忠实用户 COMMENT '一段时间内总访问次数大于100的用户'>]",
"dbSchema": "DatabaseType=[h2], Table=[超音数产品], PartitionTimeField=[数据日期 FORMAT 'yyyy-MM-dd'], Metrics=[<访问次数 ALIAS 'pv' COMMENT '一段时间内用户的访问次数' AGGREGATE 'SUM'>], Dimensions=[<用户>,<数据日期>], Values=[]",
"sql": "SELECT 用户 FROM 超音数产品 WHERE 数据日期 >= '2023-09-01' AND 数据日期 <= '2023-09-15' GROUP BY 用户 HAVING SUM(访问次数) > 100"
}
]