diff --git a/CHANGELOG.md b/CHANGELOG.md index a83be5058..b33b6a7f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,17 @@ - "Breaking Changes" describes any changes that may break existing functionality or cause compatibility issues with previous versions. +## SuperSonic [0.7.3] - 2023-08-29 +### Added +- meet checkstyle code requirements +- save parseInfo after parsing +- add time statistics +- add agent + +### Updated +- dsl where condition is used for front-end display +- dsl remove context inheritance ## SuperSonic [0.7.2] - 2023-08-12 diff --git a/assembly/bin/build-chat.sh b/assembly/bin/build-chat.sh index 6305f9d8a..e00ab2fa9 100755 --- a/assembly/bin/build-chat.sh +++ b/assembly/bin/build-chat.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash sbinDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$sbinDir/.." && pwd -P) +baseDir=$(readlink -f $sbinDir/../) runtimeDir=$baseDir/runtime buildDir=$baseDir/build diff --git a/assembly/bin/build-ide.sh b/assembly/bin/build-ide.sh index 87bfda75e..b2bcd0ca3 100755 --- a/assembly/bin/build-ide.sh +++ b/assembly/bin/build-ide.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash sbinDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$sbinDir/.." && pwd -P) +baseDir=$(readlink -f $sbinDir/../) buildDir=$baseDir/build cd $baseDir/bin diff --git a/assembly/bin/build-semantic.sh b/assembly/bin/build-semantic.sh index 1c969081b..5eefb3845 100755 --- a/assembly/bin/build-semantic.sh +++ b/assembly/bin/build-semantic.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash sbinDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$sbinDir/.." && pwd -P) +baseDir=$(readlink -f $sbinDir/../) runtimeDir=$baseDir/runtime buildDir=$baseDir/build diff --git a/assembly/bin/build-standalone.sh b/assembly/bin/build-standalone.sh index b14435eca..efa2324e8 100755 --- a/assembly/bin/build-standalone.sh +++ b/assembly/bin/build-standalone.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash sbinDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$sbinDir/.." && pwd -P) +baseDir=$(readlink -f $sbinDir/../) runtimeDir=$baseDir/runtime buildDir=$baseDir/build diff --git a/assembly/bin/start-chat.sh b/assembly/bin/start-chat.sh index 0ee1435fe..87e1920b4 100755 --- a/assembly/bin/start-chat.sh +++ b/assembly/bin/start-chat.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash sbinDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$sbinDir/.." && pwd -P) +baseDir=$(readlink -f $sbinDir/../) runtimeDir=$baseDir/../runtime buildDir=$baseDir/build diff --git a/assembly/bin/start-semantic.sh b/assembly/bin/start-semantic.sh index 0175de675..1c070b83b 100755 --- a/assembly/bin/start-semantic.sh +++ b/assembly/bin/start-semantic.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash sbinDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$sbinDir/.." && pwd -P) +baseDir=$(readlink -f $sbinDir/../) runtimeDir=$baseDir/../runtime buildDir=$baseDir/build diff --git a/assembly/bin/start-standalone.sh b/assembly/bin/start-standalone.sh index 3cb9aff0f..80fb3099d 100755 --- a/assembly/bin/start-standalone.sh +++ b/assembly/bin/start-standalone.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash sbinDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$sbinDir/.." && pwd -P) +baseDir=$(readlink -f $sbinDir/../) runtimeDir=$baseDir/../runtime buildDir=$baseDir/build @@ -29,4 +29,4 @@ rm -fr ${buildDir}/supersonic-webapp #start standalone service sh ${runtimeDir}/supersonic-standalone/bin/service.sh restart #start llm service -sh ${runtimeDir}/supersonic-standalone/llm/bin/service.sh restart +sh ${runtimeDir}/supersonic-standalone/llm/bin/service.sh restart \ No newline at end of file diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/service/AuthService.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/service/AuthService.java index 60415954f..184ffeba0 100644 --- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/service/AuthService.java +++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/service/AuthService.java @@ -5,7 +5,7 @@ import com.tencent.supersonic.auth.api.authorization.pojo.AuthGroup; import com.tencent.supersonic.auth.api.authorization.request.QueryAuthResReq; import com.tencent.supersonic.auth.api.authorization.response.AuthorizedResourceResp; import java.util.List; -import javax.servlet.http.HttpServletRequest; + public interface AuthService { diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/persistence/repository/Impl/UserRepositoryImpl.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/persistence/repository/Impl/UserRepositoryImpl.java index 520e2c71f..00f6643e5 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/persistence/repository/Impl/UserRepositoryImpl.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/persistence/repository/Impl/UserRepositoryImpl.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.auth.authentication.persistence.repository.Impl; +package com.tencent.supersonic.auth.authentication.persistence.repository.impl; import com.tencent.supersonic.auth.authentication.persistence.dataobject.UserDO; diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/rest/UserController.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/rest/UserController.java index 1eabf48e6..123818553 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/rest/UserController.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/rest/UserController.java @@ -11,12 +11,12 @@ import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.PathVariable; @RestController @RequestMapping("/api/auth/user") diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/utils/UserTokenUtils.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/utils/UserTokenUtils.java index 4c55a84b1..c8749ad43 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/utils/UserTokenUtils.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/utils/UserTokenUtils.java @@ -9,7 +9,6 @@ import static com.tencent.supersonic.auth.api.authentication.constant.UserConsta import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_ID; import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_NAME; import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_PASSWORD; - import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.UserWithPassword; @@ -22,9 +21,11 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +@Slf4j @Component public class UserTokenUtils { @@ -68,7 +69,9 @@ public class UserTokenUtils { public UserWithPassword getUserWithPassword(HttpServletRequest request) { String token = request.getHeader(authenticationConfig.getTokenHttpHeaderKey()); if (StringUtils.isBlank(token)) { - throw new AccessException("token is blank, get user failed"); + String message = "token is blank, get user failed"; + log.warn("{}, uri: {}", message, request.getServletPath()); + throw new AccessException(message); } final Claims claims = getClaims(token); Long userId = Long.parseLong(claims.getOrDefault(TOKEN_USER_ID, 0).toString()); diff --git a/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/application/AuthServiceImpl.java b/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/application/AuthServiceImpl.java index 2f5cda273..9053a8229 100644 --- a/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/application/AuthServiceImpl.java +++ b/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/application/AuthServiceImpl.java @@ -12,13 +12,16 @@ import com.tencent.supersonic.auth.api.authorization.response.AuthorizedResource import com.tencent.supersonic.auth.api.authorization.service.AuthService; import com.tencent.supersonic.auth.api.authorization.pojo.AuthGroup; import com.tencent.supersonic.auth.api.authorization.pojo.AuthRule; -import com.tencent.supersonic.common.util.S2ThreadContext; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import java.util.*; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.Map; +import java.util.ArrayList; import java.util.stream.Collectors; @Service diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/DSLOptimizer.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticCorrector.java similarity index 56% rename from chat/api/src/main/java/com/tencent/supersonic/chat/api/component/DSLOptimizer.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticCorrector.java index 2ad042f6b..e228d1af3 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/DSLOptimizer.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticCorrector.java @@ -3,7 +3,7 @@ package com.tencent.supersonic.chat.api.component; import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; import net.sf.jsqlparser.JSQLParserException; -public interface DSLOptimizer { - CorrectionInfo rewriter(CorrectionInfo correctionInfo) throws JSQLParserException; +public interface SemanticCorrector { + CorrectionInfo corrector(CorrectionInfo correctionInfo) throws JSQLParserException; } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java index 4fc92178d..fb931fdff 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java @@ -6,14 +6,15 @@ import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; -import com.tencent.supersonic.semantic.api.model.response.DimensionResp; import com.tencent.supersonic.semantic.api.model.response.DomainResp; -import com.tencent.supersonic.semantic.api.model.response.MetricResp; +import com.tencent.supersonic.semantic.api.model.response.DimensionResp; import com.tencent.supersonic.semantic.api.model.response.ModelResp; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; import com.tencent.supersonic.semantic.api.query.request.QueryDslReq; import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; + import java.util.List; /** @@ -31,22 +32,13 @@ import java.util.List; public interface SemanticLayer { QueryResultWithSchemaResp queryByStruct(QueryStructReq queryStructReq, User user); - QueryResultWithSchemaResp queryByMultiStruct(QueryMultiStructReq queryMultiStructReq, User user); - QueryResultWithSchemaResp queryByDsl(QueryDslReq queryDslReq, User user); - List getModelSchema(); - List getModelSchema(List ids); - ModelSchema getModelSchema(Long model, Boolean cacheEnable); - PageInfo getDimensionPage(PageDimensionReq pageDimensionCmd); - PageInfo getMetricPage(PageMetricReq pageMetricCmd); - List getDomainList(User user); - List getModelList(AuthType authType, Long domainId, User user); } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ChatContext.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ChatContext.java index 254ff7c65..aa0cdf088 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ChatContext.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ChatContext.java @@ -6,6 +6,7 @@ import lombok.Data; public class ChatContext { private Integer chatId; + private Integer agentId; private String queryText; private SemanticParseInfo parseInfo = new SemanticParseInfo(); private String user; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ModelSchema.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ModelSchema.java index c190561a8..d365ace86 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ModelSchema.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ModelSchema.java @@ -32,6 +32,7 @@ public class ModelSchema { break; case VALUE: element = dimensionValues.stream().filter(e -> e.getId() == elementID).findFirst(); + break; default: } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElement.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElement.java index d583fe30b..c260416cd 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElement.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElement.java @@ -1,18 +1,19 @@ package com.tencent.supersonic.chat.api.pojo; import com.google.common.base.Objects; + import java.io.Serializable; import java.util.List; -import lombok.Builder; + import lombok.Data; import lombok.Getter; +import lombok.Builder; import lombok.NoArgsConstructor; @Data @Getter @Builder @NoArgsConstructor -//@AllArgsConstructor public class SchemaElement implements Serializable { private Long model; @@ -23,11 +24,8 @@ public class SchemaElement implements Serializable { private SchemaElementType type; private List alias; -// public SchemaElement() { -// } - public SchemaElement(Long model, Long id, String name, String bizName, - Long useCnt, SchemaElementType type, List alias) { + Long useCnt, SchemaElementType type, List alias) { this.model = model; this.id = id; this.name = name; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticParseInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticParseInfo.java index d11ae10d1..671aa91a4 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticParseInfo.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticParseInfo.java @@ -1,23 +1,26 @@ package com.tencent.supersonic.chat.api.pojo; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; +import java.util.LinkedHashSet; +import java.util.ArrayList; +import java.util.Map; +import java.util.HashMap; +import java.util.Comparator; + import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.Order; import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; import lombok.Data; @Data public class SemanticParseInfo { + private Integer id; private String queryMode; private SchemaElement model; private Set metrics = new TreeSet<>(new SchemaNameLengthComparator()); @@ -33,7 +36,7 @@ public class SemanticParseInfo { private double score; private List elementMatches = new ArrayList<>(); private Map properties = new HashMap<>(); - + private EntityInfo entityInfo; public Long getModelId() { return model != null ? model.getId() : 0L; } @@ -43,7 +46,6 @@ public class SemanticParseInfo { } private static class SchemaNameLengthComparator implements Comparator { - @Override public int compare(SchemaElement o1, SchemaElement o2) { int len1 = o1.getName().length(); diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ExecuteQueryReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ExecuteQueryReq.java index 51ce237a2..061dc4c5e 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ExecuteQueryReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ExecuteQueryReq.java @@ -9,8 +9,11 @@ import lombok.Data; public class ExecuteQueryReq { private User user; + private Integer agentId; private Integer chatId; private String queryText; + private Long queryId; + private Integer parseId; private SemanticParseInfo parseInfo; private boolean saveAnswer = true; } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/AggregateInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/AggregateInfo.java index 57acac1f6..aebbeb1b0 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/AggregateInfo.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/AggregateInfo.java @@ -6,6 +6,5 @@ import lombok.Data; @Data public class AggregateInfo { - private List metricInfos = new ArrayList<>(); } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ParseResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ParseResp.java index e096199cc..e8fc10db8 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ParseResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ParseResp.java @@ -1,12 +1,13 @@ package com.tencent.supersonic.chat.api.pojo.response; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.Getter; +import lombok.Builder; import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; + +import java.util.List; @Data @Getter @@ -14,9 +15,9 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class ParseResp { - private Integer chatId; private String queryText; + private Long queryId; private ParseState state; private List selectedParses; private List candidateParses; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResp.java index 72abbed20..5a1fae483 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResp.java @@ -3,6 +3,7 @@ package com.tencent.supersonic.chat.api.pojo.response; import java.util.List; import lombok.Data; + @Data public class SearchResp { diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ShowCaseResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ShowCaseResp.java new file mode 100644 index 000000000..9b386e3c5 --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ShowCaseResp.java @@ -0,0 +1,18 @@ +package com.tencent.supersonic.chat.api.pojo.response; + + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class ShowCaseResp { + + private Map> showCaseMap; + + private int pageSize; + + private int current; + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/agent/Agent.java b/chat/core/src/main/java/com/tencent/supersonic/chat/agent/Agent.java index f8cc93925..a747b53b8 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/agent/Agent.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/agent/Agent.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.tencent.supersonic.chat.agent.tool.AgentToolType; import com.tencent.supersonic.common.pojo.RecordInfo; +import java.util.Objects; import lombok.Data; import org.springframework.util.CollectionUtils; import java.util.List; @@ -23,7 +24,6 @@ public class Agent extends RecordInfo { private Integer status; private List examples; private String agentConfig; - public List getTools(AgentToolType type) { Map map = JSONObject.parseObject(agentConfig, Map.class); if (CollectionUtils.isEmpty(map) || map.get("tools") == null) { @@ -31,7 +31,13 @@ public class Agent extends RecordInfo { } List toolList = (List) map.get("tools"); return toolList.stream() - .filter(tool -> type.name().equals(tool.get("type"))) + .filter(tool -> { + if (Objects.isNull(type)) { + return true; + } + return type.name().equals(tool.get("type")); + } + ) .map(JSONObject::toJSONString) .collect(Collectors.toList()); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/agent/tool/AgentTool.java b/chat/core/src/main/java/com/tencent/supersonic/chat/agent/tool/AgentTool.java index de51051c3..126e89245 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/agent/tool/AgentTool.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/agent/tool/AgentTool.java @@ -1,12 +1,9 @@ package com.tencent.supersonic.chat.agent.tool; - import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; - @Data @NoArgsConstructor @AllArgsConstructor diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/agent/tool/RuleQueryTool.java b/chat/core/src/main/java/com/tencent/supersonic/chat/agent/tool/RuleQueryTool.java index 63e8bdd49..0da793120 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/agent/tool/RuleQueryTool.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/agent/tool/RuleQueryTool.java @@ -2,12 +2,19 @@ package com.tencent.supersonic.chat.agent.tool; import lombok.Data; +import org.apache.commons.collections.CollectionUtils; import java.util.List; @Data public class RuleQueryTool extends AgentTool { + private List modelIds; + private List queryModes; + public boolean isContainsAllModel() { + return CollectionUtils.isNotEmpty(modelIds) && modelIds.contains(-1L); + } + } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/aspect/TimeCostAspect.java b/chat/core/src/main/java/com/tencent/supersonic/chat/aspect/TimeCostAspect.java new file mode 100644 index 000000000..7d4e0de0b --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/aspect/TimeCostAspect.java @@ -0,0 +1,99 @@ +/* +//package com.tencent.supersonic.chat.aspect; +// +//import lombok.extern.slf4j.Slf4j; +//import org.aspectj.lang.JoinPoint; +//import org.aspectj.lang.ProceedingJoinPoint; +//import org.aspectj.lang.annotation.*; +//import org.springframework.stereotype.Component; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Aspect +//@Component +//@Slf4j +//public class TimeCostAspect { +// +// ThreadLocal startTime = new ThreadLocal<>(); +// +// ThreadLocal> map = new ThreadLocal<>(); +// +// @Pointcut("execution(public * com.tencent.supersonic.chat.mapper.HanlpDictMapper.*(*))") +// //@Pointcut("execution(* public com.tencent.supersonic.chat.parser.*.*(..))") +// //@Pointcut("execution(* com.tencent.supersonic.chat.mapper.*Mapper.map(..)) ") +// //@Pointcut("execution(* com.tencent.supersonic.chat.mapper.HanlpDictMapper.map(..)) ") +// //@Pointcut("execution(* com.tencent.supersonic.chat.parser.rule.QueryModeParser.*(..)) ") +// public void point() { +// } +// +// @Around("point()") +// public void doAround(ProceedingJoinPoint joinPoint) throws Throwable { +// long start = System.currentTimeMillis(); +// try { +// log.info("切面开始"); +// Object result = joinPoint.proceed(); +// log.info("切面开始"); +// if (result == null) { +// //如果切到了 没有返回类型的void方法,这里直接返回 +// //return null; +// } +// long end = System.currentTimeMillis(); +// log.info("==================="); +// String targetClassName = joinPoint.getSignature().getDeclaringTypeName(); +// String MethodName = joinPoint.getSignature().getName(); +// String typeStr = joinPoint.getSignature().getDeclaringType().toString().split(" ")[0]; +// log.info("类/接口:" + targetClassName + "(" + typeStr + ")"); +// log.info("方法:" + MethodName); +// Long total = end - start; +// log.info("耗时: " + total + " ms!"); +// map.get().put(targetClassName + "_" + MethodName, total); +// //return result; +// } catch (Throwable e) { +// long end = System.currentTimeMillis(); +// log.info("====around " + joinPoint + "\tUse time : " + (end - start) + " ms with exception : " +// + e.getMessage()); +// throw e; +// } +// } +// +//// //对Controller下面的方法执行前进行切入,初始化开始时间 +//// @Before(value = "execution(* com.appleyk.controller.*.*(..))") +//// public void beforMehhod(JoinPoint jp) { +//// startTime.set(System.currentTimeMillis()); +//// } +//// +//// //对Controller下面的方法执行后进行切入,统计方法执行的次数和耗时情况 +//// //注意,这里的执行方法统计的数据不止包含Controller下面的方法,也包括环绕切入的所有方法的统计信息 +//// @AfterReturning(value = "execution(* com.appleyk.controller.*.*(..))") +//// public void afterMehhod(JoinPoint jp) { +//// long end = System.currentTimeMillis(); +//// long total = end - startTime.get(); +//// String methodName = jp.getSignature().getName(); +//// log.info("连接点方法为:" + methodName + ",执行总耗时为:" +total+"ms"); +//// +//// //重新new一个map +//// Map map = new HashMap<>(); +//////从map2中将最后的 连接点方法给移除了,替换成最终的,避免连接点方法多次进行叠加计算 +//// //由于map2受ThreadLocal的保护,这里不支持remove,因此,需要单开一个map进行数据交接 +//// for(Map.Entry entry:map2.get().entrySet()){ +//// if(entry.getKey().equals(methodName)){ +//// map.put(methodName, total); +//// +//// }else{ +//// map.put(entry.getKey(), entry.getValue()); +//// } +//// } +//// +//// for (Map.Entry entry :map1.get().entrySet()) { +//// for(Map.Entry entry2 :map.entrySet()){ +//// if(entry.getKey().equals(entry2.getKey())){ +//// System.err.println(entry.getKey()+",被调用次数:"+entry.getValue()+",综合耗时:"+entry2.getValue()+"ms"); +//// } +//// } +//// +//// } +//// } +// +//} +*/ diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/AggregatorConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/AggregatorConfig.java index 3fabb66e1..30733e6cc 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/config/AggregatorConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/AggregatorConfig.java @@ -3,11 +3,9 @@ package com.tencent.supersonic.chat.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; - -@Configuration @Data +@Configuration public class AggregatorConfig { - @Value("${metric.aggregator.ratio.enable:true}") private Boolean enableRatio; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/BaseDSLOptimizer.java b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/BaseSemanticCorrector.java similarity index 86% rename from chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/BaseDSLOptimizer.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/corrector/BaseSemanticCorrector.java index 72810d7c6..9b4e80e41 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/BaseDSLOptimizer.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/BaseSemanticCorrector.java @@ -1,6 +1,6 @@ -package com.tencent.supersonic.chat.query.dsl.optimizer; +package com.tencent.supersonic.chat.corrector; -import com.tencent.supersonic.chat.api.component.DSLOptimizer; +import com.tencent.supersonic.chat.api.component.SemanticCorrector; import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.SemanticSchema; import com.tencent.supersonic.common.util.ContextUtils; @@ -13,7 +13,7 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; @Slf4j -public abstract class BaseDSLOptimizer implements DSLOptimizer { +public abstract class BaseSemanticCorrector implements SemanticCorrector { public static final String DATE_FIELD = "数据日期"; protected Map getFieldToBizName(Long modelId) { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/DateFieldCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/DateFieldCorrector.java similarity index 52% rename from chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/DateFieldCorrector.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/corrector/DateFieldCorrector.java index 14ce36d23..5273579cd 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/DateFieldCorrector.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/DateFieldCorrector.java @@ -1,23 +1,24 @@ -package com.tencent.supersonic.chat.query.dsl.optimizer; +package com.tencent.supersonic.chat.corrector; import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; import com.tencent.supersonic.chat.parser.llm.dsl.DSLDateHelper; -import com.tencent.supersonic.common.util.jsqlparser.CCJSqlParserUtils; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserUpdateHelper; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; @Slf4j -public class DateFieldCorrector extends BaseDSLOptimizer { +public class DateFieldCorrector extends BaseSemanticCorrector { @Override - public CorrectionInfo rewriter(CorrectionInfo correctionInfo) { + public CorrectionInfo corrector(CorrectionInfo correctionInfo) { String sql = correctionInfo.getSql(); - List whereFields = CCJSqlParserUtils.getWhereFields(sql); - if (CollectionUtils.isEmpty(whereFields) || !whereFields.contains(BaseDSLOptimizer.DATE_FIELD)) { + List whereFields = SqlParserSelectHelper.getWhereFields(sql); + if (CollectionUtils.isEmpty(whereFields) || !whereFields.contains(DATE_FIELD)) { String currentDate = DSLDateHelper.getCurrentDate(correctionInfo.getParseInfo().getModelId()); - sql = CCJSqlParserUtils.addWhere(sql, BaseDSLOptimizer.DATE_FIELD, currentDate); + sql = SqlParserUpdateHelper.addWhere(sql, DATE_FIELD, currentDate); } correctionInfo.setSql(sql); return correctionInfo; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/FieldCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/FieldCorrector.java new file mode 100644 index 000000000..648f78564 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/FieldCorrector.java @@ -0,0 +1,17 @@ +package com.tencent.supersonic.chat.corrector; + +import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserUpdateHelper; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class FieldCorrector extends BaseSemanticCorrector { + + @Override + public CorrectionInfo corrector(CorrectionInfo correctionInfo) { + String replaceFields = SqlParserUpdateHelper.replaceFields(correctionInfo.getSql(), + getFieldToBizName(correctionInfo.getParseInfo().getModelId())); + correctionInfo.setSql(replaceFields); + return correctionInfo; + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/FieldValueCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/FieldValueCorrector.java new file mode 100644 index 000000000..f450cffb5 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/FieldValueCorrector.java @@ -0,0 +1,48 @@ +package com.tencent.supersonic.chat.corrector; + +import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; +import com.tencent.supersonic.chat.parser.llm.dsl.DSLParseResult; +import com.tencent.supersonic.chat.query.llm.dsl.LLMReq; +import com.tencent.supersonic.chat.query.llm.dsl.LLMReq.ElementValue; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserUpdateHelper; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +@Slf4j +public class FieldValueCorrector extends BaseSemanticCorrector { + + @Override + public CorrectionInfo corrector(CorrectionInfo correctionInfo) { + + Object context = correctionInfo.getParseInfo().getProperties().get(Constants.CONTEXT); + if (Objects.isNull(context)) { + return correctionInfo; + } + + DSLParseResult dslParseResult = JsonUtil.toObject(JsonUtil.toString(context), DSLParseResult.class); + if (Objects.isNull(dslParseResult) || Objects.isNull(dslParseResult.getLlmReq())) { + return correctionInfo; + } + LLMReq llmReq = dslParseResult.getLlmReq(); + List linking = llmReq.getLinking(); + if (CollectionUtils.isEmpty(linking)) { + return correctionInfo; + } + + Map> fieldValueToFieldNames = linking.stream().collect( + Collectors.groupingBy(ElementValue::getFieldValue, + Collectors.mapping(ElementValue::getFieldName, Collectors.toSet()))); + + String sql = SqlParserUpdateHelper.replaceValueFields(correctionInfo.getSql(), fieldValueToFieldNames); + correctionInfo.setSql(sql); + return correctionInfo; + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/FunctionCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/FunctionCorrector.java new file mode 100644 index 000000000..13cffe5c2 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/FunctionCorrector.java @@ -0,0 +1,16 @@ +package com.tencent.supersonic.chat.corrector; + +import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserUpdateHelper; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class FunctionCorrector extends BaseSemanticCorrector { + + @Override + public CorrectionInfo corrector(CorrectionInfo correctionInfo) { + String replaceFunction = SqlParserUpdateHelper.replaceFunction(correctionInfo.getSql()); + correctionInfo.setSql(replaceFunction); + return correctionInfo; + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/QueryFilterAppend.java b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/QueryFilterAppend.java similarity index 83% rename from chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/QueryFilterAppend.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/corrector/QueryFilterAppend.java index 6e6806b47..b7d843fb7 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/QueryFilterAppend.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/QueryFilterAppend.java @@ -1,10 +1,10 @@ -package com.tencent.supersonic.chat.query.dsl.optimizer; +package com.tencent.supersonic.chat.corrector; import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.util.StringUtil; -import com.tencent.supersonic.common.util.jsqlparser.CCJSqlParserUtils; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserUpdateHelper; import java.util.Objects; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; @@ -15,17 +15,17 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @Slf4j -public class QueryFilterAppend extends BaseDSLOptimizer { +public class QueryFilterAppend extends BaseSemanticCorrector { @Override - public CorrectionInfo rewriter(CorrectionInfo correctionInfo) throws JSQLParserException { + public CorrectionInfo corrector(CorrectionInfo correctionInfo) throws JSQLParserException { String queryFilter = getQueryFilter(correctionInfo.getQueryFilters()); String sql = correctionInfo.getSql(); if (StringUtils.isNotEmpty(queryFilter)) { log.info("add queryFilter to sql :{}", queryFilter); Expression expression = CCJSqlParserUtil.parseCondExpression(queryFilter); - sql = CCJSqlParserUtils.addWhere(sql, expression); + sql = SqlParserUpdateHelper.addWhere(sql, expression); } correctionInfo.setSql(sql); return correctionInfo; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/SelectFieldAppendCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/SelectFieldAppendCorrector.java similarity index 52% rename from chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/SelectFieldAppendCorrector.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/corrector/SelectFieldAppendCorrector.java index 33e1e96c9..6098ab4aa 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/SelectFieldAppendCorrector.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/SelectFieldAppendCorrector.java @@ -1,7 +1,8 @@ -package com.tencent.supersonic.chat.query.dsl.optimizer; +package com.tencent.supersonic.chat.corrector; import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; -import com.tencent.supersonic.common.util.jsqlparser.CCJSqlParserUtils; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserUpdateHelper; import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; import java.util.ArrayList; import java.util.HashSet; @@ -10,25 +11,28 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; @Slf4j -public class SelectFieldAppendCorrector extends BaseDSLOptimizer { +public class SelectFieldAppendCorrector extends BaseSemanticCorrector { @Override - public CorrectionInfo rewriter(CorrectionInfo correctionInfo) { + public CorrectionInfo corrector(CorrectionInfo correctionInfo) { String sql = correctionInfo.getSql(); - if (CCJSqlParserUtils.hasAggregateFunction(sql)) { + if (SqlParserSelectHelper.hasAggregateFunction(sql)) { return correctionInfo; } - Set selectFields = new HashSet<>(CCJSqlParserUtils.getSelectFields(sql)); - Set whereFields = new HashSet<>(CCJSqlParserUtils.getWhereFields(sql)); + Set selectFields = new HashSet<>(SqlParserSelectHelper.getSelectFields(sql)); + Set whereFields = new HashSet<>(SqlParserSelectHelper.getWhereFields(sql)); + if (CollectionUtils.isEmpty(selectFields) || CollectionUtils.isEmpty(whereFields)) { return correctionInfo; } + whereFields.addAll(SqlParserSelectHelper.getOrderByFields(sql)); whereFields.removeAll(selectFields); whereFields.remove(TimeDimensionEnum.DAY.getName()); whereFields.remove(TimeDimensionEnum.WEEK.getName()); whereFields.remove(TimeDimensionEnum.MONTH.getName()); - String replaceFields = CCJSqlParserUtils.addFieldsToSelect(sql, new ArrayList<>(whereFields)); + + String replaceFields = SqlParserUpdateHelper.addFieldsToSelect(sql, new ArrayList<>(whereFields)); correctionInfo.setSql(replaceFields); return correctionInfo; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/TableNameCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/TableNameCorrector.java similarity index 51% rename from chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/TableNameCorrector.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/corrector/TableNameCorrector.java index 1604e4b9c..8d5b907c5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/TableNameCorrector.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/TableNameCorrector.java @@ -1,19 +1,19 @@ -package com.tencent.supersonic.chat.query.dsl.optimizer; +package com.tencent.supersonic.chat.corrector; import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; -import com.tencent.supersonic.common.util.jsqlparser.CCJSqlParserUtils; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserUpdateHelper; import lombok.extern.slf4j.Slf4j; @Slf4j -public class TableNameCorrector extends BaseDSLOptimizer { +public class TableNameCorrector extends BaseSemanticCorrector { public static final String TABLE_PREFIX = "t_"; @Override - public CorrectionInfo rewriter(CorrectionInfo correctionInfo) { + public CorrectionInfo corrector(CorrectionInfo correctionInfo) { Long modelId = correctionInfo.getParseInfo().getModelId(); String sqlOutput = correctionInfo.getSql(); - String replaceTable = CCJSqlParserUtils.replaceTable(sqlOutput, TABLE_PREFIX + modelId); + String replaceTable = SqlParserUpdateHelper.replaceTable(sqlOutput, TABLE_PREFIX + modelId); correctionInfo.setSql(replaceTable); return correctionInfo; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/EntityMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/EntityMapper.java index 388b76212..f5c60bb1d 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/EntityMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/EntityMapper.java @@ -2,19 +2,19 @@ package com.tencent.supersonic.chat.mapper; import com.tencent.supersonic.chat.api.component.SchemaMapper; -import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.QueryContext; -import com.tencent.supersonic.chat.api.pojo.SchemaElement; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.service.SemanticService; import com.tencent.supersonic.common.util.ContextUtils; -import java.util.List; -import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.util.CollectionUtils; +import java.util.List; +import java.util.stream.Collectors; @Slf4j @@ -33,7 +33,7 @@ public class EntityMapper implements SchemaMapper { continue; } List valueSchemaElements = schemaElementMatchList.stream().filter(schemaElementMatch -> - SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())) + SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())) .collect(Collectors.toList()); for (SchemaElementMatch schemaElementMatch : valueSchemaElements) { if (!entity.getId().equals(schemaElementMatch.getElement().getId())) { @@ -51,7 +51,7 @@ public class EntityMapper implements SchemaMapper { } private boolean checkExistSameEntitySchemaElements(SchemaElementMatch valueSchemaElementMatch, - List schemaElementMatchList) { + List schemaElementMatchList) { List entitySchemaElements = schemaElementMatchList.stream().filter(schemaElementMatch -> SchemaElementType.ENTITY.equals(schemaElementMatch.getElement().getType())) .collect(Collectors.toList()); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/FuzzyNameMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/FuzzyNameMapper.java index 0dc646005..c3b5af4d9 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/FuzzyNameMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/FuzzyNameMapper.java @@ -2,12 +2,12 @@ package com.tencent.supersonic.chat.mapper; import com.hankcs.hanlp.seg.common.Term; import com.tencent.supersonic.chat.api.component.SchemaMapper; -import com.tencent.supersonic.chat.api.pojo.QueryContext; -import com.tencent.supersonic.chat.api.pojo.SchemaElement; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.chat.api.pojo.SemanticSchema; +import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.knowledge.service.SchemaService; import com.tencent.supersonic.knowledge.utils.HanlpHelper; @@ -43,13 +43,13 @@ public class FuzzyNameMapper implements SchemaMapper { log.debug("after db mapper,mapInfo:{}", queryContext.getMapInfo()); } - private void detectAndAddToSchema(QueryContext queryContext, List terms, List Models, + private void detectAndAddToSchema(QueryContext queryContext, List terms, List models, SchemaElementType schemaElementType) { try { - Map> ModelResultSet = getResultSet(queryContext, terms, Models); + Map> modelResultSet = getResultSet(queryContext, terms, models); - addToSchemaMapInfo(ModelResultSet, queryContext.getMapInfo(), schemaElementType); + addToSchemaMapInfo(modelResultSet, queryContext.getMapInfo(), schemaElementType); } catch (Exception e) { log.error("detectAndAddToSchema error", e); @@ -57,20 +57,21 @@ public class FuzzyNameMapper implements SchemaMapper { } private Map> getResultSet(QueryContext queryContext, List terms, - List Models) { + List models) { String queryText = queryContext.getRequest().getQueryText(); MapperHelper mapperHelper = ContextUtils.getBean(MapperHelper.class); + Set modelIds = mapperHelper.getModelIds(queryContext.getRequest()); Double metricDimensionThresholdConfig = getThreshold(queryContext, mapperHelper); - Map> nameToItems = getNameToItems(Models); + Map> nameToItems = getNameToItems(models); Map regOffsetToLength = terms.stream().sorted(Comparator.comparing(Term::length)) .collect(Collectors.toMap(Term::getOffset, term -> term.word.length(), (value1, value2) -> value2)); - Map> ModelResultSet = new HashMap<>(); + Map> modelResultSet = new HashMap<>(); for (Integer startIndex = 0; startIndex <= queryText.length() - 1; ) { for (Integer endIndex = startIndex; endIndex <= queryText.length(); ) { endIndex = mapperHelper.getStepIndex(regOffsetToLength, endIndex); @@ -86,8 +87,12 @@ public class FuzzyNameMapper implements SchemaMapper { || mapperHelper.getSimilarity(detectSegment, name) < metricDimensionThresholdConfig) { continue; } - Set preSchemaElements = ModelResultSet.putIfAbsent(detectSegment, - schemaElements); + if (!CollectionUtils.isEmpty(modelIds)) { + schemaElements = schemaElements.stream() + .filter(schemaElement -> modelIds.contains(schemaElement.getModel())) + .collect(Collectors.toSet()); + } + Set preSchemaElements = modelResultSet.putIfAbsent(detectSegment, schemaElements); if (Objects.nonNull(preSchemaElements)) { preSchemaElements.addAll(schemaElements); } @@ -95,7 +100,7 @@ public class FuzzyNameMapper implements SchemaMapper { } startIndex = mapperHelper.getStepIndex(regOffsetToLength, startIndex); } - return ModelResultSet; + return modelResultSet; } private Double getThreshold(QueryContext queryContext, MapperHelper mapperHelper) { @@ -103,9 +108,9 @@ public class FuzzyNameMapper implements SchemaMapper { Double metricDimensionThresholdConfig = mapperHelper.getMetricDimensionThresholdConfig(); Double metricDimensionMinThresholdConfig = mapperHelper.getMetricDimensionMinThresholdConfig(); - Map> ModelElementMatches = queryContext.getMapInfo() + Map> modelElementMatches = queryContext.getMapInfo() .getModelElementMatches(); - boolean existElement = ModelElementMatches.entrySet().stream() + boolean existElement = modelElementMatches.entrySet().stream() .anyMatch(entry -> entry.getValue().size() >= 1); if (!existElement) { @@ -114,13 +119,13 @@ public class FuzzyNameMapper implements SchemaMapper { metricDimensionThresholdConfig = halfThreshold >= metricDimensionMinThresholdConfig ? halfThreshold : metricDimensionMinThresholdConfig; log.info("ModelElementMatches:{} , not exist Element metricDimensionThresholdConfig reduce by half:{}", - ModelElementMatches, metricDimensionThresholdConfig); + modelElementMatches, metricDimensionThresholdConfig); } return metricDimensionThresholdConfig; } - private Map> getNameToItems(List Models) { - return Models.stream().collect( + private Map> getNameToItems(List models) { + return models.stream().collect( Collectors.toMap(SchemaElement::getName, a -> { Set result = new HashSet<>(); result.add(a); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/HanlpDictMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/HanlpDictMapper.java index 063822984..e8dda8f42 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/HanlpDictMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/HanlpDictMapper.java @@ -9,7 +9,7 @@ import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; import com.tencent.supersonic.chat.service.SemanticService; -import com.tencent.supersonic.chat.utils.NatureHelper; +import com.tencent.supersonic.knowledge.utils.NatureHelper; import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.knowledge.dictionary.DictWordType; import com.tencent.supersonic.knowledge.dictionary.MapResult; @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -37,10 +38,13 @@ public class HanlpDictMapper implements SchemaMapper { for (Term term : terms) { log.info("word:{},nature:{},frequency:{}", term.word, term.nature.toString(), term.getFrequency()); } - Long modelId = queryContext.getRequest().getModelId(); QueryMatchStrategy matchStrategy = ContextUtils.getBean(QueryMatchStrategy.class); - Map> matchResult = matchStrategy.match(queryText, terms, modelId); + MapperHelper mapperHelper = ContextUtils.getBean(MapperHelper.class); + Set detectModelIds = mapperHelper.getModelIds(queryContext.getRequest()); + + Map> matchResult = matchStrategy.match(queryContext.getRequest(), terms, + detectModelIds); List matches = getMatches(matchResult); @@ -51,6 +55,7 @@ public class HanlpDictMapper implements SchemaMapper { convertTermsToSchemaMapInfo(matches, queryContext.getMapInfo(), terms); } + private void convertTermsToSchemaMapInfo(List mapResults, SchemaMapInfo schemaMap, List terms) { if (CollectionUtils.isEmpty(mapResults)) { return; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MapperHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MapperHelper.java index 2366f1cc7..81c19c0cc 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MapperHelper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MapperHelper.java @@ -1,10 +1,16 @@ package com.tencent.supersonic.chat.mapper; import com.hankcs.hanlp.algorithm.EditDistance; -import com.tencent.supersonic.chat.utils.NatureHelper; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import com.tencent.supersonic.chat.service.AgentService; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.knowledge.utils.NatureHelper; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -84,5 +90,24 @@ public class MapperHelper { detectSegment.length()); } + public Set getModelIds(QueryReq request) { + + Long modelId = request.getModelId(); + + AgentService agentService = ContextUtils.getBean(AgentService.class); + + Set detectModelIds = agentService.getDslToolsModelIds(request.getAgentId(), null); + if (Objects.nonNull(detectModelIds)) { + detectModelIds = detectModelIds.stream().filter(entry -> entry > 0).collect(Collectors.toSet()); + } + if (Objects.nonNull(modelId) && modelId > 0 && Objects.nonNull(detectModelIds)) { + if (detectModelIds.contains(modelId)) { + Set result = new HashSet<>(); + result.add(modelId); + return result; + } + } + return detectModelIds; + } } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchStrategy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchStrategy.java index 1a25a6475..481e9c128 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchStrategy.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchStrategy.java @@ -1,15 +1,17 @@ package com.tencent.supersonic.chat.mapper; import com.hankcs.hanlp.seg.common.Term; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.knowledge.dictionary.MapResult; import java.util.List; import java.util.Map; +import java.util.Set; /** * match strategy */ public interface MatchStrategy { - Map> match(String text, List terms, Long detectModelId); + Map> match(QueryReq queryReq, List terms, Set detectModelId); } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java index cd9e7dd31..a6adf47ae 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java @@ -3,25 +3,25 @@ package com.tencent.supersonic.chat.mapper; import com.google.common.collect.Lists; import com.tencent.supersonic.chat.api.component.SchemaMapper; import com.tencent.supersonic.chat.api.pojo.QueryContext; -import com.tencent.supersonic.chat.api.pojo.SchemaElement; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.common.pojo.Constants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.CollectionUtils; @Slf4j public class QueryFilterMapper implements SchemaMapper { - private Long FREQUENCY = 9999999L; - private double SIMILARITY = 1.0; + private Long frequency = 9999999L; + private double similarity = 1.0; @Override public void map(QueryContext queryContext) { @@ -49,7 +49,7 @@ public class QueryFilterMapper implements SchemaMapper { } private List addValueSchemaElementMatch(List candidateElementMatches, - QueryFilters queryFilter) { + QueryFilters queryFilter) { if (queryFilter == null || CollectionUtils.isEmpty(queryFilter.getFilters())) { return candidateElementMatches; } @@ -65,9 +65,9 @@ public class QueryFilterMapper implements SchemaMapper { .build(); SchemaElementMatch schemaElementMatch = SchemaElementMatch.builder() .element(element) - .frequency(FREQUENCY) + .frequency(frequency) .word(String.valueOf(filter.getValue())) - .similarity(SIMILARITY) + .similarity(similarity) .detectWord(Constants.EMPTY) .build(); candidateElementMatches.add(schemaElementMatch); @@ -76,7 +76,7 @@ public class QueryFilterMapper implements SchemaMapper { } private boolean checkExistSameValueSchemaElementMatch(QueryFilter queryFilter, - List schemaElementMatches) { + List schemaElementMatches) { List valueSchemaElements = schemaElementMatches.stream().filter(schemaElementMatch -> SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())) .collect(Collectors.toList()); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryMatchStrategy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryMatchStrategy.java index f3507cc36..f449f8233 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryMatchStrategy.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryMatchStrategy.java @@ -1,8 +1,8 @@ package com.tencent.supersonic.chat.mapper; import com.hankcs.hanlp.seg.common.Term; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.common.pojo.Constants; -import com.tencent.supersonic.knowledge.dictionary.DictWordType; import com.tencent.supersonic.knowledge.dictionary.MapResult; import com.tencent.supersonic.knowledge.service.SearchService; import java.util.ArrayList; @@ -32,7 +32,8 @@ public class QueryMatchStrategy implements MatchStrategy { private MapperHelper mapperHelper; @Override - public Map> match(String text, List terms, Long detectModelId) { + public Map> match(QueryReq queryReq, List terms, Set detectModelIds) { + String text = queryReq.getQueryText(); if (Objects.isNull(terms) || StringUtils.isEmpty(text)) { return null; } @@ -43,18 +44,19 @@ public class QueryMatchStrategy implements MatchStrategy { List offsetList = terms.stream().sorted(Comparator.comparing(Term::getOffset)) .map(term -> term.getOffset()).collect(Collectors.toList()); - log.debug("retryCount:{},terms:{},regOffsetToLength:{},offsetList:{},detectModelId:{}", terms, - regOffsetToLength, offsetList, detectModelId); + log.debug("retryCount:{},terms:{},regOffsetToLength:{},offsetList:{},detectModelIds:{}", terms, + regOffsetToLength, offsetList, detectModelIds); - List detects = detect(text, regOffsetToLength, offsetList, detectModelId); + List detects = detect(queryReq, regOffsetToLength, offsetList, detectModelIds); Map> result = new HashMap<>(); result.put(MatchText.builder().regText(text).detectSegment(text).build(), detects); return result; } - private List detect(String text, Map regOffsetToLength, List offsetList, - Long detectModelId) { + private List detect(QueryReq queryReq, Map regOffsetToLength, List offsetList, + Set detectModelIds) { + String text = queryReq.getQueryText(); List results = Lists.newArrayList(); for (Integer index = 0; index <= text.length() - 1; ) { @@ -65,7 +67,7 @@ public class QueryMatchStrategy implements MatchStrategy { int offset = mapperHelper.getStepOffset(offsetList, index); i = mapperHelper.getStepIndex(regOffsetToLength, i); if (i <= text.length()) { - List mapResults = detectByStep(text, detectModelId, index, i, offset); + List mapResults = detectByStep(queryReq, detectModelIds, index, i, offset); selectMapResultInOneRound(mapResultRowSet, mapResults); } } @@ -102,16 +104,19 @@ public class QueryMatchStrategy implements MatchStrategy { return a.getName() + Constants.UNDERLINE + String.join(Constants.UNDERLINE, a.getNatures()); } - private List detectByStep(String text, Long detectModelId, Integer index, Integer i, int offset) { + private List detectByStep(QueryReq queryReq, Set detectModelIds, Integer index, Integer i, + int offset) { + String text = queryReq.getQueryText(); + Integer agentId = queryReq.getAgentId(); String detectSegment = text.substring(index, i); // step1. pre search Integer oneDetectionMaxSize = mapperHelper.getOneDetectionMaxSize(); - LinkedHashSet mapResults = SearchService.prefixSearch(detectSegment, oneDetectionMaxSize) - .stream().collect(Collectors.toCollection(LinkedHashSet::new)); + LinkedHashSet mapResults = SearchService.prefixSearch(detectSegment, oneDetectionMaxSize, agentId, + detectModelIds).stream().collect(Collectors.toCollection(LinkedHashSet::new)); // step2. suffix search - LinkedHashSet suffixMapResults = SearchService.suffixSearch(detectSegment, oneDetectionMaxSize) - .stream().collect(Collectors.toCollection(LinkedHashSet::new)); + LinkedHashSet suffixMapResults = SearchService.suffixSearch(detectSegment, oneDetectionMaxSize, + agentId, detectModelIds).stream().collect(Collectors.toCollection(LinkedHashSet::new)); mapResults.addAll(suffixMapResults); @@ -121,27 +126,15 @@ public class QueryMatchStrategy implements MatchStrategy { // step3. merge pre/suffix result mapResults = mapResults.stream().sorted((a, b) -> -(b.getName().length() - a.getName().length())) .collect(Collectors.toCollection(LinkedHashSet::new)); - // step4. filter by classId - if (Objects.nonNull(detectModelId) && detectModelId > 0) { - log.debug("detectModelId:{}, before parseResults:{}", mapResults); - mapResults = mapResults.stream().map(entry -> { - List natures = entry.getNatures().stream().filter( - nature -> nature.startsWith(DictWordType.NATURE_SPILT + detectModelId) || (nature.startsWith( - DictWordType.NATURE_SPILT)) - ).collect(Collectors.toList()); - entry.setNatures(natures); - return entry; - }).collect(Collectors.toCollection(LinkedHashSet::new)); - log.info("after modelId parseResults:{}", mapResults); - } - // step5. filter by similarity + + // step4. filter by similarity mapResults = mapResults.stream() .filter(term -> mapperHelper.getSimilarity(detectSegment, term.getName()) >= mapperHelper.getThresholdMatch(term.getNatures())) .filter(term -> CollectionUtils.isNotEmpty(term.getNatures())) .collect(Collectors.toCollection(LinkedHashSet::new)); - log.debug("after isSimilarity parseResults:{}", mapResults); + log.info("after isSimilarity parseResults:{}", mapResults); mapResults = mapResults.stream().map(parseResult -> { parseResult.setOffset(offset); @@ -149,7 +142,7 @@ public class QueryMatchStrategy implements MatchStrategy { return parseResult; }).collect(Collectors.toCollection(LinkedHashSet::new)); - // step6. take only one dimension or 10 metric/dimension value per rond. + // step5. take only one dimension or 10 metric/dimension value per rond. List dimensionMetrics = mapResults.stream() .filter(entry -> mapperHelper.existDimensionValues(entry.getNatures())) .collect(Collectors.toList()) diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/SearchMatchStrategy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/SearchMatchStrategy.java index bf3eb9be9..a3299a22b 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/SearchMatchStrategy.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/SearchMatchStrategy.java @@ -2,12 +2,14 @@ package com.tencent.supersonic.chat.mapper; import com.google.common.collect.Lists; import com.hankcs.hanlp.seg.common.Term; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.knowledge.dictionary.DictWordType; import com.tencent.supersonic.knowledge.dictionary.MapResult; import com.tencent.supersonic.knowledge.service.SearchService; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import org.apache.commons.collections.CollectionUtils; @@ -23,9 +25,8 @@ public class SearchMatchStrategy implements MatchStrategy { private static final int SEARCH_SIZE = 3; @Override - public Map> match(String text, List originals, - Long detectModelId) { - + public Map> match(QueryReq queryReq, List originals, Set detectModelIds) { + String text = queryReq.getQueryText(); Map regOffsetToLength = originals.stream() .filter(entry -> !entry.nature.toString().startsWith(DictWordType.NATURE_SPILT)) .collect(Collectors.toMap(Term::getOffset, value -> value.word.length(), @@ -51,24 +52,16 @@ public class SearchMatchStrategy implements MatchStrategy { String detectSegment = text.substring(detectIndex); if (StringUtils.isNotEmpty(detectSegment)) { - List mapResults = SearchService.prefixSearch(detectSegment); - List suffixMapResults = SearchService.suffixSearch(detectSegment, SEARCH_SIZE); + List mapResults = SearchService.prefixSearch(detectSegment, + SearchService.SEARCH_SIZE, queryReq.getAgentId(), detectModelIds); + List suffixMapResults = SearchService.suffixSearch(detectSegment, SEARCH_SIZE, + queryReq.getAgentId(), detectModelIds); mapResults.addAll(suffixMapResults); // remove entity name where search mapResults = mapResults.stream().filter(entry -> { List natures = entry.getNatures().stream() .filter(nature -> !nature.endsWith(DictWordType.ENTITY.getType())) - .filter(nature -> { - if (Objects.isNull(detectModelId) || detectModelId <= 0) { - return true; - } - if (nature.startsWith(DictWordType.NATURE_SPILT + detectModelId) - && nature.startsWith(DictWordType.NATURE_SPILT)) { - return true; - } - return false; - } - ).collect(Collectors.toList()); + .collect(Collectors.toList()); if (CollectionUtils.isEmpty(natures)) { return false; } @@ -84,4 +77,4 @@ public class SearchMatchStrategy implements MatchStrategy { ); return regTextMap; } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/SatisfactionChecker.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/SatisfactionChecker.java index e678714ee..ac6eaab93 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/SatisfactionChecker.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/SatisfactionChecker.java @@ -2,8 +2,9 @@ package com.tencent.supersonic.chat.parser; import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.api.pojo.*; -import com.tencent.supersonic.chat.query.dsl.DSLQuery; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.query.llm.dsl.DslQuery; import lombok.extern.slf4j.Slf4j; /** @@ -21,7 +22,7 @@ public class SatisfactionChecker { // check all the parse info in candidate public static boolean check(QueryContext queryContext) { for (SemanticQuery query : queryContext.getCandidateQueries()) { - if (query.getQueryMode().equals(DSLQuery.QUERY_MODE)) { + if (query.getQueryMode().equals(DslQuery.QUERY_MODE)) { continue; } if (checkThreshold(queryContext.getRequest().getQueryText(), query.getParseInfo())) { @@ -32,7 +33,7 @@ public class SatisfactionChecker { } private static boolean checkThreshold(String queryText, SemanticParseInfo semanticParseInfo) { - int queryTextLength = queryText.length(); + int queryTextLength = queryText.replaceAll(" ", "").length(); double degree = semanticParseInfo.getScore() / queryTextLength; if (queryTextLength > QUERY_TEXT_LENGTH_THRESHOLD) { if (degree < LONG_TEXT_THRESHOLD) { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/DSLDateHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/DSLDateHelper.java index 46dac8beb..55a4026c9 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/DSLDateHelper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/DSLDateHelper.java @@ -6,15 +6,6 @@ public class DSLDateHelper { public static String getCurrentDate(Long modelId) { return DateUtils.getBeforeDate(4); -// ChatConfigFilter filter = new ChatConfigFilter(); -// filter.setModelId(modelId); -// -// List configResps = ContextUtils.getBean(ConfigService.class).search(filter, null); -// if (CollectionUtils.isEmpty(configResps)) { -// return -// } -// ChatConfigResp chatConfigResp = configResps.get(0); -// chatConfigResp.getChatDetailConfig().getChatDefaultConfig().get } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/DSLParseResult.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/DSLParseResult.java index 6a9590ff2..ab73f04f8 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/DSLParseResult.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/DSLParseResult.java @@ -2,13 +2,21 @@ package com.tencent.supersonic.chat.parser.llm.dsl; import com.tencent.supersonic.chat.agent.tool.DslTool; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; -import com.tencent.supersonic.chat.plugin.PluginParseResult; -import com.tencent.supersonic.chat.query.dsl.LLMResp; +import com.tencent.supersonic.chat.query.llm.dsl.LLMReq; +import com.tencent.supersonic.chat.query.llm.dsl.LLMResp; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class DSLParseResult { + private LLMReq llmReq; + private LLMResp llmResp; private QueryReq request; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDSLParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDSLParser.java index d89e2b551..6e92200bd 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDSLParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDSLParser.java @@ -1,42 +1,51 @@ package com.tencent.supersonic.chat.parser.llm.dsl; -import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; -import com.tencent.supersonic.chat.agent.Agent; import com.tencent.supersonic.chat.agent.tool.AgentToolType; import com.tencent.supersonic.chat.agent.tool.DslTool; +import com.tencent.supersonic.chat.api.component.SemanticCorrector; import com.tencent.supersonic.chat.api.component.SemanticParser; import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.SemanticSchema; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.config.LLMConfig; +import com.tencent.supersonic.chat.corrector.BaseSemanticCorrector; import com.tencent.supersonic.chat.parser.SatisfactionChecker; -import com.tencent.supersonic.chat.parser.function.ModelResolver; +import com.tencent.supersonic.chat.parser.plugin.function.ModelResolver; import com.tencent.supersonic.chat.query.QueryManager; -import com.tencent.supersonic.chat.query.dsl.DSLQuery; -import com.tencent.supersonic.chat.query.dsl.LLMReq; -import com.tencent.supersonic.chat.query.dsl.LLMReq.ElementValue; -import com.tencent.supersonic.chat.query.dsl.LLMResp; -import com.tencent.supersonic.chat.query.dsl.optimizer.BaseDSLOptimizer; +import com.tencent.supersonic.chat.query.llm.dsl.DslQuery; +import com.tencent.supersonic.chat.query.llm.dsl.LLMReq; +import com.tencent.supersonic.chat.query.llm.dsl.LLMReq.ElementValue; +import com.tencent.supersonic.chat.query.llm.dsl.LLMResp; import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; import com.tencent.supersonic.chat.service.AgentService; import com.tencent.supersonic.chat.utils.ComponentFactory; import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.pojo.DateConf.DateMode; import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.common.util.jsqlparser.FilterExpression; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper; import com.tencent.supersonic.knowledge.service.SchemaService; +import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; +import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import java.util.ArrayList; -import java.util.Collection; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -49,104 +58,217 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; @Slf4j -public class LLMDSLParser implements SemanticParser { +public class LLMDslParser implements SemanticParser { - public static final double FUNCTION_BONUS_THRESHOLD = 201; + public static final double function_bonus_threshold = 201; @Override public void parse(QueryContext queryCtx, ChatContext chatCtx) { - final LLMConfig llmConfig = ContextUtils.getBean(LLMConfig.class); + QueryReq request = queryCtx.getRequest(); + LLMConfig llmConfig = ContextUtils.getBean(LLMConfig.class); if (StringUtils.isEmpty(llmConfig.getUrl()) || SatisfactionChecker.check(queryCtx)) { - log.info("llmConfig:{}, skip function parser, queryText:{}", llmConfig, - queryCtx.getRequest().getQueryText()); + log.info("llmConfig:{}, skip function parser, queryText:{}", llmConfig, request.getQueryText()); return; } - - List dslTools = getDslTools(queryCtx.getRequest().getAgentId()); - Set distinctModelIds = dslTools.stream().map(DslTool::getModelIds) - .flatMap(Collection::stream) - .collect(Collectors.toSet()); try { - ModelResolver modelResolver = ComponentFactory.getModelResolver(); - Long modelId = modelResolver.resolve(queryCtx, chatCtx, distinctModelIds); - log.info("resolve modelId:{},dslModels:{}", modelId, distinctModelIds); - + Long modelId = getModelId(queryCtx, chatCtx, request.getAgentId()); if (Objects.isNull(modelId) || modelId <= 0) { return; } - Optional dslToolOptional = dslTools.stream().filter(tool -> - tool.getModelIds().contains(modelId)).findFirst(); - if (!dslToolOptional.isPresent()) { + + DslTool dslTool = getDslTool(request, modelId); + if (Objects.isNull(dslTool)) { log.info("no dsl tool in this agent, skip dsl parser"); return; } - DslTool dslTool = dslToolOptional.get(); - LLMResp llmResp = requestLLM(queryCtx, modelId); + + LLMReq llmReq = getLlmReq(queryCtx, modelId); + LLMResp llmResp = requestLLM(llmReq, modelId, llmConfig); + if (Objects.isNull(llmResp)) { return; } - PluginSemanticQuery semanticQuery = QueryManager.createPluginQuery(DSLQuery.QUERY_MODE); + DSLParseResult dslParseResult = DSLParseResult.builder().request(request).dslTool(dslTool).llmReq(llmReq) + .llmResp(llmResp).build(); - SemanticParseInfo parseInfo = semanticQuery.getParseInfo(); - if (Objects.nonNull(modelId) && modelId > 0) { - parseInfo.getElementMatches().addAll(queryCtx.getMapInfo().getMatchedElements(modelId)); - } - DSLParseResult dslParseResult = new DSLParseResult(); - dslParseResult.setRequest(queryCtx.getRequest()); - dslParseResult.setLlmResp(llmResp); - dslParseResult.setDslTool(dslToolOptional.get()); + SemanticParseInfo parseInfo = getParseInfo(queryCtx, modelId, dslTool, dslParseResult); + + String correctorSql = getCorrectorSql(queryCtx, parseInfo, llmResp.getSqlOutput()); + + llmResp.setCorrectorSql(correctorSql); + + setFilter(correctorSql, modelId, parseInfo); - Map properties = new HashMap<>(); - properties.put(Constants.CONTEXT, dslParseResult); - properties.put("type", "internal"); - properties.put("name", dslTool.getName()); - parseInfo.setProperties(properties); - parseInfo.setScore(FUNCTION_BONUS_THRESHOLD); - parseInfo.setQueryMode(semanticQuery.getQueryMode()); - SchemaElement Model = new SchemaElement(); - Model.setModel(modelId); - Model.setId(modelId); - parseInfo.setModel(Model); - queryCtx.getCandidateQueries().add(semanticQuery); } catch (Exception e) { log.error("LLMDSLParser error", e); } } + public void setFilter(String correctorSql, Long modelId, SemanticParseInfo parseInfo) { - private LLMResp requestLLM(QueryContext queryCtx, Long modelId) { - long startTime = System.currentTimeMillis(); - String queryText = queryCtx.getRequest().getQueryText(); - final LLMConfig llmConfig = ContextUtils.getBean(LLMConfig.class); - - if (StringUtils.isEmpty(llmConfig.getUrl())) { - log.warn("llmConfig url is null, skip llm parser"); - return null; + List expressions = SqlParserSelectHelper.getFilterExpression(correctorSql); + if (CollectionUtils.isEmpty(expressions)) { + return; } + //set dataInfo + try { + DateConf dateInfo = getDateInfo(expressions); + parseInfo.setDateInfo(dateInfo); + } catch (Exception e) { + log.error("set dateInfo error :", e); + } + + //set filter + try { + Map bizNameToElement = getBizNameToElement(modelId); + List result = getDimensionFilter(bizNameToElement, expressions); + parseInfo.getDimensionFilters().addAll(result); + } catch (Exception e) { + log.error("set dimensionFilter error :", e); + } + } + + private List getDimensionFilter(Map bizNameToElement, + List filterExpressions) { + List result = Lists.newArrayList(); + for (FilterExpression expression : filterExpressions) { + QueryFilter dimensionFilter = new QueryFilter(); + dimensionFilter.setValue(expression.getFieldValue()); + String bizName = expression.getFieldName(); + SchemaElement schemaElement = bizNameToElement.get(bizName); + if (Objects.isNull(schemaElement)) { + continue; + } + String fieldName = schemaElement.getName(); + dimensionFilter.setName(fieldName); + dimensionFilter.setBizName(bizName); + dimensionFilter.setElementID(schemaElement.getId()); + + FilterOperatorEnum operatorEnum = FilterOperatorEnum.getSqlOperator(expression.getOperator()); + dimensionFilter.setOperator(operatorEnum); + result.add(dimensionFilter); + } + return result; + } + + private DateConf getDateInfo(List filterExpressions) { + List dateExpressions = filterExpressions.stream() + .filter(expression -> { + List nameList = TimeDimensionEnum.getNameList(); + if (StringUtils.isEmpty(expression.getFieldName())) { + return false; + } + return nameList.contains(expression.getFieldName().toLowerCase()); + }).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(dateExpressions)) { + return new DateConf(); + } + DateConf dateInfo = new DateConf(); + dateInfo.setDateMode(DateMode.BETWEEN); + FilterExpression firstExpression = dateExpressions.get(0); + + FilterOperatorEnum firstOperator = FilterOperatorEnum.getSqlOperator(firstExpression.getOperator()); + if (FilterOperatorEnum.EQUALS.equals(firstOperator) && Objects.nonNull(firstExpression.getFieldValue())) { + dateInfo.setStartDate(firstExpression.getFieldValue().toString()); + dateInfo.setEndDate(firstExpression.getFieldValue().toString()); + dateInfo.setDateMode(DateMode.BETWEEN); + return dateInfo; + } + if (containOperators(firstExpression, firstOperator, FilterOperatorEnum.GREATER_THAN, + FilterOperatorEnum.GREATER_THAN_EQUALS)) { + dateInfo.setStartDate(firstExpression.getFieldValue().toString()); + if (hasSecondDate(dateExpressions)) { + dateInfo.setEndDate(dateExpressions.get(1).getFieldValue().toString()); + } + } + if (containOperators(firstExpression, firstOperator, FilterOperatorEnum.MINOR_THAN, + FilterOperatorEnum.MINOR_THAN_EQUALS)) { + dateInfo.setEndDate(firstExpression.getFieldValue().toString()); + if (hasSecondDate(dateExpressions)) { + dateInfo.setStartDate(dateExpressions.get(1).getFieldValue().toString()); + } + } + return dateInfo; + } + + private boolean containOperators(FilterExpression expression, FilterOperatorEnum firstOperator, + FilterOperatorEnum... operatorEnums) { + return (Arrays.asList(operatorEnums).contains(firstOperator) && Objects.nonNull(expression.getFieldValue())); + } + + private boolean hasSecondDate(List dateExpressions) { + return dateExpressions.size() > 1 && Objects.nonNull(dateExpressions.get(1).getFieldValue()); + } + + private String getCorrectorSql(QueryContext queryCtx, SemanticParseInfo parseInfo, String sql) { + + CorrectionInfo correctionInfo = CorrectionInfo.builder() + .queryFilters(queryCtx.getRequest().getQueryFilters()).sql(sql) + .parseInfo(parseInfo).build(); + + List dslCorrections = ComponentFactory.getSqlCorrections(); + + dslCorrections.forEach(dslCorrection -> { + try { + dslCorrection.corrector(correctionInfo); + log.info("sqlCorrection:{} sql:{}", dslCorrection.getClass().getSimpleName(), + correctionInfo.getSql()); + } catch (Exception e) { + log.error("sqlCorrection:{} execute error,correctionInfo:{}", dslCorrection, correctionInfo, e); + } + }); + return correctionInfo.getSql(); + } + + private SemanticParseInfo getParseInfo(QueryContext queryCtx, Long modelId, DslTool dslTool, + DSLParseResult dslParseResult) { + PluginSemanticQuery semanticQuery = QueryManager.createPluginQuery(DslQuery.QUERY_MODE); + SemanticParseInfo parseInfo = semanticQuery.getParseInfo(); + parseInfo.getElementMatches().addAll(queryCtx.getMapInfo().getMatchedElements(modelId)); + + Map properties = new HashMap<>(); + properties.put(Constants.CONTEXT, dslParseResult); + properties.put("type", "internal"); + properties.put("name", dslTool.getName()); + + parseInfo.setProperties(properties); + parseInfo.setScore(function_bonus_threshold); + parseInfo.setQueryMode(semanticQuery.getQueryMode()); SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); Map modelIdToName = semanticSchema.getModelIdToName(); - LLMReq llmReq = new LLMReq(); - llmReq.setQueryText(queryText); - LLMReq.LLMSchema llmSchema = new LLMReq.LLMSchema(); - llmSchema.setModelName(modelIdToName.get(modelId)); - llmSchema.setDomainName(modelIdToName.get(modelId)); - List fieldNameList = getFieldNameList(queryCtx, modelId, semanticSchema); - fieldNameList.add(BaseDSLOptimizer.DATE_FIELD); - llmSchema.setFieldNameList(fieldNameList); - llmReq.setSchema(llmSchema); - List linking = new ArrayList<>(); - linking.addAll(getValueList(queryCtx, modelId, semanticSchema)); - llmReq.setLinking(linking); - String currentDate = DSLDateHelper.getCurrentDate(modelId); - llmReq.setCurrentDate(currentDate); + SchemaElement model = new SchemaElement(); + model.setModel(modelId); + model.setId(modelId); + model.setName(modelIdToName.get(modelId)); + parseInfo.setModel(model); + queryCtx.getCandidateQueries().add(semanticQuery); + return parseInfo; + } - log.info("requestLLM request, modelId:{},llmReq:{}", modelId, llmReq); + private DslTool getDslTool(QueryReq request, Long modelId) { + AgentService agentService = ContextUtils.getBean(AgentService.class); + List dslTools = agentService.getDslTools(request.getAgentId(), AgentToolType.DSL); + Optional dslToolOptional = dslTools.stream().filter(tool -> tool.getModelIds().contains(modelId)) + .findFirst(); + return dslToolOptional.orElse(null); + } + + private Long getModelId(QueryContext queryCtx, ChatContext chatCtx, Integer agentId) { + AgentService agentService = ContextUtils.getBean(AgentService.class); + Set distinctModelIds = agentService.getDslToolsModelIds(agentId, AgentToolType.DSL); + ModelResolver modelResolver = ComponentFactory.getModelResolver(); + Long modelId = modelResolver.resolve(queryCtx, chatCtx, distinctModelIds); + log.info("resolve modelId:{},dslModels:{}", modelId, distinctModelIds); + return modelId; + } + + private LLMResp requestLLM(LLMReq llmReq, Long modelId, LLMConfig llmConfig) { String questUrl = llmConfig.getUrl() + llmConfig.getQueryToSqlPath(); - + long startTime = System.currentTimeMillis(); + log.info("requestLLM request, modelId:{},llmReq:{}", modelId, llmReq); RestTemplate restTemplate = ContextUtils.getBean(RestTemplate.class); - try { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); @@ -163,6 +285,27 @@ public class LLMDSLParser implements SemanticParser { return null; } + private LLMReq getLlmReq(QueryContext queryCtx, Long modelId) { + SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); + Map modelIdToName = semanticSchema.getModelIdToName(); + String queryText = queryCtx.getRequest().getQueryText(); + LLMReq llmReq = new LLMReq(); + llmReq.setQueryText(queryText); + LLMReq.LLMSchema llmSchema = new LLMReq.LLMSchema(); + llmSchema.setModelName(modelIdToName.get(modelId)); + llmSchema.setDomainName(modelIdToName.get(modelId)); + List fieldNameList = getFieldNameList(queryCtx, modelId, semanticSchema); + fieldNameList.add(BaseSemanticCorrector.DATE_FIELD); + llmSchema.setFieldNameList(fieldNameList); + llmReq.setSchema(llmSchema); + List linking = new ArrayList<>(); + linking.addAll(getValueList(queryCtx, modelId, semanticSchema)); + llmReq.setLinking(linking); + String currentDate = DSLDateHelper.getCurrentDate(modelId); + llmReq.setCurrentDate(currentDate); + return llmReq; + } + private List getValueList(QueryContext queryCtx, Long modelId, SemanticSchema semanticSchema) { Map itemIdToName = getItemIdToName(modelId, semanticSchema); @@ -170,23 +313,37 @@ public class LLMDSLParser implements SemanticParser { if (CollectionUtils.isEmpty(matchedElements)) { return new ArrayList<>(); } - Set valueMatches = matchedElements.stream() + Set valueMatches = matchedElements + .stream() + .filter(elementMatch -> !elementMatch.isInherited()) .filter(schemaElementMatch -> { SchemaElementType type = schemaElementMatch.getElement().getType(); return SchemaElementType.VALUE.equals(type) || SchemaElementType.ID.equals(type); }) - .map(elementMatch -> - { - ElementValue elementValue = new ElementValue(); - elementValue.setFieldName(itemIdToName.get(elementMatch.getElement().getId())); - elementValue.setFieldValue(elementMatch.getWord()); - return elementValue; - } - ) - .collect(Collectors.toSet()); + .map(elementMatch -> { + ElementValue elementValue = new ElementValue(); + elementValue.setFieldName(itemIdToName.get(elementMatch.getElement().getId())); + elementValue.setFieldValue(elementMatch.getWord()); + return elementValue; + }).collect(Collectors.toSet()); return new ArrayList<>(valueMatches); } + + protected Map getBizNameToElement(Long modelId) { + SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); + List dimensions = semanticSchema.getDimensions(); + List metrics = semanticSchema.getMetrics(); + + List allElements = Lists.newArrayList(); + allElements.addAll(dimensions); + allElements.addAll(metrics); + return allElements.stream() + .filter(schemaElement -> schemaElement.getModel().equals(modelId)) + .collect(Collectors.toMap(SchemaElement::getBizName, Function.identity(), (value1, value2) -> value2)); + } + + private List getFieldNameList(QueryContext queryCtx, Long modelId, SemanticSchema semanticSchema) { Map itemIdToName = getItemIdToName(modelId, semanticSchema); @@ -197,9 +354,9 @@ public class LLMDSLParser implements SemanticParser { Set fieldNameList = matchedElements.stream() .filter(schemaElementMatch -> { SchemaElementType elementType = schemaElementMatch.getElement().getType(); - return SchemaElementType.METRIC.equals(elementType) || - SchemaElementType.DIMENSION.equals(elementType) || - SchemaElementType.VALUE.equals(elementType); + return SchemaElementType.METRIC.equals(elementType) + || SchemaElementType.DIMENSION.equals(elementType) + || SchemaElementType.VALUE.equals(elementType); }) .map(schemaElementMatch -> { SchemaElementType elementType = schemaElementMatch.getElement().getType(); @@ -220,18 +377,4 @@ public class LLMDSLParser implements SemanticParser { .collect(Collectors.toMap(SchemaElement::getId, SchemaElement::getName, (value1, value2) -> value2)); } - private List getDslTools(Integer agentId) { - AgentService agentService = ContextUtils.getBean(AgentService.class); - Agent agent = agentService.getAgent(agentId); - if (agent == null) { - return Lists.newArrayList(); - } - List tools = agent.getTools(AgentToolType.DSL); - if (CollectionUtils.isEmpty(tools)) { - return Lists.newArrayList(); - } - return tools.stream().map(tool -> JSONObject.parseObject(tool, DslTool.class)) - .collect(Collectors.toList()); - } - } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/interpret/MetricInterpretParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/interpret/MetricInterpretParser.java index 1ceab6c25..3577a10d6 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/interpret/MetricInterpretParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/interpret/MetricInterpretParser.java @@ -7,11 +7,17 @@ import com.tencent.supersonic.chat.agent.tool.AgentToolType; import com.tencent.supersonic.chat.agent.tool.MetricInterpretTool; import com.tencent.supersonic.chat.api.component.SemanticLayer; import com.tencent.supersonic.chat.api.component.SemanticParser; -import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.parser.SatisfactionChecker; -import com.tencent.supersonic.chat.query.metricInterpret.MetricInterpretQuery; +import com.tencent.supersonic.chat.query.metricinterpret.MetricInterpretQuery; import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; import com.tencent.supersonic.chat.service.AgentService; @@ -22,7 +28,11 @@ import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; -import java.util.*; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.HashMap; import java.util.stream.Collectors; @Slf4j @@ -34,7 +44,8 @@ public class MetricInterpretParser implements SemanticParser { log.info("skip MetricInterpretParser"); return; } - Map metricInterpretToolMap = getMetricInterpretTools(queryContext.getRequest().getAgentId()); + Map metricInterpretToolMap = + getMetricInterpretTools(queryContext.getRequest().getAgentId()); log.info("metric interpret tool : {}", metricInterpretToolMap); if (CollectionUtils.isEmpty(metricInterpretToolMap)) { return; @@ -50,8 +61,10 @@ public class MetricInterpretParser implements SemanticParser { } List metricOptions = metricInterpretTool.getMetricOptions(); if (!CollectionUtils.isEmpty(metricOptions)) { - List metricIds = metricOptions.stream().map(MetricOption::getMetricId).collect(Collectors.toList()); - buildQuery(modelId, queryContext, metricIds, elementMatches.get(modelId), metricInterpretTool.getName()); + List metricIds = metricOptions.stream() + .map(MetricOption::getMetricId).collect(Collectors.toList()); + String name = metricInterpretTool.getName(); + buildQuery(modelId, queryContext, metricIds, elementMatches.get(modelId), name); } } } @@ -82,7 +95,7 @@ public class MetricInterpretParser implements SemanticParser { if (agent == null) { return new HashMap<>(); } - List tools= agent.getTools(AgentToolType.INTERPRET); + List tools = agent.getTools(AgentToolType.INTERPRET); if (CollectionUtils.isEmpty(tools)) { return new HashMap<>(); } @@ -100,16 +113,16 @@ public class MetricInterpretParser implements SemanticParser { private SemanticParseInfo buildSemanticParseInfo(Long modelId, QueryReq queryReq, Set metrics, List schemaElementMatches, String toolName) { - SchemaElement Model = new SchemaElement(); - Model.setModel(modelId); - Model.setId(modelId); + SchemaElement model = new SchemaElement(); + model.setModel(modelId); + model.setId(modelId); SemanticParseInfo semanticParseInfo = new SemanticParseInfo(); semanticParseInfo.setMetrics(metrics); SchemaElement dimension = new SchemaElement(); dimension.setBizName(TimeDimensionEnum.DAY.getName()); semanticParseInfo.setDimensions(Sets.newHashSet(dimension)); semanticParseInfo.setElementMatches(schemaElementMatches); - semanticParseInfo.setModel(Model); + semanticParseInfo.setModel(model); semanticParseInfo.setScore(queryReq.getQueryText().length()); DateConf dateConf = new DateConf(); dateConf.setDateMode(DateConf.DateMode.RECENT); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/time/LLMTimeEnhancementParse.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/time/LLMTimeEnhancementParse.java index 95ff25b0c..e55c50f31 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/time/LLMTimeEnhancementParse.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/time/LLMTimeEnhancementParse.java @@ -17,7 +17,7 @@ public class LLMTimeEnhancementParse implements SemanticParser { @Override public void parse(QueryContext queryContext, ChatContext chatContext) { - log.info("before queryContext:{},chatContext:{}",queryContext,chatContext); + log.info("before queryContext:{},chatContext:{}", queryContext, chatContext); ChatGptHelper chatGptHelper = ContextUtils.getBean(ChatGptHelper.class); try { String inferredTime = chatGptHelper.inferredTime(queryContext.getRequest().getQueryText()); @@ -25,12 +25,12 @@ public class LLMTimeEnhancementParse implements SemanticParser { for (SemanticQuery query : queryContext.getCandidateQueries()) { DateConf dateInfo = query.getParseInfo().getDateInfo(); JSONObject jsonObject = JSON.parseObject(inferredTime); - if (jsonObject.containsKey("date")){ + if (jsonObject.containsKey("date")) { dateInfo.setDateMode(DateConf.DateMode.BETWEEN); dateInfo.setStartDate(jsonObject.getString("date")); dateInfo.setEndDate(jsonObject.getString("date")); query.getParseInfo().setDateInfo(dateInfo); - }else if (jsonObject.containsKey("start")){ + } else if (jsonObject.containsKey("start")) { dateInfo.setDateMode(DateConf.DateMode.BETWEEN); dateInfo.setStartDate(jsonObject.getString("start")); dateInfo.setEndDate(jsonObject.getString("end")); @@ -38,11 +38,13 @@ public class LLMTimeEnhancementParse implements SemanticParser { } } } - }catch (Exception exception){ - log.error("{} parse error,this reason is:{}",LLMTimeEnhancementParse.class.getSimpleName(), (Object) exception.getStackTrace()); + } catch (Exception exception) { + log.error("{} parse error,this reason is:{}", LLMTimeEnhancementParse.class.getSimpleName(), + (Object) exception.getStackTrace()); } - log.info("{} after queryContext:{},chatContext:{}",LLMTimeEnhancementParse.class.getSimpleName(),queryContext,chatContext); + log.info("{} after queryContext:{},chatContext:{}", + LLMTimeEnhancementParse.class.getSimpleName(), queryContext, chatContext); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingBasedParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingBasedParser.java similarity index 87% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingBasedParser.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingBasedParser.java index 48e9ea74d..c05178cdb 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingBasedParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingBasedParser.java @@ -1,8 +1,14 @@ -package com.tencent.supersonic.chat.parser.embedding; +package com.tencent.supersonic.chat.parser.plugin.embedding; import com.google.common.collect.Lists; import com.tencent.supersonic.chat.api.component.SemanticParser; -import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.parser.ParseMode; @@ -10,12 +16,16 @@ import com.tencent.supersonic.chat.plugin.Plugin; import com.tencent.supersonic.chat.plugin.PluginManager; import com.tencent.supersonic.chat.plugin.PluginParseResult; import com.tencent.supersonic.chat.query.QueryManager; -import com.tencent.supersonic.chat.query.dsl.DSLQuery; +import com.tencent.supersonic.chat.query.llm.dsl.DslQuery; import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; import com.tencent.supersonic.chat.service.SemanticService; import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.util.ContextUtils; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.HashMap; +import java.util.Comparator; import java.util.stream.Collectors; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import lombok.extern.slf4j.Slf4j; @@ -47,7 +57,7 @@ public class EmbeddingBasedParser implements SemanticParser { Map pluginMap = plugins.stream().collect(Collectors.toMap(Plugin::getId, p -> p)); for (RecallRetrieval embeddingRetrieval : embeddingRetrievals) { Plugin plugin = pluginMap.get(Long.parseLong(embeddingRetrieval.getId())); - if (plugin == null || DSLQuery.QUERY_MODE.equalsIgnoreCase(plugin.getType())) { + if (plugin == null || DslQuery.QUERY_MODE.equalsIgnoreCase(plugin.getType())) { continue; } Pair> pair = PluginManager.resolve(plugin, queryContext); @@ -88,12 +98,12 @@ public class EmbeddingBasedParser implements SemanticParser { if (modelId == null && !CollectionUtils.isEmpty(plugin.getModelList())) { modelId = plugin.getModelList().get(0); } - SchemaElement Model = new SchemaElement(); - Model.setModel(modelId); - Model.setId(modelId); + SchemaElement model = new SchemaElement(); + model.setModel(modelId); + model.setId(modelId); SemanticParseInfo semanticParseInfo = new SemanticParseInfo(); semanticParseInfo.setElementMatches(schemaElementMatches); - semanticParseInfo.setModel(Model); + semanticParseInfo.setModel(model); Map properties = new HashMap<>(); PluginParseResult pluginParseResult = new PluginParseResult(); pluginParseResult.setPlugin(plugin); @@ -111,9 +121,9 @@ public class EmbeddingBasedParser implements SemanticParser { private void setEntity(Long modelId, SemanticParseInfo semanticParseInfo) { SemanticService semanticService = ContextUtils.getBean(SemanticService.class); - ModelSchema ModelSchema = semanticService.getModelSchema(modelId); - if (ModelSchema != null && ModelSchema.getEntity() != null) { - semanticParseInfo.setEntity(ModelSchema.getEntity()); + ModelSchema modelSchema = semanticService.getModelSchema(modelId); + if (modelSchema != null && modelSchema.getEntity() != null) { + semanticParseInfo.setEntity(modelSchema.getEntity()); } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingConfig.java similarity index 90% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingConfig.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingConfig.java index 9df4c6e8b..42c3b3db5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingConfig.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.parser.embedding; +package com.tencent.supersonic.chat.parser.plugin.embedding; import lombok.Data; import org.springframework.beans.factory.annotation.Value; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingEntityResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingEntityResolver.java similarity index 94% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingEntityResolver.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingEntityResolver.java index 7ad5c1f8a..70fb33842 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingEntityResolver.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingEntityResolver.java @@ -1,26 +1,26 @@ -package com.tencent.supersonic.chat.parser.embedding; +package com.tencent.supersonic.chat.parser.plugin.embedding; import com.alibaba.fastjson.JSONObject; -import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; +import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import com.tencent.supersonic.chat.service.ConfigService; -import java.util.List; -import java.util.Objects; -import java.util.Set; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import java.util.List; +import java.util.Objects; +import java.util.Set; + @Slf4j @Component("EmbeddingEntityResolver") public class EmbeddingEntityResolver { - private ConfigService configService; public EmbeddingEntityResolver(ConfigService configService) { @@ -39,8 +39,8 @@ public class EmbeddingEntityResolver { } } entityId = getEntityValueFromSchemaMapInfo(modelId, queryCtx.getMapInfo(), entityElementId); - log.info("get entity id:{} from schema map Info :{} ", entityId, - JSONObject.toJSONString(queryCtx.getMapInfo())); + log.info("get entity id:{} from schema map Info :{} ", + entityId, JSONObject.toJSONString(queryCtx.getMapInfo())); if (entityId == null || entityId == 0) { Long entityIdFromChat = getEntityValueFromParseInfo(chatCtx.getParseInfo(), entityElementId); if (entityIdFromChat != null && entityIdFromChat > 0) { @@ -95,4 +95,4 @@ public class EmbeddingEntityResolver { return null; } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingResp.java similarity index 72% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingResp.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingResp.java index c11db7c81..18777ddbc 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingResp.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingResp.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.parser.embedding; +package com.tencent.supersonic.chat.parser.plugin.embedding; import java.util.List; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/RecallRetrieval.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/RecallRetrieval.java similarity index 74% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/RecallRetrieval.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/RecallRetrieval.java index 64d141119..4d5470e4f 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/RecallRetrieval.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/RecallRetrieval.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.parser.embedding; +package com.tencent.supersonic.chat.parser.plugin.embedding; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionBasedParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionBasedParser.java similarity index 82% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionBasedParser.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionBasedParser.java index f95732d18..c86b4bbdb 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionBasedParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionBasedParser.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.parser.function; +package com.tencent.supersonic.chat.parser.plugin.function; import com.alibaba.fastjson.JSON; import com.tencent.supersonic.chat.api.component.SemanticParser; @@ -15,13 +15,18 @@ import com.tencent.supersonic.chat.plugin.PluginParseConfig; import com.tencent.supersonic.chat.plugin.PluginParseResult; import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; -import com.tencent.supersonic.chat.query.dsl.DSLQuery; +import com.tencent.supersonic.chat.query.llm.dsl.DslQuery; import com.tencent.supersonic.chat.service.PluginService; import com.tencent.supersonic.chat.utils.ComponentFactory; import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.util.ContextUtils; import java.net.URI; -import java.util.*; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.Objects; +import java.util.Map; +import java.util.HashMap; import java.util.stream.Collectors; import com.tencent.supersonic.common.util.JsonUtil; import lombok.extern.slf4j.Slf4j; @@ -39,11 +44,6 @@ import org.springframework.web.util.UriComponentsBuilder; @Slf4j public class FunctionBasedParser implements SemanticParser { - public static final double FUNCTION_BONUS_THRESHOLD = 200; - - public static final double SKIP_DSL_LENGTH = 10; - - @Override public void parse(QueryContext queryCtx, ChatContext chatCtx) { FunctionCallInfoConfig functionCallConfig = ContextUtils.getBean(FunctionCallInfoConfig.class); @@ -59,12 +59,17 @@ public class FunctionBasedParser implements SemanticParser { log.info("function call parser, plugin is empty, skip"); return; } - FunctionReq functionReq = FunctionReq.builder() - .queryText(queryCtx.getRequest().getQueryText()) - .pluginConfigs(functionDOList).build(); - FunctionResp functionResp = requestFunction(functionUrl, functionReq); + FunctionResp functionResp = new FunctionResp(); + if (functionDOList.size() == 1) { + functionResp.setToolSelection(functionDOList.iterator().next().getName()); + } else { + FunctionReq functionReq = FunctionReq.builder() + .queryText(queryCtx.getRequest().getQueryText()) + .pluginConfigs(functionDOList).build(); + functionResp = requestFunction(functionUrl, functionReq); + } log.info("requestFunction result:{}", functionResp.getToolSelection()); - if (skipFunction(queryCtx, functionResp)) { + if (skipFunction(functionResp)) { return; } PluginParseResult functionCallParseResult = new PluginParseResult(); @@ -80,10 +85,10 @@ public class FunctionBasedParser implements SemanticParser { functionCallParseResult.setPlugin(plugin); log.info("QueryManager PluginQueryModes:{}", QueryManager.getPluginQueryModes()); PluginSemanticQuery semanticQuery = QueryManager.createPluginQuery(toolSelection); - ModelResolver ModelResolver = ComponentFactory.getModelResolver(); + ModelResolver modelResolver = ComponentFactory.getModelResolver(); log.info("plugin ModelList:{}", plugin.getModelList()); Pair> pluginResolveResult = PluginManager.resolve(plugin, queryCtx); - Long modelId = ModelResolver.resolve(queryCtx, chatCtx, pluginResolveResult.getRight()); + Long modelId = modelResolver.resolve(queryCtx, chatCtx, pluginResolveResult.getRight()); log.info("FunctionBasedParser modelId:{}", modelId); if ((Objects.isNull(modelId) || modelId <= 0) && !plugin.isContainsAllModel()) { log.info("Model is null, skip the parse, select tool: {}", toolSelection); @@ -102,35 +107,24 @@ public class FunctionBasedParser implements SemanticParser { properties.put("type", "plugin"); properties.put("name", plugin.getName()); parseInfo.setProperties(properties); - parseInfo.setScore(FUNCTION_BONUS_THRESHOLD); + parseInfo.setScore(queryCtx.getRequest().getQueryText().length()); parseInfo.setQueryMode(semanticQuery.getQueryMode()); - SchemaElement Model = new SchemaElement(); - Model.setModel(modelId); - Model.setId(modelId); - parseInfo.setModel(Model); + SchemaElement model = new SchemaElement(); + model.setModel(modelId); + model.setId(modelId); + parseInfo.setModel(model); queryCtx.getCandidateQueries().add(semanticQuery); } - private boolean skipFunction(QueryContext queryCtx, FunctionResp functionResp) { - if (Objects.isNull(functionResp) || StringUtils.isBlank(functionResp.getToolSelection())) { - return true; - } - String queryText = queryCtx.getRequest().getQueryText(); - - if (functionResp.getToolSelection().equalsIgnoreCase(DSLQuery.QUERY_MODE) - && queryText.length() < SKIP_DSL_LENGTH) { - log.info("queryText length is :{}, less than the threshold :{}, skip dsl.", queryText.length(), - SKIP_DSL_LENGTH); - return true; - } - return false; + private boolean skipFunction(FunctionResp functionResp) { + return Objects.isNull(functionResp) || StringUtils.isBlank(functionResp.getToolSelection()); } private List getFunctionDO(Long modelId, QueryContext queryContext) { log.info("user decide Model:{}", modelId); List plugins = getPluginList(queryContext); List functionDOList = plugins.stream().filter(plugin -> { - if (DSLQuery.QUERY_MODE.equalsIgnoreCase(plugin.getType())) { + if (DslQuery.QUERY_MODE.equalsIgnoreCase(plugin.getType())) { return false; } if (plugin.getParseModeConfig() == null) { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionFiled.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionFiled.java similarity index 66% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionFiled.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionFiled.java index 5c250ca51..e1ba0c4f6 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionFiled.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionFiled.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.parser.function; +package com.tencent.supersonic.chat.parser.plugin.function; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionReq.java similarity index 81% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionReq.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionReq.java index ab4fa5a47..523a859ad 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionReq.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionReq.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.parser.function; +package com.tencent.supersonic.chat.parser.plugin.function; import com.tencent.supersonic.chat.plugin.PluginParseConfig; import java.util.List; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionResp.java similarity index 61% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionResp.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionResp.java index f27021481..0501b6100 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionResp.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionResp.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.parser.function; +package com.tencent.supersonic.chat.parser.plugin.function; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicModelResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/HeuristicModelResolver.java similarity index 65% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicModelResolver.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/HeuristicModelResolver.java index e7c447258..b66217418 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicModelResolver.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/HeuristicModelResolver.java @@ -1,29 +1,40 @@ -package com.tencent.supersonic.chat.parser.function; +package com.tencent.supersonic.chat.parser.plugin.function; -import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.component.SemanticQuery; import lombok.extern.slf4j.Slf4j; -import java.util.*; +import java.util.Map; +import java.util.HashMap; +import java.util.Objects; +import java.util.List; +import java.util.HashSet; +import java.util.Set; import java.util.stream.Collectors; + import org.apache.commons.collections.CollectionUtils; @Slf4j public class HeuristicModelResolver implements ModelResolver { - protected static Long selectModelBySchemaElementCount(Map ModelQueryModes, - SchemaMapInfo schemaMap) { - Map ModelTypeMap = getModelTypeMap(schemaMap); - if (ModelTypeMap.size() == 1) { - Long ModelSelect = ModelTypeMap.entrySet().stream().collect(Collectors.toList()).get(0).getKey(); - if (ModelQueryModes.containsKey(ModelSelect)) { - log.info("selectModel with only one Model [{}]", ModelSelect); - return ModelSelect; + protected static Long selectModelBySchemaElementCount(Map modelQueryModes, + SchemaMapInfo schemaMap) { + Map modelTypeMap = getModelTypeMap(schemaMap); + if (modelTypeMap.size() == 1) { + Long modelSelect = modelTypeMap.entrySet().stream().collect(Collectors.toList()).get(0).getKey(); + if (modelQueryModes.containsKey(modelSelect)) { + log.info("selectModel with only one Model [{}]", modelSelect); + return modelSelect; } } else { - Map.Entry maxModel = ModelTypeMap.entrySet().stream() - .filter(entry -> ModelQueryModes.containsKey(entry.getKey())) + Map.Entry maxModel = modelTypeMap.entrySet().stream() + .filter(entry -> modelQueryModes.containsKey(entry.getKey())) .sorted((o1, o2) -> { int difference = o2.getValue().getCount() - o1.getValue().getCount(); if (difference == 0) { @@ -45,23 +56,24 @@ public class HeuristicModelResolver implements ModelResolver { * * @return false will use context Model, true will use other Model , maybe include context Model */ - protected static boolean isAllowSwitch(Map ModelQueryModes, SchemaMapInfo schemaMap, - ChatContext chatCtx, QueryReq searchCtx, Long modelId, Set restrictiveModels) { + protected static boolean isAllowSwitch(Map modelQueryModes, SchemaMapInfo schemaMap, + ChatContext chatCtx, QueryReq searchCtx, + Long modelId, Set restrictiveModels) { if (!Objects.nonNull(modelId) || modelId <= 0) { return true; } // except content Model, calculate the number of types for each Model, if numbers<=1 will not switch - Map ModelTypeMap = getModelTypeMap(schemaMap); - log.info("isAllowSwitch ModelTypeMap [{}]", ModelTypeMap); - long otherModelTypeNumBigOneCount = ModelTypeMap.entrySet().stream() - .filter(entry -> ModelQueryModes.containsKey(entry.getKey()) && !entry.getKey().equals(modelId)) + Map modelTypeMap = getModelTypeMap(schemaMap); + log.info("isAllowSwitch ModelTypeMap [{}]", modelTypeMap); + long otherModelTypeNumBigOneCount = modelTypeMap.entrySet().stream() + .filter(entry -> modelQueryModes.containsKey(entry.getKey()) && !entry.getKey().equals(modelId)) .filter(entry -> entry.getValue().getCount() > 1).count(); if (otherModelTypeNumBigOneCount >= 1) { return true; } // if query text only contain time , will not switch - if (!CollectionUtils.isEmpty(ModelQueryModes.values())) { - for (SemanticQuery semanticQuery : ModelQueryModes.values()) { + if (!CollectionUtils.isEmpty(modelQueryModes.values())) { + for (SemanticQuery semanticQuery : modelQueryModes.values()) { if (semanticQuery == null) { continue; } @@ -71,7 +83,8 @@ public class HeuristicModelResolver implements ModelResolver { } if (searchCtx.getQueryText() != null && semanticParseInfo.getDateInfo() != null) { if (semanticParseInfo.getDateInfo().getDetectWord() != null) { - if (semanticParseInfo.getDateInfo().getDetectWord().equalsIgnoreCase(searchCtx.getQueryText())) { + if (semanticParseInfo.getDateInfo().getDetectWord() + .equalsIgnoreCase(searchCtx.getQueryText())) { log.info("timeParseResults is not null , can not switch context , timeParseResults:{},", semanticParseInfo.getDateInfo()); return false; @@ -94,14 +107,14 @@ public class HeuristicModelResolver implements ModelResolver { } public static Map getModelTypeMap(SchemaMapInfo schemaMap) { - Map ModelCount = new HashMap<>(); + Map modelCount = new HashMap<>(); for (Map.Entry> entry : schemaMap.getModelElementMatches().entrySet()) { List schemaElementMatches = schemaMap.getMatchedElements(entry.getKey()); if (schemaElementMatches != null && schemaElementMatches.size() > 0) { - if (!ModelCount.containsKey(entry.getKey())) { - ModelCount.put(entry.getKey(), new ModelMatchResult()); + if (!modelCount.containsKey(entry.getKey())) { + modelCount.put(entry.getKey(), new ModelMatchResult()); } - ModelMatchResult ModelMatchResult = ModelCount.get(entry.getKey()); + ModelMatchResult modelMatchResult = modelCount.get(entry.getKey()); Set schemaElementTypes = new HashSet<>(); schemaElementMatches.stream() .forEach(schemaElementMatch -> schemaElementTypes.add( @@ -111,13 +124,13 @@ public class HeuristicModelResolver implements ModelResolver { ((int) ((o2.getSimilarity() - o1.getSimilarity()) * 100)) ).findFirst().orElse(null); if (schemaElementMatchMax != null) { - ModelMatchResult.setMaxSimilarity(schemaElementMatchMax.getSimilarity()); + modelMatchResult.setMaxSimilarity(schemaElementMatchMax.getSimilarity()); } - ModelMatchResult.setCount(schemaElementTypes.size()); + modelMatchResult.setCount(schemaElementTypes.size()); } } - return ModelCount; + return modelCount; } @@ -137,40 +150,41 @@ public class HeuristicModelResolver implements ModelResolver { .filter(restrictiveModels::contains) .collect(Collectors.toSet()); } - Map ModelQueryModes = new HashMap<>(); + Map modelQueryModes = new HashMap<>(); for (Long matchedModel : matchedModels) { - ModelQueryModes.put(matchedModel, null); + modelQueryModes.put(matchedModel, null); } - if(ModelQueryModes.size()==1){ - return ModelQueryModes.keySet().stream().findFirst().get(); + if (modelQueryModes.size() == 1) { + return modelQueryModes.keySet().stream().findFirst().get(); } - return resolve(ModelQueryModes, queryContext, chatCtx, - queryContext.getMapInfo(),restrictiveModels); + return resolve(modelQueryModes, queryContext, chatCtx, + queryContext.getMapInfo(), restrictiveModels); } - public Long resolve(Map ModelQueryModes, QueryContext queryContext, - ChatContext chatCtx, SchemaMapInfo schemaMap, Set restrictiveModels) { - Long selectModel = selectModel(ModelQueryModes, queryContext.getRequest(), chatCtx, schemaMap,restrictiveModels); + public Long resolve(Map modelQueryModes, QueryContext queryContext, + ChatContext chatCtx, SchemaMapInfo schemaMap, Set restrictiveModels) { + Long selectModel = selectModel(modelQueryModes, queryContext.getRequest(), + chatCtx, schemaMap, restrictiveModels); if (selectModel > 0) { log.info("selectModel {} ", selectModel); return selectModel; } // get the max SchemaElementType number - return selectModelBySchemaElementCount(ModelQueryModes, schemaMap); + return selectModelBySchemaElementCount(modelQueryModes, schemaMap); } - public Long selectModel(Map ModelQueryModes, QueryReq queryContext, - ChatContext chatCtx, - SchemaMapInfo schemaMap, Set restrictiveModels) { + public Long selectModel(Map modelQueryModes, QueryReq queryContext, + ChatContext chatCtx, + SchemaMapInfo schemaMap, Set restrictiveModels) { // if QueryContext has modelId and in ModelQueryModes - if (ModelQueryModes.containsKey(queryContext.getModelId())) { + if (modelQueryModes.containsKey(queryContext.getModelId())) { log.info("selectModel from QueryContext [{}]", queryContext.getModelId()); return queryContext.getModelId(); } // if ChatContext has modelId and in ModelQueryModes if (chatCtx.getParseInfo().getModelId() > 0) { Long modelId = chatCtx.getParseInfo().getModelId(); - if (!isAllowSwitch(ModelQueryModes, schemaMap, chatCtx, queryContext, modelId,restrictiveModels)) { + if (!isAllowSwitch(modelQueryModes, schemaMap, chatCtx, queryContext, modelId, restrictiveModels)) { log.info("selectModel from ChatContext [{}]", modelId); return modelId; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/ModelMatchResult.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/ModelMatchResult.java similarity index 68% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/ModelMatchResult.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/ModelMatchResult.java index 37cb8815a..391d673d5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/ModelMatchResult.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/ModelMatchResult.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.parser.function; +package com.tencent.supersonic.chat.parser.plugin.function; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/ModelResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/ModelResolver.java similarity index 77% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/ModelResolver.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/ModelResolver.java index 7bb68ee66..e80b167a7 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/ModelResolver.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/ModelResolver.java @@ -1,13 +1,12 @@ -package com.tencent.supersonic.chat.parser.function; +package com.tencent.supersonic.chat.parser.plugin.function; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.QueryContext; -import java.util.List; import java.util.Set; public interface ModelResolver { Long resolve(QueryContext queryContext, ChatContext chatCtx, Set restrictiveModels); -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/Parameters.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/Parameters.java similarity index 80% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/Parameters.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/Parameters.java index 453d4840b..c05dccae4 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/Parameters.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/Parameters.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.parser.function; +package com.tencent.supersonic.chat.parser.plugin.function; import java.util.List; import java.util.Map; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/AgentCheckParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/AgentCheckParser.java index 157c5c606..7171ad227 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/AgentCheckParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/AgentCheckParser.java @@ -13,7 +13,6 @@ import com.tencent.supersonic.chat.service.AgentService; import com.tencent.supersonic.common.util.ContextUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; -import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -32,16 +31,24 @@ public class AgentCheckParser implements SemanticParser { if (agent == null) { return; } - List queryModes = getRuleTools(agentId).stream().map(RuleQueryTool::getQueryModes) - .flatMap(Collection::stream).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(queries)) { + List queryTools = getRuleTools(agentId); + if (CollectionUtils.isEmpty(queryTools)) { queries.clear(); return; } log.info("queries resolved:{} {}", agent.getName(), queries.stream().map(SemanticQuery::getQueryMode).collect(Collectors.toList())); - queries.removeIf(query -> - !queryModes.contains(query.getQueryMode())); + queries.removeIf(query -> { + for (RuleQueryTool tool : queryTools) { + if (!tool.getQueryModes().contains(query.getQueryMode())) { + return true; + } + if (tool.isContainsAllModel() || tool.getModelIds().contains(query.getParseInfo().getModelId())) { + return false; + } + } + return true; + }); log.info("rule queries witch can be supported by agent :{} {}", agent.getName(), queries.stream().map(SemanticQuery::getQueryMode).collect(Collectors.toList())); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/AggregateTypeParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/AggregateTypeParser.java index 0b7925435..fbe90bb44 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/AggregateTypeParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/AggregateTypeParser.java @@ -14,6 +14,7 @@ import com.tencent.supersonic.chat.api.component.SemanticQuery; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; + import java.util.AbstractMap; import java.util.HashMap; import java.util.Map; @@ -21,6 +22,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; + import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/ContextInheritParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/ContextInheritParser.java index 8de93c7b8..d2e2d13b1 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/ContextInheritParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/ContextInheritParser.java @@ -1,12 +1,5 @@ package com.tencent.supersonic.chat.parser.rule; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.DIMENSION; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ENTITY; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ID; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.METRIC; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.MODEL; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.VALUE; - import com.tencent.supersonic.chat.api.component.SemanticParser; import com.tencent.supersonic.chat.api.component.SemanticQuery; import com.tencent.supersonic.chat.api.pojo.ChatContext; @@ -15,8 +8,8 @@ import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; -import com.tencent.supersonic.chat.query.rule.metric.MetricEntityQuery; import com.tencent.supersonic.chat.query.rule.metric.MetricModelQuery; +import com.tencent.supersonic.chat.query.rule.metric.MetricEntityQuery; import com.tencent.supersonic.chat.query.rule.metric.MetricSemanticQuery; import java.util.AbstractMap; import java.util.ArrayList; @@ -28,6 +21,13 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.METRIC; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.DIMENSION; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.VALUE; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ENTITY; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.MODEL; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ID; + @Slf4j public class ContextInheritParser implements SemanticParser { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/QueryModeParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/QueryModeParser.java index 983d3cb62..536d994a9 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/QueryModeParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/QueryModeParser.java @@ -1,9 +1,12 @@ package com.tencent.supersonic.chat.parser.rule; import com.tencent.supersonic.chat.api.component.SemanticParser; -import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; -import java.util.*; +import java.util.List; import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/TimeRangeParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/TimeRangeParser.java index 4b0624803..a94621b39 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/TimeRangeParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/rule/TimeRangeParser.java @@ -4,21 +4,23 @@ import com.tencent.supersonic.chat.api.component.SemanticParser; import com.tencent.supersonic.chat.api.component.SemanticQuery; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.QueryContext; -import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; +import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.DateConf; -import com.xkzhangsan.time.nlp.TimeNLP; -import com.xkzhangsan.time.nlp.TimeNLPUtil; + import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; +import java.util.Stack; import java.util.Date; import java.util.List; -import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; + +import com.xkzhangsan.time.nlp.TimeNLP; +import com.xkzhangsan.time.nlp.TimeNLPUtil; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/AgentDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/AgentDO.java index 9777a9492..777b27f04 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/AgentDO.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/AgentDO.java @@ -4,17 +4,14 @@ import java.util.Date; public class AgentDO { /** - * */ private Integer id; /** - * */ private String name; /** - * */ private String description; @@ -24,83 +21,70 @@ public class AgentDO { private Integer status; /** - * */ private String examples; /** - * */ private String config; /** - * */ private String createdBy; /** - * */ private Date createdAt; /** - * */ private String updatedBy; /** - * */ private Date updatedAt; /** - * */ private Integer enableSearch; /** - * - * @return id + * @return id */ public Integer getId() { return id; } /** - * - * @param id + * @param id */ public void setId(Integer id) { this.id = id; } /** - * - * @return name + * @return name */ public String getName() { return name; } /** - * - * @param name + * @param name */ public void setName(String name) { this.name = name == null ? null : name.trim(); } /** - * - * @return description + * @return description */ public String getDescription() { return description; } /** - * - * @param description + * @param description */ public void setDescription(String description) { this.description = description == null ? null : description.trim(); @@ -123,114 +107,100 @@ public class AgentDO { } /** - * - * @return examples + * @return examples */ public String getExamples() { return examples; } /** - * - * @param examples + * @param examples */ public void setExamples(String examples) { this.examples = examples == null ? null : examples.trim(); } /** - * - * @return config + * @return config */ public String getConfig() { return config; } /** - * - * @param config + * @param config */ public void setConfig(String config) { this.config = config == null ? null : config.trim(); } /** - * - * @return created_by + * @return created_by */ public String getCreatedBy() { return createdBy; } /** - * - * @param createdBy + * @param createdBy */ public void setCreatedBy(String createdBy) { this.createdBy = createdBy == null ? null : createdBy.trim(); } /** - * - * @return created_at + * @return created_at */ public Date getCreatedAt() { return createdAt; } /** - * - * @param createdAt + * @param createdAt */ public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; } /** - * - * @return updated_by + * @return updated_by */ public String getUpdatedBy() { return updatedBy; } /** - * - * @param updatedBy + * @param updatedBy */ public void setUpdatedBy(String updatedBy) { this.updatedBy = updatedBy == null ? null : updatedBy.trim(); } /** - * - * @return updated_at + * @return updated_at */ public Date getUpdatedAt() { return updatedAt; } /** - * - * @param updatedAt + * @param updatedAt */ public void setUpdatedAt(Date updatedAt) { this.updatedAt = updatedAt; } /** - * - * @return enable_search + * @return enable_search */ public Integer getEnableSearch() { return enableSearch; } /** - * - * @param enableSearch + * @param enableSearch */ public void setEnableSearch(Integer enableSearch) { this.enableSearch = enableSearch; } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/AgentDOExample.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/AgentDOExample.java index fb4bdda0f..c8ab99a65 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/AgentDOExample.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/AgentDOExample.java @@ -31,7 +31,6 @@ public class AgentDOExample { protected Integer limitEnd; /** - * * @mbg.generated */ public AgentDOExample() { @@ -39,7 +38,6 @@ public class AgentDOExample { } /** - * * @mbg.generated */ public void setOrderByClause(String orderByClause) { @@ -47,7 +45,6 @@ public class AgentDOExample { } /** - * * @mbg.generated */ public String getOrderByClause() { @@ -55,7 +52,6 @@ public class AgentDOExample { } /** - * * @mbg.generated */ public void setDistinct(boolean distinct) { @@ -63,7 +59,6 @@ public class AgentDOExample { } /** - * * @mbg.generated */ public boolean isDistinct() { @@ -71,7 +66,6 @@ public class AgentDOExample { } /** - * * @mbg.generated */ public List getOredCriteria() { @@ -79,7 +73,6 @@ public class AgentDOExample { } /** - * * @mbg.generated */ public void or(Criteria criteria) { @@ -87,7 +80,6 @@ public class AgentDOExample { } /** - * * @mbg.generated */ public Criteria or() { @@ -97,7 +89,6 @@ public class AgentDOExample { } /** - * * @mbg.generated */ public Criteria createCriteria() { @@ -109,7 +100,6 @@ public class AgentDOExample { } /** - * * @mbg.generated */ protected Criteria createCriteriaInternal() { @@ -118,7 +108,6 @@ public class AgentDOExample { } /** - * * @mbg.generated */ public void clear() { @@ -128,15 +117,13 @@ public class AgentDOExample { } /** - * * @mbg.generated */ public void setLimitStart(Integer limitStart) { - this.limitStart=limitStart; + this.limitStart = limitStart; } /** - * * @mbg.generated */ public Integer getLimitStart() { @@ -144,15 +131,13 @@ public class AgentDOExample { } /** - * * @mbg.generated */ public void setLimitEnd(Integer limitEnd) { - this.limitEnd=limitEnd; + this.limitEnd = limitEnd; } /** - * * @mbg.generated */ public Integer getLimitEnd() { @@ -954,38 +939,6 @@ public class AgentDOExample { private String typeHandler; - public String getCondition() { - return condition; - } - - public Object getValue() { - return value; - } - - public Object getSecondValue() { - return secondValue; - } - - public boolean isNoValue() { - return noValue; - } - - public boolean isSingleValue() { - return singleValue; - } - - public boolean isBetweenValue() { - return betweenValue; - } - - public boolean isListValue() { - return listValue; - } - - public String getTypeHandler() { - return typeHandler; - } - protected Criterion(String condition) { super(); this.condition = condition; @@ -1021,5 +974,37 @@ public class AgentDOExample { protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatParseDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatParseDO.java new file mode 100644 index 000000000..3f5a6d47d --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatParseDO.java @@ -0,0 +1,142 @@ +package com.tencent.supersonic.chat.persistence.dataobject; + +import java.util.Date; + + +public class ChatParseDO { + + /** + * questionId + */ + private Long questionId; + + /** + * chatId + */ + private Long chatId; + + /** + * parseId + */ + private Integer parseId; + + /** + * createTime + */ + private Date createTime; + + /** + * queryText + */ + private String queryText; + + /** + * userName + */ + private String userName; + + + /** + * parseInfo + */ + private String parseInfo; + + /** + * isCandidate + */ + private Integer isCandidate; + + /** + * return question_id + */ + public Long getQuestionId() { + return questionId; + } + + /** + * questionId + */ + public void setQuestionId(Long questionId) { + this.questionId = questionId; + } + + /** + * return create_time + */ + public Date getCreateTime() { + return createTime; + } + + /** + * createTime + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + /** + * return user_name + */ + public String getUserName() { + return userName; + } + + /** + * userName + */ + public void setUserName(String userName) { + this.userName = userName == null ? null : userName.trim(); + } + + /** + * return chat_id + */ + public Long getChatId() { + return chatId; + } + + /** + * chatId + */ + public void setChatId(Long chatId) { + this.chatId = chatId; + } + + /** + * return query_text + */ + public String getQueryText() { + return queryText; + } + + /** + * queryText + */ + public void setQueryText(String queryText) { + this.queryText = queryText == null ? null : queryText.trim(); + } + + public Integer getIsCandidate() { + return isCandidate; + } + + public Integer getParseId() { + return parseId; + } + + public String getParseInfo() { + return parseInfo; + } + + public void setParseId(Integer parseId) { + this.parseId = parseId; + } + + public void setIsCandidate(Integer isCandidate) { + this.isCandidate = isCandidate; + } + + public void setParseInfo(String parseInfo) { + this.parseInfo = parseInfo; + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDO.java index 600f8b87e..6d5a8ec6e 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDO.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDO.java @@ -2,177 +2,196 @@ package com.tencent.supersonic.chat.persistence.dataobject; import java.util.Date; - public class ChatQueryDO { - /** - * questionId */ private Long questionId; /** - * createTime + */ + private Integer agentId; + + /** */ private Date createTime; /** - * userName */ private String userName; /** - * queryState */ private Integer queryState; /** - * chatId */ private Long chatId; /** - * score */ private Integer score; /** - * feedback */ private String feedback; /** - * queryText */ private String queryText; /** - * queryResponse */ private String queryResult; /** - * return question_id + * @return question_id */ public Long getQuestionId() { return questionId; } /** - * questionId + * @param questionId */ public void setQuestionId(Long questionId) { this.questionId = questionId; } /** - * return create_time + * @return agent_id + */ + public Integer getAgentId() { + return agentId; + } + + /** + * @param agentId + */ + public void setAgentId(Integer agentId) { + this.agentId = agentId; + } + + /** + * @return create_time */ public Date getCreateTime() { return createTime; } /** - * createTime + * @param createTime */ public void setCreateTime(Date createTime) { this.createTime = createTime; } /** - * return user_name + * @return user_name */ public String getUserName() { return userName; } /** - * userName + * @param userName */ public void setUserName(String userName) { this.userName = userName == null ? null : userName.trim(); } /** - * return query_state + * + * @return query_state */ public Integer getQueryState() { return queryState; } /** - * queryState + * + * @param queryState */ public void setQueryState(Integer queryState) { this.queryState = queryState; } /** - * return chat_id + * + * @return chat_id */ public Long getChatId() { return chatId; } /** - * chatId + * + * @param chatId */ public void setChatId(Long chatId) { this.chatId = chatId; } /** - * return score + * + * @return score */ public Integer getScore() { return score; } /** - * score + * + * @param score */ public void setScore(Integer score) { this.score = score; } /** - * return feedback + * + * @return feedback */ public String getFeedback() { return feedback; } /** - * feedback + * + * @param feedback */ public void setFeedback(String feedback) { this.feedback = feedback == null ? null : feedback.trim(); } /** - * return query_text + * + * @return query_text */ public String getQueryText() { return queryText; } /** - * queryText + * + * @param queryText */ public void setQueryText(String queryText) { this.queryText = queryText == null ? null : queryText.trim(); } /** - * return query_response + * + * @return query_result */ public String getQueryResult() { return queryResult; } /** - * queryResponse + * + * @param queryResult */ public void setQueryResult(String queryResult) { this.queryResult = queryResult == null ? null : queryResult.trim(); } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDOExample.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDOExample.java index 836e6db25..b7b69d8cd 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDOExample.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatQueryDOExample.java @@ -5,47 +5,92 @@ import java.util.Date; import java.util.List; public class ChatQueryDOExample { - + /** + * s2_chat_query + */ protected String orderByClause; + + /** + * s2_chat_query + */ protected boolean distinct; + + /** + * s2_chat_query + */ protected List oredCriteria; + + /** + * s2_chat_query + */ protected Integer limitStart; + + /** + * s2_chat_query + */ protected Integer limitEnd; + /** + * @mbg.generated + */ public ChatQueryDOExample() { oredCriteria = new ArrayList(); } - public String getOrderByClause() { - return orderByClause; - } - + /** + * @mbg.generated + */ public void setOrderByClause(String orderByClause) { this.orderByClause = orderByClause; } - public boolean isDistinct() { - return distinct; + /** + * @mbg.generated + */ + public String getOrderByClause() { + return orderByClause; } + /** + * @mbg.generated + */ public void setDistinct(boolean distinct) { this.distinct = distinct; } + /** + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + + /** + * @mbg.generated + */ public List getOredCriteria() { return oredCriteria; } + /** + * @mbg.generated + */ public void or(Criteria criteria) { oredCriteria.add(criteria); } + /** + * @mbg.generated + */ public Criteria or() { Criteria criteria = createCriteriaInternal(); oredCriteria.add(criteria); return criteria; } + /** + * @mbg.generated + */ public Criteria createCriteria() { Criteria criteria = createCriteriaInternal(); if (oredCriteria.size() == 0) { @@ -54,35 +99,55 @@ public class ChatQueryDOExample { return criteria; } + /** + * @mbg.generated + */ protected Criteria createCriteriaInternal() { Criteria criteria = new Criteria(); return criteria; } + /** + * @mbg.generated + */ public void clear() { oredCriteria.clear(); orderByClause = null; distinct = false; } - public Integer getLimitStart() { - return limitStart; - } - + /** + * @mbg.generated + */ public void setLimitStart(Integer limitStart) { this.limitStart = limitStart; } - public Integer getLimitEnd() { - return limitEnd; + /** + * @mbg.generated + */ + public Integer getLimitStart() { + return limitStart; } + /** + * @mbg.generated + */ public void setLimitEnd(Integer limitEnd) { this.limitEnd = limitEnd; } - protected abstract static class GeneratedCriteria { + /** + * @mbg.generated + */ + public Integer getLimitEnd() { + return limitEnd; + } + /** + * s2_chat_query null + */ + protected abstract static class GeneratedCriteria { protected List criteria; protected GeneratedCriteria() { @@ -183,6 +248,66 @@ public class ChatQueryDOExample { return (Criteria) this; } + public Criteria andAgentIdIsNull() { + addCriterion("agent_id is null"); + return (Criteria) this; + } + + public Criteria andAgentIdIsNotNull() { + addCriterion("agent_id is not null"); + return (Criteria) this; + } + + public Criteria andAgentIdEqualTo(Integer value) { + addCriterion("agent_id =", value, "agentId"); + return (Criteria) this; + } + + public Criteria andAgentIdNotEqualTo(Integer value) { + addCriterion("agent_id <>", value, "agentId"); + return (Criteria) this; + } + + public Criteria andAgentIdGreaterThan(Integer value) { + addCriterion("agent_id >", value, "agentId"); + return (Criteria) this; + } + + public Criteria andAgentIdGreaterThanOrEqualTo(Integer value) { + addCriterion("agent_id >=", value, "agentId"); + return (Criteria) this; + } + + public Criteria andAgentIdLessThan(Integer value) { + addCriterion("agent_id <", value, "agentId"); + return (Criteria) this; + } + + public Criteria andAgentIdLessThanOrEqualTo(Integer value) { + addCriterion("agent_id <=", value, "agentId"); + return (Criteria) this; + } + + public Criteria andAgentIdIn(List values) { + addCriterion("agent_id in", values, "agentId"); + return (Criteria) this; + } + + public Criteria andAgentIdNotIn(List values) { + addCriterion("agent_id not in", values, "agentId"); + return (Criteria) this; + } + + public Criteria andAgentIdBetween(Integer value1, Integer value2) { + addCriterion("agent_id between", value1, value2, "agentId"); + return (Criteria) this; + } + + public Criteria andAgentIdNotBetween(Integer value1, Integer value2) { + addCriterion("agent_id not between", value1, value2, "agentId"); + return (Criteria) this; + } + public Criteria andCreateTimeIsNull() { addCriterion("create_time is null"); return (Criteria) this; @@ -564,6 +689,9 @@ public class ChatQueryDOExample { } } + /** + * s2_chat_query + */ public static class Criteria extends GeneratedCriteria { protected Criteria() { @@ -571,8 +699,10 @@ public class ChatQueryDOExample { } } + /** + * s2_chat_query null + */ public static class Criterion { - private String condition; private Object value; @@ -657,4 +787,4 @@ public class ChatQueryDOExample { return typeHandler; } } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/CostType.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/CostType.java new file mode 100644 index 000000000..0e10f55bf --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/CostType.java @@ -0,0 +1,23 @@ +package com.tencent.supersonic.chat.persistence.dataobject; + +public enum CostType { + MAPPER(1, "mapper"), + PARSER(2, "parser"), + QUERY(3, "query"); + + private Integer type; + private String name; + + CostType(Integer type, String name) { + this.type = type; + this.name = name; + } + + public Integer getType() { + return type; + } + + public String getName() { + return name; + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDO.java index b730f806b..f6b99f603 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDO.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDO.java @@ -254,4 +254,4 @@ public class PluginDO { public void setComment(String comment) { this.comment = comment == null ? null : comment.trim(); } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDOExample.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDOExample.java index 8ee110998..6f25dc5e0 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDOExample.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/PluginDOExample.java @@ -892,38 +892,6 @@ public class PluginDOExample { private String typeHandler; - public String getCondition() { - return condition; - } - - public Object getValue() { - return value; - } - - public Object getSecondValue() { - return secondValue; - } - - public boolean isNoValue() { - return noValue; - } - - public boolean isSingleValue() { - return singleValue; - } - - public boolean isBetweenValue() { - return betweenValue; - } - - public boolean isListValue() { - return listValue; - } - - public String getTypeHandler() { - return typeHandler; - } - protected Criterion(String condition) { super(); this.condition = condition; @@ -959,5 +927,37 @@ public class PluginDOExample { protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/StatisticsDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/StatisticsDO.java new file mode 100644 index 000000000..e69627fcd --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/StatisticsDO.java @@ -0,0 +1,54 @@ +package com.tencent.supersonic.chat.persistence.dataobject; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.util.Date; + +@Data +@Builder +@NoArgsConstructor +@Getter +@AllArgsConstructor +public class StatisticsDO { + /** + * questionId + */ + private Long questionId; + + /** + * chatId + */ + private Long chatId; + + /** + * createTime + */ + private Date createTime; + + /** + * queryText + */ + private String queryText; + + /** + * userName + */ + private String userName; + + + /** + * interface + */ + private String interfaceName; + + /** + * cost + */ + private Integer cost; + + private Integer type; +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatParseMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatParseMapper.java new file mode 100644 index 000000000..94be19489 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatParseMapper.java @@ -0,0 +1,17 @@ +package com.tencent.supersonic.chat.persistence.mapper; + +import com.tencent.supersonic.chat.persistence.dataobject.ChatParseDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +@Mapper +public interface ChatParseMapper { + + boolean batchSaveParseInfo(@Param("list") List list); + + ChatParseDO getParseInfo(Long questionId, String userName, int parseId); + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatQueryDOMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatQueryDOMapper.java index aa4c19854..6dabf7e6c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatQueryDOMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatQueryDOMapper.java @@ -14,4 +14,5 @@ public interface ChatQueryDOMapper { int updateByPrimaryKeyWithBLOBs(ChatQueryDO record); + Boolean deleteByPrimaryKey(Long questionId); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/StatisticsMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/StatisticsMapper.java new file mode 100644 index 000000000..f46042c27 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/StatisticsMapper.java @@ -0,0 +1,12 @@ +package com.tencent.supersonic.chat.persistence.mapper; + +import com.tencent.supersonic.chat.persistence.dataobject.StatisticsDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface StatisticsMapper { + boolean batchSaveStatistics(@Param("list") List list); +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/custom/ShowCaseCustomMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/custom/ShowCaseCustomMapper.java new file mode 100644 index 000000000..fddb34594 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/custom/ShowCaseCustomMapper.java @@ -0,0 +1,12 @@ +package com.tencent.supersonic.chat.persistence.mapper.custom; + +import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; +import org.apache.ibatis.annotations.Mapper; +import java.util.List; + +@Mapper +public interface ShowCaseCustomMapper { + + List queryShowCase(int start, int limit, int agentId); + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatQueryRepository.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatQueryRepository.java index cce4aafd4..4ddafcefd 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatQueryRepository.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatQueryRepository.java @@ -2,18 +2,37 @@ package com.tencent.supersonic.chat.persistence.repository; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; -import com.tencent.supersonic.chat.api.pojo.response.QueryResp; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import com.tencent.supersonic.chat.api.pojo.response.ParseResp; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.persistence.dataobject.ChatParseDO; import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; +import com.tencent.supersonic.chat.api.pojo.response.QueryResp; +import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; + +import java.util.List; public interface ChatQueryRepository { PageInfo getChatQuery(PageQueryInfoReq pageQueryInfoCommend, long chatId); + List queryShowCase(PageQueryInfoReq pageQueryInfoCommend, int agentId); + void createChatQuery(QueryResult queryResult, ChatContext chatCtx); ChatQueryDO getLastChatQuery(long chatId); int updateChatQuery(ChatQueryDO chatQueryDO); + + Long createChatParse(ParseResp parseResult, ChatContext chatCtx, QueryReq queryReq); + + Boolean batchSaveParseInfo(ChatContext chatCtx, QueryReq queryReq, + ParseResp parseResult, + List candidateParses, + List selectedParses); + + public ChatParseDO getParseInfo(Long questionId, String userName, int parseId); + + Boolean deleteChatQuery(Long questionId); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/StatisticsRepository.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/StatisticsRepository.java new file mode 100644 index 000000000..e6b457754 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/StatisticsRepository.java @@ -0,0 +1,11 @@ +package com.tencent.supersonic.chat.persistence.repository; + + +import com.tencent.supersonic.chat.persistence.dataobject.StatisticsDO; + +import java.util.List; + +public interface StatisticsRepository { + + boolean batchSaveStatistics(List list); +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatConfigRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatConfigRepositoryImpl.java index 5df0cce0e..6ba9121eb 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatConfigRepositoryImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatConfigRepositoryImpl.java @@ -1,13 +1,14 @@ package com.tencent.supersonic.chat.persistence.repository.impl; -import com.tencent.supersonic.chat.api.pojo.request.ChatConfigFilter; -import com.tencent.supersonic.chat.api.pojo.response.ChatConfigResp; import com.tencent.supersonic.chat.config.ChatConfig; +import com.tencent.supersonic.chat.api.pojo.request.ChatConfigFilter; import com.tencent.supersonic.chat.config.ChatConfigFilterInternal; +import com.tencent.supersonic.chat.api.pojo.response.ChatConfigResp; import com.tencent.supersonic.chat.persistence.dataobject.ChatConfigDO; -import com.tencent.supersonic.chat.persistence.mapper.ChatConfigMapper; import com.tencent.supersonic.chat.persistence.repository.ChatConfigRepository; import com.tencent.supersonic.chat.utils.ChatConfigHelper; +import com.tencent.supersonic.chat.persistence.mapper.ChatConfigMapper; + import java.util.ArrayList; import java.util.List; import org.springframework.beans.BeanUtils; @@ -23,7 +24,7 @@ public class ChatConfigRepositoryImpl implements ChatConfigRepository { private final ChatConfigMapper chatConfigMapper; public ChatConfigRepositoryImpl(ChatConfigHelper chatConfigHelper, - ChatConfigMapper chatConfigMapper) { + ChatConfigMapper chatConfigMapper) { this.chatConfigHelper = chatConfigHelper; this.chatConfigMapper = chatConfigMapper; } @@ -52,8 +53,8 @@ public class ChatConfigRepositoryImpl implements ChatConfigRepository { List chaConfigDOList = chatConfigMapper.search(filterInternal); if (!CollectionUtils.isEmpty(chaConfigDOList)) { chaConfigDOList.stream().forEach(chaConfigDO -> - chaConfigDescriptorList.add( - chatConfigHelper.chatConfigDO2Descriptor(chaConfigDO.getModelId(), chaConfigDO))); + chaConfigDescriptorList.add(chatConfigHelper + .chatConfigDO2Descriptor(chaConfigDO.getModelId(), chaConfigDO))); } return chaConfigDescriptorList; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatContextRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatContextRepositoryImpl.java index 627411496..cf82a2592 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatContextRepositoryImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatContextRepositoryImpl.java @@ -52,8 +52,9 @@ public class ChatContextRepositoryImpl implements ChatContextRepository { chatContext.setUser(contextDO.getUser()); chatContext.setQueryText(contextDO.getQueryText()); if (contextDO.getSemanticParse() != null && !contextDO.getSemanticParse().isEmpty()) { - log.info("--->: {}",contextDO.getSemanticParse()); - SemanticParseInfo semanticParseInfo = JsonUtil.toObject(contextDO.getSemanticParse(), SemanticParseInfo.class); + log.info("--->: {}", contextDO.getSemanticParse()); + SemanticParseInfo semanticParseInfo = JsonUtil.toObject(contextDO.getSemanticParse(), + SemanticParseInfo.class); chatContext.setParseInfo(semanticParseInfo); } return chatContext; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatQueryRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatQueryRepositoryImpl.java index bfbe2f884..0d99937c2 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatQueryRepositoryImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatQueryRepositoryImpl.java @@ -3,20 +3,30 @@ package com.tencent.supersonic.chat.persistence.repository.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; -import com.tencent.supersonic.chat.api.pojo.response.QueryResp; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import com.tencent.supersonic.chat.api.pojo.response.ParseResp; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.persistence.dataobject.ChatParseDO; import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDOExample; import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDOExample.Criteria; +import com.tencent.supersonic.chat.api.pojo.response.QueryResp; +import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; +import com.tencent.supersonic.chat.persistence.mapper.ChatParseMapper; import com.tencent.supersonic.chat.persistence.mapper.ChatQueryDOMapper; +import com.tencent.supersonic.chat.persistence.mapper.custom.ShowCaseCustomMapper; import com.tencent.supersonic.chat.persistence.repository.ChatQueryRepository; import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.common.util.PageUtils; + +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; + import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; @@ -29,8 +39,16 @@ public class ChatQueryRepositoryImpl implements ChatQueryRepository { private final ChatQueryDOMapper chatQueryDOMapper; - public ChatQueryRepositoryImpl(ChatQueryDOMapper chatQueryDOMapper) { + private final ChatParseMapper chatParseMapper; + + private final ShowCaseCustomMapper showCaseCustomMapper; + + public ChatQueryRepositoryImpl(ChatQueryDOMapper chatQueryDOMapper, + ChatParseMapper chatParseMapper, + ShowCaseCustomMapper showCaseCustomMapper) { this.chatQueryDOMapper = chatQueryDOMapper; + this.chatParseMapper = chatParseMapper; + this.showCaseCustomMapper = showCaseCustomMapper; } @Override @@ -47,18 +65,27 @@ public class ChatQueryRepositoryImpl implements ChatQueryRepository { PageInfo chatQueryVOPageInfo = PageUtils.pageInfo2PageInfoVo(pageInfo); chatQueryVOPageInfo.setList( - pageInfo.getList().stream().map(this::convertTo) + pageInfo.getList().stream().filter(o -> !StringUtils.isEmpty(o.getQueryResult())).map(this::convertTo) .sorted(Comparator.comparingInt(o -> o.getQuestionId().intValue())) .collect(Collectors.toList())); return chatQueryVOPageInfo; } + @Override + public List queryShowCase(PageQueryInfoReq pageQueryInfoCommend, int agentId) { + return showCaseCustomMapper.queryShowCase(pageQueryInfoCommend.getCurrent(), + pageQueryInfoCommend.getPageSize(), agentId).stream().map(this::convertTo) + .collect(Collectors.toList()); + } + private QueryResp convertTo(ChatQueryDO chatQueryDO) { QueryResp queryResponse = new QueryResp(); BeanUtils.copyProperties(chatQueryDO, queryResponse); QueryResult queryResult = JsonUtil.toObject(chatQueryDO.getQueryResult(), QueryResult.class); - queryResult.setQueryId(chatQueryDO.getQuestionId()); - queryResponse.setQueryResult(queryResult); + if (queryResult != null) { + queryResult.setQueryId(chatQueryDO.getQuestionId()); + queryResponse.setQueryResult(queryResult); + } return queryResponse; } @@ -71,12 +98,63 @@ public class ChatQueryRepositoryImpl implements ChatQueryRepository { chatQueryDO.setQueryState(queryResult.getQueryState().ordinal()); chatQueryDO.setQueryText(chatCtx.getQueryText()); chatQueryDO.setQueryResult(JsonUtil.toString(queryResult)); + chatQueryDO.setAgentId(chatCtx.getAgentId()); chatQueryDOMapper.insert(chatQueryDO); ChatQueryDO lastChatQuery = getLastChatQuery(chatCtx.getChatId()); Long queryId = lastChatQuery.getQuestionId(); queryResult.setQueryId(queryId); } + public Long createChatParse(ParseResp parseResult, ChatContext chatCtx, QueryReq queryReq) { + ChatQueryDO chatQueryDO = new ChatQueryDO(); + chatQueryDO.setChatId(Long.valueOf(chatCtx.getChatId())); + chatQueryDO.setCreateTime(new java.util.Date()); + chatQueryDO.setUserName(queryReq.getUser().getName()); + chatQueryDO.setQueryText(queryReq.getQueryText()); + chatQueryDO.setAgentId(queryReq.getAgentId()); + chatQueryDO.setQueryResult(""); + try { + chatQueryDOMapper.insert(chatQueryDO); + } catch (Exception e) { + log.info("database insert has an exception:{}", e.toString()); + } + + ChatQueryDO lastChatQuery = getLastChatQuery(chatCtx.getChatId()); + Long queryId = lastChatQuery.getQuestionId(); + parseResult.setQueryId(queryId); + return queryId; + } + + public Boolean batchSaveParseInfo(ChatContext chatCtx, QueryReq queryReq, + ParseResp parseResult, + List candidateParses, + List selectedParses) { + Long queryId = createChatParse(parseResult, chatCtx, queryReq); + List chatParseDOList = new ArrayList<>(); + log.info("candidateParses size:{},selectedParses size:{}", candidateParses.size(), selectedParses.size()); + getChatParseDO(chatCtx, queryReq, queryId, 0, 1, candidateParses, chatParseDOList); + getChatParseDO(chatCtx, queryReq, queryId, candidateParses.size(), 0, selectedParses, chatParseDOList); + Boolean save = chatParseMapper.batchSaveParseInfo(chatParseDOList); + return save; + } + + public void getChatParseDO(ChatContext chatCtx, QueryReq queryReq, Long queryId, int base, int isCandidate, + List parses, List chatParseDOList) { + for (int i = 0; i < parses.size(); i++) { + ChatParseDO chatParseDO = new ChatParseDO(); + parses.get(i).setId(base + i + 1); + chatParseDO.setChatId(Long.valueOf(chatCtx.getChatId())); + chatParseDO.setQuestionId(queryId); + chatParseDO.setQueryText(queryReq.getQueryText()); + chatParseDO.setParseInfo(JsonUtil.toString(parses.get(i))); + chatParseDO.setIsCandidate(isCandidate); + chatParseDO.setParseId(base + i + 1); + chatParseDO.setCreateTime(new java.util.Date()); + chatParseDO.setUserName(queryReq.getUser().getName()); + chatParseDOList.add(chatParseDO); + } + } + @Override public ChatQueryDO getLastChatQuery(long chatId) { ChatQueryDOExample example = new ChatQueryDOExample(); @@ -96,4 +174,13 @@ public class ChatQueryRepositoryImpl implements ChatQueryRepository { public int updateChatQuery(ChatQueryDO chatQueryDO) { return chatQueryDOMapper.updateByPrimaryKeyWithBLOBs(chatQueryDO); } + + public ChatParseDO getParseInfo(Long questionId, String userName, int parseId) { + return chatParseMapper.getParseInfo(questionId, userName, parseId); + } + + @Override + public Boolean deleteChatQuery(Long questionId) { + return chatQueryDOMapper.deleteByPrimaryKey(questionId); + } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/PluginRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/PluginRepositoryImpl.java index 101c97609..1b66b5c90 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/PluginRepositoryImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/PluginRepositoryImpl.java @@ -5,13 +5,14 @@ import com.tencent.supersonic.chat.persistence.dataobject.PluginDOExample; import com.tencent.supersonic.chat.persistence.mapper.PluginDOMapper; import com.tencent.supersonic.chat.persistence.repository.PluginRepository; import com.tencent.supersonic.common.util.ContextUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.util.Strings; +import org.springframework.stereotype.Repository; + import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import lombok.extern.slf4j.Slf4j; -import org.apache.logging.log4j.util.Strings; -import org.springframework.stereotype.Repository; @Repository @Slf4j diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/StatisticsRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/StatisticsRepositoryImpl.java new file mode 100644 index 000000000..7a8593944 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/StatisticsRepositoryImpl.java @@ -0,0 +1,29 @@ +package com.tencent.supersonic.chat.persistence.repository.impl; + +import com.tencent.supersonic.chat.persistence.dataobject.StatisticsDO; +import com.tencent.supersonic.chat.persistence.mapper.StatisticsMapper; +import com.tencent.supersonic.chat.persistence.repository.StatisticsRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@Primary +@Slf4j +public class StatisticsRepositoryImpl implements StatisticsRepository { + + private final StatisticsMapper statisticsMapper; + + public StatisticsRepositoryImpl(StatisticsMapper statisticsMapper) { + this.statisticsMapper = statisticsMapper; + } + + public boolean batchSaveStatistics(List list) { + return statisticsMapper.batchSaveStatistics(list); + } + + ; + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginManager.java b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginManager.java index c1f1611ad..b8f1b329a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginManager.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginManager.java @@ -3,15 +3,17 @@ package com.tencent.supersonic.chat.plugin; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import com.tencent.supersonic.chat.agent.tool.DslTool; -import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.agent.Agent; import com.tencent.supersonic.chat.agent.tool.AgentToolType; import com.tencent.supersonic.chat.agent.tool.PluginTool; -import com.tencent.supersonic.chat.parser.ParseMode; -import com.tencent.supersonic.chat.parser.embedding.EmbeddingConfig; -import com.tencent.supersonic.chat.parser.embedding.EmbeddingResp; -import com.tencent.supersonic.chat.parser.embedding.RecallRetrieval; +import com.tencent.supersonic.chat.parser.plugin.embedding.EmbeddingConfig; +import com.tencent.supersonic.chat.parser.plugin.embedding.EmbeddingResp; +import com.tencent.supersonic.chat.parser.plugin.embedding.RecallRetrieval; import com.tencent.supersonic.chat.plugin.event.PluginAddEvent; import com.tencent.supersonic.chat.plugin.event.PluginUpdateEvent; import com.tencent.supersonic.chat.query.plugin.ParamOption; @@ -20,10 +22,16 @@ import com.tencent.supersonic.chat.service.AgentService; import com.tencent.supersonic.chat.service.PluginService; import com.tencent.supersonic.common.util.ContextUtils; import java.net.URI; -import java.util.*; +import java.util.List; +import java.util.Collection; +import java.util.Set; +import java.util.Optional; +import java.util.HashSet; +import java.util.HashMap; +import java.util.Objects; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; -import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -31,7 +39,11 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.util.Strings; import org.springframework.context.event.EventListener; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.*; +import org.springframework.http.ResponseEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.HttpEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; @@ -149,9 +161,6 @@ public class PluginManager { } public void requestEmbeddingPluginAddALL(List plugins) { - plugins = plugins.stream() - .filter(plugin -> ParseMode.EMBEDDING_RECALL.equals(plugin.getParseMode())) - .collect(Collectors.toList()); requestEmbeddingPluginAdd(convert(plugins)); } @@ -229,11 +238,11 @@ public class PluginManager { } List paramOptions = getSemanticOption(plugin); if (CollectionUtils.isEmpty(paramOptions)) { - return Pair.of(true, Sets.newHashSet()); + return Pair.of(true, pluginMatchedModel); } Set matchedModel = Sets.newHashSet(); - Map> paramOptionMap = paramOptions.stream(). - collect(Collectors.groupingBy(ParamOption::getModelId)); + Map> paramOptionMap = paramOptions.stream() + .collect(Collectors.groupingBy(ParamOption::getModelId)); for (Long modelId : paramOptionMap.keySet()) { List params = paramOptionMap.get(modelId); if (CollectionUtils.isEmpty(params)) { @@ -268,8 +277,8 @@ public class PluginManager { return Sets.newHashSet(); } return schemaElementMatches.stream().filter(schemaElementMatch -> - SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType()) || - SchemaElementType.ID.equals(schemaElementMatch.getElement().getType())) + SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType()) + || SchemaElementType.ID.equals(schemaElementMatch.getElement().getType())) .map(SchemaElementMatch::getElement) .map(SchemaElement::getId) .collect(Collectors.toSet()); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginParseConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginParseConfig.java index d207e586a..5fabd1ce9 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginParseConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/PluginParseConfig.java @@ -1,12 +1,13 @@ package com.tencent.supersonic.chat.plugin; -import com.tencent.supersonic.chat.parser.function.Parameters; -import java.io.Serializable; -import java.util.List; +import com.tencent.supersonic.chat.parser.plugin.function.Parameters; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; + +import java.io.Serializable; +import java.util.List; import lombok.NoArgsConstructor; import lombok.ToString; @@ -17,12 +18,12 @@ import lombok.ToString; @NoArgsConstructor public class PluginParseConfig implements Serializable { - private String name; - - private String description; - public Parameters parameters; public List examples; + private String name; + + private String description; + } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/HeuristicQuerySelector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/HeuristicQuerySelector.java index 7f14b46d0..eb3043ae2 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/HeuristicQuerySelector.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/HeuristicQuerySelector.java @@ -5,11 +5,13 @@ import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; + +import java.util.List; +import java.util.ArrayList; +import java.util.OptionalDouble; + import com.tencent.supersonic.chat.query.rule.metric.MetricEntityQuery; import com.tencent.supersonic.chat.query.rule.metric.MetricModelQuery; -import java.util.ArrayList; -import java.util.List; -import java.util.OptionalDouble; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -50,8 +52,8 @@ public class HeuristicQuerySelector implements QuerySelector { return true; } for (SemanticQuery candidateQuery : candidateQueries) { - if (candidateQuery.getQueryMode().equals(MetricEntityQuery.QUERY_MODE) && - semanticQuery.getParseInfo().getScore() == candidateQuery.getParseInfo().getScore()) { + if (candidateQuery.getQueryMode().equals(MetricEntityQuery.QUERY_MODE) + && semanticQuery.getParseInfo().getScore() == candidateQuery.getParseInfo().getScore()) { return false; } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/FieldCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/FieldCorrector.java deleted file mode 100644 index 1ff0f1ed2..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/FieldCorrector.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tencent.supersonic.chat.query.dsl.optimizer; - -import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; -import com.tencent.supersonic.common.util.jsqlparser.CCJSqlParserUtils; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class FieldCorrector extends BaseDSLOptimizer { - - @Override - public CorrectionInfo rewriter(CorrectionInfo correctionInfo) { - String replaceFields = CCJSqlParserUtils.replaceFields(correctionInfo.getSql(), - getFieldToBizName(correctionInfo.getParseInfo().getModelId())); - correctionInfo.setSql(replaceFields); - return correctionInfo; - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/FunctionCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/FunctionCorrector.java deleted file mode 100644 index f5cf6af4c..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/optimizer/FunctionCorrector.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tencent.supersonic.chat.query.dsl.optimizer; - -import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; -import com.tencent.supersonic.common.util.jsqlparser.CCJSqlParserUtils; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class FunctionCorrector extends BaseDSLOptimizer { - - @Override - public CorrectionInfo rewriter(CorrectionInfo correctionInfo) { - String replaceFunction = CCJSqlParserUtils.replaceFunction(correctionInfo.getSql()); - correctionInfo.setSql(replaceFunction); - return correctionInfo; - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/DSLQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/DslQuery.java similarity index 69% rename from chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/DSLQuery.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/DslQuery.java index 2971ddc97..64b97bbf0 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/DSLQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/DslQuery.java @@ -1,15 +1,12 @@ -package com.tencent.supersonic.chat.query.dsl; +package com.tencent.supersonic.chat.query.llm.dsl; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.api.pojo.response.QueryState; import com.tencent.supersonic.chat.parser.llm.dsl.DSLParseResult; import com.tencent.supersonic.chat.query.QueryManager; -import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; -import com.tencent.supersonic.chat.api.component.DSLOptimizer; import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; import com.tencent.supersonic.chat.service.SemanticService; import com.tencent.supersonic.chat.utils.ComponentFactory; @@ -29,12 +26,12 @@ import org.springframework.stereotype.Component; @Slf4j @Component -public class DSLQuery extends PluginSemanticQuery { +public class DslQuery extends PluginSemanticQuery { public static final String QUERY_MODE = "DSL"; protected SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - public DSLQuery() { + public DslQuery() { QueryManager.register(this); } @@ -48,31 +45,12 @@ public class DSLQuery extends PluginSemanticQuery { String json = JsonUtil.toString(parseInfo.getProperties().get(Constants.CONTEXT)); DSLParseResult dslParseResult = JsonUtil.toObject(json, DSLParseResult.class); LLMResp llmResp = dslParseResult.getLlmResp(); - QueryReq queryReq = dslParseResult.getRequest(); - - CorrectionInfo correctionInfo = CorrectionInfo.builder() - .queryFilters(queryReq.getQueryFilters()) - .sql(llmResp.getSqlOutput()) - .parseInfo(parseInfo) - .build(); - - List DSLCorrections = ComponentFactory.getSqlCorrections(); - - DSLCorrections.forEach(DSLCorrection -> { - try { - DSLCorrection.rewriter(correctionInfo); - log.info("sqlCorrection:{} sql:{}", DSLCorrection.getClass().getSimpleName(), correctionInfo.getSql()); - } catch (Exception e) { - log.error("sqlCorrection:{} execute error,correctionInfo:{}", DSLCorrection, correctionInfo, e); - } - }); - String querySql = correctionInfo.getSql(); long startTime = System.currentTimeMillis(); - QueryDslReq queryDslReq = QueryReqBuilder.buildDslReq(querySql, parseInfo.getModelId()); + QueryDslReq queryDslReq = QueryReqBuilder.buildDslReq(llmResp.getCorrectorSql(), parseInfo.getModelId()); QueryResultWithSchemaResp queryResp = semanticLayer.queryByDsl(queryDslReq, user); - log.info("queryByDsl cost:{},querySql:{}", System.currentTimeMillis() - startTime, querySql); + log.info("queryByDsl cost:{},querySql:{}", System.currentTimeMillis() - startTime, llmResp.getSqlOutput()); QueryResult queryResult = new QueryResult(); if (Objects.nonNull(queryResp)) { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/LLMReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/LLMReq.java similarity index 90% rename from chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/LLMReq.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/LLMReq.java index acce57c7e..1dbebeb61 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/LLMReq.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/LLMReq.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.query.dsl; +package com.tencent.supersonic.chat.query.llm.dsl; import java.util.List; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/LLMResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/LLMResp.java similarity index 76% rename from chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/LLMResp.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/LLMResp.java index 6b1718ecd..a7ead1e87 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/LLMResp.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/LLMResp.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.query.dsl; +package com.tencent.supersonic.chat.query.llm.dsl; import java.util.List; import lombok.Data; @@ -17,4 +17,6 @@ public class LLMResp { private String schemaLinkingOutput; private String schemaLinkStr; + + private String correctorSql; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/metricInterpret/LLmAnswerReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/metricInterpret/LLmAnswerReq.java index bab24c6ca..6f996b587 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/metricInterpret/LLmAnswerReq.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/metricInterpret/LLmAnswerReq.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.query.metricInterpret; +package com.tencent.supersonic.chat.query.metricinterpret; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/metricInterpret/LLmAnswerResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/metricInterpret/LLmAnswerResp.java index 32f4991ea..5ef6a8d27 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/metricInterpret/LLmAnswerResp.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/metricInterpret/LLmAnswerResp.java @@ -1,11 +1,9 @@ -package com.tencent.supersonic.chat.query.metricInterpret; - +package com.tencent.supersonic.chat.query.metricinterpret; import lombok.Data; @Data public class LLmAnswerResp { - - private String assistant_message; + private String assistantMessage; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/metricInterpret/MetricInterpretQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/metricInterpret/MetricInterpretQuery.java index 2c48f1fe1..49f8b444e 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/metricInterpret/MetricInterpretQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/metricInterpret/MetricInterpretQuery.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.query.metricInterpret; +package com.tencent.supersonic.chat.query.metricinterpret; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; @@ -26,7 +26,11 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import java.util.*; + +import java.util.Map; +import java.util.HashMap; +import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Slf4j @@ -34,17 +38,17 @@ import java.util.stream.Collectors; public class MetricInterpretQuery extends PluginSemanticQuery { - public final static String QUERY_MODE = "METRIC_INTERPRET"; + public static final String QUERY_MODE = "METRIC_INTERPRET"; + + public MetricInterpretQuery() { + QueryManager.register(this); + } @Override public String getQueryMode() { return QUERY_MODE; } - public MetricInterpretQuery() { - QueryManager.register(this); - } - @Override public QueryResult execute(User user) throws SqlParseException { QueryStructReq queryStructReq = QueryReqBuilder.buildStructReq(parseInfo); @@ -55,10 +59,11 @@ public class MetricInterpretQuery extends PluginSemanticQuery { String text = generateTableText(queryResultWithSchemaResp); Map properties = parseInfo.getProperties(); Map replacedMap = new HashMap<>(); - String textReplaced = replaceText((String) properties.get("queryText"), parseInfo.getElementMatches(), replacedMap); + String textReplaced = replaceText((String) properties.get("queryText"), + parseInfo.getElementMatches(), replacedMap); String answer = replaceAnswer(fetchInterpret(textReplaced, text), replacedMap); QueryResult queryResult = new QueryResult(); - List queryColumns = Lists.newArrayList(new QueryColumn("结果","string","answer")); + List queryColumns = Lists.newArrayList(new QueryColumn("结果", "string", "answer")); Map result = new HashMap<>(); result.put("answer", answer); List> resultList = Lists.newArrayList(); @@ -70,7 +75,8 @@ public class MetricInterpretQuery extends PluginSemanticQuery { return queryResult; } - private String replaceText(String text, List schemaElementMatches, Map replacedMap) { + private String replaceText(String text, List schemaElementMatches, + Map replacedMap) { if (CollectionUtils.isEmpty(schemaElementMatches)) { return text; } @@ -134,10 +140,10 @@ public class MetricInterpretQuery extends PluginSemanticQuery { JSONObject.toJSONString(lLmAnswerReq)); LLmAnswerResp lLmAnswerResp = JSONObject.parseObject(responseEntity.getBody(), LLmAnswerResp.class); if (lLmAnswerResp != null) { - return lLmAnswerResp.getAssistant_message(); + return lLmAnswerResp.getAssistantMessage(); } return null; } -} \ No newline at end of file +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java index 82f51f705..29df82412 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java @@ -2,14 +2,15 @@ package com.tencent.supersonic.chat.query.plugin.webpage; import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.pojo.*; +import com.tencent.supersonic.chat.api.pojo.ModelSchema; +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.api.pojo.response.QueryState; -import com.tencent.supersonic.chat.api.pojo.response.ChatConfigRichResp; import com.tencent.supersonic.chat.plugin.Plugin; import com.tencent.supersonic.chat.plugin.PluginParseResult; import com.tencent.supersonic.chat.query.QueryManager; @@ -17,7 +18,6 @@ import com.tencent.supersonic.chat.query.plugin.ParamOption; import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; import com.tencent.supersonic.chat.query.plugin.WebBase; import com.tencent.supersonic.chat.query.plugin.WebBaseResult; -import com.tencent.supersonic.chat.service.ConfigService; import com.tencent.supersonic.chat.service.SemanticService; import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.util.ContextUtils; @@ -26,8 +26,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import java.util.*; -import java.util.stream.Collectors; +import java.util.List; +import java.util.Map; +import java.util.HashMap; @Slf4j @Component @@ -49,8 +50,8 @@ public class WebPageQuery extends PluginSemanticQuery { QueryResult queryResult = new QueryResult(); queryResult.setQueryMode(QUERY_MODE); Map properties = parseInfo.getProperties(); - PluginParseResult pluginParseResult = JsonUtil.toObject(JsonUtil.toString(properties.get(Constants.CONTEXT)) - , PluginParseResult.class); + PluginParseResult pluginParseResult = JsonUtil.toObject(JsonUtil.toString(properties.get(Constants.CONTEXT)), + PluginParseResult.class); WebPageResponse webPageResponse = buildResponse(pluginParseResult); queryResult.setResponse(webPageResponse); SemanticService semanticService = ContextUtils.getBean(SemanticService.class); @@ -111,10 +112,14 @@ public class WebPageQuery extends PluginSemanticQuery { Object queryFilterValue = filterValueMap.get(schemaElementMatch.getElement().getId()); if (queryFilterValue != null) { if (String.valueOf(queryFilterValue).equals(String.valueOf(schemaElementMatch.getWord()))) { - elementValueMap.put(String.valueOf(schemaElementMatch.getElement().getId()), schemaElementMatch.getWord()); + elementValueMap.put( + String.valueOf(schemaElementMatch.getElement().getId()), + schemaElementMatch.getWord()); } } else { - elementValueMap.computeIfAbsent(String.valueOf(schemaElementMatch.getElement().getId()), k -> schemaElementMatch.getWord()); + elementValueMap.computeIfAbsent( + String.valueOf(schemaElementMatch.getElement().getId()), + k -> schemaElementMatch.getWord()); } }); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceQuery.java index 50c20832c..d03ae402b 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceQuery.java @@ -11,10 +11,10 @@ import com.tencent.supersonic.chat.query.plugin.ParamOption; import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; import com.tencent.supersonic.chat.query.plugin.WebBase; import com.tencent.supersonic.common.pojo.Constants; -import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.common.util.ContextUtils; + import java.net.URI; -import java.util.HashMap; import java.util.List; import java.util.Map; import lombok.extern.slf4j.Slf4j; @@ -28,6 +28,9 @@ import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import java.util.HashMap; + + @Slf4j @Component public class WebServiceQuery extends PluginSemanticQuery { @@ -50,8 +53,8 @@ public class WebServiceQuery extends PluginSemanticQuery { QueryResult queryResult = new QueryResult(); queryResult.setQueryMode(QUERY_MODE); Map properties = parseInfo.getProperties(); - PluginParseResult pluginParseResult = JsonUtil.toObject(JsonUtil.toString(properties.get(Constants.CONTEXT)), - PluginParseResult.class); + PluginParseResult pluginParseResult = JsonUtil.toObject( + JsonUtil.toString(properties.get(Constants.CONTEXT)), PluginParseResult.class); WebServiceResponse webServiceResponse = buildResponse(pluginParseResult); queryResult.setResponse(webServiceResponse); queryResult.setQueryState(QueryState.SUCCESS); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceResponse.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceResponse.java index c011866d3..bab6c3c7f 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceResponse.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceResponse.java @@ -3,6 +3,7 @@ package com.tencent.supersonic.chat.query.plugin.webservice; import com.tencent.supersonic.chat.query.plugin.WebBase; import lombok.Data; + @Data public class WebServiceResponse { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/RuleSemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/RuleSemanticQuery.java index 873354b5f..2633c4c21 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/RuleSemanticQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/RuleSemanticQuery.java @@ -55,9 +55,9 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { parseInfo.setQueryMode(getQueryMode()); SemanticService schemaService = ContextUtils.getBean(SemanticService.class); - ModelSchema ModelSchema = schemaService.getModelSchema(modelId); + ModelSchema modelSchema = schemaService.getModelSchema(modelId); - fillSchemaElement(parseInfo, ModelSchema); + fillSchemaElement(parseInfo, modelSchema); fillScore(parseInfo); fillDateConf(parseInfo, chatContext.getParseInfo()); } @@ -83,8 +83,8 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { Map maxSimilarityMatch = new HashMap<>(); for (SchemaElementMatch match : parseInfo.getElementMatches()) { SchemaElementType type = match.getElement().getType(); - if (!maxSimilarityMatch.containsKey(type) || - match.getSimilarity() > maxSimilarityMatch.get(type).getSimilarity()) { + if (!maxSimilarityMatch.containsKey(type) + || match.getSimilarity() > maxSimilarityMatch.get(type).getSimilarity()) { maxSimilarityMatch.put(type, match); } } @@ -96,8 +96,8 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { parseInfo.setScore(parseInfo.getScore() + totalScore); } - private void fillSchemaElement(SemanticParseInfo parseInfo, ModelSchema ModelSchema) { - parseInfo.setModel(ModelSchema.getModel()); + private void fillSchemaElement(SemanticParseInfo parseInfo, ModelSchema modelSchema) { + parseInfo.setModel(modelSchema.getModel()); Map> dim2Values = new HashMap<>(); Map> id2Values = new HashMap<>(); @@ -106,7 +106,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { SchemaElement element = schemaMatch.getElement(); switch (element.getType()) { case ID: - SchemaElement entityElement = ModelSchema.getElement(SchemaElementType.ENTITY, element.getId()); + SchemaElement entityElement = modelSchema.getElement(SchemaElementType.ENTITY, element.getId()); if (entityElement != null) { if (id2Values.containsKey(element.getId())) { id2Values.get(element.getId()).add(schemaMatch); @@ -116,7 +116,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { } break; case VALUE: - SchemaElement dimElement = ModelSchema.getElement(SchemaElementType.DIMENSION, element.getId()); + SchemaElement dimElement = modelSchema.getElement(SchemaElementType.DIMENSION, element.getId()); if (dimElement != null) { if (dim2Values.containsKey(element.getId())) { dim2Values.get(element.getId()).add(schemaMatch); @@ -140,7 +140,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { if (!id2Values.isEmpty()) { for (Map.Entry> entry : id2Values.entrySet()) { - SchemaElement entity = ModelSchema.getElement(SchemaElementType.ENTITY, entry.getKey()); + SchemaElement entity = modelSchema.getElement(SchemaElementType.ENTITY, entry.getKey()); if (entry.getValue().size() == 1) { SchemaElementMatch schemaMatch = entry.getValue().get(0); @@ -151,7 +151,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { dimensionFilter.setOperator(FilterOperatorEnum.EQUALS); dimensionFilter.setElementID(schemaMatch.getElement().getId()); parseInfo.getDimensionFilters().add(dimensionFilter); - parseInfo.setEntity(ModelSchema.getEntity()); + parseInfo.setEntity(modelSchema.getEntity()); } else { QueryFilter dimensionFilter = new QueryFilter(); List vals = new ArrayList<>(); @@ -168,7 +168,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { if (!dim2Values.isEmpty()) { for (Map.Entry> entry : dim2Values.entrySet()) { - SchemaElement dimension = ModelSchema.getElement(SchemaElementType.DIMENSION, entry.getKey()); + SchemaElement dimension = modelSchema.getElement(SchemaElementType.DIMENSION, entry.getKey()); if (entry.getValue().size() == 1) { SchemaElementMatch schemaMatch = entry.getValue().get(0); @@ -179,7 +179,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { dimensionFilter.setOperator(FilterOperatorEnum.EQUALS); dimensionFilter.setElementID(schemaMatch.getElement().getId()); parseInfo.getDimensionFilters().add(dimensionFilter); - parseInfo.setEntity(ModelSchema.getEntity()); + parseInfo.setEntity(modelSchema.getEntity()); } else { QueryFilter dimensionFilter = new QueryFilter(); List vals = new ArrayList<>(); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityDetailQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityDetailQuery.java index 83edfab1e..7c3d2ed1f 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityDetailQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityDetailQuery.java @@ -2,8 +2,8 @@ package com.tencent.supersonic.chat.query.rule.entity; import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.DIMENSION; import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ID; -import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; import org.springframework.stereotype.Component; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityFilterQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityFilterQuery.java index bc88440c3..e5d1ec561 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityFilterQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityFilterQuery.java @@ -1,9 +1,8 @@ package com.tencent.supersonic.chat.query.rule.entity; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; -import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.OPTIONAL; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.VALUE; import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; -import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.*; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityListQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityListQuery.java index 2ee4bf18f..e1dce47ee 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityListQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntityListQuery.java @@ -1,9 +1,9 @@ package com.tencent.supersonic.chat.query.rule.entity; +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.ModelSchema; -import com.tencent.supersonic.chat.api.pojo.QueryContext; -import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.response.ChatConfigRichResp; import com.tencent.supersonic.chat.api.pojo.response.ChatDefaultRichConfigResp; @@ -12,6 +12,7 @@ import com.tencent.supersonic.chat.service.SemanticService; import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.Order; import com.tencent.supersonic.common.util.ContextUtils; + import java.util.LinkedHashSet; import java.util.Objects; import java.util.Set; @@ -30,15 +31,15 @@ public abstract class EntityListQuery extends EntitySemanticQuery { ConfigService configService = ContextUtils.getBean(ConfigService.class); ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(parseInfo.getModelId()); SemanticService schemaService = ContextUtils.getBean(SemanticService.class); - ModelSchema ModelSchema = schemaService.getModelSchema(modelId); + ModelSchema modelSchema = schemaService.getModelSchema(modelId); if (chaConfigRichDesc != null && chaConfigRichDesc.getChatDetailRichConfig() != null - && Objects.nonNull(ModelSchema) && Objects.nonNull(ModelSchema.getEntity())) { + && Objects.nonNull(modelSchema) && Objects.nonNull(modelSchema.getEntity())) { Set dimensions = new LinkedHashSet(); Set metrics = new LinkedHashSet(); Set orders = new LinkedHashSet(); - ChatDefaultRichConfigResp chatDefaultConfig = chaConfigRichDesc.getChatDetailRichConfig() - .getChatDefaultConfig(); + ChatDefaultRichConfigResp chatDefaultConfig = chaConfigRichDesc + .getChatDetailRichConfig().getChatDefaultConfig(); if (chatDefaultConfig != null) { chatDefaultConfig.getMetrics().stream() .forEach(metric -> { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricEntityQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricEntityQuery.java index db9697259..f07749a93 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricEntityQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricEntityQuery.java @@ -1,23 +1,24 @@ package com.tencent.supersonic.chat.query.rule.metric; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ENTITY; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ID; -import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; -import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; - import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import com.tencent.supersonic.semantic.api.query.pojo.Filter; import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; + +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ID; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ENTITY; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; @Slf4j @Component diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricGroupByQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricGroupByQuery.java index 23c987178..a125cabeb 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricGroupByQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricGroupByQuery.java @@ -1,12 +1,12 @@ package com.tencent.supersonic.chat.query.rule.metric; +import org.springframework.stereotype.Component; + import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.DIMENSION; import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.VALUE; import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.OPTIONAL; -import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; - -import org.springframework.stereotype.Component; +import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; @Component public class MetricGroupByQuery extends MetricSemanticQuery { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/AgentController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/AgentController.java index 49c6c5474..79a41b5ab 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/AgentController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/AgentController.java @@ -4,13 +4,19 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; import com.tencent.supersonic.chat.agent.Agent; import com.tencent.supersonic.chat.service.AgentService; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; @RestController -@RequestMapping("/api/chat/agent") +@RequestMapping({"/api/chat/agent", "/openapi/chat/agent"}) public class AgentController { private AgentService agentService; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatConfigController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatConfigController.java index 6f34d8dda..88612800a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatConfigController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatConfigController.java @@ -9,7 +9,6 @@ import com.tencent.supersonic.chat.api.pojo.request.ChatConfigEditReqReq; import com.tencent.supersonic.chat.api.pojo.request.ChatConfigFilter; import com.tencent.supersonic.chat.api.pojo.response.ChatConfigResp; import com.tencent.supersonic.chat.api.pojo.response.ChatConfigRichResp; -import com.tencent.supersonic.chat.service.ConfigService; import com.tencent.supersonic.chat.utils.ComponentFactory; import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; @@ -18,9 +17,12 @@ import com.tencent.supersonic.semantic.api.model.response.DimensionResp; import com.tencent.supersonic.semantic.api.model.response.DomainResp; import com.tencent.supersonic.semantic.api.model.response.MetricResp; import com.tencent.supersonic.semantic.api.model.response.ModelResp; +import com.tencent.supersonic.chat.service.ConfigService; + import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -44,16 +46,16 @@ public class ChatConfigController { @PostMapping public Long addChatConfig(@RequestBody ChatConfigBaseReq extendBaseCmd, - HttpServletRequest request, - HttpServletResponse response) { + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return configService.addConfig(extendBaseCmd, user); } @PutMapping public Long editModelExtend(@RequestBody ChatConfigEditReqReq extendEditCmd, - HttpServletRequest request, - HttpServletResponse response) { + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return configService.editConfig(extendEditCmd, user); } @@ -61,8 +63,8 @@ public class ChatConfigController { @PostMapping("/search") public List search(@RequestBody ChatConfigFilter filter, - HttpServletRequest request, - HttpServletResponse response) { + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return configService.search(filter, user); } @@ -80,44 +82,44 @@ public class ChatConfigController { @GetMapping("/modelList/{domainId}") public List getModelList(@PathVariable("domainId") Long domainId, - HttpServletRequest request, - HttpServletResponse response) { + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return semanticLayer.getModelList(AuthType.ADMIN, domainId, user); } - @GetMapping("/domainList") - public List getDomainList(HttpServletRequest request, - HttpServletResponse response) { - User user = UserHolder.findUser(request, response); - return semanticLayer.getDomainList(user); - } - @GetMapping("/modelList") public List getModelList(HttpServletRequest request, - HttpServletResponse response) { + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return semanticLayer.getModelList(AuthType.ADMIN, null, user); } + @GetMapping("/domainList") + public List getDomainList(HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + return semanticLayer.getDomainList(user); + } + @GetMapping("/modelList/view") public List getModelListVisible(HttpServletRequest request, - HttpServletResponse response) { + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return semanticLayer.getModelList(AuthType.VISIBLE, null, user); } @PostMapping("/dimension/page") public PageInfo getDimension(@RequestBody PageDimensionReq pageDimensionCmd, - HttpServletRequest request, - HttpServletResponse response) { + HttpServletRequest request, + HttpServletResponse response) { return semanticLayer.getDimensionPage(pageDimensionCmd); } @PostMapping("/metric/page") public PageInfo getMetric(@RequestBody PageMetricReq pageMetrricCmd, - HttpServletRequest request, - HttpServletResponse response) { + HttpServletRequest request, + HttpServletResponse response) { return semanticLayer.getMetricPage(pageMetrricCmd); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatController.java index d836660eb..fd74ca0f1 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatController.java @@ -3,9 +3,10 @@ package com.tencent.supersonic.chat.rest; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; -import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; -import com.tencent.supersonic.chat.api.pojo.response.QueryResp; +import com.tencent.supersonic.chat.api.pojo.response.ShowCaseResp; import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; +import com.tencent.supersonic.chat.api.pojo.response.QueryResp; +import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; import com.tencent.supersonic.chat.service.ChatService; import java.util.List; import javax.servlet.http.HttpServletRequest; @@ -69,11 +70,17 @@ public class ChatController { @PostMapping("/pageQueryInfo") public PageInfo pageQueryInfo(@RequestBody PageQueryInfoReq pageQueryInfoCommand, - @RequestParam(value = "chatId") long chatId, - HttpServletRequest request, - HttpServletResponse response) { + @RequestParam(value = "chatId") long chatId, + HttpServletRequest request, + HttpServletResponse response) { pageQueryInfoCommand.setUserName(UserHolder.findUser(request, response).getName()); return chatService.queryInfo(pageQueryInfoCommand, chatId); } + @PostMapping("/queryShowCase") + public ShowCaseResp queryShowCase(@RequestBody PageQueryInfoReq pageQueryInfoCommand, + @RequestParam(value = "agentId") int agentId) { + return chatService.queryShowCase(pageQueryInfoCommand, agentId); + } + } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatQueryController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatQueryController.java index 43702f9c1..45f0aecfc 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatQueryController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatQueryController.java @@ -3,8 +3,8 @@ package com.tencent.supersonic.chat.rest; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; import com.tencent.supersonic.chat.api.pojo.request.ExecuteQueryReq; -import com.tencent.supersonic.chat.api.pojo.request.QueryDataReq; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import com.tencent.supersonic.chat.api.pojo.request.QueryDataReq; import com.tencent.supersonic.chat.service.QueryService; import com.tencent.supersonic.chat.service.SearchService; import javax.servlet.http.HttpServletRequest; @@ -33,7 +33,7 @@ public class ChatQueryController { @PostMapping("search") public Object search(@RequestBody QueryReq queryCtx, HttpServletRequest request, - HttpServletResponse response) { + HttpServletResponse response) { queryCtx.setUser(UserHolder.findUser(request, response)); return searchService.search(queryCtx); } @@ -53,8 +53,8 @@ public class ChatQueryController { } @PostMapping("execute") - public Object execute(@RequestBody ExecuteQueryReq queryCtx, HttpServletRequest request, - HttpServletResponse response) + public Object execute(@RequestBody ExecuteQueryReq queryCtx, + HttpServletRequest request, HttpServletResponse response) throws Exception { queryCtx.setUser(UserHolder.findUser(request, response)); return queryService.performExecution(queryCtx); @@ -62,14 +62,14 @@ public class ChatQueryController { @PostMapping("queryContext") public Object queryContext(@RequestBody QueryReq queryCtx, HttpServletRequest request, - HttpServletResponse response) throws Exception { + HttpServletResponse response) throws Exception { queryCtx.setUser(UserHolder.findUser(request, response)); return queryService.queryContext(queryCtx); } @PostMapping("queryData") - public Object queryData(@RequestBody QueryDataReq queryData, HttpServletRequest request, - HttpServletResponse response) + public Object queryData(@RequestBody QueryDataReq queryData, + HttpServletRequest request, HttpServletResponse response) throws Exception { return queryService.executeDirectQuery(queryData, UserHolder.findUser(request, response)); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/PluginController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/PluginController.java index 0202c7f98..32a1705ec 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/PluginController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/PluginController.java @@ -5,31 +5,29 @@ import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; import com.tencent.supersonic.chat.api.pojo.request.PluginQueryReq; import com.tencent.supersonic.chat.plugin.Plugin; import com.tencent.supersonic.chat.service.PluginService; -import java.util.List; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; @RestController @RequestMapping("/api/chat/plugin") public class PluginController { - private PluginService pluginService; - - public PluginController(PluginService pluginService) { - this.pluginService = pluginService; - } + @Autowired + protected PluginService pluginService; @PostMapping public boolean createPlugin(@RequestBody Plugin plugin, - HttpServletRequest httpServletRequest, - HttpServletResponse httpServletResponse) { + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse) { User user = UserHolder.findUser(httpServletRequest, httpServletResponse); pluginService.createPlugin(plugin, user); return true; @@ -37,8 +35,8 @@ public class PluginController { @PutMapping public boolean updatePlugin(@RequestBody Plugin plugin, - HttpServletRequest httpServletRequest, - HttpServletResponse httpServletResponse) { + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse) { User user = UserHolder.findUser(httpServletRequest, httpServletResponse); pluginService.updatePlugin(plugin, user); return true; @@ -57,8 +55,8 @@ public class PluginController { @PostMapping("/query") List query(@RequestBody PluginQueryReq pluginQueryReq, - HttpServletRequest httpServletRequest, - HttpServletResponse httpServletResponse) { + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse) { User user = UserHolder.findUser(httpServletRequest, httpServletResponse); return pluginService.queryWithAuthCheck(pluginQueryReq, user); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/RecommendController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/RecommendController.java index dbeb5a449..42021f944 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/RecommendController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/RecommendController.java @@ -5,15 +5,18 @@ import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.pojo.response.RecommendQuestionResp; import com.tencent.supersonic.chat.api.pojo.response.RecommendResp; import com.tencent.supersonic.chat.service.RecommendService; -import java.util.List; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; + +import java.util.List; /** * recommend controller @@ -27,9 +30,9 @@ public class RecommendController { @GetMapping("recommend/{modelId}") public RecommendResp recommend(@PathVariable("modelId") Long modelId, - @RequestParam(value = "limit", required = false) Long limit, - HttpServletRequest request, - HttpServletResponse response) { + @RequestParam(value = "limit", required = false) Long limit, + HttpServletRequest request, + HttpServletResponse response) { QueryReq queryCtx = new QueryReq(); queryCtx.setUser(UserHolder.findUser(request, response)); queryCtx.setModelId(modelId); @@ -38,9 +41,9 @@ public class RecommendController { @GetMapping("recommend/metric/{modelId}") public RecommendResp recommendMetricMode(@PathVariable("modelId") Long modelId, - @RequestParam(value = "limit", required = false) Long limit, - HttpServletRequest request, - HttpServletResponse response) { + @RequestParam(value = "limit", required = false) Long limit, + HttpServletRequest request, + HttpServletResponse response) { QueryReq queryCtx = new QueryReq(); queryCtx.setUser(UserHolder.findUser(request, response)); queryCtx.setModelId(modelId); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/AgentService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/AgentService.java index 2d247f6ea..8ce2308d8 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/AgentService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/AgentService.java @@ -2,7 +2,10 @@ package com.tencent.supersonic.chat.service; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.agent.Agent; +import com.tencent.supersonic.chat.agent.tool.AgentToolType; +import com.tencent.supersonic.chat.agent.tool.DslTool; import java.util.List; +import java.util.Set; public interface AgentService { @@ -15,5 +18,9 @@ public interface AgentService { Agent getAgent(Integer id); void deleteAgent(Integer id); - + + List getDslTools(Integer agentId, AgentToolType agentToolType); + + Set getDslToolsModelIds(Integer agentId, AgentToolType agentToolType); + } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/ChatService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/ChatService.java index 56ba6c806..df2a81e81 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/ChatService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/ChatService.java @@ -3,11 +3,16 @@ package com.tencent.supersonic.chat.service; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; -import com.tencent.supersonic.chat.api.pojo.response.QueryResp; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import com.tencent.supersonic.chat.api.pojo.response.ParseResp; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.api.pojo.response.ShowCaseResp; import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; +import com.tencent.supersonic.chat.persistence.dataobject.ChatParseDO; import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; +import com.tencent.supersonic.chat.api.pojo.response.QueryResp; +import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; import java.util.List; public interface ChatService { @@ -39,9 +44,22 @@ public interface ChatService { PageInfo queryInfo(PageQueryInfoReq pageQueryInfoCommend, long chatId); + ShowCaseResp queryShowCase(PageQueryInfoReq pageQueryInfoCommend, int agentId); + public void addQuery(QueryResult queryResult, ChatContext chatCtx); + public void batchAddParse(ChatContext chatCtx, QueryReq queryReq, + ParseResp parseResult, + List candidateParses, + List selectedParses); + public ChatQueryDO getLastQuery(long chatId); public int updateQuery(ChatQueryDO chatQueryDO); + + public Boolean updateQuery(Long questionId, QueryResult queryResult, ChatContext chatCtx); + + public ChatParseDO getParseInfo(Long questionId, String userName, int parseId); + + public Boolean deleteChatQuery(Long questionId); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/SemanticService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/SemanticService.java index af1a43bd4..275a0ddaf 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/SemanticService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/SemanticService.java @@ -81,17 +81,17 @@ public class SemanticService { private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); public ModelSchema getModelSchema(Long id) { - ModelSchema ModelSchema = schemaService.getModelSchema(id); - if (!Objects.isNull(ModelSchema) && !Objects.isNull(ModelSchema.getModel())) { + ModelSchema modelSchema = schemaService.getModelSchema(id); + if (!Objects.isNull(modelSchema) && !Objects.isNull(modelSchema.getModel())) { ChatConfigResp chaConfigInfo = - configService.fetchConfigByModelId(ModelSchema.getModel().getId()); + configService.fetchConfigByModelId(modelSchema.getModel().getId()); // filter dimensions in blacklist - filterBlackDim(ModelSchema, chaConfigInfo); + filterBlackDim(modelSchema, chaConfigInfo); // filter metrics in blacklist - filterBlackMetric(ModelSchema, chaConfigInfo); + filterBlackMetric(modelSchema, chaConfigInfo); } - return ModelSchema; + return modelSchema; } public EntityInfo getEntityInfo(SemanticParseInfo parseInfo, User user) { @@ -103,20 +103,20 @@ public class SemanticService { return entityInfo; } if (entityInfo.getModelInfo() != null && entityInfo.getModelInfo().getPrimaryEntityBizName() != null) { - String ModelInfoPrimaryName = entityInfo.getModelInfo().getPrimaryEntityBizName(); - String ModelInfoId = ""; + String modelInfoPrimaryName = entityInfo.getModelInfo().getPrimaryEntityBizName(); + String modelInfoId = ""; for (QueryFilter chatFilter : parseInfo.getDimensionFilters()) { if (chatFilter != null && chatFilter.getBizName() != null && chatFilter.getBizName() - .equals(ModelInfoPrimaryName)) { + .equals(modelInfoPrimaryName)) { if (chatFilter.getOperator().equals(FilterOperatorEnum.EQUALS)) { - ModelInfoId = chatFilter.getValue().toString(); + modelInfoId = chatFilter.getValue().toString(); } } } - if (!"".equals(ModelInfoId)) { + if (!"".equals(modelInfoId)) { try { setMainModel(entityInfo, parseInfo.getModelId(), - ModelInfoId, user); + modelInfoId, user); return entityInfo; } catch (Exception e) { @@ -128,8 +128,8 @@ public class SemanticService { return null; } - public EntityInfo getEntityInfo(Long Model) { - ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(Model); + public EntityInfo getEntityInfo(Long model) { + ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(model); if (Objects.isNull(chaConfigRichDesc) || Objects.isNull(chaConfigRichDesc.getChatDetailRichConfig())) { return new EntityInfo(); } @@ -142,20 +142,20 @@ public class SemanticService { Long modelId = chaConfigRichDesc.getModelId(); if (Objects.nonNull(chaConfigRichDesc) && Objects.nonNull(modelId)) { SemanticService schemaService = ContextUtils.getBean(SemanticService.class); - ModelSchema ModelSchema = schemaService.getModelSchema(modelId); - if (Objects.isNull(ModelSchema) || Objects.isNull(ModelSchema.getEntity())) { + ModelSchema modelSchema = schemaService.getModelSchema(modelId); + if (Objects.isNull(modelSchema) || Objects.isNull(modelSchema.getEntity())) { return entityInfo; } - ModelInfo ModelInfo = new ModelInfo(); - ModelInfo.setItemId(modelId.intValue()); - ModelInfo.setName(ModelSchema.getModel().getName()); - ModelInfo.setWords(ModelSchema.getModel().getAlias()); - ModelInfo.setBizName(ModelSchema.getModel().getBizName()); - if (Objects.nonNull(ModelSchema.getEntity())) { - ModelInfo.setPrimaryEntityBizName(ModelSchema.getEntity().getBizName()); + ModelInfo modelInfo = new ModelInfo(); + modelInfo.setItemId(modelId.intValue()); + modelInfo.setName(modelSchema.getModel().getName()); + modelInfo.setWords(modelSchema.getModel().getAlias()); + modelInfo.setBizName(modelSchema.getModel().getBizName()); + if (Objects.nonNull(modelSchema.getEntity())) { + modelInfo.setPrimaryEntityBizName(modelSchema.getEntity().getBizName()); } - entityInfo.setModelInfo(ModelInfo); + entityInfo.setModelInfo(modelInfo); List dimensions = new ArrayList<>(); List metrics = new ArrayList<>(); @@ -189,19 +189,19 @@ public class SemanticService { return entityInfo; } - public void setMainModel(EntityInfo ModelInfo, Long Model, String entity, User user) { - ModelSchema ModelSchema = schemaService.getModelSchema(Model); + public void setMainModel(EntityInfo modelInfo, Long model, String entity, User user) { + ModelSchema modelSchema = schemaService.getModelSchema(model); - ModelInfo.setEntityId(entity); + modelInfo.setEntityId(entity); SemanticParseInfo semanticParseInfo = new SemanticParseInfo(); - semanticParseInfo.setModel(ModelSchema.getModel()); + semanticParseInfo.setModel(modelSchema.getModel()); semanticParseInfo.setNativeQuery(true); - semanticParseInfo.setMetrics(getMetrics(ModelInfo)); - semanticParseInfo.setDimensions(getDimensions(ModelInfo)); + semanticParseInfo.setMetrics(getMetrics(modelInfo)); + semanticParseInfo.setDimensions(getDimensions(modelInfo)); DateConf dateInfo = new DateConf(); int unit = 1; ChatConfigResp chatConfigInfo = - configService.fetchConfigByModelId(ModelSchema.getModel().getId()); + configService.fetchConfigByModelId(modelSchema.getModel().getId()); if (Objects.nonNull(chatConfigInfo) && Objects.nonNull(chatConfigInfo.getChatDetailConfig()) && Objects.nonNull(chatConfigInfo.getChatDetailConfig().getChatDefaultConfig())) { ChatDefaultConfigReq chatDefaultConfig = chatConfigInfo.getChatDetailConfig().getChatDefaultConfig(); @@ -220,7 +220,7 @@ public class SemanticService { QueryFilter chatFilter = new QueryFilter(); chatFilter.setValue(String.valueOf(entity)); chatFilter.setOperator(FilterOperatorEnum.EQUALS); - chatFilter.setBizName(getEntityPrimaryName(ModelInfo)); + chatFilter.setBizName(getEntityPrimaryName(modelInfo)); Set chatFilters = new LinkedHashSet(); chatFilters.add(chatFilter); semanticParseInfo.setDimensionFilters(chatFilters); @@ -242,18 +242,18 @@ public class SemanticService { if (entry.getValue() == null || entryKey == null) { continue; } - ModelInfo.getDimensions().stream().filter(i -> entryKey.equals(i.getBizName())) + modelInfo.getDimensions().stream().filter(i -> entryKey.equals(i.getBizName())) .forEach(i -> i.setValue(entry.getValue().toString())); - ModelInfo.getMetrics().stream().filter(i -> entryKey.equals(i.getBizName())) + modelInfo.getMetrics().stream().filter(i -> entryKey.equals(i.getBizName())) .forEach(i -> i.setValue(entry.getValue().toString())); } } } } - private Set getDimensions(EntityInfo ModelInfo) { + private Set getDimensions(EntityInfo modelInfo) { Set dimensions = new LinkedHashSet(); - for (DataInfo mainEntityDimension : ModelInfo.getDimensions()) { + for (DataInfo mainEntityDimension : modelInfo.getDimensions()) { SchemaElement dimension = new SchemaElement(); dimension.setBizName(mainEntityDimension.getBizName()); dimensions.add(dimension); @@ -270,9 +270,9 @@ public class SemanticService { return entryKey; } - private Set getMetrics(EntityInfo ModelInfo) { + private Set getMetrics(EntityInfo modelInfo) { Set metrics = new LinkedHashSet(); - for (DataInfo metricValue : ModelInfo.getMetrics()) { + for (DataInfo metricValue : modelInfo.getMetrics()) { SchemaElement metric = new SchemaElement(); BeanUtils.copyProperties(metricValue, metric); metrics.add(metric); @@ -280,31 +280,31 @@ public class SemanticService { return metrics; } - private String getEntityPrimaryName(EntityInfo ModelInfo) { - return ModelInfo.getModelInfo().getPrimaryEntityBizName(); + private String getEntityPrimaryName(EntityInfo modelInfo) { + return modelInfo.getModelInfo().getPrimaryEntityBizName(); } - private void filterBlackMetric(ModelSchema ModelSchema, ChatConfigResp chaConfigInfo) { + private void filterBlackMetric(ModelSchema modelSchema, ChatConfigResp chaConfigInfo) { ItemVisibility visibility = generateFinalVisibility(chaConfigInfo); if (Objects.nonNull(chaConfigInfo) && Objects.nonNull(visibility) && !CollectionUtils.isEmpty(visibility.getBlackMetricIdList()) - && !CollectionUtils.isEmpty(ModelSchema.getMetrics())) { - Set metric4Chat = ModelSchema.getMetrics().stream() + && !CollectionUtils.isEmpty(modelSchema.getMetrics())) { + Set metric4Chat = modelSchema.getMetrics().stream() .filter(metric -> !visibility.getBlackMetricIdList().contains(metric.getId())) .collect(Collectors.toSet()); - ModelSchema.setMetrics(metric4Chat); + modelSchema.setMetrics(metric4Chat); } } - private void filterBlackDim(ModelSchema ModelSchema, ChatConfigResp chatConfigInfo) { + private void filterBlackDim(ModelSchema modelSchema, ChatConfigResp chatConfigInfo) { ItemVisibility visibility = generateFinalVisibility(chatConfigInfo); if (Objects.nonNull(chatConfigInfo) && Objects.nonNull(visibility) && !CollectionUtils.isEmpty(visibility.getBlackDimIdList()) - && !CollectionUtils.isEmpty(ModelSchema.getDimensions())) { - Set dim4Chat = ModelSchema.getDimensions().stream() + && !CollectionUtils.isEmpty(modelSchema.getDimensions())) { + Set dim4Chat = modelSchema.getDimensions().stream() .filter(dim -> !visibility.getBlackDimIdList().contains(dim.getId())) .collect(Collectors.toSet()); - ModelSchema.setDimensions(dim4Chat); + modelSchema.setDimensions(dim4Chat); } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/StatisticsService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/StatisticsService.java new file mode 100644 index 000000000..ce62d9e8b --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/StatisticsService.java @@ -0,0 +1,9 @@ +package com.tencent.supersonic.chat.service; + +import com.tencent.supersonic.chat.persistence.dataobject.StatisticsDO; + +import java.util.List; + +public interface StatisticsService { + boolean batchSaveStatistics(List list); +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/AgentServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/AgentServiceImpl.java index b4aa7dc86..df1651f0c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/AgentServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/AgentServiceImpl.java @@ -1,16 +1,23 @@ package com.tencent.supersonic.chat.service.impl; import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.agent.Agent; +import com.tencent.supersonic.chat.agent.tool.AgentToolType; +import com.tencent.supersonic.chat.agent.tool.DslTool; import com.tencent.supersonic.chat.persistence.dataobject.AgentDO; import com.tencent.supersonic.chat.persistence.repository.AgentRepository; import com.tencent.supersonic.chat.service.AgentService; +import java.util.Collection; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; +import org.springframework.util.CollectionUtils; @Service public class AgentServiceImpl implements AgentService { @@ -54,18 +61,18 @@ public class AgentServiceImpl implements AgentService { return agentRepository.getAgents(); } - private Agent convert(AgentDO agentDO){ - if (agentDO == null ) { + private Agent convert(AgentDO agentDO) { + if (agentDO == null) { return null; } Agent agent = new Agent(); - BeanUtils.copyProperties(agentDO,agent); + BeanUtils.copyProperties(agentDO, agent); agent.setAgentConfig(agentDO.getConfig()); agent.setExamples(JSONObject.parseArray(agentDO.getExamples(), String.class)); return agent; } - private AgentDO convert(Agent agent, User user){ + private AgentDO convert(Agent agent, User user) { AgentDO agentDO = new AgentDO(); BeanUtils.copyProperties(agent, agentDO); agentDO.setConfig(agent.getAgentConfig()); @@ -79,4 +86,27 @@ public class AgentServiceImpl implements AgentService { } return agentDO; } + + public List getDslTools(Integer agentId, AgentToolType agentToolType) { + Agent agent = getAgent(agentId); + if (agent == null) { + return Lists.newArrayList(); + } + List tools = agent.getTools(agentToolType); + if (CollectionUtils.isEmpty(tools)) { + return Lists.newArrayList(); + } + return tools.stream().map(tool -> JSONObject.parseObject(tool, DslTool.class)).collect(Collectors.toList()); + } + + public Set getDslToolsModelIds(Integer agentId, AgentToolType agentToolType) { + List dslTools = getDslTools(agentId, agentToolType); + if (CollectionUtils.isEmpty(dslTools)) { + return new HashSet<>(); + } + return dslTools.stream().map(DslTool::getModelIds) + .filter(modelIds -> !CollectionUtils.isEmpty(modelIds)) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ChatServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ChatServiceImpl.java index 1919069e6..30bd0411a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ChatServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ChatServiceImpl.java @@ -4,19 +4,28 @@ import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; -import com.tencent.supersonic.chat.api.pojo.response.QueryResp; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import com.tencent.supersonic.chat.api.pojo.response.ParseResp; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.api.pojo.response.ShowCaseResp; import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; +import com.tencent.supersonic.chat.persistence.dataobject.ChatParseDO; import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; import com.tencent.supersonic.chat.persistence.dataobject.QueryDO; +import com.tencent.supersonic.chat.api.pojo.response.QueryResp; +import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; import com.tencent.supersonic.chat.persistence.repository.ChatContextRepository; import com.tencent.supersonic.chat.persistence.repository.ChatQueryRepository; import com.tencent.supersonic.chat.persistence.repository.ChatRepository; -import com.tencent.supersonic.chat.service.ChatService; + import java.text.SimpleDateFormat; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; + +import com.tencent.supersonic.chat.service.ChatService; +import com.tencent.supersonic.common.util.JsonUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; @@ -31,7 +40,7 @@ public class ChatServiceImpl implements ChatService { private ChatQueryRepository chatQueryRepository; public ChatServiceImpl(ChatContextRepository chatContextRepository, ChatRepository chatRepository, - ChatQueryRepository chatQueryRepository) { + ChatQueryRepository chatQueryRepository) { this.chatContextRepository = chatContextRepository; this.chatRepository = chatRepository; this.chatQueryRepository = chatQueryRepository; @@ -119,6 +128,18 @@ public class ChatServiceImpl implements ChatService { return chatQueryRepository.getChatQuery(pageQueryInfoCommend, chatId); } + @Override + public ShowCaseResp queryShowCase(PageQueryInfoReq pageQueryInfoCommend, int agentId) { + ShowCaseResp showCaseResp = new ShowCaseResp(); + List queryResps = chatQueryRepository.queryShowCase(pageQueryInfoCommend, agentId); + Map> showCaseMap = queryResps.stream() + .collect(Collectors.groupingBy(QueryResp::getChatId)); + showCaseResp.setShowCaseMap(showCaseMap); + showCaseResp.setCurrent(pageQueryInfoCommend.getCurrent()); + showCaseResp.setPageSize(pageQueryInfoCommend.getPageSize()); + return showCaseResp; + } + @Override public void addQuery(QueryResult queryResult, ChatContext chatCtx) { chatQueryRepository.createChatQuery(queryResult, chatCtx); @@ -127,8 +148,15 @@ public class ChatServiceImpl implements ChatService { } @Override - public ChatQueryDO getLastQuery(long chatId) { - return chatQueryRepository.getLastChatQuery(chatId); + public Boolean updateQuery(Long questionId, QueryResult queryResult, ChatContext chatCtx) { + ChatQueryDO chatQueryDO = new ChatQueryDO(); + chatQueryDO.setQuestionId(questionId); + chatQueryDO.setQueryResult(JsonUtil.toString(queryResult)); + chatQueryDO.setQueryState(1); + updateQuery(chatQueryDO); + chatRepository.updateLastQuestion(chatCtx.getChatId().longValue(), + chatCtx.getQueryText(), getCurrentTime()); + return true; } @Override @@ -136,9 +164,31 @@ public class ChatServiceImpl implements ChatService { return chatQueryRepository.updateChatQuery(chatQueryDO); } + @Override + public void batchAddParse(ChatContext chatCtx, QueryReq queryReq, + ParseResp parseResult, + List candidateParses, + List selectedParses) { + chatQueryRepository.batchSaveParseInfo(chatCtx, queryReq, parseResult, candidateParses, selectedParses); + + } + + @Override + public ChatQueryDO getLastQuery(long chatId) { + return chatQueryRepository.getLastChatQuery(chatId); + } + private String getCurrentTime() { SimpleDateFormat tempDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return tempDate.format(new java.util.Date()); } + public ChatParseDO getParseInfo(Long questionId, String userName, int parseId) { + return chatQueryRepository.getParseInfo(questionId, userName, parseId); + } + + public Boolean deleteChatQuery(Long questionId) { + return chatQueryRepository.deleteChatQuery(questionId); + } + } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ConfigServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ConfigServiceImpl.java index db284e4f6..49a40f615 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ConfigServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/ConfigServiceImpl.java @@ -5,35 +5,37 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticLayer; import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.request.ChatConfigEditReqReq; +import com.tencent.supersonic.chat.api.pojo.request.ItemVisibility; +import com.tencent.supersonic.chat.api.pojo.request.ChatDetailConfigReq; import com.tencent.supersonic.chat.api.pojo.request.ChatAggConfigReq; import com.tencent.supersonic.chat.api.pojo.request.ChatConfigBaseReq; -import com.tencent.supersonic.chat.api.pojo.request.ChatConfigEditReqReq; import com.tencent.supersonic.chat.api.pojo.request.ChatConfigFilter; -import com.tencent.supersonic.chat.api.pojo.request.ChatDefaultConfigReq; -import com.tencent.supersonic.chat.api.pojo.request.ChatDetailConfigReq; import com.tencent.supersonic.chat.api.pojo.request.Entity; -import com.tencent.supersonic.chat.api.pojo.request.ItemVisibility; +import com.tencent.supersonic.chat.api.pojo.request.ChatDefaultConfigReq; import com.tencent.supersonic.chat.api.pojo.request.KnowledgeInfoReq; -import com.tencent.supersonic.chat.api.pojo.response.ChatAggRichConfigResp; import com.tencent.supersonic.chat.api.pojo.response.ChatConfigResp; import com.tencent.supersonic.chat.api.pojo.response.ChatConfigRichResp; import com.tencent.supersonic.chat.api.pojo.response.ChatDefaultRichConfigResp; +import com.tencent.supersonic.chat.api.pojo.response.ChatAggRichConfigResp; import com.tencent.supersonic.chat.api.pojo.response.ChatDetailRichConfigResp; import com.tencent.supersonic.chat.api.pojo.response.EntityRichInfoResp; import com.tencent.supersonic.chat.api.pojo.response.ItemVisibilityInfo; import com.tencent.supersonic.chat.config.ChatConfig; -import com.tencent.supersonic.chat.persistence.repository.ChatConfigRepository; import com.tencent.supersonic.chat.service.ConfigService; import com.tencent.supersonic.chat.service.SemanticService; -import com.tencent.supersonic.chat.utils.ChatConfigHelper; import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.chat.persistence.repository.ChatConfigRepository; +import com.tencent.supersonic.chat.utils.ChatConfigHelper; import com.tencent.supersonic.common.util.JsonUtil; + import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; + import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -54,7 +56,7 @@ public class ConfigServiceImpl implements ConfigService { public ConfigServiceImpl(ChatConfigRepository chatConfigRepository, - ChatConfigHelper chatConfigHelper) { + ChatConfigHelper chatConfigHelper) { this.chatConfigRepository = chatConfigRepository; this.chatConfigHelper = chatConfigHelper; } @@ -116,7 +118,7 @@ public class ConfigServiceImpl implements ConfigService { private ItemVisibilityInfo fetchVisibilityDescByConfig(ItemVisibility visibility, - ModelSchema modelSchema) { + ModelSchema modelSchema) { ItemVisibilityInfo itemVisibilityDesc = new ItemVisibilityInfo(); List dimIdAllList = chatConfigHelper.generateAllDimIdList(modelSchema); @@ -169,19 +171,20 @@ public class ConfigServiceImpl implements ConfigService { } private ChatDetailRichConfigResp fillChatDetailRichConfig(ModelSchema modelSchema, - ChatConfigRichResp chatConfigRich, ChatConfigResp chatConfigResp) { + ChatConfigRichResp chatConfigRich, + ChatConfigResp chatConfigResp) { if (Objects.isNull(chatConfigResp) || Objects.isNull(chatConfigResp.getChatDetailConfig())) { return null; } ChatDetailRichConfigResp detailRichConfig = new ChatDetailRichConfigResp(); ChatDetailConfigReq chatDetailConfig = chatConfigResp.getChatDetailConfig(); - ItemVisibilityInfo itemVisibilityInfo = fetchVisibilityDescByConfig(chatDetailConfig.getVisibility(), - modelSchema); + ItemVisibilityInfo itemVisibilityInfo = fetchVisibilityDescByConfig( + chatDetailConfig.getVisibility(), modelSchema); detailRichConfig.setVisibility(itemVisibilityInfo); detailRichConfig.setKnowledgeInfos(fillKnowledgeBizName(chatDetailConfig.getKnowledgeInfos(), modelSchema)); detailRichConfig.setGlobalKnowledgeConfig(chatDetailConfig.getGlobalKnowledgeConfig()); - detailRichConfig.setChatDefaultConfig( - fetchDefaultConfig(chatDetailConfig.getChatDefaultConfig(), modelSchema, itemVisibilityInfo)); + detailRichConfig.setChatDefaultConfig(fetchDefaultConfig(chatDetailConfig.getChatDefaultConfig(), + modelSchema, itemVisibilityInfo)); return detailRichConfig; } @@ -209,14 +212,15 @@ public class ConfigServiceImpl implements ConfigService { chatAggRichConfig.setVisibility(itemVisibilityInfo); chatAggRichConfig.setKnowledgeInfos(fillKnowledgeBizName(chatAggConfig.getKnowledgeInfos(), modelSchema)); chatAggRichConfig.setGlobalKnowledgeConfig(chatAggConfig.getGlobalKnowledgeConfig()); - chatAggRichConfig.setChatDefaultConfig( - fetchDefaultConfig(chatAggConfig.getChatDefaultConfig(), modelSchema, itemVisibilityInfo)); + chatAggRichConfig.setChatDefaultConfig(fetchDefaultConfig(chatAggConfig.getChatDefaultConfig(), + modelSchema, itemVisibilityInfo)); return chatAggRichConfig; } private ChatDefaultRichConfigResp fetchDefaultConfig(ChatDefaultConfigReq chatDefaultConfig, - ModelSchema modelSchema, ItemVisibilityInfo itemVisibilityInfo) { + ModelSchema modelSchema, + ItemVisibilityInfo itemVisibilityInfo) { ChatDefaultRichConfigResp defaultRichConfig = new ChatDefaultRichConfigResp(); if (Objects.isNull(chatDefaultConfig)) { return defaultRichConfig; @@ -232,8 +236,8 @@ public class ConfigServiceImpl implements ConfigService { List metrics = new ArrayList<>(); if (!CollectionUtils.isEmpty(chatDefaultConfig.getDimensionIds())) { chatDefaultConfig.getDimensionIds().stream() - .filter(dimId -> dimIdAndRespPair.containsKey(dimId) && itemVisibilityInfo.getWhiteDimIdList() - .contains(dimId)) + .filter(dimId -> dimIdAndRespPair.containsKey(dimId) + && itemVisibilityInfo.getWhiteDimIdList().contains(dimId)) .forEach(dimId -> { SchemaElement dimSchemaResp = dimIdAndRespPair.get(dimId); if (Objects.nonNull(dimSchemaResp)) { @@ -266,7 +270,7 @@ public class ConfigServiceImpl implements ConfigService { private List fillKnowledgeBizName(List knowledgeInfos, - ModelSchema modelSchema) { + ModelSchema modelSchema) { if (CollectionUtils.isEmpty(knowledgeInfos)) { return new ArrayList<>(); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/PluginServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/PluginServiceImpl.java index 32ca44efb..601cc8e67 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/PluginServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/PluginServiceImpl.java @@ -14,15 +14,17 @@ import com.tencent.supersonic.chat.plugin.event.PluginDelEvent; import com.tencent.supersonic.chat.plugin.event.PluginUpdateEvent; import com.tencent.supersonic.chat.service.PluginService; import com.tencent.supersonic.chat.utils.ComponentFactory; -import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.semantic.api.model.response.ModelResp; + import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; + import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; @@ -39,7 +41,7 @@ public class PluginServiceImpl implements PluginService { private ApplicationEventPublisher publisher; public PluginServiceImpl(PluginRepository pluginRepository, - ApplicationEventPublisher publisher) { + ApplicationEventPublisher publisher) { this.pluginRepository = pluginRepository; this.publisher = publisher; } @@ -115,8 +117,9 @@ public class PluginServiceImpl implements PluginService { List pluginDOS = pluginRepository.query(pluginDOExample); if (StringUtils.isNotBlank(pluginQueryReq.getPattern())) { pluginDOS = pluginDOS.stream().filter(pluginDO -> - pluginDO.getPattern().contains(pluginQueryReq.getPattern()) || - (pluginDO.getName() != null && pluginDO.getName().contains(pluginQueryReq.getPattern()))) + pluginDO.getPattern().contains(pluginQueryReq.getPattern()) + || (pluginDO.getName() != null + && pluginDO.getName().contains(pluginQueryReq.getPattern()))) .collect(Collectors.toList()); } return convertList(pluginDOS); @@ -130,8 +133,8 @@ public class PluginServiceImpl implements PluginService { if (StringUtils.isBlank(plugin.getParseModeConfig())) { return false; } - PluginParseConfig functionCallConfig = JsonUtil.toObject(plugin.getParseModeConfig(), - PluginParseConfig.class); + PluginParseConfig functionCallConfig = JsonUtil.toObject( + plugin.getParseModeConfig(), PluginParseConfig.class); if (Objects.isNull(functionCallConfig) || StringUtils.isEmpty(functionCallConfig.getName())) { return false; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java index cedb2689c..4ea03f75c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java @@ -2,29 +2,42 @@ package com.tencent.supersonic.chat.service.impl; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.component.*; +import com.tencent.supersonic.chat.api.component.SchemaMapper; +import com.tencent.supersonic.chat.api.component.SemanticQuery; +import com.tencent.supersonic.chat.api.component.SemanticParser; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.request.ExecuteQueryReq; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; import com.tencent.supersonic.chat.api.pojo.response.ParseResp; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.api.pojo.response.QueryState; +import com.tencent.supersonic.chat.persistence.dataobject.ChatParseDO; +import com.tencent.supersonic.chat.persistence.dataobject.CostType; +import com.tencent.supersonic.chat.persistence.dataobject.StatisticsDO; import com.tencent.supersonic.chat.query.QuerySelector; import com.tencent.supersonic.chat.api.pojo.request.QueryDataReq; import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.chat.service.ChatService; import com.tencent.supersonic.chat.service.QueryService; +import com.tencent.supersonic.chat.service.SemanticService; +import com.tencent.supersonic.chat.service.StatisticsService; import com.tencent.supersonic.chat.utils.ComponentFactory; + +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; + +import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.JsonUtil; import lombok.extern.slf4j.Slf4j; import org.apache.calcite.sql.parser.SqlParseException; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; @@ -37,6 +50,13 @@ public class QueryServiceImpl implements QueryService { @Autowired private ChatService chatService; + @Autowired + private StatisticsService statisticsService; + + private final String entity = "ENTITY"; + + @Value("${time.threshold: 100}") + private Integer timeThreshold; private List schemaMappers = ComponentFactory.getSchemaMappers(); private List semanticParsers = ComponentFactory.getSemanticParsers(); @@ -47,17 +67,25 @@ public class QueryServiceImpl implements QueryService { QueryContext queryCtx = new QueryContext(queryReq); // in order to support multi-turn conversation, chat context is needed ChatContext chatCtx = chatService.getOrCreateContext(queryReq.getChatId()); - + List timeCostDOList = new ArrayList<>(); schemaMappers.stream().forEach(mapper -> { + Long startTime = System.currentTimeMillis(); mapper.map(queryCtx); - log.info("{} result:{}", mapper.getClass().getSimpleName(), JsonUtil.toString(queryCtx)); + Long endTime = System.currentTimeMillis(); + String className = mapper.getClass().getSimpleName(); + timeCostDOList.add(StatisticsDO.builder().cost((int) (endTime - startTime)) + .interfaceName(className).type(CostType.MAPPER.getType()).build()); + log.info("{} result:{}", className, JsonUtil.toString(queryCtx)); }); - semanticParsers.stream().forEach(parser -> { + Long startTime = System.currentTimeMillis(); parser.parse(queryCtx, chatCtx); - log.info("{} result:{}", parser.getClass().getSimpleName(), JsonUtil.toString(queryCtx)); + Long endTime = System.currentTimeMillis(); + String className = parser.getClass().getSimpleName(); + timeCostDOList.add(StatisticsDO.builder().cost((int) (endTime - startTime)) + .interfaceName(className).type(CostType.PARSER.getType()).build()); + log.info("{} result:{}", className, JsonUtil.toString(queryCtx)); }); - ParseResp parseResult; if (queryCtx.getCandidateQueries().size() > 0) { log.debug("pick before [{}]", queryCtx.getCandidateQueries().stream().collect( @@ -70,9 +98,15 @@ public class QueryServiceImpl implements QueryService { .map(SemanticQuery::getParseInfo) .sorted(Comparator.comparingDouble(SemanticParseInfo::getScore).reversed()) .collect(Collectors.toList()); + selectedParses.forEach(parseInfo -> { + if (parseInfo.getQueryMode().contains(entity)) { + EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class) + .getEntityInfo(parseInfo, queryReq.getUser()); + parseInfo.setEntityInfo(entityInfo); + } + }); List candidateParses = queryCtx.getCandidateQueries().stream() .map(SemanticQuery::getParseInfo).collect(Collectors.toList()); - parseResult = ParseResp.builder() .chatId(queryReq.getChatId()) .queryText(queryReq.getQueryText()) @@ -80,6 +114,9 @@ public class QueryServiceImpl implements QueryService { .selectedParses(selectedParses) .candidateParses(candidateParses) .build(); + chatService.batchAddParse(chatCtx, queryReq, parseResult, candidateParses, selectedParses); + saveInfo(timeCostDOList, queryReq.getQueryText(), parseResult.getQueryId(), + queryReq.getUser().getName(), queryReq.getChatId().longValue()); } else { parseResult = ParseResp.builder() .chatId(queryReq.getChatId()) @@ -87,13 +124,15 @@ public class QueryServiceImpl implements QueryService { .state(ParseResp.ParseState.FAILED) .build(); } - return parseResult; } @Override public QueryResult performExecution(ExecuteQueryReq queryReq) throws Exception { - SemanticParseInfo parseInfo = queryReq.getParseInfo(); + ChatParseDO chatParseDO = chatService.getParseInfo(queryReq.getQueryId(), + queryReq.getUser().getName(), queryReq.getParseId()); + List timeCostDOList = new ArrayList<>(); + SemanticParseInfo parseInfo = JsonUtil.toObject(chatParseDO.getParseInfo(), SemanticParseInfo.class); SemanticQuery semanticQuery = QueryManager.createQuery(parseInfo.getQueryMode()); if (semanticQuery == null) { return null; @@ -102,9 +141,15 @@ public class QueryServiceImpl implements QueryService { // in order to support multi-turn conversation, chat context is needed ChatContext chatCtx = chatService.getOrCreateContext(queryReq.getChatId()); - + chatCtx.setAgentId(queryReq.getAgentId()); + Long startTime = System.currentTimeMillis(); QueryResult queryResult = semanticQuery.execute(queryReq.getUser()); + Long endTime = System.currentTimeMillis(); if (queryResult != null) { + timeCostDOList.add(StatisticsDO.builder().cost((int) (endTime - startTime)) + .interfaceName(semanticQuery.getClass().getSimpleName()).type(CostType.QUERY.getType()).build()); + saveInfo(timeCostDOList, queryReq.getQueryText(), queryReq.getQueryId(), + queryReq.getUser().getName(), queryReq.getChatId().longValue()); queryResult.setChatContext(parseInfo); // update chat context after a successful semantic query if (queryReq.isSaveAnswer() && QueryState.SUCCESS.equals(queryResult.getQueryState())) { @@ -113,12 +158,33 @@ public class QueryServiceImpl implements QueryService { } chatCtx.setQueryText(queryReq.getQueryText()); chatCtx.setUser(queryReq.getUser().getName()); - chatService.addQuery(queryResult, chatCtx); + //chatService.addQuery(queryResult, chatCtx); + chatService.updateQuery(queryReq.getQueryId(), queryResult, chatCtx); + } else { + chatService.deleteChatQuery(queryReq.getQueryId()); } return queryResult; } + public void saveInfo(List timeCostDOList, + String queryText, Long queryId, + String userName, Long chatId) { + List list = timeCostDOList.stream() + .filter(o -> o.getCost() > timeThreshold).collect(Collectors.toList()); + list.forEach(o -> { + o.setQueryText(queryText); + o.setQuestionId(queryId); + o.setUserName(userName); + o.setChatId(chatId); + o.setCreateTime(new java.util.Date()); + }); + if (list.size() > 0) { + log.info("filterStatistics size:{},data:{}", list.size(), JsonUtil.toString(list)); + statisticsService.batchSaveStatistics(list); + } + } + @Override public QueryResult executeQuery(QueryReq queryReq) throws Exception { QueryContext queryCtx = new QueryContext(queryReq); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/RecommendServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/RecommendServiceImpl.java index d5e8380d9..704062d91 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/RecommendServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/RecommendServiceImpl.java @@ -3,20 +3,22 @@ package com.tencent.supersonic.chat.service.impl; import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.SchemaElement; -import com.tencent.supersonic.chat.api.pojo.request.ChatConfigFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import com.tencent.supersonic.chat.api.pojo.response.RecommendQuestionResp; +import com.tencent.supersonic.chat.api.pojo.request.ChatConfigFilter; import com.tencent.supersonic.chat.api.pojo.response.ChatConfigResp; import com.tencent.supersonic.chat.api.pojo.response.ChatConfigRichResp; -import com.tencent.supersonic.chat.api.pojo.response.RecommendQuestionResp; import com.tencent.supersonic.chat.api.pojo.response.RecommendResp; -import com.tencent.supersonic.chat.service.ConfigService; -import com.tencent.supersonic.chat.service.RecommendService; -import com.tencent.supersonic.chat.service.SemanticService; + import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; + +import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.chat.service.RecommendService; +import com.tencent.supersonic.chat.service.SemanticService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -112,10 +114,11 @@ public class RecommendServiceImpl implements RecommendService { List chatConfigRespList = configService.search(chatConfigFilter, null); if (!CollectionUtils.isEmpty(chatConfigRespList)) { chatConfigRespList.stream().forEach(chatConfigResp -> { - if (Objects.nonNull(chatConfigResp) && !CollectionUtils.isEmpty( - chatConfigResp.getRecommendedQuestions())) { - recommendQuestions.add(new RecommendQuestionResp(chatConfigResp.getModelId(), - chatConfigResp.getRecommendedQuestions())); + if (Objects.nonNull(chatConfigResp) + && !CollectionUtils.isEmpty(chatConfigResp.getRecommendedQuestions())) { + recommendQuestions.add( + new RecommendQuestionResp(chatConfigResp.getModelId(), + chatConfigResp.getRecommendedQuestions())); } }); return recommendQuestions; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/SearchServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/SearchServiceImpl.java index 599a14a5a..9828d2581 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/SearchServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/SearchServiceImpl.java @@ -10,17 +10,19 @@ import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.pojo.response.SearchResult; -import com.tencent.supersonic.chat.mapper.MatchText; -import com.tencent.supersonic.chat.mapper.ModelInfoStat; +import com.tencent.supersonic.chat.mapper.MapperHelper; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.knowledge.dictionary.ModelInfoStat; import com.tencent.supersonic.chat.mapper.ModelWithSemanticType; +import com.tencent.supersonic.chat.mapper.MatchText; import com.tencent.supersonic.chat.mapper.SearchMatchStrategy; import com.tencent.supersonic.chat.service.AgentService; import com.tencent.supersonic.chat.service.ChatService; import com.tencent.supersonic.chat.service.SearchService; -import com.tencent.supersonic.chat.utils.NatureHelper; +import com.tencent.supersonic.knowledge.utils.NatureHelper; import com.tencent.supersonic.knowledge.dictionary.DictWord; -import com.tencent.supersonic.knowledge.dictionary.DictWordType; import com.tencent.supersonic.knowledge.dictionary.MapResult; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; import com.tencent.supersonic.knowledge.service.SchemaService; import com.tencent.supersonic.knowledge.utils.HanlpHelper; import java.util.ArrayList; @@ -59,10 +61,10 @@ public class SearchServiceImpl implements SearchService { private AgentService agentService; @Override - public List search(QueryReq queryCtx) { + public List search(QueryReq queryReq) { // 1. check search enable - Integer agentId = queryCtx.getAgentId(); + Integer agentId = queryReq.getAgentId(); if (agentId != null) { Agent agent = agentService.getAgent(agentId); if (!agent.enableSearch()) { @@ -70,7 +72,7 @@ public class SearchServiceImpl implements SearchService { } } - String queryText = queryCtx.getQueryText(); + String queryText = queryReq.getQueryText(); // 2.get meta info SemanticSchema semanticSchemaDb = schemaService.getSemanticSchema(); List metricsDb = semanticSchemaDb.getMetrics(); @@ -78,8 +80,11 @@ public class SearchServiceImpl implements SearchService { // 3.detect by segment List originals = HanlpHelper.getTerms(queryText); - Map> regTextMap = searchMatchStrategy.match(queryText, originals, - queryCtx.getModelId()); + + MapperHelper mapperHelper = ContextUtils.getBean(MapperHelper.class); + Set detectModelIds = mapperHelper.getModelIds(queryReq); + + Map> regTextMap = searchMatchStrategy.match(queryReq, originals, detectModelIds); regTextMap.entrySet().stream().forEach(m -> HanlpHelper.transLetterOriginal(m.getValue())); // 4.get the most matching data @@ -96,12 +101,12 @@ public class SearchServiceImpl implements SearchService { return Lists.newArrayList(); } Map.Entry> searchTextEntry = mostSimilarSearchResult.get(); - log.info("searchTextEntry:{},queryCtx:{}", searchTextEntry, queryCtx); + log.info("searchTextEntry:{},queryReq:{}", searchTextEntry, queryReq); Set searchResults = new LinkedHashSet(); ModelInfoStat modelStat = NatureHelper.getModelStat(originals); - List possibleModels = getPossibleModels(queryCtx, originals, modelStat, queryCtx.getModelId()); + List possibleModels = getPossibleModels(queryReq, originals, modelStat, queryReq.getModelId()); // 5.1 priority dimension metric boolean existMetricAndDimension = searchMetricAndDimension(new HashSet<>(possibleModels), modelToName, @@ -116,7 +121,7 @@ public class SearchServiceImpl implements SearchService { Set searchResultSet = searchDimensionValue(metricsDb, modelToName, modelStat.getMetricModelCount(), existMetricAndDimension, - matchText, natureToNameMap, natureToNameEntry, queryCtx.getQueryFilters()); + matchText, natureToNameMap, natureToNameEntry, queryReq.getQueryFilters()); searchResults.addAll(searchResultSet); } @@ -265,7 +270,7 @@ public class SearchServiceImpl implements SearchService { posDO.setWord(entry.getName()); posDO.setNature(nature); return posDO; - } + } )).sorted(Comparator.comparingInt(a -> a.getWord().length())) .collect(Collectors.toMap(DictWord::getNature, DictWord::getWord, (value1, value2) -> value1, LinkedHashMap::new)); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/StatisticsServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/StatisticsServiceImpl.java new file mode 100644 index 000000000..9309152e4 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/StatisticsServiceImpl.java @@ -0,0 +1,25 @@ +package com.tencent.supersonic.chat.service.impl; + +import com.tencent.supersonic.chat.persistence.dataobject.StatisticsDO; +import com.tencent.supersonic.chat.persistence.repository.StatisticsRepository; +import com.tencent.supersonic.chat.service.StatisticsService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("statisticsService") +@Slf4j +public class StatisticsServiceImpl implements StatisticsService { + + private StatisticsRepository statisticsRepository; + + public StatisticsServiceImpl(StatisticsRepository statisticsRepository) { + this.statisticsRepository = statisticsRepository; + } + + @Override + public boolean batchSaveStatistics(List list) { + return statisticsRepository.batchSaveStatistics(list); + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ChatConfigHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ChatConfigHelper.java index 125279aef..6106a86e9 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ChatConfigHelper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ChatConfigHelper.java @@ -5,23 +5,25 @@ import static com.tencent.supersonic.common.pojo.Constants.ADMIN_LOWER; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.SchemaElement; -import com.tencent.supersonic.chat.api.pojo.request.ChatAggConfigReq; import com.tencent.supersonic.chat.api.pojo.request.ChatConfigBaseReq; -import com.tencent.supersonic.chat.api.pojo.request.ChatConfigEditReqReq; +import com.tencent.supersonic.chat.api.pojo.request.ChatAggConfigReq; import com.tencent.supersonic.chat.api.pojo.request.ChatDetailConfigReq; +import com.tencent.supersonic.chat.api.pojo.request.ChatConfigEditReqReq; import com.tencent.supersonic.chat.api.pojo.request.ItemVisibility; import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestionReq; import com.tencent.supersonic.chat.api.pojo.response.ChatConfigResp; import com.tencent.supersonic.chat.config.ChatConfig; import com.tencent.supersonic.chat.persistence.dataobject.ChatConfigDO; -import com.tencent.supersonic.common.pojo.RecordInfo; import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import com.tencent.supersonic.common.pojo.RecordInfo; import com.tencent.supersonic.common.util.JsonUtil; + import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; + import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; @@ -120,6 +122,7 @@ public class ChatConfigHelper { chatConfigDescriptor.setUpdatedBy(chatConfigDO.getUpdatedBy()); chatConfigDescriptor.setUpdatedAt(chatConfigDO.getUpdatedAt()); + if (Strings.isEmpty(chatConfigDO.getChatAggConfig())) { chatConfigDescriptor.setChatAggConfig(generateEmptyChatAggConfigResp()); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ComponentFactory.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ComponentFactory.java index e32ebba1b..1277356fc 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ComponentFactory.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ComponentFactory.java @@ -4,12 +4,12 @@ import com.tencent.supersonic.chat.api.component.SchemaMapper; import com.tencent.supersonic.chat.api.component.SemanticLayer; import com.tencent.supersonic.chat.api.component.SemanticParser; -import com.tencent.supersonic.chat.api.component.DSLOptimizer; +import com.tencent.supersonic.chat.api.component.SemanticCorrector; import java.util.ArrayList; import java.util.List; import java.util.Objects; -import com.tencent.supersonic.chat.parser.function.ModelResolver; +import com.tencent.supersonic.chat.parser.plugin.function.ModelResolver; import com.tencent.supersonic.chat.query.QuerySelector; import org.apache.commons.collections.CollectionUtils; import org.springframework.core.io.support.SpringFactoriesLoader; @@ -19,7 +19,7 @@ public class ComponentFactory { private static List schemaMappers = new ArrayList<>(); private static List semanticParsers = new ArrayList<>(); - private static List dslCorrections = new ArrayList<>(); + private static List dslCorrections = new ArrayList<>(); private static SemanticLayer semanticLayer; private static QuerySelector querySelector; private static ModelResolver modelResolver; @@ -31,8 +31,8 @@ public class ComponentFactory { return CollectionUtils.isEmpty(semanticParsers) ? init(SemanticParser.class, semanticParsers) : semanticParsers; } - public static List getSqlCorrections() { - return CollectionUtils.isEmpty(dslCorrections) ? init(DSLOptimizer.class, dslCorrections) : dslCorrections; + public static List getSqlCorrections() { + return CollectionUtils.isEmpty(dslCorrections) ? init(SemanticCorrector.class, dslCorrections) : dslCorrections; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictMetaHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictMetaHelper.java index 310137955..87173e509 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictMetaHelper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictMetaHelper.java @@ -10,12 +10,13 @@ import com.tencent.supersonic.chat.api.pojo.request.KnowledgeAdvancedConfig; import com.tencent.supersonic.chat.api.pojo.request.KnowledgeInfoReq; import com.tencent.supersonic.chat.api.pojo.response.ChatConfigRichResp; import com.tencent.supersonic.chat.api.pojo.response.ChatDefaultRichConfigResp; -import com.tencent.supersonic.chat.config.DefaultMetric; import com.tencent.supersonic.chat.config.Dim4Dict; -import com.tencent.supersonic.chat.persistence.dataobject.DimValueDO; +import com.tencent.supersonic.chat.config.DefaultMetric; import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.chat.persistence.dataobject.DimValueDO; import com.tencent.supersonic.knowledge.dictionary.DictUpdateMode; import com.tencent.supersonic.knowledge.dictionary.DimValue2DictCommand; + import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -24,6 +25,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; + import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -126,16 +128,17 @@ public class DictMetaHelper { } private void fillDimValueDOList(List dimValueDOList, Long modelId, - Map dimIdAndDescPair) { + Map dimIdAndDescPair) { ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(modelId); if (Objects.nonNull(chaConfigRichDesc) && Objects.nonNull(chaConfigRichDesc.getChatAggRichConfig())) { - ChatDefaultRichConfigResp chatDefaultConfig = chaConfigRichDesc.getChatAggRichConfig() - .getChatDefaultConfig(); - List knowledgeAggInfo = chaConfigRichDesc.getChatAggRichConfig().getKnowledgeInfos(); + ChatDefaultRichConfigResp chatDefaultConfig = + chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig(); + List knowledgeAggInfo = + chaConfigRichDesc.getChatAggRichConfig().getKnowledgeInfos(); - List knowledgeDetailInfo = chaConfigRichDesc.getChatDetailRichConfig() - .getKnowledgeInfos(); + List knowledgeDetailInfo = + chaConfigRichDesc.getChatDetailRichConfig().getKnowledgeInfos(); fillKnowledgeDimValue(knowledgeDetailInfo, chatDefaultConfig, dimValueDOList, dimIdAndDescPair, modelId); fillKnowledgeDimValue(knowledgeAggInfo, chatDefaultConfig, dimValueDOList, dimIdAndDescPair, modelId); @@ -145,22 +148,23 @@ public class DictMetaHelper { } private void fillKnowledgeDimValue(List knowledgeInfos, - ChatDefaultRichConfigResp chatDefaultConfig, - List dimValueDOList, Map dimIdAndDescPair, Long modelId) { + ChatDefaultRichConfigResp chatDefaultConfig, + List dimValueDOList, + Map dimIdAndDescPair, Long modelId) { if (!CollectionUtils.isEmpty(knowledgeInfos)) { List dimensions = new ArrayList<>(); List defaultMetricDescList = new ArrayList<>(); knowledgeInfos.stream() - .filter(knowledgeInfo -> knowledgeInfo.getSearchEnable() && !CollectionUtils.isEmpty( - dimIdAndDescPair) + .filter(knowledgeInfo -> knowledgeInfo.getSearchEnable() + && !CollectionUtils.isEmpty(dimIdAndDescPair) && dimIdAndDescPair.containsKey(knowledgeInfo.getItemId())) .forEach(knowledgeInfo -> { if (dimIdAndDescPair.containsKey(knowledgeInfo.getItemId())) { SchemaElement dimensionDesc = dimIdAndDescPair.get(knowledgeInfo.getItemId()); //default cnt - if (Objects.isNull(chatDefaultConfig) || CollectionUtils.isEmpty( - chatDefaultConfig.getMetrics())) { + if (Objects.isNull(chatDefaultConfig) + || CollectionUtils.isEmpty(chatDefaultConfig.getMetrics())) { String datasourceBizName = dimensionDesc.getBizName(); if (Strings.isNotEmpty(datasourceBizName)) { String internalMetricName = @@ -169,9 +173,8 @@ public class DictMetaHelper { } } else { SchemaElement schemaItem = chatDefaultConfig.getMetrics().get(0); - defaultMetricDescList.add( - new DefaultMetric(schemaItem.getBizName(), chatDefaultConfig.getUnit(), - chatDefaultConfig.getPeriod())); + defaultMetricDescList.add(new DefaultMetric(schemaItem.getBizName(), + chatDefaultConfig.getUnit(), chatDefaultConfig.getPeriod())); } @@ -180,7 +183,8 @@ public class DictMetaHelper { dim4Dict.setDimId(knowledgeInfo.getItemId()); dim4Dict.setBizName(bizName); if (Objects.nonNull(knowledgeInfo.getKnowledgeAdvancedConfig())) { - KnowledgeAdvancedConfig knowledgeAdvancedConfig = knowledgeInfo.getKnowledgeAdvancedConfig(); + KnowledgeAdvancedConfig knowledgeAdvancedConfig + = knowledgeInfo.getKnowledgeAdvancedConfig(); BeanUtils.copyProperties(knowledgeAdvancedConfig, dim4Dict); } dimensions.add(dim4Dict); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/QueryReqBuilder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/QueryReqBuilder.java index 380f80bb3..6b955b7ac 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/QueryReqBuilder.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/QueryReqBuilder.java @@ -17,6 +17,7 @@ import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; import java.time.LocalDate; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; @@ -81,7 +82,24 @@ public class QueryReqBuilder { BeanUtils.copyProperties(dateInfo, dateInfoNew); if (Objects.nonNull(dateInfo) && DateConf.DateMode.RECENT.equals(dateInfo.getDateMode())) { int unit = dateInfo.getUnit(); - String startDate = LocalDate.now().plusDays(-unit).toString(); + int days = 1; + switch (dateInfo.getPeriod()) { + case Constants.DAY: + days = 1; + break; + case Constants.WEEK: + days = 7; + break; + case Constants.MONTH: + days = 30; + break; + case Constants.YEAR: + days = 365; + break; + default: + break; + } + String startDate = LocalDate.now().plusDays(-(unit * days)).toString(); String endDate = LocalDate.now().plusDays(-1).toString(); dateInfoNew.setDateMode(DateConf.DateMode.BETWEEN); dateInfoNew.setStartDate(startDate); @@ -159,7 +177,13 @@ public class QueryReqBuilder { dimension.setBizName(dateField); if (QueryManager.isMetricQuery(queryMode)) { - parseInfo.getDimensions().add(dimension); + List timeDimensions = Arrays.asList(TimeDimensionEnum.DAY.getName(), + TimeDimensionEnum.WEEK.getName(), TimeDimensionEnum.MONTH.getName()); + Set dimensions = parseInfo.getDimensions().stream() + .filter(d -> !timeDimensions.contains(d.getBizName().toLowerCase())).collect( + Collectors.toSet()); + dimensions.add(dimension); + parseInfo.setDimensions(dimensions); } } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/SchemaMatchHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/SchemaMatchHelper.java index a9e684799..dfaeb6532 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/SchemaMatchHelper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/SchemaMatchHelper.java @@ -38,7 +38,7 @@ public class SchemaMatchHelper { } private static boolean isMetricOrDimension(SchemaElementMatch elementMatch) { - return SchemaElementType.METRIC.equals(elementMatch.getElement().getType()) || - SchemaElementType.DIMENSION.equals(elementMatch.getElement().getType()); + return SchemaElementType.METRIC.equals(elementMatch.getElement().getType()) + || SchemaElementType.DIMENSION.equals(elementMatch.getElement().getType()); } } diff --git a/chat/core/src/main/python/bin/install.sh b/chat/core/src/main/python/bin/install.sh index 9e68a6fd2..df8800a19 100755 --- a/chat/core/src/main/python/bin/install.sh +++ b/chat/core/src/main/python/bin/install.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash binDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$binDir/.." && pwd -P) +baseDir=$(readlink -f $binDir/../) echo $binDir source ${binDir}/env.sh diff --git a/chat/core/src/main/python/bin/run.sh b/chat/core/src/main/python/bin/run.sh index 8f7af2f23..8ed1a9d90 100755 --- a/chat/core/src/main/python/bin/run.sh +++ b/chat/core/src/main/python/bin/run.sh @@ -4,7 +4,7 @@ llm_host=$1 llm_port=$2 binDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$binDir/.." && pwd -P) +baseDir=$(readlink -f $binDir/../) source ${baseDir}/bin/env.sh diff --git a/chat/core/src/main/python/bin/service.sh b/chat/core/src/main/python/bin/service.sh index a1788b5fb..bd3ae8e0a 100755 --- a/chat/core/src/main/python/bin/service.sh +++ b/chat/core/src/main/python/bin/service.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash binDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$binDir/.." && pwd -P) +baseDir=$(readlink -f $binDir/../) source ${baseDir}/bin/env.sh command=$1 diff --git a/chat/core/src/main/python/llm/api_service.py b/chat/core/src/main/python/llm/api_service.py index c06748b74..a5bd975f2 100644 --- a/chat/core/src/main/python/llm/api_service.py +++ b/chat/core/src/main/python/llm/api_service.py @@ -25,31 +25,20 @@ app = FastAPI() @app.post("/query2sql/") async def din_query2sql(query_body: Mapping[str, Any]): - if 'queryText' not in query_body: - raise HTTPException(status_code=400, + if 'queryText' not in query_body: + raise HTTPException(status_code=400, detail="query_text is not in query_body") - else: - query_text = query_body['queryText'] + else: + query_text = query_body['queryText'] - if 'schema' not in query_body: - raise HTTPException(status_code=400, detail="schema is not in query_body") - else: - schema = query_body['schema'] + if 'schema' not in query_body: + raise HTTPException(status_code=400, detail="schema is not in query_body") + else: + schema = query_body['schema'] - if 'currentDate' not in query_body: - raise HTTPException(status_code=400, detail="currentDate is not in query_body") - else: - current_date = query_body['currentDate'] + resp = query2sql(query_text=query_text, schema=schema) - if 'linking' not in query_body: - linking = None - else: - linking = query_body['linking'] - - resp = query2sql(query_text=query_text, - schema=schema, current_date=current_date, linking=linking) - - return resp + return resp @app.post("/preset_query_retrival/") diff --git a/chat/core/src/main/python/llm/few_shot_example/sql_exampler.py b/chat/core/src/main/python/llm/few_shot_example/sql_exampler.py deleted file mode 100644 index 63fad8222..000000000 --- a/chat/core/src/main/python/llm/few_shot_example/sql_exampler.py +++ /dev/null @@ -1,296 +0,0 @@ -examplars= [ - { "current_date":"2020-12-01", - "table_name":"内容库产品", - "fields_list":"""["部门", "模块", "用户名", "访问次数", "访问人数", "访问时长", "数据日期"]""", - "question":"比较jerryjzhang和lexluo在内容库的访问次数", - "prior_schema_links":"""['jerryjzhang'->用户名, 'lexluo'->用户名]""", - "analysis": """让我们一步一步地思考。在问题“比较jerryjzhang和lexluo在内容库的访问次数“中,我们被问: -“比较jerryjzhang和lexluo”,所以我们需要column=[用户名] -”内容库的访问次数“,所以我们需要column=[访问次数] -基于table和columns,可能的cell values 是 = ['jerryjzhang', 'lexluo']。""", - "schema_links":"""["用户名", "访问次数", "'jerryjzhang'", "'lexluo'"]""", - "sql":"""select 用户名, 访问次数 from 内容库产品 where 用户名 in ('jerryjzhang', 'lexluo') and 数据日期 = '2020-12-01' """ - }, - { "current_date":"2022-11-06", - "table_name":"内容库产品", - "fields_list":"""["部门", "模块", "用户名", "访问次数", "访问人数", "访问时长", "数据日期"]""", - "question":"内容库近12个月访问人数 按部门", - "prior_schema_links":"""[]""", - "analysis": """让我们一步一步地思考。在问题“内容库近12个月访问人数 按部门“中,我们被问: -”内容库近12个月“,所以我们需要column=[数据日期] -“访问人数”,所以我们需要column=[访问人数] -”按部门“,所以我们需要column=[部门] -基于table和columns,可能的cell values 是 = [12]。""", - "schema_links":"""["访问人数", "部门", "数据日期", 12]""", - "sql":"""select 部门, 数据日期, 访问人数 from 内容库产品 where datediff('month', 数据日期, '2022-11-06') <= 12 """ - }, - { "current_date":"2023-04-21", - "table_name":"内容库产品", - "fields_list":"""["部门", "模块", "用户名", "访问次数", "访问人数", "访问时长", "数据日期"]""", - "question":"内容库内容合作部、生态业务部的访问时长", - "prior_schema_links":"""['内容合作部'->部门, '生态业务部'->部门]""", - "analysis": """让我们一步一步地思考。在问题“内容库内容合作部、生态业务部的访问时长“中,我们被问: -“访问时长”,所以我们需要column=[访问时长] -”内容库内容合作部、生态业务部“,所以我们需要column=[部门] -基于table和columns,可能的cell values 是 = ['内容合作部', '生态业务部']。""", - "schema_links":"""["访问时长", "部门", "'内容合作部'", "'生态业务部'"]""", - "sql":"""select 部门, 访问时长 from 内容库产品 where 部门 in ('内容合作部', '生态业务部') and 数据日期 = '2023-04-21' """ - }, - { "current_date":"2023-08-21", - "table_name":"优选", - "fields_list":"""["优选版权归属系", "付费模式", "结算播放份额", "付费用户结算播放份额", "数据日期"]""", - "question":"近3天阔景系TME结算播放份额", - "prior_schema_links":"""['阔景系'->优选版权归属系]""", - "analysis": """让我们一步一步地思考。在问题“近3天阔景系TME结算播放份额“中,我们被问: -“TME结算播放份额”,所以我们需要column=[结算播放份额] -”阔景系“,所以我们需要column=[优选版权归属系] -”近3天“,所以我们需要column=[数据日期] -基于table和columns,可能的cell values 是 = ['阔景系', 3]。""", - "schema_links":"""["结算播放份额", "优选版权归属系", "数据日期", "'阔景系'", 3]""", - "sql":"""select 优选版权归属系, 结算播放份额 from 优选 where 优选版权归属系 = '阔景系' and datediff('day', 数据日期, '2023-08-21') <= 3 """ - }, - { "current_date":"2023-05-22", - "table_name":"歌曲库", - "fields_list":"""["是否音乐人歌曲", "Q音歌曲ID", "Q音歌曲MID", "歌曲名", "歌曲版本", "语种", "歌曲类型", "翻唱类型", "TME歌曲ID", "是否优选窄口径歌曲", "是否优选宽口径歌曲", "结算播放量", "运营播放量", "付费用户结算播放量", "历史累计结算播放量", "运营搜播量", "结算搜播量", "运营完播量", "运营推播量", "近7日复播率", "日均搜播量", "数据日期"]""", - "question":"对比近7天翻唱版和纯音乐的歌曲播放量", - "prior_schema_links":"""['纯音乐'->语种, '翻唱版'->歌曲版本]""", - "analysis": """让我们一步一步地思考。在问题“对比近3天翻唱版和纯音乐的歌曲播放量“中,我们被问: -“歌曲播放量”,所以我们需要column=[结算播放量] -”翻唱版“,所以我们需要column=[歌曲版本] -”和纯音乐的歌曲“,所以我们需要column=[语种] -”近7天“,所以我们需要column=[数据日期] -基于table和columns,可能的cell values 是 = ['翻唱版', '纯音乐', 7]。""", - "schema_links":"""["结算播放量", "歌曲版本", "语种", "数据日期", "'翻唱版'", "'纯音乐'", 7]""", - "sql":"""select 歌曲版本, 语种, 结算播放量 from 歌曲库 where 歌曲版本 = '翻唱版' and 语种 = '纯音乐' and datediff('day', 数据日期, '2023-05-22') <= 7 """ - }, - { "current_date":"2023-05-31", - "table_name":"艺人库", - "fields_list":"""["上下架状态", "歌手名", "歌手等级", "歌手类型", "歌手来源", "TME音乐人等级", "活跃区域", "年龄", "歌手才能", "歌手风格", "粉丝数", "抖音粉丝数", "网易粉丝数", "微博粉丝数", "网易歌曲数", "在架歌曲数", "网易分享数", "独占歌曲数", "网易在架歌曲评论数", "有播放量歌曲数", "数据日期"]""", - "question":"对比一下陈卓璇、孟美岐、赖美云的粉丝数", - "prior_schema_links":"""['1527896'->TME歌手ID, '1565463'->TME歌手ID, '2141459'->TME歌手ID]""", - "analysis": """让我们一步一步地思考。在问题“对比一下陈卓璇、孟美岐、赖美云的粉丝数“中,我们被问: -“粉丝数”,所以我们需要column=[粉丝数] -”陈卓璇、孟美岐、赖美云“,所以我们需要column=[歌手名] -基于table和columns,可能的cell values 是 = ['陈卓璇', '孟美岐', '赖美云']。""", - "schema_links":"""["粉丝数", "歌手名", "'陈卓璇'", "'孟美岐'", "'赖美云'"]""", - "sql":"""select 歌手名, 粉丝数 from 艺人库 where 歌手名 in ('陈卓璇', '孟美岐', '赖美云') and 数据日期 = '2023-05-31' """ - }, - { "current_date":"2023-07-31", - "table_name":"歌曲库", - "fields_list":"""["歌曲名", "歌曲版本", "歌曲类型", "TME歌曲ID", "是否优选窄口径歌曲", "是否优选宽口径歌曲", "是否音乐人歌曲", "网易歌曲ID", "Q音歌曲ID", "Q音歌曲MID", "结算播放量", "运营播放量", "分享量", "收藏量", "运营搜播量", "结算搜播量", "拉新用户数", "拉活用户数", "分享率", "结算播放份额", "数据日期"]""", - "question":"播放量大于1万的歌曲有多少", - "prior_schema_links":"""[]""", - "analysis": """让我们一步一步地思考。在问题“播放量大于1万的歌曲有多少“中,我们被问: -“歌曲有多少”,所以我们需要column=[歌曲名] -”播放量大于1万的“,所以我们需要column=[结算播放量] -基于table和columns,可能的cell values 是 = [10000]。""", - "schema_links":"""["歌曲名", "结算播放量", 10000]""", - "sql":"""select 歌曲名 from 歌曲库 where 结算播放量 > 10000 and 数据日期 = '2023-07-31' """ - }, - { "current_date":"2023-07-31", - "table_name":"内容库产品", - "fields_list":"""["用户名", "部门", "模块", "访问时长", "访问次数", "访问人数", "数据日期"]""", - "question":"内容库访问时长小于1小时,且来自内容合作部的用户是哪些", - "prior_schema_links":"""['内容合作部'->部门]""", - "analysis": """让我们一步一步地思考。在问题“内容库访问时长小于1小时,且来自内容合作部的用户是哪些“中,我们被问: -“用户是哪些”,所以我们需要column=[用户名] -”内容合作部的“,所以我们需要column=[部门] -”访问时长小于1小时“,所以我们需要column=[访问时长] -基于table和columns,可能的cell values 是 = ['内容合作部', 1]。""", - "schema_links":"""["用户名", "部门", "访问时长", "'内容合作部'", 1]""", - "sql":"""select 用户名 from 内容库产品 where 部门 = '内容合作部' and 访问时长 < 1 and 数据日期 = '2023-07-31' """ - }, - { "current_date":"2023-08-31", - "table_name":"内容库产品", - "fields_list":"""["用户名", "部门", "模块", "访问时长", "访问次数", "访问人数", "数据日期"]""", - "question":"内容库pv最高的用户有哪些", - "prior_schema_links":"""[]""", - "analysis": """让我们一步一步地思考。在问题“内容库pv最高的用户有哪些“中,我们被问: -“用户有哪些”,所以我们需要column=[用户名] -”pv最高的“,所以我们需要column=[访问次数] -基于table和columns,可能的cell values 是 = []。""", - "schema_links":"""["用户名", "访问次数"]""", - "sql":"""select 用户名 from 内容库产品 where 数据日期 = '2023-08-31' order by 访问次数 desc limit 10 """ - }, - { "current_date":"2023-08-31", - "table_name":"艺人库", - "fields_list":"""["播放量层级", "播放量单调性", "播放量方差", "播放量突增类型", "播放量集中度", "歌手名", "歌手等级", "歌手类型", "歌手来源", "TME音乐人等级", "结算播放量", "运营播放量", "历史累计结算播放量", "有播放量歌曲数", "历史累计运营播放量", "付费用户结算播放量", "结算播放量占比", "运营播放份额", "免费用户结算播放占比", "完播量", "数据日期"]""", - "question":"近90天袁娅维播放量平均值是多少", - "prior_schema_links":"""['152789226'->TME歌手ID]""", - "analysis": """让我们一步一步地思考。在问题“近90天袁娅维播放量平均值是多少“中,我们被问: -“播放量平均值是多少”,所以我们需要column=[结算播放量] -”袁娅维“,所以我们需要column=[歌手名] -”近90天“,所以我们需要column=[数据日期] -基于table和columns,可能的cell values 是 = ['袁娅维', 90]。""", - "schema_links":"""["结算播放量", "歌手名", "数据日期", "'袁娅维'", 90]""", - "sql":"""select avg(结算播放量) from 艺人库 where 歌手名 = '袁娅维' and datediff('day', 数据日期, '2023-08-31') <= 90 """ - }, - { "current_date":"2023-08-31", - "table_name":"艺人库", - "fields_list":"""["播放量层级", "播放量单调性", "播放量方差", "播放量突增类型", "播放量集中度", "歌手名", "歌手等级", "歌手类型", "歌手来源", "TME音乐人等级", "结算播放量", "运营播放量", "历史累计结算播放量", "有播放量歌曲数", "历史累计运营播放量", "付费用户结算播放量", "结算播放量占比", "运营播放份额", "免费用户结算播放占比", "完播量", "数据日期"]""", - "question":"周深近7天结算播放量总和是多少", - "prior_schema_links":"""['199509'->TME歌手ID]""", - "analysis": """让我们一步一步地思考。在问题“周深近7天结算播放量总和是多少“中,我们被问: -“结算播放量总和是多少”,所以我们需要column=[结算播放量] -”周深“,所以我们需要column=[歌手名] -”近7天“,所以我们需要column=[数据日期] -基于table和columns,可能的cell values 是 = ['周深', 7]。""", - "schema_links":"""["结算播放量", "歌手名", "数据日期", "'周深'", 7]""", - "sql":"""select sum(结算播放量) from 艺人库 where 歌手名 = '周深' and datediff('day', 数据日期, '2023-08-31') <= 7 """ - }, - { "current_date":"2023-09-14", - "table_name":"内容库产品", - "fields_list":"""["部门", "模块", "用户名", "访问次数", "访问人数", "访问时长", "数据日期"]""", - "question":"内容库访问次数大于1k的部门是哪些", - "prior_schema_links":"""[]""", - "analysis": """让我们一步一步地思考。在问题“内容库访问次数大于1k的部门是哪些“中,我们被问: -“部门是哪些”,所以我们需要column=[部门] -”访问次数大于1k的“,所以我们需要column=[访问次数] -基于table和columns,可能的cell values 是 = [1000]。""", - "schema_links":"""["部门", "访问次数", 1000]""", - "sql":"""select 部门 from 内容库产品 where 访问次数 > 1000 and 数据日期 = '2023-09-14' """ - }, - { "current_date":"2023-09-18", - "table_name":"歌曲库", - "fields_list":"""["歌曲名", "TME歌手ID", "歌曲版本", "歌曲类型", "TME歌曲ID", "是否优选窄口径歌曲", "是否优选宽口径歌曲", "是否音乐人歌曲", "网易歌曲ID", "Q音歌曲ID", "Q音歌曲MID", "结算播放量", "运营播放量", "分享量", "收藏量", "运营搜播量", "结算搜播量", "拉新用户数", "拉活用户数", "分享率", "结算播放份额", "数据日期"]""", - "question":"陈奕迅唱的所有的播放量大于20k的孤勇者有哪些", - "prior_schema_links":"""['199509'->TME歌手ID, '1527123'->TME歌曲ID]""", - "analysis": """让我们一步一步地思考。在问题“陈奕迅唱的所有的播放量大于20k的孤勇者有哪些“中,我们被问: -“孤勇者有哪些”,所以我们需要column=[歌曲名] -”播放量大于20k的“,所以我们需要column=[结算播放量] -”陈奕迅唱的“,所以我们需要column=[歌手名] -基于table和columns,可能的cell values 是 = [20000, '陈奕迅', '孤勇者']。""", - "schema_links":"""["歌曲名", "结算播放量", "歌手名", 20000, "'陈奕迅'", "'孤勇者'"]""", - "sql":"""select 歌曲名 from 歌曲库 where 结算播放量 > 20000 and 歌手名 = '陈奕迅' and 歌曲名 = '孤勇者' and 数据日期 = '2023-09-18' """ - }, - { "current_date":"2023-09-18", - "table_name":"歌曲库", - "fields_list":"""["歌曲名", "歌曲版本", "歌手名", "歌曲类型", "发布时间", "TME歌曲ID", "是否优选窄口径歌曲", "是否优选宽口径歌曲", "是否音乐人歌曲", "网易歌曲ID", "Q音歌曲ID", "Q音歌曲MID", "结算播放量", "运营播放量", "分享量", "收藏量", "运营搜播量", "结算搜播量", "拉新用户数", "拉活用户数", "分享率", "结算播放份额", "数据日期"]""", - "question":"周杰伦去年发布的歌曲有哪些", - "prior_schema_links":"""['23109'->TME歌手ID]""", - "analysis": """让我们一步一步地思考。在问题“周杰伦去年发布的歌曲有哪些“中,我们被问: -“歌曲有哪些”,所以我们需要column=[歌曲名] -”去年发布的“,所以我们需要column=[发布时间] -”周杰伦“,所以我们需要column=[歌手名] -基于table和columns,可能的cell values 是 = ['周杰伦', 1]。""", - "schema_links":"""["歌曲名", "发布时间", "歌手名", 1, "'周杰伦'"]""", - "sql":"""select 歌曲名 from 歌曲库 where datediff('year', 发布时间, '2023-09-18') <= 1 and 歌手名 = '周杰伦' and 数据日期 = '2023-09-18' """ - }, - { "current_date":"2023-09-11", - "table_name":"艺人库", - "fields_list":"""["播放量层级", "播放量单调性", "播放量方差", "播放量突增类型", "播放量集中度", "歌手名", "歌手等级", "歌手类型", "歌手来源", "签约日期", "TME音乐人等级", "结算播放量", "运营播放量", "历史累计结算播放量", "有播放量歌曲数", "历史累计运营播放量", "付费用户结算播放量", "结算播放量占比", "运营播放份额", "免费用户结算播放占比", "完播量", "数据日期"]""", - "question":"我想要近半年签约的播放量前十的歌手有哪些", - "prior_schema_links":"""[]""", - "analysis": """让我们一步一步地思考。在问题“我想要近半年签约的播放量前十的歌手“中,我们被问: -“歌手有哪些”,所以我们需要column=[歌手名] -”播放量前十的“,所以我们需要column=[结算播放量] -”近半年签约的“,所以我们需要column=[签约日期] -基于table和columns,可能的cell values 是 = [0.5, 10]。""", - "schema_links":"""["歌手名", "结算播放量", "签约日期", 0.5, 10]""", - "sql":"""select 歌手名 from 艺人库 where datediff('year', 签约日期, '2023-09-11') <= 0.5 and 数据日期 = '2023-09-11' order by 结算播放量 desc limit 10""" - }, - { "current_date":"2023-08-12", - "table_name":"歌曲库", - "fields_list": """["发行日期", "歌曲语言", "歌曲来源", "歌曲流派", "歌曲名", "歌曲版本", "歌曲类型", "发行时间", "数据日期"]""", - "question":"最近一年发行的歌曲中,有哪些在近7天播放超过一千万的", - "prior_schema_links":"""[]""", - "analysis": """让我们一步一步地思考。在问题“最近一年发行的歌曲中,有哪些在近7天播放超过一千万的“中,我们被问: -“发行的歌曲中,有哪些”,所以我们需要column=[歌曲名] -”最近一年发行的“,所以我们需要column=[发行日期] -”在近7天播放超过一千万的“,所以我们需要column=[数据日期, 结算播放量] -基于table和columns,可能的cell values 是 = [1, 10000000]""", - "schema_links":"""["歌曲名", "发行日期", "数据日期", "结算播放量", 1, 10000000]""", - "sql":"""select 歌曲名 from 歌曲库 where datediff('year', 发行日期, '2023-08-12') <= 1 and datediff('day', 数据日期, '2023-08-12') <= 7 and 结算播放量 > 10000000""" - }, - { "current_date":"2023-08-12", - "table_name":"歌曲库", - "fields_list": """["发行日期", "歌曲语言", "歌曲来源", "歌曲流派", "歌曲名", "歌曲版本", "歌曲类型", "发行时间", "数据日期"]""", - "question":"今年以来发行的歌曲中,有哪些在近7天播放超过一千万的", - "prior_schema_links":"""[]""", - "analysis": """让我们一步一步地思考。在问题“今年以来发行的歌曲中,有哪些在近7天播放超过一千万的“中,我们被问: -“发行的歌曲中,有哪些”,所以我们需要column=[歌曲名] -”今年以来发行的“,所以我们需要column=[发行日期] -”在近7天播放超过一千万的“,所以我们需要column=[数据日期, 结算播放量] -基于table和columns,可能的cell values 是 = [0, 7, 10000000]""", - "schema_links":"""["歌曲名", "发行日期", "数据日期", "结算播放量", 0, 7, 10000000]""", - "sql":"""select 歌曲名 from 歌曲库 where datediff('year', 发行日期, '2023-08-12') <= 0 and datediff('day', 数据日期, '2023-08-12') <= 7 and 结算播放量 > 10000000""" - }, - { "current_date":"2023-08-12", - "table_name":"歌曲库", - "fields_list": """["发行日期", "歌曲语言", "歌曲来源", "歌曲流派", "歌曲名", "歌曲版本", "歌曲类型", "发行时间", "数据日期"]""", - "question":"2023年以来发行的歌曲中,有哪些在近7天播放超过一千万的", - "prior_schema_links":"""['514129144'->TME歌曲ID]""", - "analysis": """让我们一步一步地思考。在问题“2023年以来发行的歌曲中,有哪些在近7天播放超过一千万的“中,我们被问: -“发行的歌曲中,有哪些”,所以我们需要column=[歌曲名] -”2023年以来发行的“,所以我们需要column=[发行日期] -”在近7天播放超过一千万的“,所以我们需要column=[数据日期, 结算播放量] -基于table和columns,可能的cell values 是 = [2023, 7, 10000000]""", - "schema_links":"""["歌曲名", "发行日期", "数据日期", "结算播放量", 2023, 7, 10000000]""", - "sql":"""select 歌曲名 from 歌曲库 where YEAR(发行日期) >= 2023 and datediff('day', 数据日期, '2023-08-12') <= 7 and 结算播放量 > 10000000""" - }, - { "current_date":"2023-08-01", - "table_name":"歌曲库", - "fields_list":"""["歌曲名", "歌曲版本", "歌手名", "歌曲类型", "发布时间", "TME歌曲ID", "是否优选窄口径歌曲", "是否优选宽口径歌曲", "是否音乐人歌曲", "网易歌曲ID", "Q音歌曲ID", "Q音歌曲MID", "结算播放量", "运营播放量", "分享量", "收藏量", "运营搜播量", "结算搜播量", "拉新用户数", "拉活用户数", "分享率", "结算播放份额", "数据日期"]""", - "question":"周杰伦2023年6月之后发布的歌曲有哪些", - "prior_schema_links":"""['23109'->TME歌手ID]""", - "analysis": """让我们一步一步地思考。在问题“周杰伦2023年6月之后发布的歌曲有哪些“中,我们被问: -“歌曲有哪些”,所以我们需要column=[歌曲名] -”2023年6月之后发布的“,所以我们需要column=[发布时间] -”周杰伦“,所以我们需要column=[歌手名] -基于table和columns,可能的cell values 是 = ['周杰伦', 2023, 6]。""", - "schema_links":"""["歌曲名", "发布时间", "歌手名", "周杰伦", 2023, 6]""", - "sql":"""select 歌曲名 from 歌曲库 where YEAR(发布时间) >= 2023 and MONTH(发布时间) >= 6 and 歌手名 = '周杰伦' and 数据日期 = '2023-08-01' """ - }, - { "current_date":"2023-08-01", - "table_name":"歌曲库", - "fields_list":"""["歌曲名", "歌曲版本", "歌手名", "歌曲类型", "发布时间", "TME歌曲ID", "是否优选窄口径歌曲", "是否优选宽口径歌曲", "是否音乐人歌曲", "网易歌曲ID", "Q音歌曲ID", "Q音歌曲MID", "结算播放量", "运营播放量", "分享量", "收藏量", "运营搜播量", "结算搜播量", "拉新用户数", "拉活用户数", "分享率", "结算播放份额", "数据日期"]""", - "question":"邓紫棋在2023年1月5日之后发布的歌曲中,有哪些播放量大于500W的?", - "prior_schema_links":"""['2312311'->TME歌手ID]""", - "analysis": """让我们一步一步地思考。在问题“邓紫棋在2023年1月5日之后发布的歌曲中,有哪些播放量大于500W的?“中,我们被问: -“播放量大于500W的”,所以我们需要column=[结算播放量] -”邓紫棋在2023年1月5日之后发布的“,所以我们需要column=[发布时间] -”邓紫棋“,所以我们需要column=[歌手名] -基于table和columns,可能的cell values 是 = ['邓紫棋', 2023, 1, 5, 5000000]。""", - "schema_links":"""["结算播放量", "发布时间", "歌手名", "邓紫棋", 2023, 1, 5, 5000000]""", - "sql":"""select 歌曲名 from 歌曲库 where YEAR(发布时间) >= 2023 and MONTH(发布时间) >= 1 and DAY(发布时间) >= 5 and 歌手名 = '邓紫棋' and 结算播放量 > 5000000 and 数据日期 = '2023-08-01'""" - }, - { "current_date":"2023-09-17", - "table_name":"歌曲库", - "fields_list":"""["歌曲名", "歌曲版本", "歌手名", "歌曲类型", "发布时间", "TME歌曲ID", "是否优选窄口径歌曲", "是否优选宽口径歌曲", "是否音乐人歌曲", "网易歌曲ID", "Q音歌曲ID", "Q音歌曲MID", "结算播放量", "运营播放量", "分享量", "收藏量", "运营搜播量", "结算搜播量", "拉新用户数", "拉活用户数", "分享率", "结算播放份额", "数据日期"]""", - "question":"2023年6月以后,张靓颖播放量大于200万的歌曲有哪些?", - "prior_schema_links":"""['45453'->TME歌手ID]""", - "analysis": """让我们一步一步地思考。在问题“2023年6月以后,张靓颖播放量大于200万的歌曲有哪些?“中,我们被问: -“播放量大于200万的”,所以我们需要column=[结算播放量] -”2023年6月以后,张靓颖“,所以我们需要column=[数据日期, 歌手名] -”歌曲有哪些“,所以我们需要column=[歌曲名] -基于table和columns,可能的cell values 是 = ['张靓颖', 2023, 6, 2000000]。""", - "schema_links":"""["结算播放量", "数据日期", "歌手名", "张靓颖", 2023, 6, 2000000]""", - "sql":"""select 歌曲名 from 歌曲库 where YEAR(数据日期) >= 2023 and MONTH(数据日期) >= 6 and 歌手名 = '张靓颖' and 结算播放量 > 2000000 """ - }, - { "current_date":"2023-08-16", - "table_name":"歌曲库", - "fields_list":"""["歌曲名", "歌曲版本", "歌手名", "歌曲类型", "发布时间", "TME歌曲ID", "是否优选窄口径歌曲", "是否优选宽口径歌曲", "是否音乐人歌曲", "网易歌曲ID", "Q音歌曲ID", "Q音歌曲MID", "结算播放量", "运营播放量", "分享量", "收藏量", "运营搜播量", "结算搜播量", "拉新用户数", "拉活用户数", "分享率", "结算播放份额", "数据日期"]""", - "question":"2021年6月以后发布的李宇春的播放量大于20万的歌曲有哪些", - "prior_schema_links":"""['23109'->TME歌手ID]""", - "analysis": """让我们一步一步地思考。在问题“2021年6月以后发布的李宇春的播放量大于20万的歌曲有哪些“中,我们被问: -“播放量大于20万的”,所以我们需要column=[结算播放量] -”2021年6月以后发布的“,所以我们需要column=[发布时间] -”李宇春“,所以我们需要column=[歌手名] -基于table和columns,可能的cell values 是 = ['李宇春', 2021, 6, 200000]。""", - "schema_links":"""["结算播放量", "发布时间", "歌手名", "李宇春", 2021, 6, 200000]""", - "sql":"""select 歌曲名 from 歌曲库 where YEAR(发布时间) >= 2021 and MONTH(发布时间) >= 6 and 歌手名 = '李宇春' and 结算播放量 > 200000 and 数据日期 = '2023-08-16'""" - }, - { "current_date":"2023-08-16", - "table_name":"歌曲库", - "fields_list":"""["歌曲名", "歌曲版本", "歌手名", "歌曲类型", "发布时间", "TME歌曲ID", "是否优选窄口径歌曲", "是否优选宽口径歌曲", "是否音乐人歌曲", "网易歌曲ID", "Q音歌曲ID", "Q音歌曲MID", "结算播放量", "运营播放量", "分享量", "收藏量", "运营搜播量", "结算搜播量", "拉新用户数", "拉活用户数", "分享率", "结算播放份额", "数据日期"]""", - "question":"刘德华在1992年4月2日到2020年5月2日之间发布的播放量大于20万的歌曲有哪些", - "prior_schema_links":"""['4234234'->TME歌手ID]""", - "analysis": """让我们一步一步地思考。在问题“刘德华在1992年4月2日到2020年5月2日之间发布的播放量大于20万的歌曲有哪些“中,我们被问: -“播放量大于20万的”,所以我们需要column=[结算播放量] -”1992年4月2日到2020年5月2日之间发布的“,所以我们需要column=[发布时间] -”刘德华“,所以我们需要column=[歌手名] -基于table和columns,可能的cell values 是 = ['刘德华', 1992, 4, 2, 2020, 5, 2, 200000]。""", - "schema_links":"""["结算播放量", "发布时间", "歌手名", "刘德华", 1992, 4, 2, 2020, 5, 2, 200000]""", - "sql":"""select 歌曲名 from 歌曲库 where YEAR(发布时间) >= 1992 and MONTH(发布时间) >= 4 and DAY(发布时间) >= 2 and YEAR(发布时间) <= 2020 and MONTH(发布时间) <= 5 and DAY(发布时间) <= 2 and 歌手名 = '刘德华' and 结算播放量 > 200000 and 数据日期 = '2023-08-16'""" - } -] \ No newline at end of file diff --git a/chat/core/src/main/python/llm/preset_retrieval/run.py b/chat/core/src/main/python/llm/preset_retrieval/run.py index dc501b49c..9027253bf 100644 --- a/chat/core/src/main/python/llm/preset_retrieval/run.py +++ b/chat/core/src/main/python/llm/preset_retrieval/run.py @@ -8,7 +8,8 @@ from typing import Any, List, Mapping, Optional, Union sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) sys.path.append(os.path.dirname(os.path.abspath(__file__))) - +import chromadb +from chromadb.config import Settings from chromadb.api import Collection, Documents, Embeddings from langchain.llms import OpenAI @@ -20,9 +21,13 @@ from preset_query_db import (get_ids, add2preset_query_collection, from util.text2vec import Text2VecEmbeddingFunction from run_config import CHROMA_DB_PERSIST_PATH, PRESET_QUERY_COLLECTION_NAME -from util.chromadb_instance import client +client = chromadb.Client(Settings( + chroma_db_impl="duckdb+parquet", + persist_directory=CHROMA_DB_PERSIST_PATH # Optional, defaults to .chromadb/ in the current directory +)) + emb_func = Text2VecEmbeddingFunction() collection = client.get_or_create_collection(name=PRESET_QUERY_COLLECTION_NAME, @@ -30,8 +35,6 @@ collection = client.get_or_create_collection(name=PRESET_QUERY_COLLECTION_NAME, metadata={"hnsw:space": "cosine"} ) # Get a collection object from an existing collection, by name. If it doesn't exist, create it. -print("init_preset_query_collection_size: ", preset_query_collection_size(collection)) - def preset_query_retrieval_run(collection:Collection, query_texts_list:List[str], n_results:int=5): retrieval_res = query2preset_query_collection(collection=collection, diff --git a/chat/core/src/main/python/llm/run_config.py b/chat/core/src/main/python/llm/run_config.py index e2b47b404..989b44e5a 100644 --- a/chat/core/src/main/python/llm/run_config.py +++ b/chat/core/src/main/python/llm/run_config.py @@ -9,7 +9,6 @@ TEMPERATURE = 0.0 CHROMA_DB_PERSIST_DIR = 'chm_db' PRESET_QUERY_COLLECTION_NAME = "preset_query_collection" -TEXT2DSL_COLLECTION_NAME = "text2dsl_collection" CHROMA_DB_PERSIST_PATH = os.path.join(PROJECT_DIR_PATH, CHROMA_DB_PERSIST_DIR) diff --git a/chat/core/src/main/python/llm/sql/constructor.py b/chat/core/src/main/python/llm/sql/constructor.py deleted file mode 100644 index c6f367492..000000000 --- a/chat/core/src/main/python/llm/sql/constructor.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding:utf-8 -*- -import os -import sys - -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -sys.path.append(os.path.dirname(os.path.abspath(__file__))) - -from langchain.prompts.few_shot import FewShotPromptTemplate -from langchain.prompts import PromptTemplate -from langchain.vectorstores import Chroma -from langchain.embeddings import OpenAIEmbeddings, HuggingFaceEmbeddings -from langchain.prompts.example_selector import SemanticSimilarityExampleSelector - -import chromadb -from chromadb.config import Settings - -from few_shot_example.sql_exampler import examplars as din_sql_examplars -from util.text2vec import Text2VecEmbeddingFunction, hg_embedding -from util.chromadb_instance import client as chromadb_client - - -from run_config import TEXT2DSL_COLLECTION_NAME - - -vectorstore = Chroma(collection_name=TEXT2DSL_COLLECTION_NAME, - embedding_function=hg_embedding, - client=chromadb_client) - -example_nums = 15 - -schema_linking_example_selector = SemanticSimilarityExampleSelector(vectorstore=vectorstore, k=example_nums, - input_keys=["question"], - example_keys=["table_name", "fields_list", "prior_schema_links", "question", "analysis", "schema_links"]) - -sql_example_selector = SemanticSimilarityExampleSelector(vectorstore=vectorstore, k=example_nums, - input_keys=["question"], - example_keys=["question", "current_date", "table_name", "schema_links", "sql"]) - -if vectorstore._collection.count() > 0: - print("examples already in din_sql_vectorstore") - print("init din_sql_vectorstore size:", vectorstore._collection.count()) - if vectorstore._collection.count() < len(din_sql_examplars): - print("din_sql_examplars size:", len(din_sql_examplars)) - vectorstore._collection.delete() - print("empty din_sql_vectorstore") - for example in din_sql_examplars: - schema_linking_example_selector.add_example(example) - print("added din_sql_vectorstore size:", vectorstore._collection.count()) -else: - for example in din_sql_examplars: - schema_linking_example_selector.add_example(example) - - print("added din_sql_vectorstore size:", vectorstore._collection.count()) diff --git a/chat/core/src/main/python/llm/sql/output_parser.py b/chat/core/src/main/python/llm/sql/output_parser.py index c90388850..64df5ba1f 100644 --- a/chat/core/src/main/python/llm/sql/output_parser.py +++ b/chat/core/src/main/python/llm/sql/output_parser.py @@ -1,13 +1,15 @@ # -*- coding:utf-8 -*- import re -def schema_link_parse(schema_link_output): - try: - schema_link_output = schema_link_output.strip() - pattern = r'Schema_links:(.*)' - schema_link_output = re.findall(pattern, schema_link_output, re.DOTALL)[0].strip() - except Exception as e: - print(e) - schema_link_output = None - return schema_link_output \ No newline at end of file +def schema_link_parse(schema_link_output): + try: + schema_link_output = schema_link_output.strip() + pattern = r'Schema_links:(.*)' + schema_link_output = re.findall(pattern, schema_link_output, re.DOTALL)[ + 0].strip() + except Exception as e: + print(e) + schema_link_output = None + + return schema_link_output diff --git a/chat/core/src/main/python/llm/sql/prompt_maker.py b/chat/core/src/main/python/llm/sql/prompt_maker.py index 0cfed83b1..6e05f95b3 100644 --- a/chat/core/src/main/python/llm/sql/prompt_maker.py +++ b/chat/core/src/main/python/llm/sql/prompt_maker.py @@ -1,5 +1,8 @@ # -*- coding:utf-8 -*- from typing import Any, List, Mapping, Optional, Union +import requests +import logging +import json import os import sys @@ -8,68 +11,78 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from langchain.prompts import PromptTemplate from langchain.prompts.few_shot import FewShotPromptTemplate -from langchain.prompts.example_selector import SemanticSimilarityExampleSelector +from langchain.llms import OpenAI + +from few_shot_example.sql_exampler import examplars +from output_parser import schema_link_parse + + +def schema_linking_prompt_maker(user_query: str, model_name: str, + fields_list: List[str], + few_shots_example: str): + instruction = "# 根据数据库的表结构,找出为每个问题生成SQL查询语句的schema_links\n" + + schema_linking_prompt = "Table {table_name}, columns = {fields_list}\n问题:{user_query}\n分析: 让我们一步一步地思考。".format( + table_name=model_name, + fields_list=fields_list, + user_query=user_query) + + return instruction + few_shots_example + schema_linking_prompt def schema_linking_exampler(user_query: str, - domain_name: str, - fields_list: List[str], - prior_schema_links: Mapping[str,str], - example_selector: SemanticSimilarityExampleSelector, - ) -> str: + model_name: str, + fields_list: List[str] +) -> str: + example_prompt_template = PromptTemplate( + input_variables=["table_name", "fields_list", "question", "analysis", + "schema_links"], + template="Table {table_name}, columns = {fields_list}\n问题:{question}\n分析:{analysis} 所以Schema_links是:\nSchema_links:{schema_links}") - prior_schema_links_str = '['+ ','.join(["""'{}'->{}""".format(k,v) for k,v in prior_schema_links.items()]) + ']' + instruction = "# 根据数据库的表结构,找出为每个问题生成SQL查询语句的schema_links" - example_prompt_template = PromptTemplate(input_variables=["table_name", "fields_list", "prior_schema_links", "question", "analysis", "schema_links"], - template="Table {table_name}, columns = {fields_list}, prior_schema_links = {prior_schema_links}\n问题:{question}\n分析:{analysis} 所以Schema_links是:\nSchema_links:{schema_links}") + schema_linking_prompt = "Table {table_name}, columns = {fields_list}\n问题:{question}\n分析: 让我们一步一步地思考。" - instruction = "# 根据数据库的表结构,参考先验信息,找出为每个问题生成SQL查询语句的schema_links" + schema_linking_example_prompt_template = FewShotPromptTemplate( + examples=examplars, + example_prompt=example_prompt_template, + example_separator="\n\n", + prefix=instruction, + input_variables=["table_name", "fields_list", "question"], + suffix=schema_linking_prompt + ) - schema_linking_prompt = "Table {table_name}, columns = {fields_list}, prior_schema_links = {prior_schema_links}\n问题:{question}\n分析: 让我们一步一步地思考。" + schema_linking_example_prompt = schema_linking_example_prompt_template.format( + table_name=model_name, + fields_list=fields_list, + question=user_query) - schema_linking_example_prompt_template = FewShotPromptTemplate( - example_selector=example_selector, - example_prompt=example_prompt_template, - example_separator="\n\n", - prefix=instruction, - input_variables=["table_name", "fields_list", "prior_schema_links", "question"], - suffix=schema_linking_prompt - ) - - schema_linking_example_prompt = schema_linking_example_prompt_template.format(table_name=domain_name, - fields_list=fields_list, - prior_schema_links=prior_schema_links_str, - question=user_query) - - return schema_linking_example_prompt + return schema_linking_example_prompt def sql_exampler(user_query: str, - domain_name: str, - schema_link_str: str, - data_date: str, - example_selector: SemanticSimilarityExampleSelector, - ) -> str: - - instruction = "# 根据schema_links为每个问题生成SQL查询语句" + model_name: str, + schema_link_str: str +) -> str: + instruction = "# 根据schema_links为每个问题生成SQL查询语句" - sql_example_prompt_template = PromptTemplate(input_variables=["question", "current_date", "table_name", "schema_links", "sql"], - template="问题:{question}\nCurrent_date:{current_date}\nTable {table_name}\nSchema_links:{schema_links}\nSQL:{sql}") + sql_example_prompt_template = PromptTemplate( + input_variables=["question", "table_name", "schema_links", "sql"], + template="问题:{question}\nTable {table_name}\nSchema_links:{schema_links}\nSQL:{sql}") - sql_prompt = "问题:{question}\nCurrent_date:{current_date}\nTable {table_name}\nSchema_links:{schema_links}\nSQL:" + sql_prompt = "问题:{question}\nTable {table_name}\nSchema_links:{schema_links}\nSQL:" - sql_example_prompt_template = FewShotPromptTemplate( - example_selector=example_selector, - example_prompt=sql_example_prompt_template, - example_separator="\n\n", - prefix=instruction, - input_variables=["question", "current_date", "table_name", "schema_links"], - suffix=sql_prompt - ) + sql_example_prompt_template = FewShotPromptTemplate( + examples=examplars, + example_prompt=sql_example_prompt_template, + example_separator="\n\n", + prefix=instruction, + input_variables=["question", "table_name", "schema_links"], + suffix=sql_prompt + ) - sql_example_prompt = sql_example_prompt_template.format(question=user_query, - current_date=data_date, - table_name=domain_name, - schema_links=schema_link_str) + sql_example_prompt = sql_example_prompt_template.format(question=user_query, + table_name=model_name, + schema_links=schema_link_str) - return sql_example_prompt + return sql_example_prompt diff --git a/chat/core/src/main/python/llm/sql/run.py b/chat/core/src/main/python/llm/sql/run.py index 34919799b..ea60d7f36 100644 --- a/chat/core/src/main/python/llm/sql/run.py +++ b/chat/core/src/main/python/llm/sql/run.py @@ -1,4 +1,6 @@ -from typing import List, Union, Mapping +# -*- coding:utf-8 -*- + +from typing import List, Union import logging import json import os @@ -7,54 +9,33 @@ import sys sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) sys.path.append(os.path.dirname(os.path.abspath(__file__))) -from sql.prompt_maker import schema_linking_exampler, sql_exampler -from sql.constructor import schema_linking_example_selector, sql_example_selector -from sql.output_parser import schema_link_parse +from sql.prompt_maker import schema_linking_exampler, schema_link_parse, \ + sql_exampler from util.llm_instance import llm +def query2sql(query_text: str, schema: dict): + print("schema: ", schema) -def query2sql(query_text: str, - schema : Union[dict, None] = None, - current_date: str = None, - linking: Union[List[Mapping[str, str]], None] = None - ): - - print("query_text: ", query_text) - print("schema: ", schema) - print("current_date: ", current_date) - print("prior_schema_links: ", linking) + model_name = schema['modelName'] + fields_list = schema['fieldNameList'] - if linking is not None: - prior_schema_links = {item['fieldValue']:item['fieldName'] for item in linking} - else: - prior_schema_links = {} + schema_linking_prompt = schema_linking_exampler(query_text, model_name, + fields_list) + schema_link_output = llm(schema_linking_prompt) + schema_link_str = schema_link_parse(schema_link_output) - model_name = schema['modelName'] - fields_list = schema['fieldNameList'] + sql_prompt = sql_exampler(query_text, model_name, schema_link_str) + sql_output = llm(sql_prompt) - schema_linking_prompt = schema_linking_exampler(query_text, model_name, fields_list, prior_schema_links, schema_linking_example_selector) - print("schema_linking_prompt->", schema_linking_prompt) - schema_link_output = llm(schema_linking_prompt) - schema_link_str = schema_link_parse(schema_link_output) - - sql_prompt = sql_exampler(query_text, model_name, schema_link_str, current_date, sql_example_selector) - print("sql_prompt->", sql_prompt) - sql_output = llm(sql_prompt) + resp = dict() + resp['query'] = query_text + resp['model'] = model_name + resp['fields'] = fields_list - resp = dict() - resp['query'] = query_text - resp['model'] = model_name - resp['fields'] = fields_list - resp['priorSchemaLinking'] = linking - resp['dataDate'] = current_date + resp['schemaLinkingOutput'] = schema_link_output + resp['schemaLinkStr'] = schema_link_str - resp['schemaLinkingOutput'] = schema_link_output - resp['schemaLinkStr'] = schema_link_str - - resp['sqlOutput'] = sql_output - - print("resp: ", resp) - - return resp + resp['sqlOutput'] = sql_output + return resp diff --git a/chat/core/src/main/python/llm/util/chromadb_instance.py b/chat/core/src/main/python/llm/util/chromadb_instance.py deleted file mode 100644 index f0fe6ce01..000000000 --- a/chat/core/src/main/python/llm/util/chromadb_instance.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding:utf-8 -*- -import chromadb -from chromadb.config import Settings - -from run_config import CHROMA_DB_PERSIST_PATH - -client = chromadb.Client(Settings( - chroma_db_impl="duckdb+parquet", - persist_directory=CHROMA_DB_PERSIST_PATH # Optional, defaults to .chromadb/ in the current directory -)) \ No newline at end of file diff --git a/chat/core/src/main/resources/mapper/ChatParseMapper.xml b/chat/core/src/main/resources/mapper/ChatParseMapper.xml new file mode 100644 index 000000000..cede70423 --- /dev/null +++ b/chat/core/src/main/resources/mapper/ChatParseMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + insert into s2_chat_parse + (question_id, chat_id, parse_id, create_time, query_text, user_name, parse_info,is_candidate) + values + + (#{item.questionId}, #{item.chatId}, #{item.parseId}, #{item.createTime}, #{item.queryText}, #{item.userName}, #{item.parseInfo}, #{item.isCandidate}) + + + + + + diff --git a/chat/core/src/main/resources/mapper/ChatQueryDOMapper.xml b/chat/core/src/main/resources/mapper/ChatQueryDOMapper.xml index 7de775067..72cbbc4b4 100644 --- a/chat/core/src/main/resources/mapper/ChatQueryDOMapper.xml +++ b/chat/core/src/main/resources/mapper/ChatQueryDOMapper.xml @@ -1,246 +1,244 @@ - + - - - - - - - - - - - - - - - - - - - - - - and ${criterion.condition} - - - and ${criterion.condition} #{criterion.value} - - - and ${criterion.condition} #{criterion.value} and - #{criterion.secondValue} - - - and ${criterion.condition} - - #{listItem} - - - - - - + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + - - - - question_id - , create_time, user_name, query_state, chat_id, score, feedback - - - query_text - , query_response - - - - - - delete - from s2_chat_query - where question_id = #{questionId,jdbcType=BIGINT} - - - insert into s2_chat_query (question_id, create_time, user_name, - query_state, chat_id, score, - feedback, query_text, query_response) - values (#{questionId,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, - #{userName,jdbcType=VARCHAR}, - #{queryState,jdbcType=INTEGER}, #{chatId,jdbcType=BIGINT}, - #{score,jdbcType=INTEGER}, - #{feedback,jdbcType=VARCHAR}, #{queryText,jdbcType=LONGVARCHAR}, - #{queryResult,jdbcType=LONGVARCHAR}) - - - insert into s2_chat_query - - - question_id, - - - create_time, - - - user_name, - - - query_state, - - - chat_id, - - - score, - - - feedback, - - - query_text, - - - query_response, - - - - - #{questionId,jdbcType=BIGINT}, - - - #{createTime,jdbcType=TIMESTAMP}, - - - #{userName,jdbcType=VARCHAR}, - - - #{queryState,jdbcType=INTEGER}, - - - #{chatId,jdbcType=BIGINT}, - - - #{score,jdbcType=INTEGER}, - - - #{feedback,jdbcType=VARCHAR}, - - - #{queryText,jdbcType=LONGVARCHAR}, - - - #{queryResult,jdbcType=LONGVARCHAR}, - - - - - - update s2_chat_query - - - create_time = #{createTime,jdbcType=TIMESTAMP}, - - - user_name = #{userName,jdbcType=VARCHAR}, - - - query_state = #{queryState,jdbcType=INTEGER}, - - - chat_id = #{chatId,jdbcType=BIGINT}, - - - score = #{score,jdbcType=INTEGER}, - - - feedback = #{feedback,jdbcType=VARCHAR}, - - - query_text = #{queryText,jdbcType=LONGVARCHAR}, - - - query_response = #{queryResult,jdbcType=LONGVARCHAR}, - - - where question_id = #{questionId,jdbcType=BIGINT} - - - update s2_chat_query - set create_time = #{createTime,jdbcType=TIMESTAMP}, - user_name = #{userName,jdbcType=VARCHAR}, - query_state = #{queryState,jdbcType=INTEGER}, - chat_id = #{chatId,jdbcType=BIGINT}, - score = #{score,jdbcType=INTEGER}, - feedback = #{feedback,jdbcType=VARCHAR}, - query_text = #{queryText,jdbcType=LONGVARCHAR}, - query_response = #{queryResult,jdbcType=LONGVARCHAR} - where question_id = #{questionId,jdbcType=BIGINT} - - - update s2_chat_query - set create_time = #{createTime,jdbcType=TIMESTAMP}, - user_name = #{userName,jdbcType=VARCHAR}, - query_state = #{queryState,jdbcType=INTEGER}, - chat_id = #{chatId,jdbcType=BIGINT}, - score = #{score,jdbcType=INTEGER}, - feedback = #{feedback,jdbcType=VARCHAR} - where question_id = #{questionId,jdbcType=BIGINT} - - \ No newline at end of file + + + + + question_id, create_time, user_name, query_state, chat_id, score, feedback + + + query_text, query_result + + + + + + delete from s2_chat_query + where question_id = #{questionId,jdbcType=BIGINT} + + + insert into s2_chat_query (question_id, create_time, user_name, + query_state, chat_id, score, + feedback, query_text, query_result + ) + values (#{questionId,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{userName,jdbcType=VARCHAR}, + #{queryState,jdbcType=INTEGER}, #{chatId,jdbcType=BIGINT}, #{score,jdbcType=INTEGER}, + #{feedback,jdbcType=VARCHAR}, #{queryText,jdbcType=LONGVARCHAR}, #{queryResult,jdbcType=LONGVARCHAR} + ) + + + insert into s2_chat_query + + + question_id, + + + create_time, + + + user_name, + + + query_state, + + + chat_id, + + + score, + + + feedback, + + + query_text, + + + query_result, + + + + + #{questionId,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{userName,jdbcType=VARCHAR}, + + + #{queryState,jdbcType=INTEGER}, + + + #{chatId,jdbcType=BIGINT}, + + + #{score,jdbcType=INTEGER}, + + + #{feedback,jdbcType=VARCHAR}, + + + #{queryText,jdbcType=LONGVARCHAR}, + + + #{queryResult,jdbcType=LONGVARCHAR}, + + + + + + update s2_chat_query + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + user_name = #{userName,jdbcType=VARCHAR}, + + + query_state = #{queryState,jdbcType=INTEGER}, + + + chat_id = #{chatId,jdbcType=BIGINT}, + + + score = #{score,jdbcType=INTEGER}, + + + feedback = #{feedback,jdbcType=VARCHAR}, + + + query_text = #{queryText,jdbcType=LONGVARCHAR}, + + + query_result = #{queryResult,jdbcType=LONGVARCHAR}, + + + where question_id = #{questionId,jdbcType=BIGINT} + + + update s2_chat_query + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + user_name = #{userName,jdbcType=VARCHAR}, + + + query_state = #{queryState,jdbcType=INTEGER}, + + + chat_id = #{chatId,jdbcType=BIGINT}, + + + score = #{score,jdbcType=INTEGER}, + + + feedback = #{feedback,jdbcType=VARCHAR}, + + + query_text = #{queryText,jdbcType=LONGVARCHAR}, + + + query_result = #{queryResult,jdbcType=LONGVARCHAR}, + + + where question_id = #{questionId,jdbcType=BIGINT} + + + update s2_chat_query + set create_time = #{createTime,jdbcType=TIMESTAMP}, + user_name = #{userName,jdbcType=VARCHAR}, + query_state = #{queryState,jdbcType=INTEGER}, + chat_id = #{chatId,jdbcType=BIGINT}, + score = #{score,jdbcType=INTEGER}, + feedback = #{feedback,jdbcType=VARCHAR} + where question_id = #{questionId,jdbcType=BIGINT} + + diff --git a/chat/core/src/main/resources/mapper/StatisticsMapper.xml b/chat/core/src/main/resources/mapper/StatisticsMapper.xml new file mode 100644 index 000000000..2470c222d --- /dev/null +++ b/chat/core/src/main/resources/mapper/StatisticsMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + insert into s2_chat_statistics + (question_id,chat_id, user_name, query_text, interface_name,cost,type ,create_time) + values + + (#{item.questionId}, #{item.chatId}, #{item.userName}, #{item.queryText}, #{item.interfaceName}, #{item.cost}, #{item.type},#{item.createTime}) + + + + + + diff --git a/chat/core/src/main/resources/mapper/custom/ShowCaseCustomMapper.xml b/chat/core/src/main/resources/mapper/custom/ShowCaseCustomMapper.xml new file mode 100644 index 000000000..adaf36822 --- /dev/null +++ b/chat/core/src/main/resources/mapper/custom/ShowCaseCustomMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and + #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, model_id, name, biz_name, description, type, created_at, created_by, updated_at, updated_by + + + typeParams + + + + + diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/TimeRangeParserTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/TimeRangeParserTest.java index 52d0ba795..f4e136a1c 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/TimeRangeParserTest.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/application/parser/TimeRangeParserTest.java @@ -2,7 +2,6 @@ package com.tencent.supersonic.chat.application.parser; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.QueryContext; -import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.parser.rule.TimeRangeParser; import org.junit.jupiter.api.Test; @@ -10,35 +9,15 @@ import org.junit.jupiter.api.Test; class TimeRangeParserTest { -// private HeuristicQuerySelector voteStrategy = new HeuristicQuerySelector() { -// @Override -// public void init(List semanticParsers) { -// List queryMode = new ArrayList<>(Arrays.asList(EntityDetailQuery.QUERY_MODE)); -// for(SemanticParser semanticParser : semanticParsers) { -// if(semanticParser.getName().equals(TimeRangeParser.PARSER_MODE)) { -// semanticParser.getQueryModes().clear(); -// semanticParser.getQueryModes().addAll(queryMode); -// } -// } -// } -// }; - @Test void parse() { TimeRangeParser timeRangeParser = new TimeRangeParser(); QueryReq queryRequest = new QueryReq(); ChatContext chatCtx = new ChatContext(); - SchemaMapInfo schemaMap = new SchemaMapInfo(); queryRequest.setQueryText("supersonic最近30天访问次数"); - //voteStrategy.init(new ArrayList<>(Arrays.asList(timeRangeParser))); timeRangeParser.parse(new QueryContext(queryRequest), chatCtx); - //DateConf dateInfo = queryContext.getParseInfo(timeRangeParser.getQueryModes().get(0)) - // .getDateInfo(); - - //System.out.println(dateInfo); - } -} \ No newline at end of file +} diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/MapperHelperTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/LoadRemoveServiceTest.java similarity index 90% rename from chat/core/src/test/java/com/tencent/supersonic/chat/mapper/MapperHelperTest.java rename to chat/core/src/test/java/com/tencent/supersonic/chat/mapper/LoadRemoveServiceTest.java index 21909410e..bb3d028fd 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/MapperHelperTest.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/LoadRemoveServiceTest.java @@ -5,7 +5,7 @@ import com.hankcs.hanlp.algorithm.EditDistance; import org.junit.Assert; import org.junit.jupiter.api.Test; -class MapperHelperTest { +class LoadRemoveServiceTest { @Test @@ -13,4 +13,4 @@ class MapperHelperTest { int compute = EditDistance.compute("在", "在你的身边"); Assert.assertEquals(compute, 4); } -} \ No newline at end of file +} diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDslParserTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDslParserTest.java new file mode 100644 index 000000000..e6f269e71 --- /dev/null +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDslParserTest.java @@ -0,0 +1,12 @@ +package com.tencent.supersonic.chat.parser.llm.dsl; + +import org.junit.jupiter.api.Test; + +class LLMDslParserTest { + + + @Test + void getDimensionFilter() { + } + +} \ No newline at end of file diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/query/dsl/optimizer/DateFieldCorrectorTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/query/llm/dsl/corrector/DateFieldCorrectorTest.java similarity index 78% rename from chat/core/src/test/java/com/tencent/supersonic/chat/query/dsl/optimizer/DateFieldCorrectorTest.java rename to chat/core/src/test/java/com/tencent/supersonic/chat/query/llm/dsl/corrector/DateFieldCorrectorTest.java index 51c08072b..4b530bbe7 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/query/dsl/optimizer/DateFieldCorrectorTest.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/query/llm/dsl/corrector/DateFieldCorrectorTest.java @@ -1,8 +1,9 @@ -package com.tencent.supersonic.chat.query.dsl.optimizer; +package com.tencent.supersonic.chat.query.llm.dsl.corrector; import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.corrector.DateFieldCorrector; import org.junit.Assert; import org.junit.jupiter.api.Test; @@ -20,18 +21,18 @@ class DateFieldCorrectorTest { .parseInfo(parseInfo) .build(); - CorrectionInfo rewriter = dateFieldCorrector.rewriter(correctionInfo); + CorrectionInfo rewriter = dateFieldCorrector.corrector(correctionInfo); Assert.assertEquals("SELECT count(歌曲名) FROM 歌曲库 WHERE 数据日期 = '2023-08-14'", rewriter.getSql()); - correctionInfo = CorrectionInfo.builder() + correctionInfo = CorrectionInfo.builder() .sql("select count(歌曲名) from 歌曲库 where 数据日期 = '2023-08-14'") .parseInfo(parseInfo) .build(); - rewriter = dateFieldCorrector.rewriter(correctionInfo); + rewriter = dateFieldCorrector.corrector(correctionInfo); Assert.assertEquals("select count(歌曲名) from 歌曲库 where 数据日期 = '2023-08-14'", rewriter.getSql()); } -} \ No newline at end of file +} diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/query/llm/dsl/corrector/FieldValueCorrectorTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/query/llm/dsl/corrector/FieldValueCorrectorTest.java new file mode 100644 index 000000000..c5f34907f --- /dev/null +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/query/llm/dsl/corrector/FieldValueCorrectorTest.java @@ -0,0 +1,66 @@ +package com.tencent.supersonic.chat.query.llm.dsl.corrector; + +import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.corrector.FieldValueCorrector; +import com.tencent.supersonic.chat.parser.llm.dsl.DSLParseResult; +import com.tencent.supersonic.chat.query.llm.dsl.LLMReq; +import com.tencent.supersonic.chat.query.llm.dsl.LLMReq.ElementValue; +import com.tencent.supersonic.common.pojo.Constants; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.Assert; +import org.junit.jupiter.api.Test; + +class FieldValueCorrectorTest { + + @Test + void rewriter() { + + FieldValueCorrector corrector = new FieldValueCorrector(); + CorrectionInfo correctionInfo = CorrectionInfo.builder() + .sql("select 歌曲名 from 歌曲库 where 专辑照片 = '七里香' and 专辑名 = '流行' and 数据日期 = '2023-08-19'") + .build(); + + SemanticParseInfo parseInfo = new SemanticParseInfo(); + + DSLParseResult dslParseResult = new DSLParseResult(); + LLMReq llmReq = new LLMReq(); + List linking = new ArrayList<>(); + ElementValue elementValue = new ElementValue(); + elementValue.setFieldValue("流行"); + elementValue.setFieldName("歌曲风格"); + linking.add(elementValue); + + ElementValue elementValue2 = new ElementValue(); + elementValue2.setFieldValue("七里香"); + elementValue2.setFieldName("歌曲名"); + linking.add(elementValue2); + + ElementValue elementValue3 = new ElementValue(); + elementValue3.setFieldValue("周杰伦"); + elementValue3.setFieldName("歌手名"); + linking.add(elementValue3); + + ElementValue elementValue4 = new ElementValue(); + elementValue4.setFieldValue("流行"); + elementValue4.setFieldName("歌曲流派"); + linking.add(elementValue4); + + llmReq.setLinking(linking); + dslParseResult.setLlmReq(llmReq); + + Map properties = new HashMap<>(); + properties.put(Constants.CONTEXT, dslParseResult); + + parseInfo.setProperties(properties); + correctionInfo.setParseInfo(parseInfo); + + CorrectionInfo rewriter = corrector.corrector(correctionInfo); + + Assert.assertEquals("SELECT 歌曲名 FROM 歌曲库 WHERE 歌曲名 = '七里香' AND 歌曲流派 = '流行' AND 数据日期 = '2023-08-19'", + rewriter.getSql()); + } +} \ No newline at end of file diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/query/dsl/optimizer/SelectFieldAppendCorrectorTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/query/llm/dsl/corrector/SelectFieldAppendCorrectorTest.java similarity index 53% rename from chat/core/src/test/java/com/tencent/supersonic/chat/query/dsl/optimizer/SelectFieldAppendCorrectorTest.java rename to chat/core/src/test/java/com/tencent/supersonic/chat/query/llm/dsl/corrector/SelectFieldAppendCorrectorTest.java index d796dd12d..176c0ac17 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/query/dsl/optimizer/SelectFieldAppendCorrectorTest.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/query/llm/dsl/corrector/SelectFieldAppendCorrectorTest.java @@ -1,8 +1,7 @@ -package com.tencent.supersonic.chat.query.dsl.optimizer; - -import static org.junit.jupiter.api.Assertions.*; +package com.tencent.supersonic.chat.query.llm.dsl.corrector; import com.tencent.supersonic.chat.api.pojo.CorrectionInfo; +import com.tencent.supersonic.chat.corrector.SelectFieldAppendCorrector; import org.junit.Assert; import org.junit.jupiter.api.Test; @@ -12,14 +11,16 @@ class SelectFieldAppendCorrectorTest { void rewriter() { SelectFieldAppendCorrector corrector = new SelectFieldAppendCorrector(); CorrectionInfo correctionInfo = CorrectionInfo.builder() - .sql("select 歌曲名 from 歌曲库 where datediff('day', 发布日期, '2023-08-09') <= 1 and 歌手名 = '邓紫棋' and sys_imp_date = '2023-08-09' and 歌曲发布时 = '2023-08-01' order by 播放量 desc limit 11") + .sql("select 歌曲名 from 歌曲库 where datediff('day', 发布日期, '2023-08-09') <= 1 and 歌手名 = '邓紫棋' " + + "and sys_imp_date = '2023-08-09' and 歌曲发布时 = '2023-08-01' order by 播放量 desc limit 11") .build(); - CorrectionInfo rewriter = corrector.rewriter(correctionInfo); + CorrectionInfo rewriter = corrector.corrector(correctionInfo); Assert.assertEquals( - "SELECT 歌曲名, 歌手名, 歌曲发布时, 发布日期 FROM 歌曲库 WHERE datediff('day', 发布日期, '2023-08-09') <= 1 AND 歌手名 = '邓紫棋' AND sys_imp_date = '2023-08-09' AND 歌曲发布时 = '2023-08-01' ORDER BY 播放量 DESC LIMIT 11", - rewriter.getSql()); + "SELECT 歌曲名, 歌手名, 歌曲发布时, 发布日期 FROM 歌曲库 WHERE datediff('day', 发布日期, '2023-08-09') <= 1 " + + "AND 歌手名 = '邓紫棋' AND sys_imp_date = '2023-08-09' " + + "AND 歌曲发布时 = '2023-08-01' ORDER BY 播放量 DESC LIMIT 11", rewriter.getSql()); } -} \ No newline at end of file +} diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/test/ChatBizLauncher.java b/chat/core/src/test/java/com/tencent/supersonic/chat/test/ChatBizLauncher.java index 7279ed301..fc996b200 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/test/ChatBizLauncher.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/test/ChatBizLauncher.java @@ -6,9 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; -@SpringBootApplication(scanBasePackages = {"com.tencent.supersonic.chat"} - // , exclude = {DataSourceAutoConfiguration.class} -) +@SpringBootApplication(scanBasePackages = {"com.tencent.supersonic.chat"}) @ComponentScan("com.tencent.supersonic.chat") @MapperScan("com.tencent.supersonic.chat") public class ChatBizLauncher { diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java index 700786744..39c24e53b 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java @@ -4,28 +4,26 @@ import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; -import com.tencent.supersonic.chat.api.component.SemanticLayer; import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.component.SemanticLayer; import com.tencent.supersonic.chat.api.pojo.response.ChatConfigResp; -import com.tencent.supersonic.chat.api.pojo.response.ChatConfigRichResp; -import com.tencent.supersonic.chat.api.pojo.response.EntityRichInfoResp; import com.tencent.supersonic.chat.config.DefaultMetric; import com.tencent.supersonic.chat.config.DefaultMetricInfo; import com.tencent.supersonic.chat.config.EntityInternalDetail; -import com.tencent.supersonic.chat.persistence.mapper.ChatContextMapper; import com.tencent.supersonic.chat.persistence.repository.impl.ChatContextRepositoryImpl; -import com.tencent.supersonic.chat.service.ChatService; import com.tencent.supersonic.chat.service.QueryService; -import com.tencent.supersonic.chat.service.impl.ConfigServiceImpl; -import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.semantic.api.model.response.DimSchemaResp; import com.tencent.supersonic.semantic.api.model.response.DimensionResp; +import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; import com.tencent.supersonic.semantic.api.model.response.MetricResp; import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; -import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; +import com.tencent.supersonic.chat.service.impl.ConfigServiceImpl; +import com.tencent.supersonic.chat.service.ChatService; +import com.tencent.supersonic.chat.persistence.mapper.ChatContextMapper; +import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.semantic.model.domain.DimensionService; -import com.tencent.supersonic.semantic.model.domain.MetricService; import com.tencent.supersonic.semantic.model.domain.ModelService; +import com.tencent.supersonic.semantic.model.domain.MetricService; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -45,17 +43,13 @@ public class MockBeansConfiguration { public static void buildHttpSemanticServiceImpl(SemanticLayer httpSemanticLayer, List dimensionDescs, List metricDescs) { - ChatConfigRichResp chaConfigRichDesc = new ChatConfigRichResp(); DefaultMetric defaultMetricDesc = new DefaultMetric(); defaultMetricDesc.setUnit(3); defaultMetricDesc.setPeriod(Constants.DAY); -// chaConfigRichDesc.setDefaultMetrics(new ArrayList<>(Arrays.asList(defaultMetricDesc))); - EntityRichInfoResp entityDesc = new EntityRichInfoResp(); List dimensionDescs1 = new ArrayList<>(); DimSchemaResp dimensionDesc = new DimSchemaResp(); dimensionDesc.setId(162L); dimensionDescs1.add(dimensionDesc); -// entityDesc.setEntityIds(dimensionDescs1); DimSchemaResp dimensionDesc2 = new DimSchemaResp(); dimensionDesc2.setId(163L); @@ -69,14 +63,11 @@ public class MockBeansConfiguration { metricDesc.setBizName("js_play_cnt"); metricDesc.setName("结算播放量"); entityInternalDetailDesc.setMetricList(new ArrayList<>(Arrays.asList(metricDesc))); -// entityDesc.setEntityInternalDetailDesc(entityInternalDetailDesc); -// chaConfigRichDesc.setEntity(entityDesc); -// when(httpSemanticLayer.getChatConfigRichInfo(anyLong())).thenReturn(chaConfigRichDesc); ModelSchemaResp modelSchemaDesc = new ModelSchemaResp(); modelSchemaDesc.setDimensions(dimensionDescs); modelSchemaDesc.setMetrics(metricDescs); -// when(httpSemanticLayer.getModelSchemaInfo(anyLong())).thenReturn(modelSchemaDesc); + } public static void getModelExtendMock(ConfigServiceImpl configService) { @@ -87,7 +78,6 @@ public class MockBeansConfiguration { defaultMetricInfos.add(defaultMetricInfo); ChatConfigResp chaConfigDesc = new ChatConfigResp(); -// chaConfigDesc.setDefaultMetrics(defaultMetricInfos); when(configService.fetchConfigByModelId(anyLong())).thenReturn(chaConfigDesc); } diff --git a/chat/knowledge/src/main/java/com/hankcs/hanlp/collection/trie/bintrie/BaseNode.java b/chat/knowledge/src/main/java/com/hankcs/hanlp/collection/trie/bintrie/BaseNode.java index 2f1a01f93..0996363ed 100644 --- a/chat/knowledge/src/main/java/com/hankcs/hanlp/collection/trie/bintrie/BaseNode.java +++ b/chat/knowledge/src/main/java/com/hankcs/hanlp/collection/trie/bintrie/BaseNode.java @@ -1,6 +1,8 @@ package com.hankcs.hanlp.collection.trie.bintrie; import com.hankcs.hanlp.corpus.io.ByteArray; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.knowledge.service.LoadRemoveService; import java.io.DataOutputStream; import java.io.IOException; import java.io.ObjectInput; @@ -8,9 +10,12 @@ import java.io.ObjectOutput; import java.util.AbstractMap; import java.util.ArrayDeque; import java.util.Arrays; +import java.util.List; import java.util.Map; import java.util.Queue; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public abstract class BaseNode implements Comparable { @@ -19,6 +24,8 @@ public abstract class BaseNode implements Comparable { * 状态数组,方便读取的时候用 */ static final Status[] ARRAY_STATUS = Status.values(); + + private static final Logger logger = LoggerFactory.getLogger(BaseNode.class); /** * 子节点 */ @@ -279,10 +286,14 @@ public abstract class BaseNode implements Comparable { + '}'; } - public void walkNode(Set> entrySet) { + public void walkNode(Set> entrySet, Integer agentId, Set detectModelIds) { if (status == Status.WORD_MIDDLE_2 || status == Status.WORD_END_3) { + LoadRemoveService loadRemoveService = ContextUtils.getBean(LoadRemoveService.class); + logger.debug("agentId:{},detectModelIds:{},before:{}", agentId, detectModelIds, value.toString()); + List natures = loadRemoveService.removeNatures((List) value, agentId, detectModelIds); String name = this.prefix != null ? this.prefix + c : "" + c; - entrySet.add(new TrieEntry(name, value)); + logger.debug("name:{},after:{},natures:{}", name, (List) value, natures); + entrySet.add(new TrieEntry(name, (V) natures)); } } @@ -292,7 +303,8 @@ public abstract class BaseNode implements Comparable { * @param entrySet * @param limit */ - public void walkLimit(StringBuilder sb, Set> entrySet, int limit) { + public void walkLimit(StringBuilder sb, Set> entrySet, int limit, Integer agentId, + Set detectModelIds) { Queue queue = new ArrayDeque<>(); this.prefix = sb.toString(); queue.add(this); @@ -304,7 +316,7 @@ public abstract class BaseNode implements Comparable { if (root == null) { continue; } - root.walkNode(entrySet); + root.walkNode(entrySet, agentId, detectModelIds); if (root.child == null) { continue; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelInfoStat.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/ModelInfoStat.java similarity index 86% rename from chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelInfoStat.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/ModelInfoStat.java index c1f249fc6..1886e4856 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelInfoStat.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/ModelInfoStat.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.mapper; +package com.tencent.supersonic.knowledge.dictionary; import java.io.Serializable; import lombok.Builder; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/WordBuilderFactory.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/WordBuilderFactory.java index 50fddcace..e940a7fc5 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/WordBuilderFactory.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/WordBuilderFactory.java @@ -23,4 +23,4 @@ public class WordBuilderFactory { public static BaseWordBuilder get(DictWordType strategyType) { return wordNatures.get(strategyType); } -} \ No newline at end of file +} diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/LocalSemanticLayer.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/LocalSemanticLayer.java index e42c21c0a..d11d05017 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/LocalSemanticLayer.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/LocalSemanticLayer.java @@ -8,7 +8,12 @@ import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.semantic.api.model.request.ModelSchemaFilterReq; import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; -import com.tencent.supersonic.semantic.api.model.response.*; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.ModelResp; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; +import com.tencent.supersonic.semantic.api.model.response.DimensionResp; +import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; import com.tencent.supersonic.semantic.api.query.request.QueryDslReq; import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; @@ -31,7 +36,7 @@ public class LocalSemanticLayer extends BaseSemanticLayer { @SneakyThrows @Override - public QueryResultWithSchemaResp queryByStruct(QueryStructReq queryStructReq, User user){ + public QueryResultWithSchemaResp queryByStruct(QueryStructReq queryStructReq, User user) { QueryService queryService = ContextUtils.getBean(QueryService.class); return queryService.queryByStructWithAuth(queryStructReq, user); } diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/ModelSchemaBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/ModelSchemaBuilder.java index 43a120325..02b415d05 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/ModelSchemaBuilder.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/ModelSchemaBuilder.java @@ -12,7 +12,13 @@ import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; import org.springframework.util.CollectionUtils; -import java.util.*; +import java.util.Set; +import java.util.HashSet; +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Objects; +import java.util.Map; import java.util.stream.Collectors; public class ModelSchemaBuilder { diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/RemoteSemanticLayer.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/RemoteSemanticLayer.java index 944a485d7..1319d0e81 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/RemoteSemanticLayer.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/RemoteSemanticLayer.java @@ -1,43 +1,37 @@ package com.tencent.supersonic.knowledge.semantic; -import static com.tencent.supersonic.common.pojo.Constants.LIST_LOWER; -import static com.tencent.supersonic.common.pojo.Constants.PAGESIZE_LOWER; -import static com.tencent.supersonic.common.pojo.Constants.TOTAL_LOWER; -import static com.tencent.supersonic.common.pojo.Constants.TRUE_LOWER; - import com.alibaba.fastjson.JSON; import com.github.pagehelper.PageInfo; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import com.google.gson.Gson; import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig; import com.tencent.supersonic.auth.api.authentication.constant.UserConstants; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.common.pojo.ResultData; -import com.tencent.supersonic.common.pojo.ReturnCode; -import com.tencent.supersonic.common.pojo.enums.AuthType; -import com.tencent.supersonic.common.pojo.exception.CommonException; import com.tencent.supersonic.common.util.ContextUtils; -import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.common.util.S2ThreadContext; import com.tencent.supersonic.common.util.ThreadContext; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.semantic.api.model.request.ModelSchemaFilterReq; import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; -import com.tencent.supersonic.semantic.api.model.response.DimensionResp; -import com.tencent.supersonic.semantic.api.model.response.DomainResp; -import com.tencent.supersonic.semantic.api.model.response.MetricResp; -import com.tencent.supersonic.semantic.api.model.response.ModelResp; -import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.ModelResp; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; +import com.tencent.supersonic.semantic.api.model.response.DimensionResp; +import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; import com.tencent.supersonic.semantic.api.query.request.QueryDslReq; import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import com.tencent.supersonic.common.pojo.exception.CommonException; +import com.tencent.supersonic.common.pojo.ResultData; +import com.tencent.supersonic.common.pojo.ReturnCode; + import java.net.URI; -import java.util.LinkedHashMap; import java.util.List; import java.util.Objects; -import java.util.concurrent.TimeUnit; +import java.util.LinkedHashMap; + import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; @@ -50,6 +44,11 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import static com.tencent.supersonic.common.pojo.Constants.TRUE_LOWER; +import static com.tencent.supersonic.common.pojo.Constants.LIST_LOWER; +import static com.tencent.supersonic.common.pojo.Constants.TOTAL_LOWER; +import static com.tencent.supersonic.common.pojo.Constants.PAGESIZE_LOWER; + @Slf4j public class RemoteSemanticLayer extends BaseSemanticLayer { @@ -57,8 +56,6 @@ public class RemoteSemanticLayer extends BaseSemanticLayer { private AuthenticationConfig authenticationConfig; - private static final Cache> domainSchemaCache = - CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build(); private ParameterizedTypeReference> structTypeRef = new ParameterizedTypeReference>() { }; @@ -125,7 +122,7 @@ public class RemoteSemanticLayer extends BaseSemanticLayer { DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); URI requestUrl = UriComponentsBuilder.fromHttpUrl( - defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchModelSchemaPath()).build() + defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchModelSchemaPath()).build() .encode().toUri(); ModelSchemaFilterReq filter = new ModelSchemaFilterReq(); filter.setModelIds(ids); @@ -155,8 +152,8 @@ public class RemoteSemanticLayer extends BaseSemanticLayer { public List getDomainList(User user) { DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); Object domainDescListObject = fetchHttpResult( - defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDomainListPath(), null, - HttpMethod.GET); + defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDomainListPath(), + null, HttpMethod.GET); return JsonUtil.toList(JsonUtil.toString(domainDescListObject), DomainResp.class); } @@ -167,8 +164,8 @@ public class RemoteSemanticLayer extends BaseSemanticLayer { } DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); String url = String.format("%s?domainId=%s&authType=%s", - defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchModelListPath() - , domainId, authType.toString()); + defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchModelListPath(), + domainId, authType.toString()); Object domainDescListObject = fetchHttpResult(url, null, HttpMethod.GET); return JsonUtil.toList(JsonUtil.toString(domainDescListObject), ModelResp.class); } @@ -218,8 +215,8 @@ public class RemoteSemanticLayer extends BaseSemanticLayer { DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); log.info("url:{}", defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchMetricPagePath()); Object dimensionListObject = fetchHttpResult( - defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchMetricPagePath(), body, - HttpMethod.POST); + defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchMetricPagePath(), + body, HttpMethod.POST); LinkedHashMap map = (LinkedHashMap) dimensionListObject; PageInfo metricDescObjectPageInfo = generatePageInfo(map); PageInfo metricDescPageInfo = new PageInfo<>(); @@ -233,8 +230,8 @@ public class RemoteSemanticLayer extends BaseSemanticLayer { String body = JsonUtil.toString(pageDimensionCmd); DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); Object dimensionListObject = fetchHttpResult( - defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDimensionPagePath(), body, - HttpMethod.POST); + defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDimensionPagePath(), + body, HttpMethod.POST); LinkedHashMap map = (LinkedHashMap) dimensionListObject; PageInfo dimensionDescObjectPageInfo = generatePageInfo(map); PageInfo dimensionDescPageInfo = new PageInfo<>(); diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/LoadRemoveService.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/LoadRemoveService.java new file mode 100644 index 000000000..c00ce9d7b --- /dev/null +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/LoadRemoveService.java @@ -0,0 +1,55 @@ +package com.tencent.supersonic.knowledge.service; + +import com.tencent.supersonic.knowledge.utils.NatureHelper; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +@Data +@Service +public class LoadRemoveService { + + @Value("${mapper.remove.agentId:}") + private Integer mapperRemoveAgentId; + + @Value("${mapper.remove.nature.prefix:}") + private String mapperRemoveNaturePrefix; + + + public List removeNatures(List value, Integer agentId, Set detectModelIds) { + if (CollectionUtils.isEmpty(value)) { + return value; + } + List resultList = new ArrayList<>(value); + if (!CollectionUtils.isEmpty(detectModelIds)) { + resultList.removeIf(nature -> { + if (Objects.isNull(nature)) { + return false; + } + Long modelId = NatureHelper.getModelId(nature); + if (Objects.nonNull(modelId)) { + return !detectModelIds.contains(modelId); + } + return false; + }); + } + if (Objects.nonNull(mapperRemoveAgentId) + && mapperRemoveAgentId.equals(agentId) + && StringUtils.isNotBlank(mapperRemoveNaturePrefix)) { + resultList.removeIf(nature -> { + if (Objects.isNull(nature)) { + return false; + } + return nature.startsWith(mapperRemoveNaturePrefix); + }); + } + return resultList; + } + +} \ No newline at end of file diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SchemaService.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SchemaService.java index 4113d4b60..60a02c91f 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SchemaService.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SchemaService.java @@ -15,9 +15,9 @@ import org.springframework.stereotype.Service; @Slf4j public class SchemaService { - private static final Integer META_CACHE_TIME = 5; - public static final String ALL_CACHE = "all"; + public static final String ALL_CACHE = "all"; + private static final Integer META_CACHE_TIME = 5; private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); private LoadingCache cache = CacheBuilder.newBuilder() diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SearchService.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SearchService.java index 1c865f6a9..49c6c2159 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SearchService.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/SearchService.java @@ -27,7 +27,6 @@ public class SearchService { public static final int SEARCH_SIZE = 200; private static BinTrie> trie; private static BinTrie> suffixTrie; - private static String localFileCache = ""; static { trie = new BinTrie<>(); @@ -39,16 +38,13 @@ public class SearchService { * @param key * @return */ - public static List prefixSearch(String key) { - return prefixSearch(key, SEARCH_SIZE, trie); + public static List prefixSearch(String key, int limit, Integer agentId, Set detectModelIds) { + return prefixSearch(key, limit, agentId, trie, detectModelIds); } - public static List prefixSearch(String key, int limit) { - return prefixSearch(key, limit, trie); - } - - public static List prefixSearch(String key, int limit, BinTrie> binTrie) { - Set>> result = prefixSearchLimit(key, limit, binTrie); + public static List prefixSearch(String key, int limit, Integer agentId, BinTrie> binTrie, + Set detectModelIds) { + Set>> result = prefixSearchLimit(key, limit, binTrie, agentId, detectModelIds); return result.stream().map( entry -> { String name = entry.getKey().replace("#", " "); @@ -64,13 +60,14 @@ public class SearchService { * @param key * @return */ - public static List suffixSearch(String key, int limit) { + public static List suffixSearch(String key, int limit, Integer agentId, Set detectModelIds) { String reverseDetectSegment = StringUtils.reverse(key); - return suffixSearch(reverseDetectSegment, limit, suffixTrie); + return suffixSearch(reverseDetectSegment, limit, agentId, suffixTrie, detectModelIds); } - public static List suffixSearch(String key, int limit, BinTrie> binTrie) { - Set>> result = prefixSearchLimit(key, limit, binTrie); + public static List suffixSearch(String key, int limit, Integer agentId, BinTrie> binTrie, + Set detectModelIds) { + Set>> result = prefixSearchLimit(key, limit, binTrie, agentId, detectModelIds); return result.stream().map( entry -> { String name = entry.getKey().replace("#", " "); @@ -86,7 +83,7 @@ public class SearchService { } private static Set>> prefixSearchLimit(String key, int limit, - BinTrie> binTrie) { + BinTrie> binTrie, Integer agentId, Set detectModelIds) { key = key.toLowerCase(); Set>> entrySet = new TreeSet>>(); StringBuilder sb = new StringBuilder(key.substring(0, key.length() - 1)); @@ -102,7 +99,7 @@ public class SearchService { if (branch == null) { return entrySet; } - branch.walkLimit(sb, entrySet, limit); + branch.walkLimit(sb, entrySet, limit, agentId, detectModelIds); return entrySet; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/NatureHelper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/NatureHelper.java similarity index 98% rename from chat/core/src/main/java/com/tencent/supersonic/chat/utils/NatureHelper.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/NatureHelper.java index bf9bd411f..4dd6db8d5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/NatureHelper.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/NatureHelper.java @@ -1,10 +1,10 @@ -package com.tencent.supersonic.chat.utils; +package com.tencent.supersonic.knowledge.utils; import com.hankcs.hanlp.corpus.tag.Nature; import com.hankcs.hanlp.seg.common.Term; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.chat.mapper.ModelInfoStat; import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import com.tencent.supersonic.knowledge.dictionary.ModelInfoStat; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java b/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java index cc651ea98..93d69986c 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java @@ -53,11 +53,11 @@ public class DateConf { return false; } DateConf dateConf = (DateConf) o; - return dateMode == dateConf.dateMode && - Objects.equals(startDate, dateConf.startDate) && - Objects.equals(endDate, dateConf.endDate) && - Objects.equals(unit, dateConf.unit) && - Objects.equals(period, dateConf.period); + return dateMode == dateConf.dateMode + && Objects.equals(startDate, dateConf.startDate) + && Objects.equals(endDate, dateConf.endDate) + && Objects.equals(unit, dateConf.unit) + && Objects.equals(period, dateConf.period); } @Override diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/QueryAuthorization.java b/common/src/main/java/com/tencent/supersonic/common/pojo/QueryAuthorization.java index d4aa22df3..443b88b4e 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/QueryAuthorization.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/QueryAuthorization.java @@ -16,4 +16,8 @@ public class QueryAuthorization { private List dimensionFilters; private List dimensionFiltersDesc; private String message; + + public QueryAuthorization(String message) { + this.message = message; + } } \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/ChatGptHelper.java b/common/src/main/java/com/tencent/supersonic/common/util/ChatGptHelper.java index 56f207540..4a5848957 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/ChatGptHelper.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/ChatGptHelper.java @@ -33,9 +33,9 @@ public class ChatGptHelper { private Integer proxyPort; - public ChatGPT getChatGPT(){ + public ChatGPT getChatGPT() { Proxy proxy = null; - if (!"default".equals(proxyIp)){ + if (!"default".equals(proxyIp)) { proxy = Proxys.http(proxyIp, proxyPort); } return ChatGPT.builder() @@ -47,8 +47,8 @@ public class ChatGptHelper { .init(); } - public Message getChatCompletion(Message system,Message message){ - ChatCompletion chatCompletion = ChatCompletion.builder() + public Message getChatCompletion(Message system, Message message) { + ChatCompletion chatCompletion = ChatCompletion.builder() .model(ChatCompletion.Model.GPT_3_5_TURBO_16K.getName()) .messages(Arrays.asList(system, message)) .maxTokens(10000) @@ -58,41 +58,61 @@ public class ChatGptHelper { return response.getChoices().get(0).getMessage(); } - public String inferredTime(String queryText){ + public String inferredTime(String queryText) { long nowTime = System.currentTimeMillis(); Date date = new Date(nowTime); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String formattedDate = sdf.format(date); - Message system = Message.ofSystem("现在时间 "+formattedDate+",你是一个专业的数据分析师,你的任务是基于数据,专业的解答用户的问题。" + - "你需要遵守以下规则:\n" + - "1.返回规范的数据格式,json,如: 输入:近 10 天的日活跃数,输出:{\"start\":\"2023-07-21\",\"end\":\"2023-07-31\"}" + - "2.你对时间数据要求规范,能从近 10 天,国庆节,端午节,获取到相应的时间,填写到 json 中。\n"+ - "3.你的数据时间,只有当前及之前时间即可,超过则回复去年\n" + - "4.只需要解析出时间,时间可以是时间月和年或日、日历采用公历\n"+ - "5.时间给出要是绝对正确,不能瞎编\n" + Message system = Message.ofSystem("现在时间 " + formattedDate + ",你是一个专业的数据分析师,你的任务是基于数据,专业的解答用户的问题。" + + "你需要遵守以下规则:\n" + + "1.返回规范的数据格式,json,如: 输入:近 10 天的日活跃数,输出:{\"start\":\"2023-07-21\",\"end\":\"2023-07-31\"}" + + "2.你对时间数据要求规范,能从近 10 天,国庆节,端午节,获取到相应的时间,填写到 json 中。\n" + + "3.你的数据时间,只有当前及之前时间即可,超过则回复去年\n" + + "4.只需要解析出时间,时间可以是时间月和年或日、日历采用公历\n" + + "5.时间给出要是绝对正确,不能瞎编\n" ); - Message message = Message.of("输入:"+queryText+",输出:"); + Message message = Message.of("输入:" + queryText + ",输出:"); Message res = getChatCompletion(system, message); return res.getContent(); } - public String mockAlias(String mockType,String name,String bizName,String table,String desc,Boolean isPercentage){ - String msg = "Assuming you are a professional data analyst specializing in indicators, you have a vast amount of data analysis indicator content. You are familiar with the basic format of the content,Now, Construct your answer Based on the following json-schema.\n" + - "{\n" + - "\"$schema\": \"http://json-schema.org/draft-07/schema#\",\n" + - "\"type\": \"array\",\n" + - "\"minItems\": 2,\n" + - "\"maxItems\": 4,\n" + - "\"items\": {\n" + - "\"type\": \"string\",\n" + - "\"description\": \"Assuming you are a data analyst and give a defined "+mockType+" name: " +name+","+ - "this "+mockType+" is from database and table: "+table+ ",This "+mockType+" calculates the field source: "+bizName+", The description of this indicator is: "+desc+", provide some aliases for this,please take chinese or english,but more chinese and Not repeating,\"\n" + - "},\n" + - "\"additionalProperties\":false}\n" + - "Please double-check whether the answer conforms to the format described in the JSON-schema.\n" + - "ANSWER JSON:"; - log.info("msg:{}",msg); + public String mockAlias(String mockType, + String name, + String bizName, + String table, + String desc, + Boolean isPercentage) { + String msg = "Assuming you are a professional data analyst specializing in indicators, " + + "you have a vast amount of data analysis indicator content. You are familiar with the basic" + + " format of the content,Now, Construct your answer Based on the following json-schema.\n" + + "{\n" + + "\"$schema\": \"http://json-schema.org/draft-07/schema#\",\n" + + "\"type\": \"array\",\n" + + "\"minItems\": 2,\n" + + "\"maxItems\": 4,\n" + + "\"items\": {\n" + + "\"type\": \"string\",\n" + + "\"description\": \"Assuming you are a data analyst and give a defined " + + mockType + + " name: " + + name + "," + + "this " + + mockType + + " is from database and table: " + + table + ",This " + + mockType + + " calculates the field source: " + + bizName + + ", The description of this indicator is: " + + desc + + ", provide some aliases for this,please take chinese or english," + + "but more chinese and Not repeating,\"\n" + + "},\n" + + "\"additionalProperties\":false}\n" + + "Please double-check whether the answer conforms to the format described in the JSON-schema.\n" + + "ANSWER JSON:"; + log.info("msg:{}", msg); Message system = Message.ofSystem(""); Message message = Message.of(msg); Message res = getChatCompletion(system, message); @@ -100,17 +120,19 @@ public class ChatGptHelper { } - - public String mockDimensionValueAlias(String json){ - String msg = "Assuming you are a professional data analyst specializing in indicators,for you a json list," + - "the required content to follow is as follows: " + - "1. The format of JSON," + - "2. Only return in JSON format," + - "3. the array item > 1 and < 5,more alias," + - "for example:input:[\"qq_music\",\"kugou_music\"],out:{\"tran\":[\"qq音乐\",\"酷狗音乐\"],\"alias\":{\"qq_music\":[\"q音\",\"qq音乐\"],\"kugou_music\":[\"kugou\",\"酷狗\"]}}," + - "now input: " + json + ","+ - "answer json:"; - log.info("msg:{}",msg); + public String mockDimensionValueAlias(String json) { + String msg = "Assuming you are a professional data analyst specializing in indicators,for you a json list," + + "the required content to follow is as follows: " + + "1. The format of JSON," + + "2. Only return in JSON format," + + "3. the array item > 1 and < 5,more alias," + + "for example:input:[\"qq_music\",\"kugou_music\"]," + + "out:{\"tran\":[\"qq音乐\",\"酷狗音乐\"],\"alias\":{\"qq_music\":[\"q音\",\"qq音乐\"]," + + "\"kugou_music\":[\"kugou\",\"酷狗\"]}}," + + "now input: " + + json + "," + + "answer json:"; + log.info("msg:{}", msg); Message system = Message.ofSystem(""); Message message = Message.of(msg); Message res = getChatCompletion(system, message); @@ -118,12 +140,9 @@ public class ChatGptHelper { } - - - public static void main(String[] args) { ChatGptHelper chatGptHelper = new ChatGptHelper(); - System.out.println(chatGptHelper.mockAlias("","","","","",false)); + System.out.println(chatGptHelper.mockAlias("", "", "", "", "", false)); } diff --git a/common/src/main/java/com/tencent/supersonic/common/util/DateUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/DateUtils.java index 5715b1df9..b743fc450 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/DateUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/DateUtils.java @@ -31,6 +31,7 @@ public class DateUtils { dateFormat.parse(date); return DateTimeFormatter.ofPattern(format); } catch (Exception e) { + log.info("date parse has a exception:{}", e.toString()); } } return DateTimeFormatter.ofPattern(formats[0]); @@ -44,6 +45,7 @@ public class DateUtils { LocalDateTime.parse(date, dateTimeFormatter); return dateTimeFormatter; } catch (Exception e) { + log.info("date parse has a exception:{}", e.toString()); } } return DateTimeFormatter.ofPattern(formats[0]); diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAndValueAcquireVisitor.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAndValueAcquireVisitor.java new file mode 100644 index 000000000..112a78520 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAndValueAcquireVisitor.java @@ -0,0 +1,84 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import java.util.Set; +import net.sf.jsqlparser.expression.DoubleValue; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.expression.operators.relational.ComparisonOperator; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.expression.operators.relational.GreaterThan; +import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals; +import net.sf.jsqlparser.expression.operators.relational.MinorThan; +import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals; +import net.sf.jsqlparser.schema.Column; + +public class FieldAndValueAcquireVisitor extends ExpressionVisitorAdapter { + + private Set filterExpressions; + + public FieldAndValueAcquireVisitor(Set filterExpressions) { + this.filterExpressions = filterExpressions; + } + + + @Override + public void visit(MinorThan expr) { + FilterExpression filterExpression = getFilterExpression(expr); + filterExpressions.add(filterExpression); + } + + @Override + public void visit(EqualsTo expr) { + FilterExpression filterExpression = getFilterExpression(expr); + filterExpressions.add(filterExpression); + } + + + @Override + public void visit(MinorThanEquals expr) { + FilterExpression filterExpression = getFilterExpression(expr); + filterExpressions.add(filterExpression); + } + + + @Override + public void visit(GreaterThan expr) { + FilterExpression filterExpression = getFilterExpression(expr); + filterExpressions.add(filterExpression); + } + + @Override + public void visit(GreaterThanEquals expr) { + FilterExpression filterExpression = getFilterExpression(expr); + filterExpressions.add(filterExpression); + } + + private FilterExpression getFilterExpression(ComparisonOperator expr) { + Expression leftExpression = expr.getLeftExpression(); + Expression rightExpression = expr.getRightExpression(); + + FilterExpression filterExpression = new FilterExpression(); + String columnName = null; + if (leftExpression instanceof Column) { + Column column = (Column) leftExpression; + columnName = column.getColumnName(); + filterExpression.setFieldName(columnName); + } + if (rightExpression instanceof StringValue) { + StringValue stringValue = (StringValue) rightExpression; + filterExpression.setFieldValue(stringValue.getValue()); + } + if (rightExpression instanceof DoubleValue) { + DoubleValue doubleValue = (DoubleValue) rightExpression; + filterExpression.setFieldValue(doubleValue.getValue()); + } + if (rightExpression instanceof LongValue) { + LongValue longValue = (LongValue) rightExpression; + filterExpression.setFieldValue(longValue.getValue()); + } + filterExpression.setOperator(expr.getStringExpression()); + return filterExpression; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FiledValueReplaceVisitor.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FiledValueReplaceVisitor.java new file mode 100644 index 000000000..884baa708 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FiledValueReplaceVisitor.java @@ -0,0 +1,46 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.schema.Column; +import org.springframework.util.CollectionUtils; + +public class FiledValueReplaceVisitor extends ExpressionVisitorAdapter { + + private Map> fieldValueToFieldNames; + + public FiledValueReplaceVisitor(Map> fieldValueToFieldNames) { + this.fieldValueToFieldNames = fieldValueToFieldNames; + } + + @Override + public void visit(EqualsTo expr) { + Expression leftExpression = expr.getLeftExpression(); + Expression rightExpression = expr.getRightExpression(); + if (!(rightExpression instanceof StringValue)) { + return; + } + if (!(leftExpression instanceof Column)) { + return; + } + if (CollectionUtils.isEmpty(fieldValueToFieldNames)) { + return; + } + if (Objects.isNull(rightExpression) || Objects.isNull(leftExpression)) { + return; + } + Column leftColumnName = (Column) leftExpression; + StringValue rightStringValue = (StringValue) rightExpression; + + Set fieldNames = fieldValueToFieldNames.get(rightStringValue.getValue()); + if (!CollectionUtils.isEmpty(fieldNames) && !fieldNames.contains(leftColumnName.getColumnName())) { + leftColumnName.setColumnName(fieldNames.stream().findFirst().get()); + } + } + +} \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FilterExpression.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FilterExpression.java new file mode 100644 index 000000000..b4c304d62 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FilterExpression.java @@ -0,0 +1,14 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import lombok.Data; + +@Data +public class FilterExpression { + + private String operator; + + private String fieldName; + + private Object fieldValue; + +} \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/OrderByAcquireVisitor.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/OrderByAcquireVisitor.java new file mode 100644 index 000000000..c840207db --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/OrderByAcquireVisitor.java @@ -0,0 +1,25 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import java.util.Set; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.statement.select.OrderByElement; +import net.sf.jsqlparser.statement.select.OrderByVisitorAdapter; + +public class OrderByAcquireVisitor extends OrderByVisitorAdapter { + + private Set fields; + + public OrderByAcquireVisitor(Set fields) { + this.fields = fields; + } + + @Override + public void visit(OrderByElement orderBy) { + Expression expression = orderBy.getExpression(); + if (expression instanceof Column) { + fields.add(((Column) expression).getColumnName()); + } + super.visit(orderBy); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java new file mode 100644 index 000000000..d7e9a0df8 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java @@ -0,0 +1,188 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.select.GroupByElement; +import net.sf.jsqlparser.statement.select.OrderByElement; +import net.sf.jsqlparser.statement.select.PlainSelect; +import net.sf.jsqlparser.statement.select.Select; +import net.sf.jsqlparser.statement.select.SelectBody; +import net.sf.jsqlparser.statement.select.SelectItem; +import org.springframework.util.CollectionUtils; + +/** + * Sql Parser Select Helper + */ +@Slf4j +public class SqlParserSelectHelper { + public static List getFilterExpression(String sql) { + PlainSelect plainSelect = getPlainSelect(sql); + if (Objects.isNull(plainSelect)) { + return new ArrayList<>(); + } + Set result = new HashSet<>(); + Expression where = plainSelect.getWhere(); + if (Objects.nonNull(where)) { + where.accept(new FieldAndValueAcquireVisitor(result)); + } + return new ArrayList<>(result); + } + + public static List getWhereFields(String sql) { + PlainSelect plainSelect = getPlainSelect(sql); + if (Objects.isNull(plainSelect)) { + return new ArrayList<>(); + } + Set result = new HashSet<>(); + Expression where = plainSelect.getWhere(); + if (Objects.nonNull(where)) { + where.accept(new FieldAcquireVisitor(result)); + } + return new ArrayList<>(result); + } + + public static List getOrderByFields(String sql) { + PlainSelect plainSelect = getPlainSelect(sql); + if (Objects.isNull(plainSelect)) { + return new ArrayList<>(); + } + Set result = new HashSet<>(); + List orderByElements = plainSelect.getOrderByElements(); + if (!CollectionUtils.isEmpty(orderByElements)) { + for (OrderByElement orderByElement : orderByElements) { + orderByElement.accept(new OrderByAcquireVisitor(result)); + } + } + return new ArrayList<>(result); + } + + public static List getSelectFields(String sql) { + PlainSelect plainSelect = getPlainSelect(sql); + if (Objects.isNull(plainSelect)) { + return new ArrayList<>(); + } + return new ArrayList<>(getSelectFields(plainSelect)); + } + + public static Set getSelectFields(PlainSelect plainSelect) { + List selectItems = plainSelect.getSelectItems(); + Set result = new HashSet<>(); + for (SelectItem selectItem : selectItems) { + selectItem.accept(new FieldAcquireVisitor(result)); + } + return result; + } + + public static PlainSelect getPlainSelect(String sql) { + Select selectStatement = getSelect(sql); + if (selectStatement == null) { + return null; + } + SelectBody selectBody = selectStatement.getSelectBody(); + + if (!(selectBody instanceof PlainSelect)) { + return null; + } + return (PlainSelect) selectBody; + } + + public static Select getSelect(String sql) { + Statement statement = null; + try { + statement = CCJSqlParserUtil.parse(sql); + } catch (JSQLParserException e) { + log.error("parse error", e); + return null; + } + + if (!(statement instanceof Select)) { + return null; + } + return (Select) statement; + } + + + public static List getAllFields(String sql) { + + PlainSelect plainSelect = getPlainSelect(sql); + if (Objects.isNull(plainSelect)) { + return new ArrayList<>(); + } + Set result = getSelectFields(plainSelect); + + GroupByElement groupBy = plainSelect.getGroupBy(); + if (groupBy != null) { + List groupByExpressions = groupBy.getGroupByExpressions(); + for (Expression expression : groupByExpressions) { + if (expression instanceof Column) { + Column column = (Column) expression; + result.add(column.getColumnName()); + } + } + } + List orderByElements = plainSelect.getOrderByElements(); + if (orderByElements != null) { + for (OrderByElement orderByElement : orderByElements) { + Expression expression = orderByElement.getExpression(); + + if (expression instanceof Column) { + Column column = (Column) expression; + result.add(column.getColumnName()); + } + } + } + Expression where = plainSelect.getWhere(); + if (where != null) { + where.accept(new ExpressionVisitorAdapter() { + @Override + public void visit(Column column) { + result.add(column.getColumnName()); + } + }); + } + + return new ArrayList<>(result); + } + + public static String getTableName(String sql) { + Select selectStatement = getSelect(sql); + if (selectStatement == null) { + return null; + } + SelectBody selectBody = selectStatement.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) selectBody; + + Table table = (Table) plainSelect.getFromItem(); + return table.getName(); + } + + + public static boolean hasAggregateFunction(String sql) { + Select selectStatement = getSelect(sql); + SelectBody selectBody = selectStatement.getSelectBody(); + + if (!(selectBody instanceof PlainSelect)) { + return false; + } + PlainSelect plainSelect = (PlainSelect) selectBody; + List selectItems = plainSelect.getSelectItems(); + AggregateFunctionVisitor visitor = new AggregateFunctionVisitor(); + for (SelectItem selectItem : selectItems) { + selectItem.accept(visitor); + } + return visitor.hasAggregateFunction(); + } + +} + diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/CCJSqlParserUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelper.java similarity index 56% rename from common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/CCJSqlParserUtils.java rename to common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelper.java index da0e9cb1f..e25978fd5 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/CCJSqlParserUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelper.java @@ -1,23 +1,17 @@ package com.tencent.supersonic.common.util.jsqlparser; -import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import lombok.extern.slf4j.Slf4j; -import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; import net.sf.jsqlparser.expression.LongValue; import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.relational.EqualsTo; -import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.select.GroupByElement; import net.sf.jsqlparser.statement.select.OrderByElement; import net.sf.jsqlparser.statement.select.PlainSelect; @@ -29,115 +23,30 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; /** - * CC JSql ParserUtils + * Sql Parser Update Helper */ @Slf4j -public class CCJSqlParserUtils { +public class SqlParserUpdateHelper { - public static List getWhereFields(String sql) { - PlainSelect plainSelect = getPlainSelect(sql); - if (Objects.isNull(plainSelect)) { - return new ArrayList<>(); - } - Set result = new HashSet<>(); - Expression where = plainSelect.getWhere(); - if (Objects.nonNull(where)) { - where.accept(new FieldAcquireVisitor(result)); - } - return new ArrayList<>(result); - } - - public static List getSelectFields(String sql) { - PlainSelect plainSelect = getPlainSelect(sql); - if (Objects.isNull(plainSelect)) { - return new ArrayList<>(); - } - return new ArrayList<>(getSelectFields(plainSelect)); - } - - private static Set getSelectFields(PlainSelect plainSelect) { - List selectItems = plainSelect.getSelectItems(); - Set result = new HashSet<>(); - for (SelectItem selectItem : selectItems) { - selectItem.accept(new FieldAcquireVisitor(result)); - } - return result; - } - - private static PlainSelect getPlainSelect(String sql) { - Select selectStatement = getSelect(sql); - if (selectStatement == null) { - return null; - } + public static String replaceValueFields(String sql, Map> fieldValueToFieldNames) { + Select selectStatement = SqlParserSelectHelper.getSelect(sql); SelectBody selectBody = selectStatement.getSelectBody(); - if (!(selectBody instanceof PlainSelect)) { - return null; - } - return (PlainSelect) selectBody; - } - - private static Select getSelect(String sql) { - Statement statement = null; - try { - statement = CCJSqlParserUtil.parse(sql); - } catch (JSQLParserException e) { - log.error("parse error", e); - return null; - } - - if (!(statement instanceof Select)) { - return null; - } - return (Select) statement; - } - - - public static List getAllFields(String sql) { - - PlainSelect plainSelect = getPlainSelect(sql); - if (Objects.isNull(plainSelect)) { - return new ArrayList<>(); - } - Set result = getSelectFields(plainSelect); - - GroupByElement groupBy = plainSelect.getGroupBy(); - if (groupBy != null) { - List groupByExpressions = groupBy.getGroupByExpressions(); - for (Expression expression : groupByExpressions) { - if (expression instanceof Column) { - Column column = (Column) expression; - result.add(column.getColumnName()); - } - } - } - List orderByElements = plainSelect.getOrderByElements(); - if (orderByElements != null) { - for (OrderByElement orderByElement : orderByElements) { - Expression expression = orderByElement.getExpression(); - - if (expression instanceof Column) { - Column column = (Column) expression; - result.add(column.getColumnName()); - } - } + return sql; } + PlainSelect plainSelect = (PlainSelect) selectBody; + //1. replace where fields Expression where = plainSelect.getWhere(); - if (where != null) { - where.accept(new ExpressionVisitorAdapter() { - @Override - public void visit(Column column) { - result.add(column.getColumnName()); - } - }); + FiledValueReplaceVisitor visitor = new FiledValueReplaceVisitor(fieldValueToFieldNames); + if (Objects.nonNull(where)) { + where.accept(visitor); } - - return new ArrayList<>(result); + return selectStatement.toString(); } public static String replaceFields(String sql, Map fieldToBizName) { - Select selectStatement = getSelect(sql); + Select selectStatement = SqlParserSelectHelper.getSelect(sql); SelectBody selectBody = selectStatement.getSelectBody(); if (!(selectBody instanceof PlainSelect)) { return sql; @@ -173,7 +82,7 @@ public class CCJSqlParserUtils { public static String replaceFunction(String sql) { - Select selectStatement = getSelect(sql); + Select selectStatement = SqlParserSelectHelper.getSelect(sql); SelectBody selectBody = selectStatement.getSelectBody(); if (!(selectBody instanceof PlainSelect)) { return sql; @@ -208,7 +117,7 @@ public class CCJSqlParserUtils { public static String addFieldsToSelect(String sql, List fields) { - Select selectStatement = getSelect(sql); + Select selectStatement = SqlParserSelectHelper.getSelect(sql); // add fields to select for (String field : fields) { SelectUtils.addExpression(selectStatement, new Column(field)); @@ -216,24 +125,11 @@ public class CCJSqlParserUtils { return selectStatement.toString(); } - - public static String getTableName(String sql) { - Select selectStatement = getSelect(sql); - if (selectStatement == null) { - return null; - } - SelectBody selectBody = selectStatement.getSelectBody(); - PlainSelect plainSelect = (PlainSelect) selectBody; - - Table table = (Table) plainSelect.getFromItem(); - return table.getName(); - } - public static String replaceTable(String sql, String tableName) { if (StringUtils.isEmpty(tableName)) { return sql; } - Select selectStatement = getSelect(sql); + Select selectStatement = SqlParserSelectHelper.getSelect(sql); SelectBody selectBody = selectStatement.getSelectBody(); PlainSelect plainSelect = (PlainSelect) selectBody; // replace table name @@ -247,7 +143,7 @@ public class CCJSqlParserUtils { if (StringUtils.isEmpty(column) || Objects.isNull(value)) { return sql; } - Select selectStatement = getSelect(sql); + Select selectStatement = SqlParserSelectHelper.getSelect(sql); SelectBody selectBody = selectStatement.getSelectBody(); if (!(selectBody instanceof PlainSelect)) { @@ -271,7 +167,7 @@ public class CCJSqlParserUtils { public static String addWhere(String sql, Expression expression) { - Select selectStatement = getSelect(sql); + Select selectStatement = SqlParserSelectHelper.getSelect(sql); SelectBody selectBody = selectStatement.getSelectBody(); if (!(selectBody instanceof PlainSelect)) { @@ -288,23 +184,5 @@ public class CCJSqlParserUtils { return selectStatement.toString(); } - - public static boolean hasAggregateFunction(String sql) { - Select selectStatement = getSelect(sql); - SelectBody selectBody = selectStatement.getSelectBody(); - - if (!(selectBody instanceof PlainSelect)) { - return false; - } - PlainSelect plainSelect = (PlainSelect) selectBody; - List selectItems = plainSelect.getSelectItems(); - AggregateFunctionVisitor visitor = new AggregateFunctionVisitor(); - for (SelectItem selectItem : selectItems) { - selectItem.accept(visitor); - } - return visitor.hasAggregateFunction(); - } - - } diff --git a/common/src/test/java/com/tencent/supersonic/common/util/calcite/SqlParseUtilsTest.java b/common/src/test/java/com/tencent/supersonic/common/util/calcite/SqlParseUtilsTest.java index 0be459cf2..943aacf64 100644 --- a/common/src/test/java/com/tencent/supersonic/common/util/calcite/SqlParseUtilsTest.java +++ b/common/src/test/java/com/tencent/supersonic/common/util/calcite/SqlParseUtilsTest.java @@ -121,7 +121,8 @@ class SqlParseUtilsTest { SqlParserInfo sqlParserInfo = SqlParseUtils.getSqlParseInfo( "select uv from " + " ( " - + " select * from t_1 where sys_imp_date >= '2023-07-07' and sys_imp_date <= '2023-07-07' and user_id = 22 " + + " select * from t_1 where sys_imp_date >= '2023-07-07' and " + + "sys_imp_date <= '2023-07-07' and user_id = 22 " + " ) as t_sub_1 " + " where user_name_元 = 'zhangsan' order by play_count desc limit 10" ); @@ -129,4 +130,4 @@ class SqlParseUtilsTest { .collect(Collectors.toList()); Assert.assertTrue(collect.contains("user_id")); } -} \ No newline at end of file +} diff --git a/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/CCJSqlParserUtilsTest.java b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/CCJSqlParserUtilsTest.java deleted file mode 100644 index 427c16471..000000000 --- a/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/CCJSqlParserUtilsTest.java +++ /dev/null @@ -1,244 +0,0 @@ -package com.tencent.supersonic.common.util.jsqlparser; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import net.sf.jsqlparser.JSQLParserException; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import org.junit.Assert; -import org.junit.jupiter.api.Test; - -/** - * CCJSqlParserUtils Test - */ -class CCJSqlParserUtilsTest { - - @Test - void replaceFields() { - - Map fieldToBizName = initParams(); - String replaceSql = "select 歌曲名 from 歌曲库 where datediff('day', 发布日期, '2023-08-09') <= 1 and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' and 歌曲发布时 = '2023-08-01' order by 播放量 desc limit 11"; - - replaceSql = CCJSqlParserUtils.replaceFields(replaceSql, fieldToBizName); - replaceSql = CCJSqlParserUtils.replaceFunction(replaceSql); - - Assert.assertEquals( - "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-08-09' AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' AND song_publis_date = '2023-08-01' AND publish_date >= '2023-08-08' ORDER BY play_count DESC LIMIT 11" - , replaceSql); - - replaceSql = "select YEAR(发行日期), count(歌曲名) from 歌曲库 where YEAR(发行日期) in (2022, 2023) and 数据日期 = '2023-08-14' group by YEAR(发行日期)"; - - replaceSql = CCJSqlParserUtils.replaceFields(replaceSql, fieldToBizName); - replaceSql = CCJSqlParserUtils.replaceFunction(replaceSql); - - Assert.assertEquals( - "SELECT YEAR(publish_date), count(song_name) FROM 歌曲库 WHERE YEAR(publish_date) IN (2022, 2023) AND sys_imp_date = '2023-08-14' GROUP BY YEAR(publish_date)", - replaceSql); - - replaceSql = "select YEAR(发行日期), count(歌曲名) from 歌曲库 where YEAR(发行日期) in (2022, 2023) and 数据日期 = '2023-08-14' group by 发行日期"; - - replaceSql = CCJSqlParserUtils.replaceFields(replaceSql, fieldToBizName); - replaceSql = CCJSqlParserUtils.replaceFunction(replaceSql); - - Assert.assertEquals( - "SELECT YEAR(publish_date), count(song_name) FROM 歌曲库 WHERE YEAR(publish_date) IN (2022, 2023) AND sys_imp_date = '2023-08-14' GROUP BY publish_date", - replaceSql); - - replaceSql = CCJSqlParserUtils.replaceFields( - "select 歌曲名 from 歌曲库 where datediff('year', 发布日期, '2023-08-11') <= 1 and 结算播放量 > 1000000 and datediff('day', 数据日期, '2023-08-11') <= 30", - fieldToBizName); - replaceSql = CCJSqlParserUtils.replaceFunction(replaceSql); - - Assert.assertEquals( - "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-08-11' AND play_count > 1000000 AND sys_imp_date <= '2023-08-11' AND publish_date >= '2022-08-11' AND sys_imp_date >= '2023-07-12'" - , replaceSql); - - replaceSql = CCJSqlParserUtils.replaceFields( - "select 歌曲名 from 歌曲库 where datediff('day', 发布日期, '2023-08-09') <= 1 and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' order by 播放量 desc limit 11", - fieldToBizName); - replaceSql = CCJSqlParserUtils.replaceFunction(replaceSql); - - Assert.assertEquals( - "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-08-09' AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' AND publish_date >= '2023-08-08' ORDER BY play_count DESC LIMIT 11" - , replaceSql); - - replaceSql = CCJSqlParserUtils.replaceFields( - "select 歌曲名 from 歌曲库 where datediff('year', 发布日期, '2023-08-09') = 0 and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' order by 播放量 desc limit 11", - fieldToBizName); - replaceSql = CCJSqlParserUtils.replaceFunction(replaceSql); - - Assert.assertEquals( - "SELECT song_name FROM 歌曲库 WHERE 1 = 1 AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' AND publish_date <= '2023-08-09' AND publish_date >= '2023-01-01' ORDER BY play_count DESC LIMIT 11" - , replaceSql); - - replaceSql = CCJSqlParserUtils.replaceFields( - "select 歌曲名 from 歌曲库 where datediff('year', 发布日期, '2023-08-09') <= 0.5 and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' order by 播放量 desc limit 11", - fieldToBizName); - replaceSql = CCJSqlParserUtils.replaceFunction(replaceSql); - - Assert.assertEquals( - "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-08-09' AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' AND publish_date >= '2023-02-09' ORDER BY play_count DESC LIMIT 11" - , replaceSql); - - replaceSql = CCJSqlParserUtils.replaceFields( - "select 歌曲名 from 歌曲库 where datediff('year', 发布日期, '2023-08-09') >= 0.5 and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' order by 播放量 desc limit 11", - fieldToBizName); - replaceSql = CCJSqlParserUtils.replaceFunction(replaceSql); - - Assert.assertEquals( - "SELECT song_name FROM 歌曲库 WHERE publish_date >= '2023-08-09' AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' AND publish_date <= '2023-02-09' ORDER BY play_count DESC LIMIT 11" - , replaceSql); - - replaceSql = CCJSqlParserUtils.replaceFields( - "select 部门,用户 from 超音数 where 数据日期 = '2023-08-08' and 用户 ='alice' and 发布日期 ='11' order by 访问次数 desc limit 1", - fieldToBizName); - replaceSql = CCJSqlParserUtils.replaceFunction(replaceSql); - - Assert.assertEquals( - "SELECT department, user_id FROM 超音数 WHERE sys_imp_date = '2023-08-08' AND user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1" - , replaceSql); - - replaceSql = CCJSqlParserUtils.replaceTable(replaceSql, "s2"); - - replaceSql = CCJSqlParserUtils.addFieldsToSelect(replaceSql, Collections.singletonList("field_a")); - - replaceSql = CCJSqlParserUtils.replaceFields( - "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' and 用户 ='alice' and 发布日期 ='11' group by 部门 limit 1", - fieldToBizName); - replaceSql = CCJSqlParserUtils.replaceFunction(replaceSql); - - Assert.assertEquals( - "SELECT department, sum(pv) FROM 超音数 WHERE sys_imp_date = '2023-08-08' AND user_id = 'alice' AND publish_date = '11' GROUP BY department LIMIT 1", - replaceSql); - - replaceSql = "select sum(访问次数) from 超音数 where 数据日期 >= '2023-08-06' and 数据日期 <= '2023-08-06' and 部门 = 'hr'"; - replaceSql = CCJSqlParserUtils.replaceFields(replaceSql, fieldToBizName); - replaceSql = CCJSqlParserUtils.replaceFunction(replaceSql); - - Assert.assertEquals( - "SELECT sum(pv) FROM 超音数 WHERE sys_imp_date >= '2023-08-06' AND sys_imp_date <= '2023-08-06' AND department = 'hr'", - replaceSql); - } - - - @Test - void getAllFields() { - - List allFields = CCJSqlParserUtils.getAllFields( - "SELECT department, user_id, field_a FROM s2 WHERE sys_imp_date = '2023-08-08' AND user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1"); - - Assert.assertEquals(allFields.size(), 6); - - allFields = CCJSqlParserUtils.getAllFields( - "SELECT department, user_id, field_a FROM s2 WHERE sys_imp_date >= '2023-08-08' AND user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1"); - - Assert.assertEquals(allFields.size(), 6); - - allFields = CCJSqlParserUtils.getAllFields( - "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' and 用户 = 'alice' and 发布日期 ='11' group by 部门 limit 1"); - - Assert.assertEquals(allFields.size(), 5); - } - - @Test - void replaceTable() { - - String sql = "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' and 用户 =alice and 发布日期 ='11' group by 部门 limit 1"; - String replaceSql = CCJSqlParserUtils.replaceTable(sql, "s2"); - - Assert.assertEquals( - "SELECT 部门, sum(访问次数) FROM s2 WHERE 数据日期 = '2023-08-08' AND 用户 = alice AND 发布日期 = '11' GROUP BY 部门 LIMIT 1", - replaceSql); - } - - - @Test - void getSelectFields() { - - String sql = "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' and 用户 =alice and 发布日期 ='11' group by 部门 limit 1"; - List selectFields = CCJSqlParserUtils.getSelectFields(sql); - - Assert.assertEquals(selectFields.contains("访问次数"), true); - Assert.assertEquals(selectFields.contains("部门"), true); - } - - @Test - void getWhereFields() { - - String sql = "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' and 用户 = 'alice' and 发布日期 ='11' group by 部门 limit 1"; - List selectFields = CCJSqlParserUtils.getWhereFields(sql); - - Assert.assertEquals(selectFields.contains("发布日期"), true); - Assert.assertEquals(selectFields.contains("数据日期"), true); - Assert.assertEquals(selectFields.contains("用户"), true); - } - - - @Test - void addWhere() throws JSQLParserException { - - String sql = "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' and 用户 =alice and 发布日期 ='11' group by 部门 limit 1"; - sql = CCJSqlParserUtils.addWhere(sql, "column_a", 123444555); - List selectFields = CCJSqlParserUtils.getAllFields(sql); - - Assert.assertEquals(selectFields.contains("column_a"), true); - - sql = CCJSqlParserUtils.addWhere(sql, "column_b", "123456666"); - selectFields = CCJSqlParserUtils.getAllFields(sql); - - Assert.assertEquals(selectFields.contains("column_b"), true); - - Expression expression = CCJSqlParserUtil.parseCondExpression(" ( column_c = 111 or column_d = 1111)"); - - sql = CCJSqlParserUtils.addWhere( - "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' and 用户 =alice and 发布日期 ='11' group by 部门 limit 1", - expression); - - Assert.assertEquals(sql.contains("column_c = 111"), true); - - } - - - @Test - void hasAggregateFunction() throws JSQLParserException { - - String sql = "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' and 用户 =alice and 发布日期 ='11' group by 部门 limit 1"; - boolean hasAggregateFunction = CCJSqlParserUtils.hasAggregateFunction(sql); - - Assert.assertEquals(hasAggregateFunction, true); - sql = "select 部门,count (访问次数) from 超音数 where 数据日期 = '2023-08-08' and 用户 =alice and 发布日期 ='11' group by 部门 limit 1"; - hasAggregateFunction = CCJSqlParserUtils.hasAggregateFunction(sql); - Assert.assertEquals(hasAggregateFunction, true); - - sql = "SELECT count(1) FROM s2 WHERE sys_imp_date = '2023-08-08' AND user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1"; - hasAggregateFunction = CCJSqlParserUtils.hasAggregateFunction(sql); - Assert.assertEquals(hasAggregateFunction, true); - - sql = "SELECT department, user_id, field_a FROM s2 WHERE sys_imp_date = '2023-08-08' AND user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1"; - hasAggregateFunction = CCJSqlParserUtils.hasAggregateFunction(sql); - Assert.assertEquals(hasAggregateFunction, false); - - sql = "SELECT department, user_id, field_a FROM s2 WHERE sys_imp_date = '2023-08-08' AND user_id = 'alice' AND publish_date = '11'"; - hasAggregateFunction = CCJSqlParserUtils.hasAggregateFunction(sql); - Assert.assertEquals(hasAggregateFunction, false); - - } - - private Map initParams() { - Map fieldToBizName = new HashMap<>(); - fieldToBizName.put("部门", "department"); - fieldToBizName.put("用户", "user_id"); - fieldToBizName.put("数据日期", "sys_imp_date"); - fieldToBizName.put("发布日期", "publish_date"); - fieldToBizName.put("访问次数", "pv"); - fieldToBizName.put("歌曲名", "song_name"); - fieldToBizName.put("歌手名", "singer_name"); - fieldToBizName.put("播放", "play_count"); - fieldToBizName.put("歌曲发布时间", "song_publis_date"); - fieldToBizName.put("歌曲发布年份", "song_publis_year"); - fieldToBizName.put("转3.0前后30天结算份额衰减", "fdafdfdsa_fdas"); - return fieldToBizName; - } -} \ No newline at end of file diff --git a/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelperTest.java b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelperTest.java new file mode 100644 index 000000000..b34195ca8 --- /dev/null +++ b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelperTest.java @@ -0,0 +1,190 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import org.junit.Assert; +import org.junit.jupiter.api.Test; + +/** + * SqlParserSelectHelper Test + */ +class SqlParserSelectHelperTest { + + + @Test + void getWhereFilterExpression() { + + List filterExpression = SqlParserSelectHelper.getFilterExpression( + "SELECT department, user_id, field_a FROM s2 WHERE sys_imp_date = '2023-08-08' " + + " AND user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1"); + + System.out.println(filterExpression); + + filterExpression = SqlParserSelectHelper.getFilterExpression( + "SELECT department, user_id, field_a FROM s2 WHERE sys_imp_date = '2023-08-08' " + + "AND user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1"); + + System.out.println(filterExpression); + + filterExpression = SqlParserSelectHelper.getFilterExpression( + "SELECT department, user_id, field_a FROM s2 WHERE sys_imp_date = '2023-08-08' " + + "AND user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1"); + + System.out.println(filterExpression); + + filterExpression = SqlParserSelectHelper.getFilterExpression( + "SELECT department, user_id, field_a FROM s2 WHERE " + + "user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1"); + + System.out.println(filterExpression); + + filterExpression = SqlParserSelectHelper.getFilterExpression( + "SELECT department, user_id, field_a FROM s2 WHERE " + + "user_id = 'alice' AND publish_date > 10000 ORDER BY pv DESC LIMIT 1"); + + System.out.println(filterExpression); + } + + + @Test + void getAllFields() { + + List allFields = SqlParserSelectHelper.getAllFields( + "SELECT department, user_id, field_a FROM s2 WHERE sys_imp_date = '2023-08-08'" + + " AND user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1"); + + Assert.assertEquals(allFields.size(), 6); + + allFields = SqlParserSelectHelper.getAllFields( + "SELECT department, user_id, field_a FROM s2 WHERE sys_imp_date >= '2023-08-08'" + + " AND user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1"); + + Assert.assertEquals(allFields.size(), 6); + + allFields = SqlParserSelectHelper.getAllFields( + "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' and 用户 = 'alice'" + + " and 发布日期 ='11' group by 部门 limit 1"); + + Assert.assertEquals(allFields.size(), 5); + } + + + @Test + void getSelectFields() { + + String sql = "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' " + + "and 用户 =alice and 发布日期 ='11' group by 部门 limit 1"; + List selectFields = SqlParserSelectHelper.getSelectFields(sql); + + Assert.assertEquals(selectFields.contains("访问次数"), true); + Assert.assertEquals(selectFields.contains("部门"), true); + } + + @Test + void getWhereFields() { + + String sql = "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08'" + + " and 用户 = 'alice' and 发布日期 ='11' group by 部门 limit 1"; + List selectFields = SqlParserSelectHelper.getWhereFields(sql); + + Assert.assertEquals(selectFields.contains("发布日期"), true); + Assert.assertEquals(selectFields.contains("数据日期"), true); + Assert.assertEquals(selectFields.contains("用户"), true); + + sql = "select 部门,用户 from 超音数 where 数据日期 = '2023-08-08'" + + " and 用户 = 'alice' and 发布日期 ='11' order by 访问次数 limit 1"; + selectFields = SqlParserSelectHelper.getWhereFields(sql); + + Assert.assertEquals(selectFields.contains("发布日期"), true); + Assert.assertEquals(selectFields.contains("数据日期"), true); + Assert.assertEquals(selectFields.contains("用户"), true); + } + + @Test + void getOrderByFields() { + + String sql = "select 部门,用户 from 超音数 where 数据日期 = '2023-08-08'" + + " and 用户 = 'alice' and 发布日期 ='11' order by 访问次数 limit 1"; + List selectFields = SqlParserSelectHelper.getOrderByFields(sql); + + Assert.assertEquals(selectFields.contains("访问次数"), true); + } + + + @Test + void addWhere() throws JSQLParserException { + + String sql = "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' " + + "and 用户 =alice and 发布日期 ='11' group by 部门 limit 1"; + sql = SqlParserUpdateHelper.addWhere(sql, "column_a", 123444555); + List selectFields = SqlParserSelectHelper.getAllFields(sql); + + Assert.assertEquals(selectFields.contains("column_a"), true); + + sql = SqlParserUpdateHelper.addWhere(sql, "column_b", "123456666"); + selectFields = SqlParserSelectHelper.getAllFields(sql); + + Assert.assertEquals(selectFields.contains("column_b"), true); + + Expression expression = CCJSqlParserUtil.parseCondExpression(" ( column_c = 111 or column_d = 1111)"); + + sql = SqlParserUpdateHelper.addWhere( + "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' " + + "and 用户 =alice and 发布日期 ='11' group by 部门 limit 1", + expression); + + Assert.assertEquals(sql.contains("column_c = 111"), true); + + } + + + @Test + void hasAggregateFunction() throws JSQLParserException { + + String sql = "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' " + + "and 用户 =alice and 发布日期 ='11' group by 部门 limit 1"; + boolean hasAggregateFunction = SqlParserSelectHelper.hasAggregateFunction(sql); + + Assert.assertEquals(hasAggregateFunction, true); + sql = "select 部门,count (访问次数) from 超音数 where 数据日期 = '2023-08-08' " + + "and 用户 =alice and 发布日期 ='11' group by 部门 limit 1"; + hasAggregateFunction = SqlParserSelectHelper.hasAggregateFunction(sql); + Assert.assertEquals(hasAggregateFunction, true); + + sql = "SELECT count(1) FROM s2 WHERE sys_imp_date = '2023-08-08' AND user_id = 'alice'" + + " AND publish_date = '11' ORDER BY pv DESC LIMIT 1"; + hasAggregateFunction = SqlParserSelectHelper.hasAggregateFunction(sql); + Assert.assertEquals(hasAggregateFunction, true); + + sql = "SELECT department, user_id, field_a FROM s2 WHERE sys_imp_date = '2023-08-08' " + + "AND user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1"; + hasAggregateFunction = SqlParserSelectHelper.hasAggregateFunction(sql); + Assert.assertEquals(hasAggregateFunction, false); + + sql = "SELECT department, user_id, field_a FROM s2 WHERE sys_imp_date = '2023-08-08'" + + " AND user_id = 'alice' AND publish_date = '11'"; + hasAggregateFunction = SqlParserSelectHelper.hasAggregateFunction(sql); + Assert.assertEquals(hasAggregateFunction, false); + + } + + private Map initParams() { + Map fieldToBizName = new HashMap<>(); + fieldToBizName.put("部门", "department"); + fieldToBizName.put("用户", "user_id"); + fieldToBizName.put("数据日期", "sys_imp_date"); + fieldToBizName.put("发布日期", "publish_date"); + fieldToBizName.put("访问次数", "pv"); + fieldToBizName.put("歌曲名", "song_name"); + fieldToBizName.put("歌手名", "singer_name"); + fieldToBizName.put("播放", "play_count"); + fieldToBizName.put("歌曲发布时间", "song_publis_date"); + fieldToBizName.put("歌曲发布年份", "song_publis_year"); + fieldToBizName.put("转3.0前后30天结算份额衰减", "fdafdfdsa_fdas"); + return fieldToBizName; + } +} diff --git a/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelperTest.java b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelperTest.java new file mode 100644 index 000000000..33740931b --- /dev/null +++ b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelperTest.java @@ -0,0 +1,198 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import org.junit.Assert; +import org.junit.jupiter.api.Test; + +/** + * SqlParserUpdateHelper Test + */ +class SqlParserUpdateHelperTest { + + @Test + void replaceFields() { + + Map fieldToBizName = initParams(); + String replaceSql = "select 歌曲名 from 歌曲库 where datediff('day', 发布日期, '2023-08-09') <= 1 " + + "and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' and 歌曲发布时 = '2023-08-01'" + + " order by 播放量 desc limit 11"; + + replaceSql = SqlParserUpdateHelper.replaceFields(replaceSql, fieldToBizName); + replaceSql = SqlParserUpdateHelper.replaceFunction(replaceSql); + + Assert.assertEquals( + "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-08-09' " + + "AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' AND " + + "song_publis_date = '2023-08-01' AND publish_date >= '2023-08-08' " + + "ORDER BY play_count DESC LIMIT 11", replaceSql); + + replaceSql = "select YEAR(发行日期), count(歌曲名) from 歌曲库 where YEAR(发行日期) " + + "in (2022, 2023) and 数据日期 = '2023-08-14' group by YEAR(发行日期)"; + + replaceSql = SqlParserUpdateHelper.replaceFields(replaceSql, fieldToBizName); + replaceSql = SqlParserUpdateHelper.replaceFunction(replaceSql); + + Assert.assertEquals( + "SELECT YEAR(publish_date), count(song_name) FROM 歌曲库 " + + "WHERE YEAR(publish_date) IN (2022, 2023) AND sys_imp_date = '2023-08-14' " + + "GROUP BY YEAR(publish_date)", + replaceSql); + + replaceSql = "select YEAR(发行日期), count(歌曲名) from 歌曲库 " + + "where YEAR(发行日期) in (2022, 2023) and 数据日期 = '2023-08-14' " + + "group by 发行日期"; + + replaceSql = SqlParserUpdateHelper.replaceFields(replaceSql, fieldToBizName); + replaceSql = SqlParserUpdateHelper.replaceFunction(replaceSql); + + Assert.assertEquals( + "SELECT YEAR(publish_date), count(song_name) FROM 歌曲库 " + + "WHERE YEAR(publish_date) IN (2022, 2023) AND sys_imp_date = '2023-08-14'" + + " GROUP BY publish_date", + replaceSql); + + replaceSql = SqlParserUpdateHelper.replaceFields( + "select 歌曲名 from 歌曲库 where datediff('year', 发布日期, '2023-08-11') <= 1 " + + "and 结算播放量 > 1000000 and datediff('day', 数据日期, '2023-08-11') <= 30", + fieldToBizName); + replaceSql = SqlParserUpdateHelper.replaceFunction(replaceSql); + + Assert.assertEquals( + "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-08-11' " + + "AND play_count > 1000000 AND sys_imp_date <= '2023-08-11' AND " + + "publish_date >= '2022-08-11' AND sys_imp_date >= '2023-07-12'", replaceSql); + + replaceSql = SqlParserUpdateHelper.replaceFields( + "select 歌曲名 from 歌曲库 where datediff('day', 发布日期, '2023-08-09') <= 1 " + + "and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' order by 播放量 desc limit 11", + fieldToBizName); + replaceSql = SqlParserUpdateHelper.replaceFunction(replaceSql); + + Assert.assertEquals( + "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-08-09' " + + "AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' " + + "AND publish_date >= '2023-08-08' ORDER BY play_count DESC LIMIT 11", replaceSql); + + replaceSql = SqlParserUpdateHelper.replaceFields( + "select 歌曲名 from 歌曲库 where datediff('year', 发布日期, '2023-08-09') = 0 " + + "and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' order by 播放量 desc limit 11", fieldToBizName); + replaceSql = SqlParserUpdateHelper.replaceFunction(replaceSql); + + Assert.assertEquals( + "SELECT song_name FROM 歌曲库 WHERE 1 = 1 AND singer_name = '邓紫棋'" + + " AND sys_imp_date = '2023-08-09' AND publish_date <= '2023-08-09' " + + "AND publish_date >= '2023-01-01' ORDER BY play_count DESC LIMIT 11", replaceSql); + + replaceSql = SqlParserUpdateHelper.replaceFields( + "select 歌曲名 from 歌曲库 where datediff('year', 发布日期, '2023-08-09') <= 0.5 " + + "and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' order by 播放量 desc limit 11", fieldToBizName); + replaceSql = SqlParserUpdateHelper.replaceFunction(replaceSql); + + Assert.assertEquals( + "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-08-09' " + + "AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' " + + "AND publish_date >= '2023-02-09' ORDER BY play_count DESC LIMIT 11", replaceSql); + + replaceSql = SqlParserUpdateHelper.replaceFields( + "select 歌曲名 from 歌曲库 where datediff('year', 发布日期, '2023-08-09') >= 0.5 " + + "and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' order by 播放量 desc limit 11", fieldToBizName); + replaceSql = SqlParserUpdateHelper.replaceFunction(replaceSql); + + Assert.assertEquals( + "SELECT song_name FROM 歌曲库 WHERE publish_date >= '2023-08-09' " + + "AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' " + + "AND publish_date <= '2023-02-09' ORDER BY play_count DESC LIMIT 11", replaceSql); + + replaceSql = SqlParserUpdateHelper.replaceFields( + "select 部门,用户 from 超音数 where 数据日期 = '2023-08-08' and 用户 ='alice'" + + " and 发布日期 ='11' order by 访问次数 desc limit 1", fieldToBizName); + replaceSql = SqlParserUpdateHelper.replaceFunction(replaceSql); + + Assert.assertEquals( + "SELECT department, user_id FROM 超音数 WHERE sys_imp_date = '2023-08-08'" + + " AND user_id = 'alice' AND publish_date = '11' ORDER BY pv DESC LIMIT 1", replaceSql); + + replaceSql = SqlParserUpdateHelper.replaceTable(replaceSql, "s2"); + + replaceSql = SqlParserUpdateHelper.addFieldsToSelect(replaceSql, Collections.singletonList("field_a")); + + replaceSql = SqlParserUpdateHelper.replaceFields( + "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' " + + "and 用户 ='alice' and 发布日期 ='11' group by 部门 limit 1", fieldToBizName); + replaceSql = SqlParserUpdateHelper.replaceFunction(replaceSql); + + Assert.assertEquals( + "SELECT department, sum(pv) FROM 超音数 WHERE sys_imp_date = '2023-08-08'" + + " AND user_id = 'alice' AND publish_date = '11' GROUP BY department LIMIT 1", replaceSql); + + replaceSql = "select sum(访问次数) from 超音数 where 数据日期 >= '2023-08-06' " + + "and 数据日期 <= '2023-08-06' and 部门 = 'hr'"; + replaceSql = SqlParserUpdateHelper.replaceFields(replaceSql, fieldToBizName); + replaceSql = SqlParserUpdateHelper.replaceFunction(replaceSql); + + Assert.assertEquals( + "SELECT sum(pv) FROM 超音数 WHERE sys_imp_date >= '2023-08-06' " + + "AND sys_imp_date <= '2023-08-06' AND department = 'hr'", replaceSql); + } + + + @Test + void replaceTable() { + + String sql = "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' " + + "and 用户 =alice and 发布日期 ='11' group by 部门 limit 1"; + String replaceSql = SqlParserUpdateHelper.replaceTable(sql, "s2"); + + Assert.assertEquals( + "SELECT 部门, sum(访问次数) FROM s2 WHERE 数据日期 = '2023-08-08' " + + "AND 用户 = alice AND 发布日期 = '11' GROUP BY 部门 LIMIT 1", replaceSql); + } + + @Test + void addWhere() throws JSQLParserException { + + String sql = "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' " + + "and 用户 =alice and 发布日期 ='11' group by 部门 limit 1"; + sql = SqlParserUpdateHelper.addWhere(sql, "column_a", 123444555); + List selectFields = SqlParserSelectHelper.getAllFields(sql); + + Assert.assertEquals(selectFields.contains("column_a"), true); + + sql = SqlParserUpdateHelper.addWhere(sql, "column_b", "123456666"); + selectFields = SqlParserSelectHelper.getAllFields(sql); + + Assert.assertEquals(selectFields.contains("column_b"), true); + + Expression expression = CCJSqlParserUtil.parseCondExpression(" ( column_c = 111 or column_d = 1111)"); + + sql = SqlParserUpdateHelper.addWhere( + "select 部门,sum (访问次数) from 超音数 where 数据日期 = '2023-08-08' " + + "and 用户 =alice and 发布日期 ='11' group by 部门 limit 1", + expression); + + Assert.assertEquals(sql.contains("column_c = 111"), true); + + } + + private Map initParams() { + Map fieldToBizName = new HashMap<>(); + fieldToBizName.put("部门", "department"); + fieldToBizName.put("用户", "user_id"); + fieldToBizName.put("数据日期", "sys_imp_date"); + fieldToBizName.put("发布日期", "publish_date"); + fieldToBizName.put("访问次数", "pv"); + fieldToBizName.put("歌曲名", "song_name"); + fieldToBizName.put("歌手名", "singer_name"); + fieldToBizName.put("播放", "play_count"); + fieldToBizName.put("歌曲发布时间", "song_publis_date"); + fieldToBizName.put("歌曲发布年份", "song_publis_year"); + fieldToBizName.put("转3.0前后30天结算份额衰减", "fdafdfdsa_fdas"); + return fieldToBizName; + } +} diff --git a/docs/images/supersonic_components.png b/docs/images/supersonic_components.png index 07ebe188d..4db266acc 100644 Binary files a/docs/images/supersonic_components.png and b/docs/images/supersonic_components.png differ diff --git a/docs/images/wechat_contact.jpeg b/docs/images/wechat_contact.jpeg deleted file mode 100644 index 1d913ecc0..000000000 Binary files a/docs/images/wechat_contact.jpeg and /dev/null differ diff --git a/launchers/chat/src/main/bin/run.sh b/launchers/chat/src/main/bin/run.sh index 694b87156..00d517aea 100755 --- a/launchers/chat/src/main/bin/run.sh +++ b/launchers/chat/src/main/bin/run.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash binDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$sbinDir/.." && pwd -P) +baseDir=$(readlink -f $binDir/../) libDir=$baseDir/lib confDir=$baseDir/conf webDir=$baseDir/webapp diff --git a/launchers/chat/src/main/bin/service.sh b/launchers/chat/src/main/bin/service.sh index 24c32d098..fef8ff3a7 100755 --- a/launchers/chat/src/main/bin/service.sh +++ b/launchers/chat/src/main/bin/service.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash binDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$sbinDir/.." && pwd -P) +baseDir=$(readlink -f $binDir/../) confDir=$baseDir/conf source ${baseDir}/bin/env.sh diff --git a/launchers/chat/src/main/resources/META-INF/spring.factories b/launchers/chat/src/main/resources/META-INF/spring.factories index c1c44be25..967ebe322 100644 --- a/launchers/chat/src/main/resources/META-INF/spring.factories +++ b/launchers/chat/src/main/resources/META-INF/spring.factories @@ -3,6 +3,7 @@ com.tencent.supersonic.chat.api.component.SchemaMapper=\ com.tencent.supersonic.chat.mapper.FuzzyNameMapper, \ com.tencent.supersonic.chat.mapper.QueryFilterMapper, \ com.tencent.supersonic.chat.mapper.EntityMapper + com.tencent.supersonic.chat.api.component.SemanticParser=\ com.tencent.supersonic.chat.parser.rule.QueryModeParser, \ com.tencent.supersonic.chat.parser.rule.ContextInheritParser, \ @@ -10,23 +11,30 @@ com.tencent.supersonic.chat.api.component.SemanticParser=\ com.tencent.supersonic.chat.parser.rule.TimeRangeParser, \ com.tencent.supersonic.chat.parser.rule.AggregateTypeParser, \ com.tencent.supersonic.chat.parser.llm.dsl.LLMDSLParser, \ - com.tencent.supersonic.chat.parser.function.FunctionBasedParser + com.tencent.supersonic.chat.parser.plugin.function.FunctionBasedParser + + com.tencent.supersonic.chat.api.component.SemanticLayer=\ com.tencent.supersonic.knowledge.semantic.RemoteSemanticLayer + com.tencent.supersonic.chat.query.QuerySelector=\ com.tencent.supersonic.chat.query.HeuristicQuerySelector -com.tencent.supersonic.chat.parser.function.ModelResolver=\ - com.tencent.supersonic.chat.parser.function.HeuristicModelResolver + +com.tencent.supersonic.chat.parser.plugin.function.ModelResolver=\ + com.tencent.supersonic.chat.parser.plugin.function.HeuristicModelResolver + com.tencent.supersonic.auth.authentication.interceptor.AuthenticationInterceptor=\ com.tencent.supersonic.auth.authentication.interceptor.DefaultAuthenticationInterceptor + com.tencent.supersonic.auth.api.authentication.adaptor.UserAdaptor=\ com.tencent.supersonic.auth.authentication.adaptor.DefaultUserAdaptor -com.tencent.supersonic.chat.api.component.DSLOptimizer=\ - com.tencent.supersonic.chat.query.dsl.optimizer.DateFieldCorrector, \ - com.tencent.supersonic.chat.query.dsl.optimizer.FieldCorrector, \ - com.tencent.supersonic.chat.query.dsl.optimizer.FunctionCorrector, \ - com.tencent.supersonic.chat.query.dsl.optimizer.TableNameCorrector, \ - com.tencent.supersonic.chat.query.dsl.optimizer.QueryFilterAppend, \ - com.tencent.supersonic.chat.query.dsl.optimizer.SelectFieldAppendCorrector \ No newline at end of file +com.tencent.supersonic.chat.api.component.SemanticCorrector=\ + com.tencent.supersonic.chat.corrector.DateFieldCorrector, \ + com.tencent.supersonic.chat.corrector.FieldValueCorrector, \ + com.tencent.supersonic.chat.corrector.FieldCorrector, \ + com.tencent.supersonic.chat.corrector.FunctionCorrector, \ + com.tencent.supersonic.chat.corrector.TableNameCorrector, \ + com.tencent.supersonic.chat.corrector.QueryFilterAppend, \ + com.tencent.supersonic.chat.corrector.SelectFieldAppendCorrector diff --git a/launchers/chat/src/main/resources/db/chat-schema-h2.sql b/launchers/chat/src/main/resources/db/chat-schema-h2.sql index 3d54144d0..d5e0638de 100644 --- a/launchers/chat/src/main/resources/db/chat-schema-h2.sql +++ b/launchers/chat/src/main/resources/db/chat-schema-h2.sql @@ -1,116 +1,80 @@ 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 + `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` -) - ); + `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, - `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` -) - ); + `chat_id` BIGINT auto_increment ,-- AUTO_INCREMENT, + `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 `s2_chat_query` ( - `question_id` BIGINT NOT NULL AUTO_INCREMENT, - `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_response` mediumtext NOT NULL, - `score` int DEFAULT '0', - `feedback` varchar(1024) DEFAULT '', + `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 '', PRIMARY KEY (`question_id`) ); -CREATE TABLE IF NOT EXISTS `s2_chat_config` +CREATE TABLE `s2_chat_parse` ( - `id` - INT - NOT - NULL - AUTO_INCREMENT, - `domain_id` - INT - DEFAULT - NULL, - `chat_detail_config` - varchar + `question_id` BIGINT NOT NULL, + `chat_id` BIGINT 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 `s2_chat_statistics` ( - 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 - PRIMARY KEY -( - `id` -) - ); + `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, + `domain_id` INT DEFAULT NULL , + `chat_detail_config` varchar(655) , + `chat_agg_config` varchar(655) , + `recommended_questions` varchar(1500) , + `created_at` TIMESTAMP NOT NULL , + `updated_at` TIMESTAMP NOT NULL , + `created_by` varchar(100) NOT NULL , + `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 + PRIMARY KEY (`id`) +) ; -- CREATE TABLE IF NOT EXISTS `s2_chat_config` ( @@ -127,150 +91,69 @@ CREATE TABLE IF NOT EXISTS `s2_chat_config` -- `status` INT NOT NULL DEFAULT '0' , -- domain extension information status : 0 is normal, 1 is off the shelf, 2 is deleted -- PRIMARY KEY (`id`) -- ) ; -COMMENT -ON TABLE s2_chat_config IS 'chat config information table '; +COMMENT ON TABLE s2_chat_config IS 'chat config information table '; -CREATE TABLE IF NOT EXISTS `s2_dictionary` -( - `id` - INT - NOT - NULL - AUTO_INCREMENT, - `domain_id` - INT - NOT - NULL, - `dim_value_infos` - LONGVARCHAR, -- dimension value setting information - `created_at` - TIMESTAMP - NOT - NULL, - `updated_at` - TIMESTAMP - NOT - NULL, - `created_by` - varchar -( - 100 -) NOT NULL , - `updated_by` varchar -( - 100 -) DEFAULT NULL , - `status` INT NOT NULL DEFAULT '0' , -- domain extension information status : 0 is normal, 1 is off the shelf, 2 is deleted - PRIMARY KEY -( - `id` -), - UNIQUE -( - domain_id -) + +CREATE TABLE IF NOT EXISTS `s2_dictionary` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain_id` INT NOT NULL , + `dim_value_infos` LONGVARCHAR , -- dimension value setting information + `created_at` TIMESTAMP NOT NULL , + `updated_at` TIMESTAMP NOT NULL , + `created_by` varchar(100) NOT NULL , + `updated_by` varchar(100) DEFAULT NULL , + `status` INT NOT NULL DEFAULT '0' , -- domain extension information status : 0 is normal, 1 is off the shelf, 2 is deleted + PRIMARY KEY (`id`), + UNIQUE (domain_id) ); -COMMENT -ON TABLE s2_dictionary IS 'dictionary configuration information table'; +COMMENT ON TABLE s2_dictionary IS 'dictionary configuration 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 -) , - `command` LONGVARCHAR NOT NULL , -- task Request Parameters - `command_md5` varchar -( - 255 -) NOT NULL , -- task Request Parameters md5 - `status` INT NOT NULL , -- the final status of the task - `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP , - `created_by` varchar -( - 100 -) NOT NULL , - `progress` DOUBLE default 0.00 , -- task real-time progress - `elapsed_ms` bigINT DEFAULT NULL , -- the task takes time in milliseconds - `message` LONGVARCHAR , -- remark related information - PRIMARY KEY -( - `id` -) - ); -COMMENT -ON TABLE s2_dictionary_task IS 'dictionary task 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) , + `command`LONGVARCHAR NOT NULL , -- task Request Parameters + `command_md5` varchar(255) NOT NULL , -- task Request Parameters md5 + `status` INT NOT NULL , -- the final status of the task + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP , + `created_by` varchar(100) NOT NULL , + `progress` DOUBLE default 0.00 , -- task real-time progress + `elapsed_ms` bigINT DEFAULT NULL , -- the task takes time in milliseconds + `message` LONGVARCHAR , -- remark related information + PRIMARY KEY (`id`) +); +COMMENT ON TABLE s2_dictionary_task IS 'dictionary task information table'; create table s2_user ( - id INT AUTO_INCREMENT, - name varchar(100) not null, + id INT AUTO_INCREMENT, + name varchar(100) not null, display_name varchar(100) null, - password varchar(100) null, - email varchar(100) null, + password varchar(100) null, + email varchar(100) null, PRIMARY KEY (`id`) ); -COMMENT -ON TABLE s2_user IS 'user information table'; +COMMENT ON TABLE s2_user IS 'user information table'; CREATE TABLE IF NOT EXISTS `s2_plugin` ( - `id` - INT - AUTO_INCREMENT, - `type` - varchar -( - 50 -) NULL, - `domain` varchar -( - 100 -) NULL, - `pattern` varchar -( - 500 -) NULL, - `parse_mode` varchar -( - 100 -) NULL, - `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'; + `id` INT AUTO_INCREMENT, + `type` varchar(50) NULL, + `domain` 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'; diff --git a/launchers/semantic/src/main/bin/run.sh b/launchers/semantic/src/main/bin/run.sh index 79a06ca90..00d517aea 100755 --- a/launchers/semantic/src/main/bin/run.sh +++ b/launchers/semantic/src/main/bin/run.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash binDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$binDir/.." && pwd -P) +baseDir=$(readlink -f $binDir/../) libDir=$baseDir/lib confDir=$baseDir/conf webDir=$baseDir/webapp diff --git a/launchers/semantic/src/main/bin/service.sh b/launchers/semantic/src/main/bin/service.sh index f3374d01e..fef8ff3a7 100755 --- a/launchers/semantic/src/main/bin/service.sh +++ b/launchers/semantic/src/main/bin/service.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash binDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$binDir/.." && pwd -P) +baseDir=$(readlink -f $binDir/../) confDir=$baseDir/conf source ${baseDir}/bin/env.sh diff --git a/launchers/standalone/src/main/bin/run.sh b/launchers/standalone/src/main/bin/run.sh index 79a06ca90..00d517aea 100755 --- a/launchers/standalone/src/main/bin/run.sh +++ b/launchers/standalone/src/main/bin/run.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash binDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$binDir/.." && pwd -P) +baseDir=$(readlink -f $binDir/../) libDir=$baseDir/lib confDir=$baseDir/conf webDir=$baseDir/webapp diff --git a/launchers/standalone/src/main/bin/service.sh b/launchers/standalone/src/main/bin/service.sh index f3374d01e..fef8ff3a7 100755 --- a/launchers/standalone/src/main/bin/service.sh +++ b/launchers/standalone/src/main/bin/service.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash binDir=$(cd "$(dirname "$0")"; pwd) -baseDir=$(cd "$binDir/.." && pwd -P) +baseDir=$(readlink -f $binDir/../) confDir=$baseDir/conf source ${baseDir}/bin/env.sh diff --git a/launchers/standalone/src/main/java/com/tencent/supersonic/ConfigureDemo.java b/launchers/standalone/src/main/java/com/tencent/supersonic/ConfigureDemo.java index 00e662cf0..c8d3a7306 100644 --- a/launchers/standalone/src/main/java/com/tencent/supersonic/ConfigureDemo.java +++ b/launchers/standalone/src/main/java/com/tencent/supersonic/ConfigureDemo.java @@ -17,10 +17,13 @@ import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestionReq; import com.tencent.supersonic.chat.api.pojo.response.ParseResp; import com.tencent.supersonic.chat.plugin.Plugin; -import com.tencent.supersonic.chat.plugin.PluginParseConfig; import com.tencent.supersonic.chat.query.plugin.ParamOption; import com.tencent.supersonic.chat.query.plugin.WebBase; -import com.tencent.supersonic.chat.service.*; +import com.tencent.supersonic.chat.service.QueryService; +import com.tencent.supersonic.chat.service.ChatService; +import com.tencent.supersonic.chat.service.ConfigService; +import com.tencent.supersonic.chat.service.PluginService; +import com.tencent.supersonic.chat.service.AgentService; import com.tencent.supersonic.common.util.JsonUtil; import java.util.ArrayList; import java.util.Arrays; @@ -35,33 +38,35 @@ import org.springframework.stereotype.Component; @Component @Slf4j public class ConfigureDemo implements ApplicationListener { - + private User user = User.getFakeUser(); @Qualifier("chatQueryService") @Autowired private QueryService queryService; @Autowired private ChatService chatService; @Autowired - protected ConfigService configService; + private ConfigService configService; @Autowired private PluginService pluginService; @Autowired private AgentService agentService; - private User user = User.getFakeUser(); - private void parseAndExecute(int chatId, String queryText) throws Exception { QueryReq queryRequest = new QueryReq(); queryRequest.setQueryText(queryText); queryRequest.setChatId(chatId); + queryRequest.setAgentId(1); queryRequest.setUser(User.getFakeUser()); ParseResp parseResp = queryService.performParsing(queryRequest); ExecuteQueryReq executeReq = new ExecuteQueryReq(); + executeReq.setQueryId(parseResp.getQueryId()); + executeReq.setParseId(parseResp.getSelectedParses().get(0).getId()); executeReq.setQueryText(queryRequest.getQueryText()); executeReq.setParseInfo(parseResp.getSelectedParses().get(0)); executeReq.setChatId(parseResp.getChatId()); executeReq.setUser(queryRequest.getUser()); + executeReq.setAgentId(1); queryService.performExecution(executeReq); } @@ -87,38 +92,39 @@ public class ConfigureDemo implements ApplicationListener ChatDetailConfigReq chatDetailConfig = new ChatDetailConfigReq(); ChatDefaultConfigReq chatDefaultConfigDetail = new ChatDefaultConfigReq(); - List dimensionIds_0 = Arrays.asList(1L, 2L); - List metricIds_0 = Arrays.asList(1L); - chatDefaultConfigDetail.setDimensionIds(dimensionIds_0); - chatDefaultConfigDetail.setMetricIds(metricIds_0); + List dimensionIds0 = Arrays.asList(1L, 2L); + List metricIds0 = Arrays.asList(1L); + chatDefaultConfigDetail.setDimensionIds(dimensionIds0); + chatDefaultConfigDetail.setMetricIds(metricIds0); chatDefaultConfigDetail.setUnit(7); chatDefaultConfigDetail.setPeriod("DAY"); chatDetailConfig.setChatDefaultConfig(chatDefaultConfigDetail); - ItemVisibility visibility_0 = new ItemVisibility(); - chatDetailConfig.setVisibility(visibility_0); + ItemVisibility visibility0 = new ItemVisibility(); + chatDetailConfig.setVisibility(visibility0); chatConfigBaseReq.setChatDetailConfig(chatDetailConfig); + ChatAggConfigReq chatAggConfig = new ChatAggConfigReq(); ChatDefaultConfigReq chatDefaultConfigAgg = new ChatDefaultConfigReq(); - List dimensionIds_1 = Arrays.asList(1L, 2L); - List metricIds_1 = Arrays.asList(1L); - chatDefaultConfigAgg.setDimensionIds(dimensionIds_1); - chatDefaultConfigAgg.setMetricIds(metricIds_1); + List dimensionIds1 = Arrays.asList(1L, 2L); + List metricIds1 = Arrays.asList(1L); + chatDefaultConfigAgg.setDimensionIds(dimensionIds1); + chatDefaultConfigAgg.setMetricIds(metricIds1); chatDefaultConfigAgg.setUnit(7); chatDefaultConfigAgg.setPeriod("DAY"); chatDefaultConfigAgg.setTimeMode(ChatDefaultConfigReq.TimeMode.RECENT); chatAggConfig.setChatDefaultConfig(chatDefaultConfigAgg); - ItemVisibility visibility_1 = new ItemVisibility(); - chatAggConfig.setVisibility(visibility_1); + ItemVisibility visibility1 = new ItemVisibility(); + chatAggConfig.setVisibility(visibility1); chatConfigBaseReq.setChatAggConfig(chatAggConfig); List recommendedQuestions = new ArrayList<>(); - RecommendedQuestionReq recommendedQuestionReq_0 = new RecommendedQuestionReq("超音数访问次数"); - RecommendedQuestionReq recommendedQuestionReq_1 = new RecommendedQuestionReq("超音数访问人数"); - RecommendedQuestionReq recommendedQuestionReq_2 = new RecommendedQuestionReq("超音数按部门访问次数"); - recommendedQuestions.add(recommendedQuestionReq_0); - recommendedQuestions.add(recommendedQuestionReq_1); - recommendedQuestions.add(recommendedQuestionReq_2); + RecommendedQuestionReq recommendedQuestionReq0 = new RecommendedQuestionReq("超音数访问次数"); + RecommendedQuestionReq recommendedQuestionReq1 = new RecommendedQuestionReq("超音数访问人数"); + RecommendedQuestionReq recommendedQuestionReq2 = new RecommendedQuestionReq("超音数按部门访问次数"); + recommendedQuestions.add(recommendedQuestionReq0); + recommendedQuestions.add(recommendedQuestionReq1); + recommendedQuestions.add(recommendedQuestionReq2); chatConfigBaseReq.setRecommendedQuestions(recommendedQuestions); configService.addConfig(chatConfigBaseReq, user); @@ -130,29 +136,30 @@ public class ConfigureDemo implements ApplicationListener ChatDetailConfigReq chatDetailConfig = new ChatDetailConfigReq(); ChatDefaultConfigReq chatDefaultConfigDetail = new ChatDefaultConfigReq(); - List dimensionIds_0 = Arrays.asList(4L, 5L, 6L, 7L); - List metricIds_0 = Arrays.asList(4L); - chatDefaultConfigDetail.setDimensionIds(dimensionIds_0); - chatDefaultConfigDetail.setMetricIds(metricIds_0); + List dimensionIds0 = Arrays.asList(4L, 5L, 6L, 7L); + List metricIds0 = Arrays.asList(4L); + chatDefaultConfigDetail.setDimensionIds(dimensionIds0); + chatDefaultConfigDetail.setMetricIds(metricIds0); chatDefaultConfigDetail.setUnit(7); chatDefaultConfigDetail.setPeriod("DAY"); chatDetailConfig.setChatDefaultConfig(chatDefaultConfigDetail); - ItemVisibility visibility_0 = new ItemVisibility(); - chatDetailConfig.setVisibility(visibility_0); + ItemVisibility visibility0 = new ItemVisibility(); + chatDetailConfig.setVisibility(visibility0); chatConfigBaseReq.setChatDetailConfig(chatDetailConfig); + ChatAggConfigReq chatAggConfig = new ChatAggConfigReq(); ChatDefaultConfigReq chatDefaultConfigAgg = new ChatDefaultConfigReq(); - List dimensionIds_1 = Arrays.asList(4L, 5L, 6L, 7L); - List metricIds_1 = Arrays.asList(4L); - chatDefaultConfigAgg.setDimensionIds(dimensionIds_1); - chatDefaultConfigAgg.setMetricIds(metricIds_1); + List dimensionIds1 = Arrays.asList(4L, 5L, 6L, 7L); + List metricIds1 = Arrays.asList(4L); + chatDefaultConfigAgg.setDimensionIds(dimensionIds1); + chatDefaultConfigAgg.setMetricIds(metricIds1); chatDefaultConfigAgg.setUnit(7); chatDefaultConfigAgg.setPeriod("DAY"); chatDefaultConfigAgg.setTimeMode(ChatDefaultConfigReq.TimeMode.RECENT); chatAggConfig.setChatDefaultConfig(chatDefaultConfigAgg); - ItemVisibility visibility_1 = new ItemVisibility(); - chatAggConfig.setVisibility(visibility_1); + ItemVisibility visibility1 = new ItemVisibility(); + chatAggConfig.setVisibility(visibility1); chatConfigBaseReq.setChatAggConfig(chatAggConfig); List recommendedQuestions = new ArrayList<>(); @@ -162,12 +169,12 @@ public class ConfigureDemo implements ApplicationListener } private void addPlugin_1() { - Plugin plugin_1 = new Plugin(); - plugin_1.setType("WEB_PAGE"); - plugin_1.setModelList(Arrays.asList(1L)); - plugin_1.setPattern("访问情况"); - plugin_1.setParseModeConfig(null); - plugin_1.setName("访问情况"); + Plugin plugin1 = new Plugin(); + plugin1.setType("WEB_PAGE"); + plugin1.setModelList(Arrays.asList(1L)); + plugin1.setPattern("访问情况"); + plugin1.setParseModeConfig(null); + plugin1.setName("访问情况"); WebBase webBase = new WebBase(); webBase.setUrl("www.test.com"); ParamOption paramOption = new ParamOption(); @@ -177,23 +184,23 @@ public class ConfigureDemo implements ApplicationListener paramOption.setModelId(1L); List paramOptions = Arrays.asList(paramOption); webBase.setParamOptions(paramOptions); - plugin_1.setConfig(JsonUtil.toString(webBase)); + plugin1.setConfig(JsonUtil.toString(webBase)); - pluginService.createPlugin(plugin_1, user); + pluginService.createPlugin(plugin1, user); } - private void addAgent() { Agent agent = new Agent(); agent.setId(1); - agent.setName("查信息"); - agent.setDescription("查信息"); + agent.setName("查指标"); + agent.setDescription("查指标"); agent.setStatus(1); agent.setEnableSearch(1); agent.setExamples(Lists.newArrayList("超音数访问次数", "超音数访问人数", "alice 停留时长")); AgentConfig agentConfig = new AgentConfig(); RuleQueryTool ruleQueryTool = new RuleQueryTool(); ruleQueryTool.setType(AgentToolType.RULE); + ruleQueryTool.setModelIds(Lists.newArrayList(1L, 2L)); ruleQueryTool.setQueryModes(Lists.newArrayList( "ENTITY_DETAIL", "ENTITY_LIST_FILTER", "ENTITY_ID", "METRIC_ENTITY", "METRIC_FILTER", "METRIC_GROUPBY", "METRIC_MODEL", "METRIC_ORDERBY" diff --git a/launchers/standalone/src/main/resources/META-INF/spring.factories b/launchers/standalone/src/main/resources/META-INF/spring.factories index 67aecd08c..2305f851b 100644 --- a/launchers/standalone/src/main/resources/META-INF/spring.factories +++ b/launchers/standalone/src/main/resources/META-INF/spring.factories @@ -3,30 +3,38 @@ com.tencent.supersonic.chat.api.component.SchemaMapper=\ com.tencent.supersonic.chat.mapper.FuzzyNameMapper, \ com.tencent.supersonic.chat.mapper.QueryFilterMapper, \ com.tencent.supersonic.chat.mapper.EntityMapper + com.tencent.supersonic.chat.api.component.SemanticParser=\ com.tencent.supersonic.chat.parser.rule.QueryModeParser, \ com.tencent.supersonic.chat.parser.rule.ContextInheritParser, \ com.tencent.supersonic.chat.parser.rule.AgentCheckParser, \ com.tencent.supersonic.chat.parser.rule.TimeRangeParser, \ com.tencent.supersonic.chat.parser.rule.AggregateTypeParser, \ - com.tencent.supersonic.chat.parser.llm.dsl.LLMDSLParser, \ - com.tencent.supersonic.chat.parser.embedding.EmbeddingBasedParser, \ - com.tencent.supersonic.chat.parser.function.FunctionBasedParser + com.tencent.supersonic.chat.parser.llm.dsl.LLMDslParser, \ + com.tencent.supersonic.chat.parser.plugin.embedding.EmbeddingBasedParser, \ + com.tencent.supersonic.chat.parser.plugin.function.FunctionBasedParser + + com.tencent.supersonic.chat.api.component.SemanticLayer=\ com.tencent.supersonic.knowledge.semantic.LocalSemanticLayer + com.tencent.supersonic.chat.query.QuerySelector=\ com.tencent.supersonic.chat.query.HeuristicQuerySelector -com.tencent.supersonic.chat.parser.function.ModelResolver=\ - com.tencent.supersonic.chat.parser.function.HeuristicModelResolver + +com.tencent.supersonic.chat.parser.plugin.function.ModelResolver=\ + com.tencent.supersonic.chat.parser.plugin.function.HeuristicModelResolver + com.tencent.supersonic.auth.authentication.interceptor.AuthenticationInterceptor=\ com.tencent.supersonic.auth.authentication.interceptor.DefaultAuthenticationInterceptor + com.tencent.supersonic.auth.api.authentication.adaptor.UserAdaptor=\ com.tencent.supersonic.auth.authentication.adaptor.DefaultUserAdaptor -com.tencent.supersonic.chat.api.component.DSLOptimizer=\ - com.tencent.supersonic.chat.query.dsl.optimizer.DateFieldCorrector, \ - com.tencent.supersonic.chat.query.dsl.optimizer.FieldCorrector, \ - com.tencent.supersonic.chat.query.dsl.optimizer.FunctionCorrector, \ - com.tencent.supersonic.chat.query.dsl.optimizer.TableNameCorrector, \ - com.tencent.supersonic.chat.query.dsl.optimizer.QueryFilterAppend, \ - com.tencent.supersonic.chat.query.dsl.optimizer.SelectFieldAppendCorrector \ No newline at end of file +com.tencent.supersonic.chat.api.component.SemanticCorrector=\ + com.tencent.supersonic.chat.corrector.DateFieldCorrector, \ + com.tencent.supersonic.chat.corrector.FieldValueCorrector, \ + com.tencent.supersonic.chat.corrector.FieldCorrector, \ + com.tencent.supersonic.chat.corrector.FunctionCorrector, \ + com.tencent.supersonic.chat.corrector.TableNameCorrector, \ + com.tencent.supersonic.chat.corrector.QueryFilterAppend, \ + com.tencent.supersonic.chat.corrector.SelectFieldAppendCorrector diff --git a/launchers/standalone/src/main/resources/application-local.yaml b/launchers/standalone/src/main/resources/application-local.yaml index 5a73d5b34..52649ba71 100644 --- a/launchers/standalone/src/main/resources/application-local.yaml +++ b/launchers/standalone/src/main/resources/application-local.yaml @@ -28,5 +28,8 @@ semantic: url: prefix: http://127.0.0.1:9081 +time: + threshold: 100 + mybatis: mapper-locations=classpath:mappers/custom/*.xml,classpath*:/mappers/*.xml diff --git a/launchers/standalone/src/main/resources/db/data-h2.sql b/launchers/standalone/src/main/resources/db/data-h2.sql index 921952ecb..f8e1030a3 100644 --- a/launchers/standalone/src/main/resources/db/data-h2.sql +++ b/launchers/standalone/src/main/resources/db/data-h2.sql @@ -1,2316 +1,1117 @@ -- sample user -insert into s2_user (id, `name`, password, display_name, email) -values (1, 'admin', 'admin', 'admin', 'admin@xx.com'); -insert into s2_user (id, `name`, password, display_name, email) -values (2, 'jack', '123456', 'jack', 'jack@xx.com'); -insert into s2_user (id, `name`, password, display_name, email) -values (3, 'tom', '123456', 'tom', 'tom@xx.com'); -insert into s2_user (id, `name`, password, display_name, email) -values (4, 'lucy', '123456', 'lucy', 'lucy@xx.com'); -insert into s2_user (id, `name`, password, display_name, email) -values (5, 'alice', '123456', 'alice', 'alice@xx.com'); +insert into s2_user (id, `name`, password, display_name, email) values (1, 'admin','admin','admin','admin@xx.com'); +insert into s2_user (id, `name`, password, display_name, email) values (2, 'jack','123456','jack','jack@xx.com'); +insert into s2_user (id, `name`, password, display_name, email) values (3, 'tom','123456','tom','tom@xx.com'); +insert into s2_user (id, `name`, password, display_name, email) values (4, 'lucy','123456','lucy','lucy@xx.com'); +insert into s2_user (id, `name`, password, display_name, email) values (5, 'alice','123456','alice','alice@xx.com'); -- sample models -insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, - updated_by, `admin`, admin_org, viewer, view_org) -VALUES (1, '超音数', 'supersonic', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', - 'admin', 'admin', '', 'admin,tom,jack', 'admin'); -insert into s2_model (id, `name`, biz_name, domain_id, created_at, created_by, updated_at, - updated_by, `admin`, admin_org, is_open, viewer, view_org, entity) -VALUES (1, '超音数', 'supersonic', 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', - 'admin', '', 0, 'admin,tom,jack', 'admin', ''); -insert into s2_model (id, `name`, biz_name, domain_id, created_at, created_by, updated_at, - updated_by, `admin`, admin_org, is_open, viewer, view_org, entity) -VALUES (2, '艺人库', 'singer', 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', - 'admin', '', 0, 'admin,tom,jack', 'admin', '{"entityId": 7, "names": ["歌手", "艺人"]}'); -insert into s2_database (id, domain_id, `name`, description, `type`, config, created_at, created_by, - updated_at, updated_by) -VALUES (1, 1, 'H2数据实例', '', 'h2', - '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', - '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); -insert into s2_datasource (id, model_id, `name`, biz_name, description, database_id, - datasource_detail, created_at, created_by, updated_at, updated_by) -VALUES (1, 1, '停留时长统计', 's2_stay_time_statis', '停留时长统计', 1, - '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_stay_time_statis_stay_hours","expr":"stay_hours","isCreateMetric":1,"name":"停留时长"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, page,user_name,stay_hours FROM s2_stay_time_statis"}', - '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource (id, model_id, `name`, biz_name, description, database_id, - datasource_detail, created_at, created_by, updated_at, updated_by) -VALUES (2, 1, 'PVUV统计', 's2_pv_uv_statis', 'PVUV统计', 1, - '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","expr":"pv","isCreateMetric":1,"name":"访问次数"},{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","expr":"uv","isCreateMetric":1,"name":"访问人数"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, user_name,page,1 as pv, user_name as uv FROM s2_pv_uv_statis"}', - '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource (id, model_id, `name`, biz_name, description, database_id, - datasource_detail, created_at, created_by, updated_at, updated_by) -VALUES (3, 1, '用户部门', 'user_department', '用户部门', 1, - '{"dimensions":[{"bizName":"department","dateFormat":"yyyy-MM-dd","expr":"department","isCreateDimension":1,"name":"部门","type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[],"queryType":"sql_query","sqlQuery":"SELECT user_name,department FROM s2_user_department"}', - '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource (id, model_id, `name`, biz_name, description, database_id, - datasource_detail, created_at, created_by, updated_at, updated_by) -VALUES (4, 2, '艺人库', 'singer', '艺人库', 1, - '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"act_area","dateFormat":"yyyy-MM-dd","expr":"act_area","isCreateDimension":1,"name":"活跃区域","type":"categorical"},{"bizName":"song_name","dateFormat":"yyyy-MM-dd","expr":"song_name","isCreateDimension":1,"name":"代表作","type":"categorical"},{"bizName":"genre","dateFormat":"yyyy-MM-dd","expr":"genre","isCreateDimension":1,"name":"风格","type":"categorical"}],"identifiers":[{"bizName":"singer_name","name":"歌手名","type":"primary"}],"measures":[{"agg":"sum","bizName":"music_down_cnt","expr":"down_cnt","isCreateMetric":1,"name":"下载量"},{"agg":"sum","bizName":"music_js_play_cnt","expr":"js_play_cnt","isCreateMetric":1,"name":"播放量"},{"agg":"sum","bizName":"music_favor_cnt","expr":"favor_cnt","isCreateMetric":1,"name":"收藏量"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date,singer_name,act_area,song_name,genre,js_play_cnt,down_cnt,favor_cnt FROM singer "}', - '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource_rela (id, model_id, `datasource_from`, datasource_to, join_key, - created_at, created_by, updated_at, updated_by) -VALUES (1, 1, 1, 2, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource_rela (id, model_id, `datasource_from`, datasource_to, join_key, - created_at, created_by, updated_at, updated_by) -VALUES (2, 1, 1, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource_rela (id, model_id, `datasource_from`, datasource_to, join_key, - created_at, created_by, updated_at, updated_by) -VALUES (3, 1, 2, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_dimension (id, model_id, datasource_id, `name`, biz_name, description, status, - sensitive_level, `type`, type_params, expr, created_at, created_by, - updated_at, updated_by, semantic_type, dim_value_maps) -VALUES (1, 1, 3, '部门', 'department', '部门', 1, 0, 'categorical', NULL, 'department', - '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY', - '[{"alias":["人力资源","人力"],"bizName":"人力资源","techName":"HR"},{"alias":["营销","销售"],"bizName":"营销部门","techName":"sales"}]'); -insert into s2_dimension (id, model_id, datasource_id, `name`, biz_name, description, status, - sensitive_level, `type`, type_params, expr, created_at, created_by, - updated_at, updated_by, semantic_type) -VALUES (2, 1, 1, '用户名', 'user_name', '用户名', 1, 0, 'primary', NULL, 'user_name', - '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id, model_id, datasource_id, `name`, biz_name, description, status, - sensitive_level, `type`, type_params, expr, created_at, created_by, - updated_at, updated_by, semantic_type) -VALUES (3, 1, 2, '页面', 'page', '页面', 1, 2, 'categorical', NULL, 'page', '2023-05-24 00:00:00', - 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id, model_id, datasource_id, `name`, biz_name, description, status, - sensitive_level, `type`, type_params, expr, created_at, created_by, - updated_at, updated_by, semantic_type) -VALUES (4, 2, 4, '活跃区域', 'act_area', '活跃区域', 1, 2, 'categorical', NULL, 'act_area', - '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id, model_id, datasource_id, `name`, biz_name, description, status, - sensitive_level, `type`, type_params, expr, created_at, created_by, - updated_at, updated_by, semantic_type) -VALUES (5, 2, 4, '代表作', 'song_name', '代表作', 1, 2, 'categorical', NULL, 'song_name', - '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id, model_id, datasource_id, `name`, biz_name, description, status, - sensitive_level, `type`, type_params, expr, created_at, created_by, - updated_at, updated_by, semantic_type) -VALUES (6, 2, 4, '风格', 'genre', '风格', 1, 2, 'categorical', NULL, 'genre', '2023-05-24 00:00:00', - 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id, model_id, datasource_id, `name`, biz_name, description, status, - sensitive_level, `type`, type_params, expr, created_at, created_by, - updated_at, updated_by, semantic_type) -VALUES (7, 2, 4, '歌手名', 'singer_name', '歌手名', 1, 2, 'categorical', NULL, 'singer_name', - '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_metric (id, model_id, `name`, biz_name, description, status, sensitive_level, `type`, - type_params, created_at, created_by, updated_at, updated_by, - data_format_type, data_format) -VALUES (1, 1, '停留时长', 'stay_hours', '停留时长', 1, 2, 'ATOMIC', - '{"expr":"s2_stay_time_statis_stay_hours","measures":[{"agg":"sum","expr":"stay_hours","isCreateMetric":1,"datasourceId":1,"bizName":"s2_stay_time_statis_stay_hours","name":"s2_stay_time_statis_stay_hours"}]}', - '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL); -insert into s2_metric (id, model_id, `name`, biz_name, description, status, sensitive_level, `type`, - type_params, created_at, created_by, updated_at, updated_by, - data_format_type, data_format) -VALUES (2, 1, '访问次数', 'pv', '访问次数', 1, 0, 'ATOMIC', - ' {"expr":"s2_pv_uv_statis_pv","measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","datasourceId":2,"expr":"pv","isCreateMetric":1,"name":"s2_pv_uv_statis_pv"}]}', - '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL); -insert into s2_metric (id, model_id, `name`, biz_name, description, status, sensitive_level, `type`, - type_params, created_at, created_by, updated_at, updated_by, - data_format_type, data_format) -VALUES (3, 1, '访问人数', 'uv', '访问人数', 1, 0, 'ATOMIC', - ' {"expr":"s2_pv_uv_statis_uv","measures":[{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","datasourceId":2,"expr":"uv","isCreateMetric":1,"name":"s2_pv_uv_statis_uv"}]}', - '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL); -insert into s2_metric (id, model_id, `name`, biz_name, description, status, sensitive_level, `type`, - type_params, created_at, created_by, updated_at, updated_by, - data_format_type, data_format) -VALUES (4, 2, '播放量', 'js_play_cnt', '播放量', 1, 2, 'ATOMIC', - '{"expr":"music_js_play_cnt","measures":[{"agg":"sum","expr":"js_play_cnt","isCreateMetric":1,"datasourceId":4,"bizName":"music_js_play_cnt","name":"music_js_play_cnt"}]}', - '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL); -insert into s2_metric (id, model_id, `name`, biz_name, description, status, sensitive_level, `type`, - type_params, created_at, created_by, updated_at, updated_by, - data_format_type, data_format) -VALUES (5, 2, '下载量', 'down_cnt', '下载量', 1, 0, 'ATOMIC', - ' {"expr":"music_down_cnt","measures":[{"agg":"sum","bizName":"music_down_cnt","datasourceId":4,"expr":"down_cnt","isCreateMetric":1,"name":"music_down_cnt"}]}', - '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL); -insert into s2_metric (id, model_id, `name`, biz_name, description, status, sensitive_level, `type`, - type_params, created_at, created_by, updated_at, updated_by, - data_format_type, data_format) -VALUES (6, 2, '收藏量', 'favor_cnt', '收藏量', 1, 0, 'ATOMIC', - ' {"expr":"music_favor_cnt","measures":[{"agg":"sum","bizName":"music_favor_cnt","datasourceId":4,"expr":"favor_cnt","isCreateMetric":1,"name":"music_favor_cnt"}]}', - '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL); +insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, viewer, view_org) VALUES(1, '超音数', 'supersonic', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 'admin,tom,jack', 'admin' ); +insert into s2_model (id, `name`, biz_name, domain_id, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org, entity) VALUES(1, '超音数', 'supersonic', 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin','' ); +insert into s2_model (id, `name`, biz_name, domain_id, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org, entity) VALUES(2, '艺人库', 'singer', 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin','{"entityId": 7, "names": ["歌手", "艺人"]}' ); +insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(1, 1, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); +insert into s2_datasource (id , model_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, '停留时长统计', 's2_stay_time_statis', '停留时长统计', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_stay_time_statis_stay_hours","expr":"stay_hours","isCreateMetric":1,"name":"停留时长"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, page,user_name,stay_hours FROM s2_stay_time_statis"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_datasource (id , model_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(2, 1, 'PVUV统计', 's2_pv_uv_statis', 'PVUV统计', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","expr":"pv","isCreateMetric":1,"name":"访问次数"},{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","expr":"uv","isCreateMetric":1,"name":"访问人数"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, user_name,page,1 as pv, user_name as uv FROM s2_pv_uv_statis"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_datasource (id , model_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(3, 1, '用户部门', 'user_department', '用户部门', 1, '{"dimensions":[{"bizName":"department","dateFormat":"yyyy-MM-dd","expr":"department","isCreateDimension":1,"name":"部门","type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[],"queryType":"sql_query","sqlQuery":"SELECT user_name,department FROM s2_user_department"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_datasource (id , model_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(4, 2, '艺人库', 'singer', '艺人库', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"act_area","dateFormat":"yyyy-MM-dd","expr":"act_area","isCreateDimension":1,"name":"活跃区域","type":"categorical"},{"bizName":"song_name","dateFormat":"yyyy-MM-dd","expr":"song_name","isCreateDimension":1,"name":"代表作","type":"categorical"},{"bizName":"genre","dateFormat":"yyyy-MM-dd","expr":"genre","isCreateDimension":1,"name":"风格","type":"categorical"}],"identifiers":[{"bizName":"singer_name","name":"歌手名","type":"primary"}],"measures":[{"agg":"sum","bizName":"music_down_cnt","expr":"down_cnt","isCreateMetric":1,"name":"下载量"},{"agg":"sum","bizName":"music_js_play_cnt","expr":"js_play_cnt","isCreateMetric":1,"name":"播放量"},{"agg":"sum","bizName":"music_favor_cnt","expr":"favor_cnt","isCreateMetric":1,"name":"收藏量"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date,singer_name,act_area,song_name,genre,js_play_cnt,down_cnt,favor_cnt FROM singer "}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_datasource_rela (id , model_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, 1, 2, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_datasource_rela (id , model_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(2, 1, 1, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_datasource_rela (id , model_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(3, 1, 2, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_dimension (id , model_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type, dim_value_maps) VALUES(1, 1, 3, '部门', 'department', '部门', 1, 0, 'categorical', NULL, 'department', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY', '[{"alias":["人力资源","人力"],"bizName":"人力资源","techName":"HR"},{"alias":["营销","销售"],"bizName":"营销部门","techName":"sales"}]'); +insert into s2_dimension (id , model_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(2, 1, 1, '用户名', 'user_name', '用户名', 1, 0, 'primary', NULL, 'user_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , model_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(3, 1, 2, '页面', 'page', '页面', 1, 2, 'categorical', NULL, 'page', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , model_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(4, 2, 4, '活跃区域', 'act_area', '活跃区域', 1, 2, 'categorical', NULL, 'act_area', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , model_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(5, 2, 4, '代表作', 'song_name', '代表作', 1, 2, 'categorical', NULL, 'song_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , model_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(6, 2, 4, '风格', 'genre', '风格', 1, 2, 'categorical', NULL, 'genre', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id , model_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(7, 2, 4, '歌手名', 'singer_name', '歌手名', 1, 2, 'categorical', NULL, 'singer_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_metric (id, model_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(1, 1, '停留时长', 'stay_hours', '停留时长', 1, 2, 'ATOMIC', '{"expr":"s2_stay_time_statis_stay_hours","measures":[{"agg":"sum","expr":"stay_hours","isCreateMetric":1,"datasourceId":1,"bizName":"s2_stay_time_statis_stay_hours","name":"s2_stay_time_statis_stay_hours"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, model_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(2, 1, '访问次数', 'pv', '访问次数', 1, 0, 'ATOMIC', ' {"expr":"s2_pv_uv_statis_pv","measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","datasourceId":2,"expr":"pv","isCreateMetric":1,"name":"s2_pv_uv_statis_pv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, model_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(3, 1, '访问人数', 'uv', '访问人数', 1, 0, 'ATOMIC', ' {"expr":"s2_pv_uv_statis_uv","measures":[{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","datasourceId":2,"expr":"uv","isCreateMetric":1,"name":"s2_pv_uv_statis_uv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, model_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(4, 2, '播放量', 'js_play_cnt', '播放量', 1, 2, 'ATOMIC', '{"expr":"music_js_play_cnt","measures":[{"agg":"sum","expr":"js_play_cnt","isCreateMetric":1,"datasourceId":4,"bizName":"music_js_play_cnt","name":"music_js_play_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, model_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(5, 2, '下载量', 'down_cnt', '下载量', 1, 0, 'ATOMIC', ' {"expr":"music_down_cnt","measures":[{"agg":"sum","bizName":"music_down_cnt","datasourceId":4,"expr":"down_cnt","isCreateMetric":1,"name":"music_down_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_metric (id, model_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(6, 2, '收藏量', 'favor_cnt', '收藏量', 1, 0, 'ATOMIC', ' {"expr":"music_favor_cnt","measures":[{"agg":"sum","bizName":"music_favor_cnt","datasourceId":4,"expr":"favor_cnt","isCreateMetric":1,"name":"music_favor_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_available_date_info(`item_id`, `type`, `date_format`, `start_date`, `end_date`, - `unavailable_date`, `created_at`, `created_by`, `updated_at`, - `updated_by`) -values (1, 'dimension', 'yyyy-MM-dd', DATEADD('DAY', -28, CURRENT_DATE()), - DATEADD('DAY', -1, CURRENT_DATE()), '[]', '2023-06-01', 'admin', '2023-06-01', 'admin'); -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', DATEADD('DAY', -28, CURRENT_DATE()), - DATEADD('DAY', -1, CURRENT_DATE()), '[]', '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', DATEADD('DAY', -28, CURRENT_DATE()), - DATEADD('DAY', -1, CURRENT_DATE()), '[]', '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 (1, 'dimension', 'yyyy-MM-dd', DATEADD('DAY', -28, CURRENT_DATE()), DATEADD('DAY', -1, CURRENT_DATE()), '[]', '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', DATEADD('DAY', -28, CURRENT_DATE()), DATEADD('DAY', -1, CURRENT_DATE()), '[]', '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', DATEADD('DAY', -28, CURRENT_DATE()), DATEADD('DAY', -1, CURRENT_DATE()), '[]', '2023-06-01', 'admin', '2023-06-01', 'admin'); insert into s2_auth_groups (group_id, config) -values (1, - '{"modelId":"1","name":"admin-permission","groupId":1,"authRules":[{"metrics":["stay_hours"],"dimensions":["page"]}],"dimensionFilters":[""],"dimensionFilterDescription":"授权admin 页面和停留时长权限","authorizedUsers":["admin"],"authorizedDepartmentIds":[]}'); +values (1, '{"modelId":"1","name":"admin-permission","groupId":1,"authRules":[{"metrics":["stay_hours"],"dimensions":["page"]}],"dimensionFilters":[""],"dimensionFilterDescription":"授权admin 页面和停留时长权限","authorizedUsers":["admin"],"authorizedDepartmentIds":[]}'); insert into s2_auth_groups (group_id, config) -values (2, - '{"modelId":"1","name":"tom_sales_permission","groupId":2,"authRules":[{"metrics":["stay_hours"],"dimensions":["page"]}],"dimensionFilters":["department in (''sales'')"],"dimensionFilterDescription":"开通 tom sales部门权限", "authorizedUsers":["tom"],"authorizedDepartmentIds":[]}'); +values (2, '{"modelId":"1","name":"tom_sales_permission","groupId":2,"authRules":[{"metrics":["stay_hours"],"dimensions":["page"]}],"dimensionFilters":["department in (''sales'')"],"dimensionFilterDescription":"部门 in [sales]", "authorizedUsers":["tom"],"authorizedDepartmentIds":[]}'); -- sample data -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '周杰伦', '中国', '青花瓷', '流行', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '周杰伦', '中国', '青花瓷', '流行', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '周杰伦', '中国', '青花瓷', '流行', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '周杰伦', '中国', '青花瓷', '流行', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '周杰伦', '中国', '青花瓷', '流行', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '周杰伦', '中国', '青花瓷', '流行', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '周杰伦', '中国', '青花瓷', '流行', 1000000, 1000000, 1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '陈奕迅', '中国', '爱情转移', '激情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '陈奕迅', '中国', '爱情转移', '激情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '陈奕迅', '中国', '爱情转移', '激情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '陈奕迅', '中国', '爱情转移', '激情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '陈奕迅', '中国', '爱情转移', '激情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '陈奕迅', '中国', '爱情转移', '激情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '陈奕迅', '中国', '爱情转移', '激情', 1000000, 1000000, 1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '陈奕迅', '中国','爱情转移','激情',1000000,1000000,1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '林俊杰', '中国', '美人鱼', '爱情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '林俊杰', '中国', '美人鱼', '爱情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '林俊杰', '中国', '美人鱼', '爱情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '林俊杰', '中国', '美人鱼', '爱情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '林俊杰', '中国', '美人鱼', '爱情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '林俊杰', '中国', '美人鱼', '爱情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '林俊杰', '中国', '美人鱼', '爱情', 1000000, 1000000, 1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '林俊杰', '中国','美人鱼','爱情',1000000,1000000,1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '张碧晨', '中国', '光的方向', '流行', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '张碧晨', '中国', '光的方向', '流行', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '张碧晨', '中国', '光的方向', '流行', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '张碧晨', '中国', '光的方向', '流行', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '张碧晨', '中国', '光的方向', '流行', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '张碧晨', '中国', '光的方向', '流行', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '张碧晨', '中国', '光的方向', '流行', 1000000, 1000000, 1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '张碧晨', '中国','光的方向','流行',1000000,1000000,1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '程响', '中国', '人间烟火', '国风', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '程响', '中国', '人间烟火', '国风', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '程响', '中国', '人间烟火', '国风', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '程响', '中国', '人间烟火', '国风', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '程响', '中国', '人间烟火', '国风', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '程响', '中国', '人间烟火', '国风', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '程响', '中国', '人间烟火', '国风', 1000000, 1000000, 1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), '程响', '中国','人间烟火','国风',1000000,1000000,1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'Taylor Swift -', '欧美', 'Love Story', '爱情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -5, CURRENT_DATE()), 'Taylor Swift -', '欧美', 'Love Story', '爱情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'Taylor Swift -', '欧美', 'Love Story', '爱情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'Taylor Swift -', '欧美', 'Love Story', '爱情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'Taylor Swift -', '欧美', 'Love Story', '爱情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'Taylor Swift -', '欧美', 'Love Story', '爱情', 1000000, 1000000, 1000000); -INSERT INTO singer (imp_date, singer_name, act_area, song_name, genre, js_play_cnt, down_cnt, - favor_cnt) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'Taylor Swift -', '欧美', 'Love Story', '爱情', 1000000, 1000000, 1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); +INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'Taylor Swift +', '欧美','Love Story','爱情',1000000,1000000,1000000); ---demo data for semantic and chat -insert into s2_user_department (user_name, department) -values ('jack', 'HR'); +insert into s2_user_department (user_name, department) values ('jack','HR'); -insert into s2_user_department (user_name, department) -values ('jack', 'HR'); -insert into s2_user_department (user_name, department) -values ('tom', 'sales'); -insert into s2_user_department (user_name, department) -values ('lucy', 'marketing'); -insert into s2_user_department (user_name, department) -values ('john', 'strategy'); -insert into s2_user_department (user_name, department) -values ('alice', 'sales'); -insert into s2_user_department (user_name, department) -values ('dean', 'marketing'); +insert into s2_user_department (user_name, department) values ('jack','HR'); +insert into s2_user_department (user_name, department) values ('tom','sales'); +insert into s2_user_department (user_name, department) values ('lucy','marketing'); +insert into s2_user_department (user_name, department) values ('john','strategy'); +insert into s2_user_department (user_name, department) values ('alice','sales'); +insert into s2_user_department (user_name, department) values ('dean','marketing'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -5, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'lucy', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'lucy', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'tom', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'john', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'john', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'tom', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'tom', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'tom', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'jack', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'lucy', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'jack', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'lucy', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'john', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'tom', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'alice', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'john', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'dean', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'lucy', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'tom', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'jack', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', 'p2'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'lucy', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', 'p1'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', 'p3'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'alice', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', 'p5'); -INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'lucy', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'lucy', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'tom', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'john', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'john', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'tom', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'tom', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'tom', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'jack', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'lucy', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'jack', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'lucy', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'john', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'tom', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'alice', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'john', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'dean', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'lucy', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'tom', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'jack', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', 'p2'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'lucy', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', 'p1'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', 'p3'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'alice', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', 'p4'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', 'p5'); +INSERT INTO s2_pv_uv_statis (imp_date, user_name, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'tom', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.7636857512911863', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'dean', '0.17663327393462436', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', '0.38943688941552057', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', '0.2715819955225307', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', '0.9358210273119568', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', '0.9364586435510802', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.9707723036513162', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', '0.8497763866782723', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', '0.15504417761372413', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.9507563118298399', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', '0.9746364180572994', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', '0.12869214941133378', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'lucy', '0.3024970533288409', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'tom', '0.6639702099980812', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'lucy', '0.4929901454858626', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', '0.06853040276026445', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.8488086078299616', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'lucy', '0.8589111177125592', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', '0.5576357066482228', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', '0.8047888670006846', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'john', '0.766944548494366', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', '0.5280072184505449', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', '0.9693343356046343', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', '0.12805203958456424', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'dean', '0.16963603387027637', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', '0.5901202956521101', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', '0.12710364646712236', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', '0.6346530909156196', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', '0.12461289103639872', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'john', '0.9863947334662437', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', '0.48899961064192987', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'alice', '0.5382796792688207', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'dean', '0.3506568687014143', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', '0.8633072449771709', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', '0.13999135315363687', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', '0.07258740493845894', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'jack', '0.5244413940436958', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', '0.13258670732966138', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'john', '0.6015982054464575', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'lucy', '0.05513158944480323', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', '0.6707121735296985', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'jack', '0.9330440339006469', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'dean', '0.5630674323371607', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'dean', '0.8720647566229917', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.8331899070546519', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'alice', '0.6712876436249856', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', '0.6694409980332703', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'john', '0.3703307480606334', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'dean', '0.775368688472696', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'lucy', '0.9151205443267096', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', '0.09543108823305857', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', '0.7893992120771057', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', '0.5119923080070498', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'lucy', '0.49906724167974936', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', '0.046258282700961884', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'dean', '0.44843595680103954', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', '0.7743935471689718', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.5855299615656824', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'lucy', '0.9412963512379853', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', '0.8383247587082538', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'lucy', '0.14517876867236124', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', '0.9327229861441061', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.19042326582894153', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', '0.6029067818254513', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', '0.21715964747214422', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'lucy', '0.34259842721045974', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', '0.7064419016593382', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'lucy', '0.5725636566517865', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'john', '0.22332539583809208', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', '0.8049036189055911', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'alice', '0.6029674758974956', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', '0.11884976360561716', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'alice', '0.7124916829130662', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', '0.5893693718556829', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', '0.602073304496253', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'tom', '0.10491061160039927', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'dean', '0.9006548872378379', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', '0.8545144244288455', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'jack', '0.16915384987875726', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', '0.2271640700690446', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', '0.7807518577160636', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'john', '0.8919859648888653', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', '0.1564450687270359', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', '0.5840549187653847', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'tom', '0.2213255596777869', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', '0.07868261880306426', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', '0.07710010861455818', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', '0.5131249730162654', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.5035035055368601', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.8996978291173905', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', '0.057442290722216294', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', '0.6443079066865616', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'lucy', '0.7398098480748726', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'dean', '0.9835694815034591', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'john', '0.9879213445635557', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', '0.4020136688147111', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'lucy', '0.6698797170128024', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.17325132416789113', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'lucy', '0.5784229486763606', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'tom', '0.9185978183932058', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', '0.5474783153973963', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', '0.9730731954700215', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', '0.5390873359288765', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', '0.20522241320887713', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'alice', '0.4088233242325021', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', '0.7608047695853417', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.2749731221085713', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'john', '0.06154055374702494', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.460668002022406', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', '0.4474746325306228', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', '0.5761666885467472', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'dean', '0.33233441360339655', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', '0.7426534909874778', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'tom', '0.5841437875889118', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', '0.2818296500094526', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'tom', '0.8670888843915217', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'alice', '0.5249294365740248', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', '0.5483356748008438', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'dean', '0.7278566847412673', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.6779976902157362', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', '0.09995341651736978', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'jack', '0.4528538159233879', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', '0.5870756885301056', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'tom', '0.9842091927290255', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'tom', '0.04580936015706816', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'alice', '0.8814678270145769', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'john', '0.06517379256096412', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', '0.8769832364187129', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'dean', '0.584562279025023', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', '0.8102404090621375', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', '0.11481653429176686', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', '0.43422888918962554', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'lucy', '0.0684414272594508', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'alice', '0.976546463969412', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.617906858141431', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'jack', '0.08663740247579998', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', '0.7124944606691416', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'alice', '0.1321700521239627', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'jack', '0.3078946609431664', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', '0.6149442855237194', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'alice', '0.5963801306980994', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'lucy', '0.6999542038973406', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'john', '0.4599112653446624', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', '0.20300901401048832', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'john', '0.39989705958717037', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', '0.2486378364940327', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', '0.16880398079144077', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', '0.73927288385526', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', '0.8645283506689198', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', '0.3266940826759587', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', '0.9195490073037541', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', '0.9452523036658287', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', '0.21269683438120535', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.7377502855387184', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', '0.38981597634408716', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.7001799391999863', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', '0.6616720024008785', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'dean', '0.497721735058096', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'jack', '0.22255613760959603', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', '0.05247640233319417', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'dean', '0.27237572107833363', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', '0.9529452406380252', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'alice', '0.28243045060463157', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', '0.17880444250082506', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', '0.035050038002381156', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', '0.840803223728221', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.5318457377361356', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.9280332892460665', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'lucy', '0.752354382202208', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'dean', '0.1866528331789219', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'alice', '0.7016165545791373', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', '0.4191547989960899', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', '0.7025516699007639', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'john', '0.6160127317884274', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', '0.91223094958137', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'tom', '0.4383056089013998', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'jack', '0.595750781166582', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'lucy', '0.9472349338730268', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'jack', '0.0519104588842193', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', '0.48043983034526205', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'lucy', '0.14754707786497478', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'alice', '0.36124288370035695', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'dean', '0.21777919493494613', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', '0.22637666702475057', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', '0.9378215576942598', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', '0.3309229261144562', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'alice', '0.7602880453727515', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'alice', '0.9470462487873785', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.6770215935547629', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', '0.1586074803669385', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'lucy', '0.2754855564794071', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', '0.8355347738454384', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'alice', '0.7251813505573811', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'jack', '0.006606625589642534', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', '0.304832277753024', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.026368662837989554', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'tom', '0.6855977520602776', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'tom', '0.8193746826441749', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.021179295102459972', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', '0.1533849522536005', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', '0.18893553542301778', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.39870999343833624', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'john', '0.9985665103520182', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', '0.6961441157700171', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.9861933923851885', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'tom', '0.993076500099477', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', '0.4320547269058953', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', '0.18441071030375877', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', '0.1501504986117118', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', '0.252021845734527', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'lucy', '0.24442701577183745', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.07563738855797564', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', '0.34247820646440985', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.9456979276862031', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', '0.19494357263973816', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', '0.9371493867882469', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', '0.6136241316589367', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'alice', '0.8922330760877784', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'dean', '0.9001986074661864', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'tom', '0.4889702884422866', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', '0.2689551234431401', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', '0.5223573993758465', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'tom', '0.05042295556527243', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', '0.2717147121880483', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', '0.7397093309370814', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'dean', '0.157064341631733', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'lucy', '0.7213399784998017', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', '0.764081440588005', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.7514070600074144', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', '0.611647412825278', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'tom', '0.6600796877195596', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'john', '0.8942204153751679', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.07398121085929721', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'dean', '0.1652506990439564', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.5849759516111703', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', '0.1672502732600889', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'tom', '0.7836135556233219', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', '0.26181269644936356', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'alice', '0.6577275876355586', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'tom', '0.3067293364197956', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', '0.8608288543866495', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', '0.814283434116926', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'jack', '0.33993584425872936', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'john', '0.010812798859160089', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.5156558224263926', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'jack', '0.46320035330198406', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', '0.2651020283994786', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.42467241545664147', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', '0.3695905136678498', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'tom', '0.15269122123348644', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', '0.6755688670583248', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'jack', '0.39064306179528907', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'john', '0.36479296691952023', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'lucy', '0.5069249157662691', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', '0.4785315495532231', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', '0.7582526218052175', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.42064109605717914', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', '0.5587757581237022', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'lucy', '0.3561686564964428', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.7101688305173135', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'dean', '0.6518061375522985', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.7564485884156583', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', '0.36531347293134464', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'jack', '0.5201689359070235', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', '0.7138792929290383', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'tom', '0.9751003716333827', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', '0.5281906318027629', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', '0.6291356541485003', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'jack', '0.1938712974807698', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'john', '0.6267850210775459', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', '0.4469970592043767', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', '0.7690659124175409', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'jack', '0.13335067838090386', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'jack', '0.2966621725922035', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'john', '0.5740481445089863', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', '0.838028890036331', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', '0.8094354537628714', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', '0.5552924586108698', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', '0.49150373927678315', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', '0.7264346889377966', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'alice', '0.9292830287297702', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.3905616258240767', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.15912349648571666', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', '0.6030082006630102', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'lucy', '0.8712354035243679', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.7685306377211826', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', '0.2869913942171415', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', '0.7142615166855639', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', '0.5625978475154423', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', '0.13611601734791123', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', '0.6977333962685311', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'jack', '0.35140477709778295', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', '0.8805119222967716', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.7014124236538637', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'alice', '0.12759538003439375', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', '0.7515403792213445', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'lucy', '0.03700239289885987', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'tom', '0.31674618364630946', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'dean', '0.4491378834800146', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', '0.6742764131652571', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'lucy', '0.5286362221140248', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', '0.007890326473113496', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'alice', '0.8046560540950831', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.7198364371127147', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'tom', '0.7400546712169153', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', '0.16859870460868698', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', '0.8462852684569557', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', '0.010211452005474353', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'alice', '0.8617802368201087', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', '0.21667479046797633', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', '0.8667689615468714', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'jack', '0.16140709875863557', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.16713368182304666', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'lucy', '0.8957484629768053', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'tom', '0.457835758220534', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', '0.9435170960198477', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', '0.9699253608913104', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', '0.2309897429566834', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'lucy', '0.7879705066452681', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', '0.20795869239817255', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', '0.4110352469382019', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'jack', '0.4979592772533561', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', '0.18810865430947044', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'tom', '0.5001240246982048', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'jack', '0.08341934160029707', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', '0.04812784841651041', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', '0.4655982693269717', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', '0.8539357978460663', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'john', '0.9649541785823592', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', '0.8243635648047365', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', '0.929949719929735', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'john', '0.055983276861168996', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', '0.07845430274829746', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', '0.28257674222099116', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.1578419214960578', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', '0.7853118484860825', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'lucy', '0.20790127125904156', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', '0.8650538395535204', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.902116091225815', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'lucy', '0.48542770770171373', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', '0.16725337150113984', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'lucy', '0.3157444453259486', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', '0.565727220131555', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'jack', '0.2531688065358064', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', '0.9191434620980499', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', '0.9224628853942058', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'jack', '0.3256288410730337', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', '0.9709152566761661', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.9794173893522709', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'alice', '0.16582064407977237', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'alice', '0.2652519246960059', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'alice', '0.04092489871261762', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', '0.3020444893927522', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'john', '0.4655412764350543', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'dean', '0.9226436424888846', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', '0.4707663393012884', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', '0.3277970119243966', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', '0.4730675479071551', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'jack', '0.10261940477901954', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'alice', '0.4148892373198616', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.2877219827348403', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'tom', '0.16212409974675845', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.9567425121214822', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'lucy', '0.19795350030679149', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', '0.6954199597749198', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'alice', '0.32884293488801164', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'john', '0.4789917995407148', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'lucy', '0.0698927593996298', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', '0.3352267723792438', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'tom', '0.8085116661598726', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', '0.17515060210353794', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.6006963088370202', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', '0.8794167536704468', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.04091469320757368', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'tom', '0.6709116812690366', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', '0.4850646101328463', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', '0.547488212623346', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', '0.6301717145008927', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', '0.06123370093612068', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', '0.2545600223228257', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', '0.28355287519210803', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.3231348374147818', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.4585172495754063', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', '0.7893945285152268', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', '0.6810596014794181', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', '0.7136031244915907', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'jack', '0.259734039051829', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', '0.7759518703827996', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'john', '0.06288891046833589', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'dean', '0.8242980461154241', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'tom', '0.36590300307021595', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', '0.20254092528445444', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', '0.5427356081880325', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.1467846603517391', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.8975527268892767', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'dean', '0.3483541520806722', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', '0.6922544855316723', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.3690185253006011', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'tom', '0.7564541265683148', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', '0.3634152133342695', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'tom', '0.33740378933701987', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'lucy', '0.7942640738315301', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', '0.7894896778233523', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', '0.7153281477198108', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'tom', '0.5546359859065261', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', '0.7727157385809087', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.8707097754747494', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', '0.3873936520764878', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', '0.7590305068820566', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.512826935863365', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'john', '0.19120284727846926', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', '0.5382693105670825', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', '0.826241649014955', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'lucy', '0.6133080470571559', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', '0.6452862617544055', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'lucy', '0.3025772179023586', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', '4.709864550322962E-4', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', '0.024816355013726588', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'alice', '0.8407500495605565', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'alice', '0.8420879584266481', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', '0.2719224735814776', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', '0.8939712577294938', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'dean', '0.8086189323362379', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', '0.6063415085381448', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', '0.39783242658234674', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'tom', '0.6085577206028068', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'tom', '0.5154289424127074', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', '0.878436600887031', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', '0.5577906295015223', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'lucy', '0.1143260282925247', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'jack', '0.312756557275364', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', '0.05548807854726956', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'tom', '0.12140791431139175', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.23897628700410234', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', '0.22223137342481392', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', '0.12379891645900953', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'john', '0.33729146112854247', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.8816768640060831', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'jack', '0.6301700633426532', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'alice', '0.4566295223861714', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'john', '0.1777378523933678', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', '0.8163769471165477', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', '0.4380805149704541', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'alice', '0.2987018822475964', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.6726495645391617', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', '0.8394327461109705', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'dean', '0.820512945501936', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.1580105370757261', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', '0.9961450897279505', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', '0.6574891890500061', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.5201205570085158', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'alice', '0.2445069633928285', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'john', '0.3155229654901067', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', '0.3665971881269575', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', '0.5544977915912215', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'tom', '0.15978771803015113', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', '0.038128748344929186', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'tom', '0.49026304025118594', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.5166802080526571', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', '0.22568230066042194', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', '0.9888634109849955', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'jack', '0.21022365182102054', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'john', '0.47052993358031114', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.25686122383263454', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.18929054223320718', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', '0.7925339862375451', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'john', '0.12613308249498645', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.7381524971311578', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', '0.08639585437319919', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', '0.9519897106846164', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', '0.33446548574801926', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', '0.40667134603483324', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', '0.17100718420628735', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'lucy', '0.4445585525686886', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'tom', '0.47372916928883013', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', '0.19826861093848824', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', '0.13679268112019338', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'tom', '0.9805515708224516', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'dean', '0.4738376165601095', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'dean', '0.5739441073158964', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'alice', '0.8428505498030564', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', '0.32655416551155336', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.7055736367780644', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', '0.9621355090189875', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', '0.9665339161730553', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', '0.44309781869697995', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', '0.8651220802537761', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', '0.6451892308277741', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.056797307451316725', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'lucy', '0.6847604118085596', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.13428051757364667', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', '0.9814797176951834', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'tom', '0.7386074051153445', 'p3'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', '0.4825297824657663', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', '0.06608870508231235', 'p5'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'lucy', '0.6278253028988848', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'alice', '0.6705580511822682', 'p1'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', '0.8131712486302015', 'p2'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'lucy', '0.8124302447925607', 'p4'); -INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) -VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'lucy', '0.039935860913407284', 'p2'); + + +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.7636857512911863', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'dean', '0.17663327393462436', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', '0.38943688941552057', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', '0.2715819955225307', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', '0.9358210273119568', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', '0.9364586435510802', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.9707723036513162', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', '0.8497763866782723', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', '0.15504417761372413', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.9507563118298399', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', '0.9746364180572994', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', '0.12869214941133378', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'lucy', '0.3024970533288409', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'tom', '0.6639702099980812', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'lucy', '0.4929901454858626', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', '0.06853040276026445', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.8488086078299616', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'lucy', '0.8589111177125592', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', '0.5576357066482228', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', '0.8047888670006846', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'john', '0.766944548494366', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', '0.5280072184505449', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', '0.9693343356046343', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', '0.12805203958456424', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'dean', '0.16963603387027637', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', '0.5901202956521101', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', '0.12710364646712236', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', '0.6346530909156196', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', '0.12461289103639872', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'john', '0.9863947334662437', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', '0.48899961064192987', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'alice', '0.5382796792688207', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'dean', '0.3506568687014143', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', '0.8633072449771709', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', '0.13999135315363687', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', '0.07258740493845894', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'jack', '0.5244413940436958', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', '0.13258670732966138', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'john', '0.6015982054464575', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'lucy', '0.05513158944480323', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'alice', '0.6707121735296985', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'jack', '0.9330440339006469', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'dean', '0.5630674323371607', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'dean', '0.8720647566229917', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.8331899070546519', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'alice', '0.6712876436249856', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', '0.6694409980332703', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'john', '0.3703307480606334', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'dean', '0.775368688472696', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'lucy', '0.9151205443267096', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', '0.09543108823305857', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'dean', '0.7893992120771057', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', '0.5119923080070498', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'lucy', '0.49906724167974936', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', '0.046258282700961884', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'dean', '0.44843595680103954', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', '0.7743935471689718', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.5855299615656824', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'lucy', '0.9412963512379853', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', '0.8383247587082538', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'lucy', '0.14517876867236124', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', '0.9327229861441061', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.19042326582894153', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', '0.6029067818254513', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', '0.21715964747214422', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'lucy', '0.34259842721045974', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', '0.7064419016593382', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'lucy', '0.5725636566517865', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'john', '0.22332539583809208', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', '0.8049036189055911', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'alice', '0.6029674758974956', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', '0.11884976360561716', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'alice', '0.7124916829130662', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', '0.5893693718556829', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', '0.602073304496253', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'tom', '0.10491061160039927', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'dean', '0.9006548872378379', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', '0.8545144244288455', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'jack', '0.16915384987875726', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', '0.2271640700690446', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', '0.7807518577160636', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'john', '0.8919859648888653', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', '0.1564450687270359', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', '0.5840549187653847', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'tom', '0.2213255596777869', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', '0.07868261880306426', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', '0.07710010861455818', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', '0.5131249730162654', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.5035035055368601', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.8996978291173905', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', '0.057442290722216294', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', '0.6443079066865616', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'lucy', '0.7398098480748726', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'dean', '0.9835694815034591', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'john', '0.9879213445635557', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', '0.4020136688147111', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'lucy', '0.6698797170128024', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.17325132416789113', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'lucy', '0.5784229486763606', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'tom', '0.9185978183932058', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', '0.5474783153973963', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', '0.9730731954700215', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', '0.5390873359288765', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'alice', '0.20522241320887713', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'alice', '0.4088233242325021', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', '0.7608047695853417', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.2749731221085713', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'john', '0.06154055374702494', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.460668002022406', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', '0.4474746325306228', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', '0.5761666885467472', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'dean', '0.33233441360339655', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', '0.7426534909874778', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'tom', '0.5841437875889118', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', '0.2818296500094526', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'tom', '0.8670888843915217', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'alice', '0.5249294365740248', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', '0.5483356748008438', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'dean', '0.7278566847412673', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.6779976902157362', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', '0.09995341651736978', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'jack', '0.4528538159233879', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', '0.5870756885301056', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'tom', '0.9842091927290255', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'tom', '0.04580936015706816', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'alice', '0.8814678270145769', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'john', '0.06517379256096412', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', '0.8769832364187129', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'dean', '0.584562279025023', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', '0.8102404090621375', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', '0.11481653429176686', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', '0.43422888918962554', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'lucy', '0.0684414272594508', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'alice', '0.976546463969412', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.617906858141431', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'jack', '0.08663740247579998', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', '0.7124944606691416', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'alice', '0.1321700521239627', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'jack', '0.3078946609431664', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', '0.6149442855237194', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'alice', '0.5963801306980994', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'lucy', '0.6999542038973406', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'john', '0.4599112653446624', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', '0.20300901401048832', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'john', '0.39989705958717037', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', '0.2486378364940327', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', '0.16880398079144077', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', '0.73927288385526', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', '0.8645283506689198', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', '0.3266940826759587', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', '0.9195490073037541', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', '0.9452523036658287', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', '0.21269683438120535', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.7377502855387184', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', '0.38981597634408716', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.7001799391999863', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', '0.6616720024008785', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'dean', '0.497721735058096', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'jack', '0.22255613760959603', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', '0.05247640233319417', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'dean', '0.27237572107833363', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'alice', '0.9529452406380252', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'alice', '0.28243045060463157', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'lucy', '0.17880444250082506', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', '0.035050038002381156', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', '0.840803223728221', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.5318457377361356', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.9280332892460665', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'lucy', '0.752354382202208', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'dean', '0.1866528331789219', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'alice', '0.7016165545791373', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', '0.4191547989960899', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', '0.7025516699007639', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'john', '0.6160127317884274', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'alice', '0.91223094958137', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'tom', '0.4383056089013998', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'jack', '0.595750781166582', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'lucy', '0.9472349338730268', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'jack', '0.0519104588842193', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', '0.48043983034526205', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'lucy', '0.14754707786497478', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'alice', '0.36124288370035695', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'dean', '0.21777919493494613', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', '0.22637666702475057', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', '0.9378215576942598', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', '0.3309229261144562', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'alice', '0.7602880453727515', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'alice', '0.9470462487873785', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.6770215935547629', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', '0.1586074803669385', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'lucy', '0.2754855564794071', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', '0.8355347738454384', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'alice', '0.7251813505573811', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'jack', '0.006606625589642534', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', '0.304832277753024', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.026368662837989554', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'tom', '0.6855977520602776', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'tom', '0.8193746826441749', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.021179295102459972', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', '0.1533849522536005', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', '0.18893553542301778', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.39870999343833624', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'john', '0.9985665103520182', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', '0.6961441157700171', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.9861933923851885', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'tom', '0.993076500099477', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', '0.4320547269058953', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', '0.18441071030375877', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', '0.1501504986117118', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', '0.252021845734527', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'lucy', '0.24442701577183745', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.07563738855797564', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', '0.34247820646440985', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.9456979276862031', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', '0.19494357263973816', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', '0.9371493867882469', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', '0.6136241316589367', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'alice', '0.8922330760877784', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'dean', '0.9001986074661864', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'tom', '0.4889702884422866', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', '0.2689551234431401', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', '0.5223573993758465', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'tom', '0.05042295556527243', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', '0.2717147121880483', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', '0.7397093309370814', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'dean', '0.157064341631733', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'lucy', '0.7213399784998017', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'tom', '0.764081440588005', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.7514070600074144', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', '0.611647412825278', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'tom', '0.6600796877195596', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'john', '0.8942204153751679', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.07398121085929721', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'dean', '0.1652506990439564', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.5849759516111703', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', '0.1672502732600889', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'tom', '0.7836135556233219', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'dean', '0.26181269644936356', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'alice', '0.6577275876355586', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'tom', '0.3067293364197956', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', '0.8608288543866495', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', '0.814283434116926', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'jack', '0.33993584425872936', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'john', '0.010812798859160089', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.5156558224263926', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'jack', '0.46320035330198406', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', '0.2651020283994786', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.42467241545664147', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', '0.3695905136678498', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'tom', '0.15269122123348644', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', '0.6755688670583248', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'jack', '0.39064306179528907', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'john', '0.36479296691952023', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'lucy', '0.5069249157662691', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', '0.4785315495532231', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', '0.7582526218052175', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.42064109605717914', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'dean', '0.5587757581237022', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'lucy', '0.3561686564964428', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.7101688305173135', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'dean', '0.6518061375522985', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.7564485884156583', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', '0.36531347293134464', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'jack', '0.5201689359070235', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'john', '0.7138792929290383', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'tom', '0.9751003716333827', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', '0.5281906318027629', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', '0.6291356541485003', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'jack', '0.1938712974807698', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'john', '0.6267850210775459', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', '0.4469970592043767', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', '0.7690659124175409', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'jack', '0.13335067838090386', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'jack', '0.2966621725922035', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'john', '0.5740481445089863', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'alice', '0.838028890036331', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', '0.8094354537628714', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'alice', '0.5552924586108698', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', '0.49150373927678315', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', '0.7264346889377966', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'alice', '0.9292830287297702', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.3905616258240767', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.15912349648571666', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'alice', '0.6030082006630102', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'lucy', '0.8712354035243679', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.7685306377211826', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', '0.2869913942171415', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', '0.7142615166855639', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', '0.5625978475154423', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', '0.13611601734791123', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'alice', '0.6977333962685311', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'jack', '0.35140477709778295', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', '0.8805119222967716', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.7014124236538637', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'alice', '0.12759538003439375', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', '0.7515403792213445', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'lucy', '0.03700239289885987', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'tom', '0.31674618364630946', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'dean', '0.4491378834800146', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', '0.6742764131652571', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'lucy', '0.5286362221140248', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', '0.007890326473113496', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'alice', '0.8046560540950831', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.7198364371127147', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'tom', '0.7400546712169153', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', '0.16859870460868698', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', '0.8462852684569557', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', '0.010211452005474353', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'alice', '0.8617802368201087', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', '0.21667479046797633', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', '0.8667689615468714', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'jack', '0.16140709875863557', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.16713368182304666', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'lucy', '0.8957484629768053', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'tom', '0.457835758220534', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', '0.9435170960198477', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'jack', '0.9699253608913104', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', '0.2309897429566834', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'lucy', '0.7879705066452681', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', '0.20795869239817255', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', '0.4110352469382019', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'jack', '0.4979592772533561', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', '0.18810865430947044', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'tom', '0.5001240246982048', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'jack', '0.08341934160029707', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', '0.04812784841651041', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', '0.4655982693269717', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'dean', '0.8539357978460663', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'john', '0.9649541785823592', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', '0.8243635648047365', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', '0.929949719929735', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'john', '0.055983276861168996', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'tom', '0.07845430274829746', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'alice', '0.28257674222099116', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.1578419214960578', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', '0.7853118484860825', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'lucy', '0.20790127125904156', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', '0.8650538395535204', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.902116091225815', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'lucy', '0.48542770770171373', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', '0.16725337150113984', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'lucy', '0.3157444453259486', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', '0.565727220131555', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'jack', '0.2531688065358064', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', '0.9191434620980499', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', '0.9224628853942058', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'jack', '0.3256288410730337', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'jack', '0.9709152566761661', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.9794173893522709', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'alice', '0.16582064407977237', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'alice', '0.2652519246960059', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'alice', '0.04092489871261762', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', '0.3020444893927522', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'john', '0.4655412764350543', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'dean', '0.9226436424888846', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', '0.4707663393012884', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', '0.3277970119243966', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'tom', '0.4730675479071551', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'jack', '0.10261940477901954', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'alice', '0.4148892373198616', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.2877219827348403', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'tom', '0.16212409974675845', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.9567425121214822', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'lucy', '0.19795350030679149', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', '0.6954199597749198', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'alice', '0.32884293488801164', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'john', '0.4789917995407148', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'lucy', '0.0698927593996298', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', '0.3352267723792438', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'tom', '0.8085116661598726', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', '0.17515060210353794', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.6006963088370202', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', '0.8794167536704468', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.04091469320757368', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'tom', '0.6709116812690366', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', '0.4850646101328463', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'tom', '0.547488212623346', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'dean', '0.6301717145008927', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'lucy', '0.06123370093612068', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'alice', '0.2545600223228257', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'john', '0.28355287519210803', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.3231348374147818', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.4585172495754063', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', '0.7893945285152268', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'john', '0.6810596014794181', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'john', '0.7136031244915907', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'jack', '0.259734039051829', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', '0.7759518703827996', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'john', '0.06288891046833589', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'dean', '0.8242980461154241', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'tom', '0.36590300307021595', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'lucy', '0.20254092528445444', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', '0.5427356081880325', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.1467846603517391', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.8975527268892767', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'dean', '0.3483541520806722', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', '0.6922544855316723', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.3690185253006011', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'tom', '0.7564541265683148', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', '0.3634152133342695', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'tom', '0.33740378933701987', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'lucy', '0.7942640738315301', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', '0.7894896778233523', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'jack', '0.7153281477198108', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'tom', '0.5546359859065261', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'john', '0.7727157385809087', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'dean', '0.8707097754747494', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'john', '0.3873936520764878', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', '0.7590305068820566', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'john', '0.512826935863365', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'john', '0.19120284727846926', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'dean', '0.5382693105670825', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'john', '0.826241649014955', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'lucy', '0.6133080470571559', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'jack', '0.6452862617544055', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'lucy', '0.3025772179023586', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', '4.709864550322962E-4', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', '0.024816355013726588', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -6, CURRENT_DATE()), 'alice', '0.8407500495605565', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'alice', '0.8420879584266481', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'lucy', '0.2719224735814776', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'tom', '0.8939712577294938', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'dean', '0.8086189323362379', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'tom', '0.6063415085381448', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'tom', '0.39783242658234674', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'tom', '0.6085577206028068', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'tom', '0.5154289424127074', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'john', '0.878436600887031', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', '0.5577906295015223', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'lucy', '0.1143260282925247', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'jack', '0.312756557275364', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', '0.05548807854726956', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'tom', '0.12140791431139175', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.23897628700410234', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', '0.22223137342481392', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', '0.12379891645900953', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'john', '0.33729146112854247', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.8816768640060831', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -21, CURRENT_DATE()), 'jack', '0.6301700633426532', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -3, CURRENT_DATE()), 'alice', '0.4566295223861714', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'john', '0.1777378523933678', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', '0.8163769471165477', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'tom', '0.4380805149704541', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'alice', '0.2987018822475964', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'dean', '0.6726495645391617', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', '0.8394327461109705', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'dean', '0.820512945501936', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'tom', '0.1580105370757261', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -20, CURRENT_DATE()), 'jack', '0.9961450897279505', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -7, CURRENT_DATE()), 'john', '0.6574891890500061', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'john', '0.5201205570085158', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'alice', '0.2445069633928285', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -17, CURRENT_DATE()), 'john', '0.3155229654901067', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'jack', '0.3665971881269575', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'john', '0.5544977915912215', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'tom', '0.15978771803015113', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'lucy', '0.038128748344929186', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'tom', '0.49026304025118594', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.5166802080526571', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', '0.22568230066042194', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -28, CURRENT_DATE()), 'john', '0.9888634109849955', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'jack', '0.21022365182102054', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'john', '0.47052993358031114', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.25686122383263454', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.18929054223320718', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'jack', '0.7925339862375451', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -12, CURRENT_DATE()), 'john', '0.12613308249498645', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.7381524971311578', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), 'alice', '0.08639585437319919', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -27, CURRENT_DATE()), 'tom', '0.9519897106846164', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', '0.33446548574801926', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'jack', '0.40667134603483324', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -10, CURRENT_DATE()), 'jack', '0.17100718420628735', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -26, CURRENT_DATE()), 'lucy', '0.4445585525686886', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'tom', '0.47372916928883013', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'john', '0.19826861093848824', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -13, CURRENT_DATE()), 'john', '0.13679268112019338', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -24, CURRENT_DATE()), 'tom', '0.9805515708224516', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'dean', '0.4738376165601095', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'dean', '0.5739441073158964', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'alice', '0.8428505498030564', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'lucy', '0.32655416551155336', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -14, CURRENT_DATE()), 'tom', '0.7055736367780644', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -2, CURRENT_DATE()), 'tom', '0.9621355090189875', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -9, CURRENT_DATE()), 'jack', '0.9665339161730553', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'dean', '0.44309781869697995', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -18, CURRENT_DATE()), 'tom', '0.8651220802537761', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', '0.6451892308277741', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -16, CURRENT_DATE()), 'dean', '0.056797307451316725', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'lucy', '0.6847604118085596', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -23, CURRENT_DATE()), 'jack', '0.13428051757364667', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -29, CURRENT_DATE()), 'lucy', '0.9814797176951834', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -11, CURRENT_DATE()), 'tom', '0.7386074051153445', 'p3'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -25, CURRENT_DATE()), 'alice', '0.4825297824657663', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', '0.06608870508231235', 'p5'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -22, CURRENT_DATE()), 'lucy', '0.6278253028988848', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), 'alice', '0.6705580511822682', 'p1'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -19, CURRENT_DATE()), 'alice', '0.8131712486302015', 'p2'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -15, CURRENT_DATE()), 'lucy', '0.8124302447925607', 'p4'); +INSERT INTO s2_stay_time_statis (imp_date, user_name, stay_hours, page) VALUES (DATEADD('DAY', -8, CURRENT_DATE()), 'lucy', '0.039935860913407284', 'p2'); diff --git a/launchers/standalone/src/main/resources/db/schema-h2.sql b/launchers/standalone/src/main/resources/db/schema-h2.sql index 9fa1ec519..e0e6bc25d 100644 --- a/launchers/standalone/src/main/resources/db/schema-h2.sql +++ b/launchers/standalone/src/main/resources/db/schema-h2.sql @@ -1,652 +1,343 @@ -- 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 + `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` -) + `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, - `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` -) - ); + `chat_id` BIGINT auto_increment ,-- AUTO_INCREMENT, + `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 `s2_chat_query` ( - `question_id` BIGINT NOT NULL AUTO_INCREMENT, - `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_response` mediumtext NOT NULL, - `score` int DEFAULT '0', - `feedback` varchar(1024) DEFAULT '', + `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 '', PRIMARY KEY (`question_id`) ); +CREATE TABLE `s2_chat_parse` +( + `question_id` BIGINT NOT NULL, + `chat_id` BIGINT 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_config` +CREATE TABLE `s2_chat_statistics` ( - `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 - PRIMARY KEY -( - `id` -) - ); -COMMENT -ON TABLE s2_chat_config IS 'chat config information table '; + `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 + PRIMARY KEY (`id`) + ) ; +COMMENT ON TABLE s2_chat_config IS 'chat config information table '; create table s2_user ( - id INT AUTO_INCREMENT, - name varchar(100) not null, + id INT AUTO_INCREMENT, + name varchar(100) not null, display_name varchar(100) null, - password varchar(100) null, - email varchar(100) null, + password varchar(100) null, + email varchar(100) null, PRIMARY KEY (`id`) ); -COMMENT -ON TABLE s2_user IS 'user information table'; +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 - `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 - PRIMARY KEY -( - `id` -) - ); -COMMENT -ON TABLE s2_model IS 'model information'; - - -CREATE TABLE `s2_database` -( - `id` INT NOT NULL AUTO_INCREMENT, - `domain_id` INT NOT NULL, - `name` varchar(255) NOT NULL, - `description` varchar(500) DEFAULT NULL, - `version` varchar(64) DEFAULT NULL, - `type` varchar(20) NOT NULL, -- type: mysql,clickhouse,tdw - `config` varchar(655) NOT NULL, - `created_at` TIMESTAMP NOT NULL, - `created_by` varchar(100) NOT NULL, - `updated_at` TIMESTAMP NOT NULL, - `updated_by` varchar(100) NOT NULL, +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_database IS 'database instance table'; - -CREATE TABLE IF NOT EXISTS `s2_datasource` -( - `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 , - `database_id` INT NOT NULL , - `datasource_detail` LONGVARCHAR NOT NULL , - `created_at` TIMESTAMP NOT NULL , - `created_by` varchar -( - 100 -) NOT NULL , - `updated_at` TIMESTAMP NOT NULL , - `updated_by` varchar -( - 100 -) NOT NULL, - PRIMARY KEY -( - `id` -) ); -COMMENT -ON TABLE s2_datasource IS 'datasource table'; +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 + `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 + PRIMARY KEY (`id`) + ); +COMMENT ON TABLE s2_model IS 'model information'; + + +CREATE TABLE `s2_database` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain_id` INT NOT NULL , + `name` varchar(255) NOT NULL , + `description` varchar(500) DEFAULT NULL , + `version` varchar(64) DEFAULT NULL , + `type` varchar(20) NOT NULL , -- type: mysql,clickhouse,tdw + `config` varchar(655) NOT NULL , + `created_at` TIMESTAMP NOT NULL , + `created_by` varchar(100) NOT NULL , + `updated_at` TIMESTAMP NOT NULL , + `updated_by` varchar(100) NOT NULL, + PRIMARY KEY (`id`) +); +COMMENT ON TABLE s2_database IS 'database instance table'; + +CREATE TABLE IF NOT EXISTS `s2_datasource` ( + `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 , + `database_id` INT NOT NULL , + `datasource_detail` LONGVARCHAR NOT NULL , + `created_at` TIMESTAMP NOT NULL , + `created_by` varchar(100) NOT NULL , + `updated_at` TIMESTAMP NOT NULL , + `updated_by` varchar(100) NOT NULL, + PRIMARY KEY (`id`) + ); +COMMENT ON TABLE s2_datasource IS 'datasource table'; create table s2_auth_groups ( group_id INT, - config varchar(2048), + 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 , -- status, 0 is normal, 1 is off the shelf, 2 is deleted +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 , -- status, 0 is normal, 1 is off the shelf, 2 is deleted `sensitive_level` INT NOT NULL , - `type` varchar -( - 50 -) NOT NULL , -- type proxy,expr - `type_params` LONGVARCHAR DEFAULT NULL , + `type` varchar(50) NOT NULL , -- type proxy,expr + `type_params` LONGVARCHAR DEFAULT NULL , `created_at` TIMESTAMP NOT NULL , - `created_by` varchar -( - 100 -) 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, - PRIMARY KEY -( - `id` -) + `updated_by` varchar(100) NOT NULL , + `data_format_type` varchar(50) DEFAULT NULL , + `data_format` varchar(500) DEFAULT NULL, + `alias` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) ); -COMMENT -ON TABLE s2_metric IS 'metric information table'; +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, - `datasource_id` - INT - NOT - NULL, - `name` - varchar -( - 255 -) NOT NULL , - `biz_name` varchar -( - 255 -) NOT NULL , - `description` varchar -( - 500 -) NOT NULL , +CREATE TABLE IF NOT EXISTS `s2_dimension` ( + `id` INT NOT NULL AUTO_INCREMENT , + `model_id` INT NOT NULL , + `datasource_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 normal, 1 is off the shelf, 2 is deleted `sensitive_level` INT DEFAULT NULL , - `type` varchar -( - 50 -) NOT NULL , -- type categorical,time - `type_params` LONGVARCHAR DEFAULT NULL , + `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, - PRIMARY KEY -( - `id` -) + `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, + PRIMARY KEY (`id`) ); -COMMENT -ON TABLE s2_dimension IS 'dimension information table'; +COMMENT ON TABLE s2_dimension IS 'dimension information table'; create table s2_datasource_rela ( id INT AUTO_INCREMENT, - model_id INT null, - datasource_from INT null, - datasource_to INT null, + model_id INT null, + datasource_from INT null, + datasource_to INT null, join_key varchar(100) null, - created_at TIMESTAMP null, + created_at TIMESTAMP null, created_by varchar(100) null, - updated_at TIMESTAMP null, + updated_at TIMESTAMP null, updated_by varchar(100) null, PRIMARY KEY (`id`) ); -COMMENT -ON TABLE s2_datasource_rela IS 'data source association table'; +COMMENT ON TABLE s2_datasource_rela IS 'data source association table'; create table s2_view_info ( id INT auto_increment, - model_id INT null, - type varchar(20) null comment 'datasource、dimension、metric', - config LONGVARCHAR null comment 'config detail', - created_at TIMESTAMP null, + model_id INT null, + type varchar(20) null comment 'datasource、dimension、metric', + config LONGVARCHAR null comment 'config detail', + created_at TIMESTAMP null, created_by varchar(100) null, - updated_at TIMESTAMP null, + updated_at TIMESTAMP null, updated_by varchar(100) not null ); -COMMENT -ON TABLE s2_view_info IS 'view information table'; +COMMENT ON TABLE s2_view_info IS 'view information table'; -CREATE TABLE `s2_query_stat_info` -( - `id` INT NOT NULL AUTO_INCREMENT, - `trace_id` varchar(200) DEFAULT NULL, -- query unique identifier - `model_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 - PRIMARY KEY (`id`) -); -COMMENT -ON TABLE s2_query_stat_info IS 'query statistics table'; +CREATE TABLE `s2_query_stat_info` ( + `id` INT NOT NULL AUTO_INCREMENT, + `trace_id` varchar(200) DEFAULT NULL, -- query unique identifier + `model_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 + 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 , +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 , + `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` -) + PRIMARY KEY (`id`) ); -COMMENT -ON TABLE s2_semantic_pasre_info IS 'semantic layer sql parsing information table'; +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` -) +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'; +COMMENT ON TABLE s2_dimension IS 'dimension information table'; CREATE TABLE IF NOT EXISTS `s2_plugin` ( - `id` - INT - AUTO_INCREMENT, - `type` - varchar -( - 50 -) NULL, - `model` 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'; + `id` INT AUTO_INCREMENT, + `type` varchar(50) NULL, + `model` 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 ( @@ -660,91 +351,44 @@ CREATE TABLE IF NOT EXISTS s2_agent created_at TIMESTAMP null, updated_by varchar(100) null, updated_at TIMESTAMP null, - enable_search int null, + enable_search int null, PRIMARY KEY (`id`) -); COMMENT ON TABLE s2_agent IS 'assistant information table'; +); 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 +CREATE TABLE IF NOT EXISTS `s2_user_department` ( + `user_name` varchar(200) NOT NULL, + `department` varchar(200) NOT NULL -- department of user ); -COMMENT -ON TABLE s2_user_department IS 'user_department_info'; +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 +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'; +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, +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 + `page` varchar(200) NOT NULL ); -COMMENT -ON TABLE s2_stay_time_statis IS 's2_stay_time_statis_info'; +COMMENT ON TABLE s2_stay_time_statis IS 's2_stay_time_statis_info'; -CREATE TABLE IF NOT EXISTS `singer` -( - `imp_date` varchar -( - 200 -) NOT NULL, - `singer_name` varchar -( - 200 -) NOT NULL, - `act_area` varchar -( - 200 -) NOT NULL, - `song_name` varchar -( - 200 -) NOT NULL, - `genre` varchar -( - 200 -) NOT NULL, +CREATE TABLE IF NOT EXISTS `singer` ( + `imp_date` varchar(200) NOT NULL, + `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 ); -COMMENT -ON TABLE singer IS 'singer_info'; +COMMENT ON TABLE singer IS 'singer_info'; diff --git a/launchers/standalone/src/main/resources/db/sql-update.sql b/launchers/standalone/src/main/resources/db/sql-update.sql index 096dd6692..bfaed7f1c 100644 --- a/launchers/standalone/src/main/resources/db/sql-update.sql +++ b/launchers/standalone/src/main/resources/db/sql-update.sql @@ -1,5 +1,4 @@ -alter table s2_domain - add column `entity` varchar(500) DEFAULT NULL COMMENT '主题域实体信息'; +alter table s2_domain add column `entity`varchar(500) DEFAULT NULL COMMENT '主题域实体信息'; --20230808 @@ -9,19 +8,19 @@ create table s2_model ( id bigint auto_increment primary key, - name varchar(100) null, + name varchar(100) null, biz_name varchar(100) null, - domain_id bigint null, + domain_id bigint null, viewer varchar(500) null, - view_org varchar(500) null, + view_org varchar(500) null, admin varchar(500) null, - admin_org varchar(500) null, - is_open int null, + admin_org varchar(500) null, + is_open int null, created_by varchar(100) null, - created_at datetime null, - updated_by varchar(100) null, - updated_at datetime null, - entity text null + created_at datetime null, + updated_by varchar(100) null, + updated_at datetime null, + entity text null ) collate = utf8_unicode_ci; alter table s2_datasource change column domain_id model_id bigint; @@ -31,8 +30,11 @@ alter table s2_datasource_rela change column domain_id model_id bigint; alter table s2_view_info change column domain_id model_id bigint; alter table s2_domain_extend change column domain_id model_id bigint; alter table s2_chat_config change column domain_id model_id bigint; -alter table s2_plugin change column domain model varchar (100); +alter table s2_plugin change column domain model varchar(100); alter table s2_query_stat_info change column domain_id model_id bigint; -update s2_plugin -set config = replace(config, 'domain', 'model'); \ No newline at end of file +update s2_plugin set config = replace(config, 'domain', 'model'); + +--20230823 +alter table s2_chat_query add column agent_id int after question_id; +alter table s2_chat_query change column query_response query_result mediumtext; diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/BaseQueryTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/BaseQueryTest.java index 7b8d5f49b..028500289 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/BaseQueryTest.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/BaseQueryTest.java @@ -51,6 +51,8 @@ public class BaseQueryTest { ParseResp parseResp = submitParse(queryText); ExecuteQueryReq request = new ExecuteQueryReq(); + request.setQueryId(parseResp.getQueryId()); + request.setParseId(parseResp.getSelectedParses().get(0).getId()); request.setChatId(parseResp.getChatId()); request.setQueryText(parseResp.getQueryText()); request.setUser(DataUtils.getUser()); @@ -63,6 +65,8 @@ public class BaseQueryTest { ParseResp parseResp = submitParse(queryText); ExecuteQueryReq request = new ExecuteQueryReq(); + request.setQueryId(parseResp.getQueryId()); + request.setParseId(parseResp.getSelectedParses().get(0).getId()); request.setChatId(parseResp.getChatId()); request.setQueryText(parseResp.getQueryText()); request.setUser(DataUtils.getUser()); diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/EntityQueryTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/EntityQueryTest.java index abf7fd7fd..50c39e51e 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/EntityQueryTest.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/EntityQueryTest.java @@ -18,7 +18,7 @@ import org.junit.Test; public class EntityQueryTest extends BaseQueryTest { @Test - public void queryTest_METRIC_ENTITY_QUERY() throws Exception { + public void queryTest_metric_entity_query() throws Exception { QueryResult actualResult = submitNewChat("艺人周杰伦的播放量"); QueryResult expectedResult = new QueryResult(); @@ -41,7 +41,7 @@ public class EntityQueryTest extends BaseQueryTest { } @Test - public void queryTest_ENTITY_LIST_FILTER() throws Exception { + public void queryTest_entity_list_filter() throws Exception { QueryResult actualResult = submitNewChat("爱情、流行类型的艺人"); QueryResult expectedResult = new QueryResult(); diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MetricInterpretTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MetricInterpretTest.java index a1da76abd..8645896be 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MetricInterpretTest.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MetricInterpretTest.java @@ -4,9 +4,9 @@ import com.alibaba.fastjson.JSONObject; import com.tencent.supersonic.StandaloneLauncher; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; -import com.tencent.supersonic.chat.parser.embedding.EmbeddingConfig; +import com.tencent.supersonic.chat.parser.plugin.embedding.EmbeddingConfig; import com.tencent.supersonic.chat.plugin.PluginManager; -import com.tencent.supersonic.chat.query.metricInterpret.LLmAnswerResp; +import com.tencent.supersonic.chat.query.metricinterpret.LLmAnswerResp; import com.tencent.supersonic.chat.service.AgentService; import com.tencent.supersonic.chat.service.QueryService; import com.tencent.supersonic.util.DataUtils; @@ -44,13 +44,13 @@ public class MetricInterpretTest { MockConfiguration.mockAgent(agentService); MockConfiguration.mockEmbeddingUrl(embeddingConfig); LLmAnswerResp lLmAnswerResp = new LLmAnswerResp(); - lLmAnswerResp.setAssistant_message("alice最近在超音数的访问情况有增多"); + lLmAnswerResp.setAssistantMessage("alice最近在超音数的访问情况有增多"); MockConfiguration.mockPluginManagerDoRequest(pluginManager, "answer_with_plugin_call", ResponseEntity.ok(JSONObject.toJSONString(lLmAnswerResp))); QueryReq queryReq = DataUtils.getQueryReqWithAgent(1000, "能不能帮我解读分析下最近alice在超音数的访问情况", DataUtils.getAgent().getId()); QueryResult queryResult = queryService.executeQuery(queryReq); - Assert.assertEquals(queryResult.getQueryResults().get(0).get("answer"), lLmAnswerResp.getAssistant_message()); + Assert.assertEquals(queryResult.getQueryResults().get(0).get("answer"), lLmAnswerResp.getAssistantMessage()); } } diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MetricQueryTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MetricQueryTest.java index f34309d93..4a980967d 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MetricQueryTest.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MetricQueryTest.java @@ -21,16 +21,18 @@ import org.springframework.beans.BeanUtils; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; import java.util.stream.Collectors; - -import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.*; +import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.SUM; +import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.NONE; public class MetricQueryTest extends BaseQueryTest { @Test - public void queryTest_METRIC_FILTER() throws Exception { + public void queryTest_metric_filter() throws Exception { QueryResult actualResult = submitNewChat("alice的访问次数"); QueryResult expectedResult = new QueryResult(); @@ -52,7 +54,7 @@ public class MetricQueryTest extends BaseQueryTest { } @Test - public void queryTest_METRIC_FILTER_with_agent() { + public void queryTest_metric_filter_with_agent() { //agent only support METRIC_ENTITY, METRIC_FILTER MockConfiguration.mockAgent(agentService); ParseResp parseResp = submitParseWithAgent("alice的访问次数", DataUtils.getAgent().getId()); @@ -63,7 +65,7 @@ public class MetricQueryTest extends BaseQueryTest { } @Test - public void queryTest_METRIC_DOMAIN() throws Exception { + public void queryTest_metric_domain() throws Exception { QueryResult actualResult = submitNewChat("超音数的访问次数"); QueryResult expectedResult = new QueryResult(); @@ -82,7 +84,7 @@ public class MetricQueryTest extends BaseQueryTest { } @Test - public void queryTest_METRIC_MODEL_with_agent() { + public void queryTest_metric_model_with_agent() { //agent only support METRIC_ENTITY, METRIC_FILTER MockConfiguration.mockAgent(agentService); ParseResp parseResp = submitParseWithAgent("超音数的访问次数", DataUtils.getAgent().getId()); @@ -92,7 +94,7 @@ public class MetricQueryTest extends BaseQueryTest { } @Test - public void queryTest_METRIC_GROUPBY() throws Exception { + public void queryTest_metric_groupby() throws Exception { QueryResult actualResult = submitNewChat("超音数各部门的访问次数"); QueryResult expectedResult = new QueryResult(); @@ -112,7 +114,7 @@ public class MetricQueryTest extends BaseQueryTest { } @Test - public void queryTest_METRIC_FILTER_COMPARE() throws Exception { + public void queryTest_metric_filter_compare() throws Exception { QueryResult actualResult = submitNewChat("对比alice和lucy的访问次数"); QueryResult expectedResult = new QueryResult(); @@ -137,7 +139,7 @@ public class MetricQueryTest extends BaseQueryTest { } @Test - public void queryTest_METRIC_TOPN() throws Exception { + public void queryTest_metric_topn() throws Exception { QueryResult actualResult = submitNewChat("近3天访问次数最多的用户"); QueryResult expectedResult = new QueryResult(); @@ -157,7 +159,7 @@ public class MetricQueryTest extends BaseQueryTest { } @Test - public void queryTest_METRIC_GROUPBY_SUM() throws Exception { + public void queryTest_metric_groupby_sum() throws Exception { QueryResult actualResult = submitNewChat("超音数各部门的访问次数总和"); QueryResult expectedResult = new QueryResult(); SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); @@ -176,7 +178,7 @@ public class MetricQueryTest extends BaseQueryTest { } @Test - public void queryTest_METRIC_FILTER_TIME() throws Exception { + public void queryTest_metric_filter_time() throws Exception { DateFormat format = new SimpleDateFormat("yyyy-mm-dd"); DateFormat textFormat = new SimpleDateFormat("yyyy年mm月dd日"); String dateStr = textFormat.format(format.parse(startDay)); @@ -202,7 +204,7 @@ public class MetricQueryTest extends BaseQueryTest { } @Test - public void queryTest_CONFIG_VISIBILITY() throws Exception { + public void queryTest_config_visibility() throws Exception { // 1. round_1 use blacklist ChatConfigResp chatConfig = configService.fetchConfigByModelId(1L); ChatConfigEditReqReq extendEditCmd = new ChatConfigEditReqReq(); diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MockConfiguration.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MockConfiguration.java index fb95fe332..79ba8b6d8 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MockConfiguration.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MockConfiguration.java @@ -2,9 +2,9 @@ package com.tencent.supersonic.integration; import com.google.common.collect.Lists; -import com.tencent.supersonic.chat.parser.embedding.EmbeddingConfig; -import com.tencent.supersonic.chat.parser.embedding.EmbeddingResp; -import com.tencent.supersonic.chat.parser.embedding.RecallRetrieval; +import com.tencent.supersonic.chat.parser.plugin.embedding.EmbeddingConfig; +import com.tencent.supersonic.chat.parser.plugin.embedding.EmbeddingResp; +import com.tencent.supersonic.chat.parser.plugin.embedding.RecallRetrieval; import com.tencent.supersonic.chat.plugin.PluginManager; import com.tencent.supersonic.chat.service.AgentService; import com.tencent.supersonic.util.DataUtils; @@ -34,7 +34,8 @@ public class MockConfiguration { when(embeddingConfig.getUrl()).thenReturn("test"); } - public static void mockPluginManagerDoRequest(PluginManager pluginManager, String path, ResponseEntity responseEntity) { + public static void mockPluginManagerDoRequest(PluginManager pluginManager, String path, + ResponseEntity responseEntity) { when(pluginManager.doRequest(eq(path), notNull(String.class))).thenReturn(responseEntity); } diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/llm/LLMDslParserTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/llm/LLMDslParserTest.java new file mode 100644 index 000000000..8d77ac2c6 --- /dev/null +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/llm/LLMDslParserTest.java @@ -0,0 +1,43 @@ +package com.tencent.supersonic.integration.llm; + +import static org.mockito.Mockito.when; + +import com.tencent.supersonic.chat.api.component.SemanticParser; +import com.tencent.supersonic.chat.api.pojo.ChatContext; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import com.tencent.supersonic.chat.config.LLMConfig; +import com.tencent.supersonic.chat.parser.llm.dsl.LLMDslParser; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.integration.BaseQueryTest; +import com.tencent.supersonic.util.DataUtils; +import org.junit.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +public class LLMDslParserTest extends BaseQueryTest { + + @MockBean + protected LLMConfig llmConfig; + + @Test + public void parse() throws Exception { + String queryText = "周杰伦专辑十一月的萧邦有哪些歌曲"; + QueryReq queryReq = DataUtils.getQueryContextReq(10, queryText); + QueryContext queryContext = new QueryContext(); + queryContext.setRequest(queryReq); + SemanticParser dslParser = ComponentFactory.getSemanticParsers().stream().filter(parser -> { + if (parser instanceof LLMDslParser) { + return true; + } else { + return false; + } + } + ).findFirst().get(); + + when(llmConfig.getUrl()).thenReturn("llmUrl"); + + ChatContext chatCtx = new ChatContext(); + dslParser.parse(queryContext, chatCtx); + } + +} diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/mapper/MapperTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/mapper/MapperTest.java new file mode 100644 index 000000000..b0aeefc35 --- /dev/null +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/mapper/MapperTest.java @@ -0,0 +1,46 @@ +package com.tencent.supersonic.integration.mapper; + +import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.NONE; + +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.query.rule.metric.MetricEntityQuery; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.integration.BaseQueryTest; +import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.util.DataUtils; +import org.junit.Test; + +public class MapperTest extends BaseQueryTest { + + @Test + public void hanlp() throws Exception { + + QueryReq queryContextReq = DataUtils.getQueryContextReq(10, "艺人周杰伦的播放量"); + queryContextReq.setAgentId(1); + + QueryResult actualResult = submitNewChat("艺人周杰伦的播放量"); + + QueryResult expectedResult = new QueryResult(); + SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); + expectedResult.setChatContext(expectedParseInfo); + + expectedResult.setQueryMode(MetricEntityQuery.QUERY_MODE); + expectedParseInfo.setAggType(NONE); + + QueryFilter dimensionFilter = DataUtils.getFilter("singer_name", FilterOperatorEnum.EQUALS, "周杰伦", "歌手名", 7L); + expectedParseInfo.getDimensionFilters().add(dimensionFilter); + + SchemaElement metric = SchemaElement.builder().name("播放量").build(); + expectedParseInfo.getMetrics().add(metric); + + expectedParseInfo.setDateInfo(DataUtils.getDateConf(DateConf.DateMode.RECENT, 7, period, startDay, endDay)); + expectedParseInfo.setNativeQuery(false); + + assertQueryResult(expectedResult, actualResult); + } + +} diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/BasePluginTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/BasePluginTest.java index 08b19eb3e..2341b81ec 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/BasePluginTest.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/BasePluginTest.java @@ -29,4 +29,4 @@ public class BasePluginTest { Assert.assertEquals("alice", webPage.getParams().get(0).getValue()); } -} \ No newline at end of file +} diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/PluginRecognizeTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/PluginRecognizeTest.java index 56836c7a1..2bc35dec8 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/PluginRecognizeTest.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/PluginRecognizeTest.java @@ -5,7 +5,7 @@ import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.pojo.response.ParseResp; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; -import com.tencent.supersonic.chat.parser.embedding.EmbeddingConfig; +import com.tencent.supersonic.chat.parser.plugin.embedding.EmbeddingConfig; import com.tencent.supersonic.chat.plugin.PluginManager; import com.tencent.supersonic.chat.service.AgentService; import com.tencent.supersonic.chat.service.QueryService; @@ -17,16 +17,16 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.mock.mockito.MockBean; -public class PluginRecognizeTest extends BasePluginTest{ - - @MockBean - private EmbeddingConfig embeddingConfig; +public class PluginRecognizeTest extends BasePluginTest { @MockBean protected PluginManager pluginManager; @MockBean - protected AgentService agentService; + private EmbeddingConfig embeddingConfig; + + @MockBean + private AgentService agentService; @Autowired @Qualifier("chatQueryService") @@ -34,7 +34,7 @@ public class PluginRecognizeTest extends BasePluginTest{ @Test public void webPageRecognize() throws Exception { - MockConfiguration.mockEmbeddingRecognize(pluginManager, "alice最近的访问情况怎么样","1"); + MockConfiguration.mockEmbeddingRecognize(pluginManager, "alice最近的访问情况怎么样", "1"); MockConfiguration.mockEmbeddingUrl(embeddingConfig); QueryReq queryContextReq = DataUtils.getQueryContextReq(1000, "alice最近的访问情况怎么样"); QueryResult queryResult = queryService.executeQuery(queryContextReq); @@ -43,7 +43,7 @@ public class PluginRecognizeTest extends BasePluginTest{ @Test public void webPageRecognizeWithQueryFilter() throws Exception { - MockConfiguration.mockEmbeddingRecognize(pluginManager, "在超音数最近的情况怎么样","1"); + MockConfiguration.mockEmbeddingRecognize(pluginManager, "在超音数最近的情况怎么样", "1"); MockConfiguration.mockEmbeddingUrl(embeddingConfig); QueryReq queryRequest = DataUtils.getQueryContextReq(1000, "在超音数最近的情况怎么样"); QueryFilters queryFilters = new QueryFilters(); @@ -59,7 +59,7 @@ public class PluginRecognizeTest extends BasePluginTest{ @Test public void pluginRecognizeWithAgent() { - MockConfiguration.mockEmbeddingRecognize(pluginManager, "alice最近的访问情况怎么样","1"); + MockConfiguration.mockEmbeddingRecognize(pluginManager, "alice最近的访问情况怎么样", "1"); MockConfiguration.mockEmbeddingUrl(embeddingConfig); MockConfiguration.mockAgent(agentService); QueryReq queryContextReq = DataUtils.getQueryReqWithAgent(1000, "alice最近的访问情况怎么样", diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/util/DataUtils.java b/launchers/standalone/src/test/java/com/tencent/supersonic/util/DataUtils.java index d478b531d..21923514f 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/util/DataUtils.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/util/DataUtils.java @@ -31,7 +31,7 @@ public class DataUtils { public static QueryReq getQueryContextReq(Integer id, String query) { QueryReq queryContextReq = new QueryReq(); - queryContextReq.setQueryText(query);//"alice的访问次数" + queryContextReq.setQueryText(query); queryContextReq.setChatId(id); queryContextReq.setUser(user_test); return queryContextReq; @@ -39,7 +39,7 @@ public class DataUtils { public static QueryReq getQueryReqWithAgent(Integer id, String query, Integer agentId) { QueryReq queryReq = new QueryReq(); - queryReq.setQueryText(query);//"alice的访问次数" + queryReq.setQueryText(query); queryReq.setChatId(id); queryReq.setUser(user_test); queryReq.setAgentId(agentId); @@ -74,8 +74,8 @@ public class DataUtils { .build(); } - public static QueryFilter getFilter(String bizName, FilterOperatorEnum filterOperatorEnum, Object value, String name, - Long elementId) { + public static QueryFilter getFilter(String bizName, FilterOperatorEnum filterOperatorEnum, + Object value, String name, Long elementId) { QueryFilter filter = new QueryFilter(); filter.setBizName(bizName); filter.setOperator(filterOperatorEnum); @@ -95,7 +95,8 @@ public class DataUtils { return dateInfo; } - public static DateConf getDateConf(DateConf.DateMode dateMode, Integer unit, String period, String startDate, String endDate) { + public static DateConf getDateConf(DateConf.DateMode dateMode, Integer unit, + String period, String startDate, String endDate) { DateConf dateInfo = new DateConf(); dateInfo.setUnit(unit); dateInfo.setDateMode(dateMode); @@ -114,9 +115,9 @@ public class DataUtils { } public static Boolean compareDate(DateConf dateInfo1, DateConf dateInfo2) { - Boolean timeFilterExist = dateInfo1.getUnit().equals(dateInfo2.getUnit()) && - dateInfo1.getDateMode().equals(dateInfo2.getDateMode()) && - dateInfo1.getPeriod().equals(dateInfo2.getPeriod()); + Boolean timeFilterExist = dateInfo1.getUnit().equals(dateInfo2.getUnit()) + && dateInfo1.getDateMode().equals(dateInfo2.getDateMode()) + && dateInfo1.getPeriod().equals(dateInfo2.getPeriod()); return timeFilterExist; } @@ -135,11 +136,11 @@ public class DataUtils { public static Boolean compareDimensionFilter(Set dimensionFilters, QueryFilter dimensionFilter) { Boolean dimensionFilterExist = false; for (QueryFilter filter : dimensionFilters) { - if (filter.getBizName().equals(dimensionFilter.getBizName()) && - filter.getOperator().equals(dimensionFilter.getOperator()) && - filter.getValue().toString().equals(dimensionFilter.getValue().toString()) && - filter.getElementID().equals(dimensionFilter.getElementID()) && - filter.getName().equals(dimensionFilter.getName())) { + if (filter.getBizName().equals(dimensionFilter.getBizName()) + && filter.getOperator().equals(dimensionFilter.getOperator()) + && filter.getValue().toString().equals(dimensionFilter.getValue().toString()) + && filter.getElementID().equals(dimensionFilter.getElementID()) + && filter.getName().equals(dimensionFilter.getName())) { dimensionFilterExist = true; } } @@ -163,6 +164,7 @@ public class DataUtils { private static RuleQueryTool getRuleQueryTool() { RuleQueryTool ruleQueryTool = new RuleQueryTool(); ruleQueryTool.setType(AgentToolType.RULE); + ruleQueryTool.setModelIds(Lists.newArrayList(1L, 2L)); ruleQueryTool.setQueryModes(Lists.newArrayList("METRIC_ENTITY", "METRIC_FILTER", "METRIC_MODEL")); return ruleQueryTool; } diff --git a/launchers/standalone/src/test/resources/application-local.yaml b/launchers/standalone/src/test/resources/application-local.yaml index 4c029c184..ef0671022 100644 --- a/launchers/standalone/src/test/resources/application-local.yaml +++ b/launchers/standalone/src/test/resources/application-local.yaml @@ -24,5 +24,8 @@ semantic: url: prefix: http://127.0.0.1:9081 +time: + threshold: 100 + mybatis: mapper-locations=classpath:mappers/custom/*.xml,classpath*:/mappers/*.xml diff --git a/launchers/standalone/src/test/resources/db/schema-h2.sql b/launchers/standalone/src/test/resources/db/schema-h2.sql index 03f9e50f2..7cba53bc2 100644 --- a/launchers/standalone/src/test/resources/db/schema-h2.sql +++ b/launchers/standalone/src/test/resources/db/schema-h2.sql @@ -1,734 +1,393 @@ -- 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 + `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` -) + `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, - `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` -) - ); + `chat_id` BIGINT auto_increment ,-- AUTO_INCREMENT, + `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 `s2_chat_query` ( - `question_id` BIGINT NOT NULL AUTO_INCREMENT, - `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_response` mediumtext NOT NULL, - `score` int DEFAULT '0', - `feedback` varchar(1024) DEFAULT '', + `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 '', PRIMARY KEY (`question_id`) ); +CREATE TABLE `s2_chat_parse` +( + `question_id` BIGINT NOT NULL, + `chat_id` BIGINT 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_config` +CREATE TABLE `s2_chat_statistics` ( - `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 - PRIMARY KEY -( - `id` -) - ); -COMMENT -ON TABLE s2_chat_config IS 'chat config information table '; + `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 + PRIMARY KEY (`id`) + ) ; +COMMENT ON TABLE s2_chat_config IS 'chat config 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, + 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, + PRIMARY KEY (`id`) + ); COMMENT ON TABLE s2_agent IS 'agent information table'; create table s2_user ( - id INT AUTO_INCREMENT, - name varchar(100) not null, + id INT AUTO_INCREMENT, + name varchar(100) not null, display_name varchar(100) null, - password varchar(100) null, - email varchar(100) null, + password varchar(100) null, + email varchar(100) null, PRIMARY KEY (`id`) ); -COMMENT -ON TABLE s2_user IS 'user information table'; +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 - `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 - PRIMARY KEY -( - `id` -) - ); -COMMENT -ON TABLE s2_model IS 'model information'; - - -CREATE TABLE `s2_database` -( - `id` INT NOT NULL AUTO_INCREMENT, - `domain_id` INT NOT NULL, - `name` varchar(255) NOT NULL, - `description` varchar(500) DEFAULT NULL, - `version` varchar(64) DEFAULT NULL, - `type` varchar(20) NOT NULL, -- type: mysql,clickhouse,tdw - `config` varchar(655) NOT NULL, - `created_at` TIMESTAMP NOT NULL, - `created_by` varchar(100) NOT NULL, - `updated_at` TIMESTAMP NOT NULL, - `updated_by` varchar(100) NOT NULL, +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_database IS 'database instance table'; - -CREATE TABLE IF NOT EXISTS `s2_datasource` -( - `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 , - `database_id` INT NOT NULL , - `datasource_detail` LONGVARCHAR NOT NULL , - `created_at` TIMESTAMP NOT NULL , - `created_by` varchar -( - 100 -) NOT NULL , - `updated_at` TIMESTAMP NOT NULL , - `updated_by` varchar -( - 100 -) NOT NULL, - PRIMARY KEY -( - `id` -) ); -COMMENT -ON TABLE s2_datasource IS 'datasource table'; +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 + `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 + PRIMARY KEY (`id`) + ); +COMMENT ON TABLE s2_model IS 'model information'; + + +CREATE TABLE `s2_database` ( + `id` INT NOT NULL AUTO_INCREMENT, + `domain_id` INT NOT NULL , + `name` varchar(255) NOT NULL , + `description` varchar(500) DEFAULT NULL , + `version` varchar(64) DEFAULT NULL , + `type` varchar(20) NOT NULL , -- type: mysql,clickhouse,tdw + `config` varchar(655) NOT NULL , + `created_at` TIMESTAMP NOT NULL , + `created_by` varchar(100) NOT NULL , + `updated_at` TIMESTAMP NOT NULL , + `updated_by` varchar(100) NOT NULL, + PRIMARY KEY (`id`) +); +COMMENT ON TABLE s2_database IS 'database instance table'; + +CREATE TABLE IF NOT EXISTS `s2_datasource` ( + `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 , + `database_id` INT NOT NULL , + `datasource_detail` LONGVARCHAR NOT NULL , + `created_at` TIMESTAMP NOT NULL , + `created_by` varchar(100) NOT NULL , + `updated_at` TIMESTAMP NOT NULL , + `updated_by` varchar(100) NOT NULL, + PRIMARY KEY (`id`) + ); +COMMENT ON TABLE s2_datasource IS 'datasource table'; create table s2_auth_groups ( group_id INT, - config varchar(2048), + 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 , -- status, 0 is normal, 1 is off the shelf, 2 is deleted +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 , -- status, 0 is normal, 1 is off the shelf, 2 is deleted `sensitive_level` INT NOT NULL , - `type` varchar -( - 50 -) NOT NULL , -- type proxy,expr - `type_params` LONGVARCHAR DEFAULT NULL , + `type` varchar(50) NOT NULL , -- type proxy,expr + `type_params` LONGVARCHAR DEFAULT NULL , `created_at` TIMESTAMP NOT NULL , - `created_by` varchar -( - 100 -) 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, - PRIMARY KEY -( - `id` -) + `updated_by` varchar(100) NOT NULL , + `data_format_type` varchar(50) DEFAULT NULL , + `data_format` varchar(500) DEFAULT NULL, + `alias` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) ); -COMMENT -ON TABLE s2_metric IS 'metric information table'; +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, - `datasource_id` - INT - NOT - NULL, - `name` - varchar -( - 255 -) NOT NULL , - `biz_name` varchar -( - 255 -) NOT NULL , - `description` varchar -( - 500 -) NOT NULL , +CREATE TABLE IF NOT EXISTS `s2_dimension` ( + `id` INT NOT NULL AUTO_INCREMENT , + `model_id` INT NOT NULL , + `datasource_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 normal, 1 is off the shelf, 2 is deleted `sensitive_level` INT DEFAULT NULL , - `type` varchar -( - 50 -) NOT NULL , -- type categorical,time - `type_params` LONGVARCHAR DEFAULT NULL , + `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, - PRIMARY KEY -( - `id` -) + `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, + PRIMARY KEY (`id`) ); -COMMENT -ON TABLE s2_dimension IS 'dimension information table'; +COMMENT ON TABLE s2_dimension IS 'dimension information table'; create table s2_datasource_rela ( id INT AUTO_INCREMENT, - model_id INT null, - datasource_from INT null, - datasource_to INT null, + model_id INT null, + datasource_from INT null, + datasource_to INT null, join_key varchar(100) null, - created_at TIMESTAMP null, + created_at TIMESTAMP null, created_by varchar(100) null, - updated_at TIMESTAMP null, + updated_at TIMESTAMP null, updated_by varchar(100) null, PRIMARY KEY (`id`) ); -COMMENT -ON TABLE s2_datasource_rela IS 'data source association table'; +COMMENT ON TABLE s2_datasource_rela IS 'data source association table'; create table s2_view_info ( id INT auto_increment, - model_id INT null, - type varchar(20) null comment 'datasource、dimension、metric', - config LONGVARCHAR null comment 'config detail', - created_at TIMESTAMP null, + model_id INT null, + type varchar(20) null comment 'datasource、dimension、metric', + config LONGVARCHAR null comment 'config detail', + created_at TIMESTAMP null, created_by varchar(100) null, - updated_at TIMESTAMP null, + updated_at TIMESTAMP null, updated_by varchar(100) not null ); -COMMENT -ON TABLE s2_view_info IS 'view information table'; +COMMENT ON TABLE s2_view_info IS 'view information table'; -CREATE TABLE `s2_query_stat_info` -( - `id` INT NOT NULL AUTO_INCREMENT, - `trace_id` varchar(200) DEFAULT NULL, -- query unique identifier - `model_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 - PRIMARY KEY (`id`) -); -COMMENT -ON TABLE s2_query_stat_info IS 'query statistics table'; +CREATE TABLE `s2_query_stat_info` ( + `id` INT NOT NULL AUTO_INCREMENT, + `trace_id` varchar(200) DEFAULT NULL, -- query unique identifier + `model_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 + 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 , +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 , + `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` -) + PRIMARY KEY (`id`) ); -COMMENT -ON TABLE s2_semantic_pasre_info IS 'semantic layer sql parsing information table'; +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` -) +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'; +COMMENT ON TABLE s2_dimension IS 'dimension information table'; CREATE TABLE IF NOT EXISTS `s2_plugin` ( - `id` - INT - AUTO_INCREMENT, - `type` - varchar -( - 50 -) NULL, - `model` 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'; + `id` INT AUTO_INCREMENT, + `type` varchar(50) NULL, + `model` 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'; -------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 +CREATE TABLE IF NOT EXISTS `s2_user_department` ( + `user_name` varchar(200) NOT NULL, + `department` varchar(200) NOT NULL -- department of user ); -COMMENT -ON TABLE s2_user_department IS 'user_department_info'; +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 +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'; +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, +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 + `page` varchar(200) NOT NULL ); -COMMENT -ON TABLE s2_stay_time_statis IS 's2_stay_time_statis_info'; +COMMENT ON TABLE s2_stay_time_statis IS 's2_stay_time_statis_info'; -CREATE TABLE IF NOT EXISTS `singer` -( - `imp_date` varchar -( - 200 -) NOT NULL, - `singer_name` varchar -( - 200 -) NOT NULL, - `act_area` varchar -( - 200 -) NOT NULL, - `song_name` varchar -( - 200 -) NOT NULL, - `genre` varchar -( - 200 -) NOT NULL, +CREATE TABLE IF NOT EXISTS `singer` ( + `imp_date` varchar(200) NOT NULL, + `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 ); -COMMENT -ON TABLE singer IS 'singer_info'; +COMMENT ON TABLE singer IS 'singer_info'; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/DimValueMap.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/DimValueMap.java index 3a4d262a4..c02409cd2 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/DimValueMap.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/DimValueMap.java @@ -4,11 +4,6 @@ import java.util.ArrayList; import java.util.List; import lombok.Data; -/** - * @author: kanedai - * @date: 2023/7/24 - */ - @Data public class DimValueMap { diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DomainReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DomainReq.java index b57f342a6..f4aed6263 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DomainReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DomainReq.java @@ -1,9 +1,12 @@ package com.tencent.supersonic.semantic.api.model.request; + import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; + import java.util.ArrayList; import java.util.List; + import lombok.Data; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/CatalogImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/CatalogImpl.java index 1971a2c7d..52ac857fe 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/CatalogImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/CatalogImpl.java @@ -1,11 +1,21 @@ package com.tencent.supersonic.semantic.model.application; import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter; -import com.tencent.supersonic.semantic.api.model.response.*; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; +import com.tencent.supersonic.semantic.api.model.response.DatabaseResp; +import com.tencent.supersonic.semantic.api.model.response.ModelResp; +import com.tencent.supersonic.semantic.api.model.response.DatasourceResp; +import com.tencent.supersonic.semantic.api.model.response.DimensionResp; +import com.tencent.supersonic.semantic.api.model.response.ItemDateResp; import com.tencent.supersonic.semantic.api.model.yaml.DatasourceYamlTpl; import com.tencent.supersonic.semantic.api.model.yaml.DimensionYamlTpl; import com.tencent.supersonic.semantic.api.model.yaml.MetricYamlTpl; -import com.tencent.supersonic.semantic.model.domain.*; +import com.tencent.supersonic.semantic.model.domain.DatabaseService; +import com.tencent.supersonic.semantic.model.domain.ModelService; +import com.tencent.supersonic.semantic.model.domain.DimensionService; +import com.tencent.supersonic.semantic.model.domain.DatasourceService; +import com.tencent.supersonic.semantic.model.domain.MetricService; +import com.tencent.supersonic.semantic.model.domain.Catalog; import java.util.List; import java.util.Map; import java.util.Set; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DatabaseServiceImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DatabaseServiceImpl.java index fd943ab4c..136fad907 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DatabaseServiceImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DatabaseServiceImpl.java @@ -2,22 +2,22 @@ package com.tencent.supersonic.semantic.model.application; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.semantic.api.model.request.DatabaseReq; -import com.tencent.supersonic.semantic.api.model.response.DatabaseResp; -import com.tencent.supersonic.semantic.api.model.response.DomainResp; import com.tencent.supersonic.semantic.api.model.response.ModelResp; -import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; import com.tencent.supersonic.semantic.api.model.response.SqlParserResp; -import com.tencent.supersonic.semantic.model.domain.DatabaseService; +import com.tencent.supersonic.semantic.api.model.response.DatabaseResp; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; import com.tencent.supersonic.semantic.model.domain.DomainService; import com.tencent.supersonic.semantic.model.domain.ModelService; import com.tencent.supersonic.semantic.model.domain.adaptor.engineadapter.EngineAdaptor; import com.tencent.supersonic.semantic.model.domain.adaptor.engineadapter.EngineAdaptorFactory; import com.tencent.supersonic.semantic.model.domain.dataobject.DatabaseDO; -import com.tencent.supersonic.semantic.model.domain.pojo.Database; import com.tencent.supersonic.semantic.model.domain.repository.DatabaseRepository; import com.tencent.supersonic.semantic.model.domain.utils.DatabaseConverter; import com.tencent.supersonic.semantic.model.domain.utils.JdbcDataSourceUtils; import com.tencent.supersonic.semantic.model.domain.utils.SqlUtils; +import com.tencent.supersonic.semantic.model.domain.DatabaseService; +import com.tencent.supersonic.semantic.model.domain.pojo.Database; import java.util.List; import java.util.Map; import java.util.Optional; @@ -38,9 +38,9 @@ public class DatabaseServiceImpl implements DatabaseService { private ModelService modelService; public DatabaseServiceImpl(DatabaseRepository databaseRepository, - SqlUtils sqlUtils, - DomainService domainService, - ModelService modelService) { + SqlUtils sqlUtils, + DomainService domainService, + ModelService modelService) { this.databaseRepository = databaseRepository; this.sqlUtils = sqlUtils; this.modelService = modelService; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DimensionServiceImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DimensionServiceImpl.java index 0e8046f23..9bc49594f 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DimensionServiceImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DimensionServiceImpl.java @@ -7,7 +7,6 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.common.pojo.QueryColumn; import com.tencent.supersonic.common.util.ChatGptHelper; import com.tencent.supersonic.semantic.api.model.pojo.DatasourceDetail; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; @@ -28,9 +27,11 @@ import com.tencent.supersonic.semantic.model.domain.DomainService; import com.tencent.supersonic.semantic.model.domain.pojo.Dimension; import com.tencent.supersonic.semantic.model.domain.pojo.DimensionFilter; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.ArrayList; +import java.util.HashMap; import java.util.stream.Collectors; -import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -55,14 +56,14 @@ public class DimensionServiceImpl implements DimensionService { public DimensionServiceImpl(DimensionRepository dimensionRepository, - DomainService domainService, - DatasourceService datasourceService, + DomainService domainService, + DatasourceService datasourceService, ChatGptHelper chatGptHelper, DatabaseService databaseService) { this.domainService = domainService; this.dimensionRepository = dimensionRepository; this.datasourceService = datasourceService; - this.chatGptHelper = chatGptHelper; + this.chatGptHelper = chatGptHelper; this.databaseService = databaseService; } @@ -181,7 +182,7 @@ public class DimensionServiceImpl implements DimensionService { } private List convertList(List dimensionDOS, - Map datasourceRespMap) { + Map datasourceRespMap) { List dimensionResps = Lists.newArrayList(); Map fullDomainPathMap = domainService.getDomainFullPath(); if (!CollectionUtils.isEmpty(dimensionDOS)) { @@ -259,17 +260,20 @@ public class DimensionServiceImpl implements DimensionService { @Override public List mockAlias(DimensionReq dimensionReq, String mockType, User user) { - String mockAlias = chatGptHelper.mockAlias(mockType,dimensionReq.getName(), dimensionReq.getBizName(), "", dimensionReq.getDescription() ,false); - return JSONObject.parseObject(mockAlias, new TypeReference>() {}); + String mockAlias = chatGptHelper.mockAlias(mockType, dimensionReq.getName(), dimensionReq.getBizName(), + "", dimensionReq.getDescription(), false); + return JSONObject.parseObject(mockAlias, new TypeReference>() { + }); } @Override public List mockDimensionValueAlias(DimensionReq dimensionReq, User user) { List datasourceList = datasourceService.getDatasourceList(); - List collect = datasourceList.stream().filter(datasourceResp -> datasourceResp.getId().equals(dimensionReq.getDatasourceId())).collect(Collectors.toList()); + List collect = datasourceList.stream().filter(datasourceResp -> + datasourceResp.getId().equals(dimensionReq.getDatasourceId())).collect(Collectors.toList()); - if (collect.isEmpty()){ + if (collect.isEmpty()) { return null; } DatasourceResp datasourceResp = collect.get(0); @@ -278,7 +282,8 @@ public class DimensionServiceImpl implements DimensionService { DatabaseResp database = databaseService.getDatabase(datasourceResp.getDatabaseId()); - String sql = "select ai_talk."+dimensionReq.getBizName()+" from ("+sqlQuery +") as ai_talk group by ai_talk."+dimensionReq.getBizName(); + String sql = "select ai_talk." + dimensionReq.getBizName() + " from (" + sqlQuery + + ") as ai_talk group by ai_talk." + dimensionReq.getBizName(); QueryResultWithSchemaResp queryResultWithSchemaResp = databaseService.executeSql(sql, database); List> resultList = queryResultWithSchemaResp.getResultList(); List valueList = new ArrayList<>(); @@ -287,7 +292,7 @@ public class DimensionServiceImpl implements DimensionService { valueList.add(value); } String json = chatGptHelper.mockDimensionValueAlias(JSON.toJSONString(valueList)); - log.info("return llm res is :{}",json); + log.info("return llm res is :{}", json); JSONObject jsonObject = JSON.parseObject(json); @@ -297,9 +302,10 @@ public class DimensionServiceImpl implements DimensionService { DimValueMap dimValueMap = new DimValueMap(); dimValueMap.setTechName((String) stringObjectMap.get(dimensionReq.getBizName())); dimValueMap.setBizName(jsonObject.getJSONArray("tran").getString(i)); - dimValueMap. setAlias(jsonObject.getJSONObject("alias").getJSONArray((String) stringObjectMap.get(dimensionReq.getBizName())).toJavaList(String.class)); + dimValueMap.setAlias(jsonObject.getJSONObject("alias").getJSONArray( + (String) stringObjectMap.get(dimensionReq.getBizName())).toJavaList(String.class)); dimValueMapsResp.add(dimValueMap); - i ++ ; + i++; } return dimValueMapsResp; } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DomainServiceImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DomainServiceImpl.java index af7ed3d6d..d874cf492 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DomainServiceImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DomainServiceImpl.java @@ -4,20 +4,29 @@ import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.service.UserService; -import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.common.util.BeanMapper; +import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.semantic.api.model.request.DomainReq; import com.tencent.supersonic.semantic.api.model.request.DomainUpdateReq; -import com.tencent.supersonic.semantic.api.model.response.DomainResp; import com.tencent.supersonic.semantic.api.model.response.ModelResp; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; import com.tencent.supersonic.semantic.model.domain.DomainService; import com.tencent.supersonic.semantic.model.domain.ModelService; import com.tencent.supersonic.semantic.model.domain.dataobject.DomainDO; import com.tencent.supersonic.semantic.model.domain.pojo.Domain; import com.tencent.supersonic.semantic.model.domain.repository.DomainRepository; import com.tencent.supersonic.semantic.model.domain.utils.DomainConvert; - -import java.util.*; +import java.util.List; +import java.util.Date; +import java.util.Set; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Map; +import java.util.HashMap; +import java.util.Queue; +import java.util.LinkedList; +import java.util.Objects; +import java.util.Comparator; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.assertj.core.util.Sets; @@ -36,8 +45,8 @@ public class DomainServiceImpl implements DomainService { public DomainServiceImpl(DomainRepository domainRepository, - @Lazy ModelService modelService, - UserService userService) { + @Lazy ModelService modelService, + UserService userService) { this.domainRepository = domainRepository; this.modelService = modelService; this.userService = userService; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/MetricServiceImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/MetricServiceImpl.java index 50de1b114..3cb2e9982 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/MetricServiceImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/MetricServiceImpl.java @@ -5,7 +5,6 @@ import com.alibaba.fastjson.TypeReference; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; -import com.plexpt.chatgpt.ChatGPT; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.common.util.ChatGptHelper; import com.tencent.supersonic.semantic.api.model.pojo.Measure; @@ -81,7 +80,7 @@ public class MetricServiceImpl implements MetricService { log.info("[insert metric] object:{}", JSONObject.toJSONString(metricToInsert)); saveMetricBatch(metricToInsert, user); } - + @Override public List getMetrics(Long modelId) { return convertList(metricRepository.getMetricList(modelId)); @@ -209,10 +208,12 @@ public class MetricServiceImpl implements MetricService { } @Override - public List mockAlias(MetricReq metricReq,String mockType,User user) { + public List mockAlias(MetricReq metricReq, String mockType, User user) { - String mockAlias = chatGptHelper.mockAlias(mockType,metricReq.getName(), metricReq.getBizName(), "", metricReq.getDescription() ,!"".equals(metricReq.getDataFormatType())); - return JSONObject.parseObject(mockAlias, new TypeReference>() {}); + String mockAlias = chatGptHelper.mockAlias(mockType, metricReq.getName(), metricReq.getBizName(), "", + metricReq.getDescription(), !"".equals(metricReq.getDataFormatType())); + return JSONObject.parseObject(mockAlias, new TypeReference>() { + }); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java index b62dedcf2..54b3c2b97 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java @@ -4,41 +4,42 @@ import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.service.UserService; -import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.semantic.api.model.request.ModelReq; import com.tencent.supersonic.semantic.api.model.request.ModelSchemaFilterReq; -import com.tencent.supersonic.semantic.api.model.response.DatasourceResp; -import com.tencent.supersonic.semantic.api.model.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.model.response.DimensionResp; -import com.tencent.supersonic.semantic.api.model.response.DomainResp; -import com.tencent.supersonic.semantic.api.model.response.MetricResp; -import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; import com.tencent.supersonic.semantic.api.model.response.ModelResp; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; +import com.tencent.supersonic.semantic.api.model.response.DimensionResp; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; +import com.tencent.supersonic.semantic.api.model.response.DimSchemaResp; import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; -import com.tencent.supersonic.semantic.model.domain.DatasourceService; -import com.tencent.supersonic.semantic.model.domain.DimensionService; -import com.tencent.supersonic.semantic.model.domain.DomainService; -import com.tencent.supersonic.semantic.model.domain.MetricService; +import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.DatasourceResp; import com.tencent.supersonic.semantic.model.domain.ModelService; +import com.tencent.supersonic.semantic.model.domain.DomainService; +import com.tencent.supersonic.semantic.model.domain.DimensionService; +import com.tencent.supersonic.semantic.model.domain.MetricService; +import com.tencent.supersonic.semantic.model.domain.DatasourceService; + import com.tencent.supersonic.semantic.model.domain.dataobject.ModelDO; import com.tencent.supersonic.semantic.model.domain.pojo.Model; import com.tencent.supersonic.semantic.model.domain.repository.ModelRepository; import com.tencent.supersonic.semantic.model.domain.utils.ModelConvert; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.util.List; +import java.util.Objects; +import java.util.Date; +import java.util.Set; +import java.util.Map; +import java.util.HashSet; +import java.util.ArrayList; +import java.util.stream.Collectors; @Slf4j @Service @@ -52,8 +53,8 @@ public class ModelServiceImpl implements ModelService { private final UserService userService; public ModelServiceImpl(ModelRepository modelRepository, @Lazy MetricService metricService, - @Lazy DimensionService dimensionService, @Lazy DatasourceService datasourceService, - @Lazy DomainService domainService, UserService userService) { + @Lazy DimensionService dimensionService, @Lazy DatasourceService datasourceService, + @Lazy DomainService domainService, UserService userService) { this.modelRepository = modelRepository; this.metricService = metricService; this.dimensionService = dimensionService; @@ -161,7 +162,7 @@ public class ModelServiceImpl implements ModelService { @Override public ModelResp getModel(Long id) { Map domainRespMap = domainService.getDomainList().stream() - .collect(Collectors.toMap(DomainResp::getId, d -> d)); + .collect(Collectors.toMap(DomainResp::getId, d -> d)); return ModelConvert.convert(getModelDO(id), domainRespMap); } @@ -186,8 +187,8 @@ public class ModelServiceImpl implements ModelService { if (CollectionUtils.isEmpty(modelDOS)) { return modelResps; } - Map domainRespMap = domainService.getDomainList().stream() - .collect(Collectors.toMap(DomainResp::getId, d -> d)); + Map domainRespMap = domainService.getDomainList() + .stream().collect(Collectors.toMap(DomainResp::getId, d -> d)); return modelDOS.stream() .map(modelDO -> ModelConvert.convert(modelDO, domainRespMap)) .collect(Collectors.toList()); @@ -216,8 +217,29 @@ public class ModelServiceImpl implements ModelService { @Override public Map getModelFullPathMap() { - return getModelList().stream() - .collect(Collectors.toMap(ModelResp::getId, ModelResp::getFullPath, (k1, k2) -> k1)); + return getModelList().stream().collect(Collectors.toMap(ModelResp::getId, + ModelResp::getFullPath, (k1, k2) -> k1)); + } + + @Override + public List getModelAdmin(Long id) { + ModelResp modelResp = getModel(id); + if (modelResp == null) { + return Lists.newArrayList(); + } + if (!CollectionUtils.isEmpty(modelResp.getAdmins())) { + return modelResp.getAdmins(); + } + Long domainId = modelResp.getDomainId(); + DomainResp domainResp = domainService.getDomain(domainId); + while (domainResp != null) { + if (!CollectionUtils.isEmpty(domainResp.getAdmins())) { + return domainResp.getAdmins(); + } + domainId = domainResp.getParentId(); + domainResp = domainService.getDomain(domainId); + } + return Lists.newArrayList(); } protected ModelDO getModelDO(Long id) { diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DatabaseService.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DatabaseService.java index 5dbd2903e..020d6e2a6 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DatabaseService.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DatabaseService.java @@ -11,10 +11,10 @@ public interface DatabaseService { QueryResultWithSchemaResp executeSql(String sql, DatabaseResp databaseResp); - DatabaseResp getDatabaseByModelId(Long modelId); - QueryResultWithSchemaResp executeSql(String sql, Long domainId); + DatabaseResp getDatabaseByModelId(Long modelId); + boolean testConnect(DatabaseReq databaseReq, User user); DatabaseResp createOrUpdateDatabase(DatabaseReq databaseReq, User user); diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DimensionService.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DimensionService.java index 10e6a46ea..3e80331c0 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DimensionService.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DimensionService.java @@ -4,7 +4,6 @@ import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; import com.tencent.supersonic.semantic.api.model.request.DimensionReq; -import com.tencent.supersonic.semantic.api.model.request.MetricReq; import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; import com.tencent.supersonic.semantic.api.model.response.DimensionResp; import java.util.List; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/MetricService.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/MetricService.java index 8f674fa19..1b28e8e64 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/MetricService.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/MetricService.java @@ -5,6 +5,7 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.semantic.api.model.request.MetricReq; import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; import com.tencent.supersonic.semantic.api.model.response.MetricResp; + import java.util.List; public interface MetricService { @@ -33,5 +34,5 @@ public interface MetricService { void deleteMetric(Long id) throws Exception; - List mockAlias(MetricReq metricReq,String mockType,User user); + List mockAlias(MetricReq metricReq, String mockType, User user); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/ModelService.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/ModelService.java index ffea84c25..9bfad94f8 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/ModelService.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/ModelService.java @@ -33,6 +33,8 @@ public interface ModelService { Map getModelFullPathMap(); + List getModelAdmin(Long id); + ModelSchemaResp fetchSingleModelSchema(Long modelId); List fetchModelSchema(ModelSchemaFilterReq modelSchemaFilterReq); diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/H2Adaptor.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/H2Adaptor.java index 52a29b7c7..20dce0613 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/H2Adaptor.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/H2Adaptor.java @@ -29,8 +29,8 @@ public class H2Adaptor extends EngineAdaptor { @Override public String getColumnMetaQueryTpl() { - return "SELECT COLUMN_NAME AS name, DATA_TYPE AS dataType\n" + - "FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA ='%s' AND TABLE_NAME = '%s'"; + return "SELECT COLUMN_NAME AS name, DATA_TYPE AS dataType\n" + + "FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA ='%s' AND TABLE_NAME = '%s'"; } @Override @@ -40,6 +40,7 @@ public class H2Adaptor extends EngineAdaptor { @Override public String getTableMetaQueryTpl() { - return "SELECT TABLE_NAME as name FROM INFORMATION_SCHEMA.TABLES WHERE STORAGE_TYPE = 'MEMORY' AND TABLE_SCHEMA = '%s'"; + return "SELECT TABLE_NAME as name FROM INFORMATION_SCHEMA.TABLES " + + "WHERE STORAGE_TYPE = 'MEMORY' AND TABLE_SCHEMA = '%s'"; } } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/MysqlAdaptor.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/MysqlAdaptor.java index dfbbde0d6..3759ecf2c 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/MysqlAdaptor.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/MysqlAdaptor.java @@ -35,7 +35,8 @@ public class MysqlAdaptor extends EngineAdaptor { @Override public String getDbMetaQueryTpl() { - return "select distinct TABLE_SCHEMA as name from information_schema.tables where TABLE_SCHEMA not in ('information_schema','mysql','performance_schema','sys');"; + return "select distinct TABLE_SCHEMA as name from information_schema.tables " + + "where TABLE_SCHEMA not in ('information_schema','mysql','performance_schema','sys');"; } @Override @@ -45,8 +46,8 @@ public class MysqlAdaptor extends EngineAdaptor { @Override public String getColumnMetaQueryTpl() { - return "SELECT COLUMN_NAME as name, DATA_TYPE as dataType, COLUMN_COMMENT as comment " + - "FROM information_schema.columns WHERE table_schema ='%s' AND table_name = '%s'"; + return "SELECT COLUMN_NAME as name, DATA_TYPE as dataType, COLUMN_COMMENT as comment " + + "FROM information_schema.columns WHERE table_schema ='%s' AND table_name = '%s'"; } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatabaseDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatabaseDO.java index 925e20281..58074d9ec 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatabaseDO.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatabaseDO.java @@ -248,4 +248,4 @@ public class DatabaseDO { public void setConfig(String config) { this.config = config == null ? null : config.trim(); } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatabaseDOExample.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatabaseDOExample.java index b75151d07..70e40e882 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatabaseDOExample.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatabaseDOExample.java @@ -882,38 +882,6 @@ public class DatabaseDOExample { private String typeHandler; - public String getCondition() { - return condition; - } - - public Object getValue() { - return value; - } - - public Object getSecondValue() { - return secondValue; - } - - public boolean isNoValue() { - return noValue; - } - - public boolean isSingleValue() { - return singleValue; - } - - public boolean isBetweenValue() { - return betweenValue; - } - - public boolean isListValue() { - return listValue; - } - - public String getTypeHandler() { - return typeHandler; - } - protected Criterion(String condition) { super(); this.condition = condition; @@ -949,5 +917,37 @@ public class DatabaseDOExample { protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceDO.java index 96f0a940a..9c6db09cb 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceDO.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceDO.java @@ -252,4 +252,4 @@ public class DatasourceDO { public void setDatasourceDetail(String datasourceDetail) { this.datasourceDetail = datasourceDetail == null ? null : datasourceDetail.trim(); } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceDOExample.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceDOExample.java index ce8fdf4f6..961e622af 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceDOExample.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceDOExample.java @@ -872,38 +872,6 @@ public class DatasourceDOExample { private String typeHandler; - public String getCondition() { - return condition; - } - - public Object getValue() { - return value; - } - - public Object getSecondValue() { - return secondValue; - } - - public boolean isNoValue() { - return noValue; - } - - public boolean isSingleValue() { - return singleValue; - } - - public boolean isBetweenValue() { - return betweenValue; - } - - public boolean isListValue() { - return listValue; - } - - public String getTypeHandler() { - return typeHandler; - } - protected Criterion(String condition) { super(); this.condition = condition; @@ -939,5 +907,37 @@ public class DatasourceDOExample { protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceRelaDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceRelaDO.java index 4beb5e7a6..45d25af7f 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceRelaDO.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceRelaDO.java @@ -174,4 +174,4 @@ public class DatasourceRelaDO { public void setUpdatedBy(String updatedBy) { this.updatedBy = updatedBy == null ? null : updatedBy.trim(); } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceRelaDOExample.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceRelaDOExample.java index e63d0fae7..aceb27da4 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceRelaDOExample.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DatasourceRelaDOExample.java @@ -792,38 +792,6 @@ public class DatasourceRelaDOExample { private String typeHandler; - public String getCondition() { - return condition; - } - - public Object getValue() { - return value; - } - - public Object getSecondValue() { - return secondValue; - } - - public boolean isNoValue() { - return noValue; - } - - public boolean isSingleValue() { - return singleValue; - } - - public boolean isBetweenValue() { - return betweenValue; - } - - public boolean isListValue() { - return listValue; - } - - public String getTypeHandler() { - return typeHandler; - } - protected Criterion(String condition) { super(); this.condition = condition; @@ -859,5 +827,37 @@ public class DatasourceRelaDOExample { protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDO.java index c080f0e59..403f5ef86 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDO.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDO.java @@ -432,4 +432,4 @@ public class DimensionDO { public void setExpr(String expr) { this.expr = expr == null ? null : expr.trim(); } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDOExample.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDOExample.java index ac78e595c..67a7bb84c 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDOExample.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDOExample.java @@ -1342,38 +1342,6 @@ public class DimensionDOExample { private String typeHandler; - public String getCondition() { - return condition; - } - - public Object getValue() { - return value; - } - - public Object getSecondValue() { - return secondValue; - } - - public boolean isNoValue() { - return noValue; - } - - public boolean isSingleValue() { - return singleValue; - } - - public boolean isBetweenValue() { - return betweenValue; - } - - public boolean isListValue() { - return listValue; - } - - public String getTypeHandler() { - return typeHandler; - } - protected Criterion(String condition) { super(); this.condition = condition; @@ -1409,5 +1377,37 @@ public class DimensionDOExample { protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainDOExample.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainDOExample.java index b72c33737..397f44785 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainDOExample.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainDOExample.java @@ -1142,38 +1142,6 @@ public class DomainDOExample { private String typeHandler; - public String getCondition() { - return condition; - } - - public Object getValue() { - return value; - } - - public Object getSecondValue() { - return secondValue; - } - - public boolean isNoValue() { - return noValue; - } - - public boolean isSingleValue() { - return singleValue; - } - - public boolean isBetweenValue() { - return betweenValue; - } - - public boolean isListValue() { - return listValue; - } - - public String getTypeHandler() { - return typeHandler; - } - protected Criterion(String condition) { super(); this.condition = condition; @@ -1209,5 +1177,37 @@ public class DomainDOExample { protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricDO.java index 040bb2e55..ceb2fad56 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricDO.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricDO.java @@ -4,265 +4,121 @@ import java.util.Date; public class MetricDO { - /** - * - */ private Long id; - /** - * 主体域ID - */ private Long modelId; - /** - * 指标名称 - */ private String name; - /** - * 字段名称 - */ private String bizName; - /** - * 描述 - */ private String description; - /** - * 指标状态,0正常,1下架,2删除 - */ private Integer status; - /** - * 敏感级别 - */ private Integer sensitiveLevel; - /** - * 指标类型 proxy,expr - */ private String type; - /** - * 创建时间 - */ private Date createdAt; - /** - * 创建人 - */ private String createdBy; - /** - * 更新时间 - */ private Date updatedAt; - /** - * 更新人 - */ private String updatedBy; - /** - * 数值类型 - */ private String dataFormatType; - /** - * 数值类型参数 - */ private String dataFormat; - /** - * - */ private String alias; - /** - * 类型参数 - */ private String typeParams; - /** - * @return id - */ + public Long getId() { return id; } - /** - * @param id - */ public void setId(Long id) { this.id = id; } - /** - * 主体域ID - * - * @return model_id 主体域ID - */ public Long getModelId() { return modelId; } - /** - * 主体域ID - * - * @param modelId 主体域ID - */ public void setModelId(Long modelId) { this.modelId = modelId; } - /** - * 指标名称 - * - * @return name 指标名称 - */ public String getName() { return name; } - /** - * 指标名称 - * - * @param name 指标名称 - */ public void setName(String name) { this.name = name == null ? null : name.trim(); } - /** - * 字段名称 - * - * @return biz_name 字段名称 - */ public String getBizName() { return bizName; } - /** - * 字段名称 - * - * @param bizName 字段名称 - */ public void setBizName(String bizName) { this.bizName = bizName == null ? null : bizName.trim(); } - /** - * 描述 - * - * @return description 描述 - */ public String getDescription() { return description; } - /** - * 描述 - * - * @param description 描述 - */ public void setDescription(String description) { this.description = description == null ? null : description.trim(); } - /** - * 指标状态,0正常,1下架,2删除 - * - * @return status 指标状态,0正常,1下架,2删除 - */ public Integer getStatus() { return status; } - /** - * 指标状态,0正常,1下架,2删除 - * - * @param status 指标状态,0正常,1下架,2删除 - */ public void setStatus(Integer status) { this.status = status; } - /** - * 敏感级别 - * - * @return sensitive_level 敏感级别 - */ public Integer getSensitiveLevel() { return sensitiveLevel; } - /** - * 敏感级别 - * - * @param sensitiveLevel 敏感级别 - */ public void setSensitiveLevel(Integer sensitiveLevel) { this.sensitiveLevel = sensitiveLevel; } - /** - * 指标类型 proxy,expr - * - * @return type 指标类型 proxy,expr - */ public String getType() { return type; } - /** - * 指标类型 proxy,expr - * - * @param type 指标类型 proxy,expr - */ public void setType(String type) { this.type = type == null ? null : type.trim(); } - /** - * 创建时间 - * - * @return created_at 创建时间 - */ public Date getCreatedAt() { return createdAt; } - /** - * 创建时间 - * - * @param createdAt 创建时间 - */ public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; } - /** - * 创建人 - * - * @return created_by 创建人 - */ public String getCreatedBy() { return createdBy; } - /** - * 创建人 - * - * @param createdBy 创建人 - */ public void setCreatedBy(String createdBy) { this.createdBy = createdBy == null ? null : createdBy.trim(); } /** * 更新时间 - * * @return updated_at 更新时间 */ public Date getUpdatedAt() { @@ -271,7 +127,6 @@ public class MetricDO { /** * 更新时间 - * * @param updatedAt 更新时间 */ public void setUpdatedAt(Date updatedAt) { @@ -280,7 +135,6 @@ public class MetricDO { /** * 更新人 - * * @return updated_by 更新人 */ public String getUpdatedBy() { @@ -289,7 +143,6 @@ public class MetricDO { /** * 更新人 - * * @param updatedBy 更新人 */ public void setUpdatedBy(String updatedBy) { @@ -298,7 +151,6 @@ public class MetricDO { /** * 数值类型 - * * @return data_format_type 数值类型 */ public String getDataFormatType() { @@ -307,7 +159,6 @@ public class MetricDO { /** * 数值类型 - * * @param dataFormatType 数值类型 */ public void setDataFormatType(String dataFormatType) { @@ -316,7 +167,6 @@ public class MetricDO { /** * 数值类型参数 - * * @return data_format 数值类型参数 */ public String getDataFormat() { @@ -325,7 +175,6 @@ public class MetricDO { /** * 数值类型参数 - * * @param dataFormat 数值类型参数 */ public void setDataFormat(String dataFormat) { @@ -333,6 +182,7 @@ public class MetricDO { } /** + * * @return alias */ public String getAlias() { @@ -340,6 +190,7 @@ public class MetricDO { } /** + * * @param alias */ public void setAlias(String alias) { @@ -348,7 +199,6 @@ public class MetricDO { /** * 类型参数 - * * @return type_params 类型参数 */ public String getTypeParams() { @@ -357,10 +207,9 @@ public class MetricDO { /** * 类型参数 - * * @param typeParams 类型参数 */ public void setTypeParams(String typeParams) { this.typeParams = typeParams == null ? null : typeParams.trim(); } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricDOExample.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricDOExample.java index 98d32eddf..3e75f81d2 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricDOExample.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricDOExample.java @@ -1212,38 +1212,6 @@ public class MetricDOExample { private String typeHandler; - public String getCondition() { - return condition; - } - - public Object getValue() { - return value; - } - - public Object getSecondValue() { - return secondValue; - } - - public boolean isNoValue() { - return noValue; - } - - public boolean isSingleValue() { - return singleValue; - } - - public boolean isBetweenValue() { - return betweenValue; - } - - public boolean isListValue() { - return listValue; - } - - public String getTypeHandler() { - return typeHandler; - } - protected Criterion(String condition) { super(); this.condition = condition; @@ -1279,5 +1247,37 @@ public class MetricDOExample { protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDO.java index c16bf1852..baa07e3db 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDO.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDO.java @@ -4,269 +4,143 @@ import java.util.Date; public class ModelDO { - /** - * - */ private Long id; - /** - * - */ private String name; - /** - * - */ private String bizName; - /** - * - */ private Long domainId; - /** - * - */ private String viewer; - /** - * - */ private String viewOrg; - /** - * - */ private String admin; - /** - * - */ private String adminOrg; - /** - * - */ private Integer isOpen; - /** - * - */ private String createdBy; - /** - * - */ private Date createdAt; - /** - * - */ private String updatedBy; - /** - * - */ private Date updatedAt; - /** - * - */ private String entity; - /** - * @return id - */ public Long getId() { return id; } - /** - * @param id - */ public void setId(Long id) { this.id = id; } - /** - * @return name - */ public String getName() { return name; } - /** - * @param name - */ public void setName(String name) { this.name = name == null ? null : name.trim(); } - /** - * @return biz_name - */ public String getBizName() { return bizName; } - /** - * @param bizName - */ public void setBizName(String bizName) { this.bizName = bizName == null ? null : bizName.trim(); } - /** - * @return domain_id - */ public Long getDomainId() { return domainId; } - /** - * @param domainId - */ public void setDomainId(Long domainId) { this.domainId = domainId; } - /** - * @return viewer - */ public String getViewer() { return viewer; } - /** - * @param viewer - */ public void setViewer(String viewer) { this.viewer = viewer == null ? null : viewer.trim(); } - /** - * @return view_org - */ public String getViewOrg() { return viewOrg; } - /** - * @param viewOrg - */ public void setViewOrg(String viewOrg) { this.viewOrg = viewOrg == null ? null : viewOrg.trim(); } - /** - * @return admin - */ public String getAdmin() { return admin; } - /** - * @param admin - */ public void setAdmin(String admin) { this.admin = admin == null ? null : admin.trim(); } - /** - * @return admin_org - */ public String getAdminOrg() { return adminOrg; } - /** - * @param adminOrg - */ public void setAdminOrg(String adminOrg) { this.adminOrg = adminOrg == null ? null : adminOrg.trim(); } - /** - * @return is_open - */ public Integer getIsOpen() { return isOpen; } - /** - * @param isOpen - */ public void setIsOpen(Integer isOpen) { this.isOpen = isOpen; } - /** - * @return created_by - */ public String getCreatedBy() { return createdBy; } - /** - * @param createdBy - */ public void setCreatedBy(String createdBy) { this.createdBy = createdBy == null ? null : createdBy.trim(); } - /** - * @return created_at - */ public Date getCreatedAt() { return createdAt; } - /** - * @param createdAt - */ public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; } - /** - * @return updated_by - */ public String getUpdatedBy() { return updatedBy; } - /** - * @param updatedBy - */ public void setUpdatedBy(String updatedBy) { this.updatedBy = updatedBy == null ? null : updatedBy.trim(); } - /** - * @return updated_at - */ public Date getUpdatedAt() { return updatedAt; } - /** - * @param updatedAt - */ public void setUpdatedAt(Date updatedAt) { this.updatedAt = updatedAt; } - /** - * @return entity - */ public String getEntity() { return entity; } - /** - * @param entity - */ public void setEntity(String entity) { this.entity = entity == null ? null : entity.trim(); } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDOExample.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDOExample.java index 7721ae42f..147839739 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDOExample.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDOExample.java @@ -1082,38 +1082,6 @@ public class ModelDOExample { private String typeHandler; - public String getCondition() { - return condition; - } - - public Object getValue() { - return value; - } - - public Object getSecondValue() { - return secondValue; - } - - public boolean isNoValue() { - return noValue; - } - - public boolean isSingleValue() { - return singleValue; - } - - public boolean isBetweenValue() { - return betweenValue; - } - - public boolean isListValue() { - return listValue; - } - - public String getTypeHandler() { - return typeHandler; - } - protected Criterion(String condition) { super(); this.condition = condition; @@ -1149,5 +1117,37 @@ public class ModelDOExample { protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ViewInfoDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ViewInfoDO.java index df10e714a..f33f463db 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ViewInfoDO.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ViewInfoDO.java @@ -3,14 +3,11 @@ package com.tencent.supersonic.semantic.model.domain.dataobject; import java.util.Date; public class ViewInfoDO { - /** - * */ private Long id; /** - * */ private Long modelId; @@ -20,22 +17,18 @@ public class ViewInfoDO { private String type; /** - * */ private Date createdAt; /** - * */ private String createdBy; /** - * */ private Date updatedAt; /** - * */ private String updatedBy; @@ -74,7 +67,6 @@ public class ViewInfoDO { /** * datasource、dimension、metric - * * @return type datasource、dimension、metric */ public String getType() { @@ -83,7 +75,6 @@ public class ViewInfoDO { /** * datasource、dimension、metric - * * @param type datasource、dimension、metric */ public void setType(String type) { @@ -148,7 +139,6 @@ public class ViewInfoDO { /** * config detail - * * @return config config detail */ public String getConfig() { @@ -157,10 +147,9 @@ public class ViewInfoDO { /** * config detail - * * @param config config detail */ public void setConfig(String config) { this.config = config == null ? null : config.trim(); } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ViewInfoDOExample.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ViewInfoDOExample.java index 912796161..e00972682 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ViewInfoDOExample.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ViewInfoDOExample.java @@ -672,38 +672,6 @@ public class ViewInfoDOExample { private String typeHandler; - public String getCondition() { - return condition; - } - - public Object getValue() { - return value; - } - - public Object getSecondValue() { - return secondValue; - } - - public boolean isNoValue() { - return noValue; - } - - public boolean isSingleValue() { - return singleValue; - } - - public boolean isBetweenValue() { - return betweenValue; - } - - public boolean isListValue() { - return listValue; - } - - public String getTypeHandler() { - return typeHandler; - } - protected Criterion(String condition) { super(); this.condition = condition; @@ -739,5 +707,37 @@ public class ViewInfoDOExample { protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } } -} \ No newline at end of file +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DomainConvert.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DomainConvert.java index 81a81743a..e453e5f6e 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DomainConvert.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DomainConvert.java @@ -3,17 +3,19 @@ package com.tencent.supersonic.semantic.model.domain.utils; import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.common.pojo.enums.StatusEnum; import com.tencent.supersonic.semantic.api.model.request.DomainReq; import com.tencent.supersonic.semantic.api.model.response.DimensionResp; import com.tencent.supersonic.semantic.api.model.response.DomainResp; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; import com.tencent.supersonic.semantic.api.model.response.MetricResp; import com.tencent.supersonic.semantic.model.domain.dataobject.DomainDO; import com.tencent.supersonic.semantic.model.domain.pojo.Domain; + import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; + import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; @@ -56,7 +58,8 @@ public class DomainConvert { } public static DomainResp convert(DomainDO domainDO, Map domainFullPathMap, - Map> dimensionMap, Map> metricMap) { + Map> dimensionMap, + Map> metricMap) { DomainResp domainResp = convert(domainDO, domainFullPathMap); domainResp.setDimensionCnt(dimensionMap.getOrDefault(domainResp.getId(), Lists.newArrayList()).size()); domainResp.setMetricCnt(metricMap.getOrDefault(domainResp.getId(), Lists.newArrayList()).size()); diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/MetricConverter.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/MetricConverter.java index 8ea77d952..9b6513d3a 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/MetricConverter.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/MetricConverter.java @@ -3,21 +3,22 @@ package com.tencent.supersonic.semantic.model.domain.utils; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.tencent.supersonic.common.pojo.DataFormat; -import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.semantic.api.model.pojo.Measure; import com.tencent.supersonic.semantic.api.model.pojo.MetricTypeParams; -import com.tencent.supersonic.semantic.api.model.request.MetricReq; -import com.tencent.supersonic.semantic.api.model.response.MetricResp; import com.tencent.supersonic.semantic.api.model.response.ModelResp; import com.tencent.supersonic.semantic.api.model.yaml.MeasureYamlTpl; import com.tencent.supersonic.semantic.api.model.yaml.MetricTypeParamsYamlTpl; import com.tencent.supersonic.semantic.api.model.yaml.MetricYamlTpl; +import com.tencent.supersonic.semantic.api.model.request.MetricReq; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; +import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.semantic.model.domain.dataobject.MetricDO; import com.tencent.supersonic.semantic.model.domain.pojo.Metric; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; + import org.springframework.beans.BeanUtils; public class MetricConverter { diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DimensionController.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DimensionController.java index a4dc762f4..4e3e851a2 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DimensionController.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DimensionController.java @@ -5,15 +5,14 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; import com.tencent.supersonic.semantic.api.model.request.DimensionReq; -import com.tencent.supersonic.semantic.api.model.request.MetricReq; import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; import com.tencent.supersonic.semantic.api.model.response.DimensionResp; import com.tencent.supersonic.semantic.model.domain.DimensionService; + import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import com.tencent.supersonic.semantic.model.domain.MetricService; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -27,14 +26,9 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/semantic/dimension") public class DimensionController { - private DimensionService dimensionService; - - private MetricService metricService; - - public DimensionController(DimensionService dimensionService,MetricService metricService) { - this.metricService = metricService; + public DimensionController(DimensionService dimensionService) { this.dimensionService = dimensionService; } @@ -46,8 +40,8 @@ public class DimensionController { */ @PostMapping("/createDimension") public Boolean createDimension(@RequestBody DimensionReq dimensionReq, - HttpServletRequest request, - HttpServletResponse response) throws Exception { + HttpServletRequest request, + HttpServletResponse response) throws Exception { User user = UserHolder.findUser(request, response); dimensionService.createDimension(dimensionReq, user); return true; @@ -56,8 +50,8 @@ public class DimensionController { @PostMapping("/updateDimension") public Boolean updateDimension(@RequestBody DimensionReq dimensionReq, - HttpServletRequest request, - HttpServletResponse response) throws Exception { + HttpServletRequest request, + HttpServletResponse response) throws Exception { User user = UserHolder.findUser(request, response); dimensionService.updateDimension(dimensionReq, user); return true; @@ -66,18 +60,18 @@ public class DimensionController { @PostMapping("/mockDimensionAlias") public List mockMetricAlias(@RequestBody DimensionReq dimensionReq, HttpServletRequest request, - HttpServletResponse response){ + HttpServletResponse response) { User user = UserHolder.findUser(request, response); - return dimensionService.mockAlias(dimensionReq,"dimension",user); + return dimensionService.mockAlias(dimensionReq, "dimension", user); } @PostMapping("/mockDimensionValuesAlias") public List mockDimensionValuesAlias(@RequestBody DimensionReq dimensionReq, HttpServletRequest request, - HttpServletResponse response){ + HttpServletResponse response) { User user = UserHolder.findUser(request, response); - return dimensionService.mockDimensionValueAlias(dimensionReq,user); + return dimensionService.mockDimensionValueAlias(dimensionReq, user); } @GetMapping("/getDimensionList/{modelId}") @@ -88,7 +82,7 @@ public class DimensionController { @GetMapping("/{modelId}/{dimensionName}") public DimensionResp getDimensionDescByNameAndId(@PathVariable("modelId") Long modelId, - @PathVariable("dimensionName") String dimensionBizName) { + @PathVariable("dimensionName") String dimensionBizName) { return dimensionService.getDimension(dimensionBizName, modelId); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/MetricController.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/MetricController.java index 7173ea637..99a164695 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/MetricController.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/MetricController.java @@ -12,8 +12,13 @@ import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.DeleteMapping; @RestController @@ -51,9 +56,9 @@ public class MetricController { @PostMapping("/mockMetricAlias") public List mockMetricAlias(@RequestBody MetricReq metricReq, HttpServletRequest request, - HttpServletResponse response){ + HttpServletResponse response) { User user = UserHolder.findUser(request, response); - return metricService.mockAlias(metricReq,"indicator",user); + return metricService.mockAlias(metricReq, "indicator", user); } @GetMapping("/getMetricList/{modelId}") diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/ModelController.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/ModelController.java index 1e9fa8d84..70089dd80 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/ModelController.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/ModelController.java @@ -6,18 +6,18 @@ import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.semantic.api.model.request.ModelReq; import com.tencent.supersonic.semantic.api.model.response.ModelResp; import com.tencent.supersonic.semantic.model.domain.ModelService; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.GetMapping; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; @RestController @@ -32,8 +32,8 @@ public class ModelController { @PostMapping("/createModel") public Boolean createModel(@RequestBody ModelReq modelReq, - HttpServletRequest request, - HttpServletResponse response) { + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); modelService.createModel(modelReq, user); return true; @@ -41,8 +41,8 @@ public class ModelController { @PostMapping("/updateModel") public Boolean updateModel(@RequestBody ModelReq modelReq, - HttpServletRequest request, - HttpServletResponse response) { + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); modelService.updateModel(modelReq, user); return true; @@ -56,8 +56,8 @@ public class ModelController { @GetMapping("/getModelList/{domainId}") public List getModelList(@PathVariable("domainId") Long domainId, - HttpServletRequest request, - HttpServletResponse response) { + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return modelService.getModelListWithAuth(user.getName(), domainId, AuthType.ADMIN); } diff --git a/semantic/model/src/main/resources/mapper/custom/MetricDOCustomMapper.xml b/semantic/model/src/main/resources/mapper/custom/MetricDOCustomMapper.xml index ac2c20e72..c13927100 100644 --- a/semantic/model/src/main/resources/mapper/custom/MetricDOCustomMapper.xml +++ b/semantic/model/src/main/resources/mapper/custom/MetricDOCustomMapper.xml @@ -119,7 +119,7 @@ and biz_name like CONCAT('%',#{bizName , jdbcType=VARCHAR},'%') - + and sensitive_level = #{sensitiveLevel} diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/Renderer.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/Renderer.java index 53698e782..32cc7839d 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/Renderer.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/Renderer.java @@ -79,7 +79,6 @@ public abstract class Renderer { if (measure.get().getConstraint() != null && !measure.get().getConstraint().isEmpty()) { metricNode.getMeasureFilter() .put(measure.get().getName(), SemanticNode.parse(measure.get().getConstraint(), scope)); - ; } } return metricNode; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/node/DataSourceNode.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/node/DataSourceNode.java index 58e61ed7a..95ac6ed6b 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/node/DataSourceNode.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/node/DataSourceNode.java @@ -7,6 +7,7 @@ import com.tencent.supersonic.semantic.query.parser.calcite.dsl.Constants; import com.tencent.supersonic.semantic.query.parser.calcite.dsl.DataSource; import com.tencent.supersonic.semantic.query.parser.calcite.dsl.Dimension; import com.tencent.supersonic.semantic.query.parser.calcite.schema.SemanticSchema; + import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; @@ -17,6 +18,7 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; + import lombok.extern.slf4j.Slf4j; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.parser.SqlParser; @@ -50,7 +52,7 @@ public class DataSourceNode extends SemanticNode { } public static void getQueryDimensionMeasure(SemanticSchema schema, MetricReq metricCommand, - Set queryDimension, List measures) { + Set queryDimension, List measures) { queryDimension.addAll(metricCommand.getDimensions().stream() .map(d -> d.contains(Constants.DIMENSION_IDENTIFY) ? d.split(Constants.DIMENSION_IDENTIFY)[1] : d) .collect(Collectors.toSet())); @@ -62,17 +64,18 @@ public class DataSourceNode extends SemanticNode { } public static void mergeQueryFilterDimensionMeasure(SemanticSchema schema, MetricReq metricCommand, - Set queryDimension, List measures, SqlValidatorScope scope) throws Exception { + Set queryDimension, List measures, + SqlValidatorScope scope) throws Exception { if (Objects.nonNull(metricCommand.getWhere()) && !metricCommand.getWhere().isEmpty()) { Set filterConditions = new HashSet<>(); FilterNode.getFilterField(parse(metricCommand.getWhere(), scope), filterConditions); Set queryMeasures = new HashSet<>(measures); - Set schemaMetricName = schema.getMetrics().stream().map(m -> m.getName()) - .collect(Collectors.toSet()); + Set schemaMetricName = schema.getMetrics().stream() + .map(m -> m.getName()).collect(Collectors.toSet()); for (String filterCondition : filterConditions) { if (schemaMetricName.contains(filterCondition)) { - schema.getMetrics().stream().filter(m -> m.getName().equalsIgnoreCase(filterCondition)).forEach( - m -> m.getMetricTypeParams().getMeasures().stream() + schema.getMetrics().stream().filter(m -> m.getName().equalsIgnoreCase(filterCondition)) + .forEach(m -> m.getMetricTypeParams().getMeasures().stream() .forEach(mm -> queryMeasures.add(mm.getName()))); continue; } @@ -84,14 +87,13 @@ public class DataSourceNode extends SemanticNode { } public static List getMatchDataSources(SqlValidatorScope scope, SemanticSchema schema, - MetricReq metricCommand) throws Exception { + MetricReq metricCommand) throws Exception { List dataSources = new ArrayList<>(); // check by metric List measures = new ArrayList<>(); Set queryDimension = new HashSet<>(); getQueryDimensionMeasure(schema, metricCommand, queryDimension, measures); - String sourceName = ""; DataSource baseDataSource = null; // one , match measure count Map dataSourceMeasures = new HashMap<>(); @@ -148,8 +150,12 @@ public class DataSourceNode extends SemanticNode { return dataSources; } - private static boolean checkMatch(Set sourceMeasure, Set queryDimension, List measures, - Set dimension, MetricReq metricCommand, SqlValidatorScope scope) throws Exception { + private static boolean checkMatch(Set sourceMeasure, + Set queryDimension, + List measures, + Set dimension, + MetricReq metricCommand, + SqlValidatorScope scope) throws Exception { boolean isAllMatch = true; sourceMeasure.retainAll(measures); if (sourceMeasure.size() < measures.size()) { @@ -173,8 +179,11 @@ public class DataSourceNode extends SemanticNode { return isAllMatch; } - private static List getLinkDataSources(Set baseIdentifiers, Set queryDimension, - List measures, DataSource baseDataSource, SemanticSchema schema) { + private static List getLinkDataSources(Set baseIdentifiers, + Set queryDimension, + List measures, + DataSource baseDataSource, + SemanticSchema schema) { Set linkDataSourceName = new HashSet<>(); List linkDataSources = new ArrayList<>(); for (Map.Entry entry : schema.getDatasource().entrySet()) { @@ -200,7 +209,6 @@ public class DataSourceNode extends SemanticNode { linkMeasure.retainAll(measures); if (!linkMeasure.isEmpty()) { isMatch = true; - ; } } if (isMatch) { diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/CalculateAggConverter.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/CalculateAggConverter.java index e8739721d..1c6552578 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/CalculateAggConverter.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/CalculateAggConverter.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -106,10 +105,7 @@ public class CalculateAggConverter implements SemanticConverter { if (CollectionUtils.isEmpty(queryStructCmd.getAggregators())) { return false; } - //todo ck类型暂不拼with语句 - if (queryStructCmd.getModelId().equals(34L)) { - return false; - } + int nonSumFunction = 0; for (Aggregator agg : queryStructCmd.getAggregators()) { if (agg.getFunc() == null || "".equals(agg.getFunc())) { @@ -118,9 +114,7 @@ public class CalculateAggConverter implements SemanticConverter { if (agg.getFunc().equals(AggOperatorEnum.UNKNOWN)) { return false; } - if (agg.getFunc() != null - // && !agg.getFunc().equalsIgnoreCase(MetricAggDefault) - ) { + if (agg.getFunc() != null) { nonSumFunction++; } } @@ -129,7 +123,7 @@ public class CalculateAggConverter implements SemanticConverter { @Override public void converter(Catalog catalog, QueryStructReq queryStructCmd, ParseSqlReq sqlCommend, - MetricReq metricCommand) throws Exception { + MetricReq metricCommand) throws Exception { DatabaseResp databaseResp = catalog.getDatabaseByModelId(queryStructCmd.getModelId()); ParseSqlReq parseSqlReq = generateSqlCommend(queryStructCmd, EngineTypeEnum.valueOf(databaseResp.getType().toUpperCase()), databaseResp.getVersion()); @@ -156,7 +150,7 @@ public class CalculateAggConverter implements SemanticConverter { } public ParseSqlReq generateRatioSqlCommand(QueryStructReq queryStructCmd, EngineTypeEnum engineTypeEnum, - String version) + String version) throws Exception { check(queryStructCmd); ParseSqlReq sqlCommand = new ParseSqlReq(); @@ -178,15 +172,17 @@ public class CalculateAggConverter implements SemanticConverter { sql = new H2EngineSql().sql(queryStructCmd, isOver, metricTableName); break; case MYSQL: - if (Objects.nonNull(version) && version.startsWith(mysqlLowVersion)) { - sqlCommand.setSupportWith(false); - sql = new MysqlEngineSql().sql(queryStructCmd, isOver, metricTableName); - break; - } case DORIS: case CLICKHOUSE: - sql = new CkEngineSql().sql(queryStructCmd, isOver, metricTableName); + if (engineTypeEnum.equals(EngineTypeEnum.MYSQL) && Objects.nonNull(version) && version.startsWith( + mysqlLowVersion)) { + sqlCommand.setSupportWith(false); + sql = new MysqlEngineSql().sql(queryStructCmd, isOver, metricTableName); + } else { + sql = new CkEngineSql().sql(queryStructCmd, isOver, metricTableName); + } break; + default: } sqlCommand.setSql(sql); return sqlCommand; @@ -275,7 +271,7 @@ public class CalculateAggConverter implements SemanticConverter { String aggStr = queryStructCmd.getAggregators().stream().map(f -> { if (f.getFunc().equals(AggOperatorEnum.RATIO_OVER) || f.getFunc().equals(AggOperatorEnum.RATIO_ROLL)) { if (queryStructCmd.getDateInfo().getPeriod().equals(Constants.MONTH)) { - return String.format("toDate(CONCAT(%s,'-01')) = date_add(toDate(CONCAT(%s','-01')),%s) ", + return String.format("toDate(CONCAT(%s,'-01')) = date_add(toDate(CONCAT(%s,'-01')),%s) ", aliasLeft + timeDim, aliasRight + timeDim, timeSpan); } if (queryStructCmd.getDateInfo().getPeriod().equals(Constants.WEEK) && isOver) { @@ -302,7 +298,8 @@ public class CalculateAggConverter implements SemanticConverter { @Override public String sql(QueryStructReq queryStructCmd, boolean isOver, String metricSql) { String sql = String.format( - ",t0 as (select * from %s),t1 as (select * from %s) select %s from ( select %s , %s from t0 left join t1 on %s ) metric_tb_src %s %s ", + ",t0 as (select * from %s),t1 as (select * from %s) select %s from ( select %s , %s " + + "from t0 left join t1 on %s ) metric_tb_src %s %s ", metricSql, metricSql, getOverSelect(queryStructCmd, isOver), getAllSelect(queryStructCmd, "t0."), getAllJoinSelect(queryStructCmd, "t1."), getJoinOn(queryStructCmd, isOver, "t0.", "t1."), @@ -330,8 +327,6 @@ public class CalculateAggConverter implements SemanticConverter { } public String getOverSelect(QueryStructReq queryStructCmd, boolean isOver) { - String timeDim = getTimeDim(queryStructCmd); - String timeSpan = "INTERVAL " + getTimeSpan(queryStructCmd, isOver, true); String aggStr = queryStructCmd.getAggregators().stream().map(f -> { if (f.getFunc().equals(AggOperatorEnum.RATIO_OVER) || f.getFunc().equals(AggOperatorEnum.RATIO_ROLL)) { return String.format( @@ -460,9 +455,6 @@ public class CalculateAggConverter implements SemanticConverter { } private void check(QueryStructReq queryStructCmd) throws Exception { - Set aggFunctions = queryStructCmd.getAggregators().stream() - .filter(f -> f.getArgs() != null && f.getArgs().get(0) != null) - .map(agg -> agg.getArgs().get(0).toLowerCase()).collect(Collectors.toSet()); Long ratioOverNum = queryStructCmd.getAggregators().stream() .filter(f -> f.getFunc().equals(AggOperatorEnum.RATIO_OVER)).count(); Long ratioRollNum = queryStructCmd.getAggregators().stream() diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/DefaultDimValueConverter.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/DefaultDimValueConverter.java index d6de703ad..b362306d1 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/DefaultDimValueConverter.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/DefaultDimValueConverter.java @@ -8,11 +8,11 @@ import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; import com.tencent.supersonic.semantic.model.domain.Catalog; import com.tencent.supersonic.semantic.query.parser.SemanticConverter; -import java.util.List; -import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import java.util.List; +import java.util.stream.Collectors; @Slf4j @Component("DefaultDimValueConverter") @@ -24,8 +24,8 @@ public class DefaultDimValueConverter implements SemanticConverter { } @Override - public void converter(Catalog catalog, QueryStructReq queryStructCmd, ParseSqlReq sqlCommend, - MetricReq metricCommand) throws Exception { + public void converter(Catalog catalog, QueryStructReq queryStructCmd, + ParseSqlReq sqlCommend, MetricReq metricCommand) throws Exception { List dimensionResps = catalog.getDimensions(queryStructCmd.getModelId()); //dimension which has default values dimensionResps = dimensionResps.stream() diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/MultiSourceJoin.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/MultiSourceJoin.java index 08ac6e0cc..5cb1039c3 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/MultiSourceJoin.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/MultiSourceJoin.java @@ -132,6 +132,4 @@ public class MultiSourceJoin implements SemanticConverter { MetricReq metricCommand) throws Exception { buildJoinPrefix(queryStructCmd); } - - } diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/ParserDefaultConverter.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/ParserDefaultConverter.java index e2f44efec..3329d7847 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/ParserDefaultConverter.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/ParserDefaultConverter.java @@ -1,9 +1,6 @@ package com.tencent.supersonic.semantic.query.parser.convert; -import static com.tencent.supersonic.common.pojo.Constants.UNDERLINE; - import com.tencent.supersonic.common.pojo.ColumnOrder; -import com.tencent.supersonic.semantic.api.model.response.DimensionResp; import com.tencent.supersonic.semantic.api.query.pojo.Param; import com.tencent.supersonic.semantic.api.query.request.MetricReq; import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq; @@ -13,9 +10,7 @@ import com.tencent.supersonic.semantic.query.parser.SemanticConverter; import com.tencent.supersonic.semantic.query.utils.QueryStructUtils; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; -import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; @@ -68,7 +63,8 @@ public class ParserDefaultConverter implements SemanticConverter { // todo tmp delete // support detail query if (queryStructCmd.getNativeQuery() && CollectionUtils.isEmpty(sqlCommend.getMetrics())) { - String internalMetricName = queryStructUtils.generateInternalMetricName(queryStructCmd.getModelId(), queryStructCmd.getGroups()); + String internalMetricName = queryStructUtils.generateInternalMetricName( + queryStructCmd.getModelId(), queryStructCmd.getGroups()); sqlCommend.getMetrics().add(internalMetricName); } diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/rest/QueryController.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/rest/QueryController.java index faf5adb5d..2a124c05f 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/rest/QueryController.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/rest/QueryController.java @@ -3,15 +3,15 @@ package com.tencent.supersonic.semantic.query.rest; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; import com.tencent.supersonic.semantic.api.model.response.SqlParserResp; -import com.tencent.supersonic.semantic.api.query.request.ItemUseReq; -import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq; import com.tencent.supersonic.semantic.api.query.request.QueryDslReq; -import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; +import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; +import com.tencent.supersonic.semantic.api.query.request.ItemUseReq; import com.tencent.supersonic.semantic.api.query.response.ItemUseResp; -import com.tencent.supersonic.semantic.query.persistence.pojo.QueryStatement; -import com.tencent.supersonic.semantic.query.service.QueryService; import com.tencent.supersonic.semantic.query.service.SemanticQueryEngine; +import com.tencent.supersonic.semantic.query.service.QueryService; +import com.tencent.supersonic.semantic.query.persistence.pojo.QueryStatement; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -57,7 +57,6 @@ public class QueryController { public SqlParserResp parseByStruct(@RequestBody ParseSqlReq parseSqlReq, HttpServletRequest request, HttpServletResponse response) throws Exception { - User user = UserHolder.findUser(request, response); QueryStatement queryStatement = semanticQueryEngine.physicalSql(parseSqlReq); SqlParserResp sqlParserResp = new SqlParserResp(); BeanUtils.copyProperties(queryStatement, sqlParserResp); diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/rest/SchemaController.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/rest/SchemaController.java index d3d3951fd..7c10021aa 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/rest/SchemaController.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/rest/SchemaController.java @@ -7,22 +7,22 @@ import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.semantic.api.model.request.ModelSchemaFilterReq; import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; -import com.tencent.supersonic.semantic.api.model.response.DimensionResp; -import com.tencent.supersonic.semantic.api.model.response.DomainResp; -import com.tencent.supersonic.semantic.api.model.response.MetricResp; -import com.tencent.supersonic.semantic.api.model.response.ModelResp; import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; +import com.tencent.supersonic.semantic.api.model.response.ModelResp; +import com.tencent.supersonic.semantic.api.model.response.DimensionResp; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; import com.tencent.supersonic.semantic.query.service.SchemaService; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; @RestController @RequestMapping("/api/semantic/schema") @@ -33,24 +33,24 @@ public class SchemaController { @PostMapping public List fetchModelSchema(@RequestBody ModelSchemaFilterReq filter, - HttpServletRequest request, - HttpServletResponse response) { + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return schemaService.fetchModelSchema(filter, user); } @GetMapping("/domain/list") public List getDomainList(HttpServletRequest request, - HttpServletResponse response) { + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return schemaService.getDomainList(user); } @GetMapping("/model/list") public List getModelList(@RequestParam("domainId") Long domainId, - @RequestParam("authType") String authType, - HttpServletRequest request, - HttpServletResponse response) { + @RequestParam("authType") String authType, + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return schemaService.getModelList(user, AuthType.valueOf(authType), domainId); } @@ -71,4 +71,4 @@ public class SchemaController { return schemaService.queryMetric(pageMetricCmd, user); } -} \ No newline at end of file +} diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/QueryServiceImpl.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/QueryServiceImpl.java index 414fb7d6d..aa47d6bbc 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/QueryServiceImpl.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/QueryServiceImpl.java @@ -2,9 +2,8 @@ package com.tencent.supersonic.semantic.query.service; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; -import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.cache.CacheUtils; -import com.tencent.supersonic.semantic.api.model.pojo.QueryStat; +import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.semantic.api.model.request.ModelSchemaFilterReq; import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SchemaService.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SchemaService.java index ccf903e41..69610380b 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SchemaService.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SchemaService.java @@ -6,11 +6,12 @@ import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.semantic.api.model.request.ModelSchemaFilterReq; import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; -import com.tencent.supersonic.semantic.api.model.response.DimensionResp; -import com.tencent.supersonic.semantic.api.model.response.DomainResp; -import com.tencent.supersonic.semantic.api.model.response.MetricResp; -import com.tencent.supersonic.semantic.api.model.response.ModelResp; import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.DimensionResp; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; +import com.tencent.supersonic.semantic.api.model.response.ModelResp; + import java.util.List; public interface SchemaService { diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SchemaServiceImpl.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SchemaServiceImpl.java index 7f105efd9..68058404b 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SchemaServiceImpl.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SchemaServiceImpl.java @@ -5,23 +5,23 @@ import static com.tencent.supersonic.common.pojo.Constants.AT_SYMBOL; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.common.pojo.enums.AuthType; -import com.tencent.supersonic.common.pojo.enums.TypeEnums; import com.tencent.supersonic.semantic.api.model.request.ModelSchemaFilterReq; import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; -import com.tencent.supersonic.semantic.api.model.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.model.response.DimensionResp; -import com.tencent.supersonic.semantic.api.model.response.DomainResp; -import com.tencent.supersonic.semantic.api.model.response.MetricResp; -import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; -import com.tencent.supersonic.semantic.api.model.response.ModelResp; import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.MetricResp; +import com.tencent.supersonic.semantic.api.model.response.ModelResp; +import com.tencent.supersonic.semantic.api.model.response.DimensionResp; +import com.tencent.supersonic.semantic.api.model.response.DimSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; import com.tencent.supersonic.semantic.api.query.request.ItemUseReq; import com.tencent.supersonic.semantic.api.query.response.ItemUseResp; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; import com.tencent.supersonic.semantic.model.domain.DimensionService; import com.tencent.supersonic.semantic.model.domain.DomainService; -import com.tencent.supersonic.semantic.model.domain.MetricService; import com.tencent.supersonic.semantic.model.domain.ModelService; +import com.tencent.supersonic.semantic.model.domain.MetricService; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -40,10 +40,10 @@ public class SchemaServiceImpl implements SchemaService { private final DomainService domainService; public SchemaServiceImpl(QueryService queryService, - ModelService modelService, - DimensionService dimensionService, - MetricService metricService, - DomainService domainService) { + ModelService modelService, + DimensionService dimensionService, + MetricService metricService, + DomainService domainService) { this.queryService = queryService; this.modelService = modelService; this.dimensionService = dimensionService; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DataPermissionAOP.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DataPermissionAOP.java index d7f5cfd49..986275e74 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DataPermissionAOP.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DataPermissionAOP.java @@ -12,23 +12,20 @@ import com.tencent.supersonic.auth.api.authorization.pojo.DimensionFilter; import com.tencent.supersonic.auth.api.authorization.request.QueryAuthResReq; import com.tencent.supersonic.auth.api.authorization.response.AuthorizedResourceResp; import com.tencent.supersonic.auth.api.authorization.service.AuthService; -import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.QueryAuthorization; import com.tencent.supersonic.common.pojo.QueryColumn; import com.tencent.supersonic.common.pojo.enums.AuthType; -import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException; -import com.tencent.supersonic.common.pojo.exception.InvalidPermissionException; import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.ModelResp; import com.tencent.supersonic.semantic.api.model.response.DimensionResp; import com.tencent.supersonic.semantic.api.model.response.MetricResp; -import com.tencent.supersonic.semantic.api.model.response.ModelResp; -import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import com.tencent.supersonic.semantic.api.query.pojo.Filter; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; -import com.tencent.supersonic.semantic.model.domain.DimensionService; -import com.tencent.supersonic.semantic.model.domain.MetricService; -import com.tencent.supersonic.semantic.model.domain.ModelService; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException; +import com.tencent.supersonic.common.pojo.exception.InvalidPermissionException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; @@ -39,13 +36,16 @@ import java.util.Objects; import java.util.Set; import java.util.StringJoiner; import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; +import com.tencent.supersonic.semantic.model.domain.DimensionService; +import com.tencent.supersonic.semantic.model.domain.MetricService; +import com.tencent.supersonic.semantic.model.domain.ModelService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; +import org.assertj.core.util.Sets; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -133,14 +133,14 @@ public class DataPermissionAOP { .collect(Collectors.toSet()); QueryResultWithSchemaResp queryResultAfterDesensitization = desensitizationData(queryResultWithColumns, need2Apply); - addPromptInfoInfo(modelId, queryResultAfterDesensitization, authorizedResource); + addPromptInfoInfo(modelId, queryResultAfterDesensitization, authorizedResource, need2Apply); return queryResultAfterDesensitization; } - private boolean doModelAdmin(User user, QueryStructReq queryStructCmd) { - Long modelId = queryStructCmd.getModelId(); + private boolean doModelAdmin(User user, QueryStructReq queryStructReq) { + Long modelId = queryStructReq.getModelId(); List modelListAdmin = modelService.getModelListWithAuth(user.getName(), null, AuthType.ADMIN); if (CollectionUtils.isEmpty(modelListAdmin)) { return false; @@ -151,69 +151,60 @@ public class DataPermissionAOP { } } - private void doModelVisible(User user, QueryStructReq queryStructCmd) { + private void doModelVisible(User user, QueryStructReq queryStructReq) { Boolean visible = true; - Long domainId = queryStructCmd.getModelId(); + Long modelId = queryStructReq.getModelId(); List modelListVisible = modelService.getModelListWithAuth(user.getName(), null, AuthType.VISIBLE); if (CollectionUtils.isEmpty(modelListVisible)) { visible = false; } else { Map> id2domainDesc = modelListVisible.stream() .collect(Collectors.groupingBy(SchemaItem::getId)); - if (!CollectionUtils.isEmpty(id2domainDesc) && !id2domainDesc.containsKey(domainId)) { + if (!CollectionUtils.isEmpty(id2domainDesc) && !id2domainDesc.containsKey(modelId)) { visible = false; } } - if (!visible) { - List modelIds = new ArrayList<>(); - modelIds.add(domainId); - List modelInfos = modelService.getModelList(modelIds); - if (CollectionUtils.isEmpty(modelInfos)) { - throw new InvalidArgumentException( - "invalid domainId:" + domainId + ", please contact admin for details"); - } - String domainName = modelInfos.get(0).getName(); - throw new InvalidPermissionException( - "You do not have domain:" + domainName + " permission, please contact admin for details"); - + ModelResp modelResp = modelService.getModel(modelId); + String modelName = modelResp.getName(); + List admins = modelService.getModelAdmin(modelResp.getId()); + String message = String.format("您没有主题域[%s]权限,请联系管理员%s开通", modelName, admins); + throw new InvalidArgumentException(message); } } private QueryResultWithSchemaResp getQueryResultWithColumns(QueryResultWithSchemaResp resultWithColumns, Long domainId, AuthorizedResourceResp authResource) { - addPromptInfoInfo(domainId, resultWithColumns, authResource); + addPromptInfoInfo(domainId, resultWithColumns, authResource, Sets.newHashSet()); return resultWithColumns; } - private void addPromptInfoInfo(Long domainId, QueryResultWithSchemaResp queryResultWithColumns, - AuthorizedResourceResp authorizedResource) { + private void addPromptInfoInfo(Long modelId, QueryResultWithSchemaResp queryResultWithColumns, + AuthorizedResourceResp authorizedResource, Set need2Apply) { List filters = authorizedResource.getFilters(); + if (CollectionUtils.isEmpty(need2Apply) && CollectionUtils.isEmpty(filters)) { + return; + } + List admins = modelService.getModelAdmin(modelId); + if (!CollectionUtils.isEmpty(need2Apply)) { + String promptInfo = String.format("当前结果已经过脱敏处理, 申请权限请联系管理员%s", admins); + queryResultWithColumns.setQueryAuthorization(new QueryAuthorization(promptInfo)); + } if (!CollectionUtils.isEmpty(filters)) { log.debug("dimensionFilters:{}", filters); - - List modelIds = new ArrayList<>(); - modelIds.add(domainId); - List modelInfos = modelService.getModelList(modelIds); - String modelNameCn = ""; - if (!CollectionUtils.isEmpty(modelInfos)) { - modelNameCn = modelInfos.get(0).getName(); - } - + ModelResp modelResp = modelService.getModel(modelId); List exprList = new ArrayList<>(); List descList = new ArrayList<>(); filters.stream().forEach(filter -> { descList.add(filter.getDescription()); exprList.add(filter.getExpressions().toString()); }); - - String promptInfo = "the current data has been controlled by permissions," - + " related information:%s, please contact admin for details"; - String message = String.format(promptInfo, CollectionUtils.isEmpty(descList) ? exprList : descList); + String promptInfo = "当前结果已经过行权限过滤,详细过滤条件如下:%s, 申请权限请联系管理员%s"; + String message = String.format(promptInfo, CollectionUtils.isEmpty(descList) ? exprList : descList, admins); queryResultWithColumns.setQueryAuthorization( - new QueryAuthorization(modelNameCn, exprList, descList, message)); + new QueryAuthorization(modelResp.getName(), exprList, descList, message)); log.info("queryResultWithColumns:{}", queryResultWithColumns); } } @@ -292,7 +283,7 @@ public class DataPermissionAOP { return highSensitiveCols; } - private void doRowPermission(QueryStructReq queryStructCmd, AuthorizedResourceResp authorizedResource) { + private void doRowPermission(QueryStructReq queryStructReq, AuthorizedResourceResp authorizedResource) { log.debug("start doRowPermission logic"); StringJoiner joiner = new StringJoiner(" OR "); List dimensionFilters = new ArrayList<>(); @@ -313,13 +304,13 @@ public class DataPermissionAOP { }); if (StringUtils.isNotEmpty(joiner.toString())) { - log.info("before doRowPermission, queryStructCmd:{}", queryStructCmd); + log.info("before doRowPermission, queryStructReq:{}", queryStructReq); Filter filter = new Filter("", FilterOperatorEnum.SQL_PART, joiner.toString()); - List filters = Objects.isNull(queryStructCmd.getOriginalFilter()) ? new ArrayList<>() - : queryStructCmd.getOriginalFilter(); + List filters = Objects.isNull(queryStructReq.getOriginalFilter()) ? new ArrayList<>() + : queryStructReq.getOriginalFilter(); filters.add(filter); - queryStructCmd.setDimensionFilters(filters); - log.info("after doRowPermission, queryStructCmd:{}", queryStructCmd); + queryStructReq.setDimensionFilters(filters); + log.info("after doRowPermission, queryStructReq:{}", queryStructReq); } } @@ -348,7 +339,7 @@ public class DataPermissionAOP { try { queryResultWithColumns = deepCopyResult(raw); } catch (Exception e) { - log.warn("deepCopyResult, e:{}", e); + log.warn("deepCopyResult: ", e); } addAuthorizedSchemaInfo(queryResultWithColumns.getColumns(), need2Apply); desensitizationInternal(queryResultWithColumns.getResultList(), need2Apply); @@ -382,30 +373,32 @@ public class DataPermissionAOP { } } - private void doFilterCheckLogic(QueryStructReq queryStructCmd, Set resAuthName, + private void doFilterCheckLogic(QueryStructReq queryStructReq, Set resAuthName, Set sensitiveResReq) { - Set resFilterSet = queryStructUtils.getFilterResNameEnExceptInternalCol(queryStructCmd); + Set resFilterSet = queryStructUtils.getFilterResNameEnExceptInternalCol(queryStructReq); Set need2Apply = resFilterSet.stream() .filter(res -> !resAuthName.contains(res) && sensitiveResReq.contains(res)).collect(Collectors.toSet()); Set nameCnSet = new HashSet<>(); List modelIds = new ArrayList<>(); - modelIds.add(queryStructCmd.getModelId()); + modelIds.add(queryStructReq.getModelId()); List modelInfos = modelService.getModelList(modelIds); String modelNameCn = Constants.EMPTY; if (!CollectionUtils.isEmpty(modelInfos)) { modelNameCn = modelInfos.get(0).getName(); } - List dimensionDescList = dimensionService.getDimensions(queryStructCmd.getModelId()); + List dimensionDescList = dimensionService.getDimensions(queryStructReq.getModelId()); String finalDomainNameCn = modelNameCn; dimensionDescList.stream().filter(dim -> need2Apply.contains(dim.getBizName())) .forEach(dim -> nameCnSet.add(finalDomainNameCn + MINUS + dim.getName())); if (!CollectionUtils.isEmpty(need2Apply)) { - log.warn("in doFilterLogic, need2Apply:{}", need2Apply); - throw new InvalidPermissionException( - "you do not have data permission:" + nameCnSet + ", please contact admin for details"); + ModelResp modelResp = modelInfos.get(0); + List admins = modelService.getModelAdmin(modelResp.getId()); + log.info("in doFilterLogic, need2Apply:{}", need2Apply); + String message = String.format("您没有以下维度%s权限, 请联系管理员%s开通", nameCnSet, admins); + throw new InvalidPermissionException(message); } } @@ -415,4 +408,4 @@ public class DataPermissionAOP { return authService.queryAuthorizedResources(queryAuthResReq, user); } -} \ No newline at end of file +} diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DateUtils.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DateUtils.java index 308f671b5..a7c0d53cd 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DateUtils.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DateUtils.java @@ -202,6 +202,19 @@ public class DateUtils { * @return */ public String betweenDateStr(ItemDateResp dateDate, DateConf dateInfo) { + if (MONTH.equalsIgnoreCase(dateInfo.getPeriod())) { + LocalDate endData = LocalDate.parse(dateInfo.getEndDate(), + DateTimeFormatter.ofPattern(DAY_FORMAT)); + LocalDate startData = LocalDate.parse(dateInfo.getStartDate(), + DateTimeFormatter.ofPattern(DAY_FORMAT)); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(MONTH_FORMAT); + return String.format("%s >= '%s' and %s <= '%s'", + sysDateMonthCol, startData.format(formatter), sysDateMonthCol, endData.format(formatter)); + } + if (WEEK.equalsIgnoreCase(dateInfo.getPeriod())) { + return String.format("%s >= '%s' and %s <= '%s'", + sysDateWeekCol, dateInfo.getStartDate(), sysDateWeekCol, dateInfo.getEndDate()); + } return String.format("%s >= '%s' and %s <= '%s'", sysDateCol, dateInfo.getStartDate(), sysDateCol, dateInfo.getEndDate()); } diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DimValueAspect.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DimValueAspect.java index a37c2a704..e3f363a90 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DimValueAspect.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DimValueAspect.java @@ -7,12 +7,6 @@ import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaR import com.tencent.supersonic.semantic.api.query.pojo.Filter; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; import com.tencent.supersonic.semantic.model.domain.DimensionService; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; import org.aspectj.lang.ProceedingJoinPoint; @@ -23,6 +17,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; + @Aspect @Component @Slf4j @@ -34,9 +35,9 @@ public class DimValueAspect { @Autowired private DimensionService dimensionService; - @Around("execution(* com.tencent.supersonic.semantic.query.rest.QueryController.queryByStruct(..))" + - " || execution(* com.tencent.supersonic.semantic.query.service.QueryService.queryByStruct(..))" + - " || execution(* com.tencent.supersonic.semantic.query.service.QueryService.queryByStructWithAuth(..))") + @Around("execution(* com.tencent.supersonic.semantic.query.rest.QueryController.queryByStruct(..))" + + " || execution(* com.tencent.supersonic.semantic.query.service.QueryService.queryByStruct(..))" + + " || execution(* com.tencent.supersonic.semantic.query.service.QueryService.queryByStructWithAuth(..))") public Object handleDimValue(ProceedingJoinPoint joinPoint) throws Throwable { if (!dimensionValueMapEnable) { @@ -65,15 +66,15 @@ public class DimValueAspect { } private void rewriteDimValue(QueryResultWithSchemaResp queryResultWithColumns, - Map> dimAndTechNameAndBizNamePair) { + Map> dimAndTechNameAndBizNamePair) { if (!selectDimValueMap(queryResultWithColumns.getColumns(), dimAndTechNameAndBizNamePair)) { return; } log.debug("start rewriteDimValue for resultList"); for (Map line : queryResultWithColumns.getResultList()) { for (String bizName : line.keySet()) { - String techName = line.get(bizName).toString(); - if (dimAndTechNameAndBizNamePair.containsKey(bizName)) { + if (dimAndTechNameAndBizNamePair.containsKey(bizName) && Objects.nonNull(line.get(bizName))) { + String techName = line.get(bizName).toString(); Map techAndBizPair = dimAndTechNameAndBizNamePair.get(bizName); if (!CollectionUtils.isEmpty(techAndBizPair) && techAndBizPair.containsKey(techName)) { String bizValueName = techAndBizPair.get(techName); @@ -86,10 +87,10 @@ public class DimValueAspect { } } - private boolean selectDimValueMap(List columns, - Map> dimAndTechNameAndBizNamePair) { - if (CollectionUtils.isEmpty(dimAndTechNameAndBizNamePair) || CollectionUtils.isEmpty( - dimAndTechNameAndBizNamePair)) { + private boolean selectDimValueMap(List columns, Map> dimAndTechNameAndBizNamePair) { + if (CollectionUtils.isEmpty(dimAndTechNameAndBizNamePair) + || CollectionUtils.isEmpty(dimAndTechNameAndBizNamePair)) { return false; } @@ -118,9 +119,11 @@ public class DimValueAspect { List values = (List) value; List valuesNew = new ArrayList<>(); for (String valueSingle : values) { - boolean f = - aliasPair.containsKey(valueSingle) ? valuesNew.add(aliasPair.get(valueSingle)) - : valuesNew.add(valueSingle); + if (aliasPair.containsKey(valueSingle)) { + valuesNew.add(aliasPair.get(valueSingle)); + } else { + valuesNew.add(valueSingle); + } } filter.setValue(valuesNew); } @@ -138,9 +141,9 @@ public class DimValueAspect { } } - private void generateAliasAndTechNamePair(List dimensions - , Map> dimAndAliasAndTechNamePair - , Map> dimAndTechNameAndBizNamePair) { + private void generateAliasAndTechNamePair(List dimensions, + Map> dimAndAliasAndTechNamePair, + Map> dimAndTechNameAndBizNamePair) { if (CollectionUtils.isEmpty(dimensions)) { return; } @@ -184,4 +187,4 @@ public class DimValueAspect { }); } -} \ No newline at end of file +} diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryReqConverter.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryReqConverter.java index 6bcb6738c..d04a33110 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryReqConverter.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryReqConverter.java @@ -1,6 +1,6 @@ package com.tencent.supersonic.semantic.query.utils; -import com.tencent.supersonic.common.util.jsqlparser.CCJSqlParserUtils; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper; import com.tencent.supersonic.semantic.api.model.request.SqlExecuteReq; import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; import com.tencent.supersonic.semantic.api.query.pojo.MetricTable; @@ -38,8 +38,8 @@ public class QueryReqConverter { MetricTable metricTable = new MetricTable(); String sql = databaseReq.getSql(); - List allFields = CCJSqlParserUtils.getAllFields(sql); - String tableName = CCJSqlParserUtils.getTableName(sql); + List allFields = SqlParserSelectHelper.getAllFields(sql); + String tableName = SqlParserSelectHelper.getTableName(sql); if (CollectionUtils.isEmpty(domainSchemas) || StringUtils.isEmpty(tableName)) { return new QueryStatement(); diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryStructUtils.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryStructUtils.java index 4c1ede9f8..a13a2907d 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryStructUtils.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryStructUtils.java @@ -33,17 +33,14 @@ import org.springframework.util.CollectionUtils; @Slf4j @Component public class QueryStructUtils { - + public static Set internalCols = new HashSet<>( + Arrays.asList("dayno", "plat_sys_var", "sys_imp_date", "sys_imp_week", "sys_imp_month")); private final DateUtils dateUtils; private final SqlFilterUtils sqlFilterUtils; private final Catalog catalog; - @Value("${internal.metric.cnt.suffix:internal_cnt}") private String internalMetricNameSuffix; - public static Set internalCols = new HashSet<>( - Arrays.asList("dayno", "plat_sys_var", "sys_imp_date", "sys_imp_week", "sys_imp_month")); - public QueryStructUtils( DateUtils dateUtils, SqlFilterUtils sqlFilterUtils, Catalog catalog) { diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryUtils.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryUtils.java index 2fd4d5bab..7c45ae91c 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryUtils.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/QueryUtils.java @@ -40,16 +40,6 @@ public class QueryUtils { @Value("${query.cache.enable:true}") private Boolean cacheEnable; - @PostConstruct - public void fillPattern() { - Set aggFunctions = new HashSet<>(Arrays.asList("MAX", "MIN", "SUM", "AVG")); - String patternStr = "\\s*(%s\\((.*)\\)) AS"; - for (String agg : aggFunctions) { - patterns.add(Pattern.compile(String.format(patternStr, agg))); - } - } - - private final CacheUtils cacheUtils; private final StatUtils statUtils; @@ -63,12 +53,20 @@ public class QueryUtils { this.catalog = catalog; } + @PostConstruct + public void fillPattern() { + Set aggFunctions = new HashSet<>(Arrays.asList("MAX", "MIN", "SUM", "AVG")); + String patternStr = "\\s*(%s\\((.*)\\)) AS"; + for (String agg : aggFunctions) { + patterns.add(Pattern.compile(String.format(patternStr, agg))); + } + } public void fillItemNameInfo(QueryResultWithSchemaResp queryResultWithColumns, Long modelId) { List metricDescList = catalog.getMetrics(modelId); List dimensionDescList = catalog.getDimensions(modelId); - Map metricRespMap = - metricDescList.stream().collect(Collectors.toMap(MetricResp::getBizName, a -> a,(k1, k2)->k1)); + Map metricRespMap = + metricDescList.stream().collect(Collectors.toMap(MetricResp::getBizName, a -> a, (k1, k2) -> k1)); Map namePair = new HashMap<>(); Map nameTypePair = new HashMap<>(); addSysTimeDimension(namePair, nameTypePair); @@ -95,24 +93,13 @@ public class QueryUtils { if (!nameTypePair.containsKey(nameEn) && isNumberType(column.getType())) { column.setShowType("NUMBER"); } - if(metricRespMap.containsKey(nameEn)){ + if (metricRespMap.containsKey(nameEn)) { column.setDataFormatType(metricRespMap.get(nameEn).getDataFormatType()); column.setDataFormat(metricRespMap.get(nameEn).getDataFormat()); } }); } - private boolean isNumberType(String type) { - if (StringUtils.isBlank(type)) { - return false; - } - if (type.equalsIgnoreCase("int") || type.equalsIgnoreCase("bigint") - || type.equalsIgnoreCase("float") || type.equalsIgnoreCase("double")) { - return true; - } - return false; - } - public void fillItemNameInfo(QueryResultWithSchemaResp queryResultWithColumns, QueryMultiStructReq queryMultiStructCmd) { List aggregators = queryMultiStructCmd.getQueryStructReqs().stream() @@ -152,6 +139,17 @@ public class QueryUtils { }); } + private boolean isNumberType(String type) { + if (StringUtils.isBlank(type)) { + return false; + } + if (type.equalsIgnoreCase("int") || type.equalsIgnoreCase("bigint") + || type.equalsIgnoreCase("float") || type.equalsIgnoreCase("double")) { + return true; + } + return false; + } + private Map getMetricNameFromAgg(List aggregators) { Map map = new HashMap<>(); if (CollectionUtils.isEmpty(aggregators)) {