From b1952d64ab4e192c077bae103b3eed11806e915d Mon Sep 17 00:00:00 2001 From: jipeli <54889677+jipeli@users.noreply.github.com> Date: Tue, 15 Aug 2023 08:56:18 +0800 Subject: [PATCH] [improvement][project] supersonic 0.7.2 version backend update (#28) Co-authored-by: jipengli --- CHANGELOG.md | 21 +- README.md | 31 +- README_CN.md | 29 +- .../authentication/adaptor/UserAdaptor.java | 1 - .../api/authentication/pojo/Organization.java | 3 +- .../authentication/service/UserService.java | 1 - .../authentication/service/UserStrategy.java | 1 - .../api/authorization/pojo/AuthGroup.java | 2 +- .../auth/api/authorization/pojo/AuthRes.java | 6 +- .../request/QueryAuthResReq.java | 3 +- .../response/AuthorizedResourceResp.java | 1 - .../authorization/service/AuthService.java | 2 +- .../adaptor/DefaultUserAdaptor.java | 2 +- .../auth/authentication/config/TppConfig.java | 21 + .../DefaultAuthenticationInterceptor.java | 13 +- .../interceptor/InterceptorFactory.java | 3 +- .../repository/Impl/UserRepositoryImpl.java | 2 +- .../authentication/rest/UserController.java | 7 +- .../service/UserServiceImpl.java | 3 +- .../utils/ComponentFactory.java | 2 +- .../main/resources/mapper/UserDOMapper.xml | 294 +- .../application/AuthServiceImpl.java | 40 +- .../authorization/rest/AuthController.java | 6 +- .../chat/api/component/SemanticLayer.java | 23 +- .../{DomainSchema.java => ModelSchema.java} | 11 +- .../chat/api/pojo/QueryContext.java | 5 +- .../chat/api/pojo/SchemaElement.java | 19 +- .../chat/api/pojo/SchemaElementMatch.java | 6 +- .../chat/api/pojo/SchemaElementType.java | 2 +- .../chat/api/pojo/SchemaMapInfo.java | 18 +- .../chat/api/pojo/SemanticParseInfo.java | 28 +- .../chat/api/pojo/SemanticSchema.java | 33 +- .../api/pojo/request/ChatAggConfigReq.java | 5 +- .../api/pojo/request/ChatConfigBaseReq.java | 14 +- .../api/pojo/request/ChatConfigFilter.java | 2 +- .../pojo/request/ChatDefaultConfigReq.java | 3 +- .../api/pojo/request/ChatDetailConfigReq.java | 5 +- .../chat/api/pojo/request/Entity.java | 2 +- .../api/pojo/request/ExecuteQueryReq.java | 1 + .../pojo/request/KnowledgeAdvancedConfig.java | 3 +- .../api/pojo/request/KnowledgeInfoReq.java | 6 +- .../chat/api/pojo/request/PluginQueryReq.java | 2 +- .../chat/api/pojo/request/QueryDataReq.java | 8 +- .../chat/api/pojo/request/QueryFilters.java | 3 +- .../chat/api/pojo/request/QueryReq.java | 3 +- .../chat/api/pojo/response/AggregateInfo.java | 3 +- .../pojo/response/ChatAggRichConfigResp.java | 5 +- .../api/pojo/response/ChatConfigResp.java | 4 +- .../api/pojo/response/ChatConfigRichResp.java | 5 +- .../response/ChatDefaultRichConfigResp.java | 3 +- .../response/ChatDetailRichConfigResp.java | 5 +- .../chat/api/pojo/response/EntityInfo.java | 2 +- .../api/pojo/response/EntityRichInfoResp.java | 4 +- .../{DomainInfo.java => ModelInfo.java} | 2 +- .../chat/api/pojo/response/ParseResp.java | 8 +- .../pojo/response/RecommendQuestionResp.java | 6 +- .../chat/api/pojo/response/RecommendResp.java | 4 +- .../chat/api/pojo/response/SearchResp.java | 2 - .../chat/api/pojo/response/SearchResult.java | 10 +- chat/core/pom.xml | 4 +- .../chat/config/AggregatorConfig.java | 6 +- .../supersonic/chat/config/ChatConfig.java | 11 +- .../chat/config/ChatConfigFilterInternal.java | 2 +- .../chat/config/DefaultMetricInfo.java | 2 +- .../chat/config/FunctionCallInfoConfig.java | 1 + .../chat/mapper/DomainInfoStat.java | 21 - .../supersonic/chat/mapper/EntityMapper.java | 31 +- .../chat/mapper/FuzzyNameMapper.java | 44 +- .../chat/mapper/HanlpDictMapper.java | 33 +- .../supersonic/chat/mapper/MapperHelper.java | 2 + .../supersonic/chat/mapper/MatchStrategy.java | 3 +- .../supersonic/chat/mapper/ModelInfoStat.java | 21 + ...icType.java => ModelWithSemanticType.java} | 8 +- .../chat/mapper/QueryFilterMapper.java | 37 +- .../chat/mapper/QueryMatchStrategy.java | 56 +- .../chat/mapper/SearchMatchStrategy.java | 9 +- .../chat/parser/SatisfactionChecker.java | 99 +- .../embedding/EmbeddingBasedParser.java | 259 +- .../embedding/EmbeddingEntityResolver.java | 28 +- .../chat/parser/embedding/EmbeddingResp.java | 3 +- .../parser/function/FunctionBasedParser.java | 104 +- .../chat/parser/function/FunctionReq.java | 3 +- .../function/HeuristicDomainResolver.java | 181 - .../function/HeuristicModelResolver.java | 192 + ...MatchResult.java => ModelMatchResult.java} | 3 +- ...DomainResolver.java => ModelResolver.java} | 4 +- .../chat/parser/function/Parameters.java | 2 +- .../chat/parser/llm/DSLParseResult.java | 11 + .../chat/parser/llm/LLMDSLParser.java | 231 ++ .../parser/llm/LLMTimeEnhancementParse.java | 13 +- .../chat/parser/rule/AggregateTypeParser.java | 38 +- .../parser/rule/ContextInheritParser.java | 48 +- .../chat/parser/rule/QueryModeParser.java | 15 +- .../chat/parser/rule/TimeRangeParser.java | 36 +- .../persistence/dataobject/ChatConfigDO.java | 3 +- .../persistence/dataobject/DimValueDO.java | 11 +- .../chat/persistence/dataobject/PluginDO.java | 109 +- .../dataobject/PluginDOExample.java | 78 +- .../persistence/mapper/ChatConfigMapper.java | 2 +- .../persistence/mapper/ChatQueryDOMapper.java | 3 +- .../persistence/mapper/PluginDOMapper.java | 13 +- .../repository/ChatConfigRepository.java | 5 +- .../repository/ChatQueryRepository.java | 5 +- .../repository/PluginRepository.java | 2 +- .../impl/ChatConfigRepositoryImpl.java | 18 +- .../impl/ChatQueryRepositoryImpl.java | 5 +- .../repository/impl/ChatRepositoryImpl.java | 2 +- .../repository/impl/PluginRepositoryImpl.java | 12 +- .../supersonic/chat/plugin/Plugin.java | 8 +- .../supersonic/chat/plugin/PluginManager.java | 123 +- .../chat/plugin/PluginParseConfig.java | 11 +- .../ContentInterpretQuery.java | 149 + .../query/ContentInterpret/LLmAnswerReq.java | 13 + .../query/ContentInterpret/LLmAnswerResp.java | 11 + .../chat/query/HeuristicQuerySelector.java | 69 +- .../supersonic/chat/query/QueryManager.java | 2 +- .../supersonic/chat/query/QuerySelector.java | 1 - .../supersonic/chat/query/dsl/DSLBuilder.java | 78 + .../supersonic/chat/query/dsl/DSLQuery.java | 96 + .../chat/query/{plugin => }/dsl/LLMReq.java | 6 +- .../chat/query/{plugin => }/dsl/LLMResp.java | 4 +- .../chat/query/plugin/ParamOption.java | 2 +- .../supersonic/chat/query/plugin/WebBase.java | 2 +- .../chat/query/plugin/WebBaseResult.java | 2 +- .../chat/query/plugin/dsl/DSLBuilder.java | 124 - .../chat/query/plugin/dsl/DSLQuery.java | 204 - .../query/plugin/webpage/WebPageQuery.java | 93 +- .../query/plugin/webpage/WebPageResponse.java | 3 +- .../plugin/webservice/WebServiceQuery.java | 20 +- .../plugin/webservice/WebServiceResponse.java | 2 - .../chat/query/rule/QueryMatcher.java | 7 +- .../chat/query/rule/RuleSemanticQuery.java | 99 +- .../query/rule/entity/EntityDetailQuery.java | 5 +- .../query/rule/entity/EntityFilterQuery.java | 5 +- .../query/rule/entity/EntityListQuery.java | 21 +- .../rule/entity/EntitySemanticQuery.java | 27 +- .../query/rule/metric/MetricEntityQuery.java | 18 +- .../query/rule/metric/MetricFilterQuery.java | 3 +- .../query/rule/metric/MetricGroupByQuery.java | 9 +- ...DomainQuery.java => MetricModelQuery.java} | 10 +- .../rule/metric/MetricSemanticQuery.java | 14 +- .../query/rule/metric/MetricTopNQuery.java | 13 +- .../chat/rest/ChatConfigController.java | 72 +- .../supersonic/chat/rest/ChatController.java | 10 +- .../chat/rest/ChatQueryController.java | 12 +- .../chat/rest/DictionaryController.java | 1 - .../chat/rest/PluginController.java | 25 +- .../chat/rest/RecommendController.java | 44 +- .../supersonic/chat/service/ChatService.java | 10 +- .../chat/service/ConfigService.java | 5 +- .../chat/service/DictionaryService.java | 4 +- .../chat/service/PluginService.java | 5 +- .../supersonic/chat/service/QueryService.java | 2 +- .../chat/service/RecommendService.java | 3 +- .../chat/service/SemanticService.java | 127 +- .../chat/service/impl/ChatServiceImpl.java | 15 +- .../chat/service/impl/ConfigServiceImpl.java | 133 +- .../service/impl/DictionaryServiceImpl.java | 34 +- .../chat/service/impl/PluginServiceImpl.java | 87 +- .../chat/service/impl/QueryServiceImpl.java | 17 +- .../service/impl/RecommendServiceImpl.java | 40 +- .../chat/service/impl/SearchServiceImpl.java | 114 +- .../supersonic/chat/utils/CacheUtils.java | 14 +- .../chat/utils/ChatConfigHelper.java | 45 +- .../supersonic/chat/utils/ChatGptHelper.java | 29 +- .../chat/utils/ComponentFactory.java | 16 +- .../supersonic/chat/utils/DictMetaHelper.java | 102 +- .../chat/utils/DictQueryHelper.java | 26 +- .../supersonic/chat/utils/NatureHelper.java | 55 +- .../chat/utils/QueryReqBuilder.java | 20 +- .../chat/utils/SchemaMatchHelper.java | 44 + chat/core/src/main/python/llm/api_service.py | 89 +- .../llm/plugin_call/prompt_construct.py | 87 + .../src/main/python/llm/plugin_call/run.py | 26 + .../llm/preset_retrieval/preset_query_db.py | 115 + .../main/python/llm/preset_retrieval/run.py | 49 + chat/core/src/main/python/llm/run_config.py | 20 + .../src/main/python/llm/sql/prompt_maker.py | 12 +- chat/core/src/main/python/llm/sql/run.py | 17 +- .../src/main/python/llm/util/llm_instance.py | 8 + .../core/src/main/python/llm/util/text2vec.py | 28 + .../resources/mapper/ChatConfigMapper.xml | 33 +- .../resources/mapper/ChatContextMapper.xml | 18 +- .../src/main/resources/mapper/ChatMapper.xml | 35 +- .../resources/mapper/ChatQueryDOMapper.xml | 462 +-- .../main/resources/mapper/PluginDOMapper.xml | 563 +-- chat/core/src/main/resources/sql.ddl/chat.sql | 10 +- .../search/SearchServiceImplTest.java | 2 +- .../chat/mapper/HanlpDictMapperTest.java | 2 +- .../chat/mapper/MapperHelperTest.java | 16 + .../chat/test/context/ContextTest.java | 10 +- .../test/context/MockBeansConfiguration.java | 36 +- .../context/SemanticParseObjectHelper.java | 19 +- .../src/test/resources/db/chat-data-h2.sql | 3 +- .../src/test/resources/db/chat-schema-h2.sql | 68 +- .../hanlp/dictionary/CoreDictionary.java | 1 - .../knowledge/ApplicationStartedInit.java | 5 +- .../knowledge/dictionary/DictConfig.java | 3 +- .../knowledge/dictionary/DictUpdateMode.java | 2 +- .../knowledge/dictionary/DictWordType.java | 2 +- .../dictionary/DimValue2DictCommand.java | 6 +- .../dictionary/HadoopFileIOAdapter.java | 1 - .../knowledge/dictionary/MapResult.java | 8 +- .../dictionary/MultiCustomDictionary.java | 1 - .../dictionary/builder/BaseWordBuilder.java | 5 +- .../builder/DimensionWordBuilder.java | 6 +- .../dictionary/builder/DomainWordBuilder.java | 8 +- .../dictionary/builder/EntityWordBuilder.java | 8 +- .../dictionary/builder/MetricWordBuilder.java | 10 +- .../dictionary/builder/ValueWordBuilder.java | 10 +- .../builder/WordBuilderFactory.java | 2 - .../persistence/dataobject/DictConfDO.java | 2 +- .../persistence/mapper/DictConfMapper.java | 2 +- .../persistence/mapper/DictTaskMapper.java | 2 +- .../repository/DictRepository.java | 4 +- .../repository/DictRepositoryImpl.java | 10 +- .../knowledge/semantic/BaseSemanticLayer.java | 42 +- .../semantic/DefaultSemanticConfig.java | 16 +- .../semantic/LocalSemanticLayer.java | 45 +- ...maBuilder.java => ModelSchemaBuilder.java} | 38 +- .../semantic/RemoteSemanticLayer.java | 100 +- .../knowledge/service/KnowledgeService.java | 1 - .../service/KnowledgeServiceImpl.java | 2 - .../knowledge/service/SchemaService.java | 11 +- .../knowledge/service/SearchService.java | 6 +- .../knowledge/service/WordService.java | 8 +- .../knowledge/utils/ComponentFactory.java | 3 +- .../knowledge/utils/DictTaskConverter.java | 3 +- .../knowledge/utils/FileHelper.java | 1 - .../knowledge/utils/HanlpHelper.java | 11 +- .../knowledge/utils/HdfsFileHelper.java | 1 - .../main/resources/mapper/DictConfMapper.xml | 38 +- .../main/resources/mapper/DictTaskMapper.xml | 8 +- .../main/resources/sql.ddl/s2_dictionary.sql | 55 +- .../resources/sql.ddl/s2_dictionary_task.sql | 44 +- common/pom.xml | 5 + .../supersonic/common/pojo/Aggregator.java | 2 - .../supersonic/common/pojo/DateConf.java | 15 +- .../tencent/supersonic/common/pojo/Order.java | 1 - .../common/pojo/QueryAuthorization.java | 1 - .../supersonic/common/pojo/QueryColumn.java | 7 + .../supersonic/common/pojo/ResultData.java | 1 + .../common/pojo/enums/AuthType.java | 8 + .../common/util/DatePeriodEnum.java | 17 + .../supersonic/common/util/DateUtils.java | 52 +- .../supersonic/common/util/JsonUtil.java | 3 +- .../supersonic/common/util/StringUtil.java | 21 + .../supersonic/common/util/ThreadContext.java | 2 +- .../common/util/calcite/SqlParseUtils.java | 6 + .../jsqlparser/AggregateFunctionVisitor.java | 19 + .../util/jsqlparser/CCJSqlParserUtils.java | 290 ++ .../util/jsqlparser/FieldAcquireVisitor.java | 20 + .../util/jsqlparser/FieldReplaceVisitor.java | 70 + .../jsqlparser/GroupByReplaceVisitor.java | 36 + .../jsqlparser/OrderByReplaceVisitor.java | 26 + .../util/jsqlparser/ParseVisitorHelper.java | 168 + .../supersonic/common/util/DateUtilsTest.java | 26 + .../util/calcite/SqlParseUtilsTest.java | 2 + .../jsqlparser/CCJSqlParserUtilsTest.java | 177 + docs/images/supersonic_components.png | Bin 194643 -> 280901 bytes .../main/resources/META-INF/spring.factories | 12 +- .../src/main/resources/db/chat-data-h2.sql | 89 +- .../src/main/resources/db/chat-schema-h2.sql | 318 +- .../src/main/resources/logback-spring.xml | 10 +- .../advice/RestExceptionHandler.java | 4 +- launchers/semantic/src/main/build/build.xml | 4 +- .../main/resources/META-INF/spring.factories | 1 - .../main/resources/db/semantic-data-h2.sql | 3383 ++++++++++------ .../main/resources/db/semantic-schema-h2.sql | 621 ++- .../src/main/resources/logback-spring.xml | 8 +- .../com/tencent/supersonic/ConfigureDemo.java | 73 +- .../tencent/supersonic/db/MybatisConfig.java | 3 +- .../main/resources/META-INF/spring.factories | 12 +- .../src/main/resources/application-local.yaml | 6 +- .../src/main/resources/db/data-h2.sql | 3388 ++++++++++------ .../src/main/resources/db/schema-h2.sql | 875 +++-- .../src/main/resources/db/schema-mysql.sql | 335 +- .../src/main/resources/db/sql-update.sql | 39 +- .../src/main/resources/docker/Dockerfile | 2 +- .../src/main/resources/logback-spring.xml | 10 +- .../supersonic/integration/BaseQueryTest.java | 11 +- .../integration/EntityQueryTest.java | 5 +- .../integration/MetricQueryTest.java | 28 +- .../integration/MultiTurnsTest.java | 9 +- .../integration/plugin/BasePluginTest.java | 2 - .../plugin/PluginMockConfiguration.java | 11 +- .../plugin/PluginRecognizeTest.java | 26 +- .../tencent/supersonic/util/DataUtils.java | 21 +- .../test/resources/META-INF/spring.factories | 6 - .../src/test/resources/db/data-h2.sql | 3418 +++++++++++------ .../src/test/resources/db/schema-h2.sql | 910 +++-- .../src/test/resources/logback-spring.xml | 10 +- pom.xml | 3 +- semantic/api/pom.xml | 10 +- .../semantic/api/model/pojo/DimValueMap.java | 3 +- .../semantic/api/model/pojo/Entity.java | 3 +- .../api/model/pojo/MetricTypeParams.java | 2 +- .../semantic/api/model/pojo/QueryStat.java | 6 +- .../api/model/request/DatasourceRelaReq.java | 4 +- .../api/model/request/DatasourceReq.java | 3 +- .../api/model/request/DimensionReq.java | 9 +- .../semantic/api/model/request/DomainReq.java | 5 - .../api/model/request/MetricBaseReq.java | 4 +- .../semantic/api/model/request/MetricReq.java | 2 +- .../semantic/api/model/request/ModelReq.java | 27 + ...lterReq.java => ModelSchemaFilterReq.java} | 4 +- .../api/model/request/PageMetricReq.java | 2 + .../api/model/request/PageSchemaItemReq.java | 6 +- .../api/model/request/SqlExecuteReq.java | 5 +- .../api/model/response/DatasourceResp.java | 2 +- .../api/model/response/DimensionResp.java | 4 +- .../api/model/response/DomainResp.java | 2 - .../api/model/response/MetricResp.java | 6 +- .../api/model/response/ModelResp.java | 37 + ...RelaResp.java => ModelSchemaRelaResp.java} | 2 +- ...inSchemaResp.java => ModelSchemaResp.java} | 3 +- .../response/QueryResultWithSchemaResp.java | 1 - .../semantic/api/query/pojo/Criterion.java | 2 - .../semantic/api/query/pojo/Filter.java | 2 - .../semantic/api/query/pojo/Param.java | 1 - .../api/query/request/ItemUseReq.java | 6 +- .../api/query/request/QueryDslReq.java | 2 +- .../api/query/request/QueryStructReq.java | 18 +- semantic/model/pom.xml | 2 - .../model/application/CatalogImpl.java | 51 +- .../application/DatabaseServiceImpl.java | 47 +- .../application/DatasourceServiceImpl.java | 66 +- .../application/DimensionServiceImpl.java | 34 +- .../model/application/DomainServiceImpl.java | 225 +- .../model/application/MetricServiceImpl.java | 64 +- .../model/application/ModelServiceImpl.java | 334 ++ .../application/ViewInfoServiceImpl.java | 23 +- .../semantic/model/domain/Catalog.java | 23 +- .../model/domain/DatabaseService.java | 2 + .../model/domain/DatasourceService.java | 13 +- .../semantic/model/domain/DomainService.java | 14 +- .../semantic/model/domain/MetricService.java | 8 +- .../semantic/model/domain/ModelService.java | 39 + .../engineadapter/ClickHouseAdaptor.java | 2 +- .../adaptor/engineadapter/MysqlAdaptor.java | 2 +- .../model/domain/dataobject/DatabaseDO.java | 28 +- .../domain/dataobject/DatabaseDOExample.java | 170 +- .../model/domain/dataobject/DatasourceDO.java | 14 +- .../dataobject/DatasourceDOExample.java | 148 +- .../domain/dataobject/DatasourceRelaDO.java | 14 +- .../dataobject/DatasourceRelaDOExample.java | 153 +- .../model/domain/dataobject/DictionaryDO.java | 278 -- .../dataobject/DictionaryDOExample.java | 863 ----- .../domain/dataobject/DictionaryTaskDO.java | 207 - .../dataobject/DictionaryTaskDOExample.java | 532 --- .../model/domain/dataobject/DimensionDO.java | 46 +- .../domain/dataobject/DimensionDOExample.java | 218 +- .../dataobject/DimensionDOWithDictInfo.java | 13 - .../model/domain/dataobject/DomainDO.java | 14 - .../domain/dataobject/DomainDOExample.java | 100 +- .../domain/dataobject/DomainExtendDO.java | 255 -- .../model/domain/dataobject/MetricDO.java | 14 +- .../domain/dataobject/MetricDOExample.java | 148 +- .../model/domain/dataobject/ModelDO.java | 272 ++ ...tendDOExample.java => ModelDOExample.java} | 671 +++- .../dataobject/UpdateDimValueDictBatchDO.java | 16 - .../model/domain/dataobject/ViewInfoDO.java | 14 +- .../domain/dataobject/ViewInfoDOExample.java | 148 +- .../domain/manager/DatasourceYamlManager.java | 4 +- .../model/domain/pojo/Datasource.java | 2 +- .../semantic/model/domain/pojo/Dimension.java | 4 +- .../semantic/model/domain/pojo/Domain.java | 4 +- .../model/domain/pojo/JdbcDataSource.java | 1 - .../model/domain/pojo/MetaFilter.java | 4 +- .../semantic/model/domain/pojo/Metric.java | 2 +- .../model/domain/pojo/MetricFilter.java | 2 + .../semantic/model/domain/pojo/Model.java | 38 + .../repository/DatasourceRepository.java | 6 +- .../domain/repository/DateInfoRepository.java | 1 - .../repository/DimensionRepository.java | 1 - .../domain/repository/DomainRepository.java | 1 - .../domain/repository/MetricRepository.java | 3 +- .../domain/repository/ModelRepository.java | 18 + .../domain/utils/DatasourceConverter.java | 12 +- .../domain/utils/DimensionConverter.java | 12 +- .../model/domain/utils/DomainConvert.java | 10 +- .../domain/utils/JdbcDataSourceUtils.java | 2 +- .../model/domain/utils/MetricConverter.java | 17 +- .../model/domain/utils/ModelConvert.java | 71 + .../semantic/model/domain/utils/SqlUtils.java | 2 +- .../mapper/DatasourceRelaDOMapper.java | 1 - .../infrastructure/mapper/DateInfoMapper.java | 1 - .../mapper/DimensionDOCustomMapper.java | 1 - .../mapper/DimensionDOMapper.java | 4 +- .../infrastructure/mapper/DomainDOMapper.java | 3 +- .../mapper/MetricDOCustomMapper.java | 5 +- .../infrastructure/mapper/MetricDOMapper.java | 3 +- .../infrastructure/mapper/ModelDOMapper.java | 76 + .../mapper/ViewInfoDOMapper.java | 1 - .../repository/DatabaseRepositoryImpl.java | 1 - .../repository/DatasourceRepositoryImpl.java | 8 +- .../repository/DateInfoRepositoryImpl.java | 2 +- .../repository/DimensionRepositoryImpl.java | 10 +- .../repository/DomainRepositoryImpl.java | 1 - .../repository/MetricRepositoryImpl.java | 3 +- .../repository/ModelRepositoryImpl.java | 43 + .../repository/ViewInfoRepositoryImpl.java | 2 +- .../model/rest/DatabaseController.java | 3 +- .../model/rest/DatasourceController.java | 18 +- .../model/rest/DimensionController.java | 12 +- .../semantic/model/rest/DomainController.java | 26 +- .../semantic/model/rest/MetricController.java | 12 +- .../semantic/model/rest/ModelController.java | 77 + .../model/rest/ViewInfoController.java | 17 +- .../resources/mapper/DatabaseDOMapper.xml | 23 +- .../resources/mapper/DatasourceDOMapper.xml | 26 +- .../mapper/DatasourceRelaDOMapper.xml | 24 +- .../resources/mapper/DimensionDOMapper.xml | 723 ++-- .../main/resources/mapper/DomainDOMapper.xml | 19 +- .../main/resources/mapper/MetricDOMapper.xml | 644 ++-- .../main/resources/mapper/ModelDOMapper.xml | 430 +++ .../resources/mapper/ViewInfoDOMapper.xml | 24 +- .../mapper/custom/DateInfoMapper.xml | 4 +- .../mapper/custom/DimensionDOCustomMapper.xml | 10 +- .../mapper/custom/MetricDOCustomMapper.xml | 47 +- .../main/resources/sql.ddl/s2_database.sql | 2 +- .../query/executor/QueryExecutor.java | 2 +- .../query/optimizer/QueryOptimizer.java | 1 + .../semantic/query/parser/SqlParser.java | 1 + .../parser/calcite/CalciteSqlParser.java | 3 +- .../query/parser/calcite/Configuration.java | 2 +- .../parser/calcite/SemanticSchemaManager.java | 14 +- .../parser/calcite/planner/AggPlanner.java | 6 +- .../query/parser/calcite/sql/Renderer.java | 6 +- .../calcite/sql/node/DataSourceNode.java | 21 +- .../parser/calcite/sql/node/SemanticNode.java | 11 +- .../calcite/sql/render/FilterRender.java | 8 +- .../parser/calcite/sql/render/JoinRender.java | 13 +- .../calcite/sql/render/OutputRender.java | 6 +- .../parser/convert/CalculateAggConverter.java | 16 +- .../convert/DefaultDimValueConverter.java | 11 +- .../query/parser/convert/MultiSourceJoin.java | 10 +- .../convert/ParserDefaultConverter.java | 4 +- .../persistence/pojo/QueryStatement.java | 3 +- .../repository/StatRepositoryImpl.java | 16 +- .../semantic/query/rest/QueryController.java | 10 +- .../semantic/query/rest/SchemaController.java | 30 +- .../semantic/query/service/QueryService.java | 2 +- .../query/service/QueryServiceImpl.java | 22 +- .../semantic/query/service/SchemaService.java | 17 +- .../query/service/SchemaServiceImpl.java | 54 +- .../service/SemanticQueryEngineImpl.java | 6 +- .../query/utils/ComponentFactory.java | 4 +- .../query/utils/DataPermissionAOP.java | 106 +- .../semantic/query/utils/DateUtils.java | 2 - .../semantic/query/utils/DimValueAspect.java | 24 +- .../query/utils/QueryReqConverter.java | 28 +- .../query/utils/QueryStructUtils.java | 12 +- .../semantic/query/utils/QueryUtils.java | 20 +- .../semantic/query/utils/SqlFilterUtils.java | 2 +- .../query/utils/SqlGenerateUtils.java | 5 +- .../semantic/query/utils/StatUtils.java | 4 +- .../src/main/resources/mapper/StatMapper.xml | 31 +- .../resources/sql.ddl/s2_query_stat_info.sql | 67 +- .../sql.ddl/s2_semantic_pasre_info.sql | 52 +- .../calcite/SemanticParserServiceTest.java | 4 +- 461 files changed, 18548 insertions(+), 11939 deletions(-) create mode 100644 auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/config/TppConfig.java rename chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/{DomainSchema.java => ModelSchema.java} (90%) rename chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/{DomainInfo.java => ModelInfo.java} (75%) delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainInfoStat.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelInfoStat.java rename chat/core/src/main/java/com/tencent/supersonic/chat/mapper/{DomainWithSemanticType.java => ModelWithSemanticType.java} (59%) delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicDomainResolver.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicModelResolver.java rename chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/{DomainMatchResult.java => ModelMatchResult.java} (81%) rename chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/{DomainResolver.java => ModelResolver.java} (79%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/DSLParseResult.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/LLMDSLParser.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/ContentInterpret/ContentInterpretQuery.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/ContentInterpret/LLmAnswerReq.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/ContentInterpret/LLmAnswerResp.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/DSLBuilder.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/DSLQuery.java rename chat/core/src/main/java/com/tencent/supersonic/chat/query/{plugin => }/dsl/LLMReq.java (79%) rename chat/core/src/main/java/com/tencent/supersonic/chat/query/{plugin => }/dsl/LLMResp.java (74%) delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLBuilder.java delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLQuery.java rename chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/{MetricDomainQuery.java => MetricModelQuery.java} (77%) create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/utils/SchemaMatchHelper.java create mode 100644 chat/core/src/main/python/llm/plugin_call/prompt_construct.py create mode 100644 chat/core/src/main/python/llm/plugin_call/run.py create mode 100644 chat/core/src/main/python/llm/preset_retrieval/preset_query_db.py create mode 100644 chat/core/src/main/python/llm/preset_retrieval/run.py create mode 100644 chat/core/src/main/python/llm/run_config.py create mode 100644 chat/core/src/main/python/llm/util/llm_instance.py create mode 100644 chat/core/src/main/python/llm/util/text2vec.py create mode 100644 chat/core/src/test/java/com/tencent/supersonic/chat/mapper/MapperHelperTest.java rename chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/{DomainSchemaBuilder.java => ModelSchemaBuilder.java} (84%) create mode 100644 common/src/main/java/com/tencent/supersonic/common/pojo/enums/AuthType.java create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/DatePeriodEnum.java create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/StringUtil.java create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/AggregateFunctionVisitor.java create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/CCJSqlParserUtils.java create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAcquireVisitor.java create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldReplaceVisitor.java create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/GroupByReplaceVisitor.java create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/OrderByReplaceVisitor.java create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/ParseVisitorHelper.java create mode 100644 common/src/test/java/com/tencent/supersonic/common/util/DateUtilsTest.java create mode 100644 common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/CCJSqlParserUtilsTest.java create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/ModelReq.java rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/{DomainSchemaFilterReq.java => ModelSchemaFilterReq.java} (71%) create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/ModelResp.java rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/{DomainSchemaRelaResp.java => ModelSchemaRelaResp.java} (88%) rename semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/{DomainSchemaResp.java => ModelSchemaResp.java} (85%) create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/ModelService.java delete mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryDO.java delete mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryDOExample.java delete mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryTaskDO.java delete mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryTaskDOExample.java delete mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDOWithDictInfo.java delete mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainExtendDO.java create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDO.java rename semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/{DomainExtendDOExample.java => ModelDOExample.java} (57%) delete mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/UpdateDimValueDictBatchDO.java create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Model.java create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/ModelRepository.java create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/ModelConvert.java create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/ModelDOMapper.java create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/ModelRepositoryImpl.java create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/ModelController.java create mode 100644 semantic/model/src/main/resources/mapper/ModelDOMapper.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ad4db1e5..a83be5058 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,24 @@ - All notable changes to this project will be documented in this file. - "Breaking Changes" describes any changes that may break existing functionality or cause compatibility issues with previous versions. - + + + +## SuperSonic [0.7.2] - 2023-08-12 + +### Added +- Support asynchronous query - return parse information to user before executing result +- Add Model as the basic data structure of the semantic definitions - this will repalce the old conception of subdomain + +### Updated +- improve knowledge word similarity algorithm +- improve embedding plugin chooser +- improve DSLQuery field correction and parser + + +### Fixed +- Fix mapper error that detectWord text is shorter than word +- Fix MetricDomainQuery inherit context ## SuperSonic [0.7.0] - 2023-07-30 @@ -96,4 +113,4 @@ ### Removed -- delete view module \ No newline at end of file +- delete view module diff --git a/README.md b/README.md index 92fbd62a5..78f942018 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ English | [中文](README_CN.md) # SuperSonic (超音数) -**SuperSonic is an out-of-the-box yet highly extensible framework for building a data chatbot**. SuperSonic provides a chat interface that empowers users to query data using natural language and visualize the results with suitable charts. To enable such experience, the only thing necessary is to build logical semantic models (definition of metrics/dimensions/entities, along with their meaning, context and relationships) on top of physical data models, and no data modification or copying is required. Meanwhile, SuperSonic is designed to be pluggable, allowing new tools to be added through plugins. +**SuperSonic is an out-of-the-box yet highly extensible framework for building a data chatbot**. SuperSonic provides a chat interface that empowers users to query data using natural language and visualize the results with suitable charts. To enable such experience, the only thing necessary is to build logical semantic models (definition of metrics/dimensions/entities, along with their meaning, context and relationships) on top of physical data models, and no data modification or copying is required. Meanwhile, SuperSonic is designed to be pluggable, allowing new functionalities to be added through plugins and core components to be integrated with other systems. @@ -10,34 +10,35 @@ English | [中文](README_CN.md) The emergence of Large Language Model (LLM) like ChatGPT is reshaping the way information is retrieved. In the field of data analytics, both academia and industry are primarily focused on leveraging LLM to convert natural language queries into SQL queries. While some works show promising results, they are still not applicable to real-world scenarios. -From our perspective, the key to filling the real-world gap lies in three aspects: -1. Utilize a combination of rule-based and LLM-based semantic parsers to deal with different scenarios. +From our perspective, the key to filling the real-world gap lies in two aspects: +1. Utilize a combination of rule-based and model-based semantic parsers to deal with different scenarios. 2. Introduce a semantic model layer encapsulating the underlying data complexity(joins, formulas, etc) to simplify semantic parsing. -3. Integrate third-party plugins to augment semantic parsing capabilities or complement custom functionalities. With these ideas in mind, we develop SuperSonic as a practical reference implementation and use it to power our real-world products. Additionally, to facilitate further development of data chatbot, we decide to open source SuperSonic as an extensible framework. ## Out-of-the-box Features -- Built-in chat UI for business users to enter natural language queries and answer results with appropriate visualization charts. -- Built-in modelling UI for analytics engineers to manage semantic models. The configurations related to access permission and chat conversation can also be set on the UI. -- Support input auto-completion as well as query recommendation. -- Support multi-turn conversation and history context management. -- Support four-level permission control: domain-level, model-level, column-level and row-level. +- Built-in graphical interface for business users to enter data queries +- Built-in graphical interface for analytics engineers to manage semantic models +- Support input auto-completion as well as query recommendation +- Support multi-turn conversation and history context management +- Support three-level permission control: domain-level, column-level and row-level ## Extensible Components The high-level architecture and main process flow is shown in below diagram: - + + +- **Chat Interface:** accepts natural language queries and answer results with appropriate visualization charts. It supports input auto-completion as well as multi-turn conversation. + +- **Modeling Interface:** empowers analytics engineers to visually define and maintain semantic models. The configurations related to access permission and chat conversation can also be set on the UI. - **Schema Mapper Chain:** identifies references to schema elements(metrics/dimensions/entities/values) in user queries. It matches the query text against a knowledge base constructed from the semantic models. -- **Semantic Parser Chain:** understands user queries and extract semantic information. It consists of a combination of rule-based and LLM-based parsers, each of which deals with specific scenarios. +- **Semantic Parser Chain:** understands user queries and extract semantic information. It consists of a combination of rule-based and model-based parsers, each of which deals with specific scenarios. -- **Semantic Layer:** performs execution according to extracted semantic information. It generates SQL queries and executes them against physical data models. - -- **Chat Plugins**: perform custom execution given the results of schema mapping and semantic parsing. It would optionally resort to semantic layer to query semantic models. +- **Semantic Query:** performs execution according to extracted semantic information. It generates SQL queries and executes them against physical data models. ## Quick Demo @@ -57,4 +58,4 @@ Pull the source code and run script "assembly/bin/build-standalone.sh" to build ### Build for Distributed Mode -Pull the source code and run scripts "assembly/bin/build-chat.sh" and "assembly/bin/build-semantic.sh" separately to build packages. \ No newline at end of file +Pull the source code and run scripts "assembly/bin/build-chat.sh" and "assembly/bin/build-semantic.sh" separately to build packages. diff --git a/README_CN.md b/README_CN.md index 0e8064aa1..bf3dce6e8 100644 --- a/README_CN.md +++ b/README_CN.md @@ -8,42 +8,43 @@ 大型语言模型(LLMs)如ChatGPT的出现正在重塑信息检索的方式。在数据分析领域,学术界和工业界主要关注利用深度学习模型将自然语言查询转换为SQL查询。虽然一些工作显示出有前景的结果,但它们还并不适用于实际场景。 -在我们看来,为了在实际场景发挥价值,有三个关键点: +在我们看来,为了在实际场景发挥价值,有两个关键点: 1. 将基于规则和基于模型的语义解析器相结合,发挥各自优势,以便处理不同的场景。 2. 引入语义模型层来封装数据底层的复杂性(关联、公式等),从而简化语义解析的求解空间。 -3. 整合第三方插件用于增强语义解析能力,或者扩充自定义功能。 为了验证上述想法,我们开发了超音数项目,并将其应用在实际的内部产品中。与此同时,我们将超音数作为一个可扩展的框架开源,希望能够促进数据问答对话领域的进一步发展。 ## 开箱即用的特性 -- 内置的对话图形界面,使用户能够通过自然语言问询,并最终选择合适的可视化图表呈现结果。 -- 内置的建模图形界面,使分析工程师能够通过可视化方式定义和维护语义模型,与访问权限和聊天对话相关的配置也可以在用户界面上设置。 +- 内置图形界面以便业务用户输入数据查询。 +- 内置图形界面以便分析工程师管理语义模型。 - 支持文本输入的联想和查询问题的推荐。 - 支持多轮对话,根据语境自动切换上下文。 -- 支持四级权限控制:主题域级、模型级、列级及行级。 +- 支持三级权限控制:主题域级、列级、行级。 ## 易于扩展的组件 超音数的整体架构和主流程如下图所示: - + + +- **问答对话界面(chat interface)**:接受用户查询并选择合适的可视化图表呈现结果,支持输入联想和多轮对话。 + +- **语义建模界面(modeling interface)**:使分析工程师能够通过可视化方式定义和维护语义模型,与访问权限和聊天对话相关的配置也可以在用户界面上设置。 - **模式映射器(schema mapper chain)**:基于语义模型构建知识库,然后将自然语言文本在知识库中进行匹配,为后续的语义解析提供相关信息。 - **语义解析器(semantic parser chain)**:理解用户查询并抽取语义信息,其由一组基于规则和基于模型的解析器组成,每个解析器可应对不同的特定场景。 -- **语义层(semantic layer)**: 根据语义信息生成物理SQL执行查询。 - -- **问答插件(chat plugins)**:基于模式映射和语义解析的结果,执行自定义的操作,同时可以选择利用语义层来查询语义模型。 +- **语义查询(semantic query)**: 根据语义信息生成物理SQL执行查询。 ## 快速体验 超音数自带样例的语义模型和问答对话,只需以下三步即可快速体验: -- 从[release page](https://github.com/tencentmusic/supersonic/releases)下载预先构建好的发行包; -- 运行 "bin/start-standalone.sh"启动服务; -- 在浏览器访问http://localhost:9080 开启探索。 +- 从[release page](https://github.com/tencentmusic/supersonic/releases)下载预先构建好的发行包 +- 运行 "bin/start-standalone.sh"启动服务 +- 在浏览器访问http://localhost:9080 开启探索 ## 如何构建 @@ -51,8 +52,8 @@ ### Standalone模式构建 -下载源码包,运行脚本"assembly/bin/build-standalone.sh",将所有服务一起编译打包。 +下载源码包,运行脚本"assembly/bin/build-standalone.sh",将所有服务一起编译打包 ### Distributed模式构建 -下载源码包,分别运行脚本"assembly/bin/build-chat.sh"、"assembly/bin/build-semantic.sh",为问答层服务和语义层服务编译打包。 \ No newline at end of file +下载源码包,分别运行脚本"assembly/bin/build-chat.sh"、"assembly/bin/build-semantic.sh",为问答层服务和语义层服务编译打包 \ No newline at end of file diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/adaptor/UserAdaptor.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/adaptor/UserAdaptor.java index 33c4cbe6a..e4966dfb4 100644 --- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/adaptor/UserAdaptor.java +++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/adaptor/UserAdaptor.java @@ -3,7 +3,6 @@ package com.tencent.supersonic.auth.api.authentication.adaptor; import com.tencent.supersonic.auth.api.authentication.pojo.Organization; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.request.UserReq; - import java.util.List; import java.util.Set; diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/pojo/Organization.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/pojo/Organization.java index a72870955..6f9f3a94f 100644 --- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/pojo/Organization.java +++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/pojo/Organization.java @@ -1,9 +1,8 @@ package com.tencent.supersonic.auth.api.authentication.pojo; import com.google.common.collect.Lists; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class Organization { diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserService.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserService.java index dcfb3b8ef..268462054 100644 --- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserService.java +++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserService.java @@ -3,7 +3,6 @@ package com.tencent.supersonic.auth.api.authentication.service; import com.tencent.supersonic.auth.api.authentication.pojo.Organization; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.request.UserReq; - import java.util.List; import java.util.Set; diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserStrategy.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserStrategy.java index ae9d73a85..ad271eea1 100644 --- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserStrategy.java +++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserStrategy.java @@ -1,7 +1,6 @@ package com.tencent.supersonic.auth.api.authentication.service; import com.tencent.supersonic.auth.api.authentication.pojo.User; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthGroup.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthGroup.java index 2a9a053c1..5e4ffba0d 100644 --- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthGroup.java +++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthGroup.java @@ -6,7 +6,7 @@ import lombok.Data; @Data public class AuthGroup { - private String domainId; + private String modelId; private String name; private Integer groupId; private List authRules; diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthRes.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthRes.java index d12bd7084..f15f02131 100644 --- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthRes.java +++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthRes.java @@ -7,14 +7,14 @@ import lombok.ToString; @ToString public class AuthRes { - private String domainId; + private String modelId; private String name; public AuthRes() { } - public AuthRes(String domainId, String name) { - this.domainId = domainId; + public AuthRes(String modelId, String name) { + this.modelId = modelId; this.name = name; } } diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/request/QueryAuthResReq.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/request/QueryAuthResReq.java index bf77f2e0d..a006769e9 100644 --- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/request/QueryAuthResReq.java +++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/request/QueryAuthResReq.java @@ -3,7 +3,6 @@ package com.tencent.supersonic.auth.api.authorization.request; import com.tencent.supersonic.auth.api.authorization.pojo.AuthRes; import java.util.ArrayList; import java.util.List; - import lombok.Data; import lombok.ToString; @@ -17,5 +16,5 @@ public class QueryAuthResReq { private List resources; - private String domainId; + private String modelId; } diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/response/AuthorizedResourceResp.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/response/AuthorizedResourceResp.java index 059d3ce39..2a90bdaf2 100644 --- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/response/AuthorizedResourceResp.java +++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/response/AuthorizedResourceResp.java @@ -4,7 +4,6 @@ import com.tencent.supersonic.auth.api.authorization.pojo.AuthResGrp; import com.tencent.supersonic.auth.api.authorization.pojo.DimensionFilter; import java.util.ArrayList; import java.util.List; - import lombok.Data; @Data 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 a3256c86d..42b478f0e 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 @@ -3,8 +3,8 @@ package com.tencent.supersonic.auth.api.authorization.service; 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 javax.servlet.http.HttpServletRequest; 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/adaptor/DefaultUserAdaptor.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/adaptor/DefaultUserAdaptor.java index e762ca9a3..0c924d24e 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/adaptor/DefaultUserAdaptor.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/adaptor/DefaultUserAdaptor.java @@ -11,10 +11,10 @@ import com.tencent.supersonic.auth.authentication.persistence.dataobject.UserDO; import com.tencent.supersonic.auth.authentication.persistence.repository.UserRepository; import com.tencent.supersonic.auth.authentication.utils.UserTokenUtils; import com.tencent.supersonic.common.util.ContextUtils; -import org.springframework.beans.BeanUtils; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import org.springframework.beans.BeanUtils; public class DefaultUserAdaptor implements UserAdaptor { diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/config/TppConfig.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/config/TppConfig.java new file mode 100644 index 000000000..474de6004 --- /dev/null +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/config/TppConfig.java @@ -0,0 +1,21 @@ +package com.tencent.supersonic.auth.authentication.config; + + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +public class TppConfig { + + @Value(value = "${auth.app.secret:}") + private String appSecret; + + @Value(value = "${auth.app.key:}") + private String appKey; + + @Value(value = "${auth.oa.url:}") + private String tppOaUrl; + +} diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/DefaultAuthenticationInterceptor.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/DefaultAuthenticationInterceptor.java index 968085d2b..67daa9547 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/DefaultAuthenticationInterceptor.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/DefaultAuthenticationInterceptor.java @@ -35,11 +35,14 @@ public class DefaultAuthenticationInterceptor extends AuthenticationInterceptor setFakerUser(request); return true; } - HandlerMethod handlerMethod = (HandlerMethod) handler; - Method method = handlerMethod.getMethod(); - AuthenticationIgnore ignore = method.getAnnotation(AuthenticationIgnore.class); - if (ignore != null) { - return true; + + if (handler instanceof HandlerMethod) { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + AuthenticationIgnore ignore = method.getAnnotation(AuthenticationIgnore.class); + if (ignore != null) { + return true; + } } String uri = request.getServletPath(); diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/InterceptorFactory.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/InterceptorFactory.java index b754c3980..1c13cca3c 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/InterceptorFactory.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/InterceptorFactory.java @@ -1,12 +1,11 @@ package com.tencent.supersonic.auth.authentication.interceptor; +import java.util.List; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import java.util.List; - @Configuration public class InterceptorFactory implements WebMvcConfigurer { 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 97360894b..520e2c71f 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 @@ -3,8 +3,8 @@ package com.tencent.supersonic.auth.authentication.persistence.repository.Impl; import com.tencent.supersonic.auth.authentication.persistence.dataobject.UserDO; import com.tencent.supersonic.auth.authentication.persistence.dataobject.UserDOExample; -import com.tencent.supersonic.auth.authentication.persistence.repository.UserRepository; import com.tencent.supersonic.auth.authentication.persistence.mapper.UserDOMapper; +import com.tencent.supersonic.auth.authentication.persistence.repository.UserRepository; import java.util.List; import java.util.Optional; import org.springframework.stereotype.Component; 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 14cc106d8..1eabf48e6 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,7 +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.*; +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 @RequestMapping("/api/auth/user") diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/service/UserServiceImpl.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/service/UserServiceImpl.java index 15b102991..7eb17b03b 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/service/UserServiceImpl.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/service/UserServiceImpl.java @@ -7,7 +7,6 @@ import com.tencent.supersonic.auth.api.authentication.service.UserService; import com.tencent.supersonic.auth.authentication.utils.ComponentFactory; import java.util.List; import java.util.Set; - import org.springframework.stereotype.Service; @Service @@ -16,7 +15,7 @@ public class UserServiceImpl implements UserService { @Override public List getUserNames() { - return ComponentFactory.getUserAdaptor().getUserNames(); + return ComponentFactory.getUserAdaptor().getUserNames(); } @Override diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/utils/ComponentFactory.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/utils/ComponentFactory.java index e6cee4640..7f0f51dd3 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/utils/ComponentFactory.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/utils/ComponentFactory.java @@ -1,8 +1,8 @@ package com.tencent.supersonic.auth.authentication.utils; import com.tencent.supersonic.auth.api.authentication.adaptor.UserAdaptor; -import org.springframework.core.io.support.SpringFactoriesLoader; import java.util.Objects; +import org.springframework.core.io.support.SpringFactoriesLoader; public class ComponentFactory { diff --git a/auth/authentication/src/main/resources/mapper/UserDOMapper.xml b/auth/authentication/src/main/resources/mapper/UserDOMapper.xml index 15eb2b49c..c8b15a120 100644 --- a/auth/authentication/src/main/resources/mapper/UserDOMapper.xml +++ b/auth/authentication/src/main/resources/mapper/UserDOMapper.xml @@ -1,145 +1,159 @@ - + - - - - - - - - - - - - - - - - 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} + + + + + + - + + + + id + , name, password, display_name, email + + - select - - distinct - - - from s2_user - - - - - order by ${orderByClause} - - - limit #{limitStart} , #{limitEnd} - - - - - delete from s2_user - where id = #{id,jdbcType=BIGINT} - - - insert into s2_user (id, name, password, - display_name, email) - values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, - #{displayName,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}) - - - insert into s2_user - - - id, - - - name, - - - password, - - - display_name, - - - email, - - - - - #{id,jdbcType=BIGINT}, - - - #{name,jdbcType=VARCHAR}, - - - #{password,jdbcType=VARCHAR}, - - - #{displayName,jdbcType=VARCHAR}, - - - #{email,jdbcType=VARCHAR}, - - - - - - update s2_user - - - name = #{name,jdbcType=VARCHAR}, - - - password = #{password,jdbcType=VARCHAR}, - - - display_name = #{displayName,jdbcType=VARCHAR}, - - - email = #{email,jdbcType=VARCHAR}, - - - where id = #{id,jdbcType=BIGINT} - - - update s2_user - set name = #{name,jdbcType=VARCHAR}, - password = #{password,jdbcType=VARCHAR}, - display_name = #{displayName,jdbcType=VARCHAR}, - email = #{email,jdbcType=VARCHAR} - where id = #{id,jdbcType=BIGINT} - + + from s2_user + + + + + order by ${orderByClause} + + + limit #{limitStart} , #{limitEnd} + + + + + delete + from s2_user + where id = #{id,jdbcType=BIGINT} + + + insert into s2_user (id, name, password, + display_name, email) + values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, + #{displayName,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}) + + + insert into s2_user + + + id, + + + name, + + + password, + + + display_name, + + + email, + + + + + #{id,jdbcType=BIGINT}, + + + #{name,jdbcType=VARCHAR}, + + + #{password,jdbcType=VARCHAR}, + + + #{displayName,jdbcType=VARCHAR}, + + + #{email,jdbcType=VARCHAR}, + + + + + + update s2_user + + + name = #{name,jdbcType=VARCHAR}, + + + password = #{password,jdbcType=VARCHAR}, + + + display_name = #{displayName,jdbcType=VARCHAR}, + + + email = #{email,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update s2_user + set name = #{name,jdbcType=VARCHAR}, + password = #{password,jdbcType=VARCHAR}, + display_name = #{displayName,jdbcType=VARCHAR}, + email = #{email,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + \ No newline at end of file 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 878c7cfd4..5645a8077 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 @@ -3,25 +3,27 @@ package com.tencent.supersonic.auth.authorization.application; import com.google.common.base.Strings; import com.google.gson.Gson; import com.tencent.supersonic.auth.api.authentication.service.UserService; +import com.tencent.supersonic.auth.api.authorization.pojo.AuthGroup; import com.tencent.supersonic.auth.api.authorization.pojo.AuthRes; import com.tencent.supersonic.auth.api.authorization.pojo.AuthResGrp; +import com.tencent.supersonic.auth.api.authorization.pojo.AuthRule; 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 java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; - -import com.tencent.supersonic.auth.api.authorization.pojo.AuthGroup; -import com.tencent.supersonic.auth.api.authorization.pojo.AuthRule; 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.stream.Collectors; - @Service @Slf4j public class AuthServiceImpl implements AuthService { @@ -31,7 +33,7 @@ public class AuthServiceImpl implements AuthService { private UserService userService; public AuthServiceImpl(JdbcTemplate jdbcTemplate, - UserService userService) { + UserService userService) { this.jdbcTemplate = jdbcTemplate; this.userService = userService; } @@ -43,10 +45,10 @@ public class AuthServiceImpl implements AuthService { } @Override - public List queryAuthGroups(String domainId, Integer groupId) { + public List queryAuthGroups(String modelId, Integer groupId) { return load().stream() .filter(group -> (Objects.isNull(groupId) || groupId.equals(group.getGroupId())) - && domainId.equals(group.getDomainId())) + && modelId.equals(group.getModelId())) .collect(Collectors.toList()); } @@ -83,16 +85,16 @@ public class AuthServiceImpl implements AuthService { } List groups = getAuthGroups(req); AuthorizedResourceResp resource = new AuthorizedResourceResp(); - Map> authGroupsByDomainId = groups.stream() - .collect(Collectors.groupingBy(AuthGroup::getDomainId)); + Map> authGroupsByModelId = groups.stream() + .collect(Collectors.groupingBy(AuthGroup::getModelId)); Map> reqAuthRes = req.getResources().stream() - .collect(Collectors.groupingBy(AuthRes::getDomainId)); + .collect(Collectors.groupingBy(AuthRes::getModelId)); - for (String domainId : reqAuthRes.keySet()) { - List reqResourcesList = reqAuthRes.get(domainId); + for (String modelId : reqAuthRes.keySet()) { + List reqResourcesList = reqAuthRes.get(modelId); AuthResGrp rg = new AuthResGrp(); - if (authGroupsByDomainId.containsKey(domainId)) { - List authGroups = authGroupsByDomainId.get(domainId); + if (authGroupsByModelId.containsKey(modelId)) { + List authGroups = authGroupsByModelId.get(modelId); for (AuthRes reqRes : reqResourcesList) { for (AuthGroup authRuleGroup : authGroups) { List authRules = authRuleGroup.getAuthRules(); @@ -111,8 +113,8 @@ public class AuthServiceImpl implements AuthService { } } - if (StringUtils.isNotEmpty(req.getDomainId())) { - List authGroups = authGroupsByDomainId.get(req.getDomainId()); + if (StringUtils.isNotEmpty(req.getModelId())) { + List authGroups = authGroupsByModelId.get(req.getModelId()); if (!CollectionUtils.isEmpty(authGroups)) { for (AuthGroup group : authGroups) { if (group.getDimensionFilters() != null @@ -131,7 +133,7 @@ public class AuthServiceImpl implements AuthService { private List getAuthGroups(QueryAuthResReq req) { List groups = load().stream() .filter(group -> { - if (!Objects.equals(group.getDomainId(), req.getDomainId())) { + if (!Objects.equals(group.getModelId(), req.getModelId())) { return false; } if (!CollectionUtils.isEmpty(group.getAuthorizedUsers()) && group.getAuthorizedUsers() diff --git a/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/rest/AuthController.java b/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/rest/AuthController.java index 780f5bbc3..bede33b4c 100644 --- a/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/rest/AuthController.java +++ b/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/rest/AuthController.java @@ -1,9 +1,9 @@ package com.tencent.supersonic.auth.authorization.rest; +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 com.tencent.supersonic.auth.api.authorization.service.AuthService; -import com.tencent.supersonic.auth.api.authorization.pojo.AuthGroup; import java.util.List; import javax.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; @@ -26,9 +26,9 @@ public class AuthController { } @GetMapping("/queryGroup") - public List queryAuthGroup(@RequestParam("domainId") String domainId, + public List queryAuthGroup(@RequestParam("modelId") String modelId, @RequestParam(value = "groupId", required = false) Integer groupId) { - return authService.queryAuthGroups(domainId, groupId); + return authService.queryAuthGroups(modelId, groupId); } /** 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 011a7d244..4fc92178d 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 @@ -2,17 +2,18 @@ package com.tencent.supersonic.chat.api.component; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.pojo.DomainSchema; +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.QueryResultWithSchemaResp; 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.request.QueryDslReq; import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; - import java.util.List; /** @@ -30,16 +31,22 @@ 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 getDomainSchema(); - List getDomainSchema(List ids); - DomainSchema getDomainSchema(Long domain, Boolean cacheEnable); + List getModelSchema(); + + List getModelSchema(List ids); + + ModelSchema getModelSchema(Long model, Boolean cacheEnable); + PageInfo getDimensionPage(PageDimensionReq pageDimensionCmd); + PageInfo getMetricPage(PageMetricReq pageMetricCmd); - List getDomainListForViewer(); - List getDomainListForAdmin(); + 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/DomainSchema.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ModelSchema.java similarity index 90% rename from chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DomainSchema.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ModelSchema.java index 83a1368d3..c190561a8 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DomainSchema.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ModelSchema.java @@ -1,15 +1,14 @@ package com.tencent.supersonic.chat.api.pojo; -import lombok.Data; - import java.util.HashSet; import java.util.Optional; import java.util.Set; +import lombok.Data; @Data -public class DomainSchema { +public class ModelSchema { - private SchemaElement domain; + private SchemaElement model; private Set metrics = new HashSet<>(); private Set dimensions = new HashSet<>(); private Set dimensionValues = new HashSet<>(); @@ -22,8 +21,8 @@ public class DomainSchema { case ENTITY: element = Optional.ofNullable(entity); break; - case DOMAIN: - element = Optional.of(domain); + case MODEL: + element = Optional.of(model); break; case METRIC: element = metrics.stream().filter(e -> e.getId() == elementID).findFirst(); diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryContext.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryContext.java index 244468b9b..a5d77e553 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryContext.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryContext.java @@ -2,12 +2,13 @@ package com.tencent.supersonic.chat.api.pojo; import com.tencent.supersonic.chat.api.component.SemanticQuery; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; -import lombok.Data; - import java.util.ArrayList; import java.util.List; +import lombok.Data; +import lombok.NoArgsConstructor; @Data +@NoArgsConstructor public class QueryContext { private QueryReq request; 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 6390545fd..d583fe30b 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,11 +1,12 @@ package com.tencent.supersonic.chat.api.pojo; import com.google.common.base.Objects; - import java.io.Serializable; import java.util.List; - -import lombok.*; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; @Data @Getter @@ -14,7 +15,7 @@ import lombok.*; //@AllArgsConstructor public class SchemaElement implements Serializable { - private Long domain; + private Long model; private Long id; private String name; private String bizName; @@ -25,9 +26,9 @@ public class SchemaElement implements Serializable { // public SchemaElement() { // } - public SchemaElement(Long domain, Long id, String name, String bizName, - Long useCnt, SchemaElementType type, List alias) { - this.domain = domain; + public SchemaElement(Long model, Long id, String name, String bizName, + Long useCnt, SchemaElementType type, List alias) { + this.model = model; this.id = id; this.name = name; this.bizName = bizName; @@ -45,7 +46,7 @@ public class SchemaElement implements Serializable { return false; } SchemaElement schemaElement = (SchemaElement) o; - return Objects.equal(domain, schemaElement.domain) && Objects.equal(id, + return Objects.equal(model, schemaElement.model) && Objects.equal(id, schemaElement.id) && Objects.equal(name, schemaElement.name) && Objects.equal(bizName, schemaElement.bizName) && Objects.equal( useCnt, schemaElement.useCnt) && Objects.equal(type, schemaElement.type); @@ -53,6 +54,6 @@ public class SchemaElement implements Serializable { @Override public int hashCode() { - return Objects.hashCode(domain, id, name, bizName, useCnt, type); + return Objects.hashCode(model, id, name, bizName, useCnt, type); } } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementMatch.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementMatch.java index e958e24e4..0062988e3 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementMatch.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementMatch.java @@ -18,10 +18,6 @@ public class SchemaElementMatch { String detectWord; String word; Long frequency; - MatchMode mode = MatchMode.CURRENT; + boolean isInherited; - public enum MatchMode { - CURRENT, - INHERIT - } } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementType.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementType.java index 718b2fc03..9eaf598b3 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementType.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementType.java @@ -1,7 +1,7 @@ package com.tencent.supersonic.chat.api.pojo; public enum SchemaElementType { - DOMAIN, + MODEL, METRIC, DIMENSION, VALUE, diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaMapInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaMapInfo.java index 588d93f02..99bfd0714 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaMapInfo.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaMapInfo.java @@ -7,21 +7,21 @@ import java.util.Set; public class SchemaMapInfo { - private Map> domainElementMatches = new HashMap<>(); + private Map> modelElementMatches = new HashMap<>(); - public Set getMatchedDomains() { - return domainElementMatches.keySet(); + public Set getMatchedModels() { + return modelElementMatches.keySet(); } - public List getMatchedElements(Long domain) { - return domainElementMatches.get(domain); + public List getMatchedElements(Long model) { + return modelElementMatches.get(model); } - public Map> getDomainElementMatches() { - return domainElementMatches; + public Map> getModelElementMatches() { + return modelElementMatches; } - public void setMatchedElements(Long domain, List elementMatches) { - domainElementMatches.put(domain, elementMatches); + public void setMatchedElements(Long model, List elementMatches) { + modelElementMatches.put(model, elementMatches); } } 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 797800d5f..d11ae10d1 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,19 +1,25 @@ package com.tencent.supersonic.chat.api.pojo; -import java.util.*; - import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; 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 String queryMode; - private SchemaElement domain; + private SchemaElement model; private Set metrics = new TreeSet<>(new SchemaNameLengthComparator()); private Set dimensions = new LinkedHashSet(); private SchemaElement entity; @@ -28,15 +34,16 @@ public class SemanticParseInfo { private List elementMatches = new ArrayList<>(); private Map properties = new HashMap<>(); - public Long getDomainId() { - return domain != null ? domain.getId() : 0L; + public Long getModelId() { + return model != null ? model.getId() : 0L; } - public String getDomainName() { - return domain != null ? domain.getName() : "null"; + public String getModelName() { + return model != null ? model.getName() : "null"; } private static class SchemaNameLengthComparator implements Comparator { + @Override public int compare(SchemaElement o1, SchemaElement o2) { int len1 = o1.getName().length(); @@ -49,4 +56,11 @@ public class SemanticParseInfo { } } + public Set getMetrics() { + Set metricSet = new TreeSet<>(new SchemaNameLengthComparator()); + metricSet.addAll(metrics); + metrics = metricSet; + return metrics; + } + } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticSchema.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticSchema.java index 6c9e86d44..ed91180a0 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticSchema.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticSchema.java @@ -7,48 +7,49 @@ import java.util.Map; import java.util.stream.Collectors; public class SemanticSchema implements Serializable { - private List domainSchemaList; - public SemanticSchema(List domainSchemaList) { - this.domainSchemaList = domainSchemaList; + private List modelSchemaList; + + public SemanticSchema(List modelSchemaList) { + this.modelSchemaList = modelSchemaList; } - public void add(DomainSchema schema) { - domainSchemaList.add(schema); + public void add(ModelSchema schema) { + modelSchemaList.add(schema); } - public Map getDomainIdToName() { - return domainSchemaList.stream() - .collect(Collectors.toMap(a -> a.getDomain().getId(), a -> a.getDomain().getName(), (k1, k2) -> k1)); + public Map getModelIdToName() { + return modelSchemaList.stream() + .collect(Collectors.toMap(a -> a.getModel().getId(), a -> a.getModel().getName(), (k1, k2) -> k1)); } public List getDimensionValues() { List dimensionValues = new ArrayList<>(); - domainSchemaList.stream().forEach(d -> dimensionValues.addAll(d.getDimensionValues())); + modelSchemaList.stream().forEach(d -> dimensionValues.addAll(d.getDimensionValues())); return dimensionValues; } public List getDimensions() { List dimensions = new ArrayList<>(); - domainSchemaList.stream().forEach(d -> dimensions.addAll(d.getDimensions())); + modelSchemaList.stream().forEach(d -> dimensions.addAll(d.getDimensions())); return dimensions; } public List getMetrics() { List metrics = new ArrayList<>(); - domainSchemaList.stream().forEach(d -> metrics.addAll(d.getMetrics())); + modelSchemaList.stream().forEach(d -> metrics.addAll(d.getMetrics())); return metrics; } - public List getDomains() { - List domains = new ArrayList<>(); - domainSchemaList.stream().forEach(d -> domains.add(d.getDomain())); - return domains; + public List getModels() { + List models = new ArrayList<>(); + modelSchemaList.stream().forEach(d -> models.add(d.getModel())); + return models; } public List getEntities() { List entities = new ArrayList<>(); - domainSchemaList.stream().forEach(d -> entities.add(d.getEntity())); + modelSchemaList.stream().forEach(d -> entities.add(d.getEntity())); return entities; } } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatAggConfigReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatAggConfigReq.java index 56d83c326..fea0f2e05 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatAggConfigReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatAggConfigReq.java @@ -1,8 +1,7 @@ package com.tencent.supersonic.chat.api.pojo.request; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class ChatAggConfigReq { @@ -13,7 +12,7 @@ public class ChatAggConfigReq { private ItemVisibility visibility; /** - * information about dictionary about the domain + * information about dictionary about the model */ private List knowledgeInfos; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigBaseReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigBaseReq.java index b1b64d647..b5453d036 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigBaseReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigBaseReq.java @@ -1,34 +1,32 @@ package com.tencent.supersonic.chat.api.pojo.request; import com.tencent.supersonic.common.pojo.enums.StatusEnum; - +import java.util.List; import lombok.Data; import lombok.ToString; -import java.util.List; - /** - * extended information command about domain + * extended information command about model */ @Data @ToString public class ChatConfigBaseReq { - private Long domainId; + private Long modelId; /** - * the chatDetailConfig about the domain + * the chatDetailConfig about the model */ private ChatDetailConfigReq chatDetailConfig; /** - * the chatAggConfig about the domain + * the chatAggConfig about the model */ private ChatAggConfigReq chatAggConfig; /** - * the recommended questions about the domain + * the recommended questions about the model */ private List recommendedQuestions; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigFilter.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigFilter.java index 61cbdfe2c..cc9095bdf 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigFilter.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigFilter.java @@ -10,6 +10,6 @@ import lombok.NoArgsConstructor; public class ChatConfigFilter { private Long id; - private Long domainId; + private Long modelId; private StatusEnum status = StatusEnum.ONLINE; } \ No newline at end of file diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDefaultConfigReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDefaultConfigReq.java index 33ca4889c..eb46d8948 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDefaultConfigReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDefaultConfigReq.java @@ -2,10 +2,9 @@ package com.tencent.supersonic.chat.api.pojo.request; import com.tencent.supersonic.common.pojo.Constants; -import lombok.Data; - import java.util.ArrayList; import java.util.List; +import lombok.Data; @Data public class ChatDefaultConfigReq { diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDetailConfigReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDetailConfigReq.java index 6d3468c7f..dae93c376 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDetailConfigReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDetailConfigReq.java @@ -1,8 +1,7 @@ package com.tencent.supersonic.chat.api.pojo.request; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class ChatDetailConfigReq { @@ -13,7 +12,7 @@ public class ChatDetailConfigReq { private ItemVisibility visibility; /** - * information about dictionary about the domain + * information about dictionary about the model */ private List knowledgeInfos; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/Entity.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/Entity.java index 373b3cc11..6848e1dd2 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/Entity.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/Entity.java @@ -7,7 +7,7 @@ import lombok.NoArgsConstructor; import lombok.ToString; /** - * the entity info about the domain + * the entity info about the model */ @Data @AllArgsConstructor 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 b1f4d6013..51ce237a2 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 @@ -7,6 +7,7 @@ import lombok.Data; @Data public class ExecuteQueryReq { + private User user; private Integer chatId; private String queryText; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeAdvancedConfig.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeAdvancedConfig.java index 3c5d8d501..d7644a269 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeAdvancedConfig.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeAdvancedConfig.java @@ -1,9 +1,8 @@ package com.tencent.supersonic.chat.api.pojo.request; -import lombok.Data; - import java.util.ArrayList; import java.util.List; +import lombok.Data; /** * advanced knowledge config diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeInfoReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeInfoReq.java index 0ec5707db..1ef5adc2c 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeInfoReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeInfoReq.java @@ -1,20 +1,18 @@ package com.tencent.supersonic.chat.api.pojo.request; import com.tencent.supersonic.common.pojo.enums.TypeEnums; - import javax.validation.constraints.NotNull; - import lombok.Data; /** - * information about dictionary about the domain + * information about dictionary about the model */ @Data public class KnowledgeInfoReq { /** - * metricId、DimensionId、domainId + * metricId、DimensionId、modelId */ private Long itemId; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PluginQueryReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PluginQueryReq.java index 14939bc63..72b31244a 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PluginQueryReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PluginQueryReq.java @@ -13,7 +13,7 @@ public class PluginQueryReq { private String type; - private String domain; + private String model; private String pattern; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryDataReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryDataReq.java index 1dbaa4137..e2dd67e03 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryDataReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryDataReq.java @@ -1,18 +1,18 @@ package com.tencent.supersonic.chat.api.pojo.request; -import java.util.HashSet; -import java.util.Set; - import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.Order; +import java.util.HashSet; +import java.util.Set; import lombok.Data; @Data public class QueryDataReq { + String queryMode; - SchemaElement domain; + SchemaElement model; Set metrics = new HashSet<>(); Set dimensions = new HashSet<>(); Set dimensionFilters = new HashSet<>(); diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilters.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilters.java index 903288cd1..a5f06518a 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilters.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilters.java @@ -1,13 +1,14 @@ package com.tencent.supersonic.chat.api.pojo.request; -import lombok.Data; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import lombok.Data; @Data public class QueryFilters { + private List filters = new ArrayList<>(); private Map params = new HashMap<>(); } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryReq.java index 0e8c686ad..82f28358b 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryReq.java @@ -5,9 +5,10 @@ import lombok.Data; @Data public class QueryReq { + private String queryText; private Integer chatId; - private Long domainId = 0L; + private Long modelId = 0L; private User user; private QueryFilters queryFilters; 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 96cb05e13..57acac1f6 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,5 +6,6 @@ import lombok.Data; @Data public class AggregateInfo { - private List metricInfos = new ArrayList<>(); + + private List metricInfos = new ArrayList<>(); } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatAggRichConfigResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatAggRichConfigResp.java index b69a16f3c..dc6b80cdc 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatAggRichConfigResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatAggRichConfigResp.java @@ -2,9 +2,8 @@ package com.tencent.supersonic.chat.api.pojo.response; import com.tencent.supersonic.chat.api.pojo.request.KnowledgeAdvancedConfig; import com.tencent.supersonic.chat.api.pojo.request.KnowledgeInfoReq; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class ChatAggRichConfigResp { @@ -15,7 +14,7 @@ public class ChatAggRichConfigResp { private ItemVisibilityInfo visibility; /** - * information about dictionary about the domain + * information about dictionary about the model */ private List knowledgeInfos; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigResp.java index c32efdd1b..6a23e65ba 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigResp.java @@ -4,10 +4,8 @@ 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.RecommendedQuestionReq; import com.tencent.supersonic.common.pojo.enums.StatusEnum; - import java.util.Date; import java.util.List; - import lombok.Data; @Data @@ -15,7 +13,7 @@ public class ChatConfigResp { private Long id; - private Long domainId; + private Long modelId; private ChatDetailConfigReq chatDetailConfig; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigRichResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigRichResp.java index e6f8e75a3..c75ffebca 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigRichResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigRichResp.java @@ -4,7 +4,6 @@ import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestionReq; import com.tencent.supersonic.common.pojo.enums.StatusEnum; import java.util.Date; import java.util.List; - import lombok.Data; @Data @@ -12,9 +11,9 @@ public class ChatConfigRichResp { private Long id; - private Long domainId; + private Long modelId; - private String domainName; + private String modelName; private String bizName; private ChatAggRichConfigResp chatAggRichConfig; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDefaultRichConfigResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDefaultRichConfigResp.java index 6ef966681..c0c3f8544 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDefaultRichConfigResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDefaultRichConfigResp.java @@ -4,9 +4,8 @@ package com.tencent.supersonic.chat.api.pojo.response; import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.request.ChatDefaultConfigReq; import com.tencent.supersonic.common.pojo.Constants; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class ChatDefaultRichConfigResp { diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDetailRichConfigResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDetailRichConfigResp.java index a3dbd60d8..734891766 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDetailRichConfigResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDetailRichConfigResp.java @@ -2,9 +2,8 @@ package com.tencent.supersonic.chat.api.pojo.response; import com.tencent.supersonic.chat.api.pojo.request.KnowledgeAdvancedConfig; import com.tencent.supersonic.chat.api.pojo.request.KnowledgeInfoReq; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class ChatDetailRichConfigResp { @@ -15,7 +14,7 @@ public class ChatDetailRichConfigResp { private ItemVisibilityInfo visibility; /** - * information about dictionary about the domain + * information about dictionary about the model */ private List knowledgeInfos; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityInfo.java index 0f0039380..f7e606469 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityInfo.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityInfo.java @@ -7,7 +7,7 @@ import lombok.Data; @Data public class EntityInfo { - private DomainInfo domainInfo = new DomainInfo(); + private ModelInfo modelInfo = new ModelInfo(); private List dimensions = new ArrayList<>(); private List metrics = new ArrayList<>(); private String entityId; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityRichInfoResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityRichInfoResp.java index a8610fed1..655ad5519 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityRichInfoResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityRichInfoResp.java @@ -1,14 +1,14 @@ package com.tencent.supersonic.chat.api.pojo.response; import com.tencent.supersonic.chat.api.pojo.SchemaElement; - import java.util.List; import lombok.Data; @Data public class EntityRichInfoResp { + /** - * entity alias + * entity alias */ private List names; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DomainInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ModelInfo.java similarity index 75% rename from chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DomainInfo.java rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ModelInfo.java index 2be895e86..4600ca74b 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DomainInfo.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ModelInfo.java @@ -5,7 +5,7 @@ import java.util.List; import lombok.Data; @Data -public class DomainInfo extends DataInfo implements Serializable { +public class ModelInfo extends DataInfo implements Serializable { private List words; private String primaryEntityBizName; 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 6fd7f33e2..e096199cc 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,9 +1,12 @@ package com.tencent.supersonic.chat.api.pojo.response; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import lombok.*; - import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; @Data @Getter @@ -11,6 +14,7 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor public class ParseResp { + private Integer chatId; private String queryText; private ParseState state; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestionResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestionResp.java index 62d106faf..e4b24088b 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestionResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestionResp.java @@ -1,14 +1,14 @@ package com.tencent.supersonic.chat.api.pojo.response; import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestionReq; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Data; -import java.util.List; - @Data @AllArgsConstructor public class RecommendQuestionResp { - private Long domainId; + + private Long modelId; private List recommendedQuestions; } diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendResp.java index 8490ab549..cbc794ef7 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendResp.java @@ -1,12 +1,12 @@ package com.tencent.supersonic.chat.api.pojo.response; import com.tencent.supersonic.chat.api.pojo.SchemaElement; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class RecommendResp { + private List dimensions; private List metrics; } 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 7cf443bd7..72abbed20 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 @@ -2,8 +2,6 @@ package com.tencent.supersonic.chat.api.pojo.response; import java.util.List; import lombok.Data; -import lombok.Getter; -import lombok.Setter; @Data public class SearchResp { diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResult.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResult.java index 3c0c6a7a1..e2426cfbb 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResult.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResult.java @@ -17,9 +17,9 @@ public class SearchResult { private String subRecommend; - private String domainName; + private String modelName; - private Long domainId; + private Long modelId; private SchemaElementType schemaElementType; @@ -34,12 +34,12 @@ public class SearchResult { return false; } SearchResult searchResult1 = (SearchResult) o; - return Objects.equals(recommend, searchResult1.recommend) && Objects.equals(domainName, - searchResult1.domainName); + return Objects.equals(recommend, searchResult1.recommend) && Objects.equals(modelName, + searchResult1.modelName); } @Override public int hashCode() { - return Objects.hash(recommend, domainName); + return Objects.hash(recommend, modelName); } } diff --git a/chat/core/pom.xml b/chat/core/pom.xml index 860369e16..2e9314c4a 100644 --- a/chat/core/pom.xml +++ b/chat/core/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> chat com.tencent.supersonic 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 934b0ae21..3fabb66e1 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,13 @@ package com.tencent.supersonic.chat.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; + @Configuration @Data public class AggregatorConfig { - @Value("${metric.aggregator.ratio.enable:true}") - private Boolean enableRatio; + + @Value("${metric.aggregator.ratio.enable:true}") + private Boolean enableRatio; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfig.java index ecffde18b..cefb8ddab 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfig.java @@ -3,13 +3,12 @@ package com.tencent.supersonic.chat.config; 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.RecommendedQuestionReq; -import com.tencent.supersonic.common.pojo.enums.StatusEnum; import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import java.util.List; import lombok.Data; import lombok.ToString; -import java.util.List; - @Data @ToString public class ChatConfig { @@ -19,15 +18,15 @@ public class ChatConfig { */ private Long id; - private Long domainId; + private Long modelId; /** - * the chatDetailConfig about the domain + * the chatDetailConfig about the model */ private ChatDetailConfigReq chatDetailConfig; /** - * the chatAggConfig about the domain + * the chatAggConfig about the model */ private ChatAggConfigReq chatAggConfig; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilterInternal.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilterInternal.java index d6c634ca5..e298ae14b 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilterInternal.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilterInternal.java @@ -6,6 +6,6 @@ import lombok.Data; public class ChatConfigFilterInternal { private Long id; - private Long domainId; + private Long modelId; private Integer status; } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetricInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetricInfo.java index 227f3f679..df5d71b84 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetricInfo.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetricInfo.java @@ -6,7 +6,7 @@ import lombok.ToString; /** - * default metrics about the domain + * default metrics about the model */ @ToString diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallInfoConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallInfoConfig.java index ec23773bd..de2a1e490 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallInfoConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallInfoConfig.java @@ -7,6 +7,7 @@ import org.springframework.context.annotation.Configuration; @Configuration @Data public class FunctionCallInfoConfig { + @Value("${functionCall.url:}") private String url; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainInfoStat.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainInfoStat.java deleted file mode 100644 index f65f29bef..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainInfoStat.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tencent.supersonic.chat.mapper; - -import java.io.Serializable; -import lombok.Builder; -import lombok.Data; -import lombok.ToString; - -@Data -@ToString -@Builder -public class DomainInfoStat implements Serializable { - - private long domainCount; - - private long metricDomainCount; - - private long dimensionDomainCount; - - private long dimensionValueDomainCount; - -} \ No newline at end of file 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 6ae9ceeba..388b76212 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,14 +2,19 @@ package com.tencent.supersonic.chat.mapper; import com.tencent.supersonic.chat.api.component.SchemaMapper; -import com.tencent.supersonic.chat.api.pojo.*; +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.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 @@ -18,20 +23,20 @@ public class EntityMapper implements SchemaMapper { @Override public void map(QueryContext queryContext) { SchemaMapInfo schemaMapInfo = queryContext.getMapInfo(); - for (Long domainId : schemaMapInfo.getMatchedDomains()) { - List schemaElementMatchList = schemaMapInfo.getMatchedElements(domainId); + for (Long modelId : schemaMapInfo.getMatchedModels()) { + List schemaElementMatchList = schemaMapInfo.getMatchedElements(modelId); if (CollectionUtils.isEmpty(schemaElementMatchList)) { continue; } - SchemaElement entity = getEntity(domainId); + SchemaElement entity = getEntity(modelId); if (entity == null || entity.getId() == null) { 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())){ + if (!entity.getId().equals(schemaElementMatch.getElement().getId())) { continue; } if (!checkExistSameEntitySchemaElements(schemaElementMatch, schemaElementMatchList)) { @@ -46,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()); @@ -58,11 +63,11 @@ public class EntityMapper implements SchemaMapper { return false; } - private SchemaElement getEntity(Long domainId) { + private SchemaElement getEntity(Long modelId) { SemanticService semanticService = ContextUtils.getBean(SemanticService.class); - DomainSchema domainSchema = semanticService.getDomainSchema(domainId); - if (domainSchema != null && domainSchema.getEntity() != null) { - return domainSchema.getEntity(); + ModelSchema modelSchema = semanticService.getModelSchema(modelId); + if (modelSchema != null && modelSchema.getEntity() != null) { + return modelSchema.getEntity(); } return null; } 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 470f43236..0dc646005 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,10 +2,14 @@ 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.*; import com.tencent.supersonic.chat.api.pojo.QueryContext; -import com.tencent.supersonic.knowledge.service.SchemaService; +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.SemanticSchema; import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.knowledge.service.SchemaService; import com.tencent.supersonic.knowledge.utils.HanlpHelper; import java.util.ArrayList; import java.util.Comparator; @@ -39,13 +43,13 @@ public class FuzzyNameMapper implements SchemaMapper { log.debug("after db mapper,mapInfo:{}", queryContext.getMapInfo()); } - private void detectAndAddToSchema(QueryContext queryContext, List terms, List domains, - SchemaElementType schemaElementType) { + private void detectAndAddToSchema(QueryContext queryContext, List terms, List Models, + SchemaElementType schemaElementType) { try { - Map> domainResultSet = getResultSet(queryContext, terms, domains); + Map> ModelResultSet = getResultSet(queryContext, terms, Models); - addToSchemaMapInfo(domainResultSet, queryContext.getMapInfo(), schemaElementType); + addToSchemaMapInfo(ModelResultSet, queryContext.getMapInfo(), schemaElementType); } catch (Exception e) { log.error("detectAndAddToSchema error", e); @@ -53,7 +57,7 @@ public class FuzzyNameMapper implements SchemaMapper { } private Map> getResultSet(QueryContext queryContext, List terms, - List domains) { + List Models) { String queryText = queryContext.getRequest().getQueryText(); @@ -61,12 +65,12 @@ public class FuzzyNameMapper implements SchemaMapper { Double metricDimensionThresholdConfig = getThreshold(queryContext, mapperHelper); - Map> nameToItems = getNameToItems(domains); + 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> domainResultSet = 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); @@ -82,7 +86,7 @@ public class FuzzyNameMapper implements SchemaMapper { || mapperHelper.getSimilarity(detectSegment, name) < metricDimensionThresholdConfig) { continue; } - Set preSchemaElements = domainResultSet.putIfAbsent(detectSegment, + Set preSchemaElements = ModelResultSet.putIfAbsent(detectSegment, schemaElements); if (Objects.nonNull(preSchemaElements)) { preSchemaElements.addAll(schemaElements); @@ -91,7 +95,7 @@ public class FuzzyNameMapper implements SchemaMapper { } startIndex = mapperHelper.getStepIndex(regOffsetToLength, startIndex); } - return domainResultSet; + return ModelResultSet; } private Double getThreshold(QueryContext queryContext, MapperHelper mapperHelper) { @@ -99,9 +103,9 @@ public class FuzzyNameMapper implements SchemaMapper { Double metricDimensionThresholdConfig = mapperHelper.getMetricDimensionThresholdConfig(); Double metricDimensionMinThresholdConfig = mapperHelper.getMetricDimensionMinThresholdConfig(); - Map> domainElementMatches = queryContext.getMapInfo() - .getDomainElementMatches(); - boolean existElement = domainElementMatches.entrySet().stream() + Map> ModelElementMatches = queryContext.getMapInfo() + .getModelElementMatches(); + boolean existElement = ModelElementMatches.entrySet().stream() .anyMatch(entry -> entry.getValue().size() >= 1); if (!existElement) { @@ -109,14 +113,14 @@ public class FuzzyNameMapper implements SchemaMapper { metricDimensionThresholdConfig = halfThreshold >= metricDimensionMinThresholdConfig ? halfThreshold : metricDimensionMinThresholdConfig; - log.info("domainElementMatches:{} , not exist Element metricDimensionThresholdConfig reduce by half:{}", - domainElementMatches, metricDimensionThresholdConfig); + log.info("ModelElementMatches:{} , not exist Element metricDimensionThresholdConfig reduce by half:{}", + ModelElementMatches, metricDimensionThresholdConfig); } return metricDimensionThresholdConfig; } - private Map> getNameToItems(List domains) { - return domains.stream().collect( + private Map> getNameToItems(List Models) { + return Models.stream().collect( Collectors.toMap(SchemaElement::getName, a -> { Set result = new HashSet<>(); result.add(a); @@ -139,10 +143,10 @@ public class FuzzyNameMapper implements SchemaMapper { Set schemaElements = entry.getValue(); for (SchemaElement schemaElement : schemaElements) { - List elements = schemaMap.getMatchedElements(schemaElement.getDomain()); + List elements = schemaMap.getMatchedElements(schemaElement.getModel()); if (CollectionUtils.isEmpty(elements)) { elements = new ArrayList<>(); - schemaMap.setMatchedElements(schemaElement.getDomain(), elements); + schemaMap.setMatchedElements(schemaElement.getModel(), elements); } Set regElementSet = elements.stream() .filter(elementMatch -> schemaElementType.equals(elementMatch.getElement().getType())) 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 c58e177c4..063822984 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 @@ -2,13 +2,18 @@ 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.*; +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.service.SemanticService; import com.tencent.supersonic.chat.utils.NatureHelper; -import com.tencent.supersonic.knowledge.dictionary.builder.BaseWordBuilder; -import com.tencent.supersonic.knowledge.dictionary.MapResult; -import com.tencent.supersonic.knowledge.dictionary.DictWordType; import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import com.tencent.supersonic.knowledge.dictionary.MapResult; +import com.tencent.supersonic.knowledge.dictionary.builder.BaseWordBuilder; import com.tencent.supersonic.knowledge.dictionary.builder.WordBuilderFactory; import com.tencent.supersonic.knowledge.utils.HanlpHelper; import java.util.ArrayList; @@ -32,10 +37,10 @@ public class HanlpDictMapper implements SchemaMapper { for (Term term : terms) { log.info("word:{},nature:{},frequency:{}", term.word, term.nature.toString(), term.getFrequency()); } - Long domainId = queryContext.getRequest().getDomainId(); + Long modelId = queryContext.getRequest().getModelId(); QueryMatchStrategy matchStrategy = ContextUtils.getBean(QueryMatchStrategy.class); - Map> matchResult = matchStrategy.match(queryText, terms, domainId); + Map> matchResult = matchStrategy.match(queryText, terms, modelId); List matches = getMatches(matchResult); @@ -57,8 +62,8 @@ public class HanlpDictMapper implements SchemaMapper { for (MapResult mapResult : mapResults) { for (String nature : mapResult.getNatures()) { - Long domainId = NatureHelper.getDomainId(nature); - if (Objects.isNull(domainId)) { + Long modelId = NatureHelper.getModelId(nature); + if (Objects.isNull(modelId)) { continue; } SchemaElementType elementType = NatureHelper.convertToElementType(nature); @@ -67,14 +72,14 @@ public class HanlpDictMapper implements SchemaMapper { } SemanticService schemaService = ContextUtils.getBean(SemanticService.class); - DomainSchema domainSchema = schemaService.getDomainSchema(domainId); + ModelSchema modelSchema = schemaService.getModelSchema(modelId); BaseWordBuilder baseWordBuilder = WordBuilderFactory.get(DictWordType.getNatureType(nature)); Long elementID = baseWordBuilder.getElementID(nature); Long frequency = wordNatureToFrequency.get(mapResult.getName() + nature); - SchemaElement element = domainSchema.getElement(elementType, elementID); - if(Objects.isNull(element)){ + SchemaElement element = modelSchema.getElement(elementType, elementID); + if (Objects.isNull(element)) { log.info("element is null, elementType:{},elementID:{}", elementType, elementID); continue; } @@ -89,11 +94,11 @@ public class HanlpDictMapper implements SchemaMapper { .detectWord(mapResult.getDetectWord()) .build(); - Map> domainElementMatches = schemaMap.getDomainElementMatches(); - List schemaElementMatches = domainElementMatches.putIfAbsent(domainId, + Map> modelElementMatches = schemaMap.getModelElementMatches(); + List schemaElementMatches = modelElementMatches.putIfAbsent(modelId, new ArrayList<>()); if (schemaElementMatches == null) { - schemaElementMatches = domainElementMatches.get(domainId); + schemaElementMatches = modelElementMatches.get(modelId); } schemaElementMatches.add(schemaElementMatch); } 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 7fc691404..0a3787153 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 @@ -83,4 +83,6 @@ public class MapperHelper { return 1 - (double) EditDistance.compute(detectSegmentLower, matchNameLower) / Math.max(matchName.length(), detectSegment.length()); } + + } \ 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 ea9db99f3..1a25a6475 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 @@ -2,7 +2,6 @@ package com.tencent.supersonic.chat.mapper; import com.hankcs.hanlp.seg.common.Term; import com.tencent.supersonic.knowledge.dictionary.MapResult; - import java.util.List; import java.util.Map; @@ -11,6 +10,6 @@ import java.util.Map; */ public interface MatchStrategy { - Map> match(String text, List terms, Long detectDomainId); + Map> match(String text, List terms, Long detectModelId); } \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelInfoStat.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelInfoStat.java new file mode 100644 index 000000000..c1f249fc6 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelInfoStat.java @@ -0,0 +1,21 @@ +package com.tencent.supersonic.chat.mapper; + +import java.io.Serializable; +import lombok.Builder; +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +@Builder +public class ModelInfoStat implements Serializable { + + private long modelCount; + + private long metricModelCount; + + private long dimensionModelCount; + + private long dimensionValueModelCount; + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainWithSemanticType.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelWithSemanticType.java similarity index 59% rename from chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainWithSemanticType.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelWithSemanticType.java index 78777b937..b22c573ef 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainWithSemanticType.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelWithSemanticType.java @@ -7,13 +7,13 @@ import lombok.ToString; @Data @ToString -public class DomainWithSemanticType implements Serializable { +public class ModelWithSemanticType implements Serializable { - private Long domain; + private Long model; private SchemaElementType semanticType; - public DomainWithSemanticType(Long domain, SchemaElementType semanticType) { - this.domain = domain; + public ModelWithSemanticType(Long model, SchemaElementType semanticType) { + this.model = model; this.semanticType = semanticType; } } \ 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 9134d1541..cd9e7dd31 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 @@ -2,15 +2,20 @@ 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.*; +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.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.CollectionUtils; +import com.tencent.supersonic.common.pojo.Constants; 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 { @@ -21,35 +26,35 @@ public class QueryFilterMapper implements SchemaMapper { @Override public void map(QueryContext queryContext) { QueryReq queryReq = queryContext.getRequest(); - Long domainId = queryReq.getDomainId(); - if (domainId == null || domainId <= 0) { + Long modelId = queryReq.getModelId(); + if (modelId == null || modelId <= 0) { return; } SchemaMapInfo schemaMapInfo = queryContext.getMapInfo(); - clearOtherSchemaElementMatch(domainId, schemaMapInfo); - List schemaElementMatches = schemaMapInfo.getMatchedElements(domainId); + clearOtherSchemaElementMatch(modelId, schemaMapInfo); + List schemaElementMatches = schemaMapInfo.getMatchedElements(modelId); if (schemaElementMatches == null) { schemaElementMatches = Lists.newArrayList(); - schemaMapInfo.setMatchedElements(domainId, schemaElementMatches); + schemaMapInfo.setMatchedElements(modelId, schemaElementMatches); } addValueSchemaElementMatch(schemaElementMatches, queryReq.getQueryFilters()); } - private void clearOtherSchemaElementMatch(Long domainId, SchemaMapInfo schemaMapInfo) { - for (Map.Entry> entry : schemaMapInfo.getDomainElementMatches().entrySet()) { - if (!entry.getKey().equals(domainId)) { + private void clearOtherSchemaElementMatch(Long modelId, SchemaMapInfo schemaMapInfo) { + for (Map.Entry> entry : schemaMapInfo.getModelElementMatches().entrySet()) { + if (!entry.getKey().equals(modelId)) { entry.getValue().clear(); } } } private List addValueSchemaElementMatch(List candidateElementMatches, - QueryFilters queryFilter) { + QueryFilters queryFilter) { if (queryFilter == null || CollectionUtils.isEmpty(queryFilter.getFilters())) { return candidateElementMatches; } for (QueryFilter filter : queryFilter.getFilters()) { - if (checkExistSameValueSchemaElementMatch(filter, candidateElementMatches)) { + if (checkExistSameValueSchemaElementMatch(filter, candidateElementMatches)) { continue; } SchemaElement element = SchemaElement.builder() @@ -63,7 +68,7 @@ public class QueryFilterMapper implements SchemaMapper { .frequency(FREQUENCY) .word(String.valueOf(filter.getValue())) .similarity(SIMILARITY) - .detectWord(filter.getName()) + .detectWord(Constants.EMPTY) .build(); candidateElementMatches.add(schemaElementMatch); } @@ -71,13 +76,13 @@ 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()); for (SchemaElementMatch schemaElementMatch : valueSchemaElements) { if (schemaElementMatch.getElement().getId().equals(queryFilter.getElementID()) - && schemaElementMatch.getWord().equals(String.valueOf(queryFilter.getValue()))) { + && schemaElementMatch.getWord().equals(String.valueOf(queryFilter.getValue()))) { return true; } } 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 a04ee3edd..8e1a085dc 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,10 +1,10 @@ package com.tencent.supersonic.chat.mapper; import com.hankcs.hanlp.seg.common.Term; -import com.tencent.supersonic.knowledge.dictionary.MapResult; +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; import java.util.Comparator; import java.util.HashMap; @@ -32,7 +32,7 @@ public class QueryMatchStrategy implements MatchStrategy { private MapperHelper mapperHelper; @Override - public Map> match(String text, List terms, Long detectDomainId) { + public Map> match(String text, List terms, Long detectmodelId) { if (Objects.isNull(terms) || StringUtils.isEmpty(text)) { return null; } @@ -43,10 +43,10 @@ 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:{},detectDomainId:{}", terms, - regOffsetToLength, offsetList, detectDomainId); + log.debug("retryCount:{},terms:{},regOffsetToLength:{},offsetList:{},detectmodelId:{}", terms, + regOffsetToLength, offsetList, detectmodelId); - List detects = detect(text, regOffsetToLength, offsetList, detectDomainId); + List detects = detect(text, regOffsetToLength, offsetList, detectmodelId); Map> result = new HashMap<>(); MatchText matchText = MatchText.builder() @@ -58,7 +58,7 @@ public class QueryMatchStrategy implements MatchStrategy { } private List detect(String text, Map regOffsetToLength, List offsetList, - Long detectDomainId) { + Long detectmodelId) { List results = Lists.newArrayList(); for (Integer index = 0; index <= text.length() - 1; ) { @@ -69,18 +69,44 @@ public class QueryMatchStrategy implements MatchStrategy { int offset = mapperHelper.getStepOffset(offsetList, index); i = mapperHelper.getStepIndex(regOffsetToLength, i); if (i <= text.length()) { - List mapResults = detectByStep(text, detectDomainId, index, i, offset); - mapResultRowSet.addAll(mapResults); + List mapResults = detectByStep(text, detectmodelId, index, i, offset); + selectMapResultInOneRound(mapResultRowSet, mapResults); } } - index = mapperHelper.getStepIndex(regOffsetToLength, index); results.addAll(mapResultRowSet); } return results; } - private List detectByStep(String text, Long detectDomainId, Integer index, Integer i, int offset) { + private void selectMapResultInOneRound(Set mapResultRowSet, List mapResults) { + for (MapResult mapResult : mapResults) { + if (mapResultRowSet.contains(mapResult)) { + boolean isDeleted = mapResultRowSet.removeIf( + entry -> { + boolean deleted = getMapKey(mapResult).equals(getMapKey(entry)) + && entry.getDetectWord().length() < mapResult.getDetectWord().length(); + if (deleted) { + log.info("deleted entry:{}", entry); + } + return deleted; + } + ); + if (isDeleted) { + log.info("deleted, add mapResult:{}", mapResult); + mapResultRowSet.add(mapResult); + } + } else { + mapResultRowSet.add(mapResult); + } + } + } + + private String getMapKey(MapResult a) { + return a.getName() + Constants.UNDERLINE + String.join(Constants.UNDERLINE, a.getNatures()); + } + + private List detectByStep(String text, Long detectmodelId, Integer index, Integer i, int offset) { String detectSegment = text.substring(index, i); Integer oneDetectionSize = mapperHelper.getOneDetectionSize(); // step1. pre search @@ -100,17 +126,17 @@ public class QueryMatchStrategy implements MatchStrategy { mapResults = mapResults.stream().sorted((a, b) -> -(b.getName().length() - a.getName().length())) .collect(Collectors.toCollection(LinkedHashSet::new)); // step4. filter by classId - if (Objects.nonNull(detectDomainId) && detectDomainId > 0) { - log.debug("detectDomainId:{}, before parseResults:{}", mapResults); + 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 + detectDomainId) || (nature.startsWith( + 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 domainId parseResults:{}", mapResults); + log.info("after modelId parseResults:{}", mapResults); } // step5. filter by similarity mapResults = mapResults.stream() 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 91c7be09b..bf3eb9be9 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,10 +2,9 @@ package com.tencent.supersonic.chat.mapper; import com.google.common.collect.Lists; import com.hankcs.hanlp.seg.common.Term; -import com.tencent.supersonic.knowledge.dictionary.MapResult; 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; @@ -25,7 +24,7 @@ public class SearchMatchStrategy implements MatchStrategy { @Override public Map> match(String text, List originals, - Long detectDomainId) { + Long detectModelId) { Map regOffsetToLength = originals.stream() .filter(entry -> !entry.nature.toString().startsWith(DictWordType.NATURE_SPILT)) @@ -60,10 +59,10 @@ public class SearchMatchStrategy implements MatchStrategy { List natures = entry.getNatures().stream() .filter(nature -> !nature.endsWith(DictWordType.ENTITY.getType())) .filter(nature -> { - if (Objects.isNull(detectDomainId) || detectDomainId <= 0) { + if (Objects.isNull(detectModelId) || detectModelId <= 0) { return true; } - if (nature.startsWith(DictWordType.NATURE_SPILT + detectDomainId) + if (nature.startsWith(DictWordType.NATURE_SPILT + detectModelId) && nature.startsWith(DictWordType.NATURE_SPILT)) { return true; } 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 b5fb123dd..f1ab63981 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,22 +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.plugin.PluginParseResult; -import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; -import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; -import com.tencent.supersonic.common.pojo.Constants; -import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.compress.utils.Lists; -import org.apache.commons.lang3.StringUtils; -import org.springframework.util.CollectionUtils; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; /** * This checker can be used by semantic parsers to check if query intent @@ -30,86 +17,20 @@ public class SatisfactionChecker { private static final double LONG_TEXT_THRESHOLD = 0.8; private static final double SHORT_TEXT_THRESHOLD = 0.5; private static final int QUERY_TEXT_LENGTH_THRESHOLD = 10; - public static final double EMBEDDING_THRESHOLD = 0.2; // check all the parse info in candidate - public static boolean check(QueryContext queryCtx) { - for (SemanticQuery query : queryCtx.getCandidateQueries()) { - if (query instanceof RuleSemanticQuery) { - if (checkRuleThreshHold(queryCtx.getRequest().getQueryText(), query.getParseInfo())) { - return true; - } - } else if (query instanceof PluginSemanticQuery) { - if (checkEmbeddingThreshold(query.getParseInfo())) { - log.info("query mode :{} satisfy check", query.getQueryMode()); - return true; - } + public static boolean check(QueryContext queryContext) { + for (SemanticQuery query : queryContext.getCandidateQueries()) { + if (checkThreshold(queryContext.getRequest().getQueryText(), query.getParseInfo())) { + return true; } } return false; } - private static boolean checkEmbeddingThreshold(SemanticParseInfo semanticParseInfo) { - Object object = semanticParseInfo.getProperties().get(Constants.CONTEXT); - PluginParseResult pluginParseResult = JsonUtil.toObject(JsonUtil.toString(object), PluginParseResult.class); - return EMBEDDING_THRESHOLD > pluginParseResult.getDistance(); - } - - //check single parse info - private static boolean checkRuleThreshHold(String text, SemanticParseInfo semanticParseInfo) { - List schemaElementMatches = semanticParseInfo.getElementMatches(); - if (CollectionUtils.isEmpty(schemaElementMatches)) { - return false; - } - List detectWords = Lists.newArrayList(); - Map detectWordMap = schemaElementMatches.stream() - .collect(Collectors.toMap(m -> m.getElement().getId(), SchemaElementMatch::getDetectWord, - (id1, id2) -> id1)); - // get detect word in text by element id in semantic layer - Long domainId = semanticParseInfo.getDomainId(); - if (domainId != null && domainId > 0) { - for (SchemaElementMatch schemaElementMatch : schemaElementMatches) { - if (SchemaElementType.DOMAIN.equals(schemaElementMatch.getElement().getType())) { - detectWords.add(schemaElementMatch.getDetectWord()); - } - } - } - for (SchemaElementMatch schemaElementMatch : schemaElementMatches) { - if (SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())) { - detectWords.add(schemaElementMatch.getDetectWord()); - } - } - for (SchemaElementMatch schemaElementMatch : schemaElementMatches) { - if (SchemaElementType.ID.equals(schemaElementMatch.getElement().getType())) { - detectWords.add(schemaElementMatch.getDetectWord()); - } - } - for (SchemaElement schemaItem : semanticParseInfo.getMetrics()) { - detectWords.add( - detectWordMap.getOrDefault(Optional.ofNullable(schemaItem.getId()).orElse(0L), "")); - // only first metric - break; - } - for (SchemaElement schemaItem : semanticParseInfo.getDimensions()) { - detectWords.add( - detectWordMap.getOrDefault(Optional.ofNullable(schemaItem.getId()).orElse(0L), "")); - // only first dimension - break; - } - String dateText = Optional.ofNullable(semanticParseInfo.getDateInfo()).orElse(new DateConf()).getText(); - if (StringUtils.isNotBlank(dateText) && !dateText.equalsIgnoreCase(Constants.NULL)) { - detectWords.add(dateText); - } - detectWords.removeIf(word -> !text.contains(word) && !text.contains(StringUtils.reverse(word))); - //compare the length between detect words and query text - return checkThreshold(text, detectWords, semanticParseInfo); - } - - private static boolean checkThreshold(String queryText, List detectWords, SemanticParseInfo semanticParseInfo) { - String detectWordsDistinct = StringUtils.join(new HashSet<>(detectWords), ""); - int detectWordsLength = detectWordsDistinct.length(); + private static boolean checkThreshold(String queryText, SemanticParseInfo semanticParseInfo) { int queryTextLength = queryText.length(); - double degree = detectWordsLength * 1.0 / queryTextLength; + double degree = semanticParseInfo.getScore() / queryTextLength; if (queryTextLength > QUERY_TEXT_LENGTH_THRESHOLD) { if (degree < LONG_TEXT_THRESHOLD) { return false; @@ -117,8 +38,8 @@ public class SatisfactionChecker { } else if (degree < SHORT_TEXT_THRESHOLD) { return false; } - log.info("queryMode:{}, degree:{}, detectWords:{}, parse info:{}", - semanticParseInfo.getQueryMode(), degree, detectWordsDistinct, semanticParseInfo); + log.info("queryMode:{}, degree:{}, parse info:{}", + semanticParseInfo.getQueryMode(), degree, semanticParseInfo); return true; } 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/embedding/EmbeddingBasedParser.java index e054bd9df..87ff3f812 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/embedding/EmbeddingBasedParser.java @@ -1,13 +1,18 @@ package com.tencent.supersonic.chat.parser.embedding; import com.google.common.collect.Lists; -import com.google.common.collect.Sets; import com.tencent.supersonic.chat.api.component.SemanticParser; -import com.tencent.supersonic.chat.api.pojo.*; +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.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; +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.api.pojo.request.QueryReq; -import com.tencent.supersonic.chat.parser.SatisfactionChecker; +import com.tencent.supersonic.chat.parser.ParseMode; import com.tencent.supersonic.chat.plugin.Plugin; import com.tencent.supersonic.chat.plugin.PluginManager; import com.tencent.supersonic.chat.plugin.PluginParseResult; @@ -17,18 +22,20 @@ import com.tencent.supersonic.chat.service.PluginService; 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.stream.Collectors; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.springframework.util.CollectionUtils; @Slf4j public class EmbeddingBasedParser implements SemanticParser { - private final static double THRESHOLD = 0.2d; - @Override public void parse(QueryContext queryContext, ChatContext chatContext) { EmbeddingConfig embeddingConfig = ContextUtils.getBean(EmbeddingConfig.class); @@ -36,109 +43,15 @@ public class EmbeddingBasedParser implements SemanticParser { return; } log.info("EmbeddingBasedParser parser query ctx: {}, chat ctx: {}", queryContext, chatContext); - Set domainIds = getDomainMatched(queryContext); String text = queryContext.getRequest().getQueryText(); - if (!CollectionUtils.isEmpty(domainIds)) { - for (Long domainId : domainIds) { - List schemaElementMatches = getMatchedElements(queryContext, domainId); - String textReplaced = replaceText(text, schemaElementMatches); - List embeddingRetrievals = recallResult(textReplaced, hasCandidateQuery(queryContext)); - Optional pluginOptional = choosePlugin(embeddingRetrievals, domainId); - log.info("domain id :{} embedding result, text:{} embeddingResp:{} ",domainId, textReplaced, embeddingRetrievals); - pluginOptional.ifPresent(plugin -> buildQuery(plugin, embeddingRetrievals, domainId, textReplaced, queryContext, schemaElementMatches)); - } - } else { - List embeddingRetrievals = recallResult(text, hasCandidateQuery(queryContext)); - Optional pluginOptional = choosePlugin(embeddingRetrievals, null); - pluginOptional.ifPresent(plugin -> buildQuery(plugin, embeddingRetrievals, null, text, queryContext, Lists.newArrayList())); - } + List embeddingRetrievals = recallResult(text); + choosePlugin(embeddingRetrievals, queryContext); } - private void buildQuery(Plugin plugin, List embeddingRetrievals, - Long domainId, String text, - QueryContext queryContext, List schemaElementMatches) { - Map embeddingRetrievalMap = embeddingRetrievals.stream() - .collect(Collectors.toMap(RecallRetrieval::getId, e -> e, (value1, value2) -> value1)); - log.info("EmbeddingBasedParser text: {} domain: {} choose plugin: [{} {}]", - text, domainId, plugin.getId(), plugin.getName()); - PluginSemanticQuery pluginQuery = QueryManager.createPluginQuery(plugin.getType()); - SemanticParseInfo semanticParseInfo = buildSemanticParseInfo(domainId, plugin, text, - queryContext.getRequest(), embeddingRetrievalMap, schemaElementMatches); - semanticParseInfo.setQueryMode(pluginQuery.getQueryMode()); - pluginQuery.setParseInfo(semanticParseInfo); - queryContext.getCandidateQueries().add(pluginQuery); - } - - private Set getDomainMatched(QueryContext queryContext) { - Long queryDomainId = queryContext.getRequest().getDomainId(); - if (queryDomainId != null && queryDomainId > 0) { - return Sets.newHashSet(queryDomainId); - } - return queryContext.getMapInfo().getMatchedDomains(); - } - - private SemanticParseInfo buildSemanticParseInfo(Long domainId, Plugin plugin, String text, QueryReq queryReq, - Map embeddingRetrievalMap, - List schemaElementMatches) { - SchemaElement schemaElement = new SchemaElement(); - schemaElement.setDomain(domainId); - schemaElement.setId(domainId); - SemanticParseInfo semanticParseInfo = new SemanticParseInfo(); - semanticParseInfo.setElementMatches(schemaElementMatches); - semanticParseInfo.setDomain(schemaElement); - double distance = Double.parseDouble(embeddingRetrievalMap.get(plugin.getId().toString()).getDistance()); - double score = text.length() * (1 - distance); - Map properties = new HashMap<>(); - PluginParseResult pluginParseResult = new PluginParseResult(); - pluginParseResult.setPlugin(plugin); - pluginParseResult.setRequest(queryReq); - pluginParseResult.setDistance(distance); - properties.put(Constants.CONTEXT, pluginParseResult); - semanticParseInfo.setProperties(properties); - semanticParseInfo.setScore(score); - fillSemanticParseInfo(semanticParseInfo); - setEntity(domainId, semanticParseInfo); - return semanticParseInfo; - } - - private List getMatchedElements(QueryContext queryContext, Long domainId) { - SchemaMapInfo schemaMapInfo = queryContext.getMapInfo(); - List schemaElementMatches = schemaMapInfo.getMatchedElements(domainId); - if (schemaElementMatches == null) { - return Lists.newArrayList(); - } - QueryReq queryReq = queryContext.getRequest(); - QueryFilters queryFilters = queryReq.getQueryFilters(); - if (queryFilters == null || CollectionUtils.isEmpty(queryFilters.getFilters())) { - return schemaElementMatches; - } - Map element = queryFilters.getFilters().stream() - .collect(Collectors.toMap(QueryFilter::getElementID, QueryFilter::getValue, (v1, v2) -> v1)); - return schemaElementMatches.stream().filter(schemaElementMatch -> - SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType()) - || SchemaElementType.ID.equals(schemaElementMatch.getElement().getType()) - || SchemaElementType.ENTITY.equals(schemaElementMatch.getElement().getType())) - .filter(schemaElementMatch -> - !element.containsKey(schemaElementMatch.getElement().getId()) || ( - element.containsKey(schemaElementMatch.getElement().getId()) && - element.get(schemaElementMatch.getElement().getId()).toString() - .equalsIgnoreCase(schemaElementMatch.getWord()) - )) - .collect(Collectors.toList()); - } - - private void setEntity(Long domainId, SemanticParseInfo semanticParseInfo) { - SemanticService semanticService = ContextUtils.getBean(SemanticService.class); - DomainSchema domainSchema = semanticService.getDomainSchema(domainId); - if (domainSchema != null && domainSchema.getEntity() != null) { - semanticParseInfo.setEntity(domainSchema.getEntity()); - } - } - - private Optional choosePlugin(List embeddingRetrievals, - Long domainId) { + private void choosePlugin(List embeddingRetrievals, + QueryContext queryContext) { if (CollectionUtils.isEmpty(embeddingRetrievals)) { - return Optional.empty(); + return; } PluginService pluginService = ContextUtils.getBean(PluginService.class); List plugins = pluginService.getPluginList(); @@ -148,27 +61,92 @@ public class EmbeddingBasedParser implements SemanticParser { if (plugin == null) { continue; } - if (domainId == null) { - return Optional.of(plugin); - } - if (!CollectionUtils.isEmpty(plugin.getDomainList()) && plugin.getDomainList().contains(domainId)) { - return Optional.of(plugin); + Pair> pair = PluginManager.resolve(plugin, queryContext); + log.info("embedding plugin resolve: {}", pair); + if (pair.getLeft()) { + List modelList = pair.getRight(); + if (CollectionUtils.isEmpty(modelList)) { + return; + } + modelList = distinctModelList(plugin, queryContext.getMapInfo(), modelList); + for (Long modelId : modelList) { + buildQuery(plugin, Double.parseDouble(embeddingRetrieval.getDistance()), modelId, queryContext, + queryContext.getMapInfo().getMatchedElements(modelId)); + } + return; } } - return Optional.empty(); } - public List recallResult(String embeddingText, boolean hasCandidateQuery) { + public List distinctModelList(Plugin plugin, SchemaMapInfo schemaMapInfo, List modelList) { + if (!plugin.isContainsAllModel()) { + return modelList; + } + boolean noElementMatch = true; + for (Long model : modelList) { + List schemaElementMatches = schemaMapInfo.getMatchedElements(model); + if (!CollectionUtils.isEmpty(schemaElementMatches)) { + noElementMatch = false; + } + } + if (noElementMatch) { + return modelList.subList(0, 1); + } + return modelList; + } + + private void buildQuery(Plugin plugin, double distance, Long modelId, + QueryContext queryContext, List schemaElementMatches) { + log.info("EmbeddingBasedParser Model: {} choose plugin: [{} {}]", modelId, plugin.getId(), plugin.getName()); + PluginSemanticQuery pluginQuery = QueryManager.createPluginQuery(plugin.getType()); + plugin.setParseMode(ParseMode.EMBEDDING_RECALL); + SemanticParseInfo semanticParseInfo = buildSemanticParseInfo(modelId, plugin, queryContext.getRequest(), + schemaElementMatches, distance); + double score = queryContext.getRequest().getQueryText().length() * (1 - distance); + semanticParseInfo.setQueryMode(pluginQuery.getQueryMode()); + semanticParseInfo.setScore(score); + pluginQuery.setParseInfo(semanticParseInfo); + queryContext.getCandidateQueries().add(pluginQuery); + } + + private SemanticParseInfo buildSemanticParseInfo(Long modelId, Plugin plugin, QueryReq queryReq, + List schemaElementMatches, double distance) { + if (modelId == null && !CollectionUtils.isEmpty(plugin.getModelList())) { + modelId = plugin.getModelList().get(0); + } + SchemaElement Model = new SchemaElement(); + Model.setModel(modelId); + Model.setId(modelId); + SemanticParseInfo semanticParseInfo = new SemanticParseInfo(); + semanticParseInfo.setElementMatches(schemaElementMatches); + semanticParseInfo.setModel(Model); + Map properties = new HashMap<>(); + PluginParseResult pluginParseResult = new PluginParseResult(); + pluginParseResult.setPlugin(plugin); + pluginParseResult.setRequest(queryReq); + pluginParseResult.setDistance(distance); + properties.put(Constants.CONTEXT, pluginParseResult); + semanticParseInfo.setProperties(properties); + semanticParseInfo.setScore(distance); + fillSemanticParseInfo(semanticParseInfo); + setEntity(modelId, semanticParseInfo); + return semanticParseInfo; + } + + 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()); + } + } + + public List recallResult(String embeddingText) { try { PluginManager pluginManager = ContextUtils.getBean(PluginManager.class); EmbeddingResp embeddingResp = pluginManager.recognize(embeddingText); List embeddingRetrievals = embeddingResp.getRetrieval(); - if(!CollectionUtils.isEmpty(embeddingRetrievals)){ - if (hasCandidateQuery) { - embeddingRetrievals = embeddingRetrievals.stream() - .filter(llmRetrieval -> Double.parseDouble(llmRetrieval.getDistance()) Math.abs(Double.parseDouble(o.getDistance())))).collect(Collectors.toList()); embeddingResp.setRetrieval(embeddingRetrievals); @@ -180,45 +158,22 @@ public class EmbeddingBasedParser implements SemanticParser { return Lists.newArrayList(); } - private boolean hasCandidateQuery(QueryContext queryContext) { - return !CollectionUtils.isEmpty(queryContext.getCandidateQueries()); - } - private void fillSemanticParseInfo(SemanticParseInfo semanticParseInfo) { List schemaElementMatches = semanticParseInfo.getElementMatches(); if (!CollectionUtils.isEmpty(schemaElementMatches)) { 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())) .forEach(schemaElementMatch -> { - QueryFilter queryFilter = new QueryFilter(); - queryFilter.setValue(schemaElementMatch.getWord()); - queryFilter.setElementID(schemaElementMatch.getElement().getId()); - queryFilter.setName(schemaElementMatch.getElement().getName()); - queryFilter.setOperator(FilterOperatorEnum.EQUALS); - queryFilter.setBizName(schemaElementMatch.getElement().getBizName()); - semanticParseInfo.getDimensionFilters().add(queryFilter); + QueryFilter queryFilter = new QueryFilter(); + queryFilter.setValue(schemaElementMatch.getWord()); + queryFilter.setElementID(schemaElementMatch.getElement().getId()); + queryFilter.setName(schemaElementMatch.getElement().getName()); + queryFilter.setOperator(FilterOperatorEnum.EQUALS); + queryFilter.setBizName(schemaElementMatch.getElement().getBizName()); + semanticParseInfo.getDimensionFilters().add(queryFilter); }); } } - protected String replaceText(String text, List schemaElementMatches) { - if (CollectionUtils.isEmpty(schemaElementMatches)) { - return text; - } - List valueSchemaElementMatches = schemaElementMatches.stream() - .filter(schemaElementMatch -> - SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType()) - || SchemaElementType.ID.equals(schemaElementMatch.getElement().getType())) - .collect(Collectors.toList()); - for (SchemaElementMatch schemaElementMatch : valueSchemaElementMatches) { - String detectWord = schemaElementMatch.getDetectWord(); - if (StringUtils.isBlank(detectWord)) { - continue; - } - text = text.replace(detectWord, ""); - } - return text; - } - } 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/embedding/EmbeddingEntityResolver.java index 6a52efead..7ad5c1f8a 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/embedding/EmbeddingEntityResolver.java @@ -1,23 +1,26 @@ package com.tencent.supersonic.chat.parser.embedding; import com.alibaba.fastjson.JSONObject; -import com.tencent.supersonic.chat.api.pojo.*; +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.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) { @@ -25,18 +28,19 @@ public class EmbeddingEntityResolver { } - private Long getEntityValue(Long domainId, Long entityElementId, QueryContext queryCtx, ChatContext chatCtx) { + private Long getEntityValue(Long modelId, Long entityElementId, QueryContext queryCtx, ChatContext chatCtx) { Long entityId = null; QueryFilters queryFilters = queryCtx.getRequest().getQueryFilters(); if (queryFilters != null) { entityId = getEntityValueFromQueryFilter(queryFilters.getFilters()); if (entityId != null) { - log.info("get entity id:{} domain id:{} from query filter :{} ", entityId, domainId, queryFilters); + log.info("get entity id:{} model id:{} from query filter :{} ", entityId, modelId, queryFilters); return entityId; } } - entityId = getEntityValueFromSchemaMapInfo(domainId, queryCtx.getMapInfo(), entityElementId); - log.info("get entity id:{} from schema map Info :{} ", entityId, JSONObject.toJSONString(queryCtx.getMapInfo())); + entityId = getEntityValueFromSchemaMapInfo(modelId, queryCtx.getMapInfo(), entityElementId); + 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) { @@ -75,8 +79,8 @@ public class EmbeddingEntityResolver { } - private Long getEntityValueFromSchemaMapInfo(Long domainId, SchemaMapInfo schemaMapInfo, Long entityElementId) { - List schemaElementMatchList = schemaMapInfo.getMatchedElements(domainId); + private Long getEntityValueFromSchemaMapInfo(Long modelId, SchemaMapInfo schemaMapInfo, Long entityElementId) { + List schemaElementMatchList = schemaMapInfo.getMatchedElements(modelId); if (CollectionUtils.isEmpty(schemaElementMatchList)) { return null; } 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/embedding/EmbeddingResp.java index 4966514a9..c11db7c81 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/embedding/EmbeddingResp.java @@ -1,9 +1,8 @@ package com.tencent.supersonic.chat.parser.embedding; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class EmbeddingResp { 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/function/FunctionBasedParser.java index beb862d25..702af0473 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/function/FunctionBasedParser.java @@ -7,18 +7,20 @@ 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.config.FunctionCallInfoConfig; +import com.tencent.supersonic.chat.parser.ParseMode; import com.tencent.supersonic.chat.parser.SatisfactionChecker; import com.tencent.supersonic.chat.plugin.Plugin; import com.tencent.supersonic.chat.plugin.PluginManager; 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.dsl.DSLQuery; import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; -import com.tencent.supersonic.chat.query.plugin.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 com.tencent.supersonic.common.util.JsonUtil; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; @@ -29,10 +31,9 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; - -import com.tencent.supersonic.common.util.JsonUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -55,21 +56,12 @@ public class FunctionBasedParser implements SemanticParser { FunctionCallInfoConfig functionCallConfig = ContextUtils.getBean(FunctionCallInfoConfig.class); PluginService pluginService = ContextUtils.getBean(PluginService.class); String functionUrl = functionCallConfig.getUrl(); - if (StringUtils.isBlank(functionUrl) || SatisfactionChecker.check(queryCtx)) { log.info("functionUrl:{}, skip function parser, queryText:{}", functionUrl, queryCtx.getRequest().getQueryText()); return; } - - Set matchedDomains = getMatchDomains(queryCtx); - List functionNames = getFunctionNames(matchedDomains); - log.info("matchedDomains:{},functionNames:{}", matchedDomains, functionNames); - - if (CollectionUtils.isEmpty(functionNames) || CollectionUtils.isEmpty(matchedDomains)) { - return; - } - List functionDOList = getFunctionDO(queryCtx.getRequest().getDomainId()); + List functionDOList = getFunctionDO(queryCtx.getRequest().getModelId(), queryCtx); FunctionReq functionReq = FunctionReq.builder() .queryText(queryCtx.getRequest().getQueryText()) .pluginConfigs(functionDOList).build(); @@ -78,7 +70,6 @@ public class FunctionBasedParser implements SemanticParser { if (skipFunction(queryCtx, functionResp)) { return; } - PluginParseResult functionCallParseResult = new PluginParseResult(); String toolSelection = functionResp.getToolSelection(); Optional pluginOptional = pluginService.getPluginByName(toolSelection); @@ -87,24 +78,26 @@ public class FunctionBasedParser implements SemanticParser { return; } Plugin plugin = pluginOptional.get(); + plugin.setParseMode(ParseMode.FUNCTION_CALL); toolSelection = plugin.getType(); functionCallParseResult.setPlugin(plugin); log.info("QueryManager PluginQueryModes:{}", QueryManager.getPluginQueryModes()); PluginSemanticQuery semanticQuery = QueryManager.createPluginQuery(toolSelection); - DomainResolver domainResolver = ComponentFactory.getDomainResolver(); - - Long domainId = domainResolver.resolve(queryCtx, chatCtx, plugin.getDomainList()); - log.info("FunctionBasedParser domainId:{}",domainId); - if ((Objects.isNull(domainId) || domainId <= 0) && !plugin.isContainsAllDomain()) { - log.info("domain is null, skip the parse, select tool: {}", toolSelection); + ModelResolver ModelResolver = ComponentFactory.getModelResolver(); + log.info("plugin ModelList:{}", plugin.getModelList()); + Pair> pluginResolveResult = PluginManager.resolve(plugin, queryCtx); + 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); return; } - if (!plugin.getDomainList().contains(domainId) && !plugin.isContainsAllDomain()) { + if (!plugin.getModelList().contains(modelId) && !plugin.isContainsAllModel()) { return; } SemanticParseInfo parseInfo = semanticQuery.getParseInfo(); - if (Objects.nonNull(domainId) && domainId > 0){ - parseInfo.getElementMatches().addAll(queryCtx.getMapInfo().getMatchedElements(domainId)); + if (Objects.nonNull(modelId) && modelId > 0) { + parseInfo.getElementMatches().addAll(queryCtx.getMapInfo().getMatchedElements(modelId)); } functionCallParseResult.setRequest(queryCtx.getRequest()); Map properties = new HashMap<>(); @@ -112,21 +105,22 @@ public class FunctionBasedParser implements SemanticParser { parseInfo.setProperties(properties); parseInfo.setScore(FUNCTION_BONUS_THRESHOLD); parseInfo.setQueryMode(semanticQuery.getQueryMode()); - SchemaElement domain = new SchemaElement(); - domain.setDomain(domainId); - domain.setId(domainId); - parseInfo.setDomain(domain); + SchemaElement Model = new SchemaElement(); + Model.setModel(modelId); + Model.setId(modelId); + parseInfo.setModel(Model); queryCtx.getCandidateQueries().add(semanticQuery); } - private Set getMatchDomains(QueryContext queryCtx) { + + private Set getMatchModels(QueryContext queryCtx) { Set result = new HashSet<>(); - Long domainId = queryCtx.getRequest().getDomainId(); - if (Objects.nonNull(domainId) && domainId > 0) { - result.add(domainId); + Long modelId = queryCtx.getRequest().getModelId(); + if (Objects.nonNull(modelId) && modelId > 0) { + result.add(modelId); return result; } - return queryCtx.getMapInfo().getMatchedDomains(); + return queryCtx.getMapInfo().getMatchedModels(); } private boolean skipFunction(QueryContext queryCtx, FunctionResp functionResp) { @@ -144,36 +138,46 @@ public class FunctionBasedParser implements SemanticParser { return false; } - private List getFunctionDO(Long domainId) { - log.info("user decide domain:{}", domainId); + private List getFunctionDO(Long modelId, QueryContext queryContext) { + log.info("user decide Model:{}", modelId); List plugins = PluginManager.getPlugins(); - List functionDOList = plugins.stream().filter(o -> { - if (o.getParseModeConfig() == null) { + List functionDOList = plugins.stream().filter(plugin -> { + if (DSLQuery.QUERY_MODE.equalsIgnoreCase(plugin.getType())) { return false; } - if (!CollectionUtils.isEmpty(o.getDomainList())) {//过滤掉没选主题域的插件 - return true; + if (plugin.getParseModeConfig() == null) { + return false; } - if (domainId == null || domainId <= 0L) { - return true; - } else { - return o.getDomainList().contains(domainId); - } - }).map(o -> { - PluginParseConfig functionCallConfig = JsonUtil.toObject(o.getParseModeConfig(), + PluginParseConfig pluginParseConfig = JsonUtil.toObject(plugin.getParseModeConfig(), PluginParseConfig.class); - return functionCallConfig; - }).collect(Collectors.toList()); + if (StringUtils.isBlank(pluginParseConfig.getName())) { + return false; + } + Pair> pluginResolverResult = PluginManager.resolve(plugin, queryContext); + log.info("embedding plugin [{}-{}] resolve: {}", plugin.getId(), plugin.getName(), pluginResolverResult); + if (!pluginResolverResult.getLeft()) { + return false; + } else { + List resolveModel = pluginResolverResult.getRight(); + if (modelId != null && modelId > 0) { + if (plugin.isContainsAllModel()) { + return true; + } + return resolveModel.contains(modelId); + } + return true; + } + }).map(o -> JsonUtil.toObject(o.getParseModeConfig(), PluginParseConfig.class)).collect(Collectors.toList()); log.info("getFunctionDO:{}", JsonUtil.toString(functionDOList)); return functionDOList; } - private List getFunctionNames(Set matchedDomains) { + private List getFunctionNames(Set matchedModels) { List plugins = PluginManager.getPlugins(); Set functionNames = plugins.stream() .filter(entry -> { - if (!CollectionUtils.isEmpty(entry.getDomainList()) && !CollectionUtils.isEmpty(matchedDomains)) { - return entry.getDomainList().stream().anyMatch(matchedDomains::contains); + if (!CollectionUtils.isEmpty(entry.getModelList()) && !CollectionUtils.isEmpty(matchedModels)) { + return entry.getModelList().stream().anyMatch(matchedModels::contains); } return true; } 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/function/FunctionReq.java index ef52541e6..ab4fa5a47 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/function/FunctionReq.java @@ -1,8 +1,7 @@ package com.tencent.supersonic.chat.parser.function; -import java.util.List; - import com.tencent.supersonic.chat.plugin.PluginParseConfig; +import java.util.List; import lombok.Builder; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicDomainResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicDomainResolver.java deleted file mode 100644 index c56508941..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicDomainResolver.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.tencent.supersonic.chat.parser.function; - -import com.tencent.supersonic.chat.api.pojo.*; -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.stream.Collectors; -import org.apache.commons.collections.CollectionUtils; - -@Slf4j -public class HeuristicDomainResolver implements DomainResolver { - - protected static Long selectDomainBySchemaElementCount(Map domainQueryModes, - SchemaMapInfo schemaMap) { - Map domainTypeMap = getDomainTypeMap(schemaMap); - if (domainTypeMap.size() == 1) { - Long domainSelect = domainTypeMap.entrySet().stream().collect(Collectors.toList()).get(0).getKey(); - if (domainQueryModes.containsKey(domainSelect)) { - log.info("selectDomain with only one domain [{}]", domainSelect); - return domainSelect; - } - } else { - Map.Entry maxDomain = domainTypeMap.entrySet().stream() - .filter(entry -> domainQueryModes.containsKey(entry.getKey())) - .sorted((o1, o2) -> { - int difference = o2.getValue().getCount() - o1.getValue().getCount(); - if (difference == 0) { - return (int) ((o2.getValue().getMaxSimilarity() - - o1.getValue().getMaxSimilarity()) * 100); - } - return difference; - }).findFirst().orElse(null); - if (maxDomain != null) { - log.info("selectDomain with multiple domains [{}]", maxDomain.getKey()); - return maxDomain.getKey(); - } - } - return 0L; - } - - /** - * to check can switch domain if context exit domain - * - * @return false will use context domain, true will use other domain , maybe include context domain - */ - protected static boolean isAllowSwitch(Map domainQueryModes, SchemaMapInfo schemaMap, - ChatContext chatCtx, QueryReq searchCtx, Long domainId, List restrictiveDomains) { - if (!Objects.nonNull(domainId) || domainId <= 0) { - return true; - } - // except content domain, calculate the number of types for each domain, if numbers<=1 will not switch - Map domainTypeMap = getDomainTypeMap(schemaMap); - log.info("isAllowSwitch domainTypeMap [{}]", domainTypeMap); - long otherDomainTypeNumBigOneCount = domainTypeMap.entrySet().stream() - .filter(entry -> domainQueryModes.containsKey(entry.getKey()) && !entry.getKey().equals(domainId)) - .filter(entry -> entry.getValue().getCount() > 1).count(); - if (otherDomainTypeNumBigOneCount >= 1) { - return true; - } - // if query text only contain time , will not switch - if (!CollectionUtils.isEmpty(domainQueryModes.values())) { - for (SemanticQuery semanticQuery : domainQueryModes.values()) { - if (semanticQuery == null) { - continue; - } - SemanticParseInfo semanticParseInfo = semanticQuery.getParseInfo(); - if (semanticParseInfo == null) { - continue; - } - if (searchCtx.getQueryText() != null && semanticParseInfo.getDateInfo() != null) { - if (semanticParseInfo.getDateInfo().getText() != null) { - if (semanticParseInfo.getDateInfo().getText().equalsIgnoreCase(searchCtx.getQueryText())) { - log.info("timeParseResults is not null , can not switch context , timeParseResults:{},", - semanticParseInfo.getDateInfo()); - return false; - } - } - } - } - } - - if (CollectionUtils.isNotEmpty(restrictiveDomains) && !restrictiveDomains.contains(domainId)) { - return true; - } - // if context domain not in schemaMap , will switch - if (schemaMap.getMatchedElements(domainId) == null || schemaMap.getMatchedElements(domainId).size() <= 0) { - log.info("domainId not in schemaMap "); - return true; - } - // other will not switch - return false; - } - - public static Map getDomainTypeMap(SchemaMapInfo schemaMap) { - Map domainCount = new HashMap<>(); - for (Map.Entry> entry : schemaMap.getDomainElementMatches().entrySet()) { - List schemaElementMatches = schemaMap.getMatchedElements(entry.getKey()); - if (schemaElementMatches != null && schemaElementMatches.size() > 0) { - if (!domainCount.containsKey(entry.getKey())) { - domainCount.put(entry.getKey(), new DomainMatchResult()); - } - DomainMatchResult domainMatchResult = domainCount.get(entry.getKey()); - Set schemaElementTypes = new HashSet<>(); - schemaElementMatches.stream() - .forEach(schemaElementMatch -> schemaElementTypes.add( - schemaElementMatch.getElement().getType())); - SchemaElementMatch schemaElementMatchMax = schemaElementMatches.stream() - .sorted((o1, o2) -> - ((int) ((o2.getSimilarity() - o1.getSimilarity()) * 100)) - ).findFirst().orElse(null); - if (schemaElementMatchMax != null) { - domainMatchResult.setMaxSimilarity(schemaElementMatchMax.getSimilarity()); - } - domainMatchResult.setCount(schemaElementTypes.size()); - - } - } - return domainCount; - } - - - public Long resolve(QueryContext queryContext, ChatContext chatCtx, List restrictiveDomains) { - Long domainId = queryContext.getRequest().getDomainId(); - if (Objects.nonNull(domainId) && domainId > 0) { - if (CollectionUtils.isNotEmpty(restrictiveDomains) && restrictiveDomains.contains(domainId)) { - return domainId; - } else { - return null; - } - } - SchemaMapInfo mapInfo = queryContext.getMapInfo(); - Set matchedDomains = mapInfo.getMatchedDomains(); - if (CollectionUtils.isNotEmpty(restrictiveDomains)) { - matchedDomains = matchedDomains.stream() - .filter(matchedDomain -> restrictiveDomains.contains(matchedDomain)) - .collect(Collectors.toSet()); - } - Map domainQueryModes = new HashMap<>(); - for (Long matchedDomain : matchedDomains) { - domainQueryModes.put(matchedDomain, null); - } - if(domainQueryModes.size()==1){ - return domainQueryModes.keySet().stream().findFirst().get(); - } - return resolve(domainQueryModes, queryContext, chatCtx, - queryContext.getMapInfo(),restrictiveDomains); - } - - public Long resolve(Map domainQueryModes, QueryContext queryContext, - ChatContext chatCtx, SchemaMapInfo schemaMap, List restrictiveDomains) { - Long selectDomain = selectDomain(domainQueryModes, queryContext.getRequest(), chatCtx, schemaMap,restrictiveDomains); - if (selectDomain > 0) { - log.info("selectDomain {} ", selectDomain); - return selectDomain; - } - // get the max SchemaElementType number - return selectDomainBySchemaElementCount(domainQueryModes, schemaMap); - } - - public Long selectDomain(Map domainQueryModes, QueryReq queryContext, - ChatContext chatCtx, - SchemaMapInfo schemaMap, List restrictiveDomains) { - // if QueryContext has domainId and in domainQueryModes - if (domainQueryModes.containsKey(queryContext.getDomainId())) { - log.info("selectDomain from QueryContext [{}]", queryContext.getDomainId()); - return queryContext.getDomainId(); - } - // if ChatContext has domainId and in domainQueryModes - if (chatCtx.getParseInfo().getDomainId() > 0) { - Long domainId = chatCtx.getParseInfo().getDomainId(); - if (!isAllowSwitch(domainQueryModes, schemaMap, chatCtx, queryContext, domainId,restrictiveDomains)) { - log.info("selectDomain from ChatContext [{}]", domainId); - return domainId; - } - } - // default 0 - return 0L; - } -} 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/function/HeuristicModelResolver.java new file mode 100644 index 000000000..4e77a1e4a --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicModelResolver.java @@ -0,0 +1,192 @@ +package com.tencent.supersonic.chat.parser.function; + +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.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.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import java.util.HashMap; +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.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; + } + } else { + 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) { + return (int) ((o2.getValue().getMaxSimilarity() + - o1.getValue().getMaxSimilarity()) * 100); + } + return difference; + }).findFirst().orElse(null); + if (maxModel != null) { + log.info("selectModel with multiple Models [{}]", maxModel.getKey()); + return maxModel.getKey(); + } + } + return 0L; + } + + /** + * to check can switch Model if context exit Model + * + * @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, List 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)) + .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 (semanticQuery == null) { + continue; + } + SemanticParseInfo semanticParseInfo = semanticQuery.getParseInfo(); + if (semanticParseInfo == null) { + continue; + } + if (searchCtx.getQueryText() != null && semanticParseInfo.getDateInfo() != null) { + if (semanticParseInfo.getDateInfo().getDetectWord() != null) { + if (semanticParseInfo.getDateInfo().getDetectWord() + .equalsIgnoreCase(searchCtx.getQueryText())) { + log.info("timeParseResults is not null , can not switch context , timeParseResults:{},", + semanticParseInfo.getDateInfo()); + return false; + } + } + } + } + } + + if (CollectionUtils.isNotEmpty(restrictiveModels) && !restrictiveModels.contains(modelId)) { + return true; + } + // if context Model not in schemaMap , will switch + if (schemaMap.getMatchedElements(modelId) == null || schemaMap.getMatchedElements(modelId).size() <= 0) { + log.info("modelId not in schemaMap "); + return true; + } + // other will not switch + return false; + } + + public static Map getModelTypeMap(SchemaMapInfo schemaMap) { + 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()); + } + ModelMatchResult ModelMatchResult = ModelCount.get(entry.getKey()); + Set schemaElementTypes = new HashSet<>(); + schemaElementMatches.stream() + .forEach(schemaElementMatch -> schemaElementTypes.add( + schemaElementMatch.getElement().getType())); + SchemaElementMatch schemaElementMatchMax = schemaElementMatches.stream() + .sorted((o1, o2) -> + ((int) ((o2.getSimilarity() - o1.getSimilarity()) * 100)) + ).findFirst().orElse(null); + if (schemaElementMatchMax != null) { + ModelMatchResult.setMaxSimilarity(schemaElementMatchMax.getSimilarity()); + } + ModelMatchResult.setCount(schemaElementTypes.size()); + + } + } + return ModelCount; + } + + + public Long resolve(QueryContext queryContext, ChatContext chatCtx, List restrictiveModels) { + Long modelId = queryContext.getRequest().getModelId(); + if (Objects.nonNull(modelId) && modelId > 0) { + if (CollectionUtils.isNotEmpty(restrictiveModels) && restrictiveModels.contains(modelId)) { + return modelId; + } else { + return null; + } + } + SchemaMapInfo mapInfo = queryContext.getMapInfo(); + Set matchedModels = mapInfo.getMatchedModels(); + if (CollectionUtils.isNotEmpty(restrictiveModels)) { + matchedModels = matchedModels.stream() + .filter(restrictiveModels::contains) + .collect(Collectors.toSet()); + } + Map ModelQueryModes = new HashMap<>(); + for (Long matchedModel : matchedModels) { + ModelQueryModes.put(matchedModel, null); + } + if (ModelQueryModes.size() == 1) { + return ModelQueryModes.keySet().stream().findFirst().get(); + } + return resolve(ModelQueryModes, queryContext, chatCtx, + queryContext.getMapInfo(), restrictiveModels); + } + + public Long resolve(Map ModelQueryModes, QueryContext queryContext, + ChatContext chatCtx, SchemaMapInfo schemaMap, List 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); + } + + public Long selectModel(Map ModelQueryModes, QueryReq queryContext, + ChatContext chatCtx, + SchemaMapInfo schemaMap, List restrictiveModels) { + // if QueryContext has modelId and in ModelQueryModes + 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)) { + log.info("selectModel from ChatContext [{}]", modelId); + return modelId; + } + } + // default 0 + return 0L; + } +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainMatchResult.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/ModelMatchResult.java similarity index 81% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainMatchResult.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/ModelMatchResult.java index bb1dfcbff..37cb8815a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainMatchResult.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/ModelMatchResult.java @@ -3,7 +3,8 @@ package com.tencent.supersonic.chat.parser.function; import lombok.Data; @Data -public class DomainMatchResult { +public class ModelMatchResult { + private Integer count = 0; private double maxSimilarity; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/ModelResolver.java similarity index 79% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainResolver.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/ModelResolver.java index 45fc864c8..cdabc8d04 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/DomainResolver.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/ModelResolver.java @@ -5,8 +5,8 @@ import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.QueryContext; import java.util.List; -public interface DomainResolver { +public interface ModelResolver { - Long resolve(QueryContext queryContext, ChatContext chatCtx, List restrictiveDomains); + Long resolve(QueryContext queryContext, ChatContext chatCtx, List 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/function/Parameters.java index bd9f88e01..453d4840b 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/function/Parameters.java @@ -1,8 +1,8 @@ package com.tencent.supersonic.chat.parser.function; -import lombok.Data; import java.util.List; import java.util.Map; +import lombok.Data; @Data public class Parameters { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/DSLParseResult.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/DSLParseResult.java new file mode 100644 index 000000000..f648ee47c --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/DSLParseResult.java @@ -0,0 +1,11 @@ +package com.tencent.supersonic.chat.parser.llm; + +import com.tencent.supersonic.chat.plugin.PluginParseResult; +import com.tencent.supersonic.chat.query.dsl.LLMResp; +import lombok.Data; + +@Data +public class DSLParseResult extends PluginParseResult { + + private LLMResp llmResp; +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/LLMDSLParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/LLMDSLParser.java new file mode 100644 index 000000000..72c2bace9 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/LLMDSLParser.java @@ -0,0 +1,231 @@ +package com.tencent.supersonic.chat.parser.llm; + +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.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.config.LLMConfig; +import com.tencent.supersonic.chat.parser.SatisfactionChecker; +import com.tencent.supersonic.chat.parser.function.ModelResolver; +import com.tencent.supersonic.chat.plugin.Plugin; +import com.tencent.supersonic.chat.plugin.PluginManager; +import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.chat.query.dsl.DSLBuilder; +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.plugin.PluginSemanticQuery; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.util.DateUtils; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.knowledge.service.SchemaService; +import java.util.ArrayList; +import java.util.HashMap; +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.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.CollectionUtils; +import org.springframework.web.client.RestTemplate; + +@Slf4j +public class LLMDSLParser implements SemanticParser { + + public static final double FUNCTION_BONUS_THRESHOLD = 201; + + @Override + public void parse(QueryContext queryCtx, ChatContext chatCtx) { + final 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()); + return; + } + List dslPlugins = PluginManager.getPlugins().stream() + .filter(plugin -> DSLQuery.QUERY_MODE.equalsIgnoreCase(plugin.getType())) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(dslPlugins)) { + return; + } + Plugin plugin = dslPlugins.get(0); + List dslModels = plugin.getModelList(); + + try { + ModelResolver modelResolver = ComponentFactory.getModelResolver(); + Long modelId = modelResolver.resolve(queryCtx, chatCtx, dslModels); + log.info("resolve modelId:{},dslModels:{}", modelId, dslModels); + + if (Objects.isNull(modelId)) { + return; + } + + LLMResp llmResp = requestLLM(queryCtx, modelId); + if (Objects.isNull(llmResp)) { + return; + } + + PluginSemanticQuery semanticQuery = QueryManager.createPluginQuery(DSLQuery.QUERY_MODE); + + 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.setPlugin(plugin); + + Map properties = new HashMap<>(); + properties.put(Constants.CONTEXT, dslParseResult); + 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); + } + } + + + 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; + } + + 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(DSLBuilder.DATA_Field); + llmSchema.setFieldNameList(fieldNameList); + llmReq.setSchema(llmSchema); + List linking = new ArrayList<>(); + linking.addAll(getValueList(queryCtx, modelId, semanticSchema)); + llmReq.setLinking(linking); + String currentDate = getCurrentDate(modelId); + llmReq.setCurrentDate(currentDate); + + log.info("requestLLM request, modelId:{},llmReq:{}", modelId, llmReq); + String questUrl = llmConfig.getUrl() + llmConfig.getQueryToSqlPath(); + + RestTemplate restTemplate = ContextUtils.getBean(RestTemplate.class); + + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity entity = new HttpEntity<>(JsonUtil.toString(llmReq), headers); + ResponseEntity responseEntity = restTemplate.exchange(questUrl, HttpMethod.POST, entity, + LLMResp.class); + + log.info("requestLLM response,cost:{}, questUrl:{} \n entity:{} \n body:{}", + System.currentTimeMillis() - startTime, questUrl, entity, responseEntity.getBody()); + return responseEntity.getBody(); + } catch (Exception e) { + log.error("requestLLM error", e); + } + return null; + } + + + private 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 + + } + + private List getValueList(QueryContext queryCtx, Long modelId, SemanticSchema semanticSchema) { + Map itemIdToName = getItemIdToName(modelId, semanticSchema); + + List matchedElements = queryCtx.getMapInfo().getMatchedElements(modelId); + if (CollectionUtils.isEmpty(matchedElements)) { + return new ArrayList<>(); + } + Set valueMatches = matchedElements.stream() + .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()); + return new ArrayList<>(valueMatches); + } + + private List getFieldNameList(QueryContext queryCtx, Long modelId, SemanticSchema semanticSchema) { + Map itemIdToName = getItemIdToName(modelId, semanticSchema); + + List matchedElements = queryCtx.getMapInfo().getMatchedElements(modelId); + if (CollectionUtils.isEmpty(matchedElements)) { + return new ArrayList<>(); + } + Set fieldNameList = matchedElements.stream() + .filter(schemaElementMatch -> { + SchemaElementType elementType = schemaElementMatch.getElement().getType(); + return SchemaElementType.METRIC.equals(elementType) || + SchemaElementType.DIMENSION.equals(elementType) || + SchemaElementType.VALUE.equals(elementType); + }) + .map(schemaElementMatch -> { + SchemaElementType elementType = schemaElementMatch.getElement().getType(); + + if (!SchemaElementType.VALUE.equals(elementType)) { + return schemaElementMatch.getWord(); + } + return itemIdToName.get(schemaElementMatch.getElement().getId()); + }) + .filter(name -> StringUtils.isNotEmpty(name) && !name.contains("%")) + .collect(Collectors.toSet()); + return new ArrayList<>(fieldNameList); + } + + private Map getItemIdToName(Long modelId, SemanticSchema semanticSchema) { + return semanticSchema.getDimensions().stream() + .filter(entry -> modelId.equals(entry.getModel())) + .collect(Collectors.toMap(SchemaElement::getId, SchemaElement::getName, (value1, value2) -> value2)); + } + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/LLMTimeEnhancementParse.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/LLMTimeEnhancementParse.java index 0a9440ee9..b346efb63 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/LLMTimeEnhancementParse.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/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); String inferredTime = chatGptHelper.inferredTime(queryContext.getRequest().getQueryText()); try { @@ -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,12 @@ 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:{}",queryContext,chatContext); + log.info("after queryContext:{},chatContext:{}", queryContext, chatContext); } 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 4b70804fe..0b7925435 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 @@ -21,7 +21,9 @@ 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; @Slf4j public class AggregateTypeParser implements SemanticParser { @@ -35,36 +37,60 @@ public class AggregateTypeParser implements SemanticParser { new AbstractMap.SimpleEntry<>(DISTINCT, Pattern.compile("(?i)(uv)")), new AbstractMap.SimpleEntry<>(COUNT, Pattern.compile("(?i)(总数|pv)")), new AbstractMap.SimpleEntry<>(NONE, Pattern.compile("(?i)(明细)")) - ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(k1,k2)->k2)); + ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (k1, k2) -> k2)); @Override public void parse(QueryContext queryContext, ChatContext chatContext) { + String queryText = queryContext.getRequest().getQueryText(); + AggregateConf aggregateConf = resolveAggregateConf(queryText); + for (SemanticQuery semanticQuery : queryContext.getCandidateQueries()) { if (!AggregateTypeEnum.NONE.equals(semanticQuery.getParseInfo().getAggType())) { continue; } - - String queryText = queryContext.getRequest().getQueryText(); - semanticQuery.getParseInfo().setAggType(resolveAggregateType(queryText)); + semanticQuery.getParseInfo().setAggType(aggregateConf.type); + int detectWordLength = 0; + if (StringUtils.isNotEmpty(aggregateConf.detectWord)) { + detectWordLength = aggregateConf.detectWord.length(); + } + semanticQuery.getParseInfo().setScore(semanticQuery.getParseInfo().getScore() + detectWordLength); } } - public static AggregateTypeEnum resolveAggregateType(String queryText) { + public AggregateTypeEnum resolveAggregateType(String queryText) { + AggregateConf aggregateConf = resolveAggregateConf(queryText); + return aggregateConf.type; + } + + private AggregateConf resolveAggregateConf(String queryText) { Map aggregateCount = new HashMap<>(REGX_MAP.size()); + Map aggregateWord = new HashMap<>(REGX_MAP.size()); for (Map.Entry entry : REGX_MAP.entrySet()) { Matcher matcher = entry.getValue().matcher(queryText); int count = 0; + String detectWord = null; while (matcher.find()) { count++; + detectWord = matcher.group(); } if (count > 0) { aggregateCount.put(entry.getKey(), count); + aggregateWord.put(entry.getKey(), detectWord); } } - return aggregateCount.entrySet().stream().max(Map.Entry.comparingByValue()) + AggregateTypeEnum type = aggregateCount.entrySet().stream().max(Map.Entry.comparingByValue()) .map(entry -> entry.getKey()).orElse(NONE); + String detectWord = aggregateWord.get(type); + return new AggregateConf(type, detectWord); + } + + @AllArgsConstructor + class AggregateConf { + + public AggregateTypeEnum type; + public String detectWord; } } 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 74a7713f9..8de93c7b8 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,5 +1,12 @@ 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; @@ -8,8 +15,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.MetricDomainQuery; 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.MetricSemanticQuery; import java.util.AbstractMap; import java.util.ArrayList; @@ -21,8 +28,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; - @Slf4j public class ContextInheritParser implements SemanticParser { @@ -31,7 +36,7 @@ public class ContextInheritParser implements SemanticParser { new AbstractMap.SimpleEntry<>(DIMENSION, Arrays.asList(DIMENSION, VALUE)), new AbstractMap.SimpleEntry<>(VALUE, Arrays.asList(VALUE, DIMENSION)), new AbstractMap.SimpleEntry<>(ENTITY, Arrays.asList(ENTITY)), - new AbstractMap.SimpleEntry<>(DOMAIN, Arrays.asList(DOMAIN)), + new AbstractMap.SimpleEntry<>(MODEL, Arrays.asList(MODEL)), new AbstractMap.SimpleEntry<>(ID, Arrays.asList(ID)) ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); @@ -41,9 +46,9 @@ public class ContextInheritParser implements SemanticParser { return; } - Long domainId = chatContext.getParseInfo().getDomainId(); + Long modelId = chatContext.getParseInfo().getModelId(); List elementMatches = queryContext.getMapInfo() - .getMatchedElements(domainId); + .getMatchedElements(modelId); List matchesToInherit = new ArrayList<>(); for (SchemaElementMatch match : chatContext.getParseInfo().getElementMatches()) { @@ -51,7 +56,7 @@ public class ContextInheritParser implements SemanticParser { // mutual exclusive element types should not be inherited RuleSemanticQuery ruleQuery = QueryManager.getRuleQuery(chatContext.getParseInfo().getQueryMode()); if (!containsTypes(elementMatches, matchType, ruleQuery)) { - match.setMode(SchemaElementMatch.MatchMode.INHERIT); + match.setInherited(true); matchesToInherit.add(match); } } @@ -59,11 +64,24 @@ public class ContextInheritParser implements SemanticParser { List queries = RuleSemanticQuery.resolve(elementMatches, queryContext); for (RuleSemanticQuery query : queries) { - query.fillParseInfo(domainId, chatContext); + query.fillParseInfo(modelId, queryContext, chatContext); + if (existSameQuery(query.getParseInfo().getModelId(), query.getQueryMode(), queryContext)) { + continue; + } queryContext.getCandidateQueries().add(query); } } + private boolean existSameQuery(Long modelId, String queryMode, QueryContext queryContext) { + for (SemanticQuery semanticQuery : queryContext.getCandidateQueries()) { + if (semanticQuery.getQueryMode().equals(queryMode) + && semanticQuery.getParseInfo().getModelId().equals(modelId)) { + return true; + } + } + return false; + } + private boolean containsTypes(List matches, SchemaElementType matchType, RuleSemanticQuery ruleQuery) { List types = MUTUAL_EXCLUSIVE_MAP.get(matchType); @@ -79,16 +97,18 @@ public class ContextInheritParser implements SemanticParser { } protected boolean shouldInherit(QueryContext queryContext, ChatContext chatContext) { - Long contextDomainId = chatContext.getParseInfo().getDomainId(); - if (queryContext.getMapInfo().getMatchedElements(contextDomainId) == null) { + Long contextmodelId = chatContext.getParseInfo().getModelId(); + // if map info doesn't contain the same Model of the context, + // no inheritance could be done + if (queryContext.getMapInfo().getMatchedElements(contextmodelId) == null) { return false; } - // if candidates have only one MetricDomain mode and context has value filter , count in context - List candidateQueries = queryContext.getCandidateQueries().stream() - .filter(semanticQuery -> semanticQuery.getParseInfo().getDomainId().equals(contextDomainId)).collect( + // if candidates only have MetricModel mode, count in context + List metricModelQueries = queryContext.getCandidateQueries().stream() + .filter(query -> query instanceof MetricModelQuery).collect( Collectors.toList()); - if (candidateQueries.size() == 1 && (candidateQueries.get(0) instanceof MetricDomainQuery)) { + if (metricModelQueries.size() == queryContext.getCandidateQueries().size()) { return true; } else { return queryContext.getCandidateQueries().size() == 0; 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 290a7851b..1644f3ea2 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,11 +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.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.query.rule.RuleSemanticQuery; - -import java.util.*; - +import java.util.List; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -16,12 +17,12 @@ public class QueryModeParser implements SemanticParser { SchemaMapInfo mapInfo = queryContext.getMapInfo(); // iterate all schemaElementMatches to resolve semantic query - for (Long domainId : mapInfo.getMatchedDomains()) { - List elementMatches = mapInfo.getMatchedElements(domainId); + for (Long modelId : mapInfo.getMatchedModels()) { + List elementMatches = mapInfo.getMatchedElements(modelId); List queries = RuleSemanticQuery.resolve(elementMatches, queryContext); for (RuleSemanticQuery query : queries) { - query.fillParseInfo(domainId, chatContext); + query.fillParseInfo(modelId, queryContext, chatContext); queryContext.getCandidateQueries().add(query); } } 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 1d20a3208..4b0624803 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,21 @@ 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.rule.RuleSemanticQuery; import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; 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.*; +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; @@ -45,12 +45,16 @@ public class TimeRangeParser implements SemanticParser { if (queryContext.getCandidateQueries().size() > 0) { for (SemanticQuery query : queryContext.getCandidateQueries()) { query.getParseInfo().setDateInfo(dateConf); + query.getParseInfo().setScore(query.getParseInfo().getScore() + + dateConf.getDetectWord().length()); } } else if (QueryManager.containsRuleQuery(chatContext.getParseInfo().getQueryMode())) { RuleSemanticQuery semanticQuery = QueryManager.createRuleQuery( chatContext.getParseInfo().getQueryMode()); // inherit parse info from context chatContext.getParseInfo().setDateInfo(dateConf); + chatContext.getParseInfo().setScore(chatContext.getParseInfo().getScore() + + dateConf.getDetectWord().length()); semanticQuery.setParseInfo(chatContext.getParseInfo()); queryContext.getCandidateQueries().add(semanticQuery); } @@ -60,41 +64,48 @@ public class TimeRangeParser implements SemanticParser { private DateConf parseDateCN(String queryText) { Date startDate = null; Date endDate; + String detectWord = null; List times = TimeNLPUtil.parse(queryText); if (times.size() > 0) { startDate = times.get(0).getTime(); + detectWord = times.get(0).getTimeExpression(); } else { return null; } if (times.size() > 1) { endDate = times.get(1).getTime(); + detectWord += "~" + times.get(0).getTimeExpression(); } else { endDate = startDate; } - return getDateConf(startDate, endDate); + return getDateConf(startDate, endDate, detectWord); } private DateConf parseDateNumber(String queryText) { String startDate; String endDate = null; + String detectWord = null; Matcher dateMatcher = DATE_PATTERN_NUMBER.matcher(queryText); if (dateMatcher.find()) { startDate = dateMatcher.group(); + detectWord = startDate; } else { return null; } + if (dateMatcher.find()) { endDate = dateMatcher.group(); + detectWord += "~" + endDate; } endDate = endDate != null ? endDate : startDate; try { - return getDateConf(DATE_FORMAT_NUMBER.parse(startDate), DATE_FORMAT_NUMBER.parse(endDate)); + return getDateConf(DATE_FORMAT_NUMBER.parse(startDate), DATE_FORMAT_NUMBER.parse(endDate), detectWord); } catch (ParseException e) { return null; } @@ -134,11 +145,11 @@ public class TimeRangeParser implements SemanticParser { } days = days * num; info.setDateMode(DateConf.DateMode.RECENT); - String text = "近" + num + zhPeriod; + String detectWord = "近" + num + zhPeriod; if (Strings.isNotEmpty(m.group("periodStr"))) { - text = m.group("periodStr"); + detectWord = m.group("periodStr"); } - info.setText(text); + info.setDetectWord(detectWord); info.setStartDate(LocalDate.now().minusDays(days).toString()); info.setUnit(num); @@ -173,7 +184,7 @@ public class TimeRangeParser implements SemanticParser { return stack.stream().mapToInt(s -> s).sum(); } - private DateConf getDateConf(Date startDate, Date endDate) { + private DateConf getDateConf(Date startDate, Date endDate, String detectWord) { if (startDate == null || endDate == null) { return null; } @@ -182,6 +193,7 @@ public class TimeRangeParser implements SemanticParser { info.setDateMode(DateConf.DateMode.BETWEEN); info.setStartDate(DATE_FORMAT.format(startDate)); info.setEndDate(DATE_FORMAT.format(endDate)); + info.setDetectWord(detectWord); return info; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatConfigDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatConfigDO.java index 25d5b526c..e347fa4d1 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatConfigDO.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/ChatConfigDO.java @@ -1,7 +1,6 @@ package com.tencent.supersonic.chat.persistence.dataobject; import java.util.Date; - import lombok.Data; import lombok.ToString; @@ -15,7 +14,7 @@ public class ChatConfigDO { */ private Long id; - private Long domainId; + private Long modelId; private String chatDetailConfig; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/DimValueDO.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/DimValueDO.java index 99e570d2c..ca43b8fed 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/DimValueDO.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/dataobject/DimValueDO.java @@ -1,11 +1,10 @@ package com.tencent.supersonic.chat.persistence.dataobject; -import java.util.ArrayList; -import java.util.List; - import com.tencent.supersonic.chat.config.DefaultMetric; import com.tencent.supersonic.chat.config.Dim4Dict; +import java.util.ArrayList; +import java.util.List; import lombok.Data; import lombok.ToString; @@ -14,14 +13,14 @@ import lombok.ToString; @ToString public class DimValueDO { - private Long domainId; + private Long modelId; private List defaultMetricDescList = new ArrayList<>(); private List dimensions = new ArrayList<>(); - public DimValueDO setDomainId(Long domainId) { - this.domainId = domainId; + public DimValueDO setModelId(Long modelId) { + this.modelId = modelId; return this; } 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 3cdf0bb14..b730f806b 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 @@ -3,8 +3,9 @@ package com.tencent.supersonic.chat.persistence.dataobject; import java.util.Date; public class PluginDO { + /** - * + * */ private Long id; @@ -14,71 +15,69 @@ public class PluginDO { private String type; /** - * + * */ - private String domain; + private String model; /** - * + * */ private String pattern; /** - * + * */ private String parseMode; /** - * + * */ private String name; /** - * + * */ private Date createdAt; /** - * + * */ private String createdBy; /** - * + * */ private Date updatedAt; /** - * + * */ private String updatedBy; /** - * + * */ private String parseModeConfig; /** - * + * */ private String config; /** - * + * */ private String comment; /** - * - * @return id + * @return id */ public Long getId() { return id; } /** - * - * @param id + * @param id */ public void setId(Long id) { this.id = id; @@ -86,6 +85,7 @@ public class PluginDO { /** * DASHBOARD,WIDGET,URL + * * @return type DASHBOARD,WIDGET,URL */ public String getType() { @@ -94,6 +94,7 @@ public class PluginDO { /** * DASHBOARD,WIDGET,URL + * * @param type DASHBOARD,WIDGET,URL */ public void setType(String type) { @@ -101,176 +102,154 @@ public class PluginDO { } /** - * - * @return domain + * @return model */ - public String getDomain() { - return domain; + public String getModel() { + return model; } /** - * - * @param domain + * @param model */ - public void setDomain(String domain) { - this.domain = domain == null ? null : domain.trim(); + public void setModel(String model) { + this.model = model == null ? null : model.trim(); } /** - * - * @return pattern + * @return pattern */ public String getPattern() { return pattern; } /** - * - * @param pattern + * @param pattern */ public void setPattern(String pattern) { this.pattern = pattern == null ? null : pattern.trim(); } /** - * - * @return parse_mode + * @return parse_mode */ public String getParseMode() { return parseMode; } /** - * - * @param parseMode + * @param parseMode */ public void setParseMode(String parseMode) { this.parseMode = parseMode == null ? null : parseMode.trim(); } /** - * - * @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 created_at + * @return created_at */ public Date getCreatedAt() { return createdAt; } /** - * - * @param createdAt + * @param createdAt */ public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; } /** - * - * @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 updated_at + * @return updated_at */ public Date getUpdatedAt() { return updatedAt; } /** - * - * @param updatedAt + * @param updatedAt */ public void setUpdatedAt(Date updatedAt) { this.updatedAt = updatedAt; } /** - * - * @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 parse_mode_config + * @return parse_mode_config */ public String getParseModeConfig() { return parseModeConfig; } /** - * - * @param parseModeConfig + * @param parseModeConfig */ public void setParseModeConfig(String parseModeConfig) { this.parseModeConfig = parseModeConfig == null ? null : parseModeConfig.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 comment + * @return comment */ public String getComment() { return comment; } /** - * - * @param comment + * @param comment */ public void setComment(String comment) { this.comment = comment == null ? null : comment.trim(); 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 e2c316a84..8ee110998 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 @@ -5,6 +5,7 @@ import java.util.Date; import java.util.List; public class PluginDOExample { + /** * s2_plugin */ @@ -31,7 +32,6 @@ public class PluginDOExample { protected Integer limitEnd; /** - * * @mbg.generated */ public PluginDOExample() { @@ -39,7 +39,6 @@ public class PluginDOExample { } /** - * * @mbg.generated */ public void setOrderByClause(String orderByClause) { @@ -47,7 +46,6 @@ public class PluginDOExample { } /** - * * @mbg.generated */ public String getOrderByClause() { @@ -55,7 +53,6 @@ public class PluginDOExample { } /** - * * @mbg.generated */ public void setDistinct(boolean distinct) { @@ -63,7 +60,6 @@ public class PluginDOExample { } /** - * * @mbg.generated */ public boolean isDistinct() { @@ -71,7 +67,6 @@ public class PluginDOExample { } /** - * * @mbg.generated */ public List getOredCriteria() { @@ -79,7 +74,6 @@ public class PluginDOExample { } /** - * * @mbg.generated */ public void or(Criteria criteria) { @@ -87,7 +81,6 @@ public class PluginDOExample { } /** - * * @mbg.generated */ public Criteria or() { @@ -97,7 +90,6 @@ public class PluginDOExample { } /** - * * @mbg.generated */ public Criteria createCriteria() { @@ -109,7 +101,6 @@ public class PluginDOExample { } /** - * * @mbg.generated */ protected Criteria createCriteriaInternal() { @@ -118,7 +109,6 @@ public class PluginDOExample { } /** - * * @mbg.generated */ public void clear() { @@ -128,15 +118,13 @@ public class PluginDOExample { } /** - * * @mbg.generated */ public void setLimitStart(Integer limitStart) { - this.limitStart=limitStart; + this.limitStart = limitStart; } /** - * * @mbg.generated */ public Integer getLimitStart() { @@ -144,15 +132,13 @@ public class PluginDOExample { } /** - * * @mbg.generated */ public void setLimitEnd(Integer limitEnd) { - this.limitEnd=limitEnd; + this.limitEnd = limitEnd; } /** - * * @mbg.generated */ public Integer getLimitEnd() { @@ -163,6 +149,7 @@ public class PluginDOExample { * s2_plugin null */ protected abstract static class GeneratedCriteria { + protected List criteria; protected GeneratedCriteria() { @@ -333,73 +320,73 @@ public class PluginDOExample { return (Criteria) this; } - public Criteria andDomainIsNull() { - addCriterion("domain is null"); + public Criteria andModelIsNull() { + addCriterion("model is null"); return (Criteria) this; } - public Criteria andDomainIsNotNull() { - addCriterion("domain is not null"); + public Criteria andModelIsNotNull() { + addCriterion("model is not null"); return (Criteria) this; } - public Criteria andDomainEqualTo(String value) { - addCriterion("domain =", value, "domain"); + public Criteria andModelEqualTo(String value) { + addCriterion("model =", value, "model"); return (Criteria) this; } - public Criteria andDomainNotEqualTo(String value) { - addCriterion("domain <>", value, "domain"); + public Criteria andModelNotEqualTo(String value) { + addCriterion("model <>", value, "model"); return (Criteria) this; } - public Criteria andDomainGreaterThan(String value) { - addCriterion("domain >", value, "domain"); + public Criteria andModelGreaterThan(String value) { + addCriterion("model >", value, "model"); return (Criteria) this; } - public Criteria andDomainGreaterThanOrEqualTo(String value) { - addCriterion("domain >=", value, "domain"); + public Criteria andModelGreaterThanOrEqualTo(String value) { + addCriterion("model >=", value, "model"); return (Criteria) this; } - public Criteria andDomainLessThan(String value) { - addCriterion("domain <", value, "domain"); + public Criteria andModelLessThan(String value) { + addCriterion("model <", value, "model"); return (Criteria) this; } - public Criteria andDomainLessThanOrEqualTo(String value) { - addCriterion("domain <=", value, "domain"); + public Criteria andModelLessThanOrEqualTo(String value) { + addCriterion("model <=", value, "model"); return (Criteria) this; } - public Criteria andDomainLike(String value) { - addCriterion("domain like", value, "domain"); + public Criteria andModelLike(String value) { + addCriterion("model like", value, "model"); return (Criteria) this; } - public Criteria andDomainNotLike(String value) { - addCriterion("domain not like", value, "domain"); + public Criteria andModelNotLike(String value) { + addCriterion("model not like", value, "model"); return (Criteria) this; } - public Criteria andDomainIn(List values) { - addCriterion("domain in", values, "domain"); + public Criteria andModelIn(List values) { + addCriterion("model in", values, "model"); return (Criteria) this; } - public Criteria andDomainNotIn(List values) { - addCriterion("domain not in", values, "domain"); + public Criteria andModelNotIn(List values) { + addCriterion("model not in", values, "model"); return (Criteria) this; } - public Criteria andDomainBetween(String value1, String value2) { - addCriterion("domain between", value1, value2, "domain"); + public Criteria andModelBetween(String value1, String value2) { + addCriterion("model between", value1, value2, "model"); return (Criteria) this; } - public Criteria andDomainNotBetween(String value1, String value2) { - addCriterion("domain not between", value1, value2, "domain"); + public Criteria andModelNotBetween(String value1, String value2) { + addCriterion("model not between", value1, value2, "model"); return (Criteria) this; } @@ -888,6 +875,7 @@ public class PluginDOExample { * s2_plugin null */ public static class Criterion { + private String condition; private Object value; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatConfigMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatConfigMapper.java index 6b3c6802c..5af9a03dc 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatConfigMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/ChatConfigMapper.java @@ -14,5 +14,5 @@ public interface ChatConfigMapper { List search(ChatConfigFilterInternal filterInternal); - ChatConfigDO fetchConfigByDomainId(Long domainId); + ChatConfigDO fetchConfigByModelId(Long modelId); } 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 8eb2f1b98..aa4c19854 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 @@ -2,9 +2,8 @@ package com.tencent.supersonic.chat.persistence.mapper; import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDOExample; -import org.apache.ibatis.annotations.Mapper; - import java.util.List; +import org.apache.ibatis.annotations.Mapper; @Mapper public interface ChatQueryDOMapper { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/PluginDOMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/PluginDOMapper.java index 9f410ed00..796cc3e6a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/PluginDOMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/mapper/PluginDOMapper.java @@ -2,67 +2,58 @@ package com.tencent.supersonic.chat.persistence.mapper; import com.tencent.supersonic.chat.persistence.dataobject.PluginDO; import com.tencent.supersonic.chat.persistence.dataobject.PluginDOExample; -import org.apache.ibatis.annotations.Mapper; import java.util.List; +import org.apache.ibatis.annotations.Mapper; @Mapper public interface PluginDOMapper { + /** - * * @mbg.generated */ long countByExample(PluginDOExample example); /** - * * @mbg.generated */ int deleteByPrimaryKey(Long id); /** - * * @mbg.generated */ int insert(PluginDO record); /** - * * @mbg.generated */ int insertSelective(PluginDO record); /** - * * @mbg.generated */ List selectByExampleWithBLOBs(PluginDOExample example); /** - * * @mbg.generated */ List selectByExample(PluginDOExample example); /** - * * @mbg.generated */ PluginDO selectByPrimaryKey(Long id); /** - * * @mbg.generated */ int updateByPrimaryKeySelective(PluginDO record); /** - * * @mbg.generated */ int updateByPrimaryKeyWithBLOBs(PluginDO record); /** - * * @mbg.generated */ int updateByPrimaryKey(PluginDO record); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatConfigRepository.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatConfigRepository.java index 3a9250e44..5da97c492 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatConfigRepository.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/ChatConfigRepository.java @@ -1,10 +1,9 @@ package com.tencent.supersonic.chat.persistence.repository; -import com.tencent.supersonic.chat.config.ChatConfig; 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 java.util.List; public interface ChatConfigRepository { @@ -15,5 +14,5 @@ public interface ChatConfigRepository { List getChatConfig(ChatConfigFilter filter); - ChatConfigResp getConfigByDomainId(Long domainId); + ChatConfigResp getConfigByModelId(Long modelId); } 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 3d9dac6a4..cce4aafd4 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,11 +2,10 @@ 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.QueryReq; +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.QueryResult; 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; public interface ChatQueryRepository { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/PluginRepository.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/PluginRepository.java index 4e434c376..969b129b0 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/PluginRepository.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/PluginRepository.java @@ -2,10 +2,10 @@ package com.tencent.supersonic.chat.persistence.repository; import com.tencent.supersonic.chat.persistence.dataobject.PluginDO; import com.tencent.supersonic.chat.persistence.dataobject.PluginDOExample; - import java.util.List; public interface PluginRepository { + List getPlugins(); List fetchPluginDOs(String queryText, String type); 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 2670d8be2..5df0cce0e 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,14 +1,13 @@ package com.tencent.supersonic.chat.persistence.repository.impl; -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.config.ChatConfig; +import com.tencent.supersonic.chat.config.ChatConfigFilterInternal; 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; @@ -24,7 +23,7 @@ public class ChatConfigRepositoryImpl implements ChatConfigRepository { private final ChatConfigMapper chatConfigMapper; public ChatConfigRepositoryImpl(ChatConfigHelper chatConfigHelper, - ChatConfigMapper chatConfigMapper) { + ChatConfigMapper chatConfigMapper) { this.chatConfigHelper = chatConfigHelper; this.chatConfigMapper = chatConfigMapper; } @@ -53,15 +52,16 @@ public class ChatConfigRepositoryImpl implements ChatConfigRepository { List chaConfigDOList = chatConfigMapper.search(filterInternal); if (!CollectionUtils.isEmpty(chaConfigDOList)) { chaConfigDOList.stream().forEach(chaConfigDO -> - chaConfigDescriptorList.add(chatConfigHelper.chatConfigDO2Descriptor(chaConfigDO.getDomainId(), chaConfigDO))); + chaConfigDescriptorList.add( + chatConfigHelper.chatConfigDO2Descriptor(chaConfigDO.getModelId(), chaConfigDO))); } return chaConfigDescriptorList; } @Override - public ChatConfigResp getConfigByDomainId(Long domainId) { - ChatConfigDO chaConfigPO = chatConfigMapper.fetchConfigByDomainId(domainId); - return chatConfigHelper.chatConfigDO2Descriptor(domainId, chaConfigPO); + public ChatConfigResp getConfigByModelId(Long modelId) { + ChatConfigDO chaConfigPO = chatConfigMapper.fetchConfigByModelId(modelId); + return chatConfigHelper.chatConfigDO2Descriptor(modelId, chaConfigPO); } } 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 dad207009..bfbe2f884 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,13 +3,12 @@ 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.QueryReq; +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.QueryResult; 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.ChatQueryDOMapper; import com.tencent.supersonic.chat.persistence.repository.ChatQueryRepository; import com.tencent.supersonic.common.util.JsonUtil; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatRepositoryImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatRepositoryImpl.java index ce7c4249c..29cd82a1c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatRepositoryImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/persistence/repository/impl/ChatRepositoryImpl.java @@ -2,8 +2,8 @@ package com.tencent.supersonic.chat.persistence.repository.impl; import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; import com.tencent.supersonic.chat.persistence.dataobject.QueryDO; -import com.tencent.supersonic.chat.persistence.repository.ChatRepository; import com.tencent.supersonic.chat.persistence.mapper.ChatMapper; +import com.tencent.supersonic.chat.persistence.repository.ChatRepository; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Primary; 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 3538bb632..101c97609 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,13 @@ 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 @@ -58,7 +58,7 @@ public class PluginRepositoryImpl implements PluginRepository { } @Override - public void updatePlugin(PluginDO pluginDO){ + public void updatePlugin(PluginDO pluginDO) { pluginDOMapper.updateByPrimaryKeyWithBLOBs(pluginDO); } @@ -68,12 +68,12 @@ public class PluginRepositoryImpl implements PluginRepository { } @Override - public List query(PluginDOExample pluginDOExample){ + public List query(PluginDOExample pluginDOExample) { return pluginDOMapper.selectByExampleWithBLOBs(pluginDOExample); } @Override - public void deletePlugin(Long id){ + public void deletePlugin(Long id) { pluginDOMapper.deleteByPrimaryKey(id); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/Plugin.java b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/Plugin.java index 5ce89f197..91eb2293f 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/Plugin.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/plugin/Plugin.java @@ -5,10 +5,10 @@ import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.tencent.supersonic.chat.parser.ParseMode; import com.tencent.supersonic.common.pojo.RecordInfo; +import java.util.List; import lombok.Data; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import java.util.List; @Data public class Plugin extends RecordInfo { @@ -20,7 +20,7 @@ public class Plugin extends RecordInfo { */ private String type; - private List domainList = Lists.newArrayList(); + private List modelList = Lists.newArrayList(); /** * description, for parsing @@ -51,8 +51,8 @@ public class Plugin extends RecordInfo { return Lists.newArrayList(); } - public boolean isContainsAllDomain() { - return CollectionUtils.isNotEmpty(domainList) && domainList.contains(-1L); + public boolean isContainsAllModel() { + return CollectionUtils.isNotEmpty(modelList) && modelList.contains(-1L); } } 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 67bb6bb18..6919b4b5d 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 @@ -2,24 +2,44 @@ 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.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.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.plugin.event.PluginAddEvent; import com.tencent.supersonic.chat.plugin.event.PluginUpdateEvent; +import com.tencent.supersonic.chat.query.plugin.ParamOption; +import com.tencent.supersonic.chat.query.plugin.WebBase; import com.tencent.supersonic.chat.service.PluginService; import com.tencent.supersonic.common.util.ContextUtils; import java.net.URI; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +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.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; @@ -42,7 +62,7 @@ public class PluginManager { public static List getPlugins() { PluginService pluginService = ContextUtils.getBean(PluginService.class); List pluginList = pluginService.getPluginList().stream().filter(plugin -> - CollectionUtils.isNotEmpty(plugin.getDomainList())).collect(Collectors.toList()); + CollectionUtils.isNotEmpty(plugin.getModelList())).collect(Collectors.toList()); pluginList.addAll(internalPluginMap.values()); return new ArrayList<>(pluginList); } @@ -89,9 +109,9 @@ public class PluginManager { doRequest(embeddingConfig.getAddPath(), JSONObject.toJSONString(maps)); } - public void doRequest(String path, String jsonBody) { + public ResponseEntity doRequest(String path, String jsonBody) { if (Strings.isEmpty(embeddingConfig.getUrl())) { - return; + return ResponseEntity.of(Optional.empty()); } String url = embeddingConfig.getUrl() + path; HttpHeaders headers = new HttpHeaders(); @@ -105,6 +125,7 @@ public class PluginManager { restTemplate.exchange(requestUrl, HttpMethod.POST, entity, new ParameterizedTypeReference() { }); log.info("[embedding] result body:{}", responseEntity); + return responseEntity; } public void requestEmbeddingPluginAddALL(List plugins) { @@ -115,7 +136,8 @@ public class PluginManager { } public EmbeddingResp recognize(String embeddingText) { - String url = embeddingConfig.getUrl() + embeddingConfig.getRecognizePath() + "?n_results=" + embeddingConfig.getNResult(); + String url = embeddingConfig.getUrl() + embeddingConfig.getRecognizePath() + "?n_results=" + + embeddingConfig.getNResult(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setLocation(URI.create(url)); @@ -125,8 +147,9 @@ public class PluginManager { HttpEntity entity = new HttpEntity<>(jsonBody, headers); log.info("[embedding] request body:{}, url:{}", jsonBody, url); ResponseEntity> embeddingResponseEntity = - restTemplate.exchange(requestUrl, HttpMethod.POST, entity, new ParameterizedTypeReference>() { - }); + restTemplate.exchange(requestUrl, HttpMethod.POST, entity, + new ParameterizedTypeReference>() { + }); log.info("[embedding] recognize result body:{}", embeddingResponseEntity); List embeddingResps = embeddingResponseEntity.getBody(); if (CollectionUtils.isNotEmpty(embeddingResps)) { @@ -178,4 +201,88 @@ public class PluginManager { return String.valueOf(Integer.parseInt(id) / 1000); } + public static Pair> resolve(Plugin plugin, QueryContext queryContext) { + SchemaMapInfo schemaMapInfo = queryContext.getMapInfo(); + Set pluginMatchedModel = getPluginMatchedModel(plugin, queryContext); + if (CollectionUtils.isEmpty(pluginMatchedModel) && !plugin.isContainsAllModel()) { + return Pair.of(false, Lists.newArrayList()); + } + List paramOptions = getSemanticOption(plugin); + if (CollectionUtils.isEmpty(paramOptions)) { + return Pair.of(true, new ArrayList<>(pluginMatchedModel)); + } + List matchedModel = Lists.newArrayList(); + Map> paramOptionMap = paramOptions.stream(). + collect(Collectors.groupingBy(ParamOption::getModelId)); + for (Long modelId : paramOptionMap.keySet()) { + List params = paramOptionMap.get(modelId); + if (CollectionUtils.isEmpty(params)) { + matchedModel.add(modelId); + continue; + } + boolean matched = true; + for (ParamOption paramOption : params) { + Set elementIdSet = getSchemaElementMatch(modelId, schemaMapInfo); + if (CollectionUtils.isEmpty(elementIdSet)) { + matched = false; + break; + } + if (!elementIdSet.contains(paramOption.getElementId())) { + matched = false; + break; + } + } + if (matched) { + matchedModel.add(modelId); + } + } + if (CollectionUtils.isEmpty(matchedModel)) { + return Pair.of(false, Lists.newArrayList()); + } + return Pair.of(true, matchedModel); + } + + private static Set getSchemaElementMatch(Long modelId, SchemaMapInfo schemaMapInfo) { + List schemaElementMatches = schemaMapInfo.getMatchedElements(modelId); + if (org.springframework.util.CollectionUtils.isEmpty(schemaElementMatches)) { + return Sets.newHashSet(); + } + return schemaElementMatches.stream().filter(schemaElementMatch -> + SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType()) || + SchemaElementType.ID.equals(schemaElementMatch.getElement().getType())) + .map(SchemaElementMatch::getElement) + .map(SchemaElement::getId) + .collect(Collectors.toSet()); + } + + + private static List getSemanticOption(Plugin plugin) { + WebBase webBase = JSONObject.parseObject(plugin.getConfig(), WebBase.class); + if (Objects.isNull(webBase)) { + return null; + } + List paramOptions = webBase.getParamOptions(); + if (org.springframework.util.CollectionUtils.isEmpty(paramOptions)) { + return Lists.newArrayList(); + } + return paramOptions.stream() + .filter(paramOption -> ParamOption.ParamType.SEMANTIC.equals(paramOption.getParamType())) + .collect(Collectors.toList()); + } + + private static Set getPluginMatchedModel(Plugin plugin, QueryContext queryContext) { + Set matchedModel = queryContext.getMapInfo().getMatchedModels(); + if (plugin.isContainsAllModel()) { + return matchedModel; + } + List modelIds = plugin.getModelList(); + Set pluginMatchedModel = Sets.newHashSet(); + for (Long modelId : modelIds) { + if (matchedModel.contains(modelId)) { + pluginMatchedModel.add(modelId); + } + } + return pluginMatchedModel; + } + } 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 d6482eadb..d207e586a 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 @@ -2,12 +2,19 @@ package com.tencent.supersonic.chat.plugin; import com.tencent.supersonic.chat.parser.function.Parameters; -import lombok.Data; - import java.io.Serializable; import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; @Data +@Builder +@AllArgsConstructor +@ToString +@NoArgsConstructor public class PluginParseConfig implements Serializable { private String name; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/ContentInterpret/ContentInterpretQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/ContentInterpret/ContentInterpretQuery.java new file mode 100644 index 000000000..b2d43db6c --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/ContentInterpret/ContentInterpretQuery.java @@ -0,0 +1,149 @@ +package com.tencent.supersonic.chat.query.ContentInterpret; + +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.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.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.api.pojo.response.QueryState; +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.plugin.PluginSemanticQuery; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.common.pojo.Aggregator; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.pojo.QueryColumn; +import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.query.pojo.Filter; +import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.calcite.sql.parser.SqlParseException; +import org.springframework.beans.BeanUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +@Slf4j +@Component +public class ContentInterpretQuery extends PluginSemanticQuery { + + @Override + public String getQueryMode() { + return "CONTENT_INTERPRET"; + } + + public ContentInterpretQuery() { + QueryManager.register(this); + } + + @Override + public QueryResult execute(User user) throws SqlParseException { + QueryResultWithSchemaResp queryResultWithSchemaResp = queryMetric(user); + String text = generateDataText(queryResultWithSchemaResp); + Map properties = parseInfo.getProperties(); + PluginParseResult pluginParseResult = JsonUtil.toObject(JsonUtil.toString(properties.get(Constants.CONTEXT)) + , PluginParseResult.class); + String answer = fetchInterpret(pluginParseResult.getRequest().getQueryText(), text); + QueryResult queryResult = new QueryResult(); + List queryColumns = Lists.newArrayList(new QueryColumn("结果", "string", "answer")); + Map result = new HashMap<>(); + result.put("answer", answer); + List> resultList = Lists.newArrayList(); + resultList.add(result); + queryResultWithSchemaResp.setResultList(resultList); + queryResultWithSchemaResp.setColumns(queryColumns); + queryResult.setResponse(queryResultWithSchemaResp); + queryResult.setQueryMode(getQueryMode()); + queryResult.setQueryState(QueryState.SUCCESS); + return queryResult; + } + + + private QueryResultWithSchemaResp queryMetric(User user) { + SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); + QueryStructReq queryStructReq = new QueryStructReq(); + queryStructReq.setModelId(parseInfo.getModelId()); + queryStructReq.setGroups(Lists.newArrayList(TimeDimensionEnum.DAY.getName())); + ModelSchema modelSchema = semanticLayer.getModelSchema(parseInfo.getModelId(), true); + queryStructReq.setAggregators(buildAggregator(modelSchema)); + List filterList = Lists.newArrayList(); + for (QueryFilter queryFilter : parseInfo.getDimensionFilters()) { + Filter filter = new Filter(); + BeanUtils.copyProperties(queryFilter, filter); + filterList.add(filter); + } + queryStructReq.setDimensionFilters(filterList); + DateConf dateConf = new DateConf(); + dateConf.setDateMode(DateConf.DateMode.RECENT); + dateConf.setUnit(7); + queryStructReq.setDateInfo(dateConf); + return semanticLayer.queryByStruct(queryStructReq, user); + } + + private List buildAggregator(ModelSchema modelSchema) { + List aggregators = Lists.newArrayList(); + Set metrics = modelSchema.getMetrics(); + if (CollectionUtils.isEmpty(metrics)) { + return aggregators; + } + for (SchemaElement schemaElement : metrics) { + Aggregator aggregator = new Aggregator(); + aggregator.setColumn(schemaElement.getBizName()); + aggregator.setFunc(AggOperatorEnum.SUM); + aggregator.setNameCh(schemaElement.getName()); + aggregators.add(aggregator); + } + return aggregators; + } + + + public String generateDataText(QueryResultWithSchemaResp queryResultWithSchemaResp) { + Map map = queryResultWithSchemaResp.getColumns().stream() + .collect(Collectors.toMap(QueryColumn::getNameEn, QueryColumn::getName)); + StringBuilder stringBuilder = new StringBuilder(); + for (Map valueMap : queryResultWithSchemaResp.getResultList()) { + for (String key : valueMap.keySet()) { + String name = ""; + if (TimeDimensionEnum.getNameList().contains(key)) { + name = "日期"; + } else { + name = map.get(key); + } + String value = String.valueOf(valueMap.get(key)); + stringBuilder.append(name).append(":").append(value).append(" "); + } + } + return stringBuilder.toString(); + } + + + public String fetchInterpret(String queryText, String dataText) { + PluginManager pluginManager = ContextUtils.getBean(PluginManager.class); + LLmAnswerReq lLmAnswerReq = new LLmAnswerReq(); + lLmAnswerReq.setQueryText(queryText); + lLmAnswerReq.setPluginOutput(dataText); + ResponseEntity responseEntity = pluginManager.doRequest("answer_with_plugin_call", + JSONObject.toJSONString(lLmAnswerReq)); + LLmAnswerResp lLmAnswerResp = JSONObject.parseObject(responseEntity.getBody(), LLmAnswerResp.class); + if (lLmAnswerResp != null) { + return lLmAnswerResp.getAssistant_message(); + } + return null; + } + + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/ContentInterpret/LLmAnswerReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/ContentInterpret/LLmAnswerReq.java new file mode 100644 index 000000000..d678c80f3 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/ContentInterpret/LLmAnswerReq.java @@ -0,0 +1,13 @@ +package com.tencent.supersonic.chat.query.ContentInterpret; + + +import lombok.Data; + +@Data +public class LLmAnswerReq { + + private String queryText; + + private String pluginOutput; + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/ContentInterpret/LLmAnswerResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/ContentInterpret/LLmAnswerResp.java new file mode 100644 index 000000000..728b696fe --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/ContentInterpret/LLmAnswerResp.java @@ -0,0 +1,11 @@ +package com.tencent.supersonic.chat.query.ContentInterpret; + + +import lombok.Data; + +@Data +public class LLmAnswerResp { + + private String assistant_message; + +} 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 cb6602263..31f892f37 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 @@ -2,20 +2,19 @@ package com.tencent.supersonic.chat.query; import com.tencent.supersonic.chat.api.component.SemanticQuery; 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.common.pojo.Constants; - -import java.util.*; - +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 java.util.ArrayList; +import java.util.List; +import java.util.OptionalDouble; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @Slf4j public class HeuristicQuerySelector implements QuerySelector { - private static final double MATCH_INHERIT_PENALTY = 0.5; - private static final double MATCH_CURRENT_REWORD = 2; private static final double CANDIDATE_THRESHOLD = 0.2; @Override @@ -26,49 +25,53 @@ public class HeuristicQuerySelector implements QuerySelector { selectedQueries.addAll(candidateQueries); } else { OptionalDouble maxScoreOp = candidateQueries.stream().mapToDouble( - q -> computeScore(q.getParseInfo())).max(); + q -> q.getParseInfo().getScore()).max(); if (maxScoreOp.isPresent()) { double maxScore = maxScoreOp.getAsDouble(); candidateQueries.stream().forEach(query -> { - SemanticParseInfo semanticParse = query.getParseInfo(); - if ((maxScore - semanticParse.getScore()) / maxScore <= CANDIDATE_THRESHOLD) { + SemanticParseInfo parseInfo = query.getParseInfo(); + if (!checkFullyInherited(query) + && (maxScore - parseInfo.getScore()) / maxScore <= CANDIDATE_THRESHOLD + && checkSatisfyOtherRules(query, candidateQueries)) { selectedQueries.add(query); } - log.info("candidate query (domain={}, queryMode={}) with score={}", - semanticParse.getDomainName(), semanticParse.getQueryMode(), semanticParse.getScore()); + log.info("candidate query (Model={}, queryMode={}) with score={}", + parseInfo.getModelName(), parseInfo.getQueryMode(), parseInfo.getScore()); }); } } return selectedQueries; } - private double computeScore(SemanticParseInfo semanticParse) { - double totalScore = 0; - - Map maxSimilarityMatch = new HashMap<>(); - for (SchemaElementMatch match : semanticParse.getElementMatches()) { - SchemaElementType type = match.getElement().getType(); - if (!maxSimilarityMatch.containsKey(type) || - match.getSimilarity() > maxSimilarityMatch.get(type).getSimilarity()) { - maxSimilarityMatch.put(type, match); + private boolean checkSatisfyOtherRules(SemanticQuery semanticQuery, List candidateQueries) { + if (!semanticQuery.getQueryMode().equals(MetricModelQuery.QUERY_MODE)) { + return true; + } + for (SemanticQuery candidateQuery : candidateQueries) { + if (candidateQuery.getQueryMode().equals(MetricEntityQuery.QUERY_MODE) && + semanticQuery.getParseInfo().getScore() == candidateQuery.getParseInfo().getScore()) { + return false; } } + return true; + } - for (SchemaElementMatch match : maxSimilarityMatch.values()) { - double matchScore = Optional.ofNullable(match.getDetectWord()).orElse(Constants.EMPTY).length() * match.getSimilarity(); - if (match.equals(SchemaElementMatch.MatchMode.INHERIT)) { - matchScore *= MATCH_INHERIT_PENALTY; - } else { - matchScore *= MATCH_CURRENT_REWORD; - } - totalScore += matchScore; + private boolean checkFullyInherited(SemanticQuery query) { + SemanticParseInfo parseInfo = query.getParseInfo(); + if (!(query instanceof RuleSemanticQuery)) { + return false; } - // original score in parse info acts like an extra bonus - totalScore += semanticParse.getScore(); - semanticParse.setScore(totalScore); + for (SchemaElementMatch match : parseInfo.getElementMatches()) { + if (!match.isInherited()) { + return false; + } + } + if (parseInfo.getDateInfo() != null && !parseInfo.getDateInfo().isInherited()) { + return false; + } - return totalScore; + return true; } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/QueryManager.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/QueryManager.java index 9b808f7f1..181ad210e 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/QueryManager.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/QueryManager.java @@ -5,7 +5,6 @@ import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; import com.tencent.supersonic.chat.query.rule.entity.EntitySemanticQuery; import com.tencent.supersonic.chat.query.rule.metric.MetricSemanticQuery; - import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -56,6 +55,7 @@ public class QueryManager { throw new RuntimeException("no supported queryMode :" + queryMode); } } + public static boolean containsRuleQuery(String queryMode) { if (queryMode == null) { return false; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/QuerySelector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/QuerySelector.java index 906938548..fdfe5a4d0 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/QuerySelector.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/QuerySelector.java @@ -1,7 +1,6 @@ package com.tencent.supersonic.chat.query; import com.tencent.supersonic.chat.api.component.SemanticQuery; - import java.util.List; /** diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/DSLBuilder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/DSLBuilder.java new file mode 100644 index 000000000..fef2077aa --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/DSLBuilder.java @@ -0,0 +1,78 @@ +package com.tencent.supersonic.chat.query.dsl; + +import com.tencent.supersonic.chat.api.pojo.SchemaElement; +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.QueryFilters; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.util.StringUtil; +import com.tencent.supersonic.common.util.jsqlparser.CCJSqlParserUtils; +import com.tencent.supersonic.knowledge.service.SchemaService; +import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; +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 net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +@Slf4j +public class DSLBuilder { + + public static final String DATA_Field = "数据日期"; + public static final String TABLE_PREFIX = "t_"; + + public String build(SemanticParseInfo parseInfo, QueryFilters queryFilters, LLMResp llmResp, Long modelId) + throws Exception { + + String sqlOutput = llmResp.getSqlOutput(); + SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); + List dbAllFields = new ArrayList<>(); + dbAllFields.addAll(semanticSchema.getMetrics()); + dbAllFields.addAll(semanticSchema.getDimensions()); + + Map fieldToBizName = getMapInfo(modelId, dbAllFields); + fieldToBizName.put(DATA_Field, TimeDimensionEnum.DAY.getName()); + + sqlOutput = CCJSqlParserUtils.replaceFields(sqlOutput, fieldToBizName); + + sqlOutput = CCJSqlParserUtils.replaceTable(sqlOutput, TABLE_PREFIX + modelId); + + String queryFilter = getQueryFilter(queryFilters); + if (StringUtils.isNotEmpty(queryFilter)) { + log.info("add queryFilter to sql :{}", queryFilter); + Expression expression = CCJSqlParserUtil.parseCondExpression(queryFilter); + CCJSqlParserUtils.addWhere(sqlOutput, expression); + } + + log.info("build sqlOutput:{}", sqlOutput); + return sqlOutput; + } + + protected Map getMapInfo(Long modelId, List metrics) { + return metrics.stream().filter(entry -> entry.getModel().equals(modelId)) + .collect(Collectors.toMap(SchemaElement::getName, a -> a.getBizName(), (k1, k2) -> k1)); + } + + private String getQueryFilter(QueryFilters queryFilters) { + if (Objects.isNull(queryFilters) || CollectionUtils.isEmpty(queryFilters.getFilters())) { + return ""; + } + List filters = queryFilters.getFilters(); + + return filters.stream() + .map(filter -> { + String bizNameWrap = StringUtil.getSpaceWrap(filter.getBizName()); + String operatorWrap = StringUtil.getSpaceWrap(filter.getOperator().getValue()); + String valueWrap = StringUtil.getCommaWrap(filter.getValue().toString()); + return bizNameWrap + operatorWrap + valueWrap; + }) + .collect(Collectors.joining(Constants.AND_UPPER)); + } +} 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/dsl/DSLQuery.java new file mode 100644 index 000000000..fc09b9637 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/DSLQuery.java @@ -0,0 +1,96 @@ +package com.tencent.supersonic.chat.query.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.SemanticParseInfo; +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.parser.llm.DSLParseResult; +import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; +import com.tencent.supersonic.chat.service.SemanticService; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.chat.utils.QueryReqBuilder; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.QueryColumn; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.util.JsonUtil; +import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; +import com.tencent.supersonic.semantic.api.query.request.QueryDslReq; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class DSLQuery extends PluginSemanticQuery { + + public static final String QUERY_MODE = "DSL"; + private DSLBuilder dslBuilder = new DSLBuilder(); + protected SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); + + public DSLQuery() { + QueryManager.register(this); + } + + @Override + public String getQueryMode() { + return QUERY_MODE; + } + + @Override + public QueryResult execute(User user) { + String json = JsonUtil.toString(parseInfo.getProperties().get(Constants.CONTEXT)); + DSLParseResult dslParseResult = JsonUtil.toObject(json, DSLParseResult.class); + LLMResp llmResp = dslParseResult.getLlmResp(); + QueryReq queryReq = dslParseResult.getRequest(); + + Long modelId = parseInfo.getModelId(); + String querySql = convertToSql(queryReq.getQueryFilters(), llmResp, parseInfo, modelId); + + long startTime = System.currentTimeMillis(); + + QueryDslReq queryDslReq = QueryReqBuilder.buildDslReq(querySql, modelId); + QueryResultWithSchemaResp queryResp = semanticLayer.queryByDsl(queryDslReq, user); + + log.info("queryByDsl cost:{},querySql:{}", System.currentTimeMillis() - startTime, querySql); + + QueryResult queryResult = new QueryResult(); + if (Objects.nonNull(queryResp)) { + queryResult.setQueryAuthorization(queryResp.getQueryAuthorization()); + } + String resultQql = queryResp == null ? null : queryResp.getSql(); + List> resultList = queryResp == null ? new ArrayList<>() : queryResp.getResultList(); + List columns = queryResp == null ? new ArrayList<>() : queryResp.getColumns(); + queryResult.setQuerySql(resultQql); + queryResult.setQueryResults(resultList); + queryResult.setQueryColumns(columns); + queryResult.setQueryMode(QUERY_MODE); + queryResult.setQueryState(QueryState.SUCCESS); + + // add model info + EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class).getEntityInfo(parseInfo, user); + queryResult.setEntityInfo(entityInfo); + parseInfo.setProperties(null); + return queryResult; + } + + + protected String convertToSql(QueryFilters queryFilters, LLMResp llmResp, SemanticParseInfo parseInfo, + Long modelId) { + try { + return dslBuilder.build(parseInfo, queryFilters, llmResp, modelId); + } catch (Exception e) { + log.error("convertToSql error", e); + } + return null; + } + + +} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/LLMReq.java similarity index 79% rename from chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMReq.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/LLMReq.java index c78ceafc3..acce57c7e 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMReq.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/LLMReq.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.query.plugin.dsl; +package com.tencent.supersonic.chat.query.dsl; import java.util.List; import lombok.Data; @@ -12,6 +12,8 @@ public class LLMReq { private List linking; + private String currentDate; + @Data public static class ElementValue { @@ -26,6 +28,8 @@ public class LLMReq { private String domainName; + private String modelName; + private List fieldNameList; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/LLMResp.java similarity index 74% rename from chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMResp.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/LLMResp.java index 80273fab8..6b1718ecd 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/LLMResp.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/dsl/LLMResp.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.query.plugin.dsl; +package com.tencent.supersonic.chat.query.dsl; import java.util.List; import lombok.Data; @@ -8,7 +8,7 @@ public class LLMResp { private String query; - private String domainName; + private String modelName; private String sqlOutput; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/ParamOption.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/ParamOption.java index 4e786eefb..7bee4471a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/ParamOption.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/ParamOption.java @@ -15,7 +15,7 @@ public class ParamOption { private String keyAlias; - private Long domainId; + private Long modelId; private Long elementId; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/WebBase.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/WebBase.java index dd26c2ff0..1db91e70a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/WebBase.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/WebBase.java @@ -1,8 +1,8 @@ package com.tencent.supersonic.chat.query.plugin; import com.google.common.collect.Lists; -import lombok.Data; import java.util.List; +import lombok.Data; @Data public class WebBase { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/WebBaseResult.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/WebBaseResult.java index 8ba6cde74..debedcd5f 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/WebBaseResult.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/WebBaseResult.java @@ -1,8 +1,8 @@ package com.tencent.supersonic.chat.query.plugin; import com.google.common.collect.Lists; -import lombok.Data; import java.util.List; +import lombok.Data; @Data public class WebBaseResult { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLBuilder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLBuilder.java deleted file mode 100644 index 69f4a6bd7..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLBuilder.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.tencent.supersonic.chat.query.plugin.dsl; - -import static java.time.LocalDate.now; - -import com.tencent.supersonic.chat.api.pojo.SchemaElement; -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.QueryFilters; -import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.util.ContextUtils; -import com.tencent.supersonic.common.util.calcite.SqlParseUtils; -import com.tencent.supersonic.common.util.calcite.SqlParserInfo; -import com.tencent.supersonic.knowledge.service.SchemaService; -import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; -import java.text.MessageFormat; -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.calcite.sql.parser.SqlParseException; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; - -@Slf4j -public class DSLBuilder { - - public static final String COMMA_WRAPPER = "'%s'"; - public static final String SPACE_WRAPPER = " %s "; - protected static final String SUB_TABLE = " ( select * from t_{0} where {1} >= ''{2}'' and {1} <= ''{3}'' {4} ) as t_sub_{0}"; - - public String build(QueryFilters queryFilters, SemanticParseInfo parseInfo, LLMResp llmResp, Long domainId) - throws SqlParseException { - - String sqlOutput = llmResp.getSqlOutput(); - String domainName = llmResp.getDomainName(); - - // 1. extra deal with,such as add alias. - sqlOutput = extraConvert(sqlOutput, domainId); - - SqlParserInfo sqlParseInfo = SqlParseUtils.getSqlParseInfo(sqlOutput); - - String tableName = sqlParseInfo.getTableName(); - List allFields = sqlParseInfo.getAllFields(); - - if (StringUtils.isEmpty(domainName)) { - domainName = tableName; - } - - // 2. replace the llm dsl, such as replace fieldName and tableName. - log.info("sqlParseInfo:{} ,domainName:{},domainId:{}", sqlParseInfo, domainName, domainId); - - SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); - List dbAllFields = new ArrayList<>(); - dbAllFields.addAll(semanticSchema.getMetrics()); - dbAllFields.addAll(semanticSchema.getDimensions()); - - Map fieldToBizName = getMapInfo(domainId, dbAllFields); - - for (String fieldName : allFields) { - String fieldBizName = fieldToBizName.get(fieldName); - if (StringUtils.isNotEmpty(fieldBizName)) { - sqlOutput = sqlOutput.replaceAll(fieldName, fieldBizName); - } - } - //3. deal with dayNo. - DateConf dateInfo = new DateConf(); - if (Objects.nonNull(parseInfo) && Objects.nonNull(parseInfo.getDateInfo())) { - dateInfo = parseInfo.getDateInfo(); - } else { - String startDate = now().plusDays(-4).toString(); - String endDate = now().plusDays(-4).toString(); - dateInfo.setStartDate(startDate); - dateInfo.setEndDate(endDate); - } - - String startDate = dateInfo.getStartDate(); - String endDate = dateInfo.getEndDate(); - String period = dateInfo.getPeriod(); - TimeDimensionEnum timeDimension = TimeDimensionEnum.valueOf(period); - String dayField = timeDimension.getName(); - - String queryFilter = getQueryFilter(queryFilters); - - String subTable = MessageFormat.format(SUB_TABLE, domainId, dayField, startDate, endDate, queryFilter); - String querySql = sqlOutput.replaceAll(tableName, subTable); - - log.info("querySql:{},sqlOutput:{},dateInfo:{}", querySql, sqlOutput, dateInfo); - return querySql; - } - - private String getQueryFilter(QueryFilters queryFilters) { - String queryFilter = ""; - if (Objects.isNull(queryFilters) || CollectionUtils.isEmpty(queryFilters.getFilters())) { - return queryFilter; - } - List filters = queryFilters.getFilters(); - for (QueryFilter filter : filters) { - queryFilter = getSpaceWrap(queryFilter) + "and" + getSpaceWrap(filter.getBizName()) + getSpaceWrap( - filter.getOperator().getValue()) + getCommaWrap(filter.getValue().toString()); - } - return queryFilter; - } - - protected String extraConvert(String sqlOutput, Long domainId) throws SqlParseException { - return SqlParseUtils.addAliasToSql(sqlOutput); - } - - protected Map getMapInfo(Long domainId, List metrics) { - return metrics.stream().filter(entry -> entry.getDomain().equals(domainId)) - .collect(Collectors.toMap(SchemaElement::getName, a -> a.getBizName(), (k1, k2) -> k1)); - } - - - private String getCommaWrap(String value) { - return String.format(COMMA_WRAPPER, value); - } - - private String getSpaceWrap(String value) { - return String.format(SPACE_WRAPPER, value); - } -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLQuery.java deleted file mode 100644 index a690c32c6..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/dsl/DSLQuery.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.tencent.supersonic.chat.query.plugin.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.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.QueryFilters; -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.config.LLMConfig; -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.plugin.dsl.LLMReq.ElementValue; -import com.tencent.supersonic.chat.service.SemanticService; -import com.tencent.supersonic.chat.utils.ComponentFactory; -import com.tencent.supersonic.chat.utils.QueryReqBuilder; -import com.tencent.supersonic.common.pojo.Constants; -import com.tencent.supersonic.common.pojo.QueryColumn; -import com.tencent.supersonic.common.util.ContextUtils; -import com.tencent.supersonic.common.util.JsonUtil; -import com.tencent.supersonic.knowledge.service.SchemaService; -import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; -import java.util.ArrayList; -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.apache.calcite.sql.parser.SqlParseException; -import org.apache.commons.lang3.StringUtils; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; - -@Slf4j -@Component -public class DSLQuery extends PluginSemanticQuery { - - public static final String QUERY_MODE = "DSL"; - private DSLBuilder dslBuilder = new DSLBuilder(); - - protected SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - - public DSLQuery() { - QueryManager.register(this); - } - - @Override - public String getQueryMode() { - return QUERY_MODE; - } - - @Override - public QueryResult execute(User user) { - PluginParseResult functionCallParseResult =JsonUtil.toObject(JsonUtil.toString(parseInfo.getProperties().get(Constants.CONTEXT)),PluginParseResult.class); - Long domainId = parseInfo.getDomainId(); - LLMResp llmResp = requestLLM(functionCallParseResult, domainId); - if (Objects.isNull(llmResp)) { - return null; - } - String querySql = convertToSql(functionCallParseResult.getRequest().getQueryFilters(), llmResp, parseInfo, - domainId); - QueryResult queryResult = new QueryResult(); - - long startTime = System.currentTimeMillis(); - QueryResultWithSchemaResp queryResp = semanticLayer.queryByDsl( - QueryReqBuilder.buildDslReq(querySql, domainId), user); - log.info("queryByDsl cost:{},querySql:{}", System.currentTimeMillis() - startTime, querySql); - - if (queryResp != null) { - queryResult.setQueryAuthorization(queryResp.getQueryAuthorization()); - } - String resultQql = queryResp == null ? null : queryResp.getSql(); - List> resultList = queryResp == null ? new ArrayList<>() - : queryResp.getResultList(); - List columns = queryResp == null ? new ArrayList<>() : queryResp.getColumns(); - queryResult.setQuerySql(resultQql); - queryResult.setQueryResults(resultList); - queryResult.setQueryColumns(columns); - queryResult.setQueryMode(QUERY_MODE); - queryResult.setQueryState(QueryState.SUCCESS); - - // add domain info - EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class) - .getEntityInfo(parseInfo, user); - queryResult.setEntityInfo(entityInfo); - parseInfo.setProperties(null); - return queryResult; - } - - - protected String convertToSql(QueryFilters queryFilters, LLMResp llmResp, SemanticParseInfo parseInfo, - Long domainId) { - try { - return dslBuilder.build(queryFilters, parseInfo, llmResp, domainId); - } catch (SqlParseException e) { - log.error("convertToSql error", e); - } - return null; - } - - protected LLMResp requestLLM(PluginParseResult parseResult, Long domainId) { - long startTime = System.currentTimeMillis(); - String queryText = parseResult.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; - } - - SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); - Map domainIdToName = semanticSchema.getDomainIdToName(); - - LLMReq llmReq = new LLMReq(); - llmReq.setQueryText(queryText); - LLMReq.LLMSchema llmSchema = new LLMReq.LLMSchema(); - llmSchema.setDomainName(domainIdToName.get(domainId)); - List fieldNameList = getFieldNameList(domainId, semanticSchema); - llmSchema.setFieldNameList(fieldNameList); - llmReq.setSchema(llmSchema); - List linking = new ArrayList<>(); - linking.addAll(getValueList(domainId, semanticSchema)); - llmReq.setLinking(linking); - - log.info("requestLLM request, domainId:{},llmReq:{}", domainId, llmReq); - String questUrl = llmConfig.getUrl() + llmConfig.getQueryToSqlPath(); - - RestTemplate restTemplate = ContextUtils.getBean(RestTemplate.class); - - try { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity entity = new HttpEntity<>(JsonUtil.toString(llmReq), headers); - ResponseEntity responseEntity = restTemplate.exchange(questUrl, HttpMethod.POST, entity, - LLMResp.class); - - log.info("requestLLM response,cost:{}, questUrl:{} \n entity:{} \n body:{}", - System.currentTimeMillis() - startTime, questUrl, entity, responseEntity.getBody()); - return responseEntity.getBody(); - } catch (Exception e) { - log.error("requestLLM error", e); - } - return null; - } - - private List getValueList(Long domainId, SemanticSchema semanticSchema) { - Map itemIdToName = semanticSchema.getDimensions().stream() - .filter(entry -> domainId.equals(entry.getDomain())) - .collect(Collectors.toMap(SchemaElement::getId, SchemaElement::getName, (value1, value2) -> value2)); - - List matchedElements = parseInfo.getElementMatches(); - Set valueMatches = matchedElements.stream() - .filter(schemaElementMatch -> SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())) - .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); - } - - private List getFieldNameList(Long domainId, SemanticSchema semanticSchema) { - Map itemIdToName = semanticSchema.getDimensions().stream() - .filter(entry -> domainId.equals(entry.getDomain())) - .collect(Collectors.toMap(SchemaElement::getId, SchemaElement::getName, (value1, value2) -> value2)); - - List matchedElements = parseInfo.getElementMatches(); - Set fieldNameList = matchedElements.stream() - .filter(schemaElementMatch -> { - SchemaElementType elementType = schemaElementMatch.getElement().getType(); - return SchemaElementType.METRIC.equals(elementType) || - SchemaElementType.DIMENSION.equals(elementType) || - SchemaElementType.VALUE.equals(elementType); - }) - .map(schemaElementMatch -> { - SchemaElementType elementType = schemaElementMatch.getElement().getType(); - - if (!SchemaElementType.VALUE.equals(elementType)) { - return schemaElementMatch.getWord(); - } - return itemIdToName.get(schemaElementMatch.getElement().getId()); - }) - .filter(name -> StringUtils.isNotEmpty(name) && !name.contains("%")) - .collect(Collectors.toSet()); - return new ArrayList<>(fieldNameList); - } - - -} 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 f28b796fd..3c92e6d01 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,11 +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; @@ -14,18 +18,18 @@ 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; import com.tencent.supersonic.common.util.JsonUtil; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import java.util.*; -import java.util.stream.Collectors; - @Slf4j @Component public class WebPageQuery extends PluginSemanticQuery { @@ -43,51 +47,45 @@ public class WebPageQuery extends PluginSemanticQuery { @Override public QueryResult execute(User user) { - ConfigService configService = ContextUtils.getBean(ConfigService.class); QueryResult queryResult = new QueryResult(); queryResult.setQueryMode(QUERY_MODE); Map properties = parseInfo.getProperties(); - PluginParseResult pluginParseResult = JsonUtil.toObject(JsonUtil.toString(properties.get(Constants.CONTEXT)), PluginParseResult.class); - WebPageResponse webPageResponse = buildResponse(pluginParseResult.getPlugin()); + PluginParseResult pluginParseResult = JsonUtil.toObject(JsonUtil.toString(properties.get(Constants.CONTEXT)) + , PluginParseResult.class); + WebPageResponse webPageResponse = buildResponse(pluginParseResult); queryResult.setResponse(webPageResponse); - if (parseInfo.getDomainId() != null && parseInfo.getDomainId() > 0 - && parseInfo.getEntity() != null && Objects.nonNull(parseInfo.getEntity().getId()) - && parseInfo.getEntity().getId() > 0) { - ChatConfigRichResp chatConfigRichResp = configService.getConfigRichInfo(parseInfo.getDomainId()); - updateSemanticParse(chatConfigRichResp); - EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class).getEntityInfo(parseInfo, user); - queryResult.setEntityInfo(entityInfo); - } else { - queryResult.setEntityInfo(null); - } + SemanticService semanticService = ContextUtils.getBean(SemanticService.class); + ModelSchema modelSchema = semanticService.getModelSchema(parseInfo.getModelId()); + parseInfo.setModel(modelSchema.getModel()); + EntityInfo entityInfo = semanticService.getEntityInfo(parseInfo, user); + queryResult.setEntityInfo(entityInfo); queryResult.setQueryState(QueryState.SUCCESS); return queryResult; } - private void updateSemanticParse(ChatConfigRichResp chatConfigRichResp) { - SchemaElement domain = new SchemaElement(); - domain.setId(chatConfigRichResp.getDomainId()); - domain.setName(chatConfigRichResp.getDomainName()); - parseInfo.setDomain(domain); - } - - protected WebPageResponse buildResponse(Plugin plugin) { + protected WebPageResponse buildResponse(PluginParseResult pluginParseResult) { + Plugin plugin = pluginParseResult.getPlugin(); WebPageResponse webPageResponse = new WebPageResponse(); webPageResponse.setName(plugin.getName()); webPageResponse.setPluginId(plugin.getId()); webPageResponse.setPluginType(plugin.getType()); WebBase webPage = JsonUtil.toObject(plugin.getConfig(), WebBase.class); - WebBaseResult webBaseResult = buildWebPageResult(webPage); + WebBaseResult webBaseResult = buildWebPageResult(webPage, pluginParseResult); webPageResponse.setWebPage(webBaseResult); return webPageResponse; } - private WebBaseResult buildWebPageResult(WebBase webPage) { + private WebBaseResult buildWebPageResult(WebBase webPage, PluginParseResult pluginParseResult) { WebBaseResult webBaseResult = new WebBaseResult(); webBaseResult.setUrl(webPage.getUrl()); - Map elementValueMap = getElementMap(); + Map elementValueMap = getElementMap(pluginParseResult); + List paramOptions = Lists.newArrayList(); if (!CollectionUtils.isEmpty(webPage.getParamOptions()) && !CollectionUtils.isEmpty(elementValueMap)) { for (ParamOption paramOption : webPage.getParamOptions()) { + if (paramOption.getModelId() != null && !paramOption.getModelId().equals(parseInfo.getModelId())) { + continue; + } + paramOptions.add(paramOption); if (!ParamOption.ParamType.SEMANTIC.equals(paramOption.getParamType())) { continue; } @@ -96,12 +94,13 @@ public class WebPageQuery extends PluginSemanticQuery { paramOption.setValue(elementValue); } } - webBaseResult.setParams(webPage.getParamOptions()); + webBaseResult.setParams(paramOptions); return webBaseResult; } - private Map getElementMap() { + protected Map getElementMap(PluginParseResult pluginParseResult) { Map elementValueMap = new HashMap<>(); + Map filterValueMap = getFilterMap(pluginParseResult); List schemaElementMatchList = parseInfo.getElementMatches(); if (!CollectionUtils.isEmpty(schemaElementMatchList)) { schemaElementMatchList.stream() @@ -109,11 +108,37 @@ public class WebPageQuery extends PluginSemanticQuery { SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType()) || SchemaElementType.ID.equals(schemaElementMatch.getElement().getType())) .sorted(Comparator.comparingDouble(SchemaElementMatch::getSimilarity)) - .forEach(schemaElementMatch -> + .forEach(schemaElementMatch -> { + 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()); + } + } else { elementValueMap.put(String.valueOf(schemaElementMatch.getElement().getId()), - schemaElementMatch.getWord())); + schemaElementMatch.getWord()); + } + }); } return elementValueMap; } + private Map getFilterMap(PluginParseResult pluginParseResult) { + Map map = new HashMap<>(); + QueryReq queryReq = pluginParseResult.getRequest(); + if (queryReq == null || queryReq.getQueryFilters() == null) { + return map; + } + QueryFilters queryFilters = queryReq.getQueryFilters(); + List queryFilterList = queryFilters.getFilters(); + if (CollectionUtils.isEmpty(queryFilterList)) { + return map; + } + for (QueryFilter queryFilter : queryFilterList) { + map.put(queryFilter.getElementID(), queryFilter.getValue()); + } + return map; + } + } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageResponse.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageResponse.java index 8a728ae91..bf4d5b5ae 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageResponse.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageResponse.java @@ -1,9 +1,8 @@ package com.tencent.supersonic.chat.query.plugin.webpage; -import com.tencent.supersonic.chat.query.plugin.WebBase; import com.tencent.supersonic.chat.query.plugin.WebBaseResult; -import lombok.Data; import java.util.List; +import lombok.Data; @Data public class WebPageResponse { 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 427f7b5db..50c20832c 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,22 +11,23 @@ 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.pojo.QueryColumn; -import com.tencent.supersonic.common.util.*; - +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.util.JsonUtil; import java.net.URI; +import java.util.HashMap; import java.util.List; import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.apache.calcite.sql.parser.SqlParseException; -import org.springframework.http.*; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import java.util.HashMap; -import java.util.Map; - @Slf4j @Component public class WebServiceQuery extends PluginSemanticQuery { @@ -49,11 +50,12 @@ 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); - parseInfo.setProperties(null); + //parseInfo.setProperties(null); return queryResult; } 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 4c3995745..c011866d3 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 @@ -2,8 +2,6 @@ package com.tencent.supersonic.chat.query.plugin.webservice; import com.tencent.supersonic.chat.query.plugin.WebBase; import lombok.Data; -import lombok.Getter; -import lombok.Setter; @Data public class WebServiceResponse { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/QueryMatcher.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/QueryMatcher.java index f10a524a7..e28dc3040 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/QueryMatcher.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/QueryMatcher.java @@ -1,12 +1,8 @@ package com.tencent.supersonic.chat.query.rule; -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.common.pojo.Constants; import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; -import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; -import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -15,7 +11,6 @@ import java.util.Map; import java.util.Objects; import lombok.Data; import lombok.ToString; -import org.springframework.util.CollectionUtils; @Data @ToString @@ -29,7 +24,7 @@ public class QueryMatcher { public QueryMatcher() { for (SchemaElementType type : SchemaElementType.values()) { - if (type.equals(SchemaElementType.DOMAIN)) { + if (type.equals(SchemaElementType.MODEL)) { elementOptionMap.put(type, QueryMatchOption.optional()); } else { elementOptionMap.put(type, QueryMatchOption.unused()); 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 5a105b436..ee445776a 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 @@ -1,10 +1,15 @@ - package com.tencent.supersonic.chat.query.rule; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticLayer; import com.tencent.supersonic.chat.api.component.SemanticQuery; -import com.tencent.supersonic.chat.api.pojo.*; +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.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; @@ -13,19 +18,21 @@ import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.chat.service.SemanticService; import com.tencent.supersonic.chat.utils.ComponentFactory; import com.tencent.supersonic.chat.utils.QueryReqBuilder; -import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.pojo.QueryColumn; +import com.tencent.supersonic.common.util.ContextUtils; 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.request.QueryMultiStructReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import lombok.ToString; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.util.Strings; - -import java.io.Serializable; -import java.util.*; @Slf4j @ToString @@ -40,35 +47,57 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { } public List match(List candidateElementMatches, - QueryContext queryCtx) { + QueryContext queryCtx) { return queryMatcher.match(candidateElementMatches); } - public void fillParseInfo(Long domainId, ChatContext chatContext) { + public void fillParseInfo(Long modelId, QueryContext queryContext, ChatContext chatContext) { parseInfo.setQueryMode(getQueryMode()); SemanticService schemaService = ContextUtils.getBean(SemanticService.class); - DomainSchema domainSchema = schemaService.getDomainSchema(domainId); + ModelSchema ModelSchema = schemaService.getModelSchema(modelId); - fillSchemaElement(parseInfo, domainSchema); - // inherit date info from context - if (parseInfo.getDateInfo() == null && chatContext.getParseInfo().getDateInfo() != null - && isSameQueryMode(getQueryMode(), chatContext.getParseInfo().getQueryMode())) { - log.info("inherit date info from context"); - parseInfo.setDateInfo(chatContext.getParseInfo().getDateInfo()); + fillSchemaElement(parseInfo, ModelSchema); + fillScore(parseInfo); + fillDateConf(parseInfo, chatContext.getParseInfo()); + } + + private void fillDateConf(SemanticParseInfo queryParseInfo, SemanticParseInfo chatParseInfo) { + if (queryParseInfo.getDateInfo() != null || chatParseInfo.getDateInfo() == null) { + return; + } + + if ((QueryManager.isEntityQuery(queryParseInfo.getQueryMode()) + && QueryManager.isEntityQuery(chatParseInfo.getQueryMode())) + || (QueryManager.isMetricQuery(queryParseInfo.getQueryMode()) + && QueryManager.isMetricQuery(chatParseInfo.getQueryMode()))) { + // inherit date info from context + queryParseInfo.setDateInfo(chatParseInfo.getDateInfo()); + queryParseInfo.getDateInfo().setInherited(true); } } - public boolean isSameQueryMode(String queryModeQuery, String queryModeChat) { - if (Strings.isNotEmpty(queryModeQuery) && Strings.isNotEmpty(queryModeChat)) { - return QueryManager.isEntityQuery(queryModeQuery) && QueryManager.isEntityQuery(queryModeChat) - || QueryManager.isMetricQuery(queryModeQuery) && QueryManager.isMetricQuery(queryModeChat); + private void fillScore(SemanticParseInfo parseInfo) { + double totalScore = 0; + + Map maxSimilarityMatch = new HashMap<>(); + for (SchemaElementMatch match : parseInfo.getElementMatches()) { + SchemaElementType type = match.getElement().getType(); + if (!maxSimilarityMatch.containsKey(type) || + match.getSimilarity() > maxSimilarityMatch.get(type).getSimilarity()) { + maxSimilarityMatch.put(type, match); + } } - return true; + + for (SchemaElementMatch match : maxSimilarityMatch.values()) { + totalScore += match.getDetectWord().length() * match.getSimilarity(); + } + + parseInfo.setScore(parseInfo.getScore() + totalScore); } - private void fillSchemaElement(SemanticParseInfo parseInfo, DomainSchema domainSchema) { - parseInfo.setDomain(domainSchema.getDomain()); + private void fillSchemaElement(SemanticParseInfo parseInfo, ModelSchema ModelSchema) { + parseInfo.setModel(ModelSchema.getModel()); Map> dim2Values = new HashMap<>(); Map> id2Values = new HashMap<>(); @@ -77,7 +106,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { SchemaElement element = schemaMatch.getElement(); switch (element.getType()) { case ID: - SchemaElement entityElement = domainSchema.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); @@ -87,7 +116,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { } break; case VALUE: - SchemaElement dimElement = domainSchema.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); @@ -111,7 +140,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { if (!id2Values.isEmpty()) { for (Map.Entry> entry : id2Values.entrySet()) { - SchemaElement entity = domainSchema.getElement(SchemaElementType.ENTITY, entry.getKey()); + SchemaElement entity = ModelSchema.getElement(SchemaElementType.ENTITY, entry.getKey()); if (entry.getValue().size() == 1) { SchemaElementMatch schemaMatch = entry.getValue().get(0); @@ -122,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(domainSchema.getEntity()); + parseInfo.setEntity(ModelSchema.getEntity()); } else { QueryFilter dimensionFilter = new QueryFilter(); List vals = new ArrayList<>(); @@ -139,7 +168,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { if (!dim2Values.isEmpty()) { for (Map.Entry> entry : dim2Values.entrySet()) { - SchemaElement dimension = domainSchema.getElement(SchemaElementType.DIMENSION, entry.getKey()); + SchemaElement dimension = ModelSchema.getElement(SchemaElementType.DIMENSION, entry.getKey()); if (entry.getValue().size() == 1) { SchemaElementMatch schemaMatch = entry.getValue().get(0); @@ -150,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(domainSchema.getEntity()); + parseInfo.setEntity(ModelSchema.getEntity()); } else { QueryFilter dimensionFilter = new QueryFilter(); List vals = new ArrayList<>(); @@ -171,7 +200,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { public QueryResult execute(User user) { String queryMode = parseInfo.getQueryMode(); - if (parseInfo.getDomainId() < 0 || StringUtils.isEmpty(queryMode) + if (parseInfo.getModelId() < 0 || StringUtils.isEmpty(queryMode) || !QueryManager.containsRuleQuery(queryMode)) { // reach here some error may happen log.error("not find QueryMode"); @@ -195,7 +224,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { queryResult.setQueryMode(queryMode); queryResult.setQueryState(QueryState.SUCCESS); - // add domain info + // add Model info EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class) .getEntityInfo(parseInfo, user); queryResult.setEntityInfo(entityInfo); @@ -205,7 +234,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { public QueryResult multiStructExecute(User user) { String queryMode = parseInfo.getQueryMode(); - if (parseInfo.getDomainId() < 0 || StringUtils.isEmpty(queryMode) + if (parseInfo.getModelId() < 0 || StringUtils.isEmpty(queryMode) || !QueryManager.containsRuleQuery(queryMode)) { // reach here some error may happen log.error("not find QueryMode"); @@ -228,7 +257,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { queryResult.setQueryMode(queryMode); queryResult.setQueryState(QueryState.SUCCESS); - // add domain info + // add Model info EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class) .getEntityInfo(parseInfo, user); queryResult.setEntityInfo(entityInfo); @@ -246,8 +275,9 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { } public static List resolve(List candidateElementMatches, - QueryContext queryContext) { + QueryContext queryContext) { List matchedQueries = new ArrayList<>(); + for (RuleSemanticQuery semanticQuery : QueryManager.getRuleQueries()) { List matches = semanticQuery.match(candidateElementMatches, queryContext); @@ -261,6 +291,7 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { return matchedQueries; } + protected QueryStructReq convertQueryStruct() { return QueryReqBuilder.buildStructReq(parseInfo); } 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 e9c4b699d..83edfab1e 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 @@ -1,8 +1,9 @@ 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.RequireNumberType.AT_LEAST; +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 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 a7866eac6..31e1039fe 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,8 +1,9 @@ package com.tencent.supersonic.chat.query.rule.entity; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ID; +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.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 c5ddcee52..2ee4bf18f 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,7 +1,8 @@ package com.tencent.supersonic.chat.query.rule.entity; import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.DomainSchema; +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; @@ -11,7 +12,6 @@ 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; @@ -19,25 +19,26 @@ import java.util.Set; public abstract class EntityListQuery extends EntitySemanticQuery { @Override - public void fillParseInfo(Long domainId, ChatContext chatContext) { - super.fillParseInfo(domainId, chatContext); + public void fillParseInfo(Long modelId, QueryContext queryContext, ChatContext chatContext) { + super.fillParseInfo(modelId, queryContext, chatContext); this.addEntityDetailAndOrderByMetric(parseInfo); } private void addEntityDetailAndOrderByMetric(SemanticParseInfo parseInfo) { - Long domainId = parseInfo.getDomainId(); - if (Objects.nonNull(domainId) && domainId > 0L) { + Long modelId = parseInfo.getModelId(); + if (Objects.nonNull(modelId) && modelId > 0L) { ConfigService configService = ContextUtils.getBean(ConfigService.class); - ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(parseInfo.getDomainId()); + ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(parseInfo.getModelId()); SemanticService schemaService = ContextUtils.getBean(SemanticService.class); - DomainSchema domainSchema = schemaService.getDomainSchema(domainId); + ModelSchema ModelSchema = schemaService.getModelSchema(modelId); if (chaConfigRichDesc != null && chaConfigRichDesc.getChatDetailRichConfig() != null - && Objects.nonNull(domainSchema) && Objects.nonNull(domainSchema.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/entity/EntitySemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntitySemanticQuery.java index d5813aa6b..a931dda76 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntitySemanticQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/entity/EntitySemanticQuery.java @@ -1,5 +1,9 @@ package com.tencent.supersonic.chat.query.rule.entity; +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; + import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; @@ -11,17 +15,12 @@ import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; import com.tencent.supersonic.chat.service.ConfigService; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.util.ContextUtils; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.CollectionUtils; - import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.Objects; - -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.ENTITY; -import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; -import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.REQUIRED; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; @Slf4j public abstract class EntitySemanticQuery extends RuleSemanticQuery { @@ -35,7 +34,7 @@ public abstract class EntitySemanticQuery extends RuleSemanticQuery { @Override public List match(List candidateElementMatches, - QueryContext queryCtx) { + QueryContext queryCtx) { candidateElementMatches = filterElementMatches(candidateElementMatches); return super.match(candidateElementMatches, queryCtx); } @@ -43,13 +42,13 @@ public abstract class EntitySemanticQuery extends RuleSemanticQuery { private List filterElementMatches(List candidateElementMatches) { List filteredMatches = new ArrayList<>(); if (CollectionUtils.isEmpty(candidateElementMatches) - || Objects.isNull(candidateElementMatches.get(0).getElement().getDomain())) { + || Objects.isNull(candidateElementMatches.get(0).getElement().getModel())) { return candidateElementMatches; } - Long domainId = candidateElementMatches.get(0).getElement().getDomain(); + Long modelId = candidateElementMatches.get(0).getElement().getModel(); ConfigService configService = ContextUtils.getBean(ConfigService.class); - ChatConfigResp chatConfig = configService.fetchConfigByDomainId(domainId); + ChatConfigResp chatConfig = configService.fetchConfigByModelId(modelId); List blackDimIdList = new ArrayList<>(); List blackMetricIdList = new ArrayList<>(); @@ -78,14 +77,14 @@ public abstract class EntitySemanticQuery extends RuleSemanticQuery { } @Override - public void fillParseInfo(Long domainId, ChatContext chatContext) { - super.fillParseInfo(domainId, chatContext); + public void fillParseInfo(Long modelId, QueryContext queryContext, ChatContext chatContext) { + super.fillParseInfo(modelId, queryContext, chatContext); parseInfo.setNativeQuery(true); parseInfo.setLimit(ENTITY_MAX_RESULTS); if (parseInfo.getDateInfo() == null) { ConfigService configService = ContextUtils.getBean(ConfigService.class); - ChatConfigRichResp chatConfig = configService.getConfigRichInfo(parseInfo.getDomainId()); + ChatConfigRichResp chatConfig = configService.getConfigRichInfo(parseInfo.getModelId()); ChatDefaultRichConfigResp defaultConfig = chatConfig.getChatDetailRichConfig().getChatDefaultConfig(); int unit = 1; 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 3cd998ef4..db9697259 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,24 +1,23 @@ 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 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.query.rule.QueryMatchOption.OptionType.REQUIRED; -import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; @Slf4j @Component @@ -83,7 +82,8 @@ public class MetricEntityQuery extends MetricSemanticQuery { filters.forEach(d -> { if (!dimensions.contains(d.getBizName())) { dimensions.add(d.getBizName()); - }}); + } + }); queryStructReq.setGroups(dimensions); log.info("addDimension after [{}]", queryStructReq.getGroups()); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricFilterQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricFilterQuery.java index 213397c3e..eaefcbb1c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricFilterQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricFilterQuery.java @@ -79,7 +79,8 @@ public class MetricFilterQuery extends MetricSemanticQuery { filters.forEach(d -> { if (!dimensions.contains(d.getBizName())) { dimensions.add(d.getBizName()); - }}); + } + }); queryStructReq.setGroups(dimensions); log.info("addDimension after [{}]", queryStructReq.getGroups()); } 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 82571a6d1..23c987178 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,11 +1,12 @@ package com.tencent.supersonic.chat.query.rule.metric; -import org.springframework.stereotype.Component; - -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.*; +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.RequireNumberType.AT_LEAST; 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; @Component public class MetricGroupByQuery extends MetricSemanticQuery { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricDomainQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricModelQuery.java similarity index 77% rename from chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricDomainQuery.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricModelQuery.java index 4cf92ba8f..0f56420a1 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricDomainQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricModelQuery.java @@ -1,6 +1,6 @@ package com.tencent.supersonic.chat.query.rule.metric; -import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.DOMAIN; +import static com.tencent.supersonic.chat.api.pojo.SchemaElementType.MODEL; import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.OptionType.OPTIONAL; import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_MOST; @@ -9,13 +9,13 @@ import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import org.springframework.stereotype.Component; @Component -public class MetricDomainQuery extends MetricSemanticQuery { +public class MetricModelQuery extends MetricSemanticQuery { - public static final String QUERY_MODE = "METRIC_DOMAIN"; + public static final String QUERY_MODE = "METRIC_MODEL"; - public MetricDomainQuery() { + public MetricModelQuery() { super(); - queryMatcher.addOption(DOMAIN, OPTIONAL, AT_MOST, 1); + queryMatcher.addOption(MODEL, OPTIONAL, AT_MOST, 1); } @Override diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricSemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricSemanticQuery.java index dfcd8898d..30ecac5e6 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricSemanticQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricSemanticQuery.java @@ -40,7 +40,7 @@ public abstract class MetricSemanticQuery extends RuleSemanticQuery { @Override public List match(List candidateElementMatches, - QueryContext queryCtx) { + QueryContext queryCtx) { candidateElementMatches = filterElementMatches(candidateElementMatches); return super.match(candidateElementMatches, queryCtx); } @@ -48,13 +48,13 @@ public abstract class MetricSemanticQuery extends RuleSemanticQuery { private List filterElementMatches(List candidateElementMatches) { List filteredMatches = new ArrayList<>(); if (CollectionUtils.isEmpty(candidateElementMatches) - || Objects.isNull(candidateElementMatches.get(0).getElement().getDomain())) { + || Objects.isNull(candidateElementMatches.get(0).getElement().getModel())) { return candidateElementMatches; } - Long domainId = candidateElementMatches.get(0).getElement().getDomain(); + Long modelId = candidateElementMatches.get(0).getElement().getModel(); ConfigService configService = ContextUtils.getBean(ConfigService.class); - ChatConfigResp chatConfig = configService.fetchConfigByDomainId(domainId); + ChatConfigResp chatConfig = configService.fetchConfigByModelId(modelId); List blackDimIdList = new ArrayList<>(); List blackMetricIdList = new ArrayList<>(); @@ -83,13 +83,13 @@ public abstract class MetricSemanticQuery extends RuleSemanticQuery { } @Override - public void fillParseInfo(Long domainId, ChatContext chatContext) { - super.fillParseInfo(domainId, chatContext); + public void fillParseInfo(Long modelId, QueryContext queryContext, ChatContext chatContext) { + super.fillParseInfo(modelId, queryContext, chatContext); parseInfo.setLimit(METRIC_MAX_RESULTS); if (parseInfo.getDateInfo() == null) { ConfigService configService = ContextUtils.getBean(ConfigService.class); - ChatConfigRichResp chatConfig = configService.getConfigRichInfo(parseInfo.getDomainId()); + ChatConfigRichResp chatConfig = configService.getConfigRichInfo(parseInfo.getModelId()); ChatDefaultRichConfigResp defaultConfig = chatConfig.getChatAggRichConfig().getChatDefaultConfig(); DateConf dateInfo = new DateConf(); int unit = 1; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricTopNQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricTopNQuery.java index 01861694b..2c19b89e0 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricTopNQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/metric/MetricTopNQuery.java @@ -3,8 +3,8 @@ package com.tencent.supersonic.chat.query.rule.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.query.rule.QueryMatchOption.OptionType.OPTIONAL; -import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNumberType.AT_LEAST; 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.common.pojo.Constants.DESC_UPPER; import com.tencent.supersonic.chat.api.pojo.ChatContext; @@ -13,12 +13,11 @@ import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.common.pojo.Order; import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; -import org.springframework.stereotype.Component; - import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.springframework.stereotype.Component; @Component public class MetricTopNQuery extends MetricSemanticQuery { @@ -36,7 +35,7 @@ public class MetricTopNQuery extends MetricSemanticQuery { @Override public List match(List candidateElementMatches, - QueryContext queryCtx) { + QueryContext queryCtx) { Matcher matcher = INTENT_PATTERN.matcher(queryCtx.getRequest().getQueryText()); if (matcher.matches()) { return super.match(candidateElementMatches, queryCtx); @@ -50,11 +49,11 @@ public class MetricTopNQuery extends MetricSemanticQuery { } @Override - public void fillParseInfo(Long domainId, ChatContext chatContext){ - super.fillParseInfo(domainId, chatContext); + public void fillParseInfo(Long modelId, QueryContext queryContext, ChatContext chatContext) { + super.fillParseInfo(modelId, queryContext, chatContext); parseInfo.setLimit(ORDERBY_MAX_RESULTS); - parseInfo.setScore(2.0); + parseInfo.setScore(parseInfo.getScore() + 2.0); parseInfo.setAggType(AggregateTypeEnum.SUM); SchemaElement metric = parseInfo.getMetrics().iterator().next(); 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 029faeb26..b3da4bac9 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,18 +9,18 @@ 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; 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.chat.service.ConfigService; - +import com.tencent.supersonic.semantic.api.model.response.ModelResp; 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 +44,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 editDomainExtend(@RequestBody ChatConfigEditReqReq extendEditCmd, - HttpServletRequest request, - HttpServletResponse response) { + public Long editModelExtend(@RequestBody ChatConfigEditReqReq extendEditCmd, + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return configService.editConfig(extendEditCmd, user); } @@ -61,16 +61,16 @@ 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); } - @GetMapping("/richDesc/{domainId}") - public ChatConfigRichResp getDomainExtendRichInfo(@PathVariable("domainId") Long domainId) { - return configService.getConfigRichInfo(domainId); + @GetMapping("/richDesc/{modelId}") + public ChatConfigRichResp getModelExtendRichInfo(@PathVariable("modelId") Long modelId) { + return configService.getConfigRichInfo(modelId); } @GetMapping("/richDesc/all") @@ -78,34 +78,46 @@ public class ChatConfigController { return configService.getAllChatRichConfig(); } - - /** - * get domain list - * - * @param - */ - @GetMapping("/domainList") - public List getDomainList() { - - return semanticLayer.getDomainListForAdmin(); + @GetMapping("/modelList/{domainId}") + public List getModelList(@PathVariable("domainId") Long domainId, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + return semanticLayer.getModelList(AuthType.ADMIN, domainId, user); } - @GetMapping("/domainList/view") - public List getDomainListForViewer() { - return semanticLayer.getDomainListForViewer(); + @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) { + User user = UserHolder.findUser(request, response); + return semanticLayer.getModelList(AuthType.ADMIN, null, user); + } + + @GetMapping("/modelList/view") + public List getModelListVisible(HttpServletRequest request, + 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 18f5875f5..44712a0c0 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,9 @@ 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.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.api.pojo.response.QueryResp; +import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; import com.tencent.supersonic.chat.service.ChatService; import java.util.List; import javax.servlet.http.HttpServletRequest; @@ -69,9 +69,9 @@ 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); } 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 976f60f1d..4aaadce89 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.QueryReq; import com.tencent.supersonic.chat.api.pojo.request.QueryDataReq; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; 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,7 +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); @@ -61,13 +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/DictionaryController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/DictionaryController.java index 09fb97995..51a0dbbb5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/DictionaryController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/DictionaryController.java @@ -10,7 +10,6 @@ import com.tencent.supersonic.knowledge.dictionary.DimValueDictInfo; 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.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; 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 94ee18ade..0202c7f98 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,10 +5,16 @@ 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 org.springframework.web.bind.annotation.*; +import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.util.List; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/chat/plugin") @@ -22,8 +28,8 @@ public class PluginController { @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; @@ -31,8 +37,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; @@ -50,8 +56,11 @@ public class PluginController { } @PostMapping("/query") - List query(@RequestBody PluginQueryReq pluginQueryReq) { - return pluginService.queryWithAuthCheck(pluginQueryReq); + List query(@RequestBody PluginQueryReq pluginQueryReq, + 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 ea58046fb..8a81b072e 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,14 +5,15 @@ 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.*; - -import java.util.List; +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; /** * recommend controller @@ -24,32 +25,33 @@ public class RecommendController { @Autowired private RecommendService recommendService; - @GetMapping("recommend/{domainId}") - public RecommendResp recommend(@PathVariable("domainId") Long domainId, - @RequestParam(value = "limit", required = false) Long limit, - HttpServletRequest request, - HttpServletResponse response) { + @GetMapping("recommend/{modelId}") + public RecommendResp recommend(@PathVariable("modelId") Long modelId, + @RequestParam(value = "limit", required = false) Long limit, + HttpServletRequest request, + HttpServletResponse response) { QueryReq queryCtx = new QueryReq(); queryCtx.setUser(UserHolder.findUser(request, response)); - queryCtx.setDomainId(domainId); + queryCtx.setModelId(modelId); return recommendService.recommend(queryCtx, limit); } - @GetMapping("recommend/metric/{domainId}") - public RecommendResp recommendMetricMode(@PathVariable("domainId") Long domainId, - @RequestParam(value = "limit", required = false) Long limit, - HttpServletRequest request, - HttpServletResponse response) { + @GetMapping("recommend/metric/{modelId}") + public RecommendResp recommendMetricMode(@PathVariable("modelId") Long modelId, + @RequestParam(value = "limit", required = false) Long limit, + HttpServletRequest request, + HttpServletResponse response) { QueryReq queryCtx = new QueryReq(); queryCtx.setUser(UserHolder.findUser(request, response)); - queryCtx.setDomainId(domainId); + queryCtx.setModelId(modelId); return recommendService.recommendMetricMode(queryCtx, limit); } @GetMapping("recommend/question") - public List recommendQuestion(@RequestParam(value = "domainId", required = false) Long domainId, - HttpServletRequest request, - HttpServletResponse response) { - return recommendService.recommendQuestion(domainId); + public List recommendQuestion( + @RequestParam(value = "modelId", required = false) Long modelId, + HttpServletRequest request, + HttpServletResponse response) { + return recommendService.recommendQuestion(modelId); } } 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 d7dc78917..56ba6c806 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,23 +3,21 @@ 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.QueryContext; -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.response.QueryResult; import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; 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 { /*** - * get the domain from context + * get the model from context * @param chatId * @return */ - public Long getContextDomain(Integer chatId); + public Long getContextModel(Integer chatId); public ChatContext getOrCreateContext(int chatId); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/ConfigService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/ConfigService.java index 0b1aa8b8f..e259f386a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/ConfigService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/ConfigService.java @@ -7,7 +7,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 java.util.List; public interface ConfigService { @@ -18,9 +17,9 @@ public interface ConfigService { List search(ChatConfigFilter filter, User user); - ChatConfigRichResp getConfigRichInfo(Long domainId); + ChatConfigRichResp getConfigRichInfo(Long modelId); - ChatConfigResp fetchConfigByDomainId(Long domainId); + ChatConfigResp fetchConfigByModelId(Long modelId); List getAllChatRichConfig(); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/DictionaryService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/DictionaryService.java index 5ef1adec9..c2895a088 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/DictionaryService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/DictionaryService.java @@ -5,17 +5,17 @@ import com.tencent.supersonic.knowledge.dictionary.DictConfig; import com.tencent.supersonic.knowledge.dictionary.DictTaskFilter; import com.tencent.supersonic.knowledge.dictionary.DimValue2DictCommand; import com.tencent.supersonic.knowledge.dictionary.DimValueDictInfo; - import java.util.List; public interface DictionaryService { + Long addDictTask(DimValue2DictCommand dimValue2DictCommend, User user); Long deleteDictTask(DimValue2DictCommand dimValue2DictCommend, User user); List searchDictTaskList(DictTaskFilter filter, User user); - DictConfig getDictInfoByDomainId(Long domainId); + DictConfig getDictInfoByModelId(Long modelId); String getDictRootPath(); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/PluginService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/PluginService.java index 3d749e335..dedb6883f 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/PluginService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/PluginService.java @@ -2,9 +2,8 @@ package com.tencent.supersonic.chat.service; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.plugin.Plugin; import com.tencent.supersonic.chat.api.pojo.request.PluginQueryReq; - +import com.tencent.supersonic.chat.plugin.Plugin; import java.util.List; import java.util.Optional; @@ -24,5 +23,5 @@ public interface PluginService { Optional getPluginByName(String name); - List queryWithAuthCheck(PluginQueryReq pluginQueryReq); + List queryWithAuthCheck(PluginQueryReq pluginQueryReq, User user); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/QueryService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/QueryService.java index be45d6816..0bfdfee4e 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/QueryService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/QueryService.java @@ -3,10 +3,10 @@ package com.tencent.supersonic.chat.service; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.request.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.response.ParseResp; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; -import com.tencent.supersonic.chat.api.pojo.request.QueryDataReq; import org.apache.calcite.sql.parser.SqlParseException; /*** diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/RecommendService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/RecommendService.java index ce85f7da2..fd83b6b92 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/RecommendService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/RecommendService.java @@ -4,7 +4,6 @@ package com.tencent.supersonic.chat.service; 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 java.util.List; /*** @@ -16,5 +15,5 @@ public interface RecommendService { RecommendResp recommendMetricMode(QueryReq queryCtx, Long limit); - List recommendQuestion(Long domainId); + List recommendQuestion(Long modelId); } 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 d9a43b71f..af1a43bd4 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 @@ -13,7 +13,7 @@ import static com.tencent.supersonic.common.pojo.Constants.WEEK; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.request.ChatAggConfigReq; @@ -26,9 +26,9 @@ 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.DataInfo; -import com.tencent.supersonic.chat.api.pojo.response.DomainInfo; import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; import com.tencent.supersonic.chat.api.pojo.response.MetricInfo; +import com.tencent.supersonic.chat.api.pojo.response.ModelInfo; import com.tencent.supersonic.chat.config.AggregatorConfig; import com.tencent.supersonic.chat.utils.ComponentFactory; import com.tencent.supersonic.chat.utils.QueryReqBuilder; @@ -62,6 +62,7 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -79,47 +80,47 @@ public class SemanticService { private SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - public DomainSchema getDomainSchema(Long id) { - DomainSchema domainSchema = schemaService.getDomainSchema(id); - if (!Objects.isNull(domainSchema) && !Objects.isNull(domainSchema.getDomain())) { + public ModelSchema getModelSchema(Long id) { + ModelSchema ModelSchema = schemaService.getModelSchema(id); + if (!Objects.isNull(ModelSchema) && !Objects.isNull(ModelSchema.getModel())) { ChatConfigResp chaConfigInfo = - configService.fetchConfigByDomainId(domainSchema.getDomain().getId()); + configService.fetchConfigByModelId(ModelSchema.getModel().getId()); // filter dimensions in blacklist - filterBlackDim(domainSchema, chaConfigInfo); + filterBlackDim(ModelSchema, chaConfigInfo); // filter metrics in blacklist - filterBlackMetric(domainSchema, chaConfigInfo); + filterBlackMetric(ModelSchema, chaConfigInfo); } - return domainSchema; + return ModelSchema; } public EntityInfo getEntityInfo(SemanticParseInfo parseInfo, User user) { - if (parseInfo != null && parseInfo.getDomainId() > 0) { - EntityInfo entityInfo = getEntityInfo(parseInfo.getDomainId()); + if (parseInfo != null && parseInfo.getModelId() > 0) { + EntityInfo entityInfo = getEntityInfo(parseInfo.getModelId()); if (parseInfo.getDimensionFilters().size() <= 0) { entityInfo.setMetrics(null); entityInfo.setDimensions(null); return entityInfo; } - if (entityInfo.getDomainInfo() != null && entityInfo.getDomainInfo().getPrimaryEntityBizName() != null) { - String domainInfoPrimaryName = entityInfo.getDomainInfo().getPrimaryEntityBizName(); - String domainInfoId = ""; + if (entityInfo.getModelInfo() != null && entityInfo.getModelInfo().getPrimaryEntityBizName() != null) { + String ModelInfoPrimaryName = entityInfo.getModelInfo().getPrimaryEntityBizName(); + String ModelInfoId = ""; for (QueryFilter chatFilter : parseInfo.getDimensionFilters()) { if (chatFilter != null && chatFilter.getBizName() != null && chatFilter.getBizName() - .equals(domainInfoPrimaryName)) { + .equals(ModelInfoPrimaryName)) { if (chatFilter.getOperator().equals(FilterOperatorEnum.EQUALS)) { - domainInfoId = chatFilter.getValue().toString(); + ModelInfoId = chatFilter.getValue().toString(); } } } - if (!"".equals(domainInfoId)) { + if (!"".equals(ModelInfoId)) { try { - setMainDomain(entityInfo, parseInfo.getDomainId(), - domainInfoId, user); + setMainModel(entityInfo, parseInfo.getModelId(), + ModelInfoId, user); return entityInfo; } catch (Exception e) { - log.error("setMaintDomain error {}", e); + log.error("setMaintModel error {}", e); } } } @@ -127,8 +128,8 @@ public class SemanticService { return null; } - public EntityInfo getEntityInfo(Long domain) { - ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(domain); + public EntityInfo getEntityInfo(Long Model) { + ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(Model); if (Objects.isNull(chaConfigRichDesc) || Objects.isNull(chaConfigRichDesc.getChatDetailRichConfig())) { return new EntityInfo(); } @@ -138,23 +139,23 @@ public class SemanticService { private EntityInfo getEntityInfo(ChatConfigRichResp chaConfigRichDesc) { EntityInfo entityInfo = new EntityInfo(); - Long domainId = chaConfigRichDesc.getDomainId(); - if (Objects.nonNull(chaConfigRichDesc) && Objects.nonNull(domainId)) { + Long modelId = chaConfigRichDesc.getModelId(); + if (Objects.nonNull(chaConfigRichDesc) && Objects.nonNull(modelId)) { SemanticService schemaService = ContextUtils.getBean(SemanticService.class); - DomainSchema domainSchema = schemaService.getDomainSchema(domainId); - if (Objects.isNull(domainSchema) || Objects.isNull(domainSchema.getEntity())) { + ModelSchema ModelSchema = schemaService.getModelSchema(modelId); + if (Objects.isNull(ModelSchema) || Objects.isNull(ModelSchema.getEntity())) { return entityInfo; } - DomainInfo domainInfo = new DomainInfo(); - domainInfo.setItemId(domainId.intValue()); - domainInfo.setName(domainSchema.getDomain().getName()); - domainInfo.setWords(domainSchema.getDomain().getAlias()); - domainInfo.setBizName(domainSchema.getDomain().getBizName()); - if (Objects.nonNull(domainSchema.getEntity())) { - domainInfo.setPrimaryEntityBizName(domainSchema.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.setDomainInfo(domainInfo); + entityInfo.setModelInfo(ModelInfo); List dimensions = new ArrayList<>(); List metrics = new ArrayList<>(); @@ -188,19 +189,19 @@ public class SemanticService { return entityInfo; } - public void setMainDomain(EntityInfo domainInfo, Long domain, String entity, User user) { - DomainSchema domainSchema = schemaService.getDomainSchema(domain); + public void setMainModel(EntityInfo ModelInfo, Long Model, String entity, User user) { + ModelSchema ModelSchema = schemaService.getModelSchema(Model); - domainInfo.setEntityId(entity); + ModelInfo.setEntityId(entity); SemanticParseInfo semanticParseInfo = new SemanticParseInfo(); - semanticParseInfo.setDomain(domainSchema.getDomain()); + semanticParseInfo.setModel(ModelSchema.getModel()); semanticParseInfo.setNativeQuery(true); - semanticParseInfo.setMetrics(getMetrics(domainInfo)); - semanticParseInfo.setDimensions(getDimensions(domainInfo)); + semanticParseInfo.setMetrics(getMetrics(ModelInfo)); + semanticParseInfo.setDimensions(getDimensions(ModelInfo)); DateConf dateInfo = new DateConf(); int unit = 1; ChatConfigResp chatConfigInfo = - configService.fetchConfigByDomainId(domainSchema.getDomain().getId()); + configService.fetchConfigByModelId(ModelSchema.getModel().getId()); if (Objects.nonNull(chatConfigInfo) && Objects.nonNull(chatConfigInfo.getChatDetailConfig()) && Objects.nonNull(chatConfigInfo.getChatDetailConfig().getChatDefaultConfig())) { ChatDefaultConfigReq chatDefaultConfig = chatConfigInfo.getChatDetailConfig().getChatDefaultConfig(); @@ -219,7 +220,7 @@ public class SemanticService { QueryFilter chatFilter = new QueryFilter(); chatFilter.setValue(String.valueOf(entity)); chatFilter.setOperator(FilterOperatorEnum.EQUALS); - chatFilter.setBizName(getEntityPrimaryName(domainInfo)); + chatFilter.setBizName(getEntityPrimaryName(ModelInfo)); Set chatFilters = new LinkedHashSet(); chatFilters.add(chatFilter); semanticParseInfo.setDimensionFilters(chatFilters); @@ -229,7 +230,7 @@ public class SemanticService { queryResultWithColumns = semanticLayer.queryByStruct(QueryReqBuilder.buildStructReq(semanticParseInfo), user); } catch (Exception e) { - log.warn("setMainDomain queryByStruct error, e:", e); + log.warn("setMainModel queryByStruct error, e:", e); } if (queryResultWithColumns != null) { @@ -241,18 +242,18 @@ public class SemanticService { if (entry.getValue() == null || entryKey == null) { continue; } - domainInfo.getDimensions().stream().filter(i -> entryKey.equals(i.getBizName())) + ModelInfo.getDimensions().stream().filter(i -> entryKey.equals(i.getBizName())) .forEach(i -> i.setValue(entry.getValue().toString())); - domainInfo.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 domainInfo) { + private Set getDimensions(EntityInfo ModelInfo) { Set dimensions = new LinkedHashSet(); - for (DataInfo mainEntityDimension : domainInfo.getDimensions()) { + for (DataInfo mainEntityDimension : ModelInfo.getDimensions()) { SchemaElement dimension = new SchemaElement(); dimension.setBizName(mainEntityDimension.getBizName()); dimensions.add(dimension); @@ -269,41 +270,41 @@ public class SemanticService { return entryKey; } - private Set getMetrics(EntityInfo domainInfo) { + private Set getMetrics(EntityInfo ModelInfo) { Set metrics = new LinkedHashSet(); - for (DataInfo metricValue : domainInfo.getMetrics()) { + for (DataInfo metricValue : ModelInfo.getMetrics()) { SchemaElement metric = new SchemaElement(); - metric.setBizName(metricValue.getBizName()); + BeanUtils.copyProperties(metricValue, metric); metrics.add(metric); } return metrics; } - private String getEntityPrimaryName(EntityInfo domainInfo) { - return domainInfo.getDomainInfo().getPrimaryEntityBizName(); + private String getEntityPrimaryName(EntityInfo ModelInfo) { + return ModelInfo.getModelInfo().getPrimaryEntityBizName(); } - private void filterBlackMetric(DomainSchema domainSchema, 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(domainSchema.getMetrics())) { - Set metric4Chat = domainSchema.getMetrics().stream() + && !CollectionUtils.isEmpty(ModelSchema.getMetrics())) { + Set metric4Chat = ModelSchema.getMetrics().stream() .filter(metric -> !visibility.getBlackMetricIdList().contains(metric.getId())) .collect(Collectors.toSet()); - domainSchema.setMetrics(metric4Chat); + ModelSchema.setMetrics(metric4Chat); } } - private void filterBlackDim(DomainSchema domainSchema, 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(domainSchema.getDimensions())) { - Set dim4Chat = domainSchema.getDimensions().stream() + && !CollectionUtils.isEmpty(ModelSchema.getDimensions())) { + Set dim4Chat = ModelSchema.getDimensions().stream() .filter(dim -> !visibility.getBlackDimIdList().contains(dim.getId())) .collect(Collectors.toSet()); - domainSchema.setDimensions(dim4Chat); + ModelSchema.setDimensions(dim4Chat); } } @@ -331,7 +332,7 @@ public class SemanticService { } public AggregateInfo getAggregateInfo(User user, SemanticParseInfo semanticParseInfo, - QueryResultWithSchemaResp result) { + QueryResultWithSchemaResp result) { if (CollectionUtils.isEmpty(semanticParseInfo.getMetrics()) || !aggregatorConfig.getEnableRatio()) { return new AggregateInfo(); } @@ -383,7 +384,7 @@ public class SemanticService { } private MetricInfo queryRatio(User user, SemanticParseInfo semanticParseInfo, SchemaElement metric, - AggOperatorEnum aggOperatorEnum, QueryResultWithSchemaResp results) { + AggOperatorEnum aggOperatorEnum, QueryResultWithSchemaResp results) { MetricInfo metricInfo = new MetricInfo(); metricInfo.setStatistics(new HashMap<>()); QueryStructReq queryStructReq = QueryReqBuilder.buildStructRatioReq(semanticParseInfo, metric, aggOperatorEnum); @@ -431,7 +432,7 @@ public class SemanticService { } private DateConf getRatioDateConf(AggOperatorEnum aggOperatorEnum, SemanticParseInfo semanticParseInfo, - QueryResultWithSchemaResp results) { + QueryResultWithSchemaResp results) { String dateField = QueryReqBuilder.getDateField(semanticParseInfo.getDateInfo()); Optional lastDayOp = results.getResultList().stream() .map(r -> r.get(dateField).toString()) 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 21077ab10..1919069e6 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 @@ -3,23 +3,20 @@ package com.tencent.supersonic.chat.service.impl; 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.QueryContext; 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.response.QueryResult; import com.tencent.supersonic.chat.persistence.dataobject.ChatDO; 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.Objects; - -import com.tencent.supersonic.chat.service.ChatService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; @@ -41,7 +38,7 @@ public class ChatServiceImpl implements ChatService { } @Override - public Long getContextDomain(Integer chatId) { + public Long getContextModel(Integer chatId) { if (Objects.isNull(chatId)) { return null; } @@ -50,8 +47,8 @@ public class ChatServiceImpl implements ChatService { return null; } SemanticParseInfo originalSemanticParse = chatContext.getParseInfo(); - if (Objects.nonNull(originalSemanticParse) && Objects.nonNull(originalSemanticParse.getDomainId())) { - return originalSemanticParse.getDomainId(); + if (Objects.nonNull(originalSemanticParse) && Objects.nonNull(originalSemanticParse.getModelId())) { + return originalSemanticParse.getModelId(); } return null; } 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 3e652b64c..db284e4f6 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 @@ -3,26 +3,37 @@ package com.tencent.supersonic.chat.service.impl; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.SchemaElement; -import com.tencent.supersonic.chat.api.pojo.request.*; -import com.tencent.supersonic.chat.api.pojo.response.*; -import com.tencent.supersonic.chat.config.*; +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.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.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.ComponentFactory; -import com.tencent.supersonic.semantic.api.model.response.DomainResp; -import com.tencent.supersonic.chat.persistence.repository.ChatConfigRepository; import com.tencent.supersonic.chat.utils.ChatConfigHelper; +import com.tencent.supersonic.chat.utils.ComponentFactory; 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; @@ -43,24 +54,24 @@ public class ConfigServiceImpl implements ConfigService { public ConfigServiceImpl(ChatConfigRepository chatConfigRepository, - ChatConfigHelper chatConfigHelper) { + ChatConfigHelper chatConfigHelper) { this.chatConfigRepository = chatConfigRepository; this.chatConfigHelper = chatConfigHelper; } @Override public Long addConfig(ChatConfigBaseReq configBaseCmd, User user) { - log.info("[create domain extend] object:{}", JsonUtil.toString(configBaseCmd, true)); - duplicateCheck(configBaseCmd.getDomainId()); - permissionCheckLogic(configBaseCmd.getDomainId(), user.getName()); + log.info("[create model extend] object:{}", JsonUtil.toString(configBaseCmd, true)); + duplicateCheck(configBaseCmd.getModelId()); + permissionCheckLogic(configBaseCmd.getModelId(), user.getName()); ChatConfig chaConfig = chatConfigHelper.newChatConfig(configBaseCmd, user); Long id = chatConfigRepository.createConfig(chaConfig); return id; } - private void duplicateCheck(Long domainId) { + private void duplicateCheck(Long modelId) { ChatConfigFilter filter = new ChatConfigFilter(); - filter.setDomainId(domainId); + filter.setModelId(modelId); List chaConfigDescList = chatConfigRepository.getChatConfig(filter); if (!CollectionUtils.isEmpty(chaConfigDescList)) { throw new RuntimeException("chat config existed, no need to add repeatedly"); @@ -70,12 +81,12 @@ public class ConfigServiceImpl implements ConfigService { @Override public Long editConfig(ChatConfigEditReqReq configEditCmd, User user) { - log.info("[edit domain extend] object:{}", JsonUtil.toString(configEditCmd, true)); + log.info("[edit model extend] object:{}", JsonUtil.toString(configEditCmd, true)); if (Objects.isNull(configEditCmd) || Objects.isNull(configEditCmd.getId()) && Objects.isNull( - configEditCmd.getDomainId())) { - throw new RuntimeException("editConfig, id and domainId are not allowed to be empty at the same time"); + configEditCmd.getModelId())) { + throw new RuntimeException("editConfig, id and modelId are not allowed to be empty at the same time"); } - permissionCheckLogic(configEditCmd.getDomainId(), user.getName()); + permissionCheckLogic(configEditCmd.getModelId(), user.getName()); ChatConfig chaConfig = chatConfigHelper.editChatConfig(configEditCmd, user); chatConfigRepository.updateConfig(chaConfig); return configEditCmd.getId(); @@ -83,33 +94,33 @@ public class ConfigServiceImpl implements ConfigService { /** - * domain administrators have the right to modify related configuration information. + * model administrators have the right to modify related configuration information. */ - private Boolean permissionCheckLogic(Long domainId, String staffName) { + private Boolean permissionCheckLogic(Long modelId, String staffName) { // todo return true; } @Override public List search(ChatConfigFilter filter, User user) { - log.info("[search domain extend] object:{}", JsonUtil.toString(filter, true)); + log.info("[search model extend] object:{}", JsonUtil.toString(filter, true)); List chaConfigDescList = chatConfigRepository.getChatConfig(filter); return chaConfigDescList; } @Override - public ChatConfigResp fetchConfigByDomainId(Long domainId) { - return chatConfigRepository.getConfigByDomainId(domainId); + public ChatConfigResp fetchConfigByModelId(Long modelId) { + return chatConfigRepository.getConfigByModelId(modelId); } private ItemVisibilityInfo fetchVisibilityDescByConfig(ItemVisibility visibility, - DomainSchema domainSchema) { + ModelSchema modelSchema) { ItemVisibilityInfo itemVisibilityDesc = new ItemVisibilityInfo(); - List dimIdAllList = chatConfigHelper.generateAllDimIdList(domainSchema); - List metricIdAllList = chatConfigHelper.generateAllMetricIdList(domainSchema); + List dimIdAllList = chatConfigHelper.generateAllDimIdList(modelSchema); + List metricIdAllList = chatConfigHelper.generateAllMetricIdList(modelSchema); List blackDimIdList = new ArrayList<>(); List blackMetricIdList = new ArrayList<>(); @@ -131,91 +142,98 @@ public class ConfigServiceImpl implements ConfigService { itemVisibilityDesc.setBlackDimIdList(blackDimIdList); itemVisibilityDesc.setBlackMetricIdList(blackMetricIdList); itemVisibilityDesc.setWhiteDimIdList(Objects.isNull(whiteDimIdList) ? new ArrayList<>() : whiteDimIdList); - itemVisibilityDesc.setWhiteMetricIdList(Objects.isNull(whiteMetricIdList) ? new ArrayList<>() : whiteMetricIdList); + itemVisibilityDesc.setWhiteMetricIdList( + Objects.isNull(whiteMetricIdList) ? new ArrayList<>() : whiteMetricIdList); return itemVisibilityDesc; } @Override - public ChatConfigRichResp getConfigRichInfo(Long domainId) { + public ChatConfigRichResp getConfigRichInfo(Long modelId) { ChatConfigRichResp chatConfigRich = new ChatConfigRichResp(); - ChatConfigResp chatConfigResp = chatConfigRepository.getConfigByDomainId(domainId); + ChatConfigResp chatConfigResp = chatConfigRepository.getConfigByModelId(modelId); if (Objects.isNull(chatConfigResp)) { - log.info("there is no chatConfigDesc for domainId:{}", domainId); + log.info("there is no chatConfigDesc for modelId:{}", modelId); return chatConfigRich; } BeanUtils.copyProperties(chatConfigResp, chatConfigRich); - DomainSchema domainSchema = semanticService.getDomainSchema(domainId); - chatConfigRich.setBizName(domainSchema.getDomain().getBizName()); - chatConfigRich.setDomainName(domainSchema.getDomain().getName()); + ModelSchema modelSchema = semanticService.getModelSchema(modelId); + chatConfigRich.setBizName(modelSchema.getModel().getBizName()); + chatConfigRich.setModelName(modelSchema.getModel().getName()); - chatConfigRich.setChatAggRichConfig(fillChatAggRichConfig(domainSchema, chatConfigResp)); - chatConfigRich.setChatDetailRichConfig(fillChatDetailRichConfig(domainSchema, chatConfigRich, chatConfigResp)); + chatConfigRich.setChatAggRichConfig(fillChatAggRichConfig(modelSchema, chatConfigResp)); + chatConfigRich.setChatDetailRichConfig(fillChatDetailRichConfig(modelSchema, chatConfigRich, chatConfigResp)); return chatConfigRich; } - private ChatDetailRichConfigResp fillChatDetailRichConfig(DomainSchema domainSchema, ChatConfigRichResp chatConfigRich, ChatConfigResp chatConfigResp) { + private ChatDetailRichConfigResp fillChatDetailRichConfig(ModelSchema modelSchema, + 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(), domainSchema); + ItemVisibilityInfo itemVisibilityInfo = fetchVisibilityDescByConfig(chatDetailConfig.getVisibility(), + modelSchema); detailRichConfig.setVisibility(itemVisibilityInfo); - detailRichConfig.setKnowledgeInfos(fillKnowledgeBizName(chatDetailConfig.getKnowledgeInfos(), domainSchema)); + detailRichConfig.setKnowledgeInfos(fillKnowledgeBizName(chatDetailConfig.getKnowledgeInfos(), modelSchema)); detailRichConfig.setGlobalKnowledgeConfig(chatDetailConfig.getGlobalKnowledgeConfig()); - detailRichConfig.setChatDefaultConfig(fetchDefaultConfig(chatDetailConfig.getChatDefaultConfig(), domainSchema, itemVisibilityInfo)); + detailRichConfig.setChatDefaultConfig( + fetchDefaultConfig(chatDetailConfig.getChatDefaultConfig(), modelSchema, itemVisibilityInfo)); return detailRichConfig; } - private EntityRichInfoResp generateRichEntity(Entity entity, DomainSchema domainSchema) { + private EntityRichInfoResp generateRichEntity(Entity entity, ModelSchema modelSchema) { EntityRichInfoResp entityRichInfo = new EntityRichInfoResp(); if (Objects.isNull(entity) || Objects.isNull(entity.getEntityId())) { return entityRichInfo; } BeanUtils.copyProperties(entity, entityRichInfo); - Map dimIdAndRespPair = domainSchema.getDimensions().stream() + Map dimIdAndRespPair = modelSchema.getDimensions().stream() .collect(Collectors.toMap(SchemaElement::getId, Function.identity(), (k1, k2) -> k1)); entityRichInfo.setDimItem(dimIdAndRespPair.get(entity.getEntityId())); return entityRichInfo; } - private ChatAggRichConfigResp fillChatAggRichConfig(DomainSchema domainSchema, ChatConfigResp chatConfigResp) { + private ChatAggRichConfigResp fillChatAggRichConfig(ModelSchema modelSchema, ChatConfigResp chatConfigResp) { if (Objects.isNull(chatConfigResp) || Objects.isNull(chatConfigResp.getChatAggConfig())) { return null; } ChatAggConfigReq chatAggConfig = chatConfigResp.getChatAggConfig(); ChatAggRichConfigResp chatAggRichConfig = new ChatAggRichConfigResp(); - ItemVisibilityInfo itemVisibilityInfo = fetchVisibilityDescByConfig(chatAggConfig.getVisibility(), domainSchema); + ItemVisibilityInfo itemVisibilityInfo = fetchVisibilityDescByConfig(chatAggConfig.getVisibility(), modelSchema); chatAggRichConfig.setVisibility(itemVisibilityInfo); - chatAggRichConfig.setKnowledgeInfos(fillKnowledgeBizName(chatAggConfig.getKnowledgeInfos(), domainSchema)); + chatAggRichConfig.setKnowledgeInfos(fillKnowledgeBizName(chatAggConfig.getKnowledgeInfos(), modelSchema)); chatAggRichConfig.setGlobalKnowledgeConfig(chatAggConfig.getGlobalKnowledgeConfig()); - chatAggRichConfig.setChatDefaultConfig(fetchDefaultConfig(chatAggConfig.getChatDefaultConfig(), domainSchema, itemVisibilityInfo)); + chatAggRichConfig.setChatDefaultConfig( + fetchDefaultConfig(chatAggConfig.getChatDefaultConfig(), modelSchema, itemVisibilityInfo)); return chatAggRichConfig; } - private ChatDefaultRichConfigResp fetchDefaultConfig(ChatDefaultConfigReq chatDefaultConfig, DomainSchema domainSchema, ItemVisibilityInfo itemVisibilityInfo) { + private ChatDefaultRichConfigResp fetchDefaultConfig(ChatDefaultConfigReq chatDefaultConfig, + ModelSchema modelSchema, ItemVisibilityInfo itemVisibilityInfo) { ChatDefaultRichConfigResp defaultRichConfig = new ChatDefaultRichConfigResp(); if (Objects.isNull(chatDefaultConfig)) { return defaultRichConfig; } BeanUtils.copyProperties(chatDefaultConfig, defaultRichConfig); - Map dimIdAndRespPair = domainSchema.getDimensions().stream() + Map dimIdAndRespPair = modelSchema.getDimensions().stream() .collect(Collectors.toMap(SchemaElement::getId, Function.identity(), (k1, k2) -> k1)); - Map metricIdAndRespPair = domainSchema.getMetrics().stream() + Map metricIdAndRespPair = modelSchema.getMetrics().stream() .collect(Collectors.toMap(SchemaElement::getId, Function.identity(), (k1, k2) -> k1)); List dimensions = new ArrayList<>(); 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)) { @@ -229,7 +247,8 @@ public class ConfigServiceImpl implements ConfigService { if (!CollectionUtils.isEmpty(chatDefaultConfig.getMetricIds())) { chatDefaultConfig.getMetricIds().stream() - .filter(metricId -> metricIdAndRespPair.containsKey(metricId) && itemVisibilityInfo.getWhiteMetricIdList().contains(metricId)) + .filter(metricId -> metricIdAndRespPair.containsKey(metricId) + && itemVisibilityInfo.getWhiteMetricIdList().contains(metricId)) .forEach(metricId -> { SchemaElement metricSchemaResp = metricIdAndRespPair.get(metricId); if (Objects.nonNull(metricSchemaResp)) { @@ -247,12 +266,12 @@ public class ConfigServiceImpl implements ConfigService { private List fillKnowledgeBizName(List knowledgeInfos, - DomainSchema domainSchema) { + ModelSchema modelSchema) { if (CollectionUtils.isEmpty(knowledgeInfos)) { return new ArrayList<>(); } - Map dimIdAndRespPair = domainSchema.getDimensions().stream() - .collect(Collectors.toMap(SchemaElement::getId, Function.identity(),(k1, k2) -> k1)); + Map dimIdAndRespPair = modelSchema.getDimensions().stream() + .collect(Collectors.toMap(SchemaElement::getId, Function.identity(), (k1, k2) -> k1)); knowledgeInfos.stream().forEach(knowledgeInfo -> { if (Objects.nonNull(knowledgeInfo)) { SchemaElement dimSchemaResp = dimIdAndRespPair.get(knowledgeInfo.getItemId()); @@ -267,9 +286,9 @@ public class ConfigServiceImpl implements ConfigService { @Override public List getAllChatRichConfig() { List chatConfigRichInfoList = new ArrayList<>(); - List domainRespList = semanticLayer.getDomainListForAdmin(); - domainRespList.stream().forEach(domainResp -> { - ChatConfigRichResp chatConfigRichInfo = getConfigRichInfo(domainResp.getId()); + List modelSchemas = semanticLayer.getModelSchema(); + modelSchemas.stream().forEach(modelSchema -> { + ChatConfigRichResp chatConfigRichInfo = getConfigRichInfo(modelSchema.getModel().getId()); if (Objects.nonNull(chatConfigRichInfo)) { chatConfigRichInfoList.add(chatConfigRichInfo); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/DictionaryServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/DictionaryServiceImpl.java index 60fdf6f7c..d18463732 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/DictionaryServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/DictionaryServiceImpl.java @@ -9,15 +9,15 @@ import com.tencent.supersonic.chat.utils.DictMetaHelper; import com.tencent.supersonic.chat.utils.DictQueryHelper; import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; -import com.tencent.supersonic.knowledge.dictionary.FileHandler; -import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; -import com.tencent.supersonic.knowledge.utils.DictTaskConverter; import com.tencent.supersonic.knowledge.dictionary.DictConfig; import com.tencent.supersonic.knowledge.dictionary.DictTaskFilter; import com.tencent.supersonic.knowledge.dictionary.DictUpdateMode; import com.tencent.supersonic.knowledge.dictionary.DimValue2DictCommand; import com.tencent.supersonic.knowledge.dictionary.DimValueDictInfo; +import com.tencent.supersonic.knowledge.dictionary.FileHandler; +import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; import com.tencent.supersonic.knowledge.persistence.repository.DictRepository; +import com.tencent.supersonic.knowledge.utils.DictTaskConverter; import java.util.List; import java.util.Map; import java.util.Objects; @@ -41,9 +41,9 @@ public class DictionaryServiceImpl implements DictionaryService { private String dimValue = "DimValue_%d_%d"; public DictionaryServiceImpl(DictMetaHelper metaUtils, - DictQueryHelper dictQueryHelper, - FileHandler fileHandler, - DictRepository dictRepository) { + DictQueryHelper dictQueryHelper, + FileHandler fileHandler, + DictRepository dictRepository) { this.metaUtils = metaUtils; this.dictQueryHelper = dictQueryHelper; this.fileHandler = fileHandler; @@ -65,12 +65,12 @@ public class DictionaryServiceImpl implements DictionaryService { log.info("dimValueDOList:{}", dimValueDOList); //2. query dimension value information for (DimValueDO dimValueDO : dimValueDOList) { - Long domainId = dimValueDO.getDomainId(); + Long modelId = dimValueDO.getModelId(); DefaultMetric defaultMetricDesc = dimValueDO.getDefaultMetricDescList().get(0); for (Dim4Dict dim4Dict : dimValueDO.getDimensions()) { - List data = dictQueryHelper.fetchDimValueSingle(domainId, defaultMetricDesc, dim4Dict, user); + List data = dictQueryHelper.fetchDimValueSingle(modelId, defaultMetricDesc, dim4Dict, user); //3. local file changes - String fileName = String.format(dimValue + Constants.DOT + dictFileType, domainId, + String fileName = String.format(dimValue + Constants.DOT + dictFileType, modelId, dim4Dict.getDimId()); fileHandler.writeFile(data, fileName, false); } @@ -93,16 +93,16 @@ public class DictionaryServiceImpl implements DictionaryService { dimValue2DictCommend.getUpdateMode())) { throw new RuntimeException("illegal parameter"); } - Map> domainAndDimPair = dimValue2DictCommend.getDomainAndDimPair(); - if (CollectionUtils.isEmpty(domainAndDimPair)) { + Map> modelAndDimPair = dimValue2DictCommend.getModelAndDimPair(); + if (CollectionUtils.isEmpty(modelAndDimPair)) { return 0L; } - for (Long domainId : domainAndDimPair.keySet()) { - if (CollectionUtils.isEmpty(domainAndDimPair.get(domainId))) { + for (Long modelId : modelAndDimPair.keySet()) { + if (CollectionUtils.isEmpty(modelAndDimPair.get(modelId))) { continue; } - for (Long dimId : domainAndDimPair.get(domainId)) { - String fileName = String.format(dimValue + Constants.DOT + dictFileType, domainId, dimId); + for (Long dimId : modelAndDimPair.get(modelId)) { + String fileName = String.format(dimValue + Constants.DOT + dictFileType, modelId, dimId); fileHandler.deleteDictFile(fileName); } } @@ -118,7 +118,7 @@ public class DictionaryServiceImpl implements DictionaryService { return dictRepository.searchDictTaskList(filter); } - public DictConfig getDictInfoByDomainId(Long domainId) { - return dictRepository.getDictInfoByDomainId(domainId); + public DictConfig getDictInfoByModelId(Long modelId) { + return dictRepository.getDictInfoByModelId(modelId); } } 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 ae2223165..32ca44efb 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 @@ -3,20 +3,26 @@ package com.tencent.supersonic.chat.service.impl; import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.plugin.PluginParseConfig; -import com.tencent.supersonic.chat.plugin.Plugin; import com.tencent.supersonic.chat.api.pojo.request.PluginQueryReq; import com.tencent.supersonic.chat.persistence.dataobject.PluginDO; import com.tencent.supersonic.chat.persistence.dataobject.PluginDOExample; import com.tencent.supersonic.chat.persistence.repository.PluginRepository; -import com.tencent.supersonic.chat.parser.ParseMode; +import com.tencent.supersonic.chat.plugin.Plugin; +import com.tencent.supersonic.chat.plugin.PluginParseConfig; import com.tencent.supersonic.chat.plugin.event.PluginAddEvent; 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.semantic.api.model.response.DomainResp; +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; @@ -24,9 +30,6 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import java.util.*; -import java.util.stream.Collectors; - @Service @Slf4j public class PluginServiceImpl implements PluginService { @@ -36,22 +39,22 @@ public class PluginServiceImpl implements PluginService { private ApplicationEventPublisher publisher; public PluginServiceImpl(PluginRepository pluginRepository, - ApplicationEventPublisher publisher) { + ApplicationEventPublisher publisher) { this.pluginRepository = pluginRepository; this.publisher = publisher; } @Override - public synchronized void createPlugin(Plugin plugin, User user){ + public synchronized void createPlugin(Plugin plugin, User user) { PluginDO pluginDO = convert(plugin, user); pluginRepository.createPlugin(pluginDO); //compatible with H2 db List plugins = getPluginList(); - publisher.publishEvent(new PluginAddEvent(this, plugins.get(plugins.size()-1))); + publisher.publishEvent(new PluginAddEvent(this, plugins.get(plugins.size() - 1))); } @Override - public void updatePlugin(Plugin plugin, User user){ + public void updatePlugin(Plugin plugin, User user) { Long id = plugin.getId(); PluginDO pluginDO = pluginRepository.getPlugin(id); Plugin oldPlugin = convert(pluginDO); @@ -61,7 +64,7 @@ public class PluginServiceImpl implements PluginService { } @Override - public void deletePlugin(Long id){ + public void deletePlugin(Long id) { PluginDO pluginDO = pluginRepository.getPlugin(id); if (pluginDO != null) { pluginRepository.deletePlugin(id); @@ -74,7 +77,7 @@ public class PluginServiceImpl implements PluginService { public List getPluginList() { List plugins = Lists.newArrayList(); List pluginDOS = pluginRepository.getPlugins(); - if(CollectionUtils.isEmpty(pluginDOS)){ + if (CollectionUtils.isEmpty(pluginDOS)) { return plugins; } return pluginDOS.stream().map(this::convert).collect(Collectors.toList()); @@ -82,7 +85,7 @@ public class PluginServiceImpl implements PluginService { @Override public List fetchPluginDOs(String queryText, String type) { - List pluginDOS = pluginRepository.fetchPluginDOs(queryText,type); + List pluginDOS = pluginRepository.fetchPluginDOs(queryText, type); return convertList(pluginDOS); } @@ -94,8 +97,8 @@ public class PluginServiceImpl implements PluginService { if (StringUtils.isNotBlank(pluginQueryReq.getType())) { pluginDOExample.getOredCriteria().get(0).andTypeEqualTo(pluginQueryReq.getType()); } - if (StringUtils.isNotBlank(pluginQueryReq.getDomain())) { - pluginDOExample.getOredCriteria().get(0).andDomainLike('%' + pluginQueryReq.getDomain() + '%'); + if (StringUtils.isNotBlank(pluginQueryReq.getModel())) { + pluginDOExample.getOredCriteria().get(0).andModelLike('%' + pluginQueryReq.getModel() + '%'); } if (StringUtils.isNotBlank(pluginQueryReq.getParseMode())) { pluginDOExample.getOredCriteria().get(0).andParseModeEqualTo(pluginQueryReq.getParseMode()); @@ -112,8 +115,8 @@ 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); @@ -127,8 +130,12 @@ public class PluginServiceImpl implements PluginService { if (StringUtils.isBlank(plugin.getParseModeConfig())) { return false; } - PluginParseConfig functionCallConfig = JsonUtil.toObject(plugin.getParseModeConfig(), PluginParseConfig.class); - if (Objects.isNull(functionCallConfig)) { + PluginParseConfig functionCallConfig = JsonUtil.toObject(plugin.getParseModeConfig(), + PluginParseConfig.class); + if (Objects.isNull(functionCallConfig) || StringUtils.isEmpty(functionCallConfig.getName())) { + return false; + } + if (StringUtils.isBlank(functionCallConfig.getName())) { return false; } return functionCallConfig.getName().equalsIgnoreCase(name); @@ -137,20 +144,20 @@ public class PluginServiceImpl implements PluginService { } @Override - public List queryWithAuthCheck(PluginQueryReq pluginQueryReq) { - return authCheck(query(pluginQueryReq)); + public List queryWithAuthCheck(PluginQueryReq pluginQueryReq, User user) { + return authCheck(query(pluginQueryReq), user); } - private List authCheck(List plugins) { + private List authCheck(List plugins, User user) { SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - List domainIdAuthorized = semanticLayer.getDomainListForAdmin().stream() - .map(DomainResp::getId).collect(Collectors.toList()); + List modelIdAuthorized = semanticLayer.getModelList(AuthType.ADMIN, null, user).stream() + .map(ModelResp::getId).collect(Collectors.toList()); plugins = plugins.stream().filter(plugin -> { - if (CollectionUtils.isEmpty(plugin.getDomainList()) || plugin.isContainsAllDomain()) { + if (CollectionUtils.isEmpty(plugin.getModelList()) || plugin.isContainsAllModel()) { return true; } - for (Long domainId : plugin.getDomainList()) { - if (domainIdAuthorized.contains(domainId)) { + for (Long modelId : plugin.getModelList()) { + if (modelIdAuthorized.contains(modelId)) { return true; } } @@ -159,37 +166,37 @@ public class PluginServiceImpl implements PluginService { return plugins; } - public Plugin convert(PluginDO pluginDO){ + public Plugin convert(PluginDO pluginDO) { Plugin plugin = new Plugin(); - BeanUtils.copyProperties(pluginDO,plugin); - if (StringUtils.isNotBlank(pluginDO.getDomain())) { - plugin.setDomainList(Arrays.stream(pluginDO.getDomain().split(",")) + BeanUtils.copyProperties(pluginDO, plugin); + if (StringUtils.isNotBlank(pluginDO.getModel())) { + plugin.setModelList(Arrays.stream(pluginDO.getModel().split(",")) .map(Long::parseLong).collect(Collectors.toList())); } return plugin; } - public PluginDO convert(Plugin plugin, User user){ + public PluginDO convert(Plugin plugin, User user) { PluginDO pluginDO = new PluginDO(); - BeanUtils.copyProperties(plugin,pluginDO); + BeanUtils.copyProperties(plugin, pluginDO); pluginDO.setCreatedAt(new Date()); pluginDO.setCreatedBy(user.getName()); pluginDO.setUpdatedAt(new Date()); pluginDO.setUpdatedBy(user.getName()); - pluginDO.setDomain(StringUtils.join(plugin.getDomainList(), ",")); + pluginDO.setModel(StringUtils.join(plugin.getModelList(), ",")); return pluginDO; } - public PluginDO convert(Plugin plugin, PluginDO pluginDO, User user){ - BeanUtils.copyProperties(plugin,pluginDO); + public PluginDO convert(Plugin plugin, PluginDO pluginDO, User user) { + BeanUtils.copyProperties(plugin, pluginDO); pluginDO.setUpdatedAt(new Date()); pluginDO.setUpdatedBy(user.getName()); - pluginDO.setDomain(StringUtils.join(plugin.getDomainList(), ",")); + pluginDO.setModel(StringUtils.join(plugin.getModelList(), ",")); return pluginDO; } - public List convertList(List pluginDOS){ - if(!CollectionUtils.isEmpty(pluginDOS)){ + public List convertList(List pluginDOS) { + if (!CollectionUtils.isEmpty(pluginDOS)) { return pluginDOS.stream().map(this::convert).collect(Collectors.toList()); } return Lists.newArrayList(); 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 83df0ff3c..dc6c08d2a 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,27 +2,26 @@ 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.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.api.pojo.SemanticParseInfo; 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.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.query.QuerySelector; -import com.tencent.supersonic.chat.api.pojo.request.QueryDataReq; import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.chat.query.QuerySelector; import com.tencent.supersonic.chat.service.ChatService; import com.tencent.supersonic.chat.service.QueryService; import com.tencent.supersonic.chat.utils.ComponentFactory; - -import java.util.Arrays; +import com.tencent.supersonic.common.util.JsonUtil; import java.util.List; import java.util.stream.Collectors; - -import com.tencent.supersonic.common.util.JsonUtil; import lombok.extern.slf4j.Slf4j; import org.apache.calcite.sql.parser.SqlParseException; import org.springframework.beans.BeanUtils; @@ -69,9 +68,9 @@ public class QueryServiceImpl implements QueryService { Collectors.toList())); List selectedParses = selectedQueries.stream() - .map(q -> q.getParseInfo()).collect(Collectors.toList()); + .map(SemanticQuery::getParseInfo).collect(Collectors.toList()); List candidateParses = queryCtx.getCandidateQueries().stream() - .map(q -> q.getParseInfo()).collect(Collectors.toList()); + .map(SemanticQuery::getParseInfo).collect(Collectors.toList()); parseResult = ParseResp.builder() .chatId(queryReq.getChatId()) 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 7ba8cc18d..07eb880fd 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 @@ -1,24 +1,22 @@ package com.tencent.supersonic.chat.service.impl; -import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.SchemaElement; -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.request.QueryReq; 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; @@ -42,33 +40,33 @@ public class RecommendServiceImpl implements RecommendService { limit = Long.MAX_VALUE; } log.debug("limit:{}", limit); - Long domainId = queryCtx.getDomainId(); - if (Objects.isNull(domainId)) { + Long modelId = queryCtx.getModelId(); + if (Objects.isNull(modelId)) { return new RecommendResp(); } - DomainSchema domainSchema = semanticService.getDomainSchema(domainId); + ModelSchema modelSchema = semanticService.getModelSchema(modelId); - List dimensions = domainSchema.getDimensions().stream() + List dimensions = modelSchema.getDimensions().stream() .filter(dim -> Objects.nonNull(dim) && Objects.nonNull(dim.getUseCnt())) .sorted(Comparator.comparing(SchemaElement::getUseCnt).reversed()) .limit(limit) .map(dimSchemaDesc -> { SchemaElement item = new SchemaElement(); - item.setDomain(domainId); + item.setModel(modelId); item.setName(dimSchemaDesc.getName()); item.setBizName(dimSchemaDesc.getBizName()); item.setId(dimSchemaDesc.getId()); return item; }).collect(Collectors.toList()); - List metrics = domainSchema.getMetrics().stream() + List metrics = modelSchema.getMetrics().stream() .filter(metric -> Objects.nonNull(metric) && Objects.nonNull(metric.getUseCnt())) .sorted(Comparator.comparing(SchemaElement::getUseCnt).reversed()) .limit(limit) .map(metricSchemaDesc -> { SchemaElement item = new SchemaElement(); - item.setDomain(domainId); + item.setModel(modelId); item.setName(metricSchemaDesc.getName()); item.setBizName(metricSchemaDesc.getBizName()); item.setId(metricSchemaDesc.getId()); @@ -89,7 +87,7 @@ public class RecommendServiceImpl implements RecommendService { return recommendResponse; } - ChatConfigRichResp chatConfigRich = configService.getConfigRichInfo(Long.valueOf(queryCtx.getDomainId())); + ChatConfigRichResp chatConfigRich = configService.getConfigRichInfo(Long.valueOf(queryCtx.getModelId())); if (Objects.nonNull(chatConfigRich) && Objects.nonNull(chatConfigRich.getChatAggRichConfig()) && Objects.nonNull(chatConfigRich.getChatAggRichConfig().getVisibility())) { List blackMetricIdList = chatConfigRich.getChatAggRichConfig().getVisibility().getBlackMetricIdList(); @@ -105,15 +103,17 @@ public class RecommendServiceImpl implements RecommendService { } @Override - public List recommendQuestion(Long domainId) { + public List recommendQuestion(Long modelId) { List recommendQuestions = new ArrayList<>(); ChatConfigFilter chatConfigFilter = new ChatConfigFilter(); - chatConfigFilter.setDomainId(domainId); + chatConfigFilter.setModelId(modelId); 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.getDomainId(), 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 1fac983c3..c21baba7a 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 @@ -9,16 +9,16 @@ 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.DomainInfoStat; -import com.tencent.supersonic.chat.mapper.DomainWithSemanticType; import com.tencent.supersonic.chat.mapper.MatchText; +import com.tencent.supersonic.chat.mapper.ModelInfoStat; +import com.tencent.supersonic.chat.mapper.ModelWithSemanticType; import com.tencent.supersonic.chat.mapper.SearchMatchStrategy; 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.dictionary.DictWord; -import com.tencent.supersonic.knowledge.dictionary.MapResult; import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import com.tencent.supersonic.knowledge.dictionary.MapResult; import com.tencent.supersonic.knowledge.service.SchemaService; import com.tencent.supersonic.knowledge.utils.HanlpHelper; import java.util.ArrayList; @@ -60,12 +60,12 @@ public class SearchServiceImpl implements SearchService { // 1.get meta info SemanticSchema semanticSchemaDb = schemaService.getSemanticSchema(); List metricsDb = semanticSchemaDb.getMetrics(); - final Map domainToName = semanticSchemaDb.getDomainIdToName(); + final Map modelToName = semanticSchemaDb.getModelIdToName(); // 2.detect by segment List originals = HanlpHelper.getTerms(queryText); Map> regTextMap = searchMatchStrategy.match(queryText, originals, - queryCtx.getDomainId()); + queryCtx.getModelId()); regTextMap.entrySet().stream().forEach(m -> HanlpHelper.transLetterOriginal(m.getValue())); // 3.get the most matching data @@ -85,23 +85,23 @@ public class SearchServiceImpl implements SearchService { log.info("searchTextEntry:{},queryCtx:{}", searchTextEntry, queryCtx); Set searchResults = new LinkedHashSet(); - DomainInfoStat domainStat = NatureHelper.getDomainStat(originals); + ModelInfoStat modelStat = NatureHelper.getModelStat(originals); - List possibleDomains = getPossibleDomains(queryCtx, originals, domainStat, queryCtx.getDomainId()); + List possibleModels = getPossibleModels(queryCtx, originals, modelStat, queryCtx.getModelId()); // 4.1 priority dimension metric - boolean existMetricAndDimension = searchMetricAndDimension(new HashSet<>(possibleDomains), domainToName, + boolean existMetricAndDimension = searchMetricAndDimension(new HashSet<>(possibleModels), modelToName, searchTextEntry, searchResults); // 4.2 process based on dimension values MatchText matchText = searchTextEntry.getKey(); - Map natureToNameMap = getNatureToNameMap(searchTextEntry, new HashSet<>(possibleDomains)); - log.debug("possibleDomains:{},natureToNameMap:{}", possibleDomains, natureToNameMap); + Map natureToNameMap = getNatureToNameMap(searchTextEntry, new HashSet<>(possibleModels)); + log.debug("possibleModels:{},natureToNameMap:{}", possibleModels, natureToNameMap); for (Map.Entry natureToNameEntry : natureToNameMap.entrySet()) { - Set searchResultSet = searchDimensionValue(metricsDb, domainToName, - domainStat.getMetricDomainCount(), existMetricAndDimension, + Set searchResultSet = searchDimensionValue(metricsDb, modelToName, + modelStat.getMetricModelCount(), existMetricAndDimension, matchText, natureToNameMap, natureToNameEntry, queryCtx.getQueryFilters()); searchResults.addAll(searchResultSet); @@ -109,42 +109,42 @@ public class SearchServiceImpl implements SearchService { return searchResults.stream().limit(RESULT_SIZE).collect(Collectors.toList()); } - private List getPossibleDomains(QueryReq queryCtx, List originals, - DomainInfoStat domainStat, Long webDomainId) { + private List getPossibleModels(QueryReq queryCtx, List originals, + ModelInfoStat modelStat, Long webModelId) { - if (Objects.nonNull(webDomainId) && webDomainId > 0) { + if (Objects.nonNull(webModelId) && webModelId > 0) { List result = new ArrayList<>(); - result.add(webDomainId); + result.add(webModelId); return result; } - List possibleDomains = NatureHelper.selectPossibleDomains(originals); + List possibleModels = NatureHelper.selectPossibleModels(originals); - Long contextDomain = chatService.getContextDomain(queryCtx.getChatId()); + Long contextModel = chatService.getContextModel(queryCtx.getChatId()); - log.debug("possibleDomains:{},domainStat:{},contextDomain:{}", possibleDomains, domainStat, contextDomain); + log.debug("possibleModels:{},modelStat:{},contextModel:{}", possibleModels, modelStat, contextModel); - // If nothing is recognized or only metric are present, then add the contextDomain. - if (nothingOrOnlyMetric(domainStat) && effectiveDomain(contextDomain)) { + // If nothing is recognized or only metric are present, then add the contextModel. + if (nothingOrOnlyMetric(modelStat) && effectiveModel(contextModel)) { List result = new ArrayList<>(); - result.add(contextDomain); + result.add(contextModel); return result; } - return possibleDomains; + return possibleModels; } - private boolean nothingOrOnlyMetric(DomainInfoStat domainStat) { - return domainStat.getMetricDomainCount() >= 0 && domainStat.getDimensionDomainCount() <= 0 - && domainStat.getDimensionValueDomainCount() <= 0 && domainStat.getDomainCount() <= 0; + private boolean nothingOrOnlyMetric(ModelInfoStat modelStat) { + return modelStat.getMetricModelCount() >= 0 && modelStat.getDimensionModelCount() <= 0 + && modelStat.getDimensionValueModelCount() <= 0 && modelStat.getModelCount() <= 0; } - private boolean effectiveDomain(Long contextDomain) { - return Objects.nonNull(contextDomain) && contextDomain > 0; + private boolean effectiveModel(Long contextModel) { + return Objects.nonNull(contextModel) && contextModel > 0; } private Set searchDimensionValue(List metricsDb, - Map domainToName, - long metricDomainCount, + Map modelToName, + long metricModelCount, boolean existMetricAndDimension, MatchText matchText, Map natureToNameMap, @@ -155,7 +155,7 @@ public class SearchServiceImpl implements SearchService { String nature = natureToNameEntry.getKey(); String wordName = natureToNameEntry.getValue(); - Long domainId = NatureHelper.getDomainId(nature); + Long modelId = NatureHelper.getModelId(nature); SchemaElementType schemaElementType = NatureHelper.convertToElementType(nature); if (SchemaElementType.ENTITY.equals(schemaElementType)) { @@ -163,24 +163,24 @@ public class SearchServiceImpl implements SearchService { } // If there are no metric/dimension, complete the metric information SearchResult searchResult = SearchResult.builder() - .domainId(domainId) - .domainName(domainToName.get(domainId)) + .modelId(modelId) + .modelName(modelToName.get(modelId)) .recommend(matchText.getRegText() + wordName) .schemaElementType(schemaElementType) .subRecommend(wordName) .build(); - if (metricDomainCount <= 0 && !existMetricAndDimension) { + if (metricModelCount <= 0 && !existMetricAndDimension) { if (filterByQueryFilter(wordName, queryFilters)) { return searchResults; } searchResults.add(searchResult); int metricSize = getMetricSize(natureToNameMap); - List metrics = filerMetricsByDomain(metricsDb, domainId, metricSize); + List metrics = filerMetricsByModel(metricsDb, modelId, metricSize); for (String metric : metrics) { SearchResult result = SearchResult.builder() - .domainId(domainId) - .domainName(domainToName.get(domainId)) + .modelId(modelId) + .modelName(modelToName.get(modelId)) .recommend(matchText.getRegText() + wordName + DictWordType.SPACE + metric) .subRecommend(wordName + DictWordType.SPACE + metric) .isComplete(false) @@ -214,12 +214,12 @@ public class SearchServiceImpl implements SearchService { return true; } - protected List filerMetricsByDomain(List metricsDb, Long domain, int metricSize) { + protected List filerMetricsByModel(List metricsDb, Long model, int metricSize) { if (CollectionUtils.isEmpty(metricsDb)) { return Lists.newArrayList(); } return metricsDb.stream() - .filter(mapDO -> Objects.nonNull(mapDO) && domain.equals(mapDO.getDomain())) + .filter(mapDO -> Objects.nonNull(mapDO) && model.equals(mapDO.getModel())) .sorted(Comparator.comparing(SchemaElement::getUseCnt).reversed()) .flatMap(entry -> { List result = new ArrayList<>(); @@ -235,16 +235,16 @@ public class SearchServiceImpl implements SearchService { * @return */ private Map getNatureToNameMap(Map.Entry> recommendTextListEntry, - Set possibleDomains) { + Set possibleModels) { List recommendValues = recommendTextListEntry.getValue(); return recommendValues.stream() .flatMap(entry -> entry.getNatures().stream() .filter(nature -> { - if (CollectionUtils.isEmpty(possibleDomains)) { + if (CollectionUtils.isEmpty(possibleModels)) { return true; } - Long domain = NatureHelper.getDomainId(nature); - return possibleDomains.contains(domain); + Long model = NatureHelper.getModelId(nature); + return possibleModels.contains(model); }) .map(nature -> { DictWord posDO = new DictWord(); @@ -257,7 +257,7 @@ public class SearchServiceImpl implements SearchService { LinkedHashMap::new)); } - private boolean searchMetricAndDimension(Set possibleDomains, Map domainToName, + private boolean searchMetricAndDimension(Set possibleModels, Map modelToName, Map.Entry> searchTextEntry, Set searchResults) { boolean existMetric = false; @@ -266,22 +266,22 @@ public class SearchServiceImpl implements SearchService { for (MapResult mapResult : mapResults) { - List dimensionMetricClassIds = mapResult.getNatures().stream() - .map(nature -> new DomainWithSemanticType(NatureHelper.getDomainId(nature), + List dimensionMetricClassIds = mapResult.getNatures().stream() + .map(nature -> new ModelWithSemanticType(NatureHelper.getModelId(nature), NatureHelper.convertToElementType(nature))) - .filter(entry -> matchCondition(entry, possibleDomains)).collect(Collectors.toList()); + .filter(entry -> matchCondition(entry, possibleModels)).collect(Collectors.toList()); if (CollectionUtils.isEmpty(dimensionMetricClassIds)) { continue; } - for (DomainWithSemanticType domainWithSemanticType : dimensionMetricClassIds) { + for (ModelWithSemanticType modelWithSemanticType : dimensionMetricClassIds) { existMetric = true; - Long domainId = domainWithSemanticType.getDomain(); - SchemaElementType semanticType = domainWithSemanticType.getSemanticType(); + Long modelId = modelWithSemanticType.getModel(); + SchemaElementType semanticType = modelWithSemanticType.getSemanticType(); SearchResult searchResult = SearchResult.builder() - .domainId(domainId) - .domainName(domainToName.get(domainId)) + .modelId(modelId) + .modelName(modelToName.get(modelId)) .recommend(matchText.getRegText() + mapResult.getName()) .subRecommend(mapResult.getName()) .schemaElementType(semanticType) @@ -289,21 +289,21 @@ public class SearchServiceImpl implements SearchService { searchResults.add(searchResult); } - log.info("parseResult:{},dimensionMetricClassIds:{},possibleDomains:{}", mapResult, dimensionMetricClassIds, - possibleDomains); + log.info("parseResult:{},dimensionMetricClassIds:{},possibleModels:{}", mapResult, dimensionMetricClassIds, + possibleModels); } return existMetric; } - private boolean matchCondition(DomainWithSemanticType entry, Set possibleDomains) { + private boolean matchCondition(ModelWithSemanticType entry, Set possibleModels) { if (!(SchemaElementType.METRIC.equals(entry.getSemanticType()) || SchemaElementType.DIMENSION.equals( entry.getSemanticType()))) { return false; } - if (CollectionUtils.isEmpty(possibleDomains)) { + if (CollectionUtils.isEmpty(possibleModels)) { return true; } - return possibleDomains.contains(entry.getDomain()); + return possibleModels.contains(entry.getModel()); } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/CacheUtils.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/CacheUtils.java index c6bec3994..014e28341 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/CacheUtils.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/CacheUtils.java @@ -4,21 +4,23 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.QueryContext; - import java.util.concurrent.TimeUnit; public class CacheUtils { + private static final Cache cache = Caffeine.newBuilder() .expireAfterWrite(1200, TimeUnit.SECONDS) .expireAfterAccess(1200, TimeUnit.SECONDS) .maximumSize(1000) .build(); - public static void put(QueryContext queryContext, ChatContext chatCtx, Object v){ - String key=chatCtx.getUser()+"_"+chatCtx.getChatId()+"_"+ queryContext.getRequest().getQueryText(); - cache.put(key,v); + + public static void put(QueryContext queryContext, ChatContext chatCtx, Object v) { + String key = chatCtx.getUser() + "_" + chatCtx.getChatId() + "_" + queryContext.getRequest().getQueryText(); + cache.put(key, v); } - public static Object get(QueryContext queryContext, ChatContext chatCtx){ - String key=chatCtx.getUser()+"_"+chatCtx.getChatId()+"_"+ queryContext.getRequest().getQueryText(); + + public static Object get(QueryContext queryContext, ChatContext chatCtx) { + String key = chatCtx.getUser() + "_" + chatCtx.getChatId() + "_" + queryContext.getRequest().getQueryText(); return cache.getIfPresent(key); } } 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 e2a823f04..125279aef 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 @@ -3,22 +3,25 @@ package com.tencent.supersonic.chat.utils; 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.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.SchemaElement; -import com.tencent.supersonic.chat.api.pojo.request.*; +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.ChatDetailConfigReq; +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.*; +import com.tencent.supersonic.chat.config.ChatConfig; import com.tencent.supersonic.chat.persistence.dataobject.ChatConfigDO; -import com.tencent.supersonic.common.pojo.enums.StatusEnum; import com.tencent.supersonic.common.pojo.RecordInfo; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; 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; @@ -54,20 +57,20 @@ public class ChatConfigHelper { return chatConfig; } - public List generateAllDimIdList(DomainSchema domainSchema) { - if (Objects.isNull(domainSchema) || CollectionUtils.isEmpty(domainSchema.getDimensions())) { + public List generateAllDimIdList(ModelSchema modelSchema) { + if (Objects.isNull(modelSchema) || CollectionUtils.isEmpty(modelSchema.getDimensions())) { return new ArrayList<>(); } - Map> dimIdAndDescPair = domainSchema.getDimensions() + Map> dimIdAndDescPair = modelSchema.getDimensions() .stream().collect(Collectors.groupingBy(SchemaElement::getId)); return new ArrayList<>(dimIdAndDescPair.keySet()); } - public List generateAllMetricIdList(DomainSchema domainSchema) { - if (Objects.isNull(domainSchema) || CollectionUtils.isEmpty(domainSchema.getMetrics())) { + public List generateAllMetricIdList(ModelSchema modelSchema) { + if (Objects.isNull(modelSchema) || CollectionUtils.isEmpty(modelSchema.getMetrics())) { return new ArrayList<>(); } - Map> metricIdAndDescPair = domainSchema.getMetrics() + Map> metricIdAndDescPair = modelSchema.getMetrics() .stream().collect(Collectors.groupingBy(SchemaElement::getId)); return new ArrayList<>(metricIdAndDescPair.keySet()); } @@ -94,19 +97,22 @@ public class ChatConfigHelper { return chatConfigDO; } - public ChatConfigResp chatConfigDO2Descriptor(Long domainId, ChatConfigDO chatConfigDO) { + public ChatConfigResp chatConfigDO2Descriptor(Long modelId, ChatConfigDO chatConfigDO) { ChatConfigResp chatConfigDescriptor = new ChatConfigResp(); if (Objects.isNull(chatConfigDO)) { // deal empty chatConfigDO - return generateEmptyChatConfigResp(domainId); + return generateEmptyChatConfigResp(modelId); } BeanUtils.copyProperties(chatConfigDO, chatConfigDescriptor); - chatConfigDescriptor.setChatDetailConfig(JsonUtil.toObject(chatConfigDO.getChatDetailConfig(), ChatDetailConfigReq.class)); - chatConfigDescriptor.setChatAggConfig(JsonUtil.toObject(chatConfigDO.getChatAggConfig(), ChatAggConfigReq.class)); - chatConfigDescriptor.setRecommendedQuestions(JsonUtil.toList(chatConfigDO.getRecommendedQuestions(), RecommendedQuestionReq.class)); + chatConfigDescriptor.setChatDetailConfig( + JsonUtil.toObject(chatConfigDO.getChatDetailConfig(), ChatDetailConfigReq.class)); + chatConfigDescriptor.setChatAggConfig( + JsonUtil.toObject(chatConfigDO.getChatAggConfig(), ChatAggConfigReq.class)); + chatConfigDescriptor.setRecommendedQuestions( + JsonUtil.toList(chatConfigDO.getRecommendedQuestions(), RecommendedQuestionReq.class)); chatConfigDescriptor.setStatusEnum(StatusEnum.of(chatConfigDO.getStatus())); chatConfigDescriptor.setCreatedBy(chatConfigDO.getCreatedBy()); @@ -114,7 +120,6 @@ public class ChatConfigHelper { chatConfigDescriptor.setUpdatedBy(chatConfigDO.getUpdatedBy()); chatConfigDescriptor.setUpdatedAt(chatConfigDO.getUpdatedAt()); - if (Strings.isEmpty(chatConfigDO.getChatAggConfig())) { chatConfigDescriptor.setChatAggConfig(generateEmptyChatAggConfigResp()); } @@ -125,9 +130,9 @@ public class ChatConfigHelper { return chatConfigDescriptor; } - private ChatConfigResp generateEmptyChatConfigResp(Long domainId) { + private ChatConfigResp generateEmptyChatConfigResp(Long modelId) { ChatConfigResp chatConfigResp = new ChatConfigResp(); - chatConfigResp.setDomainId(domainId); + chatConfigResp.setModelId(modelId); chatConfigResp.setChatDetailConfig(generateEmptyChatDetailConfigResp()); chatConfigResp.setChatAggConfig(generateEmptyChatAggConfigResp()); return chatConfigResp; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ChatGptHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ChatGptHelper.java index b7672c7b6..cc5d193dd 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ChatGptHelper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ChatGptHelper.java @@ -6,19 +6,18 @@ import com.plexpt.chatgpt.entity.chat.ChatCompletion; import com.plexpt.chatgpt.entity.chat.ChatCompletionResponse; import com.plexpt.chatgpt.entity.chat.Message; import com.plexpt.chatgpt.util.Proxys; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - import java.net.Proxy; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; @Component public class ChatGptHelper { - @Value("${llm.chatgpt.apikey:sk-kdgPxxx}") + @Value("${llm.chatgpt.apikey:xx-xxxx}") private String apiKey; @Value("${llm.chatgpt.apiHost:https://api.openai.com/}") @@ -31,9 +30,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() @@ -45,20 +44,20 @@ public class ChatGptHelper { .init(); } - 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 + ",输出:"); ChatCompletion chatCompletion = ChatCompletion.builder() .model(ChatCompletion.Model.GPT_3_5_TURBO_16K.getName()) .messages(Arrays.asList(system, message)) 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 7fa7a9164..d47479f9e 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 @@ -3,13 +3,11 @@ package com.tencent.supersonic.chat.utils; 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.parser.function.ModelResolver; +import com.tencent.supersonic.chat.query.QuerySelector; import java.util.ArrayList; import java.util.List; import java.util.Objects; - -import com.tencent.supersonic.chat.parser.function.DomainResolver; -import com.tencent.supersonic.chat.query.QuerySelector; import org.apache.commons.collections.CollectionUtils; import org.springframework.core.io.support.SpringFactoriesLoader; @@ -19,7 +17,7 @@ public class ComponentFactory { private static List semanticParsers = new ArrayList<>(); private static SemanticLayer semanticLayer; private static QuerySelector querySelector; - private static DomainResolver domainResolver; + private static ModelResolver modelResolver; public static List getSchemaMappers() { return CollectionUtils.isEmpty(schemaMappers) ? init(SchemaMapper.class, schemaMappers) : schemaMappers; @@ -47,11 +45,11 @@ public class ComponentFactory { return querySelector; } - public static DomainResolver getDomainResolver() { - if (Objects.isNull(domainResolver)) { - domainResolver = init(DomainResolver.class); + public static ModelResolver getModelResolver() { + if (Objects.isNull(modelResolver)) { + modelResolver = init(ModelResolver.class); } - return domainResolver; + return modelResolver; } private static List init(Class factoryType, List list) { 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 5e62d1754..310137955 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 @@ -4,18 +4,18 @@ import static com.tencent.supersonic.common.pojo.Constants.DAY; import static com.tencent.supersonic.common.pojo.Constants.UNDERLINE; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.SchemaElement; 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.*; -import com.tencent.supersonic.chat.service.ConfigService; +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.service.ConfigService; 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,7 +24,6 @@ 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; @@ -44,28 +43,28 @@ public class DictMetaHelper { public List generateDimValueInfo(DimValue2DictCommand dimValue2DictCommend) { List dimValueDOList = new ArrayList<>(); DictUpdateMode updateMode = dimValue2DictCommend.getUpdateMode(); - Set domainIds = new HashSet<>(); + Set modelIds = new HashSet<>(); switch (updateMode) { - case OFFLINE_DOMAIN: - domainIds.addAll(dimValue2DictCommend.getDomainIds()); - dimValueDOList = generateDimValueInfoByDomain(domainIds); + case OFFLINE_MODEL: + modelIds.addAll(dimValue2DictCommend.getModelIds()); + dimValueDOList = generateDimValueInfoByModel(modelIds); break; case OFFLINE_FULL: - List domainSchemaDescList = semanticLayer.getDomainSchema(); - if (CollectionUtils.isEmpty(domainSchemaDescList)) { + List modelSchemaDescList = semanticLayer.getModelSchema(); + if (CollectionUtils.isEmpty(modelSchemaDescList)) { break; } - Map domainIdAndDescPair = domainSchemaDescList.stream() - .collect(Collectors.toMap(a -> a.getDomain().getId(), schema -> schema, (k1, k2) -> k1)); - if (!CollectionUtils.isEmpty(domainIdAndDescPair)) { - domainIds.addAll(domainIdAndDescPair.keySet()); - dimValueDOList = generateDimValueInfoByDomain(domainIds); + Map modelIdAndDescPair = modelSchemaDescList.stream() + .collect(Collectors.toMap(a -> a.getModel().getId(), schema -> schema, (k1, k2) -> k1)); + if (!CollectionUtils.isEmpty(modelIdAndDescPair)) { + modelIds.addAll(modelIdAndDescPair.keySet()); + dimValueDOList = generateDimValueInfoByModel(modelIds); break; } break; case REALTIME_ADD: - dimValueDOList = generateDimValueInfoByDomainAndDim(dimValue2DictCommend.getDomainAndDimPair()); + dimValueDOList = generateDimValueInfoByModelAndDim(dimValue2DictCommend.getModelAndDimPair()); break; case NOT_SUPPORT: throw new RuntimeException("illegal parameter for updateMode"); @@ -76,87 +75,92 @@ public class DictMetaHelper { return dimValueDOList; } - private List generateDimValueInfoByDomainAndDim(Map> domainAndDimMap) { + private List generateDimValueInfoByModelAndDim(Map> modelAndDimMap) { List dimValueDOList = new ArrayList<>(); - if (CollectionUtils.isEmpty(domainAndDimMap)) { + if (CollectionUtils.isEmpty(modelAndDimMap)) { return dimValueDOList; } - List domainSchemaDescList = semanticLayer.getDomainSchema(); - if (CollectionUtils.isEmpty(domainSchemaDescList)) { + List modelSchemaDescList = semanticLayer.getModelSchema(); + if (CollectionUtils.isEmpty(modelSchemaDescList)) { return dimValueDOList; } - Map domainIdAndDescPair = domainSchemaDescList.stream() - .collect(Collectors.toMap(a -> a.getDomain().getId(), a -> a, (k1, k2) -> k1)); + Map modelIdAndDescPair = modelSchemaDescList.stream() + .collect(Collectors.toMap(a -> a.getModel().getId(), a -> a, (k1, k2) -> k1)); - for (Long domainId : domainAndDimMap.keySet()) { - if (!domainIdAndDescPair.containsKey(domainId)) { + for (Long modelId : modelAndDimMap.keySet()) { + if (!modelIdAndDescPair.containsKey(modelId)) { continue; } Map dimIdAndDescPairAll; - dimIdAndDescPairAll = domainIdAndDescPair.get(domainId).getDimensions().stream() + dimIdAndDescPairAll = modelIdAndDescPair.get(modelId).getDimensions().stream() .collect(Collectors.toMap(SchemaElement::getId, dimSchemaDesc -> dimSchemaDesc, (k1, k2) -> k1)); - List dimIdReq = domainAndDimMap.get(domainId); + List dimIdReq = modelAndDimMap.get(modelId); Map dimIdAndDescPairReq = new HashMap<>(); for (Long dimId : dimIdReq) { if (dimIdAndDescPairAll.containsKey(dimId)) { dimIdAndDescPairReq.put(dimId, dimIdAndDescPairAll.get(dimId)); } } - fillDimValueDOList(dimValueDOList, domainId, dimIdAndDescPairReq); + fillDimValueDOList(dimValueDOList, modelId, dimIdAndDescPairReq); } return dimValueDOList; } - private List generateDimValueInfoByDomain(Set domainIds) { + private List generateDimValueInfoByModel(Set modelIds) { List dimValueDOList = new ArrayList<>(); - List domainSchemaDescList = semanticLayer.getDomainSchema(new ArrayList<>(domainIds)); - if (CollectionUtils.isEmpty(domainSchemaDescList)) { + List modelSchemaDescList = semanticLayer.getModelSchema(new ArrayList<>(modelIds)); + if (CollectionUtils.isEmpty(modelSchemaDescList)) { return dimValueDOList; } - domainSchemaDescList.forEach(domainSchemaDesc -> { - Map dimIdAndDescPair = domainSchemaDesc.getDimensions().stream() + modelSchemaDescList.forEach(modelSchemaDesc -> { + Map dimIdAndDescPair = modelSchemaDesc.getDimensions().stream() .collect(Collectors.toMap(SchemaElement::getId, dimSchemaDesc -> dimSchemaDesc, (k1, k2) -> k1)); - fillDimValueDOList(dimValueDOList, domainSchemaDesc.getDomain().getId(), dimIdAndDescPair); + fillDimValueDOList(dimValueDOList, modelSchemaDesc.getModel().getId(), dimIdAndDescPair); }); return dimValueDOList; } - private void fillDimValueDOList(List dimValueDOList, Long domainId, - Map dimIdAndDescPair) { - ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(domainId); + private void fillDimValueDOList(List dimValueDOList, Long modelId, + Map dimIdAndDescPair) { + ChatConfigRichResp chaConfigRichDesc = configService.getConfigRichInfo(modelId); if (Objects.nonNull(chaConfigRichDesc) && Objects.nonNull(chaConfigRichDesc.getChatAggRichConfig())) { - ChatDefaultRichConfigResp chatDefaultConfig = chaConfigRichDesc.getChatAggRichConfig().getChatDefaultConfig(); + 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, domainId); - fillKnowledgeDimValue(knowledgeAggInfo, chatDefaultConfig, dimValueDOList, dimIdAndDescPair, domainId); + fillKnowledgeDimValue(knowledgeDetailInfo, chatDefaultConfig, dimValueDOList, dimIdAndDescPair, modelId); + fillKnowledgeDimValue(knowledgeAggInfo, chatDefaultConfig, dimValueDOList, dimIdAndDescPair, modelId); } } - private void fillKnowledgeDimValue(List knowledgeInfos, ChatDefaultRichConfigResp chatDefaultConfig, - List dimValueDOList, Map dimIdAndDescPair, Long domainId) { + private void fillKnowledgeDimValue(List knowledgeInfos, + 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 = @@ -165,7 +169,9 @@ 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())); } @@ -173,7 +179,7 @@ public class DictMetaHelper { Dim4Dict dim4Dict = new Dim4Dict(); dim4Dict.setDimId(knowledgeInfo.getItemId()); dim4Dict.setBizName(bizName); - if(Objects.nonNull(knowledgeInfo.getKnowledgeAdvancedConfig())){ + if (Objects.nonNull(knowledgeInfo.getKnowledgeAdvancedConfig())) { KnowledgeAdvancedConfig knowledgeAdvancedConfig = knowledgeInfo.getKnowledgeAdvancedConfig(); BeanUtils.copyProperties(knowledgeAdvancedConfig, dim4Dict); } @@ -183,7 +189,7 @@ public class DictMetaHelper { if (!CollectionUtils.isEmpty(dimensions)) { DimValueDO dimValueDO = new DimValueDO() - .setDomainId(domainId) + .setModelId(modelId) .setDefaultMetricIds(defaultMetricDescList) .setDimensions(dimensions); dimValueDOList.add(dimValueDO); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictQueryHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictQueryHelper.java index 66c1e471f..1d197d75e 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictQueryHelper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/DictQueryHelper.java @@ -9,17 +9,16 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticLayer; import com.tencent.supersonic.chat.config.DefaultMetric; import com.tencent.supersonic.chat.config.Dim4Dict; +import com.tencent.supersonic.common.pojo.Aggregator; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.pojo.Order; import com.tencent.supersonic.common.pojo.QueryColumn; +import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; 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.common.pojo.Constants; -import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; -import com.tencent.supersonic.common.pojo.Aggregator; -import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.pojo.Order; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -27,7 +26,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.StringJoiner; - import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Value; @@ -47,13 +45,13 @@ public class DictQueryHelper { @Value("${dimension.max.limit:3000000}") private Long dimMaxLimit; - public List fetchDimValueSingle(Long domainId, DefaultMetric defaultMetricDesc, Dim4Dict dim4Dict, - User user) { + public List fetchDimValueSingle(Long modelId, DefaultMetric defaultMetricDesc, Dim4Dict dim4Dict, + User user) { List data = new ArrayList<>(); - QueryStructReq queryStructCmd = generateQueryStructCmd(domainId, defaultMetricDesc, dim4Dict); + QueryStructReq queryStructCmd = generateQueryStructCmd(modelId, defaultMetricDesc, dim4Dict); try { QueryResultWithSchemaResp queryResultWithColumns = semanticLayer.queryByStruct(queryStructCmd, user); - String nature = String.format("_%d_%d", domainId, dim4Dict.getDimId()); + String nature = String.format("_%d_%d", modelId, dim4Dict.getDimId()); String dimNameRewrite = rewriteDimName(queryResultWithColumns.getColumns(), dim4Dict.getBizName()); data = generateFileData(queryResultWithColumns.getResultList(), nature, dimNameRewrite, defaultMetricDesc.getBizName()); @@ -91,7 +89,7 @@ public class DictQueryHelper { } private List generateFileData(List> resultList, String nature, String dimName, - String metricName) { + String metricName) { List data = new ArrayList<>(); if (CollectionUtils.isEmpty(resultList)) { return data; @@ -142,10 +140,10 @@ public class DictQueryHelper { } } - private QueryStructReq generateQueryStructCmd(Long domainId, DefaultMetric defaultMetricDesc, Dim4Dict dim4Dict) { + private QueryStructReq generateQueryStructCmd(Long modelId, DefaultMetric defaultMetricDesc, Dim4Dict dim4Dict) { QueryStructReq queryStructCmd = new QueryStructReq(); - queryStructCmd.setDomainId(domainId); + queryStructCmd.setModelId(modelId); queryStructCmd.setGroups(Arrays.asList(dim4Dict.getBizName())); List filters = generateFilters(dim4Dict, queryStructCmd); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/NatureHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/NatureHelper.java index e928b566b..51e00ec1c 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/NatureHelper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/NatureHelper.java @@ -3,7 +3,7 @@ package com.tencent.supersonic.chat.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.DomainInfoStat; +import com.tencent.supersonic.chat.mapper.ModelInfoStat; import com.tencent.supersonic.knowledge.dictionary.DictWordType; import java.util.ArrayList; import java.util.Comparator; @@ -12,7 +12,6 @@ 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.commons.lang3.StringUtils; @@ -35,8 +34,8 @@ public class NatureHelper { case ENTITY: result = SchemaElementType.ENTITY; break; - case DOMAIN: - result = SchemaElementType.DOMAIN; + case MODEL: + result = SchemaElementType.MODEL; break; case VALUE: result = SchemaElementType.VALUE; @@ -47,12 +46,12 @@ public class NatureHelper { return result; } - private static boolean isDomainOrEntity(Term term, Integer domain) { - return (DictWordType.NATURE_SPILT + domain).equals(term.nature.toString()) || term.nature.toString() + private static boolean isModelOrEntity(Term term, Integer model) { + return (DictWordType.NATURE_SPILT + model).equals(term.nature.toString()) || term.nature.toString() .endsWith(DictWordType.ENTITY.getType()); } - public static Integer getDomainByNature(Nature nature) { + public static Integer getModelByNature(Nature nature) { if (nature.startsWith(DictWordType.NATURE_SPILT)) { String[] dimensionValues = nature.toString().split(DictWordType.NATURE_SPILT); if (StringUtils.isNumeric(dimensionValues[1])) { @@ -62,7 +61,7 @@ public class NatureHelper { return 0; } - public static Long getDomainId(String nature) { + public static Long getModelId(String nature) { try { String[] split = nature.split(DictWordType.NATURE_SPILT); if (split.length <= 1) { @@ -90,18 +89,18 @@ public class NatureHelper { && StringUtils.isNumeric(split[1]); } - public static DomainInfoStat getDomainStat(List terms) { - return DomainInfoStat.builder() - .domainCount(getDomainCount(terms)) - .dimensionDomainCount(getDimensionCount(terms)) - .metricDomainCount(getMetricCount(terms)) - .dimensionValueDomainCount(getDimensionValueCount(terms)) + public static ModelInfoStat getModelStat(List terms) { + return ModelInfoStat.builder() + .modelCount(getModelCount(terms)) + .dimensionModelCount(getDimensionCount(terms)) + .metricModelCount(getMetricCount(terms)) + .dimensionValueModelCount(getDimensionValueCount(terms)) .build(); } - private static long getDomainCount(List terms) { - return terms.stream().filter(term -> isDomainOrEntity(term, getDomainByNature(term.nature))).count(); + private static long getModelCount(List terms) { + return terms.stream().filter(term -> isModelOrEntity(term, getModelByNature(term.nature))).count(); } private static long getDimensionValueCount(List terms) { @@ -120,25 +119,25 @@ public class NatureHelper { /** * Get the number of types of class parts of speech - * domainId -> (nature , natureCount) + * modelId -> (nature , natureCount) * * @param terms * @return */ - public static Map> getDomainToNatureStat(List terms) { - Map> domainToNature = new HashMap<>(); + public static Map> getModelToNatureStat(List terms) { + Map> modelToNature = new HashMap<>(); terms.stream().filter( term -> term.nature.startsWith(DictWordType.NATURE_SPILT) ).forEach(term -> { DictWordType dictWordType = DictWordType.getNatureType(String.valueOf(term.nature)); - Long domain = getDomainId(String.valueOf(term.nature)); + Long model = getModelId(String.valueOf(term.nature)); Map natureTypeMap = new HashMap<>(); natureTypeMap.put(dictWordType, 1); - Map original = domainToNature.get(domain); + Map original = modelToNature.get(model); if (Objects.isNull(original)) { - domainToNature.put(domain, natureTypeMap); + modelToNature.put(model, natureTypeMap); } else { Integer count = original.get(dictWordType); if (Objects.isNull(count)) { @@ -149,18 +148,18 @@ public class NatureHelper { original.put(dictWordType, count); } }); - return domainToNature; + return modelToNature; } - public static List selectPossibleDomains(List terms) { - Map> domainToNatureStat = getDomainToNatureStat(terms); - Integer maxDomainTypeSize = domainToNatureStat.entrySet().stream() + public static List selectPossibleModels(List terms) { + Map> modelToNatureStat = getModelToNatureStat(terms); + Integer maxModelTypeSize = modelToNatureStat.entrySet().stream() .max(Comparator.comparingInt(o -> o.getValue().size())).map(entry -> entry.getValue().size()) .orElse(null); - if (Objects.isNull(maxDomainTypeSize) || maxDomainTypeSize == 0) { + if (Objects.isNull(maxModelTypeSize) || maxModelTypeSize == 0) { return new ArrayList<>(); } - return domainToNatureStat.entrySet().stream().filter(entry -> entry.getValue().size() == maxDomainTypeSize) + return modelToNatureStat.entrySet().stream().filter(entry -> entry.getValue().size() == maxModelTypeSize) .map(entry -> entry.getKey()).collect(Collectors.toList()); } } 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 82213445b..380f80bb3 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 @@ -16,7 +16,12 @@ 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.time.LocalDate; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashSet; +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.logging.log4j.util.Strings; @@ -28,7 +33,7 @@ public class QueryReqBuilder { public static QueryStructReq buildStructReq(SemanticParseInfo parseInfo) { QueryStructReq queryStructCmd = new QueryStructReq(); - queryStructCmd.setDomainId(parseInfo.getDomainId()); + queryStructCmd.setModelId(parseInfo.getModelId()); queryStructCmd.setNativeQuery(parseInfo.getNativeQuery()); queryStructCmd.setDateInfo(rewrite2Between(parseInfo.getDateInfo())); @@ -103,22 +108,22 @@ public class QueryReqBuilder { * convert to QueryDslReq * * @param querySql - * @param domainId + * @param modelId * @return */ - public static QueryDslReq buildDslReq(String querySql, Long domainId) { + public static QueryDslReq buildDslReq(String querySql, Long modelId) { QueryDslReq queryDslReq = new QueryDslReq(); if (Objects.nonNull(querySql)) { queryDslReq.setSql(querySql); } - queryDslReq.setDomainId(domainId); + queryDslReq.setModelId(modelId); return queryDslReq; } private static List getAggregatorByMetric(AggregateTypeEnum aggregateType, SchemaElement metric) { List aggregators = new ArrayList<>(); - if(metric != null) { + if (metric != null) { String agg = (aggregateType == null || aggregateType.equals(AggregateTypeEnum.NONE)) ? "" : aggregateType.name(); aggregators.add(new Aggregator(metric.getBizName(), AggOperatorEnum.of(agg))); @@ -193,7 +198,8 @@ public class QueryReqBuilder { return dateField; } - public static QueryStructReq buildStructRatioReq(SemanticParseInfo parseInfo, SchemaElement metric, AggOperatorEnum aggOperatorEnum) { + public static QueryStructReq buildStructRatioReq(SemanticParseInfo parseInfo, SchemaElement metric, + AggOperatorEnum aggOperatorEnum) { QueryStructReq queryStructCmd = buildStructReq(parseInfo); queryStructCmd.setNativeQuery(false); queryStructCmd.setOrders(new ArrayList<>()); 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 new file mode 100644 index 000000000..a9e684799 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/SchemaMatchHelper.java @@ -0,0 +1,44 @@ +package com.tencent.supersonic.chat.utils; + +import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.chat.api.pojo.SchemaElementType; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +/** + * Schema Match Helper + */ +@Slf4j +public class SchemaMatchHelper { + + public static void removeSamePrefixDetectWord(List matches) { + if (CollectionUtils.isEmpty(matches)) { + return; + } + + Set metricDimensionDetectWordSet = matches.stream() + .filter(elementMatch -> isMetricOrDimension(elementMatch)) + .map(entry -> entry.getDetectWord()).collect(Collectors.toSet()); + + matches.removeIf(elementMatch -> { + if (!isMetricOrDimension(elementMatch)) { + return false; + } + for (String detectWord : metricDimensionDetectWordSet) { + if (detectWord.startsWith(elementMatch.getDetectWord()) + && detectWord.length() > elementMatch.getDetectWord().length()) { + return true; + } + } + return false; + }); + } + + private static boolean isMetricOrDimension(SchemaElementMatch elementMatch) { + return SchemaElementType.METRIC.equals(elementMatch.getElement().getType()) || + SchemaElementType.DIMENSION.equals(elementMatch.getElement().getType()); + } +} diff --git a/chat/core/src/main/python/llm/api_service.py b/chat/core/src/main/python/llm/api_service.py index ebe131084..a5bd975f2 100644 --- a/chat/core/src/main/python/llm/api_service.py +++ b/chat/core/src/main/python/llm/api_service.py @@ -6,12 +6,20 @@ 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 typing import Any, Mapping +from typing import Any, List, Mapping, Optional, Union from fastapi import FastAPI, HTTPException from sql.run import query2sql +from preset_retrieval.run import preset_query_retrieval_run, collection as preset_query_collection +from preset_retrieval.preset_query_db import (add2preset_query_collection, update_preset_query_collection, + empty_preset_query_collection, delete_preset_query_by_ids, + update_preset_query_collection, get_preset_query_by_ids, + preset_query_collection_size) + +from plugin_call.run import plugin_selection_run + app = FastAPI() @@ -31,3 +39,82 @@ async def din_query2sql(query_body: Mapping[str, Any]): resp = query2sql(query_text=query_text, schema=schema) return resp + + +@app.post("/preset_query_retrival/") +async def preset_query_retrival(query_text_list: List[str], n_results: int = 5): + parsed_retrieval_res_format = preset_query_retrieval_run(preset_query_collection, query_text_list, n_results) + + return parsed_retrieval_res_format + + +@app.post("/preset_query_add/") +async def preset_query_add(preset_info_list: List[Mapping[str, str]]): + preset_queries = [] + preset_query_ids = [] + + for preset_info in preset_info_list: + preset_queries.append(preset_info['preset_query']) + preset_query_ids.append(preset_info['preset_query_id']) + + add2preset_query_collection(collection=preset_query_collection, + preset_queries=preset_queries, + preset_query_ids=preset_query_ids) + + return "success" + +@app.post("/preset_query_update/") +async def preset_query_update(preset_info_list: List[Mapping[str, str]]): + preset_queries = [] + preset_query_ids = [] + + for preset_info in preset_info_list: + preset_queries.append(preset_info['preset_query']) + preset_query_ids.append(preset_info['preset_query_id']) + + update_preset_query_collection(collection=preset_query_collection, + preset_queries=preset_queries, + preset_query_ids=preset_query_ids) + + return "success" + + +@app.get("/preset_query_empty/") +async def preset_query_empty(): + empty_preset_query_collection(collection=preset_query_collection) + + return "success" + +@app.post("/preset_delete_by_ids/") +async def preset_delete_by_ids(preset_query_ids: List[str]): + delete_preset_query_by_ids(collection=preset_query_collection, preset_query_ids=preset_query_ids) + + return "success" + +@app.post("/preset_get_by_ids/") +async def preset_get_by_ids(preset_query_ids: List[str]): + preset_queries = get_preset_query_by_ids(collection=preset_query_collection, preset_query_ids=preset_query_ids) + + return preset_queries + +@app.get("/preset_query_size/") +async def preset_query_size(): + size = preset_query_collection_size(collection=preset_query_collection) + + return size + +@app.post("/plugin_selection/") +async def tool_selection(query_body: Mapping[str, Any]): + 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'] + + if 'pluginConfigs' not in query_body: + raise HTTPException(status_code=400, detail="pluginConfigs is not in query_body") + else: + plugin_configs = query_body['pluginConfigs'] + + resp = plugin_selection_run(query_text=query_text, plugin_configs=plugin_configs) + + return resp diff --git a/chat/core/src/main/python/llm/plugin_call/prompt_construct.py b/chat/core/src/main/python/llm/plugin_call/prompt_construct.py new file mode 100644 index 000000000..61b82cfc7 --- /dev/null +++ b/chat/core/src/main/python/llm/plugin_call/prompt_construct.py @@ -0,0 +1,87 @@ +# -*- coding:utf-8 -*- +import os +import sys +import json +import time +import re +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__))) + + +def construct_plugin_prompt(tool_config): + tool_name = tool_config["name"] + tool_description = tool_config["description"] + tool_examples = tool_config["examples"] + + prompt = "【工具名称】\n" + tool_name + "\n" + prompt += "【工具描述】\n" + tool_description + "\n" + + prompt += "【工具适用问题示例】\n" + for example in tool_examples: + prompt += example + "\n" + return prompt + +def construct_plugin_pool_prompt(tool_config_list): + tool_explain_list = [] + for tool_config in tool_config_list: + tool_explain = construct_plugin_prompt(tool_config) + tool_explain_list.append(tool_explain) + + tool_explain_list_str = "\n\n".join(tool_explain_list) + + return tool_explain_list_str + + +def construct_task_prompt(query_text, tool_explain_list_str): + instruction = """问题为:{query_text}\n请根据问题和工具的描述,选择对应的工具,完成任务。请注意,只能选择1个工具。请一步一步地分析选择工具的原因(每个工具的【工具适用问题示例】是选择的重要参考依据),并给出最终选择,输出格式为json,key为’分析过程‘, ’选择工具‘""".format(query_text=query_text) + + prompt = "工具选择如下:\n\n{tool_explain_list_str}\n\n【任务说明】\n{instruction}".format(instruction=instruction, tool_explain_list_str=tool_explain_list_str) + + return prompt + +def plugin_selection_output_parse(llm_output: str)-> Union[Mapping[str, str], None]: + try: + pattern = r'\{[^{}]+\}' + find_result = re.findall(pattern, llm_output) + result = find_result[0].strip() + + print("result: ", result) + + result_dict = json.loads(result) + print("result_dict: ", result_dict) + + key_mapping = { + "分析过程":"analysis", + "选择工具":"toolSelection" + } + + converted_result_dict = {key_mapping[key]: value for key, value in result_dict.items() if key in key_mapping} + + except Exception as e: + print(e) + converted_result_dict = None + + return converted_result_dict + +def plugins_config_format_convert(plugin_config_list: List[Mapping[str, Any]]) -> List[Mapping[str, Any]]: + plugin_config_list_new = [] + for plugin_config in plugin_config_list: + plugin_config_new = dict() + name = plugin_config["name"] + description = plugin_config["description"] + examples = plugin_config["examples"] + parameters = plugin_config["parameters"] + + examples_str = "\n".join(examples) + description_new = """{plugin_desc}\n\n例如能够处理如下问题:\n{examples_str}""".format(plugin_desc=description, examples_str=examples_str) + + plugin_config_new["name"] = name + plugin_config_new["description"] = description_new + plugin_config_new["parameters"] = parameters + + plugin_config_list_new.append(plugin_config_new) + + return plugin_config_list_new + diff --git a/chat/core/src/main/python/llm/plugin_call/run.py b/chat/core/src/main/python/llm/plugin_call/run.py new file mode 100644 index 000000000..88b629ba5 --- /dev/null +++ b/chat/core/src/main/python/llm/plugin_call/run.py @@ -0,0 +1,26 @@ +# -*- coding:utf-8 -*- + +from typing import Any, List, Mapping, Optional, Union +import logging +import json +import time +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 plugin_call.prompt_construct import construct_plugin_pool_prompt, construct_task_prompt, plugin_selection_output_parse, plugins_config_format_convert +from util.llm_instance import llm + + +def plugin_selection_run(query_text: str, plugin_configs: List[Mapping[str, Any]])-> Union[Mapping[str, str], None]: + + tools_prompt = construct_plugin_pool_prompt(plugin_configs) + + task_prompt = construct_task_prompt(query_text, tools_prompt) + llm_output = llm(task_prompt) + parsed_output = plugin_selection_output_parse(llm_output) + + return parsed_output + diff --git a/chat/core/src/main/python/llm/preset_retrieval/preset_query_db.py b/chat/core/src/main/python/llm/preset_retrieval/preset_query_db.py new file mode 100644 index 000000000..837e58774 --- /dev/null +++ b/chat/core/src/main/python/llm/preset_retrieval/preset_query_db.py @@ -0,0 +1,115 @@ +# -*- coding:utf-8 -*- +import os +import sys +import uuid +import numpy as np +from typing import Any, List, Mapping, Optional, Union + +from chromadb.api import Collection, Documents, Embeddings + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + + +def get_ids(documents:List[str]) -> List[str]: + ids = [] + for doc in documents: + ids.append(str(uuid.uuid5(uuid.NAMESPACE_URL, doc))) + + return ids + + +def add2preset_query_collection(collection:Collection, + preset_queries:List[str], + preset_query_ids:List[str] + ) -> None: + + collection.add(documents=preset_queries, + ids=preset_query_ids) + + +def update_preset_query_collection(collection:Collection, + preset_queries:List[str], + preset_query_ids:List[str] + ) -> None: + + collection.update(documents=preset_queries, + ids=preset_query_ids) + + +def query2preset_query_collection(collection:Collection, query_texts:List[str], n_results:int=10): + collection_cnt = collection.count() + min_n_results = 10 + min_n_results = min(collection_cnt, min_n_results) + + if n_results > min_n_results: + res = collection.query(query_texts=query_texts, n_results=n_results) + return res + else: + res = collection.query(query_texts=query_texts, n_results=min_n_results) + + for _key in res.keys(): + if res[_key] is None: + continue + for _idx in range(0, len(query_texts)): + res[_key][_idx] = res[_key][_idx][:n_results] + + return res + +def parse_retrieval_preset_query(res:List[Mapping[str, Any]]): + parsed_res = [[] for _ in range(0, len(res['ids']))] + + retrieval_ids = res['ids'] + retrieval_distances = res['distances'] + retrieval_sentences = res['documents'] + + for query_idx in range(0, len(retrieval_ids)): + id_ls = retrieval_ids[query_idx] + distance_ls = retrieval_distances[query_idx] + sentence_ls = retrieval_sentences[query_idx] + + for idx in range(0, len(id_ls)): + id = id_ls[idx] + distance = distance_ls[idx] + sentence = sentence_ls[idx] + + parsed_res[query_idx].append({ + 'id': id, + 'distance': distance, + 'presetQuery': sentence + }) + + return parsed_res + +def preset_query_retrieval_format(query_list:List[str], retrieval_list:List[Mapping[str, Any]]): + res = [] + for query_idx in range(0, len(query_list)): + query = query_list[query_idx] + retrieval = retrieval_list[query_idx] + + res.append({ + 'query': query, + 'retrieval': retrieval + }) + + return res + +def empty_preset_query_collection(collection:Collection) -> None: + collection.delete() + +def delete_preset_query_by_ids(collection:Collection, preset_query_ids:List[str]) -> None: + collection.delete(ids=preset_query_ids) + +def get_preset_query_by_ids(collection:Collection, preset_query_ids:List[str]): + res = collection.get(ids=preset_query_ids) + + return res + +def preset_query_collection_size(collection:Collection) -> int: + return collection.count() + + + + + + diff --git a/chat/core/src/main/python/llm/preset_retrieval/run.py b/chat/core/src/main/python/llm/preset_retrieval/run.py new file mode 100644 index 000000000..9027253bf --- /dev/null +++ b/chat/core/src/main/python/llm/preset_retrieval/run.py @@ -0,0 +1,49 @@ +# -*- coding:utf-8 -*- + +import os +import sys +import uuid +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 + +from preset_query_db import (get_ids, add2preset_query_collection, + query2preset_query_collection, parse_retrieval_preset_query, + preset_query_retrieval_format, empty_preset_query_collection, preset_query_collection_size) + +from util.text2vec import Text2VecEmbeddingFunction + +from run_config import CHROMA_DB_PERSIST_PATH, PRESET_QUERY_COLLECTION_NAME + + +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, + embedding_function=emb_func, + metadata={"hnsw:space": "cosine"} + ) # Get a collection object from an existing collection, by name. If it doesn't exist, create it. + + +def preset_query_retrieval_run(collection:Collection, query_texts_list:List[str], n_results:int=5): + retrieval_res = query2preset_query_collection(collection=collection, + query_texts=query_texts_list, + n_results=n_results) + + parsed_retrieval_res = parse_retrieval_preset_query(retrieval_res) + parsed_retrieval_res_format = preset_query_retrieval_format(query_texts_list, parsed_retrieval_res) + + print('parsed_retrieval_res_format: ', parsed_retrieval_res_format) + + return parsed_retrieval_res_format diff --git a/chat/core/src/main/python/llm/run_config.py b/chat/core/src/main/python/llm/run_config.py new file mode 100644 index 000000000..989b44e5a --- /dev/null +++ b/chat/core/src/main/python/llm/run_config.py @@ -0,0 +1,20 @@ +# -*- coding:utf-8 -*- +import os + +PROJECT_DIR_PATH = os.path.dirname(os.path.abspath(__file__)) + +MODEL_NAME = "gpt-3.5-turbo-16k" +OPENAI_API_KEY = "YOUR_API_KEY" +TEMPERATURE = 0.0 + +CHROMA_DB_PERSIST_DIR = 'chm_db' +PRESET_QUERY_COLLECTION_NAME = "preset_query_collection" + +CHROMA_DB_PERSIST_PATH = os.path.join(PROJECT_DIR_PATH, CHROMA_DB_PERSIST_DIR) + +HF_TEXT2VEC_MODEL_NAME = "GanymedeNil/text2vec-large-chinese" + +if __name__ == '__main__': + print('PROJECT_DIR_PATH: ', PROJECT_DIR_PATH) + print('EMB_MODEL_PATH: ', HF_TEXT2VEC_MODEL_NAME) + print('CHROMA_DB_PERSIST_PATH: ', CHROMA_DB_PERSIST_PATH) \ No newline at end of file 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 54de5478c..6e05f95b3 100644 --- a/chat/core/src/main/python/llm/sql/prompt_maker.py +++ b/chat/core/src/main/python/llm/sql/prompt_maker.py @@ -17,13 +17,13 @@ from few_shot_example.sql_exampler import examplars from output_parser import schema_link_parse -def schema_linking_prompt_maker(user_query: str, domain_name: str, +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=domain_name, + table_name=model_name, fields_list=fields_list, user_query=user_query) @@ -31,7 +31,7 @@ def schema_linking_prompt_maker(user_query: str, domain_name: str, def schema_linking_exampler(user_query: str, - domain_name: str, + model_name: str, fields_list: List[str] ) -> str: example_prompt_template = PromptTemplate( @@ -53,7 +53,7 @@ def schema_linking_exampler(user_query: str, ) schema_linking_example_prompt = schema_linking_example_prompt_template.format( - table_name=domain_name, + table_name=model_name, fields_list=fields_list, question=user_query) @@ -61,7 +61,7 @@ def schema_linking_exampler(user_query: str, def sql_exampler(user_query: str, - domain_name: str, + model_name: str, schema_link_str: str ) -> str: instruction = "# 根据schema_links为每个问题生成SQL查询语句" @@ -82,7 +82,7 @@ def sql_exampler(user_query: str, ) sql_example_prompt = sql_example_prompt_template.format(question=user_query, - table_name=domain_name, + table_name=model_name, schema_links=schema_link_str) 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 278fa099c..ea60d7f36 100644 --- a/chat/core/src/main/python/llm/sql/run.py +++ b/chat/core/src/main/python/llm/sql/run.py @@ -5,7 +5,6 @@ import logging import json import os import sys -from langchain.llms import OpenAI sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) sys.path.append(os.path.dirname(os.path.abspath(__file__))) @@ -13,31 +12,25 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from sql.prompt_maker import schema_linking_exampler, schema_link_parse, \ sql_exampler -MODEL_NAME = "gpt-3.5-turbo-16k" -OPENAI_API_KEY = "YOUR_API_KEY" -TEMPERATURE = 0.0 - -llm = OpenAI(openai_api_key=OPENAI_API_KEY, model_name=MODEL_NAME, - temperature=TEMPERATURE) - +from util.llm_instance import llm def query2sql(query_text: str, schema: dict): print("schema: ", schema) - domain_name = schema['domainName'] + model_name = schema['modelName'] fields_list = schema['fieldNameList'] - schema_linking_prompt = schema_linking_exampler(query_text, domain_name, + 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) - sql_prompt = sql_exampler(query_text, domain_name, schema_link_str) + sql_prompt = sql_exampler(query_text, model_name, schema_link_str) sql_output = llm(sql_prompt) resp = dict() resp['query'] = query_text - resp['domain'] = domain_name + resp['model'] = model_name resp['fields'] = fields_list resp['schemaLinkingOutput'] = schema_link_output diff --git a/chat/core/src/main/python/llm/util/llm_instance.py b/chat/core/src/main/python/llm/util/llm_instance.py new file mode 100644 index 000000000..97b6a58d6 --- /dev/null +++ b/chat/core/src/main/python/llm/util/llm_instance.py @@ -0,0 +1,8 @@ +# -*- coding:utf-8 -*- +from langchain.llms import OpenAI + +from run_config import MODEL_NAME, OPENAI_API_KEY, TEMPERATURE + + +llm = OpenAI(openai_api_key=OPENAI_API_KEY, model_name=MODEL_NAME, + temperature=TEMPERATURE) diff --git a/chat/core/src/main/python/llm/util/text2vec.py b/chat/core/src/main/python/llm/util/text2vec.py new file mode 100644 index 000000000..fef62f984 --- /dev/null +++ b/chat/core/src/main/python/llm/util/text2vec.py @@ -0,0 +1,28 @@ +# -*- coding:utf-8 -*- +import os +from typing import Any, List, Mapping, Optional, Union + +from langchain.embeddings import HuggingFaceEmbeddings +from chromadb.api.types import Documents, EmbeddingFunction, Embeddings + +from run_config import HF_TEXT2VEC_MODEL_NAME + +hg_embedding = HuggingFaceEmbeddings(model_name=HF_TEXT2VEC_MODEL_NAME) + +class Text2VecEmbeddingFunction(EmbeddingFunction): + def __call__(self, texts: Documents) -> Embeddings: + + embeddings = hg_embedding.embed_documents(texts) + + return embeddings + +def get_embeddings(documents:List[str]) -> List[List[float]]: + embeddings = hg_embedding.embed_documents(documents) + + return embeddings + + + + + + diff --git a/chat/core/src/main/resources/mapper/ChatConfigMapper.xml b/chat/core/src/main/resources/mapper/ChatConfigMapper.xml index 55eb670a4..61fa88cca 100644 --- a/chat/core/src/main/resources/mapper/ChatConfigMapper.xml +++ b/chat/core/src/main/resources/mapper/ChatConfigMapper.xml @@ -6,9 +6,9 @@ + type="com.tencent.supersonic.chat.persistence.dataobject.ChatConfigDO"> - + @@ -22,14 +22,11 @@ - insert into s2_chat_config - ( - domain_id, `chat_detail_config`, chat_agg_config, recommended_questions, status, created_by, updated_by, created_at, updated_at - ) - values - ( - #{domainId}, #{chatDetailConfig}, #{chatAggConfig}, #{recommendedQuestions}, #{status}, #{createdBy}, #{updatedBy}, #{createdAt}, #{updatedAt} - ) + insert into s2_chat_config + (model_id, `chat_detail_config`, chat_agg_config, recommended_questions, status, created_by, + updated_by, created_at, updated_at) + values (#{modelId}, #{chatDetailConfig}, #{chatAggConfig}, #{recommendedQuestions}, + #{status}, #{createdBy}, #{updatedBy}, #{createdAt}, #{updatedAt}) @@ -58,8 +55,8 @@ id = #{id} - - and domain_id = #{domainId} + + and model_id = #{modelId} @@ -71,8 +68,8 @@ id = #{id} - - and domain_id = #{domainId} + + and model_id = #{modelId} and status = #{status} @@ -81,13 +78,13 @@ - select * from s2_chat_config - where domain_id = #{domainId} - and status != 3 + where model_id = #{modelId} + and status != 3 order by updated_at desc - limit 1 + limit 1 diff --git a/chat/core/src/main/resources/mapper/ChatContextMapper.xml b/chat/core/src/main/resources/mapper/ChatContextMapper.xml index 2a8834627..5f69263cf 100644 --- a/chat/core/src/main/resources/mapper/ChatContextMapper.xml +++ b/chat/core/src/main/resources/mapper/ChatContextMapper.xml @@ -6,7 +6,7 @@ + type="com.tencent.supersonic.chat.persistence.dataobject.ChatContextDO"> @@ -15,16 +15,22 @@ - select * - from s2_chat_context where chat_id=#{chatId} limit 1 + from s2_chat_context + where chat_id = #{chatId} limit 1 - - insert into s2_chat_context (chat_id,user,query_text,semantic_parse) values (#{chatId}, #{user},#{queryText}, #{semanticParse}) + + insert into s2_chat_context (chat_id, user, query_text, semantic_parse) + values (#{chatId}, #{user}, #{queryText}, #{semanticParse}) - update s2_chat_context set query_text=#{queryText},semantic_parse=#{semanticParse} where chat_id=#{chatId} + update s2_chat_context + set query_text=#{queryText}, + semantic_parse=#{semanticParse} + where chat_id = #{chatId} \ No newline at end of file diff --git a/chat/core/src/main/resources/mapper/ChatMapper.xml b/chat/core/src/main/resources/mapper/ChatMapper.xml index bda458423..a2f788577 100644 --- a/chat/core/src/main/resources/mapper/ChatMapper.xml +++ b/chat/core/src/main/resources/mapper/ChatMapper.xml @@ -5,7 +5,8 @@ - + @@ -41,14 +42,16 @@ update s2_chat set last_question = #{lastQuestion}, - last_time = #{lastTime} + last_time = #{lastTime} where chat_id = #{chatId} - + insert into s2_chat (chat_name, create_time, last_time, creator, last_question, is_delete, is_top) - values (#{chatName}, #{createTime}, #{lastTime}, #{creator}, #{lastQuestion}, #{isDelete}, #{isTop}) + values (#{chatName}, #{createTime}, #{lastTime}, #{creator}, #{lastQuestion}, #{isDelete}, + #{isTop}) @@ -59,7 +62,8 @@ - + @@ -83,22 +87,29 @@ - + update s2_chat_query set score=#{score}, feedback=#{feedback} where question_id = #{id} - insert into s2_chat_query - (question_id, create_time, user_name, question, query_result, time, state, data_content, name, query_type, - is_deleted, module, chat_id, aggregator, top_num, start_time, end_time, query_sql, columns, main_entity, score, + (question_id, create_time, user_name, question, query_result, time, state, data_content, + name, query_type, + is_deleted, module, chat_id, aggregator, top_num, start_time, end_time, query_sql, columns, + main_entity, score, feedback) - values (#{questionId}, #{createTime}, #{userName}, #{question}, #{queryResults}, #{time}, #{state}, - #{dataContent}, #{name}, #{queryType}, #{isDeleted}, #{module}, #{chatId}, #{aggregator}, #{topNum}, - #{startTime}, #{endTime}, #{querySql}, #{QueryColumn}, #{EntityInfo}, #{score}, #{feedback}) + values (#{questionId}, #{createTime}, #{userName}, #{question}, #{queryResults}, #{time}, + #{state}, + #{dataContent}, #{name}, #{queryType}, #{isDeleted}, #{module}, #{chatId}, + #{aggregator}, #{topNum}, + #{startTime}, #{endTime}, #{querySql}, #{QueryColumn}, #{EntityInfo}, #{score}, + #{feedback}) diff --git a/chat/core/src/main/resources/mapper/ChatQueryDOMapper.xml b/chat/core/src/main/resources/mapper/ChatQueryDOMapper.xml index 3c0b5bf81..7de775067 100644 --- a/chat/core/src/main/resources/mapper/ChatQueryDOMapper.xml +++ b/chat/core/src/main/resources/mapper/ChatQueryDOMapper.xml @@ -1,226 +1,246 @@ - + - - - - - - - - - - - - - - - - - - - - - - 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 + + - select - - distinct - - - , - - from s2_chat_query - - - - - order by ${orderByClause} - - - - - - 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} - + + , + + from s2_chat_query + + + + + order by ${orderByClause} + + + + + + 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 diff --git a/chat/core/src/main/resources/mapper/PluginDOMapper.xml b/chat/core/src/main/resources/mapper/PluginDOMapper.xml index b9b4842e7..e9a51b57a 100644 --- a/chat/core/src/main/resources/mapper/PluginDOMapper.xml +++ b/chat/core/src/main/resources/mapper/PluginDOMapper.xml @@ -1,276 +1,297 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - 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} + + + + + + - - - - - - - id, type, domain, pattern, parse_mode, name, created_at, created_by, updated_at, + + + + id + , type, model, pattern, parse_mode, name, created_at, created_by, updated_at, updated_by - - - parse_mode_config, config, comment - - - - - - delete from s2_plugin - where id = #{id,jdbcType=BIGINT} - - - insert into s2_plugin (id, type, domain, - pattern, parse_mode, name, - created_at, created_by, updated_at, - updated_by, parse_mode_config, config, - comment) - values (#{id,jdbcType=BIGINT}, #{type,jdbcType=VARCHAR}, #{domain,jdbcType=VARCHAR}, - #{pattern,jdbcType=VARCHAR}, #{parseMode,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, - #{createdAt,jdbcType=TIMESTAMP}, #{createdBy,jdbcType=VARCHAR}, #{updatedAt,jdbcType=TIMESTAMP}, - #{updatedBy,jdbcType=VARCHAR}, #{parseModeConfig,jdbcType=LONGVARCHAR}, #{config,jdbcType=LONGVARCHAR}, - #{comment,jdbcType=LONGVARCHAR}) - - - insert into s2_plugin - - - id, - - - type, - - - domain, - - - pattern, - - - parse_mode, - - - name, - - - created_at, - - - created_by, - - - updated_at, - - - updated_by, - - - parse_mode_config, - - - config, - - - comment, - - - - - #{id,jdbcType=BIGINT}, - - - #{type,jdbcType=VARCHAR}, - - - #{domain,jdbcType=VARCHAR}, - - - #{pattern,jdbcType=VARCHAR}, - - - #{parseMode,jdbcType=VARCHAR}, - - - #{name,jdbcType=VARCHAR}, - - - #{createdAt,jdbcType=TIMESTAMP}, - - - #{createdBy,jdbcType=VARCHAR}, - - - #{updatedAt,jdbcType=TIMESTAMP}, - - - #{updatedBy,jdbcType=VARCHAR}, - - - #{parseModeConfig,jdbcType=LONGVARCHAR}, - - - #{config,jdbcType=LONGVARCHAR}, - - - #{comment,jdbcType=LONGVARCHAR}, - - - - - - update s2_plugin - - - type = #{type,jdbcType=VARCHAR}, - - - domain = #{domain,jdbcType=VARCHAR}, - - - pattern = #{pattern,jdbcType=VARCHAR}, - - - parse_mode = #{parseMode,jdbcType=VARCHAR}, - - - name = #{name,jdbcType=VARCHAR}, - - - created_at = #{createdAt,jdbcType=TIMESTAMP}, - - - created_by = #{createdBy,jdbcType=VARCHAR}, - - - updated_at = #{updatedAt,jdbcType=TIMESTAMP}, - - - updated_by = #{updatedBy,jdbcType=VARCHAR}, - - - parse_mode_config = #{parseModeConfig,jdbcType=LONGVARCHAR}, - - - config = #{config,jdbcType=LONGVARCHAR}, - - - comment = #{comment,jdbcType=LONGVARCHAR}, - - - where id = #{id,jdbcType=BIGINT} - - - update s2_plugin - set type = #{type,jdbcType=VARCHAR}, - domain = #{domain,jdbcType=VARCHAR}, - pattern = #{pattern,jdbcType=VARCHAR}, - parse_mode = #{parseMode,jdbcType=VARCHAR}, - name = #{name,jdbcType=VARCHAR}, - created_at = #{createdAt,jdbcType=TIMESTAMP}, - created_by = #{createdBy,jdbcType=VARCHAR}, - updated_at = #{updatedAt,jdbcType=TIMESTAMP}, - updated_by = #{updatedBy,jdbcType=VARCHAR}, - parse_mode_config = #{parseModeConfig,jdbcType=LONGVARCHAR}, - config = #{config,jdbcType=LONGVARCHAR}, - comment = #{comment,jdbcType=LONGVARCHAR} - where id = #{id,jdbcType=BIGINT} - - - update s2_plugin - set type = #{type,jdbcType=VARCHAR}, - domain = #{domain,jdbcType=VARCHAR}, - pattern = #{pattern,jdbcType=VARCHAR}, - parse_mode = #{parseMode,jdbcType=VARCHAR}, - name = #{name,jdbcType=VARCHAR}, - created_at = #{createdAt,jdbcType=TIMESTAMP}, - created_by = #{createdBy,jdbcType=VARCHAR}, - updated_at = #{updatedAt,jdbcType=TIMESTAMP}, - updated_by = #{updatedBy,jdbcType=VARCHAR} - where id = #{id,jdbcType=BIGINT} - + + + parse_mode_config + , config, comment + + + + + + delete + from s2_plugin + where id = #{id,jdbcType=BIGINT} + + + insert into s2_plugin (id, type, model, + pattern, parse_mode, name, + created_at, created_by, updated_at, + updated_by, parse_mode_config, config, + comment) + values (#{id,jdbcType=BIGINT}, #{type,jdbcType=VARCHAR}, #{model,jdbcType=VARCHAR}, + #{pattern,jdbcType=VARCHAR}, #{parseMode,jdbcType=VARCHAR}, + #{name,jdbcType=VARCHAR}, + #{createdAt,jdbcType=TIMESTAMP}, #{createdBy,jdbcType=VARCHAR}, + #{updatedAt,jdbcType=TIMESTAMP}, + #{updatedBy,jdbcType=VARCHAR}, #{parseModeConfig,jdbcType=LONGVARCHAR}, + #{config,jdbcType=LONGVARCHAR}, + #{comment,jdbcType=LONGVARCHAR}) + + + insert into s2_plugin + + + id, + + + type, + + + model, + + + pattern, + + + parse_mode, + + + name, + + + created_at, + + + created_by, + + + updated_at, + + + updated_by, + + + parse_mode_config, + + + config, + + + comment, + + + + + #{id,jdbcType=BIGINT}, + + + #{type,jdbcType=VARCHAR}, + + + #{model,jdbcType=VARCHAR}, + + + #{pattern,jdbcType=VARCHAR}, + + + #{parseMode,jdbcType=VARCHAR}, + + + #{name,jdbcType=VARCHAR}, + + + #{createdAt,jdbcType=TIMESTAMP}, + + + #{createdBy,jdbcType=VARCHAR}, + + + #{updatedAt,jdbcType=TIMESTAMP}, + + + #{updatedBy,jdbcType=VARCHAR}, + + + #{parseModeConfig,jdbcType=LONGVARCHAR}, + + + #{config,jdbcType=LONGVARCHAR}, + + + #{comment,jdbcType=LONGVARCHAR}, + + + + + + update s2_plugin + + + type = #{type,jdbcType=VARCHAR}, + + + model = #{model,jdbcType=VARCHAR}, + + + pattern = #{pattern,jdbcType=VARCHAR}, + + + parse_mode = #{parseMode,jdbcType=VARCHAR}, + + + name = #{name,jdbcType=VARCHAR}, + + + created_at = #{createdAt,jdbcType=TIMESTAMP}, + + + created_by = #{createdBy,jdbcType=VARCHAR}, + + + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + + + updated_by = #{updatedBy,jdbcType=VARCHAR}, + + + parse_mode_config = #{parseModeConfig,jdbcType=LONGVARCHAR}, + + + config = #{config,jdbcType=LONGVARCHAR}, + + + comment = #{comment,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update s2_plugin + set type = #{type,jdbcType=VARCHAR}, + model = #{model,jdbcType=VARCHAR}, + pattern = #{pattern,jdbcType=VARCHAR}, + parse_mode = #{parseMode,jdbcType=VARCHAR}, + name = #{name,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + parse_mode_config = #{parseModeConfig,jdbcType=LONGVARCHAR}, + config = #{config,jdbcType=LONGVARCHAR}, + comment = #{comment,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=BIGINT} + + + update s2_plugin + set type = #{type,jdbcType=VARCHAR}, + model = #{model,jdbcType=VARCHAR}, + pattern = #{pattern,jdbcType=VARCHAR}, + parse_mode = #{parseMode,jdbcType=VARCHAR}, + name = #{name,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + \ No newline at end of file diff --git a/chat/core/src/main/resources/sql.ddl/chat.sql b/chat/core/src/main/resources/sql.ddl/chat.sql index 7ba563391..c78549748 100644 --- a/chat/core/src/main/resources/sql.ddl/chat.sql +++ b/chat/core/src/main/resources/sql.ddl/chat.sql @@ -2,10 +2,10 @@ CREATE TABLE `chat_context` ( `chat_id` bigint(20) NOT NULL COMMENT 'context chat id', `modified_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'row modify time', - `user` varchar(64) DEFAULT NULL COMMENT 'row modify user', - `query_text` text DEFAULT NULL COMMENT 'query text', - `semantic_parse` text DEFAULT NULL COMMENT 'parse data', - `ext_data` text DEFAULT NULL COMMENT 'extend data', + `user` varchar(64) DEFAULT NULL COMMENT 'row modify user', + `query_text` text DEFAULT NULL COMMENT 'query text', + `semantic_parse` text DEFAULT NULL COMMENT 'parse data', + `ext_data` text DEFAULT NULL COMMENT 'extend data', PRIMARY KEY (`chat_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -40,7 +40,7 @@ CREATE TABLE `chat_query` `is_deleted` int(1) DEFAULT NULL, `module` varchar(30) DEFAULT NULL, `entity` mediumtext COMMENT '', - `chat_id` bigint(8) DEFAULT NULL COMMENT 'chat id', + `chat_id` bigint(8) DEFAULT NULL COMMENT 'chat id', `recommend` text, `aggregator` varchar(20) DEFAULT 'trend', `top_num` int(3) DEFAULT NULL, diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/application/search/SearchServiceImplTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/application/search/SearchServiceImplTest.java index 833d39e97..e6c815297 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/application/search/SearchServiceImplTest.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/application/search/SearchServiceImplTest.java @@ -10,6 +10,6 @@ class SearchServiceImplTest { } @Test - void filerMetricsByDomain() { + void filerMetricsByModel() { } } \ No newline at end of file diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/HanlpDictMapperTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/HanlpDictMapperTest.java index f96174c50..ae7582b59 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/HanlpDictMapperTest.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/HanlpDictMapperTest.java @@ -14,7 +14,7 @@ class HanlpDictMapperTest extends ContextTest { void map() { QueryReq queryRequest = new QueryReq(); queryRequest.setChatId(1); - queryRequest.setDomainId(2L); + queryRequest.setModelId(2L); queryRequest.setQueryText("supersonic按部门访问次数"); HanlpDictMapper hanlpDictMapper = new HanlpDictMapper(); hanlpDictMapper.map(new QueryContext(queryRequest)); 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/MapperHelperTest.java new file mode 100644 index 000000000..21909410e --- /dev/null +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/mapper/MapperHelperTest.java @@ -0,0 +1,16 @@ +package com.tencent.supersonic.chat.mapper; + + +import com.hankcs.hanlp.algorithm.EditDistance; +import org.junit.Assert; +import org.junit.jupiter.api.Test; + +class MapperHelperTest { + + + @Test + void edit() { + 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/test/context/ContextTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/ContextTest.java index c1d81d250..7f45a517a 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/ContextTest.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/ContextTest.java @@ -1,13 +1,13 @@ package com.tencent.supersonic.chat.test.context; -import com.tencent.supersonic.chat.persistence.repository.impl.ChatContextRepositoryImpl; -import com.tencent.supersonic.chat.utils.ComponentFactory; import com.tencent.supersonic.chat.persistence.mapper.ChatContextMapper; -import com.tencent.supersonic.knowledge.semantic.RemoteSemanticLayer; +import com.tencent.supersonic.chat.persistence.repository.impl.ChatContextRepositoryImpl; import com.tencent.supersonic.chat.test.ChatBizLauncher; +import com.tencent.supersonic.chat.utils.ComponentFactory; +import com.tencent.supersonic.knowledge.semantic.RemoteSemanticLayer; 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.query.service.QueryService; import org.junit.runner.RunWith; import org.slf4j.Logger; @@ -21,7 +21,7 @@ import org.springframework.web.client.RestTemplate; @MockBean(QueryService.class) @MockBean(DimensionService.class) @MockBean(MetricService.class) -@MockBean(DomainService.class) +@MockBean(ModelService.class) @MockBean(ChatContextMapper.class) @MockBean(RestTemplate.class) @MockBean(RemoteSemanticLayer.class) 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 c00439b44..700786744 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,26 +4,28 @@ import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; -import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.component.SemanticLayer; +import com.tencent.supersonic.chat.api.pojo.ChatContext; 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.*; +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.DomainSchemaResp; import com.tencent.supersonic.semantic.api.model.response.MetricResp; import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; -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.api.model.response.ModelSchemaResp; 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 java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -71,13 +73,13 @@ public class MockBeansConfiguration { // chaConfigRichDesc.setEntity(entityDesc); // when(httpSemanticLayer.getChatConfigRichInfo(anyLong())).thenReturn(chaConfigRichDesc); - DomainSchemaResp domainSchemaDesc = new DomainSchemaResp(); - domainSchemaDesc.setDimensions(dimensionDescs); - domainSchemaDesc.setMetrics(metricDescs); -// when(httpSemanticLayer.getDomainSchemaInfo(anyLong())).thenReturn(domainSchemaDesc); + ModelSchemaResp modelSchemaDesc = new ModelSchemaResp(); + modelSchemaDesc.setDimensions(dimensionDescs); + modelSchemaDesc.setMetrics(metricDescs); +// when(httpSemanticLayer.getModelSchemaInfo(anyLong())).thenReturn(modelSchemaDesc); } - public static void getDomainExtendMock(ConfigServiceImpl configService) { + public static void getModelExtendMock(ConfigServiceImpl configService) { DefaultMetricInfo defaultMetricInfo = new DefaultMetricInfo(); defaultMetricInfo.setUnit(3); defaultMetricInfo.setPeriod(Constants.DAY); @@ -86,7 +88,7 @@ public class MockBeansConfiguration { ChatConfigResp chaConfigDesc = new ChatConfigResp(); // chaConfigDesc.setDefaultMetrics(defaultMetricInfos); - when(configService.fetchConfigByDomainId(anyLong())).thenReturn(chaConfigDesc); + when(configService.fetchConfigByModelId(anyLong())).thenReturn(chaConfigDesc); } public static void dimensionDescBuild(DimensionService dimensionService, List dimensionDescs) { @@ -136,8 +138,8 @@ public class MockBeansConfiguration { //queryDimensionDescs @Bean - public DomainService getDomainService() { - return Mockito.mock(DomainService.class); + public ModelService getModelService() { + return Mockito.mock(ModelService.class); } @Bean @@ -146,7 +148,7 @@ public class MockBeansConfiguration { } @Bean - public ConfigServiceImpl getDomainExtendService() { + public ConfigServiceImpl getModelExtendService() { return Mockito.mock(ConfigServiceImpl.class); } diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/SemanticParseObjectHelper.java b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/SemanticParseObjectHelper.java index e60fde11c..bf1b7056e 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/SemanticParseObjectHelper.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/SemanticParseObjectHelper.java @@ -2,12 +2,11 @@ package com.tencent.supersonic.chat.test.context; import com.google.gson.Gson; import com.tencent.supersonic.chat.api.pojo.SchemaElement; -import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; -import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.common.pojo.DateConf; - +import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; +import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; @@ -31,7 +30,7 @@ public class SemanticParseObjectHelper { } private static SemanticParseInfo getSemanticParseInfo(SemanticParseJson semanticParseJson) { - Long domain = semanticParseJson.getDomain(); + Long model = semanticParseJson.getModel(); Set dimensionList = new LinkedHashSet(); Set metricList = new LinkedHashSet(); Set chatFilters = new LinkedHashSet(); @@ -43,10 +42,10 @@ public class SemanticParseObjectHelper { } for (String dim : semanticParseJson.getDimensions()) { - dimensionList.add(getDimension(dim, domain)); + dimensionList.add(getDimension(dim, model)); } for (String metric : semanticParseJson.getMetrics()) { - metricList.add(getMetric(metric, domain)); + metricList.add(getMetric(metric, model)); } SemanticParseInfo semanticParseInfo = new SemanticParseInfo(); @@ -91,13 +90,13 @@ public class SemanticParseObjectHelper { return null; } - private static SchemaElement getMetric(String bizName, Long domainId) { + private static SchemaElement getMetric(String bizName, Long modelId) { SchemaElement metric = new SchemaElement(); metric.setBizName(bizName); return metric; } - private static SchemaElement getDimension(String bizName, Long domainId) { + private static SchemaElement getDimension(String bizName, Long modelId) { SchemaElement dimension = new SchemaElement(); dimension.setBizName(bizName); return dimension; @@ -106,7 +105,7 @@ public class SemanticParseObjectHelper { @Data public static class SemanticParseJson { - private Long domain; + private Long model; private String queryMode; private AggregateTypeEnum aggregateType; private Integer day; diff --git a/chat/core/src/test/resources/db/chat-data-h2.sql b/chat/core/src/test/resources/db/chat-data-h2.sql index 0119e135e..b86f91a2b 100644 --- a/chat/core/src/test/resources/db/chat-data-h2.sql +++ b/chat/core/src/test/resources/db/chat-data-h2.sql @@ -1 +1,2 @@ -insert into chat_context (chat_id, modified_at , `user`, `query_text`, `semantic_parse` ,ext_data) VALUES(1, '2023-05-24 00:00:00', 'admin', '超音数访问次数', '', 'admin'); \ No newline at end of file +insert into chat_context (chat_id, modified_at, `user`, `query_text`, `semantic_parse`, ext_data) +VALUES (1, '2023-05-24 00:00:00', 'admin', '超音数访问次数', '', 'admin'); \ No newline at end of file diff --git a/chat/core/src/test/resources/db/chat-schema-h2.sql b/chat/core/src/test/resources/db/chat-schema-h2.sql index 004e09154..6eda5ad03 100644 --- a/chat/core/src/test/resources/db/chat-schema-h2.sql +++ b/chat/core/src/test/resources/db/chat-schema-h2.sql @@ -1,59 +1,59 @@ CREATE TABLE `chat_context` ( - `chat_id` BIGINT NOT NULL , -- context chat id - `modified_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , -- row modify time - `user` varchar(64) DEFAULT NULL , -- row modify user - `query_text` LONGVARCHAR DEFAULT NULL , -- query text - `semantic_parse` LONGVARCHAR DEFAULT NULL , -- parse data - `ext_data` LONGVARCHAR DEFAULT NULL , -- extend data + `chat_id` BIGINT NOT NULL, -- context chat id + `modified_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- row modify time + `user` varchar(64) DEFAULT NULL, -- row modify user + `query_text` LONGVARCHAR DEFAULT NULL, -- query text + `semantic_parse` LONGVARCHAR DEFAULT NULL, -- parse data + `ext_data` LONGVARCHAR DEFAULT NULL, -- extend data PRIMARY KEY (`chat_id`) ); CREATE TABLE `chat` ( - `chat_id` BIGINT NOT NULL ,-- 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', + `chat_id` BIGINT NOT NULL,-- 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 `chat_query` ( - `id` BIGINT NOT NULL ,--AUTO_INCREMENT, - `question_id` BIGINT DEFAULT NULL, + `id` BIGINT NOT NULL,--AUTO_INCREMENT, + `question_id` BIGINT DEFAULT NULL, `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `user_name` varchar(150) DEFAULT NULL COMMENT '', - `question` varchar(300) DEFAULT NULL COMMENT '', + `user_name` varchar(150) DEFAULT NULL COMMENT '', + `question` varchar(300) DEFAULT NULL COMMENT '', `query_result` LONGVARCHAR, - `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , + `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `state` int(1) DEFAULT NULL, - `data_content` varchar(30) DEFAULT NULL, - `name` varchar(100) DEFAULT NULL, + `data_content` varchar(30) DEFAULT NULL, + `name` varchar(100) DEFAULT NULL, `scene_type` int(2) DEFAULT NULL, `query_type` int(2) DEFAULT NULL, `is_deleted` int(1) DEFAULT NULL, - `module` varchar(30) DEFAULT NULL, + `module` varchar(30) DEFAULT NULL, `entity` LONGVARCHAR COMMENT '', - `chat_id` BIGINT DEFAULT NULL COMMENT 'chat id', + `chat_id` BIGINT DEFAULT NULL COMMENT 'chat id', `recommend` text, - `aggregator` varchar(20) DEFAULT 'trend', - `top_num` int DEFAULT NULL, - `start_time` varchar(30) DEFAULT NULL, - `end_time` varchar(30) DEFAULT NULL, + `aggregator` varchar(20) DEFAULT 'trend', + `top_num` int DEFAULT NULL, + `start_time` varchar(30) DEFAULT NULL, + `end_time` varchar(30) DEFAULT NULL, `compare_recommend` LONGVARCHAR, `compare_entity` LONGVARCHAR, `query_sql` LONGVARCHAR, - `columns` varchar(2000) DEFAULT NULL, + `columns` varchar(2000) DEFAULT NULL, `result_list` LONGVARCHAR, - `main_entity` varchar(5000) DEFAULT NULL, - `semantic_text` varchar(5000) DEFAULT NULL, - `score` int DEFAULT '0', - `feedback` varchar(1024) DEFAULT '', + `main_entity` varchar(5000) DEFAULT NULL, + `semantic_text` varchar(5000) DEFAULT NULL, + `score` int DEFAULT '0', + `feedback` varchar(1024) DEFAULT '', PRIMARY KEY (`id`) -) ; +); diff --git a/chat/knowledge/src/main/java/com/hankcs/hanlp/dictionary/CoreDictionary.java b/chat/knowledge/src/main/java/com/hankcs/hanlp/dictionary/CoreDictionary.java index e97c9f903..5f1e6af67 100644 --- a/chat/knowledge/src/main/java/com/hankcs/hanlp/dictionary/CoreDictionary.java +++ b/chat/knowledge/src/main/java/com/hankcs/hanlp/dictionary/CoreDictionary.java @@ -10,7 +10,6 @@ import com.hankcs.hanlp.corpus.io.IOUtil; import com.hankcs.hanlp.corpus.tag.Nature; import com.hankcs.hanlp.utility.Predefine; import com.hankcs.hanlp.utility.TextUtility; - import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.DataOutputStream; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/ApplicationStartedInit.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/ApplicationStartedInit.java index 5deb2dda1..41a881726 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/ApplicationStartedInit.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/ApplicationStartedInit.java @@ -1,9 +1,10 @@ package com.tencent.supersonic.knowledge; import com.tencent.supersonic.knowledge.dictionary.DictWord; -import com.tencent.supersonic.knowledge.service.SchemaService; import com.tencent.supersonic.knowledge.service.KnowledgeService; +import com.tencent.supersonic.knowledge.service.SchemaService; import com.tencent.supersonic.knowledge.service.WordService; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -12,8 +13,6 @@ import org.springframework.context.ApplicationListener; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import java.util.List; - @Slf4j @Component public class ApplicationStartedInit implements ApplicationListener { diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictConfig.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictConfig.java index a3a17e080..f81875e3c 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictConfig.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictConfig.java @@ -1,14 +1,13 @@ package com.tencent.supersonic.knowledge.dictionary; import java.util.List; - import lombok.Data; @Data public class DictConfig { - private Long domainId; + private Long modelId; private List dimValueInfoList; } \ No newline at end of file diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictUpdateMode.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictUpdateMode.java index df5cd9173..186fdd3c2 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictUpdateMode.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictUpdateMode.java @@ -3,7 +3,7 @@ package com.tencent.supersonic.knowledge.dictionary; public enum DictUpdateMode { OFFLINE_FULL("OFFLINE_FULL"), - OFFLINE_DOMAIN("OFFLINE_DOMAIN"), + OFFLINE_MODEL("OFFLINE_MODEL"), REALTIME_ADD("REALTIME_ADD"), REALTIME_DELETE("REALTIME_DELETE"), NOT_SUPPORT("NOT_SUPPORT"); diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictWordType.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictWordType.java index bcb391bf4..8f40ed4c0 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictWordType.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DictWordType.java @@ -12,6 +12,7 @@ public enum DictWordType { VALUE("value"), DOMAIN("dm"), + MODEL("model"), ENTITY("entity"), NUMBER("m"), @@ -31,7 +32,6 @@ public enum DictWordType { } - public static DictWordType getNatureType(String nature) { if (StringUtils.isEmpty(nature) || !nature.startsWith(NATURE_SPILT)) { return null; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValue2DictCommand.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValue2DictCommand.java index 9a2821bdf..c5d56634a 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValue2DictCommand.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/DimValue2DictCommand.java @@ -4,8 +4,6 @@ package com.tencent.supersonic.knowledge.dictionary; import java.util.HashMap; import java.util.List; import java.util.Map; - -import com.tencent.supersonic.knowledge.dictionary.DictUpdateMode; import lombok.Data; @Data @@ -13,7 +11,7 @@ public class DimValue2DictCommand { private DictUpdateMode updateMode; - private List domainIds; + private List modelIds; - private Map> domainAndDimPair = new HashMap<>(); + private Map> modelAndDimPair = new HashMap<>(); } \ No newline at end of file diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/HadoopFileIOAdapter.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/HadoopFileIOAdapter.java index f948c2817..0230020a4 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/HadoopFileIOAdapter.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/HadoopFileIOAdapter.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; - import lombok.extern.slf4j.Slf4j; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MapResult.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MapResult.java index aa2a7e9ab..bcd644ae0 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MapResult.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MapResult.java @@ -1,8 +1,8 @@ package com.tencent.supersonic.knowledge.dictionary; +import com.google.common.base.Objects; import java.io.Serializable; import java.util.List; -import java.util.Objects; import lombok.Data; import lombok.ToString; @@ -36,13 +36,13 @@ public class MapResult implements Serializable { if (o == null || getClass() != o.getClass()) { return false; } - MapResult that = (MapResult) o; - return Objects.equals(name, that.name) && Objects.equals(natures, that.natures); + MapResult mapResult = (MapResult) o; + return Objects.equal(name, mapResult.name) && Objects.equal(natures, mapResult.natures); } @Override public int hashCode() { - return Objects.hash(name, natures); + return Objects.hashCode(name, natures); } public void setOffset(int offset) { diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MultiCustomDictionary.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MultiCustomDictionary.java index d2b732ca8..6a48cee28 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MultiCustomDictionary.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/MultiCustomDictionary.java @@ -16,7 +16,6 @@ import com.hankcs.hanlp.utility.Predefine; import com.hankcs.hanlp.utility.TextUtility; import com.tencent.supersonic.knowledge.service.SearchService; import com.tencent.supersonic.knowledge.utils.HanlpHelper; - import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.DataOutputStream; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/BaseWordBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/BaseWordBuilder.java index a600b972c..a0e504ad6 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/BaseWordBuilder.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/BaseWordBuilder.java @@ -1,11 +1,10 @@ package com.tencent.supersonic.knowledge.dictionary.builder; -import java.util.ArrayList; -import java.util.List; - import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.knowledge.dictionary.DictWord; import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import java.util.ArrayList; +import java.util.List; import lombok.extern.slf4j.Slf4j; /** diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DimensionWordBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DimensionWordBuilder.java index 9bf4718b9..f8d5186bd 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DimensionWordBuilder.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DimensionWordBuilder.java @@ -1,12 +1,10 @@ package com.tencent.supersonic.knowledge.dictionary.builder; import com.google.common.collect.Lists; - -import java.util.List; - import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.knowledge.dictionary.DictWord; import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -37,7 +35,7 @@ public class DimensionWordBuilder extends BaseWordBuilder { private DictWord getOnwWordNature(String word, SchemaElement schemaElement, boolean isSuffix) { DictWord dictWord = new DictWord(); dictWord.setWord(word); - Long domainId = schemaElement.getDomain(); + Long domainId = schemaElement.getModel(); String nature = DictWordType.NATURE_SPILT + domainId + DictWordType.NATURE_SPILT + schemaElement.getId() + DictWordType.DIMENSION.getType(); if (isSuffix) { diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DomainWordBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DomainWordBuilder.java index f4c037bfa..83d6da45d 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DomainWordBuilder.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/DomainWordBuilder.java @@ -1,12 +1,10 @@ package com.tencent.supersonic.knowledge.dictionary.builder; import com.google.common.collect.Lists; - -import java.util.List; - import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.knowledge.dictionary.DictWord; import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -22,8 +20,8 @@ public class DomainWordBuilder extends BaseWordBuilder { List result = Lists.newArrayList(); DictWord dictWord = new DictWord(); dictWord.setWord(word); - Long domainId = schemaElement.getDomain(); - String nature = DictWordType.NATURE_SPILT + domainId; + Long modelId = schemaElement.getModel(); + String nature = DictWordType.NATURE_SPILT + modelId; dictWord.setNatureWithFrequency(String.format("%s " + DEFAULT_FREQUENCY, nature)); result.add(dictWord); return result; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/EntityWordBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/EntityWordBuilder.java index cd5f60c68..c8e659562 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/EntityWordBuilder.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/EntityWordBuilder.java @@ -1,13 +1,11 @@ package com.tencent.supersonic.knowledge.dictionary.builder; import com.google.common.collect.Lists; - -import java.util.List; -import java.util.Objects; - import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.knowledge.dictionary.DictWord; import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import java.util.List; +import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -27,7 +25,7 @@ public class EntityWordBuilder extends BaseWordBuilder { return result; } - Long domain = schemaElement.getDomain(); + Long domain = schemaElement.getModel(); String nature = DictWordType.NATURE_SPILT + domain + DictWordType.NATURE_SPILT + schemaElement.getId() + DictWordType.ENTITY.getType(); diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/MetricWordBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/MetricWordBuilder.java index 9802d4243..01fc833e0 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/MetricWordBuilder.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/MetricWordBuilder.java @@ -1,12 +1,10 @@ package com.tencent.supersonic.knowledge.dictionary.builder; import com.google.common.collect.Lists; - -import java.util.List; - import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.knowledge.dictionary.DictWord; import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -36,11 +34,11 @@ public class MetricWordBuilder extends BaseWordBuilder { private DictWord getOnwWordNature(String word, SchemaElement schemaElement, boolean isSuffix) { DictWord dictWord = new DictWord(); dictWord.setWord(word); - Long domainId = schemaElement.getDomain(); - String nature = DictWordType.NATURE_SPILT + domainId + DictWordType.NATURE_SPILT + schemaElement.getId() + Long modelId = schemaElement.getModel(); + String nature = DictWordType.NATURE_SPILT + modelId + DictWordType.NATURE_SPILT + schemaElement.getId() + DictWordType.METRIC.getType(); if (isSuffix) { - nature = DictWordType.NATURE_SPILT + domainId + DictWordType.NATURE_SPILT + schemaElement.getId() + nature = DictWordType.NATURE_SPILT + modelId + DictWordType.NATURE_SPILT + schemaElement.getId() + DictWordType.SUFFIX.getType() + DictWordType.METRIC.getType(); } dictWord.setNatureWithFrequency(String.format("%s " + DEFAULT_FREQUENCY, nature)); diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/ValueWordBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/ValueWordBuilder.java index d08c1f6be..1d51f12f3 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/ValueWordBuilder.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/dictionary/builder/ValueWordBuilder.java @@ -1,13 +1,11 @@ package com.tencent.supersonic.knowledge.dictionary.builder; import com.google.common.collect.Lists; - -import java.util.List; -import java.util.Objects; - import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.knowledge.dictionary.DictWord; import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import java.util.List; +import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -27,8 +25,8 @@ public class ValueWordBuilder extends BaseWordBuilder { schemaElement.getAlias().stream().forEach(value -> { DictWord dictWord = new DictWord(); - Long domainId = schemaElement.getDomain(); - String nature = DictWordType.NATURE_SPILT + domainId + DictWordType.NATURE_SPILT + schemaElement.getId(); + Long modelId = schemaElement.getModel(); + String nature = DictWordType.NATURE_SPILT + modelId + DictWordType.NATURE_SPILT + schemaElement.getId(); dictWord.setNatureWithFrequency(String.format("%s " + DEFAULT_FREQUENCY, nature)); dictWord.setWord(value); result.add(dictWord); 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 29e72182c..50fddcace 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 @@ -2,8 +2,6 @@ package com.tencent.supersonic.knowledge.dictionary.builder; import com.tencent.supersonic.knowledge.dictionary.DictWordType; -import com.tencent.supersonic.knowledge.dictionary.builder.*; - import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/dataobject/DictConfDO.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/dataobject/DictConfDO.java index c95c9f7fe..bfb17c838 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/dataobject/DictConfDO.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/dataobject/DictConfDO.java @@ -8,7 +8,7 @@ public class DictConfDO { private Long id; - private Long domainId; + private Long modelId; private String dimValueInfos; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictConfMapper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictConfMapper.java index f8215d211..76043ff81 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictConfMapper.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictConfMapper.java @@ -13,5 +13,5 @@ public interface DictConfMapper { Boolean upsertDictInfo(DictConfDO dictConfDO); - DictConfDO getDictInfoByDomainId(Long domainId); + DictConfDO getDictInfoByModelId(Long modelId); } diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictTaskMapper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictTaskMapper.java index a63926643..df1faca99 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictTaskMapper.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/mapper/DictTaskMapper.java @@ -1,7 +1,7 @@ package com.tencent.supersonic.knowledge.persistence.mapper; -import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; import com.tencent.supersonic.knowledge.dictionary.DictTaskFilter; +import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; import java.util.List; import org.apache.ibatis.annotations.Mapper; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepository.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepository.java index f7e00928c..fa54a6211 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepository.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepository.java @@ -1,10 +1,10 @@ package com.tencent.supersonic.knowledge.persistence.repository; -import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; import com.tencent.supersonic.knowledge.dictionary.DictConfig; import com.tencent.supersonic.knowledge.dictionary.DictTaskFilter; import com.tencent.supersonic.knowledge.dictionary.DimValueDictInfo; +import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; import java.util.List; public interface DictRepository { @@ -15,5 +15,5 @@ public interface DictRepository { List searchDictTaskList(DictTaskFilter filter); - DictConfig getDictInfoByDomainId(Long domainId); + DictConfig getDictInfoByModelId(Long modelId); } diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepositoryImpl.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepositoryImpl.java index 308f6b1d5..422202073 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepositoryImpl.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/persistence/repository/DictRepositoryImpl.java @@ -1,14 +1,14 @@ package com.tencent.supersonic.knowledge.persistence.repository; import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; -import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; -import com.tencent.supersonic.knowledge.utils.DictTaskConverter; -import com.tencent.supersonic.knowledge.persistence.dataobject.DictConfDO; import com.tencent.supersonic.knowledge.dictionary.DictConfig; import com.tencent.supersonic.knowledge.dictionary.DictTaskFilter; import com.tencent.supersonic.knowledge.dictionary.DimValueDictInfo; +import com.tencent.supersonic.knowledge.persistence.dataobject.DictConfDO; +import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; import com.tencent.supersonic.knowledge.persistence.mapper.DictConfMapper; import com.tencent.supersonic.knowledge.persistence.mapper.DictTaskMapper; +import com.tencent.supersonic.knowledge.utils.DictTaskConverter; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -67,8 +67,8 @@ public class DictRepositoryImpl implements DictRepository { } @Override - public DictConfig getDictInfoByDomainId(Long domainId) { - DictConfDO dictConfDO = dictConfMapper.getDictInfoByDomainId(domainId); + public DictConfig getDictInfoByModelId(Long modelId) { + DictConfDO dictConfDO = dictConfMapper.getDictInfoByModelId(modelId); if (Objects.isNull(dictConfDO)) { return null; } diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/BaseSemanticLayer.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/BaseSemanticLayer.java index 2ef4b38b4..062d64136 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/BaseSemanticLayer.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/BaseSemanticLayer.java @@ -3,9 +3,9 @@ package com.tencent.supersonic.knowledge.semantic; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.common.pojo.ResultData; -import com.tencent.supersonic.semantic.api.model.response.DomainSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; import java.util.ArrayList; import java.util.List; @@ -19,7 +19,7 @@ import org.springframework.util.CollectionUtils; @Slf4j public abstract class BaseSemanticLayer implements SemanticLayer { - protected final Cache> domainSchemaCache = + protected final Cache> modelSchemaCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build(); protected ParameterizedTypeReference> structTypeRef = @@ -27,48 +27,48 @@ public abstract class BaseSemanticLayer implements SemanticLayer { }; @SneakyThrows - public List fetchDomainSchema(List ids, Boolean cacheEnable) { + public List fetchModelSchema(List ids, Boolean cacheEnable) { if (cacheEnable) { - return domainSchemaCache.get(String.valueOf(ids), () -> { - List data = doFetchDomainSchema(ids); + return modelSchemaCache.get(String.valueOf(ids), () -> { + List data = doFetchModelSchema(ids); return data; }); } - List data = doFetchDomainSchema(ids); + List data = doFetchModelSchema(ids); return data; } @Override - public DomainSchema getDomainSchema(Long domain, Boolean cacheEnable) { + public ModelSchema getModelSchema(Long domain, Boolean cacheEnable) { List ids = new ArrayList<>(); ids.add(domain); - List domainSchemaResps = fetchDomainSchema(ids, cacheEnable); - if (!CollectionUtils.isEmpty(domainSchemaResps)) { - Optional domainSchemaResp = domainSchemaResps.stream() + List modelSchemaResps = fetchModelSchema(ids, cacheEnable); + if (!CollectionUtils.isEmpty(modelSchemaResps)) { + Optional modelSchemaResp = modelSchemaResps.stream() .filter(d -> d.getId().equals(domain)).findFirst(); - if (domainSchemaResp.isPresent()) { - DomainSchemaResp domainSchema = domainSchemaResp.get(); - return DomainSchemaBuilder.build(domainSchema); + if (modelSchemaResp.isPresent()) { + ModelSchemaResp modelSchema = modelSchemaResp.get(); + return ModelSchemaBuilder.build(modelSchema); } } return null; } @Override - public List getDomainSchema() { - return getDomainSchema(new ArrayList<>()); + public List getModelSchema() { + return getModelSchema(new ArrayList<>()); } @Override - public List getDomainSchema(List ids) { - List domainSchemaList = new ArrayList<>(); + public List getModelSchema(List ids) { + List domainSchemaList = new ArrayList<>(); - for(DomainSchemaResp resp : fetchDomainSchema(ids, true)) { - domainSchemaList.add(DomainSchemaBuilder.build(resp)); + for (ModelSchemaResp resp : fetchModelSchema(ids, true)) { + domainSchemaList.add(ModelSchemaBuilder.build(resp)); } return domainSchemaList; } - protected abstract List doFetchDomainSchema(List ids); + protected abstract List doFetchModelSchema(List ids); } diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DefaultSemanticConfig.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DefaultSemanticConfig.java index 6f55fb74f..b8df82afa 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DefaultSemanticConfig.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DefaultSemanticConfig.java @@ -1,10 +1,8 @@ package com.tencent.supersonic.knowledge.semantic; import lombok.Data; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; @Configuration @Data @@ -22,19 +20,19 @@ public class DefaultSemanticConfig { @Value("${searchByStruct.path:/api/semantic/query/sql}") private String searchBySqlPath; - @Value("${fetchDomainSchemaPath.path:/api/semantic/schema}") - private String fetchDomainSchemaPath; + @Value("${fetchModelSchemaPath.path:/api/semantic/schema}") + private String fetchModelSchemaPath; - @Value("${fetchDomainList.path:/api/semantic/schema/dimension/page}") + @Value("${fetchModelList.path:/api/semantic/schema/dimension/page}") private String fetchDimensionPagePath; - @Value("${fetchDomainList.path:/api/semantic/schema/metric/page}") + @Value("${fetchModelList.path:/api/semantic/schema/metric/page}") private String fetchMetricPagePath; - @Value("${fetchDomainList.path:/api/semantic/schema/domain/list}") + @Value("${fetchModelList.path:/api/semantic/schema/domain/list}") private String fetchDomainListPath; - @Value("${fetchDomainList.path:/api/semantic/schema/domain/view/list}") - private String fetchDomainViewListPath; + @Value("${fetchModelList.path:/api/semantic/schema/model/list}") + private String fetchModelListPath; } 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 168d448e6..52efe536b 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 @@ -2,17 +2,18 @@ package com.tencent.supersonic.knowledge.semantic; 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.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.semantic.api.model.request.DomainSchemaFilterReq; +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.DomainSchemaResp; 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.query.request.QueryDslReq; import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; @@ -20,6 +21,7 @@ import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; 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.query.service.QueryService; import com.tencent.supersonic.semantic.query.service.SchemaService; import java.util.List; @@ -31,6 +33,7 @@ public class LocalSemanticLayer extends BaseSemanticLayer { private SchemaService schemaService; private S2ThreadContext s2ThreadContext; private DomainService domainService; + private ModelService modelService; private DimensionService dimensionService; private MetricService metricService; @@ -72,27 +75,23 @@ public class LocalSemanticLayer extends BaseSemanticLayer { } @Override - public List doFetchDomainSchema(List ids) { - DomainSchemaFilterReq filter = new DomainSchemaFilterReq(); - filter.setDomainIds(ids); - User user = new User(1L, "admin", "admin", "admin@email"); - schemaService = ContextUtils.getBean(SchemaService.class); - return schemaService.fetchDomainSchema(filter, user); - } - @Override - public List getDomainListForViewer() { - s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class); - ThreadContext threadContext = s2ThreadContext.get(); - domainService = ContextUtils.getBean(DomainService.class); - return domainService.getDomainListForViewer(threadContext.getUserName()); + public List doFetchModelSchema(List ids) { + ModelSchemaFilterReq filter = new ModelSchemaFilterReq(); + filter.setModelIds(ids); + modelService = ContextUtils.getBean(ModelService.class); + return modelService.fetchModelSchema(filter); } @Override - public List getDomainListForAdmin() { - domainService = ContextUtils.getBean(DomainService.class); - s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class); - ThreadContext threadContext = s2ThreadContext.get(); - return domainService.getDomainListForAdmin(threadContext.getUserName()); + public List getDomainList(User user) { + schemaService = ContextUtils.getBean(SchemaService.class); + return schemaService.getDomainList(user); + } + + @Override + public List getModelList(AuthType authType, Long domainId, User user) { + schemaService = ContextUtils.getBean(SchemaService.class); + return schemaService.getModelList(user, authType, domainId); } @Override @@ -102,9 +101,9 @@ public class LocalSemanticLayer extends BaseSemanticLayer { } @Override - public PageInfo getMetricPage(PageMetricReq pageMetricCmd) { + public PageInfo getMetricPage(PageMetricReq pageMetricReq) { metricService = ContextUtils.getBean(MetricService.class); - return metricService.queryMetric(pageMetricCmd); + return metricService.queryMetric(pageMetricReq); } } diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DomainSchemaBuilder.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/ModelSchemaBuilder.java similarity index 84% rename from chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DomainSchemaBuilder.java rename to chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/ModelSchemaBuilder.java index 0417830a8..81620eaf3 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/DomainSchemaBuilder.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/semantic/ModelSchemaBuilder.java @@ -1,39 +1,44 @@ package com.tencent.supersonic.knowledge.semantic; -import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; import com.tencent.supersonic.semantic.api.model.pojo.Entity; import com.tencent.supersonic.semantic.api.model.response.DimSchemaResp; -import com.tencent.supersonic.semantic.api.model.response.DomainSchemaResp; import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; +import java.util.ArrayList; +import java.util.Arrays; +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 org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; import org.springframework.util.CollectionUtils; -import java.util.*; -import java.util.stream.Collectors; +public class ModelSchemaBuilder { -public class DomainSchemaBuilder { - - public static DomainSchema build(DomainSchemaResp resp) { - DomainSchema domainSchema = new DomainSchema(); + public static ModelSchema build(ModelSchemaResp resp) { + ModelSchema domainSchema = new ModelSchema(); SchemaElement domain = SchemaElement.builder() - .domain(resp.getId()) + .model(resp.getId()) .id(resp.getId()) .name(resp.getName()) .bizName(resp.getBizName()) - .type(SchemaElementType.DOMAIN) + .type(SchemaElementType.MODEL) .build(); - domainSchema.setDomain(domain); + domainSchema.setModel(domain); Set metrics = new HashSet<>(); for (MetricSchemaResp metric : resp.getMetrics()) { SchemaElement metricToAdd = SchemaElement.builder() - .domain(resp.getId()) + .model(resp.getId()) .id(metric.getId()) .name(metric.getName()) .bizName(metric.getBizName()) @@ -70,7 +75,7 @@ public class DomainSchemaBuilder { } SchemaElement dimToAdd = SchemaElement.builder() - .domain(resp.getId()) + .model(resp.getId()) .id(dim.getId()) .name(dim.getName()) .bizName(dim.getBizName()) @@ -87,9 +92,8 @@ public class DomainSchemaBuilder { dimensions.add(alisDimToAdd); } - SchemaElement dimValueToAdd = SchemaElement.builder() - .domain(resp.getId()) + .model(resp.getId()) .id(dim.getId()) .name(dim.getName()) .bizName(dim.getBizName()) @@ -102,14 +106,14 @@ public class DomainSchemaBuilder { domainSchema.getDimensions().addAll(dimensions); domainSchema.getDimensionValues().addAll(dimensionValues); - Entity entity = resp.getEntity(); if (Objects.nonNull(entity)) { SchemaElement entityElement = new SchemaElement(); if (!CollectionUtils.isEmpty(entity.getNames()) && Objects.nonNull(entity.getEntityId())) { Map idAndDimPair = dimensions.stream() - .collect(Collectors.toMap(SchemaElement::getId, schemaElement -> schemaElement,(k1,k2)->k2)); + .collect( + Collectors.toMap(SchemaElement::getId, schemaElement -> schemaElement, (k1, k2) -> k2)); if (idAndDimPair.containsKey(entity.getEntityId())) { entityElement = idAndDimPair.get(entity.getEntityId()); entityElement.setType(SchemaElementType.ENTITY); 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 10be3de0a..944a485d7 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,5 +1,10 @@ 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; @@ -8,29 +13,34 @@ 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.semantic.api.model.request.DomainSchemaFilterReq; +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.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.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.*; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Objects; import java.util.concurrent.TimeUnit; - import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -40,17 +50,14 @@ 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.*; -import static com.tencent.supersonic.common.pojo.Constants.PAGESIZE_LOWER; - @Slf4j public class RemoteSemanticLayer extends BaseSemanticLayer { - @Autowired + private S2ThreadContext s2ThreadContext; - @Autowired + private AuthenticationConfig authenticationConfig; - private static final Cache> domainSchemaCache = + private static final Cache> domainSchemaCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build(); private ParameterizedTypeReference> structTypeRef = new ParameterizedTypeReference>() { @@ -109,7 +116,8 @@ public class RemoteSemanticLayer extends BaseSemanticLayer { throw new CommonException(responseBody.getCode(), responseBody.getMsg()); } - public List doFetchDomainSchema(List ids) { + @Override + public List doFetchModelSchema(List ids) { HttpHeaders headers = new HttpHeaders(); headers.set(UserConstants.INTERNAL, TRUE_LOWER); headers.setContentType(MediaType.APPLICATION_JSON); @@ -117,46 +125,52 @@ public class RemoteSemanticLayer extends BaseSemanticLayer { DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); URI requestUrl = UriComponentsBuilder.fromHttpUrl( - defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDomainSchemaPath()).build() + defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchModelSchemaPath()).build() .encode().toUri(); - DomainSchemaFilterReq filter = new DomainSchemaFilterReq(); - filter.setDomainIds(ids); - ParameterizedTypeReference>> responseTypeRef = - new ParameterizedTypeReference>>() { + ModelSchemaFilterReq filter = new ModelSchemaFilterReq(); + filter.setModelIds(ids); + ParameterizedTypeReference>> responseTypeRef = + new ParameterizedTypeReference>>() { }; HttpEntity entity = new HttpEntity<>(JSON.toJSONString(filter), headers); try { RestTemplate restTemplate = ContextUtils.getBean(RestTemplate.class); - ResponseEntity>> responseEntity = restTemplate.exchange( + ResponseEntity>> responseEntity = restTemplate.exchange( requestUrl, HttpMethod.POST, entity, responseTypeRef); - ResultData> responseBody = responseEntity.getBody(); - log.debug("ApiResponse responseBody:{}", responseBody); + ResultData> responseBody = responseEntity.getBody(); + log.debug("ApiResponse responseBody:{}", responseBody); if (ReturnCode.SUCCESS.getCode() == responseBody.getCode()) { - List data = responseBody.getData(); + List data = responseBody.getData(); return data; } } catch (Exception e) { - throw new RuntimeException("fetchDomainSchema interface error", e); + throw new RuntimeException("fetchModelSchema interface error", e); } - throw new RuntimeException("fetchDomainSchema interface error"); + throw new RuntimeException("fetchModelSchema interface error"); } @Override - public List getDomainListForViewer() { + public List getDomainList(User user) { DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); - Object domainDescListObject = fetchHttpResult(defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDomainViewListPath(), null, HttpMethod.GET); - List domainDescList = JsonUtil.toList(JsonUtil.toString(domainDescListObject), DomainResp.class); - return domainDescList; + Object domainDescListObject = fetchHttpResult( + defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDomainListPath(), null, + HttpMethod.GET); + return JsonUtil.toList(JsonUtil.toString(domainDescListObject), DomainResp.class); } @Override - public List getDomainListForAdmin() { + public List getModelList(AuthType authType, Long domainId, User user) { + if (domainId == null) { + domainId = 0L; + } DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); - Object domainDescListObject = fetchHttpResult(defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDomainListPath(), null, HttpMethod.GET); - List domainDescList = JsonUtil.toList(JsonUtil.toString(domainDescListObject), DomainResp.class); - return domainDescList; + String url = String.format("%s?domainId=%s&authType=%s", + defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchModelListPath() + , domainId, authType.toString()); + Object domainDescListObject = fetchHttpResult(url, null, HttpMethod.GET); + return JsonUtil.toList(JsonUtil.toString(domainDescListObject), ModelResp.class); } public Object fetchHttpResult(String url, String bodyJson, HttpMethod httpMethod) { @@ -173,15 +187,15 @@ public class RemoteSemanticLayer extends BaseSemanticLayer { ResponseEntity> responseEntity = restTemplate.exchange(requestUrl, httpMethod, entity, responseTypeRef); ResultData responseBody = responseEntity.getBody(); - log.debug("ApiResponse responseBody:{}", responseBody); + log.debug("ApiResponse responseBody:{}", responseBody); if (ReturnCode.SUCCESS.getCode() == responseBody.getCode()) { Object data = responseBody.getData(); return data; } } catch (Exception e) { - throw new RuntimeException("fetchDomainSchema interface error", e); + throw new RuntimeException("fetchModelSchema interface error", e); } - throw new RuntimeException("fetchDomainSchema interface error"); + throw new RuntimeException("fetchModelSchema interface error"); } public void fillToken(HttpHeaders headers) { @@ -203,7 +217,9 @@ public class RemoteSemanticLayer extends BaseSemanticLayer { String body = JsonUtil.toString(pageMetricCmd); DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); log.info("url:{}", defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchMetricPagePath()); - Object dimensionListObject = fetchHttpResult(defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchMetricPagePath(), body, HttpMethod.POST); + Object dimensionListObject = fetchHttpResult( + defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchMetricPagePath(), body, + HttpMethod.POST); LinkedHashMap map = (LinkedHashMap) dimensionListObject; PageInfo metricDescObjectPageInfo = generatePageInfo(map); PageInfo metricDescPageInfo = new PageInfo<>(); @@ -216,7 +232,9 @@ public class RemoteSemanticLayer extends BaseSemanticLayer { public PageInfo getDimensionPage(PageDimensionReq pageDimensionCmd) { String body = JsonUtil.toString(pageDimensionCmd); DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class); - Object dimensionListObject = fetchHttpResult(defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getFetchDimensionPagePath(), body, HttpMethod.POST); + Object dimensionListObject = fetchHttpResult( + 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/KnowledgeService.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeService.java index ff26cad82..a1b9616b7 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeService.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeService.java @@ -1,7 +1,6 @@ package com.tencent.supersonic.knowledge.service; import com.tencent.supersonic.knowledge.dictionary.DictWord; - import java.util.List; public interface KnowledgeService { diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeServiceImpl.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeServiceImpl.java index 1f089a5d4..5bbb6b540 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeServiceImpl.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/KnowledgeServiceImpl.java @@ -3,10 +3,8 @@ package com.tencent.supersonic.knowledge.service; import com.tencent.supersonic.knowledge.dictionary.DictWord; import com.tencent.supersonic.knowledge.dictionary.DictWordType; import com.tencent.supersonic.knowledge.utils.HanlpHelper; - import java.util.List; import java.util.stream.Collectors; - import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; 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 05a4602be..4113d4b60 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 @@ -4,14 +4,13 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import com.tencent.supersonic.chat.api.pojo.DomainSchema; +import com.tencent.supersonic.chat.api.pojo.ModelSchema; import com.tencent.supersonic.chat.api.pojo.SemanticSchema; import com.tencent.supersonic.knowledge.utils.ComponentFactory; +import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.util.concurrent.TimeUnit; - @Service @Slf4j public class SchemaService { @@ -28,13 +27,13 @@ public class SchemaService { @Override public SemanticSchema load(String key) { log.info("load getDomainSchemaInfo cache [{}]", key); - return new SemanticSchema(semanticLayer.getDomainSchema()); + return new SemanticSchema(semanticLayer.getModelSchema()); } } ); - public DomainSchema getDomainSchema(Long id) { - return semanticLayer.getDomainSchema(id, true); + public ModelSchema getModelSchema(Long id) { + return semanticLayer.getModelSchema(id, true); } public SemanticSchema getSemanticSchema() { 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 de5139dae..1c865f6a9 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 @@ -5,9 +5,9 @@ import com.hankcs.hanlp.collection.trie.bintrie.BinTrie; import com.hankcs.hanlp.corpus.tag.Nature; import com.hankcs.hanlp.dictionary.CoreDictionary; import com.tencent.supersonic.knowledge.dictionary.DictWord; -import com.tencent.supersonic.knowledge.dictionary.MapResult; import com.tencent.supersonic.knowledge.dictionary.DictWordType; - +import com.tencent.supersonic.knowledge.dictionary.DictionaryAttributeUtil; +import com.tencent.supersonic.knowledge.dictionary.MapResult; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -15,8 +15,6 @@ import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import java.util.stream.Collectors; - -import com.tencent.supersonic.knowledge.dictionary.DictionaryAttributeUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/WordService.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/WordService.java index 0ff33d425..8748104b7 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/WordService.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/service/WordService.java @@ -6,11 +6,9 @@ import com.tencent.supersonic.chat.api.pojo.SemanticSchema; import com.tencent.supersonic.knowledge.dictionary.DictWord; import com.tencent.supersonic.knowledge.dictionary.DictWordType; import com.tencent.supersonic.knowledge.dictionary.builder.WordBuilderFactory; - +import com.tencent.supersonic.knowledge.utils.ComponentFactory; import java.util.ArrayList; import java.util.List; - -import com.tencent.supersonic.knowledge.utils.ComponentFactory; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -23,13 +21,13 @@ public class WordService { public List getAllDictWords() { SemanticLayer semanticLayer = ComponentFactory.getSemanticLayer(); - SemanticSchema semanticSchema = new SemanticSchema(semanticLayer.getDomainSchema()); + SemanticSchema semanticSchema = new SemanticSchema(semanticLayer.getModelSchema()); List words = new ArrayList<>(); addWordsByType(DictWordType.DIMENSION, semanticSchema.getDimensions(), words); addWordsByType(DictWordType.METRIC, semanticSchema.getMetrics(), words); - addWordsByType(DictWordType.DOMAIN, semanticSchema.getDomains(), words); + addWordsByType(DictWordType.DOMAIN, semanticSchema.getModels(), words); addWordsByType(DictWordType.ENTITY, semanticSchema.getEntities(), words); addWordsByType(DictWordType.VALUE, semanticSchema.getDimensionValues(), words); diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/ComponentFactory.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/ComponentFactory.java index 532f58203..2582515cf 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/ComponentFactory.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/ComponentFactory.java @@ -1,10 +1,9 @@ package com.tencent.supersonic.knowledge.utils; import com.tencent.supersonic.chat.api.component.SemanticLayer; -import org.springframework.core.io.support.SpringFactoriesLoader; - import java.util.List; import java.util.Objects; +import org.springframework.core.io.support.SpringFactoriesLoader; public class ComponentFactory { diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/DictTaskConverter.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/DictTaskConverter.java index 0e4b8f1de..1e60f2eea 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/DictTaskConverter.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/DictTaskConverter.java @@ -9,7 +9,6 @@ import com.tencent.supersonic.knowledge.dictionary.DimValue2DictCommand; import com.tencent.supersonic.knowledge.dictionary.DimValueInfo; import com.tencent.supersonic.knowledge.persistence.dataobject.DictConfDO; import com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO; - import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Date; @@ -39,7 +38,7 @@ public class DictTaskConverter { public static DictConfig dictConfPO2Config(DictConfDO dictConfDO) { DictConfig dictConfig = new DictConfig(); - dictConfig.setDomainId(dictConfDO.getDomainId()); + dictConfig.setModelId(dictConfDO.getModelId()); List dimValueInfos = JsonUtil.toList(dictConfDO.getDimValueInfos(), DimValueInfo.class); dictConfig.setDimValueInfoList(dimValueInfos); return dictConfig; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/FileHelper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/FileHelper.java index 3ad816b90..b23785b9e 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/FileHelper.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/FileHelper.java @@ -7,7 +7,6 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; - import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HanlpHelper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HanlpHelper.java index 89987b103..587e120ba 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HanlpHelper.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HanlpHelper.java @@ -7,18 +7,17 @@ import com.hankcs.hanlp.dictionary.CoreDictionary; import com.hankcs.hanlp.dictionary.DynamicCustomDictionary; import com.hankcs.hanlp.seg.Segment; import com.hankcs.hanlp.seg.common.Term; -import com.tencent.supersonic.knowledge.dictionary.DictWordType; import com.tencent.supersonic.knowledge.dictionary.DictWord; +import com.tencent.supersonic.knowledge.dictionary.DictWordType; +import com.tencent.supersonic.knowledge.dictionary.HadoopFileIOAdapter; +import com.tencent.supersonic.knowledge.dictionary.MapResult; +import com.tencent.supersonic.knowledge.dictionary.MultiCustomDictionary; +import com.tencent.supersonic.knowledge.service.SearchService; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; - -import com.tencent.supersonic.knowledge.dictionary.MapResult; -import com.tencent.supersonic.knowledge.dictionary.HadoopFileIOAdapter; -import com.tencent.supersonic.knowledge.service.SearchService; -import com.tencent.supersonic.knowledge.dictionary.MultiCustomDictionary; import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; import org.springframework.util.ResourceUtils; diff --git a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HdfsFileHelper.java b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HdfsFileHelper.java index 2d4943954..3b388d3de 100644 --- a/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HdfsFileHelper.java +++ b/chat/knowledge/src/main/java/com/tencent/supersonic/knowledge/utils/HdfsFileHelper.java @@ -8,7 +8,6 @@ import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.List; - import lombok.extern.slf4j.Slf4j; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; diff --git a/chat/knowledge/src/main/resources/mapper/DictConfMapper.xml b/chat/knowledge/src/main/resources/mapper/DictConfMapper.xml index 7189d70ca..0db616b11 100644 --- a/chat/knowledge/src/main/resources/mapper/DictConfMapper.xml +++ b/chat/knowledge/src/main/resources/mapper/DictConfMapper.xml @@ -5,9 +5,9 @@ + type="com.tencent.supersonic.knowledge.persistence.dataobject.DictConfDO"> - + @@ -18,35 +18,35 @@ insert into s2_dictionary (`domain_id`, dim_value_infos, created_at, updated_at, created_by, updated_by) - values - (#{domainId}, #{dimValueInfos}, #{createdAt}, #{updatedAt}, #{createdBy}, #{updatedBy}) + values (#{modelId}, #{dimValueInfos}, #{createdAt}, #{updatedAt}, #{createdBy}, + #{updatedBy}) - insert into s2_dictionary - (`domain_id`, dim_value_infos, created_at, updated_at, created_by, updated_by) - values - (#{domainId}, #{dimValueInfos}, #{createdAt}, #{updatedAt}, #{createdBy}, #{updatedBy}) - on duplicate key update - dim_value_infos = #{dimValueInfos}, - updated_at = #{updatedAt}, - updated_by = #{updatedBy} + insert into s2_dictionary + (`model_id`, dim_value_infos, created_at, updated_at, created_by, updated_by) + values (#{modelId}, #{dimValueInfos}, #{createdAt}, #{updatedAt}, #{createdBy}, + #{updatedBy}) on duplicate key + update + dim_value_infos = #{dimValueInfos}, + updated_at = #{updatedAt}, + updated_by = #{updatedBy} update s2_dictionary set dim_value_infos = #{dimValueInfos}, - updated_at = #{updatedAt}, - updated_by = #{updatedBy} - where domain_id = #{domainId} - and status = 0 + updated_at = #{updatedAt}, + updated_by = #{updatedBy} + where model_id = #{modelId} + and status = 0 - select * from s2_dictionary - where domain_id = #{domainId} - and status = 0 + where model_id = #{modelId} + and status = 0 diff --git a/chat/knowledge/src/main/resources/mapper/DictTaskMapper.xml b/chat/knowledge/src/main/resources/mapper/DictTaskMapper.xml index 2f26482a4..990b8a7bd 100644 --- a/chat/knowledge/src/main/resources/mapper/DictTaskMapper.xml +++ b/chat/knowledge/src/main/resources/mapper/DictTaskMapper.xml @@ -5,7 +5,7 @@ + type="com.tencent.supersonic.knowledge.persistence.dataobject.DictTaskDO"> @@ -21,8 +21,8 @@ insert into s2_dictionary_task (`name`, description, command, command_md5, status, created_by, progress, elapsed_ms) - values - (#{name}, #{description}, #{command}, #{commandMd5}, #{status}, #{createdBy}, #{progress}, #{elapsedMs}) + values (#{name}, #{description}, #{command}, #{commandMd5}, #{status}, #{createdBy}, + #{progress}, #{elapsedMs}) @@ -54,7 +54,7 @@ and id >= #{id} - and `name` like "%"#{name}"%" + and `name` like "%"#{name}"%" and created_by = #{createdBy} diff --git a/chat/knowledge/src/main/resources/sql.ddl/s2_dictionary.sql b/chat/knowledge/src/main/resources/sql.ddl/s2_dictionary.sql index ebbdaf1e7..f1e1cfcd2 100644 --- a/chat/knowledge/src/main/resources/sql.ddl/s2_dictionary.sql +++ b/chat/knowledge/src/main/resources/sql.ddl/s2_dictionary.sql @@ -1,15 +1,40 @@ -CREATE TABLE IF NOT EXISTS `s2_dictionary` ( -`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, -`item_id` bigint(20) DEFAULT NULL COMMENT '对应维度id、指标id等', -`type` varchar(50) DEFAULT NULL COMMENT '对应维度、指标等', -`black_list` mediumtext COMMENT '字典黑名单', -`white_list` mediumtext COMMENT '字典白名单', -`rule_list` mediumtext COMMENT '字典规则', -`is_dict_Info` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1-开启写入字典,0-不开启', -`created_at` datetime NOT NULL COMMENT '创建时间', -`updated_at` datetime NOT NULL COMMENT '更新时间', -`created_by` varchar(100) NOT NULL COMMENT '创建人', -`updated_by` varchar(100) DEFAULT NULL COMMENT '更新人', -`is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1-删除,0-可用', - PRIMARY KEY (`id`) -) COMMENT='字典配置信息表' +CREATE TABLE IF NOT EXISTS `s2_dictionary` +( + `id` bigint +( + 20 +) unsigned NOT NULL AUTO_INCREMENT, + `item_id` bigint +( + 20 +) DEFAULT NULL COMMENT '对应维度id、指标id等', + `type` varchar +( + 50 +) DEFAULT NULL COMMENT '对应维度、指标等', + `black_list` mediumtext COMMENT '字典黑名单', + `white_list` mediumtext COMMENT '字典白名单', + `rule_list` mediumtext COMMENT '字典规则', + `is_dict_Info` tinyint +( + 1 +) NOT NULL DEFAULT '0' COMMENT '1-开启写入字典,0-不开启', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + `created_by` varchar +( + 100 +) NOT NULL COMMENT '创建人', + `updated_by` varchar +( + 100 +) DEFAULT NULL COMMENT '更新人', + `is_deleted` tinyint +( + 1 +) NOT NULL DEFAULT '0' COMMENT '1-删除,0-可用', + PRIMARY KEY +( + `id` +) + ) COMMENT='字典配置信息表' diff --git a/chat/knowledge/src/main/resources/sql.ddl/s2_dictionary_task.sql b/chat/knowledge/src/main/resources/sql.ddl/s2_dictionary_task.sql index 3744f3106..22f0dc716 100644 --- a/chat/knowledge/src/main/resources/sql.ddl/s2_dictionary_task.sql +++ b/chat/knowledge/src/main/resources/sql.ddl/s2_dictionary_task.sql @@ -1,11 +1,33 @@ -CREATE TABLE IF NOT EXISTS `s2_dictionary_task` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) NOT NULL COMMENT '任务名称', - `description` varchar(255) NOT NULL COMMENT '任务描述', - `command` mediumtext NOT NULL COMMENT '任务请求参数', - `status` int(10) NOT NULL COMMENT '任务最终运行状态', - `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `created_by` varchar(100) NOT NULL COMMENT '创建人', - `elapsed_ms` bigint(10) DEFAULT NULL COMMENT '任务耗时', - PRIMARY KEY (`id`) -)COMMENT='字典任务信息表' +CREATE TABLE IF NOT EXISTS `s2_dictionary_task` +( + `id` bigint +( + 20 +) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar +( + 255 +) NOT NULL COMMENT '任务名称', + `description` varchar +( + 255 +) NOT NULL COMMENT '任务描述', + `command` mediumtext NOT NULL COMMENT '任务请求参数', + `status` int +( + 10 +) NOT NULL COMMENT '任务最终运行状态', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `created_by` varchar +( + 100 +) NOT NULL COMMENT '创建人', + `elapsed_ms` bigint +( + 10 +) DEFAULT NULL COMMENT '任务耗时', + PRIMARY KEY +( + `id` +) + ) COMMENT='字典任务信息表' diff --git a/common/pom.xml b/common/pom.xml index f7440e463..b71ecb23e 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -133,6 +133,11 @@ com.fasterxml.jackson.datatype jackson-datatype-jsr310 + + com.github.jsqlparser + jsqlparser + ${jsqlparser.version} + diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/Aggregator.java b/common/src/main/java/com/tencent/supersonic/common/pojo/Aggregator.java index e535de293..0d95ba049 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/Aggregator.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/Aggregator.java @@ -1,10 +1,8 @@ package com.tencent.supersonic.common.pojo; import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; - import java.util.List; import javax.validation.constraints.NotBlank; - import lombok.Data; @Data 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 39b3c1d82..cc651ea98 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 @@ -5,7 +5,6 @@ import static java.time.LocalDate.now; import java.util.ArrayList; import java.util.List; import java.util.Objects; - import lombok.Data; @Data @@ -41,12 +40,18 @@ public class DateConf { /** * the text parse from , example "last 7 days" , "last mouth" */ - private String text; + private String detectWord; + + private boolean isInherited; @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } DateConf dateConf = (DateConf) o; return dateMode == dateConf.dateMode && Objects.equals(startDate, dateConf.startDate) && @@ -87,7 +92,7 @@ public class DateConf { sb.append(",\"period\":\"") .append(period).append('\"'); sb.append(",\"text\":\"") - .append(text).append('\"'); + .append(detectWord).append('\"'); sb.append('}'); return sb.toString(); } diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java b/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java index 9e8b70b36..a1ffd706d 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java @@ -4,7 +4,6 @@ import static com.tencent.supersonic.common.pojo.Constants.ASC_UPPER; import com.google.common.base.Objects; import javax.validation.constraints.NotBlank; - import lombok.Data; @Data 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 b06b26768..d4aa22df3 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 @@ -1,7 +1,6 @@ package com.tencent.supersonic.common.pojo; import java.util.List; - import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/QueryColumn.java b/common/src/main/java/com/tencent/supersonic/common/pojo/QueryColumn.java index 942ab3310..d8faae44e 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/QueryColumn.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/QueryColumn.java @@ -22,6 +22,13 @@ public class QueryColumn { this.nameEn = nameEn; } + public QueryColumn(String name, String type, String nameEn) { + this.name = name; + this.type = type; + this.nameEn = nameEn; + this.showType = "CATEGORY"; + } + public void setType(String type) { this.type = type == null ? null : type; } diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/ResultData.java b/common/src/main/java/com/tencent/supersonic/common/pojo/ResultData.java index 0314ec35c..6ac6e94f0 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/ResultData.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/ResultData.java @@ -7,6 +7,7 @@ import lombok.Data; */ @Data public class ResultData { + private int code; private String msg; private T data; diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/enums/AuthType.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/AuthType.java new file mode 100644 index 000000000..80d7ba7af --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/AuthType.java @@ -0,0 +1,8 @@ +package com.tencent.supersonic.common.pojo.enums; + +public enum AuthType { + + VISIBLE, + ADMIN + +} diff --git a/common/src/main/java/com/tencent/supersonic/common/util/DatePeriodEnum.java b/common/src/main/java/com/tencent/supersonic/common/util/DatePeriodEnum.java new file mode 100644 index 000000000..0f7eea279 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/DatePeriodEnum.java @@ -0,0 +1,17 @@ +package com.tencent.supersonic.common.util; + +public enum DatePeriodEnum { + DAY, + WEEK, + MONTH, + YEAR; + + public static DatePeriodEnum get(String period) { + for (DatePeriodEnum value : values()) { + if (value.name().equalsIgnoreCase(period)) { + return value; + } + } + return null; + } +} 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 76efdad78..558c3760a 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 @@ -1,17 +1,23 @@ package com.tencent.supersonic.common.util; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.Calendar; import java.util.Date; +import lombok.extern.slf4j.Slf4j; +@Slf4j public class DateUtils { - public static Integer currentYear(){ + public static final String DATE_FORMAT_DOT = "yyyy-MM-dd"; + + public static Integer currentYear() { Date date = new Date(); - SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd"); - String time=dateFormat.format(date).replaceAll("-",""); - int year = Integer.parseInt(time.substring(0,4)); + SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_DOT); + String time = dateFormat.format(date).replaceAll("-", ""); + int year = Integer.parseInt(time.substring(0, 4)); return year; } @@ -33,11 +39,47 @@ public class DateUtils { String format = formats[i]; try { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format); - LocalDateTime.parse(date,dateTimeFormatter); + LocalDateTime.parse(date, dateTimeFormatter); return dateTimeFormatter; } catch (Exception e) { } } return DateTimeFormatter.ofPattern(formats[0]); } + + + public static String getBeforeDate(int intervalDay) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + calendar.add(Calendar.DAY_OF_MONTH, -intervalDay); + SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_DOT); + return dateFormat.format(calendar.getTime()); + } + + + public static String getBeforeDate(String date, int intervalDay, DatePeriodEnum datePeriodEnum) { + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_DOT); + try { + calendar.setTime(dateFormat.parse(date)); + } catch (ParseException e) { + log.error("parse error"); + } + switch (datePeriodEnum) { + case DAY: + calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - intervalDay); + break; + case WEEK: + calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - intervalDay * 7); + break; + case MONTH: + calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - intervalDay); + break; + case YEAR: + calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) - intervalDay); + break; + default: + } + return dateFormat.format(calendar.getTime()); + } } diff --git a/common/src/main/java/com/tencent/supersonic/common/util/JsonUtil.java b/common/src/main/java/com/tencent/supersonic/common/util/JsonUtil.java index eb1cdf24e..11417f064 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/JsonUtil.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/JsonUtil.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.type.CollectionType; import com.fasterxml.jackson.databind.type.MapType; import com.fasterxml.jackson.databind.type.TypeFactory; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import java.io.IOException; import java.nio.charset.Charset; import java.security.InvalidParameterException; @@ -19,8 +20,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; - -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; diff --git a/common/src/main/java/com/tencent/supersonic/common/util/StringUtil.java b/common/src/main/java/com/tencent/supersonic/common/util/StringUtil.java new file mode 100644 index 000000000..314ec25bd --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/StringUtil.java @@ -0,0 +1,21 @@ +package com.tencent.supersonic.common.util; + +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +public class StringUtil { + + public static final String COMMA_WRAPPER = "'%s'"; + public static final String SPACE_WRAPPER = " %s "; + + + public static String getCommaWrap(String value) { + return String.format(COMMA_WRAPPER, value); + } + + public static String getSpaceWrap(String value) { + return String.format(SPACE_WRAPPER, value); + } + +} \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/ThreadContext.java b/common/src/main/java/com/tencent/supersonic/common/util/ThreadContext.java index 7399e787a..ea5df4e14 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/ThreadContext.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/ThreadContext.java @@ -1,10 +1,10 @@ package com.tencent.supersonic.common.util; +import java.util.Map; import lombok.Builder; import lombok.Data; import lombok.ToString; -import java.util.Map; @Builder @ToString diff --git a/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java index 383ce3584..9a88b030f 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/calcite/SqlParseUtils.java @@ -80,10 +80,15 @@ public class SqlParseUtils { */ private static void handlerOrderBy(SqlNode node, SqlParserInfo sqlParserInfo) { SqlOrderBy sqlOrderBy = (SqlOrderBy) node; + SqlNode query = sqlOrderBy.query; + handlerSQL(query, sqlParserInfo); + SqlNodeList orderList = sqlOrderBy.orderList; + Set orderFields = handlerField(orderList); + sqlParserInfo.getAllFields().addAll(orderFields); } @@ -107,6 +112,7 @@ public class SqlParseUtils { Set selectFields = handlerSelectField(sqlSelect); allFields.addAll(selectFields); + } private static Set handlerSelectField(SqlSelect sqlSelect) { diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/AggregateFunctionVisitor.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/AggregateFunctionVisitor.java new file mode 100644 index 000000000..f9b9d5ac1 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/AggregateFunctionVisitor.java @@ -0,0 +1,19 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; +import net.sf.jsqlparser.expression.Function; + +public class AggregateFunctionVisitor extends ExpressionVisitorAdapter { + + private boolean hasAggregateFunction = false; + + public boolean hasAggregateFunction() { + return hasAggregateFunction; + } + + @Override + public void visit(Function function) { + super.visit(function); + hasAggregateFunction = true; + } +} \ No newline at end of file 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/CCJSqlParserUtils.java new file mode 100644 index 000000000..24cd506bc --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/CCJSqlParserUtils.java @@ -0,0 +1,290 @@ +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; +import net.sf.jsqlparser.statement.select.Select; +import net.sf.jsqlparser.statement.select.SelectBody; +import net.sf.jsqlparser.statement.select.SelectItem; +import net.sf.jsqlparser.util.SelectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; + +/** + * CC JSql ParserUtils + */ +@Slf4j +public class CCJSqlParserUtils { + + 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(); + 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; + } + 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()); + } + } + } + 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 replaceFields(String sql, Map fieldToBizName) { + Select selectStatement = getSelect(sql); + SelectBody selectBody = selectStatement.getSelectBody(); + if (!(selectBody instanceof PlainSelect)) { + return sql; + } + PlainSelect plainSelect = (PlainSelect) selectBody; + //1. replace where fields + Expression where = plainSelect.getWhere(); + FieldReplaceVisitor visitor = new FieldReplaceVisitor(fieldToBizName); + if (Objects.nonNull(where)) { + where.accept(visitor); + } + + //2. replace select fields + for (SelectItem selectItem : plainSelect.getSelectItems()) { + selectItem.accept(visitor); + } + + //3. replace oder by fields + List orderByElements = plainSelect.getOrderByElements(); + if (!CollectionUtils.isEmpty(orderByElements)) { + for (OrderByElement orderByElement : orderByElements) { + orderByElement.accept(new OrderByReplaceVisitor(fieldToBizName)); + } + } + + //4. replace group by fields + GroupByElement groupByElement = plainSelect.getGroupBy(); + if (Objects.nonNull(groupByElement)) { + groupByElement.accept(new GroupByReplaceVisitor(fieldToBizName)); + } + //5. add Waiting Expression + List waitingForAdds = visitor.getWaitingForAdds(); + addWaitingExpression(plainSelect, where, waitingForAdds); + return selectStatement.toString(); + } + + private static void addWaitingExpression(PlainSelect plainSelect, Expression where, + List waitingForAdds) { + if (CollectionUtils.isEmpty(waitingForAdds)) { + return; + } + for (Expression expression : waitingForAdds) { + if (where == null) { + plainSelect.setWhere(expression); + } else { + plainSelect.setWhere(new AndExpression(where, expression)); + } + } + } + + + public static String addFieldsToSelect(String sql, List fields) { + Select selectStatement = getSelect(sql); + // add fields to select + for (String field : fields) { + SelectUtils.addExpression(selectStatement, new Column(field)); + } + 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); + SelectBody selectBody = selectStatement.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) selectBody; + // replace table name + Table table = (Table) plainSelect.getFromItem(); + table.setName(tableName); + return selectStatement.toString(); + } + + + public static String addWhere(String sql, String column, Object value) { + if (StringUtils.isEmpty(column) || Objects.isNull(value)) { + return sql; + } + Select selectStatement = getSelect(sql); + SelectBody selectBody = selectStatement.getSelectBody(); + + if (!(selectBody instanceof PlainSelect)) { + return sql; + } + PlainSelect plainSelect = (PlainSelect) selectBody; + Expression where = plainSelect.getWhere(); + + Expression right = new StringValue(value.toString()); + if (value instanceof Integer || value instanceof Long) { + right = new LongValue(value.toString()); + } + + if (where == null) { + plainSelect.setWhere(new EqualsTo(new Column(column), right)); + } else { + plainSelect.setWhere(new AndExpression(where, new EqualsTo(new Column(column), right))); + } + return selectStatement.toString(); + } + + + public static String addWhere(String sql, Expression expression) { + Select selectStatement = getSelect(sql); + SelectBody selectBody = selectStatement.getSelectBody(); + + if (!(selectBody instanceof PlainSelect)) { + return sql; + } + PlainSelect plainSelect = (PlainSelect) selectBody; + Expression where = plainSelect.getWhere(); + + if (where == null) { + plainSelect.setWhere(expression); + } else { + plainSelect.setWhere(new AndExpression(where, expression)); + } + 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/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAcquireVisitor.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAcquireVisitor.java new file mode 100644 index 000000000..c3eddc03e --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAcquireVisitor.java @@ -0,0 +1,20 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import java.util.Set; +import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; +import net.sf.jsqlparser.schema.Column; + +public class FieldAcquireVisitor extends ExpressionVisitorAdapter { + + private Set fields; + + public FieldAcquireVisitor(Set fields) { + this.fields = fields; + } + + @Override + public void visit(Column column) { + String columnName = column.getColumnName(); + fields.add(columnName); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldReplaceVisitor.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldReplaceVisitor.java new file mode 100644 index 000000000..b41a1164d --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldReplaceVisitor.java @@ -0,0 +1,70 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; +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; + +@Slf4j +public class FieldReplaceVisitor extends ExpressionVisitorAdapter { + + ParseVisitorHelper parseVisitorHelper = new ParseVisitorHelper(); + + private Map fieldToBizName; + private List waitingForAdds = new ArrayList<>(); + + public FieldReplaceVisitor(Map fieldToBizName) { + this.fieldToBizName = fieldToBizName; + } + + @Override + public void visit(Column column) { + parseVisitorHelper.replaceColumn(column, fieldToBizName); + } + + @Override + public void visit(MinorThan expr) { + Expression expression = parseVisitorHelper.reparseDate(expr, fieldToBizName, ">"); + if (Objects.nonNull(expression)) { + waitingForAdds.add(expression); + } + } + + @Override + public void visit(MinorThanEquals expr) { + Expression expression = parseVisitorHelper.reparseDate(expr, fieldToBizName, ">="); + if (Objects.nonNull(expression)) { + waitingForAdds.add(expression); + } + } + + + @Override + public void visit(GreaterThan expr) { + Expression expression = parseVisitorHelper.reparseDate(expr, fieldToBizName, "<"); + if (Objects.nonNull(expression)) { + waitingForAdds.add(expression); + } + } + + @Override + public void visit(GreaterThanEquals expr) { + Expression expression = parseVisitorHelper.reparseDate(expr, fieldToBizName, "<="); + if (Objects.nonNull(expression)) { + waitingForAdds.add(expression); + } + } + + public List getWaitingForAdds() { + return waitingForAdds; + } + +} \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/GroupByReplaceVisitor.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/GroupByReplaceVisitor.java new file mode 100644 index 000000000..d7c545b27 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/GroupByReplaceVisitor.java @@ -0,0 +1,36 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import java.util.List; +import java.util.Map; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.statement.select.GroupByElement; +import net.sf.jsqlparser.statement.select.GroupByVisitor; +import org.apache.commons.lang3.StringUtils; + +public class GroupByReplaceVisitor implements GroupByVisitor { + + ParseVisitorHelper parseVisitorHelper = new ParseVisitorHelper(); + private Map fieldToBizName; + + + public GroupByReplaceVisitor(Map fieldToBizName) { + this.fieldToBizName = fieldToBizName; + } + + public void visit(GroupByElement groupByElement) { + groupByElement.getGroupByExpressionList(); + ExpressionList groupByExpressionList = groupByElement.getGroupByExpressionList(); + List groupByExpressions = groupByExpressionList.getExpressions(); + + for (int i = 0; i < groupByExpressions.size(); i++) { + Expression expression = groupByExpressions.get(i); + + String replaceColumn = parseVisitorHelper.getReplaceColumn(expression.toString(), fieldToBizName); + if (StringUtils.isNotEmpty(replaceColumn)) { + groupByExpressions.set(i, new Column(replaceColumn)); + } + } + } +} \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/OrderByReplaceVisitor.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/OrderByReplaceVisitor.java new file mode 100644 index 000000000..73636cad7 --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/OrderByReplaceVisitor.java @@ -0,0 +1,26 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import java.util.Map; +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 OrderByReplaceVisitor extends OrderByVisitorAdapter { + + ParseVisitorHelper parseVisitorHelper = new ParseVisitorHelper(); + private Map fieldToBizName; + + public OrderByReplaceVisitor(Map fieldToBizName) { + this.fieldToBizName = fieldToBizName; + } + + @Override + public void visit(OrderByElement orderBy) { + Expression expression = orderBy.getExpression(); + if (expression instanceof Column) { + parseVisitorHelper.replaceColumn((Column) expression, fieldToBizName); + } + super.visit(orderBy); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/ParseVisitorHelper.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/ParseVisitorHelper.java new file mode 100644 index 000000000..cd943ea4d --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/ParseVisitorHelper.java @@ -0,0 +1,168 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +import com.tencent.supersonic.common.util.DatePeriodEnum; +import com.tencent.supersonic.common.util.DateUtils; +import com.tencent.supersonic.common.util.StringUtil; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.expression.DoubleValue; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.Function; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.expression.operators.relational.ComparisonOperator; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.schema.Column; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +@Slf4j +public class ParseVisitorHelper { + + public static final double HALF_YEAR = 0.5d; + public static final int SIX_MONTH = 6; + public static final String DATE_FUNCTION = "datediff"; + + public void replaceColumn(Column column, Map fieldToBizName) { + String columnName = column.getColumnName(); + column.setColumnName(getReplaceColumn(columnName, fieldToBizName)); + } + + public String getReplaceColumn(String columnName, Map fieldToBizName) { + String fieldBizName = fieldToBizName.get(columnName); + if (StringUtils.isNotEmpty(fieldBizName)) { + return fieldBizName; + } else { + Optional> first = fieldToBizName.entrySet().stream().sorted((k1, k2) -> { + String k1FieldNameDb = k1.getKey(); + String k2FieldNameDb = k2.getKey(); + Double k1Similarity = getSimilarity(columnName, k1FieldNameDb); + Double k2Similarity = getSimilarity(columnName, k2FieldNameDb); + return k2Similarity.compareTo(k1Similarity); + }).collect(Collectors.toList()).stream().findFirst(); + + if (first.isPresent()) { + return first.get().getValue(); + } + } + return columnName; + } + + public Expression reparseDate(ComparisonOperator comparisonOperator, Map fieldToBizName, + String startDateOperator) { + Expression leftExpression = comparisonOperator.getLeftExpression(); + if (leftExpression instanceof Column) { + Column leftExpressionColumn = (Column) leftExpression; + replaceColumn(leftExpressionColumn, fieldToBizName); + return null; + } + + if (!(leftExpression instanceof Function)) { + return null; + } + Function leftExpressionFunction = (Function) leftExpression; + if (!leftExpressionFunction.toString().contains(DATE_FUNCTION)) { + return null; + } + List leftExpressions = leftExpressionFunction.getParameters().getExpressions(); + if (CollectionUtils.isEmpty(leftExpressions) || leftExpressions.size() < 3) { + return null; + } + Column field = (Column) leftExpressions.get(1); + String columnName = field.getColumnName(); + String startDateValue = getStartDateStr(comparisonOperator, leftExpressions); + String fieldBizName = fieldToBizName.get(columnName); + try { + String endDateValue = getEndDateValue(leftExpressions); + String stringExpression = comparisonOperator.getStringExpression(); + + String condExpr = + fieldBizName + StringUtil.getSpaceWrap(stringExpression) + StringUtil.getCommaWrap(endDateValue); + ComparisonOperator expression = (ComparisonOperator) CCJSqlParserUtil.parseCondExpression(condExpr); + + comparisonOperator.setLeftExpression(null); + comparisonOperator.setRightExpression(null); + comparisonOperator.setASTNode(null); + + comparisonOperator.setLeftExpression(expression.getLeftExpression()); + comparisonOperator.setRightExpression(expression.getRightExpression()); + comparisonOperator.setASTNode(expression.getASTNode()); + + String startDataCondExpr = + fieldBizName + StringUtil.getSpaceWrap(startDateOperator) + StringUtil.getCommaWrap(startDateValue); + return CCJSqlParserUtil.parseCondExpression(startDataCondExpr); + } catch (JSQLParserException e) { + log.error("JSQLParserException", e); + } + + return null; + } + + private String getEndDateValue(List leftExpressions) { + StringValue date = (StringValue) leftExpressions.get(2); + return date.getValue(); + } + + private String getStartDateStr(ComparisonOperator minorThanEquals, List expressions) { + String unitValue = getUnit(expressions); + String dateValue = getEndDateValue(expressions); + String dateStr = ""; + Expression rightExpression = minorThanEquals.getRightExpression(); + DatePeriodEnum datePeriodEnum = DatePeriodEnum.get(unitValue); + if (rightExpression instanceof DoubleValue) { + DoubleValue value = (DoubleValue) rightExpression; + double doubleValue = value.getValue(); + if (DatePeriodEnum.YEAR.equals(datePeriodEnum) && doubleValue == HALF_YEAR) { + datePeriodEnum = DatePeriodEnum.MONTH; + dateStr = DateUtils.getBeforeDate(dateValue, SIX_MONTH, datePeriodEnum); + } + } else if (rightExpression instanceof LongValue) { + LongValue value = (LongValue) rightExpression; + long doubleValue = value.getValue(); + dateStr = DateUtils.getBeforeDate(dateValue, (int) doubleValue, datePeriodEnum); + } + return dateStr; + } + + private String getUnit(List expressions) { + StringValue unit = (StringValue) expressions.get(0); + return unit.getValue(); + } + + + public static int editDistance(String word1, String word2) { + final int m = word1.length(); + final int n = word2.length(); + int[][] dp = new int[m + 1][n + 1]; + for (int j = 0; j <= n; ++j) { + dp[0][j] = j; + } + for (int i = 0; i <= m; ++i) { + dp[i][0] = i; + } + + for (int i = 1; i <= m; ++i) { + char ci = word1.charAt(i - 1); + for (int j = 1; j <= n; ++j) { + char cj = word2.charAt(j - 1); + if (ci == cj) { + dp[i][j] = dp[i - 1][j - 1]; + } else if (i > 1 && j > 1 && ci == word2.charAt(j - 2) && cj == word1.charAt(i - 2)) { + dp[i][j] = 1 + Math.min(dp[i - 2][j - 2], Math.min(dp[i][j - 1], dp[i - 1][j])); + } else { + dp[i][j] = Math.min(dp[i - 1][j - 1] + 1, Math.min(dp[i][j - 1] + 1, dp[i - 1][j] + 1)); + } + } + } + return dp[m][n]; + } + + public double getSimilarity(String word1, String word2) { + return 1 - (double) editDistance(word1, word2) / Math.max(word2.length(), word1.length()); + } +} \ No newline at end of file diff --git a/common/src/test/java/com/tencent/supersonic/common/util/DateUtilsTest.java b/common/src/test/java/com/tencent/supersonic/common/util/DateUtilsTest.java new file mode 100644 index 000000000..54e2bd5b4 --- /dev/null +++ b/common/src/test/java/com/tencent/supersonic/common/util/DateUtilsTest.java @@ -0,0 +1,26 @@ +package com.tencent.supersonic.common.util; + +import org.junit.Assert; +import org.junit.jupiter.api.Test; + +class DateUtilsTest { + + @Test + void getBeforeDate() { + + String dateStr = DateUtils.getBeforeDate("2023-08-10", 1, DatePeriodEnum.DAY); + Assert.assertEquals(dateStr, "2023-08-09"); + + dateStr = DateUtils.getBeforeDate("2023-08-10", 8, DatePeriodEnum.DAY); + Assert.assertEquals(dateStr, "2023-08-02"); + + dateStr = DateUtils.getBeforeDate("2023-08-10", 1, DatePeriodEnum.WEEK); + Assert.assertEquals(dateStr, "2023-08-03"); + + dateStr = DateUtils.getBeforeDate("2023-08-01", 1, DatePeriodEnum.MONTH); + Assert.assertEquals(dateStr, "2023-07-01"); + + dateStr = DateUtils.getBeforeDate("2023-08-01", 1, DatePeriodEnum.YEAR); + Assert.assertEquals(dateStr, "2022-08-01"); + } +} \ No newline at end of file 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 ed65a10ce..0be459cf2 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 @@ -3,6 +3,7 @@ package com.tencent.supersonic.common.util.calcite; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; import org.apache.calcite.sql.parser.SqlParseException; import org.junit.Assert; import org.junit.jupiter.api.Test; @@ -12,6 +13,7 @@ import org.junit.jupiter.api.Test; * * @date 2023/7/12 12:00 */ +@Slf4j class SqlParseUtilsTest { @Test 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 new file mode 100644 index 000000000..d38bc3678 --- /dev/null +++ b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/CCJSqlParserUtilsTest.java @@ -0,0 +1,177 @@ +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.replaceFields( + "select 歌曲名 from 歌曲库 where datediff('day', 发布日期, '2023-08-09') <= 1 and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' order by 播放量 desc limit 11", + fieldToBizName); + + 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.replaceFields( + "select 歌曲名 from 歌曲库 where datediff('year', 发布日期, '2023-08-09') >= 0.5 and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' order by 播放量 desc limit 11", + fieldToBizName); + + replaceSql = CCJSqlParserUtils.replaceFields( + "select 部门,用户 from 超音数 where 数据日期 = '2023-08-08' and 用户 =alice and 发布日期 ='11' order by 访问次数 desc limit 1", + fieldToBizName); + + 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); + Assert.assertEquals(replaceSql, + "SELECT department, sum(pv) FROM 超音数 WHERE sys_imp_date = '2023-08-08' AND user_id = user_id AND publish_date = '11' GROUP BY department LIMIT 1"); + + replaceSql = "select sum(访问次数) from 超音数 where 数据日期 >= '2023-08-06' and 数据日期 <= '2023-08-06' and 部门 = 'hr'"; + replaceSql = CCJSqlParserUtils.replaceFields(replaceSql, fieldToBizName); + + System.out.println(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/docs/images/supersonic_components.png b/docs/images/supersonic_components.png index ef528d99bf50600fd8e2349d179d19172b7ff981..4db266accee5b24ce32a2d01a3d76ddc807f268e 100644 GIT binary patch literal 280901 zcmeFZcT`i|);9_Ws6iB^Dcyon1XOy*f`}N35K%hPOX$5LA}UG|u+W`pvrXMp;pg62br>A|j%ce{kA;-Gy?nf+qa3K1K(ef5~b(+fVQRD!MyVx!J7 z(zjGn5?xm&q0u|eR9I?xll%Jh^K7@^2fT}m#HLll=*YUY#l?g4)Zb)%5=8MgUQ%!M zm7aR3bb0&5wT}}-KK%ikl%FPEUn`{5k0j-!8jU@v7&|t4QZd?4;PbmTr%WzCI!2^4 zX2)Jn6mtG`Txg@h{pFBSD)iYU|4T2cPq-Tz8ZMue^3Az$&TsPp_12d+*h%?)&E|Wq zioC+lnpG{n(3A$>(2Q=@UiY@DJ^1*}VP=)->gx}WuMm&E{>tXw9rp3U6%&=Q!B#W6 z)wP#OWnRz z*_|K{OT~wVJ{}8$U%*G*kDBM7y23qtgBKq?3YXA{9_NWuh-SGOOrN~dxYt*7b~#tH z&Nuo3<5lc;H7mVdfn!2-q%*G{5*;JGtRzJ=apL2zN7rA*aOzw=do^X^#?v}V>Kh`L zV%M&}ig_O+NkqNjI4e^6RcZL{YcGQuOwb9R5>pS4-NAQ!)BHp!Ys72~#vX_vB92Q_ z`~6R1)jo(%MwKd@m$_F?DiBZX;Cu1Lu_txH-%b`1^NmoD+~#;qYO8m4#Fr+-SFM~h zgUCYWA_uu<o1OtoDey!_=4Q#v=)i_H)!ig+zUAw^6hU5H%Ny4Zk~8yLvGX1Or&yE6r+YB6wQ7VBT${WCt>vIfp-g4>-uuGBGKf{=ca-vs%>pW3-1i_ z4&EG;)e_EP-8h@=)AM~`bno|)%ULg;avE_s;U{ZI)$eflDm}g5`$*)0 z>7~I-tJF2Gx$dbZir@V3`JvX`>zBLFWmBUSF~{Xc!&LopOkq?N!f~AA6Q`#dO;<<*VmWm#^>~_k>Yl*$rtq4CukCNmYR#An z&I0cHnHS7H?t*l!Aa9AiwYoFa+A$L~b8Tj0IaSAd~@5V9qMj z+VOEJSx*hh3aSWtYVxVsC`MnqIO~%Y66Z8TQGC};P4bLn!mv|Wpc~(LSxwqhUTsv^&}?*0_A2w1Wg~ zQ}7@+HK)+%q^8(22#>R-Q&ZJXyD#jKFu}QU+WNOf5f(6mE(<8;G+M`ENN>*^-8R43 zr)h#|+BY6I4YRUu{T0enE!66i2@hLf6sHi6)%G7^cF!w|+cV#}zteO2<7tur$wZd+}Kzky?i!z2l@f_OkYjcW!fB zbI_a)yU~%8k)u1MKjq(){&_=UP{>2pMUzzUx$Td(*Bhb3p;4DvWxvSECut-`B+}ng zm-BwT^oH|IXmxXt_62u-MSjKeJ?Dc1gM*}Lq{Xn#`$1cK6ioCqyoH!nhtYQb9(pt0 zhq?}4x$Vz!W2z@Vzx@0%>7;I9!XOvU^wPE5TedH2e=SUuO}H;%Rsu+IFV20F`QZLo zzFjZReHlHGK+_W59G?aRyO>qc~fVT zR%9PLnuh+Z(X*^);(7P4-2QO4PkFs+zJ`gR{X9ycDOvh~yS=0xx1BWa8y!3Iw1&rR z?dwK#jY8KM>sA_fTt(ePtz8=-d$bl$R_FwO-Y#P*(?@*Qqd2o->4{@M5 zd3pBpLNQAO^-j}>{g7>X`mH4`A}u}nl0yYs zW%*hp3*N1zW15q|*_Y;aBb~gN%d$2}MJ`G%jeUBli;FoW)@S$D6}eupG}FM}$uGO6 zyqC8f`YN3KnSqu;PhVv|57Y{3;)U8@`z^X>Pdf!`u`ZV>RkqRJeLh^>W^B9i`|E^) zCr_Xzi*`_%M~b74MQubpcTd)~cG+N!d5KHYUVqVCR!_^Y-mq!mj6;6;Q10GO>!6C5 z8JpSEib;?3+>WpLX%>n-{#GqG1&pVaZrS%D`xV?^iS|Y!Zf#K4Mz{O>;suY8{gJir zg8>G?%d7@0^pYxGkGIu!%(@nTRrJ(H8&0`Nt+VQGQ^bbFeL6i& zsdlEHGL~_fan|GJf$V|8Qe*CDl{9QW!^3EOc2!r$8x{N`Xtm;FDT{ahQfAG-_eG{* z)Vo*jr99)7yyow=$-NJjle#I5@(kLNxPhLaz$x^puVh29FUloZTF$f5+p`bWKOyqx zhz=*MjQUO#GENllbZPJVZkm_d9}?@5>N84yUA_hkNxYKtQUMnbX)bVygc};YG7w%WMyw^ z?NA#uS_%eE+B|p$sH0=Y{}RhTzVaK)-)pA!)Zr=gk(hxsoLAq_`neIW3mkaj;77tm z3|zvE9Q4^-;FebQVlI-G{<=d9T;qrNF0uV}i-U#arKeD3w!7ALMr=a7H+XMcl7g_Y zu}Rn&8jC%?cmJP{ga1ihGIemU5#!@?c6R1<=I6DxGvT`_Dk{o%;}+koTRh+n9(z|S z2YnYFEBnj;nB-sc+%vK_ursr9FtfH|!_TY#+}hDW^3o;zi~julgH9tCv%@!8+5dA{ zV1a!2Pxx-~-r)N)H+WP6KPskd=3->|?4B7M@C>{|>ZX9Gki=gP{M$!|uOxW%DZ!&c z0wRQu5`6UcM`89xc6Y7e;H3^yhXVWO!-OCH^Fawd{Mre4@efA-H3~Q_1(D$UBQ+_= zeJWjMAV?;&drE5HFHkf556L|EhvOfA!8LK^eI?Dxb?wzG z@i8a!!p~mkxRe@CDkxO>_AN7GVohr9z4s~x=QIU!Nt5n_t2bqVJVHN$sH#cH6i8*0 z2V}(N+qV|%y+nmg`1tcn=I3!SUs_zt9QwKpNnzcd9@Gz)Q zZen6$>C(uZBN*pfOv6^0rr=r5c=&o>F*;?Vrp`1~czd$^`u8)^g(LSP1R)k`{z-BN zr8;G9h=a~udl+^Tu2EpBUtL|@og{Z=t{;`YWga6|ey^P6a4K+BClBB(dR|D8;c(b@ z_GD_+{clZ$w&Rv>snlPSYF&y-=Q5d!aYplC2HVxX-o1Mik5eOwh!wj^ zdkN=?rfZE9g21mT#adF(^E$wUkOlQlszyQk79EK9@R9{I?@#^AXiIK;2?AD9)tLaY zJaF1slmukSjFc>v=ifA_>HYbIU%N071vf7iwCrv5zZYd)UbMD|#X@tRbYSb3&Jx-Q zUk@s_%K8AE2?hezrpk;Y1xw{^47;~HR8U9~wBYJxw_vq!6NF&}EV_TL_Zpm;8!B-w z_^8-j{_@zxBZ}#IRmLaGgt=jo0N$t|rVRycNpb_%;ylJ)L`8n)<=HKN)IvMP@w3k? zCB_mnb6PRvJI-}?ZB1@F z+PJMw>+dX9R0vuP7B;uMp(b1;G3f^mK-CYO(P)DCQxQH@QR+Ib>=0|DYheZsm!dW| zTvo#D@%x*V8!E$#`1nx)F3b23T{|Ndsz5L`8%?W#S$5faBs5y2tvllxwO9D(DTwVV zHb@+2dW`%O+Yk9iEjE`3ZE6S&5MJ^s>6GuGiIn+BTJxUKWU+K5NL=F_0;=Hr3}Vx{ zK42|9*O8)B+~mS~C}?oS@c>NmV%~}OP?gwp$q-6$R+sO;%V}?ajKM+MvsEp|1mOLh zK_X)(=Gwn1v@3mDIl3Tos1H#}ck0$90^KryqF4WceZ5mvsV`AB&~k0IOK`{NnS|T- zSCpA|15P`2s>nUdH*U&vF+A;mNI$rm$O77pTW2;2Ivkb}_02V??FV9sQyqO@;R9q` zgtFOQUzo#=ojtlDQ~Zi>Uc86u zrt8YD8KH4c0@|r$;`K;R*gz2JMaqAMeLd*Ti`pf7uJ@UU=Hj5mUZ$<_z6+%*&D|B= z2M$rcrH;5($~ORVk#%%war_yUDTjFMEMV5>^IQ6tCmZd>D${f;%G0Yve|1rFGcZZVT|Gn{}%BcVz2ItG^k?PW_D= z_W(EU%sXaX_`@VNYf`Wk7wWIY6_8QT_0D#s+wT`M2wPdkh&!Xd`5o5;0<5rzk^UsJfsq0>%H+^`ySvPNqqOKMFX^BA@Qg=zgso4CPj+Cg_DTNL(5%KvPzXdSkmYuxT@jv{>tCKSR{aj(W z#|TF2sg%2#$~J~A6h84b1h!n#Dy`#<|JWCd_R6zi|`XXG#B4tWA_jfawz0I)+W!3zyH&X@!oxm8ULut3ah zKJai}*Ttr+4QQK%J(_$#|Mug)5q3;pX9KO6OvN#&wr_x~uzk zup*olY!a5!X<1UN;xqu&Dtgs~oB>M)T=sZ5iWSf>%+{>2e8)L=j+$mf>9hodqtNR5Af z)^Cwmd6!TbGr9OwPoUQWOO_lhQZSN zg%RQ5pAl+}Yu%|Tm+1$YJXhPgljXy-Dwvv&nx$SnAQ?)8fgFK!XLV!}niTlT41pcP z07tTW?<8#Hlz?YHFmBfFi)GG&!9Q?>=FvyS3Mk2h(}C?e!Ei6Vu7`eh`8JZm#?F-i zwY@f1GSi{vsj8**sO8cT|AUMNfN$$iOZDYH!xMf!NSjw@Sgo*LJ8(s%r0)3J#|E4R z;0u+<&io9p8YOgnfRdVnU|B6NIEH{l4_;MH)Q2r>O~onI)LV``699gdqR1%eTyO3; zIg9TQ0lb08Bm_Iv^=gjZ zHxdj>^9Oc?K?igBG6`tR6D=)EIcCRjL9_NNX({!tM<;Q-1O$3*-h-217D4VC?(3HB zOV#w51qA}35hBP^GvF{Y+x|G)jfM|IR*y^*C=Z*D%xMVFDZLci27+O=`+C4*TW{db z?gj1aFm`Z3nJUljBi3AhKGixIqYk=0nF_h;Dm&N*fF=GSL0pF2Bd z`ks+>m*!>_-oW{jcH!z$hut;`bN$ zYkoCFnLyN^Wb0^OJ|*S^ybUNe4H-pzjQpvst?hdc`s1=kw0Id<%WJIe5f+3_ke`ga z{G0cz(!=<8Cy<`c>0%>@D{sxKYz5N{n#M3PXWLITcjucZ0jR^Ikpvtf>tB0W*%jbR zgJv!}fhM@J=NQ(XixRa*KqCd}jay>jz#Xw04diWC%Kd0o#^f)!FTIdt9)*BLY4l`i zX99&s1Ac3UU4^cmB?zDJhBf{zu#YfO1N%SnB_>^l%5>eLpu3)vrkYaB*-bMa{_!K; z4b+}|$7SvjKYonSUs5Wk&ot?M1}yyvy3aW3Sul%ahHN0+lM1gr4}&qcLlD4QKn+@; z1~9AgQ-3Tuk?#ZrUT!pF)6)JT5Eq)>X|T1Mv_+CQ+tlEAch_R5STI7Ue(^~&)!|db zq;`)0i)+Q+bsXjV(f94r11vg_`UN3CGlKZ#FPX8`0>!q=_%5PNu<#?(fY;V}1Lp58 z8e|=z;cs{S|AeIYt7IQ}watNnMOO#X4>Uw@XL{{zqs_axGz&~aGc_^Iz`r&Df6*Xf z>FY;XWCF*%8wumK=*>w$nYJZfReEngu#tgwlHq-R<)NnP!(C64R|&NH(E(=&CrF|I znf6urQ^3EyAVZAYKj17-QBI@-&G}?tpV-DVz2e$B#B|Sy|a`1eDRD zCo2YC&~~5qw;2dpW~7fgwLUV{KwoJYbIAzygD7Xt^J<8?Xuf6Ntte^la$sYev+|6a zqeXdtEYW{uyE;tMt%imbRNRRQViqr!Nl{Hv1dyp|FE-_?ln}a3rJ92<) zTX;}F`L|tH`Hm={gaA8ynP`=%9&2dKl0*SaFM>p|D}4OSWv$ki7+(`01WQXzGdnH4 z2iz$#p?!}iK?~z3tKu}rh5jyoQMb&IH%BppCK2G|#dWcscYokBB%cKGT!1W+%Mzg& zV-B&Rnb`d0$8a!>Ra#Dpd(k94t3^9#nOjZA`%}eV(bhJX!u^8>b2K9Xk3pIn3O0kK zx!rYw4P*X5CPEOvO5PWKlj4Vr{z4El4}U17Cp?DviGEOat4c&rcdJT#N13}bHy0N& ze`PH2$e#4=$6E*&cg#lnMZF?X zQl8s|$|-TeRwqqHLF zG7;f>+oDK`e#0Kh@P+8mnGks%0Gr z=Tx;Et@5|>v+;~t+u)dY-leg~)Iiy({$+R&Qvw9+qLN`_1+cT6Kwm`uXV^EI?rE_@ zS~~iIv{xxe0sa&)I{ytiSyG_?{S|_9GE&&u%5!HO1xNSQq}HXCvT7b#@GTJRe(2+i zru`!;8R8Qh$y>WCE%3oY+pMws9WQP|`(HViBGgqkyNVqx2JqP@kY%&CAct?B?V~=r zSaGn};{2(o!^J|L>aEZB2|3L_1&a4kRoUfkV~`Kxi7Hk1R|Wb3u-D-EO+t;$zM_yn zB;fTrxxxhNriGZsM4i2S|EZZ-ni)h;W9UTcxfFo2c&BE-s$^mI*OkpD ze?*UGef$T&r-+x&`3Xja?u~%_rS0f@gi?o_a6vI`Yq+@vg-L7tZFJWY&8~&|-wOl_ z0BTPTC^;qK@$%1x_mOcV1&J_=>@s6^cJ`OTUA{k;%aK)P{RL?hwx1Pw8Vi|D6AC^L zpTQJ-c$#2_$^+7Z?k4^g2?O8?==B#I6`?CiiWWJ0uQfmx-Dq|WTumsuPPt}Z9jv|pJujBnPr^k`b}u&-?9!Lt^i_^hexyy zA$j?ZUd_7;S=+A!tv_I6fV-LlCL1hvocp*NHhJn$Sph%e@g6I(r0D4%hWbX*JuPv{ zl-yhG5CSeV(%PIsoT66UrvoUk_;TIlOb~rO6S)*{)JMp>45(n13nBl_6*Bm)H)wyE4RzDT*=k zsYyZ48Bl}Mx0=r#ir4oA$aizTw)%DHkWuD$@ui9Ni7+J%Gc(RPY$v(P$MU;#Blui5 zK4yjwpqtuNL{Aau_J7v+(8|Fg`-R+E7W+ADhIWaNTimsJx>VrHYaXB491q5vW){1$ zV<;;AM;d@Gj`KiYU(A^E()=MZ9zjMkBC)?YZnZ5y5*^vyJiJ6ZV#`9y>NnVY2 zMNm=evMyNElse-{spLv2@_dj+!=#laX)7-1>BiQxI9Dq#!_71IU ze*_`(9+1*00^%lO!22A#!*n%Jf>Z=psUUIRVXl>km`}!MoZW6Nl;|2}J20QX;g46w zZ}G1wMT&m};md&EBer7XthRf zLYUl3I00OUhf4M_hf@gh{*`JQdvndQ3kgFzE%Y-SNR_jRlR#`3ge*;KS-ndgr&}+I zAD`qndNVUmpL26h!d`Ez$?2Ah$B`B;%(Uz*Ux z;{?D-;B^0!o;+@V^V&*5N1f=S2z)|K6DWWGOQwH+oPex4d^yNTQuJ>j%TcnF;do`F zwmVw1_}jc}C1CsXtxcF7%Ie>*WKeh%gw_!gknnFS{r>=?d}sfP^+72o@fgays~=Qw zn98z#hT%)>W7UC)(7?C-8h+%Ii9HgxkMg088SrXwhP(L?<=BGBSiD#D-M7BdCvxwu z$$okoC*_&c6XANxYxlTQ2W5|J6pQ0(uFz(x!T;@i=9el(CtANR6pkzXG!W!H>M_>o z0upu?G_wwq7i`vj2s9m-e&1AtEaM z1p;wLta^o)rv>mkSBF--Hot*ttMSUOJ-sOF;V!q;!K>SklnNGqUg&^Z^$D6r0oc$4 zu#pMvb95Mb-k8_(z5(7safC-~>Uh?DO%YN0GwfSRm)b-$HJ5EN(8yP&XMo*H0pSzZ z*SV`vR^~hN;;rk9E$HRkCmkY|l47&{d zYKi-_T*#wQP_Tb&y}<9ZROj1%G_;7)n!uO={>pOMy?LZ!vrffC%4cm!OoOer-iq~XbYsy629_*mhDqBh!o3AwtR>(GwO)QydJfG-SY0MSiJxir+b?p-S_M6 zp6RVq*Wump>Oeq;!p$JB%eS`YOw9%0$y8JGy3r;j^TnD)o>fFCy3eYAcIN5b->Hc@ zV`Eil_1SZ`?WG;7^K@^nWih%Lw^JS~*+_T&sWNWGO4AX;oz3zDC#iE3K;;1v%iAs5 zSP{^D8Bce~0h59A;C@e?nrdW>Yd7Cu99=|Nf@|6T>fTu_ z@JZKAMWC$jJ|o=lTFfs0K$5PvDn~NfW6O?l|AzsBi&>g7@=mlgc2!+YyH8nLOZ|a4e#rSlI0Q-Qp^Pn-ZduahtF=)&j z7`UhKw_4^sd=;eNQyC=scvq_|A>{QrXPMJeeeeS($NM$-Z%tT-gE| z#%5nTv=P}IuA(Yq*Tu?<;k)KNsv~UG{^OOlyPspfi@}E2egy{W_8qskqun+Tz-*h$ zEN*DJDhBiENR*|(&?$N}pn|Wy!$|9T!wVKe#v71+r*$jD9xy&Se~>Wb@;xpQt|UG_ zh3*;Nxu5My5UK!3xbh5`>3YzSeP|*Q`wYwO26--Om+W;{+*@2k@31&E7fs1!f4_z=66*J8nWd{| z+F38Ij%zN7S@17*6; zIP7&A#_?dM?bTO3Db*1vRvQjmb(jq=CP^KvDJ4K|V2JGQ0shH}z3n)3?dz<4`%l>X z@;E5lTkn|~02$LpeRJ(d7D-Gl95d96o-Ic?Vv7R=IVqgmQQ`+q>3jA+r>Doi$uToa zDs33HRmrY*M`g>g#<{fDJB`Hq4b8du*stZxSqA1gT0a(qV%K*X`A})P&}WO|%|>$* ztHWN$2a4x+F~h|vv?zGVuuv&M2Mv(%1U^E@TBVsfj1WS4NKj`-PW+aR^Lp+) zSz0>N1O)EduajoF3XC6t-rNQ_-hlQMn5j0Fsdv!_FiZ6YN#a~Eni7>oi{Iq%sb8}* zqTc%wC38Uo3;72gkxq=B@tnQeyQ$d=-j!??J>{M?@U5e1@dx-`uXeYWD~DE`J&eX< zu65}?(sO04=K@CEKNRWtD)x8SyMd*P1fD<0Wa3*3uB?$y9qt$991_T7mePaa>1|j{ zB3A^mfIf~-GwRoy1Kp_mJIwa;%HkfsL(R@4P#HFS3R@Ttmd@joiZj%WfGVKvs^6}m z)ybNz`L<#}E)0$1hw86)h4T&BXT~Hwj6tG#(DTMSI84O=&nX+B0S|k|^^}9m2-Pp+ z&0ki^JSFsBK%+OmKx21{cr*%cOj^y5WQH@YTs=avaxK^xj)TM=k_5x&S{?Ly_Lq<+ zk`8>z=6~ilztK_uRWIp`)lVAs;_hEnuPCqE#%)$Ke3|wWP{KzHaY~V<*+ESD)HU9w z5EqYuEOqOWi9GJX#*#*a9^+m!$3`hM>Qc!CN6y*=C5yHk{O4?Ymq@c|y? z0=B`S^?B>ieyz`3)$*5R%c-Rlg) zH#|FaBiNR~KT3)X*H^A>lahqBb~2ZDBGUWs;6*eiHVm=e)Tgxy7-{jY028lDBq;TjuitRXx?|*iD^TOiiwD|1oD*)s=>mL zY3F`5aPtNRbtPoj{X%G31;6-&Bo)bi=Tgt&x%q9{g17KD20gAQE|)#76zerBzf+s9 zBxkJ)6OtVGXw*^AM(9%$`6lD-Zdrhc^r78-aaOt2w%(erfYs}>CN9!>pe&Br^CwkD zfq7)!Phm2l%Q{~5I=oTskLG$d5nNy94tD7+be{NAqeqpbtoU}v`=&FSV@i6Jl(xQ5 zysjGO1#rXSK5z%dxDx;oBjD42(Om{=kFC-2&!-coL!7p=NnT z(k9MqmLGeX)gw8bcR4%#+z4pq>Ef+ey;PCTDIqp`?V2VigJzoL8@KHs1=_cycSrU> zrtjf~SAJg0B3Jsu_M-Ox^CHiE7FgnEbZUw~TMZSjWt9L(exe1AD`jZuH#Szqf*M{n z=Kb&k^@v1Ar+u61uR_+trFJ`MkQ9U3=N9b+X#h)FVGS>_*c|=4I}6pHGSyEy>|}c9 z<}Q|L;-0#-Woe6Bs5xa>^kkq!?aTQ#TrqjGpBi}&`~-P5RckRoWMbI^`)>JoN5RW^ zBX!(yxG*1O+SmT%x~>(!akI@F?j<9oSgIuw6K5DZ%QF}|b?DoHD;aGNp?7|j!XEZw z`N%+s{i&6tmQtIx$~`tipLf_d)T-*KOG~gL*w-~@Dz}^otQca7vu1QxOvtGod z<>k8Xzn)Yso`rc|6;2=L-5l%c=28TSUlZD0WMp*4S$;a$=d$QR?iRpdCv6-!GN@oECX)*s5afW8TA9?_vyUxaDib4z|;B z3BG3m4PD>w-IzzI>*fOEzhwQ%-4YZ(*KlQiYm7N53&jJtNvZLp)rSxVJicyFO&zwY zDYud!?Vjc6m8aK$dR$P{2hhDfY1NPqB8m*vl=qpQJEs{7vI6fU7THhr?&bm4jX4qp z!nJKtjk_k}c{6p7{ds5|Um;AQZW=`La8uazJ5N6qn$*mtrA1}7HPAyTg{_Cr2vyAI z78Lx@K${!EH87l-{HdyaZW26PVn$K~c}L(sodem(usW;JUD<@dMas^u+FM=T2wNgux1FzB+}VW1(y#s`38IZv~QgK&q{;cLfC(^nJ^ zbLSv2hVMDxb}c_r=7(s5UEjJ$lts|q>3a&m#RZ$q6Gt#2^){H3;m2ev0Z|jh_%LjP zZHk~Hm58K>3jkocWUVVfu1=W(%!%^(seUv+!U^(XkK=#S5xUU--be^4aKhkm$MI$i zL3%2L8jOjyL8Gq_K0T2DNMdo~`b1FDl|h5oG4OhdlQc!`I9h_EX}#%t5b- zojA&}uN`z>s-ccejC5~cy(```2sXsHf;`qjGx)-ucu2G*^R?qAMU4nl;V}U0WW!M? z!4MU`pRfz(SFyjAy*?ViS{x$~(F+wG`p3MVbiIn2qD4DmTw7u#7d|NP_Qj{yb=wL} zH};(*pp6u72y#?K*a;^7fG;?rVnq&iSMaS*Rw*$~{q@a~8-qw@wpz4Kk=@rA*I!>i z8A-$W*KuZt5XuX;k{i@RGso4o0{e&wC&xR#e`_6|)c}gRESY07dPf|bok?V-G302i zn_8dzq}wmpqeZPf#^<#}G2l8C1G3_tAHbyRJG}(8eqSy8;U|BcF(v|W|CMKM_#O<} z6sftLNL~Sl{z5fWG~L^@RbsZ0?;anzd>38@bE`I#?~pW=||AY24($bJuuKtBoM0CZYU49|6@h2i^{G%!}+%-c*o z=(w04u&zL{f^73%%A#3c-q!)|^h|UfXc$Nt)ZW4Osd=u0?_}x&{na#Z=K(kde>7*% zA|}2085|#QsT>6A%B|l1eWlc@YzXwQkEq&TozXIGik!@{0Bu|Ne(nM9gT2Ou^pyi# z$>N}(1*7*6$hF?mb_UAT0B7~K1-jbbn`2Qg5bs)#~^ERa4o%-Q-CrTK|hn@hrYQybqZ#@|y^UusYrgr5AU zd4J;tnzAJUl(i5C9u(4zHG8AM>2gEq#Vtl4(8IEeYg=Hfh8kiF3U!O86h2jNcyk*LK&AE~#2JYyK1Ql*z!h=F-b0>`wN-8j?&j z1$Gfyc-ZB;qc3^a!Dg*=KTuHva6Ze%FLQFfrvjA4FLPi`l)~yT*jxq%HScV*qd>cq_s#$|v1N4v-;^+wJq3;sV6b~Q=XKD^ zJ^;?GETm_bw-02k&G&Wi7EPSn(CU$NTQ$YRkuR$X`adbQf|8~9uBt6yD)!)p*c2t! zl93k_kKs>7-6KSUqUC~^X08_)D&=7rDx-p;_yTBh+kxi*#b9pfJbDI z61+#-8I|8G#=U*LD=dJ;t!~(31-cQsJ-_IEu;Uh0KNokfo3hd&+48=7s_O_;gt z3Mq)#YL(n6<$rw_Kr9!ICMd0bNxfn_!aWw}oe)^Au!oR(E$shr8?y-VW4!ciTMMg; zVYs;Or^Pe0QWvCqlDx+0bzJmUyCc+f%w`Szo2@JMoQkA6i#C-tYPOaN`lns+ZNS^7<~NxHmIWjhuaJo_I7Ev%BIg1CuoT^vBLiW|CQ%Vq=U5W{ zV3_y9BDQfgwc=q9Tjm-5)lYL8D_?IlWm6`Ze+uL+=IEC#-S{3UG15nbb)|G(p zwe@G#R}B$#T{hh4)^T5$?2a#*K}2;k&P#5N_zlGuR}pJF7yIu1?sd!Z)ghAx$8NYc zLdpAS?{9t6VSOAika~`f%RV|-YP$}$@sgJ6%jwLK@t^!HT6~47BhFaQ4cU^@EE2ss zE~EZy8HtqpJNHJLVCvct=)4iugUtZOQ^AY$-b1L2JJaCY9dA!SF)Mn=NfVQXtG_|2 z;Jo;%meQMEs**xl-KY)Kqcg|VS+&t2$;ZWIw^76;@mO$=9Dg!OJu`IH{vfvM%FqVn z#MMWiM}~1d*`Oe{J>x~ak%|R*vS}$MEn%ueAy?ve(6!TOegt(o81Te^onYt(so9cL9TCfzcU@ z4I4+nji+MWt%_!^RqRz9>{&ZAl|4C+cqqE2fByF@KiPX^@^ViCk+4>e!oZIKpvorn zUfUbAZ)c^F|5=}qal(5i<8>+oa;{VGO(qqIOq4seyp-l9QH+>xBSIhr1oW8EYA|jF zfhVsMWY{es+yavk9Ow^kVtW{eT!Dc%-IqgEvkZ^m_ZRs1~Lm=~y|Y?Vrt*cXV1awmV#h z4W(*uS&AuY`D(%ez8LVP^vXRPV=b?&f1V@|}b+bUaC^fI)Kv5Mo zR<_oyxn6fU_})~!-!#+O;%l#LTMN&u9qkRzQpv4}u&l=_i*wFN-cxFlwARJE(15A$ z+Ay{mY@h>_*ln{2p{tsz@Gl^k2S8xh@`11yEX0{)>9)JK?-{AhcyA5vV20@~0m&tV z@1vL`au&gm3}2N!SP}WR@4kk6{@x-ZJ3pwEdbzVp&oNu!8%5)GC$3o)Uq3(ut?lnD zmQ=LsqRb=QHT~lBO_R8o;3+d{0uN@R$ejhx&qsBiSD{Gp?eM{Ld$p-q&uDn~s9k)w z&ozwM4ANUWj4Ay{3@w%ScK z+RR3000*{d+p1Qvvp^>P6e{CFwt-nm&WtmaR|@VnnFmA2#vU?6mR5|fVt3h1wV?WV z-C9h)B6Np)UO_PPqx5mI+sMi#Xo3$i*rOxY;SrXGE5>8F9()@>aH`wAIL^;)&Ra6K z(a6>lQQZg?)F<2-tW%#6J^gwAj!4cBRii-Un=xpG{$6+IL?TvR#6PZEyL~ao;@Q^^ z))2!r@irRg@|kj}(U;V_ja-uE#XoGg1QvFaSoi8)oo3dsdMFTc08ZGOL%PNmLhhcn z?HJwKSSxwVF`+42LFWG$`D+F0nYhz}*(@;J-ZN(q_Q#A?7;HPMbO|J&xK`ED=!N{R zry*(AtV61vL6uTw8TY)_7C%=Q54A*AsbJ%f+V)L?R!x^Y5j$%73HwmQzfffzk18hh zp@gU+jz<-SE5QNx#TN>~fO~GHvUcZnHp-6X<0j%ZF6)4qrkkjsJLR`uEJTDCaMOe@<#SGdh z(A+YWhIyIhNLXr6-{l3qkbRM_x;6%Bxa(6yz5=W|Hf6PANx&4B@~)jI3&GN{wu7+8 zw}HE-A;0D@)LN^4seM%2CWCHn6V5bCCf-+rcAeXv^JcyCBgOmii4=2oU08wvhf8a? z@obV-D7+D0|vp8^Y8eZUk^i$_tQFX z{I2U9+bG(W@f?ln-chMbLHIfjc_XdlyTi;G!C`C%uWg=y_{icJrF$A+~`&|xpXGS=Fq)Rvx z>M)y@^05T7XR_VI5&k-WwPJUYuMs-F{;6V@J@Tqz1T>O`M^*KP3plnR7xjaCX*C8P z=EXJM{g!zLp$4Vphrm7jBe}e*)~p;Tkz*9;l@8IM?{&!ETAwX>1H~IeB8RmqU8)IB zc!v-?b+_Clb#mj+>2f4ETBs^1y?)rMCc~CZ_Tk*fbarL!y9?CM=J?iVy^Q}En3EkbHiQnX0?M#`~#0qR?``Te07N@0vRA(Z|%RSj>7Ww?oMxJZI zyv1FnjGxo^?(5*M0{PlW<5bt`9m|=qj7_7eR6oi2S*3S6YWqHR3h!VVFc>QJR3QcW zIL@!?KlF$chm~?(`K|v5Y4B_uv+6%o7+Ms|J}01!M!?!58mS znSzp$-CviWT^7ja6j9w&?QWuJS>jUfb&+W&XdyFLkv&Z$!kb>uKN{)sug10z{K4jV zH#@>p63Y+SIEjO*7%F(*?9b|Wk7l9R+EF&~PyE6eMmimCmzxo_W7PaU@AJd>Qn{)E zNYbjlxZDV{a!c8ivDwYu+;e^v3^7=xUpGh2x5iua3b18y(P9hs-*n%W@8NPE%IkLA zc}NE1^H+5=dmpmWA}zfg`LaZ%kjA>S`nDDB?NsBAZZ?C*v@Uz+(%!(zr0`3OoY1NqfS z)1Ov+#d3dlRp)92NVylw{80aD#uIM?{j}+t&TuvQ(v4lk0|^~w8uG_Vl564kzH%>B z`guc0dx3tbG;iSuiSU}bLkJ`mR9ioJVN?1S2c>|iuVwo3|F-T-|Vr>=lai{2jA-;zhQVb?CxO?30sIYiTnv0 zff3|4OKG1-uDaJH0TJ9wj`zm~W(ygZx$&7pLL=J^PK?gx^S<>B@wDX(!=dV%5Tf9xTiDB~0CQpEIj%hxmc zSUtv6Pdnn0`4Y-VpfbB5@NFd5UPAI@Y!jJC7nn%=J;hIu>rSFqW?tNYai@U$4D%7dDs3vxqhmOtnSvXC?xGUrH`D4Ww6eh9-7k~K|!SSMAy-moZ3 zeS16MVeje}gltD73q%j}3!n9hUf;qeiZJL$g|{U>%M1Tz$>Iz%7c2Pv*^Ncl;Eo?+ zz%n0N@XUjF2Y=EcNMgBedPPl%rqz^7j52nv*i-Nh68?Q-ETOYQNg5tG{0OT5x+*lM zigQr7W2J#f&NKP8oxfRR9;cQ%`%tc6XKMDk=A2lsxyEH&G?rxDb zO?hgCQR;0kX=bgW_m4|Yq(2zLCYkjWlq<{fu-KVt)5E+|{Z)rx4$%&AtRRdL0^fk* zz?!|`wd>6AifIncRGKiGoRh~XMXN2c7VUMcSn1Xf1>_aXbux;C5qdk7?u_4_5X|#b zChP)Y90^<3q2%6iP?{ND<|$`+Cc&{bu=KC9$^SVQ{efzvbh&{War-e=AScte&Vfg# z=-h#VXC`M7=PNEootM}oBz5Kn6*?#Ha+k(UFHIPa>8QIP4^j5*`9}+VCUK~#IPYP2 zBGGN%dmz7+s6D2t22&$TGN;d+Qti9FI~~{%o0@kmI#1C8vQ@E(wajlC)Ex;JP+xaN zj8F6Jfy2=9?rUA@+!E2`KfgcZgvq3ys}hC@MT75zQK6Ofa1*T1-aOCyD0`+#O>j(8 zgzO{IqlzL1Rc1t$rIaYySR)y^EKJwYtz?-+Dm7QfB;`iE? zhO73`DTdNjv~VGrR_m*K%wp;tSAdQ4dC@s>6AX3sHBH$2G(gI3%cY}fwN(ci;4=}WJ zHz-IB-JR0iziWJ+XTP|QcfZH~!~f&{;BnwRGxvR8z1F$bd9ItPxA&KOn{qp&R?30r z3KQDvk?3WZInlxy+p|(~h|A#}HNJls7amc!gfv4B1u~b9W}pT$_O9^uUMQdEdN%d> zveW|XWzKTB`#-D%6(kR!@~+zzcpd25fc>hNql$&2ACTNP2Xnvoqs+C1IT7FVjAP9! zZv-@=MV;EMM%)A7tRID?NKvY-#W1Dy>;kqZ6o%1P>Y40XlhH8fjO!O`A4RE=qmANg z1%!c0t`i9M)V(;qgMT9fiXo@>5&pg(C~wSSd`Fxw)WPp5LuNC4c62jkXmT4;q#zaZ z`I-&AfCx2VxNUlmQer4Y;VH2FOW2Dso~dZU=9oVA@=L)fu;Wm#p+AGqD~KH1sZN=^ zR_`+1Hc6cI+sYy_B&d_>R#{1BZtKUmac3IV+h>W*80!B|?oyc zR26(4BG2oHWIu)9lW3e6a-)*lyhGsrj)0m9ayuhj+D8`LL!rNt+Z2iqEcsfbzflT! z0;gY0s2yr5ElaE+2?cPO%fV&O4Ip4PI=6-LH=wMn3vlj}K#Hq)cs22Jaqru5?^I*k zqpW@QtP^hL9w+;pTIUkr{iJpr*6Ve>sV8MhsG)>uB2ofy)(V_pYjSi9c-r>$1^#G^ zsW~<(8f9g+R39rm@6$Qh$%Zw5-d7>FQTi`hw=OjfHHf7-_q+n~c}rS@U|O==*YY+a zBVeH~5qokol@xH=zKUZiy79MxW$v#E;%UbSSxbwamWi9D=YY1%U{%Nc?P^%SGjB-w7zmRRt0M#0`y zEkeywB)+Seb*7nVR4w}AK779sw&j%k8j^VIE!{Q@0R0J%l?;v#)M}2L${*A&Gocb| zBbiyB8MLY=Yhq`;wpT9kpUe{?`VGKg6#)Q*UUV5|{D^_FMtIiIp2JG*b7DrYsdy6I za9rt2*TUijR5--w^I8?In$(M$o|7jRQ%RFGZeQZQLR6Hg-M4%Mw9cx|oRk-~0mf5` zN##s4N}rPxJo#dqu2v@;7N9(k3i~We`WeP|!|ESj3z-7{&HMXRuEuvYpGth|Sp=Jk z;RJ5(msAJ4{zjisfQAhfI|f-1=iYs+*NBGT(x^?xVVS+2K=x~(SbUpA?s~>Gv87KY zoiSVa7Y+|poc%w3|Yd6H$~K{z!#CFJ;P z*w*g|he|nDc>vhh+XWITXsaFeY+54E#+oxK5oVBk8L(g!mBTltI1h-ljvT=zS=CN` zseuwiaL~Bb>_z3(Uy9QUSj>FsF{L5-tSR2iDhdl>+3g%E5yvDK4}}3{VXFc%(~H8= zPbtkVot=qv=jhM!+Q+N-4PQ~F4dJi>Q4uL22b2I`oT)~fCzm>BiinHOm`C?rHD{i| zOo&qP{1|71(%W;ls0esi5AFLi6)i1jFAXm*&ViDW+%7wtCxIH#vyeNF8X>sL1caBo zO!1X3hSYlbpYw+{KFhUOh=bWEiDU&JhO<(nX5ub?S|zSN62?pSHJ@PgoM4@ZTb+Ax zXbhj*q55YnA%mN%hQF@lj*2#5rI8;E6w8$K3SS%8s-78>mI)vZ0xug~FJ??cC_B;7v- z+B6f}dv(?_k81Fga>F2q+KKv4>YB(i|LK z7wK_;Q@ejmqI&=Muu%%q0(AYt0<0>S@wh$Wpo7PX=uj&por}`C9_8X~yA)-&{5A}a zMN|3~)dM8hc&dSDOE&{2U4q@<`9j=p)$w&;2Z6hPjCHR)N~_W8$lSghHcDl5lx0by``CGR{~kDA%N zV=uM2wcvo$?SCjE{|h}yR0q4?!Fv}(YMQ`S^u!2`VjqBxgV$Gbq^vO`zNAO|@j%T1 zqNv#G`mT>i{iMU8uJ$8Ok1jNug?6&B9iNSiO4Y)DEYM3mzvMm-2fsP_Y9*DvL~TY6=3Bf>%6ppX>qbyAr~6ly~}EOs?9b{h^A>(JHkE)uncG z2Ga*Mf@1>~ntliWhWDZA1GbxdlI8RNS zUoR=;PqU$Ndf5cRFZbV-W@ol!zg51Ow!5V#RbI!UVeb{#b)t1B33O6YAx#R;typgC zim4PUj@%9qTji}|2)}$0^&Er;ci7o!W4nzlGb%YOwmQt1+>9+q5$4$de> z6nSC_FK1`&bgdJev1>hMavsYSNuM$}(;+CEdGhx%d?ODM%H5(VuEvk6Z)dJulhO-> zTlaI~&AS~r@B6UOpV5wOuXJ${=CstF@9C1!s5*FKyq&wgu`-z2)31Z0?XHym?jpq# zY~v4&cMxgJ{x9z=#KA?mRHERr{l$6y7meE2k8xf$0x?lu1ecPYQcPM_Z~yG|`58yo zJQQnm+FFOr$qC30*xKN9NuFkdH-;a#hsN;U&?Ovo3$g^mVZ_7FrgWb6;jv#MbG@Ug^dyWEEJ00=ej$n zSud)34g(H57UQfep%?ODt5zedTYWW)Lz>%dGHR4CLYcMEBUq25(!mPU;W7(#9;iFn zCmX$b0$V4JTy||Dk?VjRIwWvT0+EB1PNFTQ7yTZ0`P+tggB>%cgU0)fX6y}4a@(H` z<-+WS9N_#v^HCNEvg=hE%u)X?9AN%sIP|%RwflT?DixqqRdheJSjwaI2T!MUg$?=}Gs$oaq0B ztQf9_>OeW|k2tzY z)aUH>O`BK3#NOZ~z4MzMRrMP@S-V6AifVekQ_DKy+%E3=Ks7gT2bkrh>)$#adhW`I zr~o-gGK4Un?j=n<{-CB^&vPR|Ep3ZWu$Y`}cyMF`WY`OO2_QFg(hki4|{7erb14H%%QUoy$>e>RHy-C zE1oZxQ{c2yL`TM>MO(Fdi7I<{R0EDI94sr}?Z@4S^L&R4gv7zu0OA@3`?WLntM2mR zA5!jt#{-w=q&TuIEd8w zU`XtL+0|1j34+VHBlaX`pu`|p5Ew;8#-Uac%A(E5eNJ3M!lTAFt;vTMKZ!^x6Gxv? z#!iMuykHZ~RjsrrQ4Pk}N_3tLvW+_mSfBG;ff=xt*#(n=U^GTNvAJ@;azd)ljx{Ce z`doHC*LgHNzrQjX;+1Yvz*%xc_7IM`8})L=6X#U<=I%}hdj>F24o1~xg7V=Ck}+Lu z=42m-xb#8h4DOW9W(CG7CIOY!#>Mjzh7cArE+I8Zh{_Y3XCN74#x|}s!x{08vtQYB z1r^^S)!Q5hW3Ufd&1{N}9l?Z^>fs#uoNOxL>apjI7V|l70`WW#ksa_lWlDLtEUQ*` z=A*b4`jc3wc=`P>!9ED)iiExj1@oI11N~mWAIJw9FKH*`<8CLsb2&v_-#{Kfw3{vh zVmiuK5)9vKUq6~6)%Dnqs$x7h;#4eHVI?^~{YPa&v=d-d{WJ+l8~ZLWy74mq*YPi4N2gyN?*c5aW z5l>bti9fc)4HB<{kgJK93uGu=>~O1+y>girsl7KbT{bwSsKjIgvQ}CMRI-N1p5`y} z!TWmp?VvyyS}2X(WUMqdE>JFt76ce-$+r&1OwRA*-cJ=^Q!bq5=*9f}79`E>*S~d(GsC4ZFEQe>rZ)cWPL9l~ap?zCx0ZE{A`-ABe;D|*_kQe`M6u0u8CF>qo$ zK3rzqo`k|bH#*p#EzR)DWx)z}$I{)jzP$;`p5IB# zsIod=`k$Eqc(DB+S*5Os1<B2V+#VV5M|(A7%Tu-;Y^e^cFD()~5ADBJ zTH@gwRa&Z$ELRfG8jo_~nVNCbJcOdsLr&A}29M34Y`=TsS0|sDb`e9!2Jt5bX1MDXL>=fLqrMFgRyW1c8C{)0N(etYWoKhOM2y* z7pe+L>-|$W1}v*q>#26i&eLToNxRv)=PWoB@LLqip8cERbp-o`;++7lh!*I^d-T0H zY~wDv6^<>JLtNh2EZ$7mgVB8O-3XKwB_e6X?*yRKaytB7b=Hx1Mt{xhjmVYNXE|t)&J~V9YRA<53%$`+flukNA5`dpBtJ3j@v9*pqn-jYM49Q*BMO6PxK3!_M^&cm+uYI1HoGPO50 zZ}zE~bW&PcGXS#ygS`{p&pVi}JB7r!5PK#S!;LM!SnV$0gM4e3!vX}>%)vQ$)Vq}| z?QpDM)ZpMGUzA-aaSF_^9r5n3(V7 zmbs!Sgs|KES%W}qx=_Vztgf!Y%TBuNht!t(y-~985@0;f#@s=ImpTwx{LCfd;L;^> zc_vyOq^dWoE5WfXexm$~1pg3mzp843~ZRjBLkPI}!MJ+?jCya*)T$h&N!VOiAAk0kU5G zi#!&iF&kr&q}s)bZ*6YEiG}ir>^-#-UP3v{!UT* zU%iLyRYuUOi)o!De|#4O>nEMJ_u~k3&3}6TcZZ9DlxI0Ktg1gQUPFTdj;!2cpGD5A z*PkPYi|c^QA@J}1`fJ2i0aPL)#{H1oF@`&}i@_ zu3V<+KqIvNHhx-6`PU5i`>V#%U?Q+dCz@UTZc-~4qJC#gMWL%r7EQ85UbYzOX*7&r75jDBN-SyA7Bi}{z8F=A0X{ja*e|%X1kglyw^JFs#uU<9< zL?XHMJ#_A?cesZ34V*_t&0L3RmvcOL9kMCYX4fJk;TzNkDv-y^2eUN0+l}Y{k zPZfGFsZ^?o@UMK}V}Bb=DW^+Cw?FPmQ-geiF{gftt8bu!oT?7ZKrj62H1YQSat$?< z6gTM4i=buJ)c-8KUzzeDFMFgFr3AOef4QkwBQw( zKSy4_(gyHnk|6lphSE;AI2sNx#_b6uOpdY|e00~KU%PixegWRYL(44IqOy7uGM|Hm)y zqQz^}W@rBKD~%ZM)08zf;lv-opPyP=IALb+-> zz`EbmNpHE@jn7}yd-U4K%OGUKG_6Xnb{LRTx@kRS*0=Z2&pV>VEsEso?nLtl7C*ne$@QJPwRtzbm$kXau$vNP<3?{lLys5l@GnQ`kzz^Sa)fPW{Kf zpD!$EeQ@?^AEl@)F|TE(}oZZ^h5 zK8st84W}?g?I!7~A9#xfV5h0*)?d$Px8>p*)Sc>N0EXuMK z$so3lDpU}>`T}H-B&ZIb^AuO5Cg06JHqcBCpW;DjQ3n4>?JK-~G{tSjtVv4q$M=X1uyLUPC2j2v_w$A&AGB!Xm=F zy0>%P%q%9wpX4=J^;pHZ`oVv04D?0P=iiN~5McV#{P@p}2@y^I-5AYoCEcs7eB%eK zxv0}8x!&0y17@!_Q{g6R)bEj@)fT(=|8ZnO(4ecoN5(CI|7!bb$bm%xAMZ9n*LwSa zh~R27gKruKBim2BhJoXIr7y3cvAm$kJwc`7Bd)#4gnxC+Oz3-Fu~SrA^^MN;|8W|Q z&;V;@!BdWPn#Ca5`D!zjBSj66?awkMRk(9?V$dk)p_&YkZq;XPg^1c*ZRYdGKDIT; z@wc;5a=Lo2|D(%nP#2tMrahEw&WNr~OcX5T7*UOVbU|wt_xlPISD)V}N0aq?_%}^f z|LB+hJp6ERnjqv)RK(|s&j`&>DP;zzpUi;hADdFsrW}W7Q zK3BauhW&IXL&${+{YA@y{>M8K-TP~y(k8UuyZQ^!`UiWBH*p7RXF~tk(EnO{eE|2* zXcvn9U-mW<)Sbppcy~CG)brXT|IIX24*q*aIAALL(bm-%?`rEe$Wl{ts(oC4yh0Kc z@br``)DSr3?XQ@q{$3M4BG@m^_S|0mJ+Q03qDu$4t0|ORDYj^}AS<<<_}Sk(s}C97 z7ND!;!b@bbYrQe$RIG4u{@K5hfE4;P7pY0!U%UMP16WEHjVr9wD2yH+&q988?QhS* zQwNLB^I_UQUQ0M9*bSN2IN-RyyRi@~bp75p2Vhq*toj;=9OLgm6o;)`8(B||!8G(hOu`b;~-du~ab<)690d>`2J-|$l_ zf6seDS>V%3j2llhqUY#HhZar zT!-P=d8Qyc$5e)xk2kO$RC)RZlndTJG3DuaP=t1teeOrDiGu&;D>x?>tx!N2b5z1i zP}PLb0TD%PhJ`BEqVV!B478ug$25!)DOP|aJdAzPM1$>TuD!9TqvbYpdWdah* znJ!Il>Rk$I_LTxs^D7{@4^<{%l%S#80)*FYfaV(z2yS_MTpTay*`^9FNS2=Mbc`XZ zqRKufe45%mO(){h@v!Qrj>`h^WrK(kppBERfl9!=f)xIuCE(yx{_tSouU@nRh^2|; zY>Af;TKwqdebc|JP6$}Sb4%~Qzn8pOpmaj)1Yid6=r#HWmr9FwLCx|^K&6nDvE-CD zMQXz!LC(+39uz$xwy56dbr@7{1EXx@bDhPj$Dbv}XWAP6f6J7n%0N*Z1B^W!kb$zwMoAdC-d&nkdK-efSbt zW3CFYSJuH84uZs2jU zZX(NGq?OWsanwZM*Z~<@+;#j_9BEOyPRGe;9 z;j&~c)5n>AlNQsc5I`m!nDiMKuaA`x(59S$=wm4;0}=2;jL3f>TJ~TpQG{8790%PK zIN|e}i4MBGKj99n$L$XJhLGoPXMnuefUvRm>u8!A zU{X7NWE)G@?Cq%C+4(S7c4&Ak*x|Th+LY-0sID6Wji!ea*jyTcZfv^5C>haiZNEC$ z>uxl5RvB=}vXw+K$9ot+Zc~0yH@tg#k9UNYD**S4wH?Td9Ru|!2^r$V)z>`mc5fq# zR^T)jcO?jn0m8hqgBIaGS^)htyTPn^uL}0+K}6C>{dOxd54r06U~JdCi+}9_GM2e> zYA%`tMOuFLH?7aKUMBE^?M48EfU{R!Zlf1}r~QBo$LeV)Q2B{6qvEVPwKHeT8xmZq zvY54mn!)-&I+r1cM!L1M|I`ozX!Y9mUJ2=67VI4M*%?CKar_hJNE5*XX<}CMP3$LC z2UBfwPj-EW<4s7d@t-8s1*sS>>AHuMT#Wh7JWM2f&IV>(zoYg5OQ^RJcQG-mGYDOO z%lPUFPpSq*n=u>Z#Pk~zKp_{TmV#>dDX0z1jaP7gn&>riMZ{Z_C6F8OfG`^*;lBpj z2%ZlfBP~w~V+^n;JijBY%`8Y1ub+P;l9fC%R?vV!K1}8ItM}K?g6|4#(p_oSW&4Tx zxNP(q*L@sA2JWH#)pdR>zWu?}{UIu}_>(n6PN{M0$4!gG3xQ#?e6IMrEDWG)oh&Ef zLQAdVc*O4X$qQe6uZ_P5VD5)@V^G-oQ+n?GsFjFzL@`QV7+o@Cxb(`r&27CWYqiw) zW5#A}-TamkGE$&2G4LQtvfhN`C#3Sbw$sF0G72ZiOm&#R1|Ki;_5mP4TO9(~2jMyf zL#7+YDIXpNdq-q^HoxD2+6BZ?ESugDbo=$W)d-f(-augty|L0M1~zv2yI>ojFUbn_ zLq?z(^XjOs&EvBWkhL84yFNkY%0d$O2av)T%?ti_*#WIh-yo3VXzx~d+_%P4`Vw`c zgn>%ObyEvlKV`4;HQn`$@dug{sfk_}6+a>}C=lm)bz$fvuae>s-%lBRKuMdyuU;3& zDS|}QP6!Au8}ywYVJ0#jW%?<7e31?r&QwoacO5wz(lxUliBeVXJlS;cwy0hq0ff_^ z+SXbr-3euruX(kcB;|g_s#?Dg*lAoTJFUg*yJ<~E0}2FjgEnO_R3^h%e7u#ECT4O! ziYKsD{rYwQR?U1EE86G>_GoHoKdG<E+ou}&iu3BWum6_gUsTu?0Ny@6Z^;lCF`oNKQn=?FNuZVl-An2Ny z@uSM2;5*VNAe}i=7^^9a7K@J?K`hCNETBFHic08)OGQjq+ONC}S2bM%;w^=MjzRne z@urz04a)F%RhzFEkS_WLUm1j0f9b~ZNki=dJTl4`#`yBcG#iN7Dr}^k*m@EO#`xN_ zsHm#b6EYxvdRJzEAZ2J>KIlHJm$59}{(kuUOueFxPyB{=V#-(H+4@bkUr%w8hlVOUjRhzgZ#0K zixVz0w$DSIa$}ZS95&DDf^fVX>l@xNwkAvCy`!#n^4qsN7+w+;n29XHZ5ONm4QQBx z(h+i<_L7~-Xeb$ml_|!O?u{Kt3NEN_X8k#NK z>5^cJ9>17FKIAJJ32qVj{c;oOO{a0HP(5Z${1s-k!DF129xW5uEwmKG__Y9t?+!qM zCsdsu1Q;~Y5Ylgf^*RP5UG73G3-ZHFT)(rm0Zt)UsB-r0fRAGy`XspfwVX0xEI1OO z$cUiQgxFg$vDfvJRl^ZsB3jmq+l&O?gbsx=Y1n>rQG1-{)h**MuUzA}C+Lwk%NheCD@xmM)(-{}G){J+bUIL09 z4LJ2qv;51vaKwFWsT4A_megoFQV&IU`_04cEm~GrJLBKusy& z$Q7iSzM7z1uXw}}vip6nt9mw=l|)%lZ=4$+L8SDYXP_zuNzsNq5)L_EPQ18id0`;r z$~gJj56^rdO6?$2ggO6&mkYAzh~5kYHQ+Qk)vfGYa)i(>hdL{ugB9=m`2ge?>j46` zvceLwE__xzA`pBM$2; zkSS_DprTe%v1mG8WOw0fUVH~R*Ioab>!B1+`u0+F+R3WqI)VI@)ky=}+mlDHJdYP} zznNS+0L<(M&v)0s{1mQzV}%qQvp752o;1+Y2TEYR)bFiD&R*E&JEdK3oWXvT7it zMe2xSY2+;8o!pnTbOHH!n7is!m8b6MvzwDdzti| ziZ<@)G~ph?PlkT$AQT)Skn{xL1)c-*o?GR?Qx{MbD4 z9Frt1s%W>RzuUZqJDUASF2r@O8JkaDkY`*@WF=GdO;8og|Fa#2uF0B3fwWe%`w8&i zjGQJsBPLvT9T*DXkq(;4RSCk&w3>x&Ea>WCg7zYA)3ti&CM}LcoN~!?99U^UxL9t~ zHRojC0aH2Ki#xA}2o-0WQk(n;S=J2D#%UD`F)6G?#q6>1P9V zvu(yB$IQh1zMS(X(R7X#Af=Wnjm2bmOG8!Dg1c(|v#kD6cWIoIRQa_*e3W619b^;QU*v|oa9UiTD>mx@oY`^@*5~0DoMaN`X#1lqjC*H zN7D7Rv}vWGJ<8AJ3ZOJuX)+k$&nlD_sVRl+?mCTV^iTf<*bzl)IxgwPrP_`oEr79lh_s*rs?t`|OV#&eQh zX7N?Th6x~c#m~+N z;L{yU`j;8(9^q%MO9W0TO+WJYp1UupAq3V)R-2B6MqH!MCM>FPq*F|kDu+x^wLh?j z>xTp27S34y$`F*}x|Yj?lWbCO+9%77=j7L&>79DWQIjvZUOHweTa2IU_SK&@MC`i( zt*Ii45x|59T3@6byPxKHr_MnOmUo}tK)yA!;bY^FRY? zmLe!>R|6)s7ERjIF~YL^M<{9qS;gL|-2U_|CofVW{3Rrx^g6y&>L*SBY_DAx`QG8_ znRneO@cgpKQWgeYPPpH60nnY?W$Wa2d851>8Z<$!>29u#MWHovX7P9 ziSIVa7}LlXsk;*_>rr{AYSe!!`=TQ_{^jw@K4!wD#kc4IuFL+H!dKGI(hK6&&Z z_Xrri=IIM0-2t4(^iyXECkJIkU1ofQ5#0*OA)v?g_p21TtlG^hrdAoB)tG)@?=2L| z?S~0Dty{3y?Ya9I$n=yDkv!f=_o_YC80nZ3;nJ1}^uGOiy6y%DfBX<-{4(+sEuPb- z#QNa2ykMc&k+q8oQ?Tfx2q&q20kMdal+AEyG>Ra$o%ryi`Nu8|&6gKlq%T|@T5zKj zEl{Lx3K4BfB>!}W8DR(sG!JMd*SkmHn@QJy%1pYjgY-Uq2zUy-S+6zcXmO-SjL6y) zmpRn!u=zw5#D`g2gBd7!TlpP--N6d5JSr`S2hFLAvu%4zw;V#w`w;7rJi5bZ9iUd* zhc}U^2aD3eB6Hbz8jSsMOJ{$Q#S#~H7Gn%#gflCu_nPd1 z+xX=MV&SWjsiw%$j_*$AGn;M*%k(nJbDi7L4~VRrcYy;Av6TszDtyU1ZrwCZh1WDf zFI*9HmwsHjTG2RPCeH9SsPvLC&;JngfY6!rb5^6I&LJuxtn9?S8bYHeB5S16SWhp! z(IAkApWe4m=sa%IR-(ZBSM*6<*zk+Cy`x`&#i7vI$J~Nh8L_(& zlZoM)5lbuXE=!3XraoKrR!PT8x-?$ZORHv@LkqZbLrVnTP<+UcfxM;!gt&@Cy~(|; zkm?+aP#~C)>RTiavZR4Z#%$es@0JOUcAkPkFSlp}79Y+W>^WPq^pV1_tK@R{yKsg( zrn8xYF^VqmBD3JU6sM;{aJFgVnrNgXLd_eR7nu)nhH@XF7WPzf1jAFlGeezMpbWfb zY&t_M^wZB@+YMc_&A&MjeJA~-0(NL2$zU>7>mjVZuPw6lV;;K0tekM7uvt!~_L9$Q zKcjJmS?0ajMol{X4We6YL>uz~Ky}D!p{V1uC8R$2J(b2KQ?W5t2_FGP37e}|=8XaM zp;sp9QK;Kb_4*vbkkVdw{$<8s-r*~vFuoYdXxw17kEgXk)^#do09#tk8+}5`CPcG2 zWT(0BchFDmukB;tTAtR84vzvvSb1#$ajA@%K2vRmp}uloAJeq*xAWb34ADJ<**x;w zYPJ5?&k5TdD*Is69swe|oz__SQBUhX9Y!|?q@{>4O&b^J;POYW*(AFuI}8#OZzy)w zX6^}rB14I`1JUH)1|zegSM-F*vUyx{=}_hN;$gqml5?%5Y6~TmW$Nz=x!TiAHtS>t zVeWCJ5V{XkOF>^r%H@M9t??{A>BI2bcg}xClpb1+k!me{X0`gpRyvtSlS?LGgBpq! z@gcvuH+s1ztKls-O~F`~=GgF~?u9V6o)asdj2FT)-60+)o3B%!34fB;0gk~sY>fJS z0^ae;d|2+GD)}(4u2+=EQnONb;lv?T_>>c`szzST`Bu|M_s@-8C7SkyXTs!!&w+;) zUwojozpB0A=DBYw{zDpj@7G9Cy_x7{5!v_9$GS&cl6yT>CjBzle6C*x1d31PSlI~z zZXd?x)c`gH+S*`X8?iJU3z4#BeJ`DXQ?3ETQ~Az8`FDz240Nc*gd$vQY)K{h+S!rb zbJ6PNn%y!uW{1tUA1C?{4a!a`Yuq0y0lIvgci3?d#jVIv!4y?r!%mcMKjCKPXi`BZ*Hp^*WND|FekKTdjw_sK2#c;QG>0&MS2DUhKO|`8Jsc%FRQT>P zG>b+NqMmtCE9Qx<1x*rm*_n4&)F2(TaJ#rh&MjL%R2G$!b3rAJ@Q5ansF#+Nr_Wge zm>98pFXPXRP9A{EqTj2V&${QN9wg8^LN$5&1D&CE{Y~iGFWRMP?;`#2I{C5|n<@m= z=?GhLJ0qUfGxrTlN+f%y`e{t}c)Z{Ksz9qK9_hS#(eDA5{6)W`+_-nm766;Wz%^A2 znhlOl9+6j6b3XK6B(YuuOz!$!S$7XrY!s=lzB`TZK+%;!bu$I#2Ncmrux4a+)75m{ z@3OKZ^v@~oPqeZSwk%+<*@eIyt}G;^Pf zO5WmQUUsS-_jXB)bk3)qThP|0^DDDOrdWK6pQMJOdSF{lEib4z&2mdr8=Sp2tgz!Y z%2Va*70DM&?%#WW1SM;IZM^lhX4`3M-U4U)==e8+!m|%Pz{QYaJ+{v9@$9Vb@vb15 zM3BC&P-RCA9e*|8iD&-4ge26-s5o*q1?4T?gSJ?Ie4!+|N7y8`xPwg}{S!fP)$zUh zh-RLVH@86%m_%N)5_F1*II?=uI+<9(_(nHnk&8S5+lnD1>}38k=24Kmru%lwbyA&* zMAmUAm1{)sZGL3QZghg?jet1X>E#(Is+ZC=X^m^EwLRxEMKBz`;1O1v2P^uK(6{Lh zamCS*hKT3NtWvKKNaX^}&LN_{RU|Bw;AoBkbpTP0(G^BYm7YF;${1LTwcs+L$Ho=R z-L}RjbB?5R><^NZ9oUpTeE4CsyW(gmS$c0}*d)t(s5a&#)}lbw2|*^p8Sut!J@*H_ z5S={V2_Y!$m3(aLIPAhJaO&H!d%A&v8Y=6z?utZto~bnB447p`@Wxi zhk;MAETl5|2pUNaZGAmENXkq-~jlm#GPnc zNTZ*imP`N>V!D>#^`%VBY_> z+;cit`;GA@){>z(&`QR6y|h?r>E_!)IY3ZKy#h7V@Yy<`W%_()!hjw>D0~BqcBHz_ z6g^p*behm=W}{d$hmsO{ysdZ!b8X@5;-f;6qLb%UCj%rtyxVE$ zTz-DAgPEwy>v+NFbkpmCd_I=`@GM!Hqs4sobW>w$GH!uE^5;jRFmI)gciL8?z+-9- z%;&}eyb;chY%Z`tdk4(Hl84_T#f zw>@nSlg);Cr<%bh^%9702|VO~`bq@*@y>}gqhe{A_hZLjuaHDp+|~PvGMfc9_i9yu z+kPoz{*sU_J!U#-6E(=j602m9$a;RIXuFksX)PNs(zv#vc9JN5K`J; zZHWZ!W3YDZPK4{!^E*8fdc_dSSO5lS6?DlSZLLt*mC?g~?8?mQ^ta!%F2+h0te(Ya z{d|y3bw+pXG=~{A^hA9&=IOVW4BO8>D7VH^S??dx7FI@9%$&+BEI6Nl7N*q^6pi|V zq6Xdg0@jPN*?d|aO_Zg*44TT6(#rL*Y)j`yh7XBGe-(ZCnpV{E%xw5{vnC>cuE0yk zQezHA5hrW`uMwHib~~KlT^}ek`1PZWx{F}ke}QJ&pYG@<(rkIK@A$2hcA9QZ*{mXE zEiTh@t~KPbq^)%)sW4=YzZctY=1Dpl#e&kEhmftk*j8R57cnz`<6Nqtj@Bw?LK*BH=C%4r0zHSDJc2IvD>46I6SMSJNWVYM2-Ah3Y zwGx7z{rH3zl3PCa0xCLAbn$6+B$pG3)4fLGbd}FN7)V)FY#w!BZx6%-%KlJ2ll4e$ zRo6hL2v~f1)(axpt=w#hdFouZY-D1sEb!0oREen8aw?Nn2(;n#R4p+*%%mdv5Zhh> z0{-OAnRJxP1RaB6C4$e90S*r4?F_0n^RydX(bDd=ckj|SuFL>9%?5@^Q}LuqWUsdR z7Ccn=WI4q~t!cM-I+ZF%b_C!(#1F*pbbe8;?``@HAdulC_S6MwLFLREeIDRKqaOya z%PXN#R5Z!HV1A3^!oYj3|2R}RP&_M3C>@Q{gO@%5TN!Rik?#Rahmt9&{vP@1ieCA# zuT_?6)>~*g({Ys-+5aShEc%J_lHp|Px!Ts-?A z$UD{T+4VW$Pxm$QS_Qeb6;b^s<@djC7J=p4EJqu{;AOf_195h!;c?$r(vZbM`kC!4 zFGFav{b7ZiAudd=QZJS0C?!>UMM^aFRX%gfA`cH}FuBmP+gjRINpuzi0(I4&#Uo;z zLBWQ=DiYwjyPN?yql22g6h!Vm%B@pN{Ns*Jq_uM^CdYpT+q5rcpbW2q9-PZyGDLkv z=YB3~Xf-cLjhN%1chtOoNj99wW1(SAMHwDLv&l5X<)?SFHDmeGZ#}_j@`*Ezu{90D z3{Yvp6_0A6!2j&wH@1MqccLG~LE9bI3Z-J<_Iq0BAsfUPQWMyvR9**y;OveNA|VQG zn-*ev_T(*noX64qfXABl`714SosRb)6F?5d#&eEi#Q0~D9euSr*T&z`=~7`c4(WQ; z3~^V0#oqj8LbK(?W5D6D0CYC5tb9Zn|7DHFw#|<`qqKR%M5|cc)@8ljLa^9kQqUHiss=qmvEb(qJ8@BwA ztct0P?%IlnFc+lM<9Ojq(*!V7S_J}c-2E(~V}2ba<4(e;NTB!J=KbGGSvHC_1LFs= z+d#sx;*UVnEfv2pkh5%|U=9}ZdD8L>eU{MKRulRM{MLkwcOX+B`A5eRC|7{*RFjCa znO^Wl8bY87b{ebRU%@SKOuQkm0k;!B9$$M}MvN~z$>;hiJ32h|9aC-)Eju)G!g(%) zA-_Z)hKV9%9JzyU)6w%Wj<0N=Be6ZgnU0-x2y|}m=?}K1i9sQlTW%y^Z%8hl_L_sJ z`aG4I;4-o_g7W@O8xSyCnNAi?oE{klnGX5^Z{;07zXVwyj0==8GplPO=24ci^No5x zzbm~0aJA#6g#6MWc~#*Blyx{#UgSq&t#p3wul9S7jW|>_>s{Xd!Yy^1@|v%<@ai18 zSD751MrmiZVXss9A-BhaKJMh$$Z^i$F{27HG*y@g%F6MnFE8wjg8Uw;e2w?twD<%8OngYBG@vaHXos9J+aUq?S?u)(H=7phqw; zgS$8x89YvFgPr_~485k}md0R}FIPg7?n0wgdeY`?e}RxS^ZTA;N0XOU#)%ZC$pcf?VsO*ZWI;YL6y^Rg^Ta^hZWD}wx26sU)T^gi7IbK#_-M**gz&5dJ6!a z6m$CM{3a|Vh~tz&q(ZPZhB*u)`>id?U?orbQ(PgzC{a_kMX; z&S%0#eFHTFFnJKKY~$5%(Hu9cLTa|gGkxLXHk%z%c<0q8 zrKgkEcUqK{>W{blf=UskgM26@Kc*l8|pk`KR>WjC-OF;U}qB0k%h zgb3?S1Ux^fhG&5wMEfSQ=r#{A3gf*@vY)U+j$FUBKzucfQ z;Ik*&&|p8usmW8&CgXjtDWP_gUTZrGAi%B9={U=8>~*o;1YkrFA_=+1z`FnK3ZZ`s<1MQha2n`pZyZxi{IC<|&Q ze*X;6t&?8;4=pd&uvUEfOX#Thpe5WOdVN?tY$3$8#-Hv_gslbQo5l)qV0>NFRvPLe z0j}UsSQssv&|!lGq+{_9#h}7% zDJx(dqx&j>B3Y1+vx9`er4nY$tXj2ZI90FFl*Z@r#z>*@WsX~foPce!h_)$ftf4SiWY+Mbie zH*Dj6CZep-)`*80^$f)bl)ov+Et}-ei!EFUR$=W;j;Z)caWVtS0L2zAe@IXZF>qZ8 zCzUdm2Ef0KyD&_LY zuRG}*T&d7%AbWI6kjiB>J^oAkx3_BY_c}^P->^lHzA(luzK9F)IQR1vYc<8;^Ki2= zWD)s)jJ;)4lu^G2Du_}7iULX_Aku=Aw2E|hhcrX?&=M*jAt^204Fe1f(jwj6-Ce`o zqvu_B-LuZQ>wNGN%VF5he*XE33NX-oC2$FC?-HBpCn@ftTl(~$w{qCaw8xz)@j>

rIeO?;p(^ZTY;!iiOS?#a9zgf% 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

W~LMp8CqsU#-Wt<0lp=3V+}#ArQpcA98lAww)~ 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 diff --git a/launchers/chat/src/main/resources/META-INF/spring.factories b/launchers/chat/src/main/resources/META-INF/spring.factories index 2821fcf14..1c807eb8c 100644 --- a/launchers/chat/src/main/resources/META-INF/spring.factories +++ b/launchers/chat/src/main/resources/META-INF/spring.factories @@ -3,26 +3,20 @@ 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.TimeRangeParser, \ com.tencent.supersonic.chat.parser.rule.AggregateTypeParser, \ + com.tencent.supersonic.chat.parser.llm.LLMDSLParser, \ com.tencent.supersonic.chat.parser.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.DomainResolver=\ - com.tencent.supersonic.chat.parser.function.HeuristicDomainResolver - +com.tencent.supersonic.chat.parser.function.ModelResolver=\ + com.tencent.supersonic.chat.parser.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 \ No newline at end of file diff --git a/launchers/chat/src/main/resources/db/chat-data-h2.sql b/launchers/chat/src/main/resources/db/chat-data-h2.sql index 8c65577f1..9da3c2336 100644 --- a/launchers/chat/src/main/resources/db/chat-data-h2.sql +++ b/launchers/chat/src/main/resources/db/chat-data-h2.sql @@ -1,29 +1,72 @@ -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 (1, 'admin', 'admin', 'admin', 'admin@xx.com'); +insert into s2_user (id, `name`, password, display_name, email) +values (2, 'jack', '123456', 'jack', 'jack@xx.com'); +insert into s2_user (id, `name`, password, display_name, email) +values (3, 'tom', '123456', 'tom', 'tom@xx.com'); +insert into s2_user (id, `name`, password, display_name, email) +values (4, 'lucy', '123456', 'lucy', 'lucy@xx.com'); -- insert into s2_chat_config (`id` ,`domain_id` ,`default_metrics`,`visibility`,`entity_info` ,`dictionary_info`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) values (1,1,'[{"metricId":1,"unit":7,"period":"DAY"}]','{"blackDimIdList":[],"blackMetricIdList":[]}','{"entityIds":[2],"names":["用户","用户姓名"],"detailData":{"dimensionIds":[1,2],"metricIds":[2]}}','[{"itemId":1,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":2,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":3,"type":"DIMENSION","blackList":[],"isDictInfo":true}]','2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); -insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) -values (1,1, - '{"visibility":{"blackDimIdList":[1],"blackMetricIdList":[2]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":7,"period":"DAY"},"entity":null}', - '{"visibility":{"blackDimIdList":[3],"blackMetricIdList":[3]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":7,"period":"DAY"}}', - '[{"question":"超音数访问次数"},{"question":"超音数访问人数"},{"question":"超音数按部门访问次数"}]', - '2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); -insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) -values (2,2,'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"},"entity":{"entityId":1,"names":["歌手","艺人"]}}', +insert into s2_chat_config (`id`, `domain_id`, `chat_detail_config`, `chat_agg_config`, + `created_at`, `updated_at`, `created_by`, `updated_by`, `status`) +values (1, 1, + '{"visibility":{"blackDimIdList":[1],"blackMetricIdList":[2]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":7,"period":"DAY"},"entity":null}', + '{"visibility":{"blackDimIdList":[3],"blackMetricIdList":[3]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":7,"period":"DAY"}}', + '[{"question":"超音数访问次数"},{"question":"超音数访问人数"},{"question":"超音数按部门访问次数"}]', + '2023-05-24 18:00:00', '2023-05-25 11:00:00', 'admin', 'admin', 1); +insert into s2_chat_config (`id`, `domain_id`, `chat_detail_config`, `chat_agg_config`, + `created_at`, `updated_at`, `created_by`, `updated_by`, `status`) +values (2, 2, + '{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"},"entity":{"entityId":1,"names":["歌手","艺人"]}}', '{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"}}', - '2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); + '2023-05-24 18:00:00', '2023-05-25 11:00:00', 'admin', 'admin', 1); -insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator,last_question,is_delete,is_top) values (1, '超音数访问统计','2023-06-10 10:00:52.495','2023-06-10 10:00:52','admin','您好,欢迎使用内容智能小Q','0','0'); -insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator,last_question,is_delete,is_top) values (2, '用户访问统计','2023-06-10 10:01:04.528','2023-06-10 10:01:04','admin','您好,欢迎使用内容智能小Q','0','0'); +insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator, last_question, + is_delete, is_top) +values (1, '超音数访问统计', '2023-06-10 10:00:52.495', '2023-06-10 10:00:52', 'admin', '您好,欢迎使用内容智能小Q', + '0', '0'); +insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator, last_question, + is_delete, is_top) +values (2, '用户访问统计', '2023-06-10 10:01:04.528', '2023-06-10 10:01:04', 'admin', '您好,欢迎使用内容智能小Q', + '0', '0'); -insert into s2_chat_context (chat_id, modified_at , `user`, `query_text`, `semantic_parse` ,ext_data) VALUES(1, '2023-06-10 10:40:49.877', 'admin', '访问', '{"queryMode":"METRIC_ORDERBY","aggType":"NONE","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"nativeQuery":false}', 'admin'); -insert into s2_chat_context (chat_id, modified_at , `user`, `query_text`, `semantic_parse` ,ext_data) VALUES(2, '2023-06-10 10:42:02.184', 'null', '访问', '{"queryMode":"METRIC_ORDERBY","aggType":"NONE","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"nativeQuery":false}', 'null'); +insert into s2_chat_context (chat_id, modified_at, `user`, `query_text`, `semantic_parse`, ext_data) +VALUES (1, '2023-06-10 10:40:49.877', 'admin', '访问', + '{"queryMode":"METRIC_ORDERBY","aggType":"NONE","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"nativeQuery":false}', + 'admin'); +insert into s2_chat_context (chat_id, modified_at, `user`, `query_text`, `semantic_parse`, ext_data) +VALUES (2, '2023-06-10 10:42:02.184', 'null', '访问', + '{"queryMode":"METRIC_ORDERBY","aggType":"NONE","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"nativeQuery":false}', + 'null'); -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(1, '2023-06-10 10:39:55.178', '超音数 访问次数', 'admin',0,1,'{"queryMode":"METRIC_DOMAIN","querySql":"SELECT `sys_imp_date` , `pv` FROM ( SELECT `sys_imp_date` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` FROM ( SELECT `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_f370` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_DOMAIN","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","pv":11},{"sys_imp_date":"2023-06-04","pv":14},{"sys_imp_date":"2023-06-05","pv":1},{"sys_imp_date":"2023-06-06","pv":19},{"sys_imp_date":"2023-06-07","pv":18},{"sys_imp_date":"2023-06-08","pv":24},{"sys_imp_date":"2023-06-09","pv":23}]}',0,''); -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(2, '2023-06-10 10:40:12.259', '按页面', 'admin',0,1,'{"queryMode":"METRIC_ORDERBY","querySql":"SELECT `sys_imp_date` , `page` , `pv` FROM ( SELECT `sys_imp_date` , `page` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` , `page` FROM ( SELECT `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` , `page` AS `page` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_ecf5` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` , `page` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"页面","type":"VARCHAR","nameEn":"page","showType":"CATEGORY","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_ORDERBY","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","page":"p1","pv":2},{"sys_imp_date":"2023-06-03","page":"p2","pv":3},{"sys_imp_date":"2023-06-03","page":"p3","pv":2},{"sys_imp_date":"2023-06-03","page":"p4","pv":1},{"sys_imp_date":"2023-06-03","page":"p5","pv":3},{"sys_imp_date":"2023-06-04","page":"p1","pv":3},{"sys_imp_date":"2023-06-04","page":"p2","pv":1},{"sys_imp_date":"2023-06-04","page":"p3","pv":2},{"sys_imp_date":"2023-06-04","page":"p4","pv":4},{"sys_imp_date":"2023-06-04","page":"p5","pv":4}]}',0,''); -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(3, '2023-06-10 10:40:49.877', '访问', 'admin',0,1,'{"queryMode":"METRIC_ORDERBY","querySql":"SELECT `sys_imp_date` , `page` , `uv` , `pv` FROM ( SELECT `sys_imp_date` , `page` , `s2_pv_uv_statis_uv` AS `uv` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT COUNT ( DISTINCT `s2_pv_uv_statis_uv` ) AS `s2_pv_uv_statis_uv` , SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` , `page` FROM ( SELECT `uv` AS `s2_pv_uv_statis_uv` , `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` , `page` AS `page` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_022c` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` , `page` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"页面","type":"VARCHAR","nameEn":"page","showType":"CATEGORY","authorized":true},{"name":"访问人数","type":"BIGINT","nameEn":"uv","showType":"NUMBER","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_ORDERBY","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","page":"p1","uv":2,"pv":2},{"sys_imp_date":"2023-06-03","page":"p2","uv":3,"pv":3},{"sys_imp_date":"2023-06-03","page":"p3","uv":2,"pv":2},{"sys_imp_date":"2023-06-03","page":"p4","uv":1,"pv":1},{"sys_imp_date":"2023-06-03","page":"p5","uv":3,"pv":3},{"sys_imp_date":"2023-06-04","page":"p1","uv":2,"pv":3},{"sys_imp_date":"2023-06-04","page":"p2","uv":1,"pv":1},{"sys_imp_date":"2023-06-04","page":"p3","uv":2,"pv":2},{"sys_imp_date":"2023-06-04","page":"p4","uv":3,"pv":4},{"sys_imp_date":"2023-06-04","page":"p5","uv":3,"pv":4}]}',0,''); -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(4, '2023-06-10 10:41:18.589','alice 访问次数','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `pv` FROM ( SELECT `sys_imp_date` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` FROM ( SELECT `user_name` , `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_b825` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","pv":2},{"sys_imp_date":"2023-06-04","pv":2},{"sys_imp_date":"2023-06-06","pv":2},{"sys_imp_date":"2023-06-07","pv":2},{"sys_imp_date":"2023-06-08","pv":5},{"sys_imp_date":"2023-06-09","pv":2}]}',0,''); -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(5, '2023-06-10 10:41:48.211','停留时长','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}',0,''); -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(6, '2023-06-10 10:42:02.184','访问','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}',0,''); +insert into s2_chat_query (`question_id`, `create_time`, `query_text`, `user_name`, `query_state`, + `chat_id`, `query_response`, `score`, `feedback`) +VALUES (1, '2023-06-10 10:39:55.178', '超音数 访问次数', 'admin', 0, 1, + '{"queryMode":"METRIC_DOMAIN","querySql":"SELECT `sys_imp_date` , `pv` FROM ( SELECT `sys_imp_date` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` FROM ( SELECT `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_f370` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_DOMAIN","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","pv":11},{"sys_imp_date":"2023-06-04","pv":14},{"sys_imp_date":"2023-06-05","pv":1},{"sys_imp_date":"2023-06-06","pv":19},{"sys_imp_date":"2023-06-07","pv":18},{"sys_imp_date":"2023-06-08","pv":24},{"sys_imp_date":"2023-06-09","pv":23}]}', + 0, ''); +insert into s2_chat_query (`question_id`, `create_time`, `query_text`, `user_name`, `query_state`, + `chat_id`, `query_response`, `score`, `feedback`) +VALUES (2, '2023-06-10 10:40:12.259', '按页面', 'admin', 0, 1, + '{"queryMode":"METRIC_ORDERBY","querySql":"SELECT `sys_imp_date` , `page` , `pv` FROM ( SELECT `sys_imp_date` , `page` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` , `page` FROM ( SELECT `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` , `page` AS `page` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_ecf5` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` , `page` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"页面","type":"VARCHAR","nameEn":"page","showType":"CATEGORY","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_ORDERBY","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","page":"p1","pv":2},{"sys_imp_date":"2023-06-03","page":"p2","pv":3},{"sys_imp_date":"2023-06-03","page":"p3","pv":2},{"sys_imp_date":"2023-06-03","page":"p4","pv":1},{"sys_imp_date":"2023-06-03","page":"p5","pv":3},{"sys_imp_date":"2023-06-04","page":"p1","pv":3},{"sys_imp_date":"2023-06-04","page":"p2","pv":1},{"sys_imp_date":"2023-06-04","page":"p3","pv":2},{"sys_imp_date":"2023-06-04","page":"p4","pv":4},{"sys_imp_date":"2023-06-04","page":"p5","pv":4}]}', + 0, ''); +insert into s2_chat_query (`question_id`, `create_time`, `query_text`, `user_name`, `query_state`, + `chat_id`, `query_response`, `score`, `feedback`) +VALUES (3, '2023-06-10 10:40:49.877', '访问', 'admin', 0, 1, + '{"queryMode":"METRIC_ORDERBY","querySql":"SELECT `sys_imp_date` , `page` , `uv` , `pv` FROM ( SELECT `sys_imp_date` , `page` , `s2_pv_uv_statis_uv` AS `uv` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT COUNT ( DISTINCT `s2_pv_uv_statis_uv` ) AS `s2_pv_uv_statis_uv` , SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` , `page` FROM ( SELECT `uv` AS `s2_pv_uv_statis_uv` , `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` , `page` AS `page` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_022c` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` , `page` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"页面","type":"VARCHAR","nameEn":"page","showType":"CATEGORY","authorized":true},{"name":"访问人数","type":"BIGINT","nameEn":"uv","showType":"NUMBER","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_ORDERBY","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","page":"p1","uv":2,"pv":2},{"sys_imp_date":"2023-06-03","page":"p2","uv":3,"pv":3},{"sys_imp_date":"2023-06-03","page":"p3","uv":2,"pv":2},{"sys_imp_date":"2023-06-03","page":"p4","uv":1,"pv":1},{"sys_imp_date":"2023-06-03","page":"p5","uv":3,"pv":3},{"sys_imp_date":"2023-06-04","page":"p1","uv":2,"pv":3},{"sys_imp_date":"2023-06-04","page":"p2","uv":1,"pv":1},{"sys_imp_date":"2023-06-04","page":"p3","uv":2,"pv":2},{"sys_imp_date":"2023-06-04","page":"p4","uv":3,"pv":4},{"sys_imp_date":"2023-06-04","page":"p5","uv":3,"pv":4}]}', + 0, ''); +insert into s2_chat_query (`question_id`, `create_time`, `query_text`, `user_name`, `query_state`, + `chat_id`, `query_response`, `score`, `feedback`) +VALUES (4, '2023-06-10 10:41:18.589', 'alice 访问次数', 'admin', 0, 2, + '{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `pv` FROM ( SELECT `sys_imp_date` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` FROM ( SELECT `user_name` , `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_b825` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","pv":2},{"sys_imp_date":"2023-06-04","pv":2},{"sys_imp_date":"2023-06-06","pv":2},{"sys_imp_date":"2023-06-07","pv":2},{"sys_imp_date":"2023-06-08","pv":5},{"sys_imp_date":"2023-06-09","pv":2}]}', + 0, ''); +insert into s2_chat_query (`question_id`, `create_time`, `query_text`, `user_name`, `query_state`, + `chat_id`, `query_response`, `score`, `feedback`) +VALUES (5, '2023-06-10 10:41:48.211', '停留时长', 'admin', 0, 2, + '{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}', + 0, ''); +insert into s2_chat_query (`question_id`, `create_time`, `query_text`, `user_name`, `query_state`, + `chat_id`, `query_response`, `score`, `feedback`) +VALUES (6, '2023-06-10 10:42:02.184', '访问', 'admin', 0, 2, + '{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}', + 0, ''); 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 b0bb7d909..3d54144d0 100644 --- a/launchers/chat/src/main/resources/db/chat-schema-h2.sql +++ b/launchers/chat/src/main/resources/db/chat-schema-h2.sql @@ -1,55 +1,116 @@ 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, + `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 '', PRIMARY KEY (`question_id`) ); -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` +( + `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` ( @@ -66,69 +127,150 @@ 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/chat/src/main/resources/logback-spring.xml b/launchers/chat/src/main/resources/logback-spring.xml index 810eda9b3..b6d7a041d 100644 --- a/launchers/chat/src/main/resources/logback-spring.xml +++ b/launchers/chat/src/main/resources/logback-spring.xml @@ -1,13 +1,13 @@ logback - + - %d{HH:mm:ss} [%thread] %-5level %logger{36} %line - %msg%n + %d{HH:mm:ss} [%thread] %-5level %logger{36} %line - %msg%n @@ -46,7 +46,8 @@ - ${LOG_PATH}/error.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + ${LOG_PATH}/error.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + 90 @@ -74,7 +75,8 @@ - ${LOG_PATH}/serviceinfo.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + ${LOG_PATH}/serviceinfo.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + 30 diff --git a/launchers/common/src/main/java/com/tencent/supersonic/advice/RestExceptionHandler.java b/launchers/common/src/main/java/com/tencent/supersonic/advice/RestExceptionHandler.java index 5b62f20ee..c42fe4123 100644 --- a/launchers/common/src/main/java/com/tencent/supersonic/advice/RestExceptionHandler.java +++ b/launchers/common/src/main/java/com/tencent/supersonic/advice/RestExceptionHandler.java @@ -1,10 +1,10 @@ package com.tencent.supersonic.advice; +import com.tencent.supersonic.common.pojo.ResultData; +import com.tencent.supersonic.common.pojo.ReturnCode; import com.tencent.supersonic.common.pojo.exception.AccessException; import com.tencent.supersonic.common.pojo.exception.CommonException; import com.tencent.supersonic.common.pojo.exception.InvalidPermissionException; -import com.tencent.supersonic.common.pojo.ResultData; -import com.tencent.supersonic.common.pojo.ReturnCode; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; diff --git a/launchers/semantic/src/main/build/build.xml b/launchers/semantic/src/main/build/build.xml index 7165bcc00..977780800 100644 --- a/launchers/semantic/src/main/build/build.xml +++ b/launchers/semantic/src/main/build/build.xml @@ -1,6 +1,6 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"> bin tar.gz diff --git a/launchers/semantic/src/main/resources/META-INF/spring.factories b/launchers/semantic/src/main/resources/META-INF/spring.factories index 1d40fdda2..3345b5159 100644 --- a/launchers/semantic/src/main/resources/META-INF/spring.factories +++ b/launchers/semantic/src/main/resources/META-INF/spring.factories @@ -1,6 +1,5 @@ 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 diff --git a/launchers/semantic/src/main/resources/db/semantic-data-h2.sql b/launchers/semantic/src/main/resources/db/semantic-data-h2.sql index 53ab8d1de..4e5edc9a0 100644 --- a/launchers/semantic/src/main/resources/db/semantic-data-h2.sql +++ b/launchers/semantic/src/main/resources/db/semantic-data-h2.sql @@ -1,1111 +1,2308 @@ -insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(1, 1, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); -insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(2, 2, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); -insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, '停留时长统计', 's2_stay_time_statis', '停留时长统计', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_stay_time_statis_stay_hours","expr":"stay_hours","isCreateMetric":1,"name":"停留时长"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, page,user_name,stay_hours FROM s2_stay_time_statis"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource (id , domain_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 , domain_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 , domain_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 , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, 1, 2, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(2, 1, 1, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(3, 1, 2, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(1, 1, 3, '部门', 'department', '部门', 1, 0, 'categorical', NULL, 'department', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(2, 1, 1, '用户名', 'user_name', '用户名', 1, 0, 'primary', NULL, 'user_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(3, 1, 2, '页面', 'page', '页面', 1, 2, 'categorical', NULL, 'page', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(4, 2, 4, '活跃区域', 'act_area', '活跃区域', 1, 2, 'categorical', NULL, 'act_area', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(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 , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(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 , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(7, 2, 4, '歌手名', 'singer_name', '歌手名', 1, 2, 'categorical', NULL, 'singer_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(1, '超音数', 'supersonic', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' ); -insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(2, '艺人库', 'singer', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(1, 1, '停留时长', 'stay_hours', '停留时长', 1, 2, 'ATOMIC', '{"expr":"s2_stay_time_statis_stay_hours","measures":[{"agg":"sum","expr":"stay_hours","isCreateMetric":1,"datasourceId":1,"bizName":"s2_stay_time_statis_stay_hours","name":"s2_stay_time_statis_stay_hours"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(2, 1, '访问次数', 'pv', '访问次数', 1, 0, 'ATOMIC', ' {"expr":"s2_pv_uv_statis_pv","measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","datasourceId":2,"expr":"pv","isCreateMetric":1,"name":"s2_pv_uv_statis_pv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(3, 1, '访问人数', 'uv', '访问人数', 1, 0, 'ATOMIC', ' {"expr":"s2_pv_uv_statis_uv","measures":[{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","datasourceId":2,"expr":"uv","isCreateMetric":1,"name":"s2_pv_uv_statis_uv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(4, 2, '播放量', 'js_play_cnt', '播放量', 1, 2, 'ATOMIC', '{"expr":"music_js_play_cnt","measures":[{"agg":"sum","expr":"js_play_cnt","isCreateMetric":1,"datasourceId":4,"bizName":"music_js_play_cnt","name":"music_js_play_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(5, 2, '下载量', 'down_cnt', '下载量', 1, 0, 'ATOMIC', ' {"expr":"music_down_cnt","measures":[{"agg":"sum","bizName":"music_down_cnt","datasourceId":4,"expr":"down_cnt","isCreateMetric":1,"name":"music_down_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(6, 2, '收藏量', 'favor_cnt', '收藏量', 1, 0, 'ATOMIC', ' {"expr":"music_favor_cnt","measures":[{"agg":"sum","bizName":"music_favor_cnt","datasourceId":4,"expr":"favor_cnt","isCreateMetric":1,"name":"music_favor_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_database (id, domain_id, `name`, description, `type`, config, created_at, created_by, + updated_at, updated_by) +VALUES (1, 1, 'H2数据实例', '', 'h2', + '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', + '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); +insert into s2_database (id, domain_id, `name`, description, `type`, config, created_at, created_by, + updated_at, updated_by) +VALUES (2, 2, 'H2数据实例', '', 'h2', + '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', + '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); +insert into s2_datasource (id, domain_id, `name`, biz_name, description, database_id, + datasource_detail, created_at, created_by, updated_at, updated_by) +VALUES (1, 1, '停留时长统计', 's2_stay_time_statis', '停留时长统计', 1, + '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_stay_time_statis_stay_hours","expr":"stay_hours","isCreateMetric":1,"name":"停留时长"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, page,user_name,stay_hours FROM s2_stay_time_statis"}', + '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_datasource (id, domain_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, domain_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, domain_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, domain_id, `datasource_from`, datasource_to, join_key, + created_at, created_by, updated_at, updated_by) +VALUES (1, 1, 1, 2, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_datasource_rela (id, domain_id, `datasource_from`, datasource_to, join_key, + created_at, created_by, updated_at, updated_by) +VALUES (2, 1, 1, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_datasource_rela (id, domain_id, `datasource_from`, datasource_to, join_key, + created_at, created_by, updated_at, updated_by) +VALUES (3, 1, 2, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); +insert into s2_dimension (id, domain_id, datasource_id, `name`, biz_name, description, status, + sensitive_level, `type`, type_params, expr, created_at, created_by, + updated_at, updated_by, semantic_type) +VALUES (1, 1, 3, '部门', 'department', '部门', 1, 0, 'categorical', NULL, 'department', + '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id, domain_id, datasource_id, `name`, biz_name, description, status, + sensitive_level, `type`, type_params, expr, created_at, created_by, + updated_at, updated_by, semantic_type) +VALUES (2, 1, 1, '用户名', 'user_name', '用户名', 1, 0, 'primary', NULL, 'user_name', + '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id, domain_id, datasource_id, `name`, biz_name, description, status, + sensitive_level, `type`, type_params, expr, created_at, created_by, + updated_at, updated_by, semantic_type) +VALUES (3, 1, 2, '页面', 'page', '页面', 1, 2, 'categorical', NULL, 'page', '2023-05-24 00:00:00', + 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id, domain_id, datasource_id, `name`, biz_name, description, status, + sensitive_level, `type`, type_params, expr, created_at, created_by, + updated_at, updated_by, semantic_type) +VALUES (4, 2, 4, '活跃区域', 'act_area', '活跃区域', 1, 2, 'categorical', NULL, 'act_area', + '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_dimension (id, domain_id, datasource_id, `name`, biz_name, description, status, + sensitive_level, `type`, type_params, expr, created_at, created_by, + updated_at, updated_by, semantic_type) +VALUES (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, domain_id, datasource_id, `name`, biz_name, description, status, + sensitive_level, `type`, type_params, expr, created_at, created_by, + updated_at, updated_by, semantic_type) +VALUES (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, domain_id, datasource_id, `name`, biz_name, description, status, + sensitive_level, `type`, type_params, expr, created_at, created_by, + updated_at, updated_by, semantic_type) +VALUES (7, 2, 4, '歌手名', 'singer_name', '歌手名', 1, 2, 'categorical', NULL, 'singer_name', + '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); +insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, + updated_by, `admin`, admin_org, is_open, viewer, view_org) +VALUES (1, '超音数', 'supersonic', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', + 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin'); +insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, + updated_by, `admin`, admin_org, is_open, viewer, view_org) +VALUES (2, '艺人库', 'singer', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', + 'admin', '', 0, 'admin,tom,jack', 'admin'); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, + `type`, type_params, created_at, created_by, updated_at, updated_by, + data_format_type, data_format) +VALUES (1, 1, '停留时长', 'stay_hours', '停留时长', 1, 2, 'ATOMIC', + '{"expr":"s2_stay_time_statis_stay_hours","measures":[{"agg":"sum","expr":"stay_hours","isCreateMetric":1,"datasourceId":1,"bizName":"s2_stay_time_statis_stay_hours","name":"s2_stay_time_statis_stay_hours"}]}', + '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, + `type`, type_params, created_at, created_by, updated_at, updated_by, + data_format_type, data_format) +VALUES (2, 1, '访问次数', 'pv', '访问次数', 1, 0, 'ATOMIC', + ' {"expr":"s2_pv_uv_statis_pv","measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","datasourceId":2,"expr":"pv","isCreateMetric":1,"name":"s2_pv_uv_statis_pv"}]}', + '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, + `type`, type_params, created_at, created_by, updated_at, updated_by, + data_format_type, data_format) +VALUES (3, 1, '访问人数', 'uv', '访问人数', 1, 0, 'ATOMIC', + ' {"expr":"s2_pv_uv_statis_uv","measures":[{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","datasourceId":2,"expr":"uv","isCreateMetric":1,"name":"s2_pv_uv_statis_uv"}]}', + '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, + `type`, type_params, created_at, created_by, updated_at, updated_by, + data_format_type, data_format) +VALUES (4, 2, '播放量', 'js_play_cnt', '播放量', 1, 2, 'ATOMIC', + '{"expr":"music_js_play_cnt","measures":[{"agg":"sum","expr":"js_play_cnt","isCreateMetric":1,"datasourceId":4,"bizName":"music_js_play_cnt","name":"music_js_play_cnt"}]}', + '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, + `type`, type_params, created_at, created_by, updated_at, updated_by, + data_format_type, data_format) +VALUES (5, 2, '下载量', 'down_cnt', '下载量', 1, 0, 'ATOMIC', + ' {"expr":"music_down_cnt","measures":[{"agg":"sum","bizName":"music_down_cnt","datasourceId":4,"expr":"down_cnt","isCreateMetric":1,"name":"music_down_cnt"}]}', + '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL); +insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, + `type`, type_params, created_at, created_by, updated_at, updated_by, + data_format_type, data_format) +VALUES (6, 2, '收藏量', 'favor_cnt', '收藏量', 1, 0, 'ATOMIC', + ' {"expr":"music_favor_cnt","measures":[{"agg":"sum","bizName":"music_favor_cnt","datasourceId":4,"expr":"favor_cnt","isCreateMetric":1,"name":"music_favor_cnt"}]}', + '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL); -insert into s2_available_date_info(`item_id` ,`type` ,`date_format` ,`start_date` ,`end_date` ,`unavailable_date` ,`created_at` ,`created_by` ,`updated_at` ,`updated_by` ) -values (1, 'dimension', 'yyyy-MM-dd', DATEADD('DAY', -28, CURRENT_DATE()), DATEADD('DAY', -1, CURRENT_DATE()), '[]', '2023-06-01', 'admin', '2023-06-01', 'admin'); -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, '{"domainId":"1","name":"admin-permission","groupId":1,"authRules":[{"metrics":["stay_hours"],"dimensions":["page"]}],"dimensionFilters":[""],"dimensionFilterDescription":"授权admin 页面和停留时长权限","authorizedUsers":["admin"],"authorizedDepartmentIds":[]}'); +values (1, + '{"domainId":"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, '{"domainId":"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, + '{"domainId":"1","name":"tom_sales_permission","groupId":2,"authRules":[{"metrics":["stay_hours"],"dimensions":["page"]}],"dimensionFilters":["department in (''sales'')"],"dimensionFilterDescription":"开通 tom sales部门权限", "authorizedUsers":["tom"],"authorizedDepartmentIds":[]}'); -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 (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'); ---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 ('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 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); -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/semantic/src/main/resources/db/semantic-schema-h2.sql b/launchers/semantic/src/main/resources/db/semantic-schema-h2.sql index 8d2e0d290..5799f2186 100644 --- a/launchers/semantic/src/main/resources/db/semantic-schema-h2.sql +++ b/launchers/semantic/src/main/resources/db/semantic-schema-h2.sql @@ -1,258 +1,513 @@ -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 , - `is_unique` INT DEFAULT NULL , -- 0 is non-unique, 1 is unique - `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`) +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 , + `is_unique` INT DEFAULT NULL , -- 0 is non-unique, 1 is unique + `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_domain IS 'domain basic information'; +COMMENT +ON TABLE s2_domain IS 'domain basic 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 `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'; +COMMENT +ON TABLE s2_database IS 'database instance table'; -CREATE TABLE IF NOT EXISTS `s2_datasource` ( - `id` INT NOT NULL AUTO_INCREMENT, - `domain_id` INT NOT NULL , - `name` varchar(255) NOT NULL , - `biz_name` varchar(255) NOT NULL , - `description` varchar(500) DEFAULT NULL , - `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`) +CREATE TABLE IF NOT EXISTS `s2_datasource` +( + `id` + INT + NOT + NULL + AUTO_INCREMENT, + `domain_id` + INT + NOT + NULL, + `name` + varchar +( + 255 +) NOT NULL , + `biz_name` varchar +( + 255 +) NOT NULL , + `description` varchar +( + 500 +) DEFAULT NULL , + `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_datasource IS 'datasource 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 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, - `domain_id` INT NOT NULL , - `name` varchar(255) NOT NULL , - `biz_name` varchar(255) NOT NULL , - `description` varchar(500) DEFAULT NULL , - `status` INT NOT NULL , -- 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, + `domain_id` + INT + NOT + NULL, + `name` + varchar +( + 255 +) NOT NULL , + `biz_name` varchar +( + 255 +) NOT NULL , + `description` varchar +( + 500 +) DEFAULT NULL , + `status` INT NOT NULL , -- 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 , - `domain_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, + `domain_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, - domain_id INT null, - datasource_from INT null, - datasource_to INT null, + domain_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, - domain_id INT null, - type varchar(20) null comment 'datasource、dimension、metric', - config LONGVARCHAR null comment 'config detail', - created_at TIMESTAMP null, + domain_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 - `domain_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 +CREATE TABLE `s2_query_stat_info` +( + `id` INT NOT NULL AUTO_INCREMENT, + `trace_id` varchar(200) DEFAULT NULL, -- query unique identifier + `domain_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'; +); +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 , - `domain_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 , + `domain_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'; -------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_semantic_pasre_info IS 'user_department_info'; +COMMENT +ON TABLE s2_semantic_pasre_info 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_semantic_pasre_info IS 'user_access_info'; +COMMENT +ON TABLE s2_semantic_pasre_info IS 'user_access_info'; -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/semantic/src/main/resources/logback-spring.xml b/launchers/semantic/src/main/resources/logback-spring.xml index bcbf33a3a..e94cda0d7 100644 --- a/launchers/semantic/src/main/resources/logback-spring.xml +++ b/launchers/semantic/src/main/resources/logback-spring.xml @@ -46,7 +46,8 @@ - ${LOG_PATH}/error.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + ${LOG_PATH}/error.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + 90 @@ -55,7 +56,7 @@ UTF-8 - %d [%thread] %-5level [%X{TRACE_ID}] %logger{36} - %msg%n + %d [%thread] %-5level [%X{TRACE_ID}] %logger{36} - %msg%n @@ -74,7 +75,8 @@ - ${LOG_PATH}/serviceinfo.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + ${LOG_PATH}/serviceinfo.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + 30 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 e93264adc..1fc145c90 100644 --- a/launchers/standalone/src/main/java/com/tencent/supersonic/ConfigureDemo.java +++ b/launchers/standalone/src/main/java/com/tencent/supersonic/ConfigureDemo.java @@ -1,10 +1,17 @@ package com.tencent.supersonic; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.pojo.request.*; +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.ChatDefaultConfigReq; +import com.tencent.supersonic.chat.api.pojo.request.ChatDetailConfigReq; +import com.tencent.supersonic.chat.api.pojo.request.ExecuteQueryReq; +import com.tencent.supersonic.chat.api.pojo.request.ItemVisibility; +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.parser.ParseMode; 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.ChatService; @@ -12,17 +19,19 @@ import com.tencent.supersonic.chat.service.ConfigService; import com.tencent.supersonic.chat.service.PluginService; import com.tencent.supersonic.chat.service.QueryService; import com.tencent.supersonic.common.util.JsonUtil; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; -import java.util.*; - @Component @Slf4j public class ConfigureDemo implements ApplicationListener { + @Autowired private QueryService queryService; @Autowired @@ -67,7 +76,7 @@ public class ConfigureDemo implements ApplicationListener public void addDemoChatConfig_1() { ChatConfigBaseReq chatConfigBaseReq = new ChatConfigBaseReq(); - chatConfigBaseReq.setDomainId(1L); + chatConfigBaseReq.setModelId(1L); ChatDetailConfigReq chatDetailConfig = new ChatDetailConfigReq(); ChatDefaultConfigReq chatDefaultConfigDetail = new ChatDefaultConfigReq(); @@ -82,7 +91,6 @@ public class ConfigureDemo implements ApplicationListener chatDetailConfig.setVisibility(visibility_0); chatConfigBaseReq.setChatDetailConfig(chatDetailConfig); - ChatAggConfigReq chatAggConfig = new ChatAggConfigReq(); ChatDefaultConfigReq chatDefaultConfigAgg = new ChatDefaultConfigReq(); List dimensionIds_1 = Arrays.asList(1L, 2L); @@ -111,7 +119,7 @@ public class ConfigureDemo implements ApplicationListener public void addDemoChatConfig_2() { ChatConfigBaseReq chatConfigBaseReq = new ChatConfigBaseReq(); - chatConfigBaseReq.setDomainId(2L); + chatConfigBaseReq.setModelId(2L); ChatDetailConfigReq chatDetailConfig = new ChatDetailConfigReq(); ChatDefaultConfigReq chatDefaultConfigDetail = new ChatDefaultConfigReq(); @@ -126,7 +134,6 @@ public class ConfigureDemo implements ApplicationListener chatDetailConfig.setVisibility(visibility_0); chatConfigBaseReq.setChatDetailConfig(chatDetailConfig); - ChatAggConfigReq chatAggConfig = new ChatAggConfigReq(); ChatDefaultConfigReq chatDefaultConfigAgg = new ChatDefaultConfigReq(); List dimensionIds_1 = Arrays.asList(4L, 5L, 6L, 7L); @@ -150,7 +157,7 @@ public class ConfigureDemo implements ApplicationListener private void addPlugin_1() { Plugin plugin_1 = new Plugin(); plugin_1.setType("WEB_PAGE"); - plugin_1.setDomainList(Arrays.asList(1L)); + plugin_1.setModelList(Arrays.asList(1L)); plugin_1.setPattern("访问情况"); plugin_1.setParseModeConfig(null); plugin_1.setName("访问情况"); @@ -160,7 +167,7 @@ public class ConfigureDemo implements ApplicationListener paramOption.setKey("name"); paramOption.setParamType(ParamOption.ParamType.SEMANTIC); paramOption.setElementId(2L); - paramOption.setDomainId(1L); + paramOption.setModelId(1L); List paramOptions = Arrays.asList(paramOption); webBase.setParamOptions(paramOptions); plugin_1.setConfig(JsonUtil.toString(webBase)); @@ -169,15 +176,42 @@ public class ConfigureDemo implements ApplicationListener } private void addPlugin_2() { - Plugin plugin_1 = new Plugin(); - plugin_1.setType("DSL"); - plugin_1.setDomainList(new ArrayList<>()); - plugin_1.setPattern(""); - plugin_1.setParseMode(ParseMode.FUNCTION_CALL); - plugin_1.setParseModeConfig(null); - plugin_1.setName("访问情况"); - plugin_1.setConfig(""); - pluginService.createPlugin(plugin_1, user); + Plugin plugin_2 = new Plugin(); + plugin_2.setType("DSL"); + plugin_2.setModelList(Arrays.asList(1L, 2L)); + plugin_2.setPattern(""); + plugin_2.setParseModeConfig(null); + plugin_2.setName("大模型语义解析"); + List examples = new ArrayList<>(); + examples.add("超音数访问次数最高的部门是哪个"); + examples.add("超音数访问人数最高的部门是哪个"); + + PluginParseConfig parseConfig = PluginParseConfig.builder() + .name("DSL") + .description("这个工具能够将用户的自然语言查询转化为SQL语句,从而从数据库中的查询具体的数据。用于处理数据查询的问题,提供基于事实的数据") + .examples(examples) + .build(); + plugin_2.setParseModeConfig(JsonUtil.toString(parseConfig)); + pluginService.createPlugin(plugin_2, user); + } + + private void addPlugin_3() { + Plugin plugin_2 = new Plugin(); + plugin_2.setType("CONTENT_INTERPRET"); + plugin_2.setModelList(Arrays.asList(1L)); + plugin_2.setPattern("超音数最近访问情况怎么样"); + plugin_2.setParseModeConfig(null); + plugin_2.setName("内容解读"); + List examples = new ArrayList<>(); + examples.add("超音数最近访问情况怎么样"); + examples.add("超音数最近访问情况如何"); + PluginParseConfig parseConfig = PluginParseConfig.builder() + .name("supersonic_content_interpret") + .description("这个工具能够先查询到相关的数据并交给大模型进行解读, 最后返回解读结果") + .examples(examples) + .build(); + plugin_2.setParseModeConfig(JsonUtil.toString(parseConfig)); + pluginService.createPlugin(plugin_2, user); } @Override @@ -187,6 +221,7 @@ public class ConfigureDemo implements ApplicationListener addDemoChatConfig_2(); addPlugin_1(); addPlugin_2(); + addPlugin_3(); addSampleChats(); addSampleChats2(); } catch (Exception e) { diff --git a/launchers/standalone/src/main/java/com/tencent/supersonic/db/MybatisConfig.java b/launchers/standalone/src/main/java/com/tencent/supersonic/db/MybatisConfig.java index f3428741a..7856043bd 100644 --- a/launchers/standalone/src/main/java/com/tencent/supersonic/db/MybatisConfig.java +++ b/launchers/standalone/src/main/java/com/tencent/supersonic/db/MybatisConfig.java @@ -1,5 +1,6 @@ package com.tencent.supersonic.db; +import javax.sql.DataSource; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; @@ -8,8 +9,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import javax.sql.DataSource; - @Configuration @MapperScan(value = "com.tencent.supersonic", annotationClass = Mapper.class) diff --git a/launchers/standalone/src/main/resources/META-INF/spring.factories b/launchers/standalone/src/main/resources/META-INF/spring.factories index c433857e6..95f2dbbb4 100644 --- a/launchers/standalone/src/main/resources/META-INF/spring.factories +++ b/launchers/standalone/src/main/resources/META-INF/spring.factories @@ -3,27 +3,21 @@ 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.TimeRangeParser, \ com.tencent.supersonic.chat.parser.rule.AggregateTypeParser, \ + com.tencent.supersonic.chat.parser.llm.LLMDSLParser, \ com.tencent.supersonic.chat.parser.embedding.EmbeddingBasedParser, \ com.tencent.supersonic.chat.parser.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.DomainResolver=\ - com.tencent.supersonic.chat.parser.function.HeuristicDomainResolver - +com.tencent.supersonic.chat.parser.function.ModelResolver=\ + com.tencent.supersonic.chat.parser.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 diff --git a/launchers/standalone/src/main/resources/application-local.yaml b/launchers/standalone/src/main/resources/application-local.yaml index dd3717532..5a73d5b34 100644 --- a/launchers/standalone/src/main/resources/application-local.yaml +++ b/launchers/standalone/src/main/resources/application-local.yaml @@ -1,7 +1,7 @@ spring: h2: console: - path: /h2-console/chat + path: /h2-console/semantic # enabled web enabled: true datasource: @@ -19,6 +19,10 @@ authentication: enable: true exclude: path: /api/auth/user/register,/api/auth/user/login + token: + http: + header: + key: Authorization semantic: url: diff --git a/launchers/standalone/src/main/resources/db/data-h2.sql b/launchers/standalone/src/main/resources/db/data-h2.sql index 27b296b13..921952ecb 100644 --- a/launchers/standalone/src/main/resources/db/data-h2.sql +++ b/launchers/standalone/src/main/resources/db/data-h2.sql @@ -1,1116 +1,2316 @@ -- 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 (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_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(1, 1, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); -insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(2, 2, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); -insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, '停留时长统计', 's2_stay_time_statis', '停留时长统计', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_stay_time_statis_stay_hours","expr":"stay_hours","isCreateMetric":1,"name":"停留时长"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, page,user_name,stay_hours FROM s2_stay_time_statis"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource (id , domain_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 , domain_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 , domain_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 , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, 1, 2, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(2, 1, 1, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(3, 1, 2, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type, dim_value_maps) VALUES(1, 1, 3, '部门', 'department', '部门', 1, 0, 'categorical', NULL, 'department', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY', '[{"alias":["人力资源","人力"],"bizName":"人力资源","techName":"HR"},{"alias":["营销","销售"],"bizName":"营销部门","techName":"sales"}]'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(2, 1, 1, '用户名', 'user_name', '用户名', 1, 0, 'primary', NULL, 'user_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(3, 1, 2, '页面', 'page', '页面', 1, 2, 'categorical', NULL, 'page', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(4, 2, 4, '活跃区域', 'act_area', '活跃区域', 1, 2, 'categorical', NULL, 'act_area', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(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 , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(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 , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(7, 2, 4, '歌手名', 'singer_name', '歌手名', 1, 2, 'categorical', NULL, 'singer_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(1, '超音数', 'supersonic', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' ); -insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org, entity) VALUES(2, '艺人库', 'singer', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin','{"entityId": 7, "names": ["歌手", "艺人"]}' ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(1, 1, '停留时长', 'stay_hours', '停留时长', 1, 2, 'ATOMIC', '{"expr":"s2_stay_time_statis_stay_hours","measures":[{"agg":"sum","expr":"stay_hours","isCreateMetric":1,"datasourceId":1,"bizName":"s2_stay_time_statis_stay_hours","name":"s2_stay_time_statis_stay_hours"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(2, 1, '访问次数', 'pv', '访问次数', 1, 0, 'ATOMIC', ' {"expr":"s2_pv_uv_statis_pv","measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","datasourceId":2,"expr":"pv","isCreateMetric":1,"name":"s2_pv_uv_statis_pv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(3, 1, '访问人数', 'uv', '访问人数', 1, 0, 'ATOMIC', ' {"expr":"s2_pv_uv_statis_uv","measures":[{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","datasourceId":2,"expr":"uv","isCreateMetric":1,"name":"s2_pv_uv_statis_uv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(4, 2, '播放量', 'js_play_cnt', '播放量', 1, 2, 'ATOMIC', '{"expr":"music_js_play_cnt","measures":[{"agg":"sum","expr":"js_play_cnt","isCreateMetric":1,"datasourceId":4,"bizName":"music_js_play_cnt","name":"music_js_play_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(5, 2, '下载量', 'down_cnt', '下载量', 1, 0, 'ATOMIC', ' {"expr":"music_down_cnt","measures":[{"agg":"sum","bizName":"music_down_cnt","datasourceId":4,"expr":"down_cnt","isCreateMetric":1,"name":"music_down_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(6, 2, '收藏量', 'favor_cnt', '收藏量', 1, 0, 'ATOMIC', ' {"expr":"music_favor_cnt","measures":[{"agg":"sum","bizName":"music_favor_cnt","datasourceId":4,"expr":"favor_cnt","isCreateMetric":1,"name":"music_favor_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); +insert into s2_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, '{"domainId":"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, '{"domainId":"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":"开通 tom sales部门权限", "authorizedUsers":["tom"],"authorizedDepartmentIds":[]}'); -- sample data -INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -1, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); -INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -5, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); -INSERT INTO singer (imp_date,singer_name,act_area, song_name,genre,js_play_cnt,down_cnt,favor_cnt) VALUES (DATEADD('DAY', -4, CURRENT_DATE()), '周杰伦', '中国','青花瓷','流行',1000000,1000000,1000000); -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 a625909f8..03f9e50f2 100644 --- a/launchers/standalone/src/main/resources/db/schema-h2.sql +++ b/launchers/standalone/src/main/resources/db/schema-h2.sql @@ -1,337 +1,734 @@ -- 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, + `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 '', PRIMARY KEY (`question_id`) ); -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`) - ) ; -COMMENT ON TABLE s2_chat_config IS 'chat config information table '; +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 , - `is_unique` INT DEFAULT NULL , -- 0 is non-unique, 1 is unique - `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`) +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'; +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`) +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'; +COMMENT +ON TABLE s2_database IS 'database instance table'; -CREATE TABLE IF NOT EXISTS `s2_datasource` ( - `id` INT NOT NULL AUTO_INCREMENT, - `domain_id` INT NOT NULL , - `name` varchar(255) NOT NULL , - `biz_name` varchar(255) NOT NULL , - `description` varchar(500) DEFAULT NULL , - `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`) +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_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, - `domain_id` INT NOT NULL , - `name` varchar(255) NOT NULL , - `biz_name` varchar(255) NOT NULL , - `description` varchar(500) DEFAULT NULL , - `status` INT NOT NULL , -- 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 , - `domain_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, - domain_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, - domain_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 - `domain_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 , - `domain_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, - `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, + `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/launchers/standalone/src/main/resources/db/schema-mysql.sql b/launchers/standalone/src/main/resources/db/schema-mysql.sql index b89ae203f..a183fbdb2 100644 --- a/launchers/standalone/src/main/resources/db/schema-mysql.sql +++ b/launchers/standalone/src/main/resources/db/schema-mysql.sql @@ -1,85 +1,79 @@ create table supersonic_sit.s2_auth_groups ( - group_id int not null + group_id int not null primary key, config varchar(2048) null -) - collate = utf8mb4_unicode_ci; +) collate = utf8mb4_unicode_ci; create table supersonic_sit.s2_available_date_info ( id int auto_increment primary key, - item_id int not null, - type varchar(255) not null, - date_format varchar(64) not null, - start_date varchar(64) null, - end_date varchar(64) null, - unavailable_date text null, - created_at timestamp default CURRENT_TIMESTAMP not null, - created_by varchar(100) not null, - updated_at timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP, - updated_by varchar(100) not null, - status int default 0 null -) - collate = utf8mb4_unicode_ci; + item_id int not null, + type varchar(255) not null, + date_format varchar(64) not null, + start_date varchar(64) null, + end_date varchar(64) null, + unavailable_date text null, + created_at timestamp default CURRENT_TIMESTAMP not null, + created_by varchar(100) not null, + updated_at timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP, + updated_by varchar(100) not null, + status int default 0 null +) collate = utf8mb4_unicode_ci; create table supersonic_sit.s2_chat ( chat_id bigint(8) auto_increment primary key, - chat_name varchar(100) null, - create_time datetime null, - last_time datetime null, - creator varchar(30) null, - last_question varchar(200) null, + chat_name varchar(100) null, + create_time datetime null, + last_time datetime null, + creator varchar(30) null, + last_question varchar(200) null, is_delete int(2) default 0 null comment 'is deleted', is_top int(2) default 0 null comment 'is top' -) - charset = utf8; +) charset = utf8; create table supersonic_sit.s2_chat_config ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `domain_id` bigint(20) DEFAULT NULL COMMENT '主题域id', - `chat_detail_config` mediumtext COMMENT '明细模式配置信息', - `chat_agg_config` mediumtext COMMENT '指标模式配置信息', - `recommended_questions` mediumtext COMMENT '推荐问题配置', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - `created_by` varchar(100) NOT NULL COMMENT '创建人', - `updated_by` varchar(100) NOT NULL COMMENT '更新人', - `status` int(10) NOT NULL COMMENT '主题域扩展信息状态, 0-删除,1-生效', - PRIMARY KEY (`id`) -) - comment '主题域扩展信息表' charset = utf8; + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `domain_id` bigint(20) DEFAULT NULL COMMENT '主题域id', + `chat_detail_config` mediumtext COMMENT '明细模式配置信息', + `chat_agg_config` mediumtext COMMENT '指标模式配置信息', + `recommended_questions` mediumtext COMMENT '推荐问题配置', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + `created_by` varchar(100) NOT NULL COMMENT '创建人', + `updated_by` varchar(100) NOT NULL COMMENT '更新人', + `status` int(10) NOT NULL COMMENT '主题域扩展信息状态, 0-删除,1-生效', + PRIMARY KEY (`id`) +) comment '主题域扩展信息表' charset = utf8; create table supersonic_sit.s2_chat_context ( chat_id bigint not null comment 'context chat id' primary key, modified_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'row modify time', - user varchar(64) null comment 'row modify user', - query_text text null comment 'query text', - semantic_parse text null comment 'parse data', - ext_data text null comment 'extend data' -) - charset = utf8; + user varchar(64) null comment 'row modify user', + query_text text null comment 'query text', + semantic_parse text null comment 'parse data', + ext_data text null comment 'extend data' +) charset = utf8; create table supersonic_sit.s2_chat_query ( question_id bigint auto_increment primary key, create_time timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP, - query_text mediumtext null, - user_name varchar(150) null, - query_state int(1) null, + query_text mediumtext null, + user_name varchar(150) null, + query_state int(1) null, chat_id bigint not null, query_response mediumtext not null, - score int default 0 null, - feedback varchar(1024) default '' null -) - charset = utf8; + score int default 0 null, + feedback varchar(1024) default '' null +) charset = utf8; create table supersonic_sit.s2_database ( @@ -88,15 +82,14 @@ create table supersonic_sit.s2_database domain_id bigint not null comment '主题域ID', name varchar(255) not null comment '名称', description varchar(500) null comment '描述', - version varchar(64) null comment '版本', + version varchar(64) null comment '版本', type varchar(20) not null comment '类型 mysql,clickhouse,tdw', config text not null comment '配置信息', created_at datetime not null comment '创建时间', created_by varchar(100) not null comment '创建人', updated_at datetime not null comment '更新时间', updated_by varchar(100) not null comment '更新人' -) - comment '数据库实例表' charset = utf8; +) comment '数据库实例表' charset = utf8; create table supersonic_sit.s2_datasource ( @@ -112,147 +105,140 @@ create table supersonic_sit.s2_datasource created_by varchar(100) not null comment '创建人', updated_at datetime not null comment '更新时间', updated_by varchar(100) not null comment '更新人' -) - charset = utf8; +) charset = utf8; create table supersonic_sit.s2_datasource_rela ( id bigint auto_increment primary key, - domain_id bigint null, - datasource_from bigint null, - datasource_to bigint null, + domain_id bigint null, + datasource_from bigint null, + datasource_to bigint null, join_key varchar(100) null, - created_at datetime null, + created_at datetime null, created_by varchar(100) null, - updated_at datetime null, + updated_at datetime null, updated_by varchar(100) null -) - charset = utf8; +) charset = utf8; create table supersonic_sit.s2_dimension ( id bigint auto_increment comment '维度ID' primary key, - domain_id bigint not null comment '主题域id', - datasource_id bigint not null comment '所属数据源id', - name varchar(255) not null comment '维度名称', - biz_name varchar(255) not null comment '字段名称', - description varchar(500) not null comment '描述', - status int(10) not null comment '维度状态,0正常,1下架,2删除', - sensitive_level int(10) null comment '敏感级别', - type varchar(50) not null comment '维度类型 categorical,time', - type_params text null comment '类型参数', - expr text not null comment '表达式', - created_at datetime not null comment '创建时间', - created_by varchar(100) not null comment '创建人', - updated_at datetime not null comment '更新时间', - updated_by varchar(100) not null comment '更新人', - semantic_type varchar(20) not null comment '语义类型DATE, ID, CATEGORY', + domain_id bigint not null comment '主题域id', + datasource_id bigint not null comment '所属数据源id', + name varchar(255) not null comment '维度名称', + biz_name varchar(255) not null comment '字段名称', + description varchar(500) not null comment '描述', + status int(10) not null comment '维度状态,0正常,1下架,2删除', + sensitive_level int(10) null comment '敏感级别', + type varchar(50) not null comment '维度类型 categorical,time', + type_params text null comment '类型参数', + expr text not null comment '表达式', + created_at datetime not null comment '创建时间', + created_by varchar(100) not null comment '创建人', + updated_at datetime not null comment '更新时间', + updated_by varchar(100) not null comment '更新人', + semantic_type varchar(20) not null comment '语义类型DATE, ID, CATEGORY', alias varchar(500) collate utf8_unicode_ci null, - default_values varchar(500) DEFAULT NULL, - dim_value_maps varchar(500) DEFAULT NULL -) - comment '维度表' charset = utf8; + default_values varchar(500) DEFAULT NULL, + dim_value_maps varchar(500) DEFAULT NULL +) comment '维度表' charset = utf8; create table supersonic_sit.s2_domain ( id bigint auto_increment comment '自增ID' primary key, - name varchar(255) null comment '主题域名称', - biz_name varchar(255) null comment '内部名称', - parent_id bigint default 0 null comment '父主题域ID', - status int(10) not null comment '主题域状态', - created_at datetime null comment '创建时间', - created_by varchar(100) null comment '创建人', - updated_at datetime null comment '更新时间', - updated_by varchar(100) null comment '更新人', - admin varchar(3000) null comment '主题域管理员', - admin_org varchar(3000) null comment '主题域管理员组织', - is_open int null comment '主题域是否公开', - viewer varchar(3000) null comment '主题域可用用户', - view_org varchar(3000) null comment '主题域可用组织', + name varchar(255) null comment '主题域名称', + biz_name varchar(255) null comment '内部名称', + parent_id bigint default 0 null comment '父主题域ID', + status int(10) not null comment '主题域状态', + created_at datetime null comment '创建时间', + created_by varchar(100) null comment '创建人', + updated_at datetime null comment '更新时间', + updated_by varchar(100) null comment '更新人', + admin varchar(3000) null comment '主题域管理员', + admin_org varchar(3000) null comment '主题域管理员组织', + is_open int null comment '主题域是否公开', + viewer varchar(3000) null comment '主题域可用用户', + view_org varchar(3000) null comment '主题域可用组织', entity varchar(500) DEFAULT NULL COMMENT '主题域实体信息' -) - comment '主题域基础信息表' charset = utf8; +) comment '主题域基础信息表' charset = utf8; create table supersonic_sit.s2_domain_extend ( id bigint unsigned auto_increment primary key, - domain_id bigint null comment '主题域id', + domain_id bigint null comment '主题域id', default_metrics varchar(655) null comment '默认指标', - visibility mediumtext null comment '不可见的维度/指标信息', - entity_info mediumtext null comment '实体信息', - dictionary_info mediumtext null comment '字典相关的维度设置信息', + visibility mediumtext null comment '不可见的维度/指标信息', + entity_info mediumtext null comment '实体信息', + dictionary_info mediumtext null comment '字典相关的维度设置信息', created_at datetime not null comment '创建时间', updated_at datetime not null comment '更新时间', created_by varchar(100) not null comment '创建人', updated_by varchar(100) not null comment '更新人', - status int(10) not null comment '主题域扩展信息状态, 0-删除,1-生效' -) - comment '主题域扩展信息表' collate = utf8mb4_unicode_ci; + status int(10) not null comment '主题域扩展信息状态, 0-删除,1-生效' +) comment '主题域扩展信息表' collate = utf8mb4_unicode_ci; create table supersonic_sit.s2_metric ( id bigint auto_increment primary key, - domain_id bigint not null comment '主体域ID', - name varchar(255) not null comment '指标名称', - biz_name varchar(255) not null comment '字段名称', - description varchar(500) null comment '描述', - status int(10) not null comment '指标状态,0正常,1下架,2删除', - sensitive_level int(10) not null comment '敏感级别', - type varchar(50) not null comment '指标类型 proxy,expr', - type_params text not null comment '类型参数', - created_at datetime not null comment '创建时间', - created_by varchar(100) not null comment '创建人', - updated_at datetime not null comment '更新时间', - updated_by varchar(100) not null comment '更新人', - data_format_type varchar(50) null comment '数值类型', - data_format varchar(500) null comment '数值类型参数', + domain_id bigint not null comment '主体域ID', + name varchar(255) not null comment '指标名称', + biz_name varchar(255) not null comment '字段名称', + description varchar(500) null comment '描述', + status int(10) not null comment '指标状态,0正常,1下架,2删除', + sensitive_level int(10) not null comment '敏感级别', + type varchar(50) not null comment '指标类型 proxy,expr', + type_params text not null comment '类型参数', + created_at datetime not null comment '创建时间', + created_by varchar(100) not null comment '创建人', + updated_at datetime not null comment '更新时间', + updated_by varchar(100) not null comment '更新人', + data_format_type varchar(50) null comment '数值类型', + data_format varchar(500) null comment '数值类型参数', alias varchar(500) collate utf8_unicode_ci null -) - comment '指标表' charset = utf8; +) comment '指标表' charset = utf8; create table supersonic_sit.s2_query_stat_info ( id bigint unsigned auto_increment primary key, - trace_id varchar(200) null comment '查询标识', - domain_id bigint null comment '主题域ID', - user varchar(200) null comment '执行sql的用户', - created_at datetime default CURRENT_TIMESTAMP null comment '创建时间', - query_type varchar(200) null comment '查询对应的场景', - query_type_back int(10) default 0 null comment '查询类型, 0-正常查询, 1-预刷类型', - query_sql_cmd mediumtext null comment '对应查询的struct', - sql_cmd_md5 varchar(200) null comment 'sql md5值', - query_struct_cmd mediumtext null comment '对应查询的struct', - struct_cmd_md5 varchar(200) null comment 'sql md5值', - `sql` mediumtext null comment '对应查询的sql', - sql_md5 varchar(200) null comment 'sql md5值', - query_engine varchar(20) null comment '查询引擎', - elapsed_ms bigint(10) null comment '查询耗时', - query_state varchar(20) null comment '查询最终状态', - native_query int(10) null comment '1-明细查询,0-聚合查询', - start_date varchar(50) null comment 'sql开始日期', - end_date varchar(50) null comment 'sql结束日期', - dimensions mediumtext null comment 'sql 涉及的维度', - metrics mediumtext null comment 'sql 涉及的指标', - select_cols mediumtext null comment 'sql select部分涉及的标签', - agg_cols mediumtext null comment 'sql agg部分涉及的标签', - filter_cols mediumtext null comment 'sql where部分涉及的标签', - group_by_cols mediumtext null comment 'sql grouy by部分涉及的标签', - order_by_cols mediumtext null comment 'sql order by部分涉及的标签', - use_result_cache tinyint(1) default -1 null comment '是否命中sql缓存', - use_sql_cache tinyint(1) default -1 null comment '是否命中sql缓存', - sql_cache_key mediumtext null comment '缓存的key', - result_cache_key mediumtext null comment '缓存的key' -) - comment '查询统计信息表' collate = utf8mb4_unicode_ci; + trace_id varchar(200) null comment '查询标识', + domain_id bigint null comment '主题域ID', + user varchar(200) null comment '执行sql的用户', + created_at datetime default CURRENT_TIMESTAMP null comment '创建时间', + query_type varchar(200) null comment '查询对应的场景', + query_type_back int(10) default 0 null comment '查询类型, 0-正常查询, 1-预刷类型', + query_sql_cmd mediumtext null comment '对应查询的struct', + sql_cmd_md5 varchar(200) null comment 'sql md5值', + query_struct_cmd mediumtext null comment '对应查询的struct', + struct_cmd_md5 varchar(200) null comment 'sql md5值', + `sql` mediumtext null comment '对应查询的sql', + sql_md5 varchar(200) null comment 'sql md5值', + query_engine varchar(20) null comment '查询引擎', + elapsed_ms bigint(10) null comment '查询耗时', + query_state varchar(20) null comment '查询最终状态', + native_query int(10) null comment '1-明细查询,0-聚合查询', + start_date varchar(50) null comment 'sql开始日期', + end_date varchar(50) null comment 'sql结束日期', + dimensions mediumtext null comment 'sql 涉及的维度', + metrics mediumtext null comment 'sql 涉及的指标', + select_cols mediumtext null comment 'sql select部分涉及的标签', + agg_cols mediumtext null comment 'sql agg部分涉及的标签', + filter_cols mediumtext null comment 'sql where部分涉及的标签', + group_by_cols mediumtext null comment 'sql grouy by部分涉及的标签', + order_by_cols mediumtext null comment 'sql order by部分涉及的标签', + use_result_cache tinyint(1) default -1 null comment '是否命中sql缓存', + use_sql_cache tinyint(1) default -1 null comment '是否命中sql缓存', + sql_cache_key mediumtext null comment '缓存的key', + result_cache_key mediumtext null comment '缓存的key' +) comment '查询统计信息表' collate = utf8mb4_unicode_ci; create index domain_index on supersonic_sit.s2_query_stat_info (domain_id); @@ -261,41 +247,42 @@ create table supersonic_sit.s2_semantic_pasre_info ( id bigint unsigned auto_increment primary key, - trace_id varchar(200) not null comment '查询标识', - domain_id bigint not null comment '主体域ID', - dimensions mediumtext null comment '查询相关的维度信息', - metrics mediumtext null comment '查询相关的指标信息', - orders mediumtext null comment '查询相关的排序信息', - filters mediumtext null comment '查询相关的过滤信息', - date_info mediumtext null comment '查询相关的日期信息', - `limit` bigint not null comment '查询相关的limit信息', + trace_id varchar(200) not null comment '查询标识', + domain_id bigint not null comment '主体域ID', + dimensions mediumtext null comment '查询相关的维度信息', + metrics mediumtext null comment '查询相关的指标信息', + orders mediumtext null comment '查询相关的排序信息', + filters mediumtext null comment '查询相关的过滤信息', + date_info mediumtext null comment '查询相关的日期信息', + `limit` bigint not null comment '查询相关的limit信息', native_query tinyint(1) default 0 not null comment '1-明细查询,0-聚合查询', - `sql` mediumtext null comment '解析后的sql', - created_at datetime not null comment '创建时间', - created_by varchar(100) not null comment '创建人', - status int(10) not null comment '运行状态', - elapsed_ms bigint(10) null comment 'sql解析耗时' + `sql` mediumtext null comment '解析后的sql', + created_at datetime not null comment '创建时间', + created_by varchar(100) not null comment '创建人', + status int(10) not null comment '运行状态', + elapsed_ms bigint(10) null comment 'sql解析耗时' ) comment '语义层sql解析信息表' charset = utf8; create table supersonic_sit.s2_view_info ( id bigint auto_increment primary key, - domain_id bigint null, - type varchar(20) null comment 'datasource、dimension、metric', - config text null comment 'config detail', - created_at datetime null, + domain_id bigint null, + type varchar(20) null comment 'datasource、dimension、metric', + config text null comment 'config detail', + created_at datetime null, created_by varchar(100) null, - updated_at datetime null, + updated_at datetime null, updated_by varchar(100) not null ) charset = utf8; -CREATE TABLE `s2_user` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(100) NOT NULL, - `display_name` varchar(100) DEFAULT NULL, - `password` varchar(100) DEFAULT NULL, - `email` varchar(100) DEFAULT NULL, - PRIMARY KEY (`id`) +CREATE TABLE `s2_user` +( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL, + `display_name` varchar(100) DEFAULT NULL, + `password` varchar(100) DEFAULT NULL, + `email` varchar(100) DEFAULT NULL, + PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/launchers/standalone/src/main/resources/db/sql-update.sql b/launchers/standalone/src/main/resources/db/sql-update.sql index 0b358de19..096dd6692 100644 --- a/launchers/standalone/src/main/resources/db/sql-update.sql +++ b/launchers/standalone/src/main/resources/db/sql-update.sql @@ -1 +1,38 @@ -alter table s2_domain add column `entity`varchar(500) DEFAULT NULL COMMENT '主题域实体信息'; \ No newline at end of file +alter table s2_domain + add column `entity` varchar(500) DEFAULT NULL COMMENT '主题域实体信息'; + + +--20230808 +alter table s2_domain drop column entity; + +create table s2_model +( + id bigint auto_increment + primary key, + name varchar(100) null, + biz_name varchar(100) null, + domain_id bigint null, + viewer varchar(500) null, + view_org varchar(500) null, + admin varchar(500) 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 +) collate = utf8_unicode_ci; + +alter table s2_datasource change column domain_id model_id bigint; +alter table s2_dimension change column domain_id model_id bigint; +alter table s2_metric change column domain_id model_id bigint; +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_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 diff --git a/launchers/standalone/src/main/resources/docker/Dockerfile b/launchers/standalone/src/main/resources/docker/Dockerfile index efed17138..6c3e14881 100644 --- a/launchers/standalone/src/main/resources/docker/Dockerfile +++ b/launchers/standalone/src/main/resources/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM docker-images.music.woa.com/di_base_img/tme_di_base_centos:8_7 +FROM centos:8 MAINTAINER admin ADD ../../../../target/launchers-standalone-*.gz /app/ RUN ls -l /app/launchers-standalone-*/bin/ diff --git a/launchers/standalone/src/main/resources/logback-spring.xml b/launchers/standalone/src/main/resources/logback-spring.xml index 810eda9b3..b6d7a041d 100644 --- a/launchers/standalone/src/main/resources/logback-spring.xml +++ b/launchers/standalone/src/main/resources/logback-spring.xml @@ -1,13 +1,13 @@ logback - + - %d{HH:mm:ss} [%thread] %-5level %logger{36} %line - %msg%n + %d{HH:mm:ss} [%thread] %-5level %logger{36} %line - %msg%n @@ -46,7 +46,8 @@ - ${LOG_PATH}/error.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + ${LOG_PATH}/error.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + 90 @@ -74,7 +75,8 @@ - ${LOG_PATH}/serviceinfo.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + ${LOG_PATH}/serviceinfo.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + 30 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 3fe268d76..bc6ebe11d 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 @@ -1,5 +1,7 @@ package com.tencent.supersonic.integration; +import static org.junit.Assert.assertEquals; + import com.tencent.supersonic.StandaloneLauncher; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.SchemaElement; @@ -13,6 +15,9 @@ import com.tencent.supersonic.chat.service.ChatService; import com.tencent.supersonic.chat.service.ConfigService; import com.tencent.supersonic.chat.service.QueryService; import com.tencent.supersonic.util.DataUtils; +import java.time.LocalDate; +import java.util.Set; +import java.util.stream.Collectors; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -20,12 +25,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; -import java.time.LocalDate; -import java.util.Set; -import java.util.stream.Collectors; - -import static org.junit.Assert.assertEquals; - @RunWith(SpringRunner.class) @SpringBootTest(classes = StandaloneLauncher.class) @ActiveProfiles("local") 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 b522827f7..abf7fd7fd 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 @@ -1,5 +1,7 @@ package com.tencent.supersonic.integration; +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; @@ -9,10 +11,9 @@ import com.tencent.supersonic.chat.query.rule.metric.MetricEntityQuery; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import com.tencent.supersonic.util.DataUtils; -import org.junit.Test; import java.util.ArrayList; import java.util.List; -import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.NONE; +import org.junit.Test; public class EntityQueryTest extends BaseQueryTest { 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 86af90a9d..941360dc6 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 @@ -1,27 +1,29 @@ package com.tencent.supersonic.integration; +import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.NONE; +import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.SUM; + import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; -import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.api.pojo.request.ChatConfigEditReqReq; -import com.tencent.supersonic.chat.api.pojo.response.ChatConfigResp; import com.tencent.supersonic.chat.api.pojo.request.ItemVisibility; -import com.tencent.supersonic.chat.query.rule.metric.MetricDomainQuery; +import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; +import com.tencent.supersonic.chat.api.pojo.response.ChatConfigResp; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.query.rule.metric.MetricFilterQuery; import com.tencent.supersonic.chat.query.rule.metric.MetricGroupByQuery; +import com.tencent.supersonic.chat.query.rule.metric.MetricModelQuery; import com.tencent.supersonic.chat.query.rule.metric.MetricTopNQuery; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import com.tencent.supersonic.util.DataUtils; -import org.junit.Test; -import org.springframework.beans.BeanUtils; - import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.*; - -import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; +import org.springframework.beans.BeanUtils; public class MetricQueryTest extends BaseQueryTest { @@ -56,7 +58,7 @@ public class MetricQueryTest extends BaseQueryTest { SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); expectedResult.setChatContext(expectedParseInfo); - expectedResult.setQueryMode(MetricDomainQuery.QUERY_MODE); + expectedResult.setQueryMode(MetricModelQuery.QUERY_MODE); expectedParseInfo.setAggType(NONE); expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数")); @@ -180,7 +182,7 @@ public class MetricQueryTest extends BaseQueryTest { @Test public void queryTest_CONFIG_VISIBILITY() throws Exception { // 1. round_1 use blacklist - ChatConfigResp chatConfig = configService.fetchConfigByDomainId(1L); + ChatConfigResp chatConfig = configService.fetchConfigByModelId(1L); ChatConfigEditReqReq extendEditCmd = new ChatConfigEditReqReq(); BeanUtils.copyProperties(chatConfig, extendEditCmd); // add blacklist @@ -193,7 +195,7 @@ public class MetricQueryTest extends BaseQueryTest { SemanticParseInfo expectedParseInfo = new SemanticParseInfo(); expectedResult.setChatContext(expectedParseInfo); - expectedResult.setQueryMode(MetricDomainQuery.QUERY_MODE); + expectedResult.setQueryMode(MetricModelQuery.QUERY_MODE); expectedParseInfo.setAggType(NONE); expectedParseInfo.getMetrics().add(DataUtils.getSchemaElement("访问次数")); diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MultiTurnsTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MultiTurnsTest.java index 9488da4a7..22e0c5256 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MultiTurnsTest.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/MultiTurnsTest.java @@ -1,5 +1,7 @@ package com.tencent.supersonic.integration; +import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.NONE; + import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.query.rule.metric.MetricFilterQuery; @@ -7,13 +9,10 @@ import com.tencent.supersonic.chat.query.rule.metric.MetricGroupByQuery; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import com.tencent.supersonic.util.DataUtils; -import org.junit.Test; -import org.junit.jupiter.api.Order; - import java.text.DateFormat; import java.text.SimpleDateFormat; - -import static com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum.NONE; +import org.junit.Test; +import org.junit.jupiter.api.Order; public class MultiTurnsTest extends BaseQueryTest { 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 7c0f02508..08b19eb3e 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 @@ -13,8 +13,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; -import java.util.Map; - @RunWith(SpringRunner.class) @SpringBootTest(classes = StandaloneLauncher.class) @ActiveProfiles("local") diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/PluginMockConfiguration.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/PluginMockConfiguration.java index 73bc16a11..076861c86 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/PluginMockConfiguration.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/PluginMockConfiguration.java @@ -1,6 +1,10 @@ package com.tencent.supersonic.integration.plugin; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.notNull; +import static org.mockito.Mockito.when; + import com.google.common.collect.Lists; import com.tencent.supersonic.chat.parser.embedding.EmbeddingConfig; import com.tencent.supersonic.chat.parser.embedding.EmbeddingResp; @@ -8,7 +12,7 @@ import com.tencent.supersonic.chat.parser.embedding.RecallRetrieval; import com.tencent.supersonic.chat.plugin.PluginManager; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; -import static org.mockito.Mockito.when; +import org.springframework.http.ResponseEntity; @Configuration @Slf4j @@ -29,4 +33,9 @@ public class PluginMockConfiguration { when(embeddingConfig.getUrl()).thenReturn("test"); } + 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/plugin/PluginRecognizeTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/plugin/PluginRecognizeTest.java index 8e231a187..be8a03bf3 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 @@ -1,19 +1,23 @@ package com.tencent.supersonic.integration.plugin; +import com.alibaba.fastjson.JSONObject; 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.QueryResult; import com.tencent.supersonic.chat.parser.embedding.EmbeddingConfig; import com.tencent.supersonic.chat.plugin.PluginManager; +import com.tencent.supersonic.chat.query.ContentInterpret.LLmAnswerResp; import com.tencent.supersonic.chat.service.QueryService; import com.tencent.supersonic.util.DataUtils; +import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.ResponseEntity; -public class PluginRecognizeTest extends BasePluginTest{ +public class PluginRecognizeTest extends BasePluginTest { @MockBean private EmbeddingConfig embeddingConfig; @@ -27,7 +31,7 @@ public class PluginRecognizeTest extends BasePluginTest{ @Test public void webPageRecognize() throws Exception { - PluginMockConfiguration.mockEmbeddingRecognize(pluginManager, "最近的访问情况怎么样","1"); + PluginMockConfiguration.mockEmbeddingRecognize(pluginManager, "alice最近的访问情况怎么样", "1"); PluginMockConfiguration.mockEmbeddingUrl(embeddingConfig); QueryReq queryContextReq = DataUtils.getQueryContextReq(1000, "alice最近的访问情况怎么样"); QueryResult queryResult = queryService.executeQuery(queryContextReq); @@ -36,18 +40,32 @@ public class PluginRecognizeTest extends BasePluginTest{ @Test public void webPageRecognizeWithQueryFilter() throws Exception { - PluginMockConfiguration.mockEmbeddingRecognize(pluginManager, "在超音数最近的情况怎么样","1"); + PluginMockConfiguration.mockEmbeddingRecognize(pluginManager, "在超音数最近的情况怎么样", "1"); PluginMockConfiguration.mockEmbeddingUrl(embeddingConfig); QueryReq queryRequest = DataUtils.getQueryContextReq(1000, "在超音数最近的情况怎么样"); QueryFilters queryFilters = new QueryFilters(); QueryFilter queryFilter = new QueryFilter(); queryFilter.setElementID(2L); queryFilter.setValue("alice"); - queryRequest.setDomainId(1L); + queryRequest.setModelId(1L); queryFilters.getFilters().add(queryFilter); queryRequest.setQueryFilters(queryFilters); QueryResult queryResult = queryService.executeQuery(queryRequest); assertPluginRecognizeResult(queryResult); } + @Test + public void contentInterpretRecognize() throws Exception { + PluginMockConfiguration.mockEmbeddingRecognize(pluginManager, "超音数最近访问情况怎么样", "3"); + PluginMockConfiguration.mockEmbeddingUrl(embeddingConfig); + LLmAnswerResp lLmAnswerResp = new LLmAnswerResp(); + lLmAnswerResp.setAssistant_message("超音数最近访问情况不错"); + PluginMockConfiguration.mockPluginManagerDoRequest(pluginManager, "answer_with_plugin_call", + ResponseEntity.ok(JSONObject.toJSONString(lLmAnswerResp))); + QueryReq queryRequest = DataUtils.getQueryContextReq(1000, "超音数最近访问情况怎么样"); + QueryResult queryResult = queryService.executeQuery(queryRequest); + Assert.assertEquals(queryResult.getResponse(), lLmAnswerResp.getAssistant_message()); + System.out.println(); + } + } 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 22f8a96cc..dfa463e59 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 @@ -1,5 +1,7 @@ package com.tencent.supersonic.util; +import static java.time.LocalDate.now; + import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; @@ -7,11 +9,8 @@ import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; - import java.util.Set; -import static java.time.LocalDate.now; - public class DataUtils { private static final User user_test = new User(1L, "admin", "admin", "admin@email"); @@ -34,9 +33,9 @@ public class DataUtils { .build(); } - public static SchemaElement getMetric(Long domainId, Long id, String name, String bizName) { + public static SchemaElement getMetric(Long modelId, Long id, String name, String bizName) { return SchemaElement.builder() - .domain(domainId) + .model(modelId) .id(id) .name(name) .bizName(bizName) @@ -45,9 +44,9 @@ public class DataUtils { .build(); } - public static SchemaElement getDimension(Long domainId, Long id, String name, String bizName) { + public static SchemaElement getDimension(Long modelId, Long id, String name, String bizName) { return SchemaElement.builder() - .domain(domainId) + .model(modelId) .id(id) .name(name) .bizName(bizName) @@ -56,8 +55,9 @@ 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); @@ -77,7 +77,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); diff --git a/launchers/standalone/src/test/resources/META-INF/spring.factories b/launchers/standalone/src/test/resources/META-INF/spring.factories index 41d5b4236..1f2e4f3d3 100644 --- a/launchers/standalone/src/test/resources/META-INF/spring.factories +++ b/launchers/standalone/src/test/resources/META-INF/spring.factories @@ -1,24 +1,18 @@ com.tencent.supersonic.chat.api.component.SchemaMapper=\ com.tencent.supersonic.chat.mapper.HanlpDictMapper - 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.TimeRangeParser, \ com.tencent.supersonic.chat.parser.rule.AggregateTypeParser # com.tencent.supersonic.chat.parser.llm.DSLQueryFunction - com.tencent.supersonic.chat.api.component.QueryProcessor=\ com.tencent.supersonic.chat.application.processor.SemanticQueryProcessor - com.tencent.supersonic.chat.api.component.SemanticLayer=\ com.tencent.supersonic.knowledge.semantic.LocalSemanticLayer - com.tencent.supersonic.chat.query.QuerySelector=\ com.tencent.supersonic.chat.query.HeuristicQuerySelector - com.tencent.supersonic.chat.application.query.DomainResolver=\ com.tencent.supersonic.chat.application.query.HeuristicDomainResolver - com.tencent.supersonic.auth.authentication.interceptor.AuthenticationInterceptor=\ com.tencent.supersonic.auth.authentication.interceptor.DefaultAuthenticationInterceptor diff --git a/launchers/standalone/src/test/resources/db/data-h2.sql b/launchers/standalone/src/test/resources/db/data-h2.sql index 502793606..c97f65959 100644 --- a/launchers/standalone/src/test/resources/db/data-h2.sql +++ b/launchers/standalone/src/test/resources/db/data-h2.sql @@ -1,1142 +1,2314 @@ --- chat data -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'); +-- sample user +insert into s2_user (id, `name`, password, display_name, email) +values (1, 'admin', 'admin', 'admin', 'admin@xx.com'); +insert into s2_user (id, `name`, password, display_name, email) +values (2, 'jack', '123456', 'jack', 'jack@xx.com'); +insert into s2_user (id, `name`, password, display_name, email) +values (3, 'tom', '123456', 'tom', 'tom@xx.com'); +insert into s2_user (id, `name`, password, display_name, email) +values (4, 'lucy', '123456', 'lucy', 'lucy@xx.com'); ---insert into s2_chat_config (`id` ,`domain_id` ,`default_metrics`,`visibility`,`entity_info` ,`dictionary_info`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) values (1,1,'[{"metricId":1,"unit":7,"period":"DAY"}]','{"blackDimIdList":[],"blackMetricIdList":[]}','{"entityIds":[2],"names":["用户","用户姓名"],"detailData":{"dimensionIds":[1,2],"metricIds":[2]}}','[{"itemId":1,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":2,"type":"DIMENSION","blackList":[],"isDictInfo":true},{"itemId":3,"type":"DIMENSION","blackList":[],"isDictInfo":true}]','2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); --- insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) --- values (1,1,'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"unit":7,"period":"DAY"}}', --- '{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":2,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[1,2],"metricIds":[1],"ratioMetricIds":[2],"unit":7,"period":"DAY","timeMode":"RECENT"}}', --- '2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); --- insert into s2_chat_config (`id` ,`domain_id` ,`chat_detail_config`,`chat_agg_config`,`created_at`,`updated_at`,`created_by`,`updated_by`,`status` ) --- values (2,2,'{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY"}}', --- '{"visibility":{"blackDimIdList":[],"blackMetricIdList":[]},"knowledgeInfos":[{"itemId":7,"type":"DIMENSION","searchEnable":true}],"chatDefaultConfig":{"dimensionIds":[4,5,6,7],"metricIds":[4],"unit":7,"period":"DAY","timeMode":"RECENT"}}', --- '2023-05-24 18:00:00','2023-05-25 11:00:00','admin','admin',1); +-- 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_chat (chat_id, `chat_name`, create_time, last_time, creator,last_question,is_delete,is_top) values (1, '超音数访问统计','2023-06-10 10:00:52.495','2023-06-10 10:00:52','admin','您好,欢迎使用内容智能小Q','0','0'); -insert into s2_chat (chat_id, `chat_name`, create_time, last_time, creator,last_question,is_delete,is_top) values (2, '用户访问统计','2023-06-10 10:01:04.528','2023-06-10 10:01:04','admin','您好,欢迎使用内容智能小Q','0','0'); - -insert into s2_chat_context (chat_id, modified_at , `user`, `query_text`, `semantic_parse` ,ext_data) VALUES(1, '2023-06-10 10:40:49.877', 'admin', '访问', '{"queryMode":"METRIC_ORDERBY","aggType":"NONE","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"nativeQuery":false}', 'admin'); -insert into s2_chat_context (chat_id, modified_at , `user`, `query_text`, `semantic_parse` ,ext_data) VALUES(2, '2023-06-10 10:42:02.184', 'null', '访问', '{"queryMode":"METRIC_ORDERBY","aggType":"NONE","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"nativeQuery":false}', 'null'); - -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(1, '2023-06-10 10:39:55.178', '超音数 访问次数', 'admin',0,1,'{"queryMode":"METRIC_DOMAIN","querySql":"SELECT `sys_imp_date` , `pv` FROM ( SELECT `sys_imp_date` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` FROM ( SELECT `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_f370` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_DOMAIN","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","pv":11},{"sys_imp_date":"2023-06-04","pv":14},{"sys_imp_date":"2023-06-05","pv":1},{"sys_imp_date":"2023-06-06","pv":19},{"sys_imp_date":"2023-06-07","pv":18},{"sys_imp_date":"2023-06-08","pv":24},{"sys_imp_date":"2023-06-09","pv":23}]}',0,''); -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(2, '2023-06-10 10:40:12.259', '按页面', 'admin',0,1,'{"queryMode":"METRIC_ORDERBY","querySql":"SELECT `sys_imp_date` , `page` , `pv` FROM ( SELECT `sys_imp_date` , `page` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` , `page` FROM ( SELECT `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` , `page` AS `page` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_ecf5` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` , `page` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"页面","type":"VARCHAR","nameEn":"page","showType":"CATEGORY","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_ORDERBY","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","page":"p1","pv":2},{"sys_imp_date":"2023-06-03","page":"p2","pv":3},{"sys_imp_date":"2023-06-03","page":"p3","pv":2},{"sys_imp_date":"2023-06-03","page":"p4","pv":1},{"sys_imp_date":"2023-06-03","page":"p5","pv":3},{"sys_imp_date":"2023-06-04","page":"p1","pv":3},{"sys_imp_date":"2023-06-04","page":"p2","pv":1},{"sys_imp_date":"2023-06-04","page":"p3","pv":2},{"sys_imp_date":"2023-06-04","page":"p4","pv":4},{"sys_imp_date":"2023-06-04","page":"p5","pv":4}]}',0,''); -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(3, '2023-06-10 10:40:49.877', '访问', 'admin',0,1,'{"queryMode":"METRIC_ORDERBY","querySql":"SELECT `sys_imp_date` , `page` , `uv` , `pv` FROM ( SELECT `sys_imp_date` , `page` , `s2_pv_uv_statis_uv` AS `uv` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT COUNT ( DISTINCT `s2_pv_uv_statis_uv` ) AS `s2_pv_uv_statis_uv` , SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` , `page` FROM ( SELECT `uv` AS `s2_pv_uv_statis_uv` , `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` , `page` AS `page` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_022c` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' ) GROUP BY `sys_imp_date` , `page` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"页面","type":"VARCHAR","nameEn":"page","showType":"CATEGORY","authorized":true},{"name":"访问人数","type":"BIGINT","nameEn":"uv","showType":"NUMBER","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"}},"chatContext":{"queryMode":"METRIC_ORDERBY","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":3,"name":"访问人数","bizName":"uv","status":1,"sensitiveLevel":0},{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"id":3,"name":"页面","bizName":"page","status":1,"sensitiveLevel":0},{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","page":"p1","uv":2,"pv":2},{"sys_imp_date":"2023-06-03","page":"p2","uv":3,"pv":3},{"sys_imp_date":"2023-06-03","page":"p3","uv":2,"pv":2},{"sys_imp_date":"2023-06-03","page":"p4","uv":1,"pv":1},{"sys_imp_date":"2023-06-03","page":"p5","uv":3,"pv":3},{"sys_imp_date":"2023-06-04","page":"p1","uv":2,"pv":3},{"sys_imp_date":"2023-06-04","page":"p2","uv":1,"pv":1},{"sys_imp_date":"2023-06-04","page":"p3","uv":2,"pv":2},{"sys_imp_date":"2023-06-04","page":"p4","uv":3,"pv":4},{"sys_imp_date":"2023-06-04","page":"p5","uv":3,"pv":4}]}',0,''); -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(4, '2023-06-10 10:41:18.589','alice 访问次数','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `pv` FROM ( SELECT `sys_imp_date` , `s2_pv_uv_statis_pv` AS `pv` FROM ( SELECT SUM ( `s2_pv_uv_statis_pv` ) AS `s2_pv_uv_statis_pv` , `sys_imp_date` FROM ( SELECT `user_name` , `pv` AS `s2_pv_uv_statis_pv` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `user_name` , `page` , 1 AS `pv` , `user_name` AS `uv` FROM `s2_pv_uv_statis` ) AS `s2_pv_uv_statis` ) AS `src00_s2_pv_uv_statis_b825` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_pv_uv_statis_0` ) AS `s2_pv_uv_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"访问次数","type":"BIGINT","nameEn":"pv","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":2,"name":"访问次数","bizName":"pv","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","pv":2},{"sys_imp_date":"2023-06-04","pv":2},{"sys_imp_date":"2023-06-06","pv":2},{"sys_imp_date":"2023-06-07","pv":2},{"sys_imp_date":"2023-06-08","pv":5},{"sys_imp_date":"2023-06-09","pv":2}]}',0,''); -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(5, '2023-06-10 10:41:48.211','停留时长','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}',0,''); -insert into s2_chat_query (`question_id`,`create_time`,`query_text`,`user_name`,`query_state`,`chat_id`,`query_response`,`score`,`feedback`) VALUES(6, '2023-06-10 10:42:02.184','访问','admin',0,2,'{"queryMode":"METRIC_FILTER","querySql":"SELECT `sys_imp_date` , `stay_hours` FROM ( SELECT `sys_imp_date` , `s2_stay_time_statis_stay_hours` AS `stay_hours` FROM ( SELECT SUM ( `s2_stay_time_statis_stay_hours` ) AS `s2_stay_time_statis_stay_hours` , `sys_imp_date` FROM ( SELECT `user_name` , `stay_hours` AS `s2_stay_time_statis_stay_hours` , `imp_date` AS `sys_imp_date` FROM ( SELECT `imp_date` , `page` , `user_name` , `stay_hours` FROM `s2_stay_time_statis` ) AS `s2_stay_time_statis` ) AS `src00_s2_stay_time_statis_df18` WHERE ( `sys_imp_date` >= ''2023-06-03'' AND `sys_imp_date` <= ''2023-06-09'' AND `user_name` = ''alice'' ) GROUP BY `sys_imp_date` ) AS `s2_stay_time_statis_0` ) AS `s2_stay_time_statis_1` LIMIT 10","queryState":0,"queryColumns":[{"name":"date","type":"VARCHAR","nameEn":"sys_imp_date","showType":"DATE","authorized":true},{"name":"停留时长","type":"DOUBLE","nameEn":"stay_hours","showType":"NUMBER","authorized":true}],"entityInfo":{"domainInfo":{"itemId":1,"name":"超音数","bizName":"supersonic","words":["用户","用户姓名"],"primaryEntityBizName":"user_name"},"dimensions":[{"itemId":1,"name":"部门","bizName":"department","value":"sales"},{"itemId":2,"name":"用户名","bizName":"user_name","value":"alice"}],"metrics":[{"itemId":2,"name":"访问次数","bizName":"pv","value":"2"}],"entityId":"alice"},"chatContext":{"queryMode":"METRIC_FILTER","domainId":1,"domainName":"超音数","entity":0,"metrics":[{"id":1,"name":"停留时长","bizName":"stay_hours","status":1,"sensitiveLevel":0}],"dimensions":[{"bizName":"sys_imp_date","status":1,"sensitiveLevel":0}],"dimensionFilters":[{"bizName":"user_name","name":"用户名","operator":"=","value":"alice","elementID":2}],"metricFilters":[],"orders":[],"dateInfo":{"dateMode":"RECENT_UNITS","startDate":"2023-06-03","endDate":"2023-06-09","dateList":[],"unit":7,"period":"DAY"},"limit":10,"nativeQuery":false},"queryResults":[{"sys_imp_date":"2023-06-03","stay_hours":0.5963801306980994},{"sys_imp_date":"2023-06-04","stay_hours":1.5120376931855422},{"sys_imp_date":"2023-06-06","stay_hours":3.7790223355266317},{"sys_imp_date":"2023-06-07","stay_hours":0.8654528466186735},{"sys_imp_date":"2023-06-08","stay_hours":0.9796159603778489},{"sys_imp_date":"2023-06-09","stay_hours":0.6705580511822682}]}',0,''); - --- insert into s2_plugin (id, `type`, `domain`, pattern, parse_mode, parse_mode_config, `name`, created_at, created_by, updated_at, updated_by, config) VALUES (1, 'WEB_PAGE', 1, '访问情况', 'EMBEDDING_RECALL', null, '访问情况', '2023-06-11 19:36:47', 'admin', '2023-06-21 15:26:46', 'admin', '{"params":{"1":[{"key":"name","paramType":"SEMANTIC","elementId":2}]}, "url":"www.test.com"}'); --- insert into s2_plugin (id, `type`, `domain`, pattern, parse_mode, parse_mode_config, `name`, created_at, created_by, updated_at, updated_by, config) VALUES (2, 'DSL', null, '', 'FUNCTION_CALL', null, '访问情况', '2023-06-11 19:36:47', 'admin', '2023-06-21 15:26:46', 'admin', ''); - --- semantic data -insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(1, 1, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); -insert into s2_database (id, domain_id , `name`, description, `type` ,config ,created_at ,created_by ,updated_at ,updated_by) VALUES(2, 2, 'H2数据实例', '', 'h2', '{"password":"semantic","url":"jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false","userName":"root"}', '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin'); -insert into s2_datasource (id , domain_id, `name`, biz_name, description, database_id ,datasource_detail, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, '停留时长统计', 's2_stay_time_statis', '停留时长统计', 1, '{"dimensions":[{"bizName":"imp_date","dateFormat":"yyyy-MM-dd","expr":"imp_date","isCreateDimension":0,"type":"time","typeParams":{"isPrimary":"true","timeGranularity":"day"}},{"bizName":"page","dateFormat":"yyyy-MM-dd","expr":"page","isCreateDimension":0,"type":"categorical"}],"identifiers":[{"bizName":"user_name","name":"用户名","type":"primary"}],"measures":[{"agg":"sum","bizName":"s2_stay_time_statis_stay_hours","expr":"stay_hours","isCreateMetric":1,"name":"停留时长"}],"queryType":"sql_query","sqlQuery":"SELECT imp_date, page,user_name,stay_hours FROM s2_stay_time_statis"}', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource (id , domain_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 , domain_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 , domain_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 , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(1, 1, 1, 2, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(2, 1, 1, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_datasource_rela (id , domain_id, `datasource_from`, datasource_to, join_key, created_at, created_by, updated_at, updated_by ) VALUES(3, 1, 2, 3, 'user_name', '2023-05-25 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(1, 1, 3, '部门', 'department', '部门', 1, 0, 'categorical', NULL, 'department', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(2, 1, 1, '用户名', 'user_name', '用户名', 1, 0, 'primary', NULL, 'user_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(3, 1, 2, '页面', 'page', '页面', 1, 2, 'categorical', NULL, 'page', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(4, 2, 4, '活跃区域', 'act_area', '活跃区域', 1, 2, 'categorical', NULL, 'act_area', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_dimension (id , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(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 , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(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 , domain_id, datasource_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, expr, created_at, created_by, updated_at, updated_by, semantic_type) VALUES(7, 2, 4, '歌手名', 'singer_name', '歌手名', 1, 2, 'categorical', NULL, 'singer_name', '2023-05-24 00:00:00', 'admin', '2023-05-25 00:00:00', 'admin', 'CATEGORY'); -insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(1, '超音数', 'supersonic', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' ); --- insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org) VALUES(2, '艺人库', 'singer', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin' ); -insert into s2_domain (id, `name`, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, `admin`, admin_org, is_open, viewer, view_org, entity) VALUES(2, '艺人库', 'singer', 0, 1, '2023-05-24 00:00:00', 'admin', '2023-05-24 00:00:00', 'admin', 'admin', '', 0, 'admin,tom,jack', 'admin','{"entityId": 7, "names": ["歌手", "艺人"]}' ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(1, 1, '停留时长', 'stay_hours', '停留时长', 1, 2, 'expr', '{"expr":"s2_stay_time_statis_stay_hours","measures":[{"agg":"sum","expr":"stay_hours","isCreateMetric":1,"datasourceId":1,"bizName":"s2_stay_time_statis_stay_hours","name":"s2_stay_time_statis_stay_hours"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(2, 1, '访问次数', 'pv', '访问次数', 1, 0, 'expr', ' {"expr":"s2_pv_uv_statis_pv","measures":[{"agg":"sum","bizName":"s2_pv_uv_statis_pv","datasourceId":2,"expr":"pv","isCreateMetric":1,"name":"s2_pv_uv_statis_pv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(3, 1, '访问人数', 'uv', '访问人数', 1, 0, 'expr', ' {"expr":"s2_pv_uv_statis_uv","measures":[{"agg":"count_distinct","bizName":"s2_pv_uv_statis_uv","datasourceId":2,"expr":"uv","isCreateMetric":1,"name":"s2_pv_uv_statis_uv"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(4, 2, '播放量', 'js_play_cnt', '播放量', 1, 2, 'expr', '{"expr":"music_js_play_cnt","measures":[{"agg":"sum","expr":"js_play_cnt","isCreateMetric":1,"datasourceId":4,"bizName":"music_js_play_cnt","name":"music_js_play_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(5, 2, '下载量', 'down_cnt', '下载量', 1, 0, 'expr', ' {"expr":"music_down_cnt","measures":[{"agg":"sum","bizName":"music_down_cnt","datasourceId":4,"expr":"down_cnt","isCreateMetric":1,"name":"music_down_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); -insert into s2_metric (id, domain_id, `name`, biz_name, description, status, sensitive_level, `type`, type_params, created_at, created_by, updated_at, updated_by, data_format_type, data_format) VALUES(6, 2, '收藏量', 'favor_cnt', '收藏量', 1, 0, 'expr', ' {"expr":"music_favor_cnt","measures":[{"agg":"sum","bizName":"music_favor_cnt","datasourceId":4,"expr":"favor_cnt","isCreateMetric":1,"name":"music_favor_cnt"}]}' , '2023-05-24 17:00:00', 'admin', '2023-05-25 00:00:00', 'admin', NULL, NULL ); - -insert into s2_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, '{"domainId":"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, '{"domainId":"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":"开通 tom sales部门权限", "authorizedUsers":["tom"],"authorizedDepartmentIds":[]}'); -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); +-- 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()), '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/test/resources/db/schema-h2.sql b/launchers/standalone/src/test/resources/db/schema-h2.sql index 18d01dca8..03f9e50f2 100644 --- a/launchers/standalone/src/test/resources/db/schema-h2.sql +++ b/launchers/standalone/src/test/resources/db/schema-h2.sql @@ -1,370 +1,734 @@ -- 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, + `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 '', PRIMARY KEY (`question_id`) ); -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`) -) ; -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_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_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'; +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 , - `is_unique` INT DEFAULT NULL , -- 0 is non-unique, 1 is unique - `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`) +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'; +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`) +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'; +COMMENT +ON TABLE s2_database IS 'database instance table'; -CREATE TABLE IF NOT EXISTS `s2_datasource` ( - `id` INT NOT NULL AUTO_INCREMENT, - `domain_id` INT NOT NULL , - `name` varchar(255) NOT NULL , - `biz_name` varchar(255) NOT NULL , - `description` varchar(500) DEFAULT NULL , - `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`) +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_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, - `domain_id` INT NOT NULL , - `name` varchar(255) NOT NULL , - `biz_name` varchar(255) NOT NULL , - `description` varchar(500) DEFAULT NULL , - `status` INT NOT NULL , -- 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 , - `domain_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, - domain_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, - domain_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 - `domain_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 , - `domain_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, - `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, + `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/launchers/standalone/src/test/resources/logback-spring.xml b/launchers/standalone/src/test/resources/logback-spring.xml index 810eda9b3..b6d7a041d 100644 --- a/launchers/standalone/src/test/resources/logback-spring.xml +++ b/launchers/standalone/src/test/resources/logback-spring.xml @@ -1,13 +1,13 @@ logback - + - %d{HH:mm:ss} [%thread] %-5level %logger{36} %line - %msg%n + %d{HH:mm:ss} [%thread] %-5level %logger{36} %line - %msg%n @@ -46,7 +46,8 @@ - ${LOG_PATH}/error.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + ${LOG_PATH}/error.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + 90 @@ -74,7 +75,8 @@ - ${LOG_PATH}/serviceinfo.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + ${LOG_PATH}/serviceinfo.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz + 30 diff --git a/pom.xml b/pom.xml index 4a67beb53..17ec1f9f3 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,7 @@ 8 UTF-8 2.17.1 - 5.1.8 + 5.3.3 1.2.10 3.5.3 1.18.20 @@ -62,6 +62,7 @@ 1.34.0 1.23.0 3.2.4 + 4.5 0.6-SNAPSHOT diff --git a/semantic/api/pom.xml b/semantic/api/pom.xml index 7c6b480e6..974e7ca6c 100644 --- a/semantic/api/pom.xml +++ b/semantic/api/pom.xml @@ -12,11 +12,11 @@ semantic-api - - - - - + + + + + com.clickhouse clickhouse-jdbc 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 24aeefbfa..3a4d262a4 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 @@ -1,9 +1,8 @@ package com.tencent.supersonic.semantic.api.model.pojo; -import lombok.Data; - import java.util.ArrayList; import java.util.List; +import lombok.Data; /** * @author: kanedai diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/Entity.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/Entity.java index a547a98fb..84b51045d 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/Entity.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/Entity.java @@ -1,12 +1,11 @@ package com.tencent.supersonic.semantic.api.model.pojo; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; -import java.util.List; - @Data @ToString @AllArgsConstructor diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/MetricTypeParams.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/MetricTypeParams.java index 78d403b23..059539173 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/MetricTypeParams.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/MetricTypeParams.java @@ -1,7 +1,7 @@ package com.tencent.supersonic.semantic.api.model.pojo; -import java.util.List; import com.google.common.collect.Lists; +import java.util.List; import lombok.Data; @Data diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/QueryStat.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/QueryStat.java index e2a429a13..f08b126f9 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/QueryStat.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/QueryStat.java @@ -13,7 +13,7 @@ public class QueryStat { private Long id; private String traceId; - private Long domainId; + private Long modelId; private String user; private String createdAt; /** @@ -79,8 +79,8 @@ public class QueryStat { return this; } - public QueryStat setClassId(Long domainId) { - this.domainId = domainId; + public QueryStat setClassId(Long modelId) { + this.modelId = modelId; return this; } diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DatasourceRelaReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DatasourceRelaReq.java index 7afeb0a1d..dad001e61 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DatasourceRelaReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DatasourceRelaReq.java @@ -8,8 +8,8 @@ public class DatasourceRelaReq { private Long id; - @NotNull(message = "class id cat not be null") - private Long domainId; + @NotNull(message = "model id cat not be null") + private Long modelId; @NotNull(message = "datasource id cat not be null") private Long datasourceFrom; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DatasourceReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DatasourceReq.java index acf3e0fec..bb6de1589 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DatasourceReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DatasourceReq.java @@ -6,7 +6,6 @@ import com.tencent.supersonic.semantic.api.model.pojo.Identify; import com.tencent.supersonic.semantic.api.model.pojo.Measure; import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; import java.util.List; - import lombok.Data; @@ -21,7 +20,7 @@ public class DatasourceReq extends SchemaItem { private String tableQuery; - private Long domainId; + private Long modelId; private List identifiers; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DimensionReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DimensionReq.java index 37bc1db50..d9b8228f3 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DimensionReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DimensionReq.java @@ -2,17 +2,14 @@ package com.tencent.supersonic.semantic.api.model.request; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; - -import javax.validation.constraints.NotNull; - -import lombok.Data; - import java.util.List; +import javax.validation.constraints.NotNull; +import lombok.Data; @Data public class DimensionReq extends SchemaItem { - private Long domainId; + private Long modelId; private String type; 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 03945e854..b57f342a6 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,12 +1,9 @@ package com.tencent.supersonic.semantic.api.model.request; -import com.tencent.supersonic.semantic.api.model.pojo.Entity; import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; - import java.util.ArrayList; import java.util.List; - import lombok.Data; @@ -24,6 +21,4 @@ public class DomainReq extends SchemaItem { private List admins = new ArrayList<>(); private List adminOrgs = new ArrayList<>(); - - private Entity entity; } diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricBaseReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricBaseReq.java index 13549bcdf..9ae91c276 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricBaseReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricBaseReq.java @@ -1,15 +1,15 @@ package com.tencent.supersonic.semantic.api.model.request; -import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; import com.tencent.supersonic.common.pojo.DataFormat; +import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; import lombok.Data; @Data public class MetricBaseReq extends SchemaItem { - private Long domainId; + private Long modelId; private String alias; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricReq.java index 092a8c537..b0531f6ef 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricReq.java @@ -4,8 +4,8 @@ package com.tencent.supersonic.semantic.api.model.request; import com.tencent.supersonic.semantic.api.model.enums.MetricTypeEnum; import com.tencent.supersonic.semantic.api.model.pojo.Measure; import com.tencent.supersonic.semantic.api.model.pojo.MetricTypeParams; -import lombok.Data; import java.util.List; +import lombok.Data; @Data public class MetricReq extends MetricBaseReq { diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/ModelReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/ModelReq.java new file mode 100644 index 000000000..3f04ed8ab --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/ModelReq.java @@ -0,0 +1,27 @@ +package com.tencent.supersonic.semantic.api.model.request; + + +import com.tencent.supersonic.semantic.api.model.pojo.Entity; +import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; +import java.util.ArrayList; +import java.util.List; +import lombok.Data; + + +@Data +public class ModelReq extends SchemaItem { + + private Long domainId = 0L; + + private Integer isOpen = 0; + + private List viewers = new ArrayList<>(); + + private List viewOrgs = new ArrayList<>(); + + private List admins = new ArrayList<>(); + + private List adminOrgs = new ArrayList<>(); + + private Entity entity; +} diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DomainSchemaFilterReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/ModelSchemaFilterReq.java similarity index 71% rename from semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DomainSchemaFilterReq.java rename to semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/ModelSchemaFilterReq.java index db0d04c99..1ccccfb72 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/DomainSchemaFilterReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/ModelSchemaFilterReq.java @@ -4,10 +4,10 @@ import java.util.List; import lombok.Data; @Data -public class DomainSchemaFilterReq { +public class ModelSchemaFilterReq { /** * if domainIds is empty, get all domain info */ - private List domainIds; + private List modelIds; } \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/PageMetricReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/PageMetricReq.java index 40edea0c2..aad02b810 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/PageMetricReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/PageMetricReq.java @@ -9,4 +9,6 @@ public class PageMetricReq extends PageSchemaItemReq { private String type; + private String key; + } diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/PageSchemaItemReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/PageSchemaItemReq.java index d3ce23d20..668754e0f 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/PageSchemaItemReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/PageSchemaItemReq.java @@ -1,8 +1,9 @@ package com.tencent.supersonic.semantic.api.model.request; +import com.google.common.collect.Lists; import com.tencent.supersonic.common.pojo.PageBaseReq; -import lombok.Data; import java.util.List; +import lombok.Data; @Data public class PageSchemaItemReq extends PageBaseReq { @@ -11,7 +12,8 @@ public class PageSchemaItemReq extends PageBaseReq { private String name; private String bizName; private String createdBy; - private List domainIds; + private List domainIds = Lists.newArrayList(); + private List modelIds = Lists.newArrayList(); private Integer sensitiveLevel; private Integer status; } diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/SqlExecuteReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/SqlExecuteReq.java index 9a162460a..4dacd1558 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/SqlExecuteReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/SqlExecuteReq.java @@ -7,10 +7,11 @@ import lombok.Data; @Data public class SqlExecuteReq { + public static final String LIMIT_WRAPPER = " select * from ( %s ) a limit 1000 "; - @NotNull(message = "domainId can not be null") - private Long domainId; + @NotNull(message = "modelId can not be null") + private Long modelId; @NotBlank(message = "sql can not be blank") private String sql; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DatasourceResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DatasourceResp.java index 20b34f97f..f3751d794 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DatasourceResp.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DatasourceResp.java @@ -7,7 +7,7 @@ import lombok.Data; @Data public class DatasourceResp extends SchemaItem { - private Long domainId; + private Long modelId; private Long databaseId; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DimensionResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DimensionResp.java index 3d98d935d..f8acb9578 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DimensionResp.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DimensionResp.java @@ -3,9 +3,7 @@ package com.tencent.supersonic.semantic.api.model.response; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; - import java.util.List; - import lombok.Data; import lombok.ToString; @@ -14,7 +12,7 @@ import lombok.ToString; @ToString(callSuper = true) public class DimensionResp extends SchemaItem { - private Long domainId; + private Long modelId; private String type; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DomainResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DomainResp.java index 13c66160c..3854a6832 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DomainResp.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DomainResp.java @@ -2,9 +2,7 @@ package com.tencent.supersonic.semantic.api.model.response; import com.tencent.supersonic.semantic.api.model.pojo.Entity; import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; - import java.util.List; - import lombok.Data; import lombok.ToString; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/MetricResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/MetricResp.java index 682d970d3..9afbe3368 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/MetricResp.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/MetricResp.java @@ -12,17 +12,15 @@ import lombok.ToString; @ToString(callSuper = true) public class MetricResp extends SchemaItem { - private Long domainId; + private Long modelId; - private String domainName; + private String modelName; //ATOMIC DERIVED private String type; private MetricTypeParams typeParams; - private String fullPath; - private String dataFormatType; private DataFormat dataFormat; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/ModelResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/ModelResp.java new file mode 100644 index 000000000..bb5dad154 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/ModelResp.java @@ -0,0 +1,37 @@ +package com.tencent.supersonic.semantic.api.model.response; + +import com.tencent.supersonic.semantic.api.model.pojo.Entity; +import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; +import java.util.List; +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class ModelResp extends SchemaItem { + + private Long domainId; + + private List viewers; + + private List viewOrgs; + + private List admins; + + private List adminOrgs; + + private Integer isOpen = 0; + + private Integer dimensionCnt; + + private Integer metricCnt; + + private Entity entity; + + private String fullPath; + + public boolean openToAll() { + return isOpen != null && isOpen == 1; + } + +} diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DomainSchemaRelaResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/ModelSchemaRelaResp.java similarity index 88% rename from semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DomainSchemaRelaResp.java rename to semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/ModelSchemaRelaResp.java index 33d3c11be..48e40e257 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DomainSchemaRelaResp.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/ModelSchemaRelaResp.java @@ -4,7 +4,7 @@ import java.util.List; import lombok.Data; @Data -public class DomainSchemaRelaResp { +public class ModelSchemaRelaResp { private Long domainId; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DomainSchemaResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/ModelSchemaResp.java similarity index 85% rename from semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DomainSchemaResp.java rename to semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/ModelSchemaResp.java index a57be2e5b..175828547 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/DomainSchemaResp.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/ModelSchemaResp.java @@ -1,7 +1,6 @@ package com.tencent.supersonic.semantic.api.model.response; import java.util.List; - import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -9,7 +8,7 @@ import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor -public class DomainSchemaResp extends DomainResp { +public class ModelSchemaResp extends ModelResp { private List metrics; private List dimensions; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/QueryResultWithSchemaResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/QueryResultWithSchemaResp.java index 72ddcd66c..ccd369685 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/QueryResultWithSchemaResp.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/QueryResultWithSchemaResp.java @@ -6,7 +6,6 @@ import com.tencent.supersonic.common.pojo.QueryColumn; import com.tencent.supersonic.semantic.api.model.pojo.QueryResult; import java.util.List; import java.util.Map; - import lombok.Data; import lombok.ToString; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Criterion.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Criterion.java index 162779ba1..25f3a191d 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Criterion.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Criterion.java @@ -1,10 +1,8 @@ package com.tencent.supersonic.semantic.api.query.pojo; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; - import java.util.Arrays; import java.util.List; - import lombok.Data; @Data diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Filter.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Filter.java index 9c3d2506e..885cc576f 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Filter.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Filter.java @@ -1,9 +1,7 @@ package com.tencent.supersonic.semantic.api.query.pojo; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; - import java.util.List; - import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Param.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Param.java index 7d47d71ed..3b178e29b 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Param.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Param.java @@ -1,7 +1,6 @@ package com.tencent.supersonic.semantic.api.query.pojo; import javax.validation.constraints.NotBlank; - import lombok.Data; @Data diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/ItemUseReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/ItemUseReq.java index fd4e74299..d1af76a40 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/ItemUseReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/ItemUseReq.java @@ -10,12 +10,12 @@ import lombok.ToString; public class ItemUseReq { private String startTime; - private Long domainId; + private Long modelId; private Boolean cacheEnable = true; private String metric; - public ItemUseReq(String startTime, Long domainId) { + public ItemUseReq(String startTime, Long modelId) { this.startTime = startTime; - this.domainId = domainId; + this.modelId = modelId; } } diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/QueryDslReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/QueryDslReq.java index f5f916ad3..6c74bbbd7 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/QueryDslReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/QueryDslReq.java @@ -8,7 +8,7 @@ import lombok.ToString; @ToString public class QueryDslReq { - private Long domainId; + private Long modelId; private String sql; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/QueryStructReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/QueryStructReq.java index 053503462..27d29b7bf 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/QueryStructReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/request/QueryStructReq.java @@ -1,17 +1,15 @@ package com.tencent.supersonic.semantic.api.query.request; import com.google.common.collect.Lists; -import com.tencent.supersonic.semantic.api.query.pojo.Cache; -import com.tencent.supersonic.semantic.api.query.pojo.Filter; -import com.tencent.supersonic.semantic.api.query.pojo.Param; import com.tencent.supersonic.common.pojo.Aggregator; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.Order; - +import com.tencent.supersonic.semantic.api.query.pojo.Cache; +import com.tencent.supersonic.semantic.api.query.pojo.Filter; +import com.tencent.supersonic.semantic.api.query.pojo.Param; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; - import lombok.Data; import org.apache.commons.codec.digest.DigestUtils; import org.apache.logging.log4j.util.Strings; @@ -21,7 +19,7 @@ import org.springframework.util.CollectionUtils; @Data public class QueryStructReq { - private Long domainId; + private Long modelId; private List groups = new ArrayList<>(); private List aggregators = new ArrayList<>(); @@ -70,8 +68,8 @@ public class QueryStructReq { public String toCustomizedString() { StringBuilder stringBuilder = new StringBuilder("{"); - stringBuilder.append("\"domainId\":") - .append(domainId); + stringBuilder.append("\"modelId\":") + .append(modelId); stringBuilder.append(",\"groups\":") .append(groups); stringBuilder.append(",\"aggregators\":") @@ -104,8 +102,8 @@ public class QueryStructReq { @Override public String toString() { final StringBuilder sb = new StringBuilder("{"); - sb.append("\"domainId\":") - .append(domainId); + sb.append("\"modelId\":") + .append(modelId); sb.append(",\"groups\":") .append(groups); sb.append(",\"aggregators\":") diff --git a/semantic/model/pom.xml b/semantic/model/pom.xml index 264bfe3ae..260dd45d9 100644 --- a/semantic/model/pom.xml +++ b/semantic/model/pom.xml @@ -17,7 +17,6 @@ - org.projectlombok @@ -75,7 +74,6 @@ - org.testng testng 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 223463a80..0f2ef7470 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,19 +1,20 @@ package com.tencent.supersonic.semantic.model.application; import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter; -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.api.model.response.DatabaseResp; 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.response.MetricResp; +import com.tencent.supersonic.semantic.api.model.response.ModelResp; +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.Catalog; 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.model.domain.ModelService; import com.tencent.supersonic.semantic.model.domain.dataobject.DatabaseDO; import com.tencent.supersonic.semantic.model.domain.repository.DatabaseRepository; import com.tencent.supersonic.semantic.model.domain.utils.DatabaseConverter; @@ -29,17 +30,17 @@ import org.springframework.stereotype.Component; public class CatalogImpl implements Catalog { private final DatabaseRepository databaseRepository; - private final DomainService domainService; + private final ModelService modelService; private final DimensionService dimensionService; private final DatasourceService datasourceService; private final MetricService metricService; public CatalogImpl(DatabaseRepository databaseRepository, - DomainService domainService, DimensionService dimensionService, + ModelService modelService, DimensionService dimensionService, DatasourceService datasourceService, MetricService metricService) { this.databaseRepository = databaseRepository; - this.domainService = domainService; + this.modelService = modelService; this.dimensionService = dimensionService; this.datasourceService = datasourceService; this.metricService = metricService; @@ -50,47 +51,51 @@ public class CatalogImpl implements Catalog { return DatabaseConverter.convert(databaseDO); } - public DatabaseResp getDatabaseByDomainId(Long domainId) { - List databaseDOS = databaseRepository.getDatabaseByDomainId(domainId); + public DatabaseResp getDatabaseByModelId(Long modelId) { + List databaseDOS = databaseRepository.getDatabaseByDomainId(modelId); Optional databaseDO = databaseDOS.stream().findFirst(); return databaseDO.map(DatabaseConverter::convert).orElse(null); } @Override - public String getDomainFullPath(Long domainId) { - return domainService.getDomainFullPath(domainId); + public String getModelFullPath(Long modelId) { + ModelResp modelResp = modelService.getModelMap().get(modelId); + if (modelResp != null) { + return modelResp.getFullPath(); + } + return ""; } @Override - public Map getDomainFullPath() { - return domainService.getDomainFullPath(); + public Map getModelFullPath() { + return modelService.getModelFullPathMap(); } @Override - public DimensionResp getDimension(String bizName, Long domainId) { - return dimensionService.getDimension(bizName, domainId); + public DimensionResp getDimension(String bizName, Long modelId) { + return dimensionService.getDimension(bizName, modelId); } @Override - public void getModelYamlTplByDomainIds(Set domainIds, Map> dimensionYamlMap, + public void getModelYamlTplByMoldelIds(Set modelIds, Map> dimensionYamlMap, List datasourceYamlTplList, List metricYamlTplList) { - datasourceService.getModelYamlTplByDomainIds(domainIds, dimensionYamlMap, datasourceYamlTplList, + datasourceService.getModelYamlTplByModelIds(modelIds, dimensionYamlMap, datasourceYamlTplList, metricYamlTplList); } @Override - public List getDimensions(Long domainId) { - return dimensionService.getDimensions(domainId); + public List getDimensions(Long modelId) { + return dimensionService.getDimensions(modelId); } @Override - public List getDatasourceList(Long domainId) { - return datasourceService.getDatasourceList(domainId); + public List getDatasourceList(Long modelId) { + return datasourceService.getDatasourceList(modelId); } @Override - public List getMetrics(Long domainId) { - return metricService.getMetrics(domainId); + public List getMetrics(Long modelId) { + return metricService.getMetrics(modelId); } @Override 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 fb7e150e8..fd943ab4c 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 @@ -3,19 +3,23 @@ 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.SqlParserResp; +import com.tencent.supersonic.semantic.model.domain.DatabaseService; +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; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; @@ -29,9 +33,18 @@ public class DatabaseServiceImpl implements DatabaseService { private final SqlUtils sqlUtils; private DatabaseRepository databaseRepository; - public DatabaseServiceImpl(DatabaseRepository databaseRepository, SqlUtils sqlUtils) { + private DomainService domainService; + + private ModelService modelService; + + public DatabaseServiceImpl(DatabaseRepository databaseRepository, + SqlUtils sqlUtils, + DomainService domainService, + ModelService modelService) { this.databaseRepository = databaseRepository; this.sqlUtils = sqlUtils; + this.modelService = modelService; + this.domainService = domainService; } @Override @@ -61,16 +74,36 @@ public class DatabaseServiceImpl implements DatabaseService { return DatabaseConverter.convert(databaseDO); } - @Override // one domain only has one database + @Override public DatabaseResp getDatabaseByDomainId(Long domainId) { Optional databaseDO = getDatabaseDO(domainId); return databaseDO.map(DatabaseConverter::convert).orElse(null); } @Override - public QueryResultWithSchemaResp executeSql(String sql, Long domainId) { - DatabaseResp databaseResp = getDatabaseByDomainId(domainId); + public DatabaseResp getDatabaseByModelId(Long modelId) { + ModelResp modelResp = modelService.getModel(modelId); + Map domainRespMap = domainService.getDomainMap(); + Long domainId = modelResp.getDomainId(); + Optional databaseDO = getDatabaseDO(domainId); + while (!databaseDO.isPresent()) { + DomainResp domainResp = domainRespMap.get(domainId); + if (domainResp == null) { + return null; + } + domainId = domainResp.getParentId(); + databaseDO = getDatabaseDO(domainId); + } + return databaseDO.map(DatabaseConverter::convert).orElse(null); + } + + @Override + public QueryResultWithSchemaResp executeSql(String sql, Long modelId) { + DatabaseResp databaseResp = getDatabaseByModelId(modelId); + if (databaseResp == null) { + return new QueryResultWithSchemaResp(); + } return executeSql(sql, databaseResp); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DatasourceServiceImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DatasourceServiceImpl.java index 03ae3fc12..7cb800a5b 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DatasourceServiceImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DatasourceServiceImpl.java @@ -8,9 +8,6 @@ import com.tencent.supersonic.semantic.api.model.pojo.DatasourceDetail; import com.tencent.supersonic.semantic.api.model.pojo.Dim; import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter; import com.tencent.supersonic.semantic.api.model.pojo.Measure; -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.api.model.request.DatasourceRelaReq; import com.tencent.supersonic.semantic.api.model.request.DatasourceReq; import com.tencent.supersonic.semantic.api.model.request.DateInfoReq; @@ -23,6 +20,9 @@ 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.response.MeasureResp; import com.tencent.supersonic.semantic.api.model.response.MetricResp; +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.DatabaseService; import com.tencent.supersonic.semantic.model.domain.DatasourceService; import com.tencent.supersonic.semantic.model.domain.DimensionService; @@ -88,7 +88,7 @@ public class DatasourceServiceImpl implements DatasourceService { Datasource datasource = DatasourceConverter.convert(datasourceReq); log.info("[create datasource] object:{}", JSONObject.toJSONString(datasource)); saveDatasource(datasource, user); - Optional datasourceDescOptional = getDatasource(datasourceReq.getDomainId(), + Optional datasourceDescOptional = getDatasource(datasourceReq.getModelId(), datasourceReq.getBizName()); if (!datasourceDescOptional.isPresent()) { throw new RuntimeException("create datasource failed"); @@ -122,24 +122,8 @@ public class DatasourceServiceImpl implements DatasourceService { } @Override - public String getSourceBizNameById(Long id) { - DatasourceDO datasourceDO = getDatasourceById(id); - if (datasourceDO == null) { - String message = String.format("datasource with id:%s not exsit", id); - throw new RuntimeException(message); - } - return datasourceDO.getBizName(); - } - - - private DatasourceDO getDatasourceById(Long id) { - return datasourceRepository.getDatasourceById(id); - } - - - @Override - public List getMeasureListOfDomain(Long domainId) { - List datasourceDescs = getDatasourceList(domainId); + public List getMeasureListOfModel(Long modelId) { + List datasourceDescs = getDatasourceList(modelId); List measureDescs = Lists.newArrayList(); if (!CollectionUtils.isEmpty(datasourceDescs)) { for (DatasourceResp datasourceDesc : datasourceDescs) { @@ -167,8 +151,8 @@ public class DatasourceServiceImpl implements DatasourceService { } - private Optional getDatasource(Long domainId, String bizName) { - List datasourceDescs = getDatasourceList(domainId); + private Optional getDatasource(Long modelId, String bizName) { + List datasourceDescs = getDatasourceList(modelId); if (CollectionUtils.isEmpty(datasourceDescs)) { return Optional.empty(); } @@ -197,8 +181,8 @@ public class DatasourceServiceImpl implements DatasourceService { } @Override - public List getDatasourceList(Long domainId) { - return DatasourceConverter.convertList(datasourceRepository.getDatasourceList(domainId)); + public List getDatasourceList(Long modelId) { + return DatasourceConverter.convertList(datasourceRepository.getDatasourceList(modelId)); } @Override @@ -207,8 +191,8 @@ public class DatasourceServiceImpl implements DatasourceService { } @Override - public List getDatasourceListNoMeasurePrefix(Long domainId) { - List datasourceResps = getDatasourceList(domainId); + public List getDatasourceListNoMeasurePrefix(Long modelId) { + List datasourceResps = getDatasourceList(modelId); for (DatasourceResp datasourceResp : datasourceResps) { if (!CollectionUtils.isEmpty(datasourceResp.getDatasourceDetail().getMeasures())) { for (Measure measure : datasourceResp.getDatasourceDetail().getMeasures()) { @@ -237,17 +221,17 @@ public class DatasourceServiceImpl implements DatasourceService { @Override - public void deleteDatasource(Long id) throws Exception { + public void deleteDatasource(Long id) { DatasourceDO datasourceDO = datasourceRepository.getDatasourceById(id); if (datasourceDO == null) { return; } - checkDelete(datasourceDO.getDomainId(), id); + checkDelete(datasourceDO.getModelId(), id); datasourceRepository.deleteDatasource(id); } - private void checkDelete(Long domainId, Long datasourceId) { - List metricResps = metricService.getMetrics(domainId, datasourceId); + private void checkDelete(Long modelId, Long datasourceId) { + List metricResps = metricService.getMetrics(modelId, datasourceId); List dimensionResps = dimensionService.getDimensionsByDatasource(datasourceId); if (!CollectionUtils.isEmpty(metricResps) || !CollectionUtils.isEmpty(dimensionResps)) { throw new RuntimeException("exist dimension or metric on this datasource, please check"); @@ -261,8 +245,6 @@ public class DatasourceServiceImpl implements DatasourceService { return datasourceRelaResps; } return datasourceRelaDOS.stream().map(DatasourceConverter::convert).collect(Collectors.toList()); - - } @@ -289,8 +271,8 @@ public class DatasourceServiceImpl implements DatasourceService { } @Override - public List getDatasourceRelaList(Long domainId) { - return convertDatasourceRelaList(datasourceRepository.getDatasourceRelaList(domainId)); + public List getDatasourceRelaList(Long modelId) { + return convertDatasourceRelaList(datasourceRepository.getDatasourceRelaList(modelId)); } @@ -358,14 +340,14 @@ public class DatasourceServiceImpl implements DatasourceService { } @Override - public void getModelYamlTplByDomainIds(Set domainIds, Map> dimensionYamlMap, + public void getModelYamlTplByModelIds(Set modelIds, Map> dimensionYamlMap, List datasourceYamlTplList, List metricYamlTplList) { - for (Long domainId : domainIds) { - List datasourceResps = getDatasourceList(domainId); - List metricResps = metricService.getMetrics(domainId); + for (Long modelId : modelIds) { + List datasourceResps = getDatasourceList(modelId); + List metricResps = metricService.getMetrics(modelId); metricYamlTplList.addAll(MetricYamlManager.convert2YamlObj(MetricConverter.metricInfo2Metric(metricResps))); - DatabaseResp databaseResp = databaseService.getDatabaseByDomainId(domainId); - List dimensionResps = dimensionService.getDimensions(domainId); + DatabaseResp databaseResp = databaseService.getDatabaseByModelId(modelId); + List dimensionResps = dimensionService.getDimensions(modelId); for (DatasourceResp datasourceResp : datasourceResps) { datasourceYamlTplList.add(DatasourceYamlManager.convert2YamlObj( DatasourceConverter.datasourceInfo2Datasource(datasourceResp), databaseResp)); 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 73c22a320..b4792864f 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 @@ -5,19 +5,19 @@ 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.enums.SensitiveLevelEnum; import com.tencent.supersonic.semantic.api.model.request.DimensionReq; import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq; import com.tencent.supersonic.semantic.api.model.response.DatasourceResp; import com.tencent.supersonic.semantic.api.model.response.DimensionResp; -import com.tencent.supersonic.common.pojo.enums.SensitiveLevelEnum; -import com.tencent.supersonic.semantic.model.domain.dataobject.DimensionDO; -import com.tencent.supersonic.semantic.model.domain.repository.DimensionRepository; -import com.tencent.supersonic.semantic.model.domain.utils.DimensionConverter; 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.dataobject.DimensionDO; import com.tencent.supersonic.semantic.model.domain.pojo.Dimension; import com.tencent.supersonic.semantic.model.domain.pojo.DimensionFilter; +import com.tencent.supersonic.semantic.model.domain.repository.DimensionRepository; +import com.tencent.supersonic.semantic.model.domain.utils.DimensionConverter; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -63,8 +63,8 @@ public class DimensionServiceImpl implements DimensionService { if (CollectionUtils.isEmpty(dimensionReqs)) { return; } - Long domainId = dimensionReqs.get(0).getDomainId(); - List dimensionResps = getDimensions(domainId); + Long modelId = dimensionReqs.get(0).getModelId(); + List dimensionResps = getDimensions(modelId); Map dimensionRespMap = dimensionResps.stream() .collect(Collectors.toMap(DimensionResp::getBizName, a -> a, (k1, k2) -> k1)); List dimensions = dimensionReqs.stream().map(DimensionConverter::convert) @@ -92,8 +92,8 @@ public class DimensionServiceImpl implements DimensionService { @Override - public DimensionResp getDimension(String bizName, Long domainId) { - List dimensionResps = getDimensions(domainId); + public DimensionResp getDimension(String bizName, Long modelId) { + List dimensionResps = getDimensions(modelId); if (CollectionUtils.isEmpty(dimensionResps)) { return null; } @@ -109,7 +109,7 @@ public class DimensionServiceImpl implements DimensionService { public PageInfo queryDimension(PageDimensionReq pageDimensionReq) { DimensionFilter dimensionFilter = new DimensionFilter(); BeanUtils.copyProperties(pageDimensionReq, dimensionFilter); - dimensionFilter.setDomainIds(pageDimensionReq.getDomainIds()); + dimensionFilter.setModelIds(pageDimensionReq.getModelIds()); PageInfo dimensionDOPageInfo = PageHelper.startPage(pageDimensionReq.getCurrent(), pageDimensionReq.getPageSize()) .doSelectPageInfo(() -> queryDimension(dimensionFilter)); @@ -139,8 +139,8 @@ public class DimensionServiceImpl implements DimensionService { } @Override - public List getDimensions(Long domainId) { - return convertList(getDimensionDOS(domainId), datasourceService.getDatasourceMap()); + public List getDimensions(Long modelId) { + return convertList(getDimensionDOS(modelId), datasourceService.getDatasourceMap()); } @Override @@ -176,8 +176,8 @@ public class DimensionServiceImpl implements DimensionService { @Override - public List getHighSensitiveDimension(Long domainId) { - List dimensionResps = getDimensions(domainId); + public List getHighSensitiveDimension(Long modelId) { + List dimensionResps = getDimensions(modelId); if (CollectionUtils.isEmpty(dimensionResps)) { return dimensionResps; } @@ -187,8 +187,8 @@ public class DimensionServiceImpl implements DimensionService { } - protected List getDimensionDOS(Long domainId) { - return dimensionRepository.getDimensionListOfDomain(domainId); + protected List getDimensionDOS(Long modelId) { + return dimensionRepository.getDimensionListOfDomain(modelId); } protected List getDimensionDOS() { @@ -240,8 +240,8 @@ public class DimensionServiceImpl implements DimensionService { private void checkExist(List dimensionReqs) { - Long domainId = dimensionReqs.get(0).getDomainId(); - List dimensionResps = getDimensions(domainId); + Long modelId = dimensionReqs.get(0).getModelId(); + List dimensionResps = getDimensions(modelId); for (DimensionReq dimensionReq : dimensionReqs) { for (DimensionResp dimensionResp : dimensionResps) { if (dimensionResp.getName().equalsIgnoreCase(dimensionReq.getBizName())) { 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 41353d46a..389328aaa 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 @@ -2,35 +2,33 @@ package com.tencent.supersonic.semantic.model.application; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; -import com.google.common.collect.Sets; 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.semantic.api.model.request.DomainReq; -import com.tencent.supersonic.semantic.api.model.request.DomainSchemaFilterReq; import com.tencent.supersonic.semantic.api.model.request.DomainUpdateReq; -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.DomainSchemaResp; -import com.tencent.supersonic.semantic.api.model.response.MetricResp; -import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; -import com.tencent.supersonic.semantic.model.domain.DatasourceService; -import com.tencent.supersonic.semantic.model.domain.DimensionService; +import com.tencent.supersonic.semantic.api.model.response.ModelResp; 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.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.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Queue; +import java.util.Set; import java.util.stream.Collectors; - import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; +import org.assertj.core.util.Sets; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -41,33 +39,26 @@ import org.springframework.util.CollectionUtils; public class DomainServiceImpl implements DomainService { private final DomainRepository domainRepository; - private final MetricService metricService; - private final DimensionService dimensionService; - private final DatasourceService datasourceService; + private final ModelService modelService; private final UserService userService; - public DomainServiceImpl(DomainRepository domainRepository, @Lazy MetricService metricService, - @Lazy DimensionService dimensionService, @Lazy DatasourceService datasourceService, - UserService userService) { + public DomainServiceImpl(DomainRepository domainRepository, + @Lazy ModelService modelService, + UserService userService) { this.domainRepository = domainRepository; - this.metricService = metricService; - this.dimensionService = dimensionService; - this.datasourceService = datasourceService; + this.modelService = modelService; this.userService = userService; } - @Override public void createDomain(DomainReq domainReq, User user) { log.info("[create domain] cmd : {}", JSONObject.toJSONString(domainReq)); Domain domain = DomainConvert.convert(domainReq); log.info("[create domain] object:{}", JSONObject.toJSONString(domainReq)); - saveDomain(domain, user); } - @Override public void updateDomain(DomainUpdateReq domainUpdateReq, User user) { DomainDO domainDO = getDomainDO(domainUpdateReq.getId()); @@ -78,48 +69,19 @@ public class DomainServiceImpl implements DomainService { domainDO.setAdminOrg(String.join(",", domainUpdateReq.getAdminOrgs())); domainDO.setViewer(String.join(",", domainUpdateReq.getViewers())); domainDO.setViewOrg(String.join(",", domainUpdateReq.getViewOrgs())); - domainDO.setEntity(JsonUtil.toString(domainUpdateReq.getEntity())); domainRepository.updateDomain(domainDO); } - @Override - public void deleteDomain(Long id) { - checkDelete(id); domainRepository.deleteDomain(id); } - private void checkDelete(Long id) { - List metricResps = metricService.getMetrics(id); - List dimensionResps = dimensionService.getDimensions(id); - List datasourceResps = datasourceService.getDatasourceList(id); - if (!CollectionUtils.isEmpty(metricResps) || !CollectionUtils.isEmpty(datasourceResps) - || !CollectionUtils.isEmpty(dimensionResps)) { - throw new RuntimeException("exist datasource, dimension or metric in this domain, please check"); - } - } - - @Override - public String getDomainBizName(Long id) { - if (id == null) { - return ""; - } - DomainDO domainDO = getDomainDO(id); - if (domainDO == null) { - String message = String.format("domain with id:%s not exist", id); - throw new RuntimeException(message); - } - return domainDO.getBizName(); - } - - @Override public List getDomainList() { - return convertList(domainRepository.getDomainList(), new HashMap<>(), new HashMap<>()); + return convertList(domainRepository.getDomainList()); } - @Override public List getDomainList(List domainIds) { return getDomainList().stream() @@ -128,27 +90,55 @@ public class DomainServiceImpl implements DomainService { } @Override - public List getDomainListForAdmin(String userName) { - List domainDOS = domainRepository.getDomainList(); - Set orgIds = Sets.newHashSet(); - log.info("orgIds:{},userName:{}", orgIds, userName); - Map> metricDomainMap = metricService.getMetrics().stream() - .collect(Collectors.groupingBy(MetricResp::getDomainId)); - Map> dimensionDomainMap = dimensionService.getDimensions().stream() - .collect(Collectors.groupingBy(DimensionResp::getDomainId)); - return convertList(domainDOS, metricDomainMap, dimensionDomainMap).stream() - .filter(domainDesc -> checkAdminPermission(orgIds, userName, domainDesc)) - .collect(Collectors.toList()); + public List getDomainListWithAdminAuth(User user) { + Set domainWithAuthAll = getDomainAuthSet(user.getName(), AuthType.VISIBLE); + if (!CollectionUtils.isEmpty(domainWithAuthAll)) { + List domainIds = domainWithAuthAll.stream().map(DomainResp::getId).collect(Collectors.toList()); + domainWithAuthAll.addAll(getParentDomain(domainIds)); + } + List modelResps = modelService.getModelAuthList(user.getName(), AuthType.VISIBLE); + if (!CollectionUtils.isEmpty(modelResps)) { + List domainIds = modelResps.stream().map(ModelResp::getDomainId).collect(Collectors.toList()); + domainWithAuthAll.addAll(getParentDomain(domainIds)); + } + return new ArrayList<>(domainWithAuthAll); } @Override - public List getDomainListForViewer(String userName) { - List domainDOS = domainRepository.getDomainList(); - Set orgIds = Sets.newHashSet(); - log.info("orgIds:{},userName:{}", orgIds, userName); - return convertList(domainDOS, new HashMap<>(), new HashMap<>()).stream() - .filter(domainDesc -> checkViewerPermission(orgIds, userName, domainDesc)) + public Set getDomainAuthSet(String userName, AuthType authTypeEnum) { + List domainResps = getDomainList(); + Set orgIds = userService.getUserAllOrgId(userName); + List domainWithAuth = Lists.newArrayList(); + if (authTypeEnum.equals(AuthType.ADMIN)) { + domainWithAuth = domainResps.stream() + .filter(domainResp -> checkAdminPermission(orgIds, userName, domainResp)) + .collect(Collectors.toList()); + } + if (authTypeEnum.equals(AuthType.VISIBLE)) { + domainWithAuth = domainResps.stream() + .filter(domainResp -> checkViewerPermission(orgIds, userName, domainResp)) + .collect(Collectors.toList()); + } + List domainIds = domainWithAuth.stream().map(DomainResp::getId) .collect(Collectors.toList()); + //get all child domain + return getDomainChildren(domainIds); + } + + private Set getParentDomain(List ids) { + Set domainSet = new HashSet<>(); + if (CollectionUtils.isEmpty(ids)) { + return Sets.newHashSet(domainSet); + } + Map domainRespMap = getDomainMap(); + for (Long domainId : ids) { + DomainResp domainResp = domainRespMap.get(domainId); + while (domainResp != null) { + domainSet.add(domainResp); + domainResp = domainRespMap.get(domainResp.getParentId()); + } + } + return domainSet; } @@ -158,16 +148,6 @@ public class DomainServiceImpl implements DomainService { return DomainConvert.convert(getDomainDO(id), fullDomainPathMap); } - - @Override - public String getDomainFullPath(Long domainId) { - if (domainId == null) { - return ""; - } - Map map = getDomainFullPathMap(); - return map.getOrDefault(domainId, ""); - } - @Override public Map getDomainFullPath() { return getDomainFullPathMap(); @@ -180,22 +160,17 @@ public class DomainServiceImpl implements DomainService { domain.setId(domainDO.getId()); } - - private List convertList(List domainDOS, Map> metricDomainMap, - Map> dimensionDomainMap) { + private List convertList(List domainDOS) { List domainDescs = Lists.newArrayList(); if (CollectionUtils.isEmpty(domainDOS)) { return domainDescs; } Map fullDomainPathMap = getDomainFullPath(); - return domainDOS.stream() - .map(domainDO -> DomainConvert.convert(domainDO, fullDomainPathMap, dimensionDomainMap, - metricDomainMap)) + .map(domainDO -> DomainConvert.convert(domainDO, fullDomainPathMap)) .collect(Collectors.toList()); } - @Override public Map getDomainMap() { return getDomainList().stream().collect(Collectors.toMap(DomainResp::getId, a -> a, (k1, k2) -> k1)); @@ -251,72 +226,17 @@ public class DomainServiceImpl implements DomainService { return domainFullPathMap; } - public List fetchDomainSchema(DomainSchemaFilterReq filter, User user) { - List domainSchemaDescList = new ArrayList<>(); - List domainIdsReq = generateDomainIdsReq(filter); - List getDomainListByIds = getDomainList(domainIdsReq); - getDomainListByIds.stream().forEach(domainDesc -> { - domainSchemaDescList.add(fetchSingleDomainSchema(domainDesc)); - }); - return domainSchemaDescList; - } - protected DomainDO getDomainDO(Long id) { return domainRepository.getDomainById(id); } - private DomainSchemaResp fetchSingleDomainSchema(DomainResp domainDesc) { - Long domainId = domainDesc.getId(); - DomainSchemaResp domainSchemaDesc = new DomainSchemaResp(); - BeanUtils.copyProperties(domainDesc, domainSchemaDesc); + private boolean checkAdminPermission(Set orgIds, String userName, DomainResp domainResp) { - domainSchemaDesc.setDimensions(generateDimSchema(domainId)); - domainSchemaDesc.setMetrics(generateMetricSchema(domainId)); - return domainSchemaDesc; - } - - private List generateMetricSchema(Long domainId) { - List metricSchemaDescList = new ArrayList<>(); - List metricDescList = metricService.getMetrics(domainId); - metricDescList.stream().forEach(metricDesc -> { - MetricSchemaResp metricSchemaDesc = new MetricSchemaResp(); - BeanUtils.copyProperties(metricDesc, metricSchemaDesc); - metricSchemaDesc.setUseCnt(0L); - metricSchemaDescList.add(metricSchemaDesc); - } - ); - return metricSchemaDescList; - - } - - private List generateDimSchema(Long domainId) { - List dimSchemaDescList = new ArrayList<>(); - List dimDescList = dimensionService.getDimensions(domainId); - dimDescList.stream().forEach(dimDesc -> { - DimSchemaResp dimSchemaDesc = new DimSchemaResp(); - BeanUtils.copyProperties(dimDesc, dimSchemaDesc); - dimSchemaDesc.setUseCnt(0L); - dimSchemaDescList.add(dimSchemaDesc); - } - ); - return dimSchemaDescList; - } - - private List generateDomainIdsReq(DomainSchemaFilterReq filter) { - if (Objects.nonNull(filter) && !CollectionUtils.isEmpty(filter.getDomainIds())) { - return filter.getDomainIds(); - } - return new ArrayList<>(getDomainMap().keySet()); - } - - - private boolean checkAdminPermission(Set orgIds, String userName, DomainResp domainDesc) { - - List admins = domainDesc.getAdmins(); - List adminOrgs = domainDesc.getAdminOrgs(); - if (admins.contains(userName) || domainDesc.getCreatedBy().equals(userName)) { + List admins = domainResp.getAdmins(); + List adminOrgs = domainResp.getAdminOrgs(); + if (admins.contains(userName) || domainResp.getCreatedBy().equals(userName)) { return true; } if (CollectionUtils.isEmpty(adminOrgs)) { @@ -331,9 +251,6 @@ public class DomainServiceImpl implements DomainService { } private boolean checkViewerPermission(Set orgIds, String userName, DomainResp domainDesc) { - if (domainDesc.getIsOpen() == 1) { - return true; - } List admins = domainDesc.getAdmins(); List viewers = domainDesc.getViewers(); List adminOrgs = domainDesc.getAdminOrgs(); 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 56f1289fd..5075c3f16 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,21 +5,22 @@ 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.enums.SensitiveLevelEnum; 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.request.PageMetricReq; import com.tencent.supersonic.semantic.api.model.response.DomainResp; import com.tencent.supersonic.semantic.api.model.response.MetricResp; -import com.tencent.supersonic.common.pojo.enums.SensitiveLevelEnum; +import com.tencent.supersonic.semantic.api.model.response.ModelResp; +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.dataobject.MetricDO; +import com.tencent.supersonic.semantic.model.domain.pojo.Metric; import com.tencent.supersonic.semantic.model.domain.pojo.MetricFilter; import com.tencent.supersonic.semantic.model.domain.repository.MetricRepository; import com.tencent.supersonic.semantic.model.domain.utils.MetricConverter; -import com.tencent.supersonic.semantic.model.domain.DomainService; -import com.tencent.supersonic.semantic.model.domain.MetricService; -import com.tencent.supersonic.semantic.model.domain.pojo.Metric; - import java.util.List; import java.util.Map; import java.util.Objects; @@ -35,16 +36,18 @@ import org.springframework.util.CollectionUtils; @Slf4j public class MetricServiceImpl implements MetricService { - private MetricRepository metricRepository; + private ModelService modelService; + private DomainService domainService; - public MetricServiceImpl(MetricRepository metricRepository, + ModelService modelService, DomainService domainService) { this.domainService = domainService; this.metricRepository = metricRepository; + this.modelService = modelService; } @Override @@ -62,8 +65,8 @@ public class MetricServiceImpl implements MetricService { return; } List metrics = metricReqs.stream().map(MetricConverter::convert).collect(Collectors.toList()); - Long domainId = metricReqs.get(0).getDomainId(); - List metricDescs = getMetricByDomainId(domainId); + Long modelId = metricReqs.get(0).getModelId(); + List metricDescs = getMetricByModelId(modelId); Map metricDescMap = metricDescs.stream() .collect(Collectors.toMap(MetricResp::getBizName, a -> a, (k1, k2) -> k1)); List metricToInsert = metrics.stream() @@ -72,10 +75,9 @@ public class MetricServiceImpl implements MetricService { saveMetricBatch(metricToInsert, user); } - @Override - public List getMetrics(Long domainId) { - return convertList(metricRepository.getMetricList(domainId)); + public List getMetrics(Long modelId) { + return convertList(metricRepository.getMetricList(modelId)); } @Override @@ -84,8 +86,8 @@ public class MetricServiceImpl implements MetricService { } @Override - public List getMetrics(Long domainId, Long datasourceId) { - List metricResps = convertList(metricRepository.getMetricList(domainId)); + public List getMetrics(Long modelId, Long datasourceId) { + List metricResps = convertList(metricRepository.getMetricList(modelId)); return metricResps.stream().filter(metricResp -> { Set datasourceIdSet = metricResp.getTypeParams().getMeasures().stream() .map(Measure::getDatasourceId) @@ -104,7 +106,10 @@ public class MetricServiceImpl implements MetricService { BeanUtils.copyProperties(pageMetricReq, metricFilter); Set domainResps = domainService.getDomainChildren(pageMetricReq.getDomainIds()); List domainIds = domainResps.stream().map(DomainResp::getId).collect(Collectors.toList()); - metricFilter.setDomainIds(domainIds); + List modelResps = modelService.getModelByDomainIds(domainIds); + List modelIds = modelResps.stream().map(ModelResp::getId).collect(Collectors.toList()); + pageMetricReq.getModelIds().addAll(modelIds); + metricFilter.setModelIds(pageMetricReq.getModelIds()); PageInfo metricDOPageInfo = PageHelper.startPage(pageMetricReq.getCurrent(), pageMetricReq.getPageSize()) .doSelectPageInfo(() -> queryMetric(metricFilter)); @@ -118,10 +123,9 @@ public class MetricServiceImpl implements MetricService { return metricRepository.getMetric(metricFilter); } - @Override - public MetricResp getMetric(Long domainId, String bizName) { - List metricDescs = getMetricByDomainId(domainId); + public MetricResp getMetric(Long modelId, String bizName) { + List metricDescs = getMetricByModelId(modelId); MetricResp metricDesc = null; if (CollectionUtils.isEmpty(metricDescs)) { return metricDesc; @@ -143,7 +147,6 @@ public class MetricServiceImpl implements MetricService { updateMetric(metric); } - public void saveMetric(Metric metric) { MetricDO metricDO = MetricConverter.convert2MetricDO(metric); log.info("[save metric] metricDO:{}", JSONObject.toJSONString(metricDO)); @@ -156,21 +159,19 @@ public class MetricServiceImpl implements MetricService { metricRepository.updateMetric(MetricConverter.convert(metricDO, metric)); } - - public List getMetricByDomainId(Long domainId) { - return convertList(getMetricDOByDomainId(domainId)); + public List getMetricByModelId(Long modelId) { + return convertList(getMetricDOByModelId(modelId)); } - protected List getMetricDOByDomainId(Long domainId) { + protected List getMetricDOByModelId(Long modelId) { List metricDOS = metricRepository.getAllMetricList(); - return metricDOS.stream().filter(metricDO -> Objects.equals(metricDO.getDomainId(), domainId)) + return metricDOS.stream().filter(metricDO -> Objects.equals(metricDO.getModelId(), modelId)) .collect(Collectors.toList()); } - @Override - public List getHighSensitiveMetric(Long domainId) { - List metricDescs = getMetricByDomainId(domainId); + public List getHighSensitiveMetric(Long modelId) { + List metricDescs = getMetricByModelId(modelId); if (CollectionUtils.isEmpty(metricDescs)) { return metricDescs; } @@ -223,8 +224,8 @@ public class MetricServiceImpl implements MetricService { } private void checkExist(List exprMetricReqList) { - Long domainId = exprMetricReqList.get(0).getDomainId(); - List metricDescs = getMetrics(domainId); + Long modelId = exprMetricReqList.get(0).getModelId(); + List metricDescs = getMetrics(modelId); for (MetricReq exprMetricReq : exprMetricReqList) { for (MetricResp metricDesc : metricDescs) { if (metricDesc.getName().equalsIgnoreCase(exprMetricReq.getName())) { @@ -238,13 +239,12 @@ public class MetricServiceImpl implements MetricService { } } - private List convertList(List metricDOS) { List metricDescs = Lists.newArrayList(); - Map domainMap = domainService.getDomainMap(); + Map modelMap = modelService.getModelMap(); if (!CollectionUtils.isEmpty(metricDOS)) { metricDescs = metricDOS.stream() - .map(metricDO -> MetricConverter.convert2MetricDesc(metricDO, domainMap)) + .map(metricDO -> MetricConverter.convert2MetricDesc(metricDO, modelMap)) .collect(Collectors.toList()); } return metricDescs; 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 new file mode 100644 index 000000000..b62dedcf2 --- /dev/null +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java @@ -0,0 +1,334 @@ +package com.tencent.supersonic.semantic.model.application; + +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.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.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.model.domain.ModelService; +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; + +@Slf4j +@Service +public class ModelServiceImpl implements ModelService { + + private final ModelRepository modelRepository; + private final MetricService metricService; + private final DimensionService dimensionService; + private final DatasourceService datasourceService; + private final DomainService domainService; + private final UserService userService; + + public ModelServiceImpl(ModelRepository modelRepository, @Lazy MetricService metricService, + @Lazy DimensionService dimensionService, @Lazy DatasourceService datasourceService, + @Lazy DomainService domainService, UserService userService) { + this.modelRepository = modelRepository; + this.metricService = metricService; + this.dimensionService = dimensionService; + this.datasourceService = datasourceService; + this.domainService = domainService; + this.userService = userService; + } + + @Override + public void createModel(ModelReq modelReq, User user) { + log.info("[create model] cmd : {}", JSONObject.toJSONString(modelReq)); + Model model = ModelConvert.convert(modelReq); + log.info("[create model] object:{}", JSONObject.toJSONString(modelReq)); + saveModel(model, user); + } + + @Override + public void updateModel(ModelReq modelReq, User user) { + ModelDO modelDO = getModelDO(modelReq.getId()); + modelDO.setUpdatedAt(new Date()); + modelDO.setUpdatedBy(user.getName()); + BeanMapper.mapper(modelReq, modelDO); + modelDO.setAdmin(String.join(",", modelReq.getAdmins())); + modelDO.setAdminOrg(String.join(",", modelReq.getAdminOrgs())); + modelDO.setViewer(String.join(",", modelReq.getViewers())); + modelDO.setViewOrg(String.join(",", modelReq.getViewOrgs())); + modelDO.setEntity(JsonUtil.toString(modelReq.getEntity())); + modelRepository.updateModel(modelDO); + } + + @Override + public void deleteModel(Long id) { + checkDelete(id); + modelRepository.deleteModel(id); + } + + @Override + public List getModelListWithAuth(String userName, Long domainId, AuthType authType) { + List modelResps = getModelAuthList(userName, authType); + Set modelRespSet = new HashSet<>(modelResps); + List modelRespsAuthInheritDomain = getModelRespAuthInheritDomain(userName, authType); + modelRespSet.addAll(modelRespsAuthInheritDomain); + if (domainId != null && domainId > 0) { + modelRespSet = modelRespSet.stream().filter(modelResp -> + modelResp.getDomainId().equals(domainId)).collect(Collectors.toSet()); + } + return fillMetricInfo(new ArrayList<>(modelRespSet)); + } + + public List getModelRespAuthInheritDomain(String userName, AuthType authType) { + Set domainResps = domainService.getDomainAuthSet(userName, authType); + if (CollectionUtils.isEmpty(domainResps)) { + return Lists.newArrayList(); + } + List allModelList = getModelList(); + Set domainIds = domainResps.stream().map(DomainResp::getId).collect(Collectors.toSet()); + return allModelList.stream().filter(modelResp -> + domainIds.contains(modelResp.getDomainId())).collect(Collectors.toList()); + } + + @Override + public List getModelAuthList(String userName, AuthType authTypeEnum) { + List modelResps = getModelList(); + Set orgIds = userService.getUserAllOrgId(userName); + List modelWithAuth = Lists.newArrayList(); + if (authTypeEnum.equals(AuthType.ADMIN)) { + modelWithAuth = modelResps.stream() + .filter(modelResp -> checkAdminPermission(orgIds, userName, modelResp)) + .collect(Collectors.toList()); + } + if (authTypeEnum.equals(AuthType.VISIBLE)) { + modelWithAuth = modelResps.stream() + .filter(domainResp -> checkViewerPermission(orgIds, userName, domainResp)) + .collect(Collectors.toList()); + } + return modelWithAuth; + } + + @Override + public List getModelByDomainIds(List domainIds) { + if (CollectionUtils.isEmpty(domainIds)) { + return Lists.newArrayList(); + } + List modelResps = getModelList(); + if (CollectionUtils.isEmpty(modelResps)) { + return modelResps; + } + return modelResps.stream().filter(modelResp -> + domainIds.contains(modelResp.getDomainId())).collect(Collectors.toList()); + } + + + @Override + public List getModelList(List modelIds) { + return getModelList().stream() + .filter(modelDO -> modelIds.contains(modelDO.getId())) + .collect(Collectors.toList()); + } + + @Override + public List getModelList() { + return convertList(modelRepository.getModelList()); + } + + @Override + public ModelResp getModel(Long id) { + Map domainRespMap = domainService.getDomainList().stream() + .collect(Collectors.toMap(DomainResp::getId, d -> d)); + return ModelConvert.convert(getModelDO(id), domainRespMap); + } + + private void checkDelete(Long id) { + List metricResps = metricService.getMetrics(id); + List dimensionResps = dimensionService.getDimensions(id); + List datasourceResps = datasourceService.getDatasourceList(id); + if (!CollectionUtils.isEmpty(metricResps) || !CollectionUtils.isEmpty(datasourceResps) + || !CollectionUtils.isEmpty(dimensionResps)) { + throw new RuntimeException("exist datasource, dimension or metric in this model, please check"); + } + } + + private void saveModel(Model model, User user) { + ModelDO modelDO = ModelConvert.convert(model, user); + modelRepository.createModel(modelDO); + model.setId(modelDO.getId()); + } + + private List convertList(List modelDOS) { + List modelResps = Lists.newArrayList(); + if (CollectionUtils.isEmpty(modelDOS)) { + return modelResps; + } + Map domainRespMap = domainService.getDomainList().stream() + .collect(Collectors.toMap(DomainResp::getId, d -> d)); + return modelDOS.stream() + .map(modelDO -> ModelConvert.convert(modelDO, domainRespMap)) + .collect(Collectors.toList()); + } + + private List fillMetricInfo(List modelResps) { + if (CollectionUtils.isEmpty(modelResps)) { + return modelResps; + } + Map> metricMap = metricService.getMetrics().stream() + .collect(Collectors.groupingBy(MetricResp::getModelId)); + Map> dimensionMap = dimensionService.getDimensions().stream() + .collect(Collectors.groupingBy(DimensionResp::getModelId)); + modelResps.forEach(modelResp -> { + modelResp.setDimensionCnt(dimensionMap.getOrDefault(modelResp.getId(), Lists.newArrayList()).size()); + modelResp.setMetricCnt(metricMap.getOrDefault(modelResp.getId(), Lists.newArrayList()).size()); + }); + return modelResps; + } + + + @Override + public Map getModelMap() { + return getModelList().stream().collect(Collectors.toMap(ModelResp::getId, a -> a, (k1, k2) -> k1)); + } + + @Override + public Map getModelFullPathMap() { + return getModelList().stream() + .collect(Collectors.toMap(ModelResp::getId, ModelResp::getFullPath, (k1, k2) -> k1)); + } + + protected ModelDO getModelDO(Long id) { + return modelRepository.getModelById(id); + } + + private ModelSchemaResp fetchSingleModelSchema(ModelResp modelResp) { + Long modelId = modelResp.getId(); + ModelSchemaResp modelSchemaResp = new ModelSchemaResp(); + BeanUtils.copyProperties(modelResp, modelSchemaResp); + modelSchemaResp.setDimensions(generateDimSchema(modelId)); + modelSchemaResp.setMetrics(generateMetricSchema(modelId)); + return modelSchemaResp; + } + + @Override + public ModelSchemaResp fetchSingleModelSchema(Long modelId) { + ModelResp model = getModel(modelId); + return fetchSingleModelSchema(model); + } + + @Override + public List fetchModelSchema(ModelSchemaFilterReq modelSchemaFilterReq) { + List modelSchemaRespList = new ArrayList<>(); + List modelIds = modelSchemaFilterReq.getModelIds(); + if (CollectionUtils.isEmpty(modelIds)) { + modelIds = generateModelIdsReq(modelSchemaFilterReq); + } + modelIds.stream().forEach(modelId -> { + ModelSchemaResp modelSchemaResp = fetchSingleModelSchema(modelId); + if (Objects.nonNull(modelSchemaResp)) { + modelSchemaRespList.add(modelSchemaResp); + } + }); + return modelSchemaRespList; + } + + private List generateMetricSchema(Long modelId) { + List metricSchemaDescList = new ArrayList<>(); + List metricDescList = metricService.getMetrics(modelId); + metricDescList.stream().forEach(metricDesc -> { + MetricSchemaResp metricSchemaDesc = new MetricSchemaResp(); + BeanUtils.copyProperties(metricDesc, metricSchemaDesc); + metricSchemaDesc.setUseCnt(0L); + metricSchemaDescList.add(metricSchemaDesc); + } + ); + return metricSchemaDescList; + } + + private List generateDimSchema(Long modelId) { + List dimSchemaDescList = new ArrayList<>(); + List dimDescList = dimensionService.getDimensions(modelId); + dimDescList.stream().forEach(dimDesc -> { + DimSchemaResp dimSchemaDesc = new DimSchemaResp(); + BeanUtils.copyProperties(dimDesc, dimSchemaDesc); + dimSchemaDesc.setUseCnt(0L); + dimSchemaDescList.add(dimSchemaDesc); + } + ); + return dimSchemaDescList; + } + + private List generateModelIdsReq(ModelSchemaFilterReq filter) { + if (Objects.nonNull(filter) && !CollectionUtils.isEmpty(filter.getModelIds())) { + return filter.getModelIds(); + } + return new ArrayList<>(getModelMap().keySet()); + } + + public static boolean checkAdminPermission(Set orgIds, String userName, ModelResp modelResp) { + List admins = modelResp.getAdmins(); + List adminOrgs = modelResp.getAdminOrgs(); + if (admins.contains(userName) || modelResp.getCreatedBy().equals(userName)) { + return true; + } + if (CollectionUtils.isEmpty(adminOrgs)) { + return false; + } + for (String orgId : orgIds) { + if (adminOrgs.contains(orgId)) { + return true; + } + } + return false; + } + + public static boolean checkViewerPermission(Set orgIds, String userName, ModelResp modelResp) { + List admins = modelResp.getAdmins(); + List viewers = modelResp.getViewers(); + List adminOrgs = modelResp.getAdminOrgs(); + List viewOrgs = modelResp.getViewOrgs(); + if (modelResp.openToAll()) { + return true; + } + if (admins.contains(userName) || viewers.contains(userName) || modelResp.getCreatedBy().equals(userName)) { + return true; + } + if (CollectionUtils.isEmpty(adminOrgs) && CollectionUtils.isEmpty(viewOrgs)) { + return false; + } + for (String orgId : orgIds) { + if (adminOrgs.contains(orgId)) { + return true; + } + } + for (String orgId : orgIds) { + if (viewOrgs.contains(orgId)) { + return true; + } + } + return false; + } +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ViewInfoServiceImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ViewInfoServiceImpl.java index a8ae68a86..aa8ae065d 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ViewInfoServiceImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ViewInfoServiceImpl.java @@ -5,14 +5,13 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.semantic.api.model.request.ViewInfoReq; 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.DomainSchemaRelaResp; import com.tencent.supersonic.semantic.api.model.response.MetricResp; -import com.tencent.supersonic.semantic.model.domain.dataobject.ViewInfoDO; -import com.tencent.supersonic.semantic.model.domain.repository.ViewInfoRepository; +import com.tencent.supersonic.semantic.api.model.response.ModelSchemaRelaResp; import com.tencent.supersonic.semantic.model.domain.DatasourceService; import com.tencent.supersonic.semantic.model.domain.DimensionService; import com.tencent.supersonic.semantic.model.domain.MetricService; - +import com.tencent.supersonic.semantic.model.domain.dataobject.ViewInfoDO; +import com.tencent.supersonic.semantic.model.domain.repository.ViewInfoRepository; import java.util.Date; import java.util.List; import org.assertj.core.util.Lists; @@ -38,22 +37,22 @@ public class ViewInfoServiceImpl { this.datasourceService = datasourceService; } - public List getViewInfoList(Long domainId) { - return viewInfoRepository.getViewInfoList(domainId); + public List getViewInfoList(Long modelId) { + return viewInfoRepository.getViewInfoList(modelId); } - public List getDomainSchema(Long domainId) { - List domainSchemaRelaResps = Lists.newArrayList(); - List datasourceResps = datasourceService.getDatasourceList(domainId); + public List getDomainSchema(Long modelId) { + List domainSchemaRelaResps = Lists.newArrayList(); + List datasourceResps = datasourceService.getDatasourceList(modelId); for (DatasourceResp datasourceResp : datasourceResps) { - DomainSchemaRelaResp domainSchemaRelaResp = new DomainSchemaRelaResp(); + ModelSchemaRelaResp domainSchemaRelaResp = new ModelSchemaRelaResp(); Long datasourceId = datasourceResp.getId(); - List metricResps = metricService.getMetrics(domainId, datasourceId); + List metricResps = metricService.getMetrics(modelId, datasourceId); List dimensionResps = dimensionService.getDimensionsByDatasource(datasourceId); domainSchemaRelaResp.setDatasource(datasourceResp); domainSchemaRelaResp.setDimensions(dimensionResps); domainSchemaRelaResp.setMetrics(metricResps); - domainSchemaRelaResp.setDomainId(domainId); + domainSchemaRelaResp.setDomainId(modelId); domainSchemaRelaResps.add(domainSchemaRelaResp); } return domainSchemaRelaResps; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/Catalog.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/Catalog.java index f0a6203eb..fd4b664db 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/Catalog.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/Catalog.java @@ -1,14 +1,14 @@ package com.tencent.supersonic.semantic.model.domain; import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter; -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.api.model.response.DatabaseResp; 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.response.MetricResp; +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 java.util.List; import java.util.Map; import java.util.Set; @@ -16,21 +16,22 @@ import java.util.Set; public interface Catalog { DatabaseResp getDatabase(Long id); - DatabaseResp getDatabaseByDomainId(Long domainId); - List getDatasourceList(Long domainId); + DatabaseResp getDatabaseByModelId(Long modelId); - String getDomainFullPath(Long domainId); + List getDatasourceList(Long modelId); - Map getDomainFullPath(); + String getModelFullPath(Long modelId); - DimensionResp getDimension(String bizName, Long domainId); + Map getModelFullPath(); - List getDimensions(Long domainId); + DimensionResp getDimension(String bizName, Long modelId); - List getMetrics(Long domainId); + List getDimensions(Long modelId); - void getModelYamlTplByDomainIds(Set domainIds, Map> dimensionYamlMap, + List getMetrics(Long modelId); + + void getModelYamlTplByMoldelIds(Set modelIds, Map> dimensionYamlMap, List datasourceYamlTplList, List metricYamlTplList); 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 3b7e50c9b..5dbd2903e 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,6 +11,8 @@ public interface DatabaseService { QueryResultWithSchemaResp executeSql(String sql, DatabaseResp databaseResp); + DatabaseResp getDatabaseByModelId(Long modelId); + QueryResultWithSchemaResp executeSql(String sql, Long domainId); boolean testConnect(DatabaseReq databaseReq, User user); diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DatasourceService.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DatasourceService.java index 5832e92b1..5ef2ac2fb 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DatasourceService.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DatasourceService.java @@ -3,15 +3,15 @@ package com.tencent.supersonic.semantic.model.domain; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter; -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.api.model.request.DatasourceRelaReq; import com.tencent.supersonic.semantic.api.model.request.DatasourceReq; import com.tencent.supersonic.semantic.api.model.response.DatasourceRelaResp; import com.tencent.supersonic.semantic.api.model.response.DatasourceResp; import com.tencent.supersonic.semantic.api.model.response.ItemDateResp; import com.tencent.supersonic.semantic.api.model.response.MeasureResp; +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 java.util.List; import java.util.Map; import java.util.Set; @@ -22,8 +22,6 @@ public interface DatasourceService { DatasourceResp updateDatasource(DatasourceReq datasourceReq, User user) throws Exception; - String getSourceBizNameById(Long id); - List getDatasourceListNoMeasurePrefix(Long domainId); List getDatasourceList(); @@ -42,10 +40,9 @@ public interface DatasourceService { ItemDateResp getItemDate(ItemDateFilter dimension, ItemDateFilter metric); - List getMeasureListOfDomain(Long domainId); + List getMeasureListOfModel(Long modelId); - - void getModelYamlTplByDomainIds(Set domainIds, Map> dimensionYamlMap, + void getModelYamlTplByModelIds(Set modelIds, Map> dimensionYamlMap, List datasourceYamlTplList, List metricYamlTplList); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DomainService.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DomainService.java index 72415ed79..56f31ad70 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DomainService.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DomainService.java @@ -1,22 +1,18 @@ package com.tencent.supersonic.semantic.model.domain; import com.tencent.supersonic.auth.api.authentication.pojo.User; +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.DomainSchemaFilterReq; 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.DomainSchemaResp; import java.util.List; import java.util.Map; import java.util.Set; public interface DomainService { - DomainResp getDomain(Long id); - String getDomainFullPath(Long domainId); - Map getDomainFullPath(); void createDomain(DomainReq domainReq, User user); @@ -25,20 +21,16 @@ public interface DomainService { void deleteDomain(Long id); - String getDomainBizName(Long domainId); - List getDomainList(); List getDomainList(List domainIds); Map getDomainMap(); - List getDomainListForAdmin(String userName); + List getDomainListWithAdminAuth(User user); - List getDomainListForViewer(String userName); + Set getDomainAuthSet(String userName, AuthType authTypeEnum); Set getDomainChildren(List domainId); - List fetchDomainSchema(DomainSchemaFilterReq filter, User user); - } 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 f00f7d26e..a82d311c1 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 @@ -11,11 +11,11 @@ public interface MetricService { List getMetrics(List ids); - List getMetrics(Long domainId); + List getMetrics(Long modelId); List getMetrics(); - List getMetrics(Long domainId, Long datasourceId); + List getMetrics(Long modelId, Long datasourceId); void creatExprMetric(MetricReq metricReq, User user) throws Exception; @@ -23,9 +23,9 @@ public interface MetricService { PageInfo queryMetric(PageMetricReq pageMetrricReq); - MetricResp getMetric(Long domainId, String bizName); + MetricResp getMetric(Long modelId, String bizName); - List getHighSensitiveMetric(Long domainId); + List getHighSensitiveMetric(Long modelId); void updateExprMetric(MetricReq metricReq, User user) throws Exception; 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 new file mode 100644 index 000000000..ffea84c25 --- /dev/null +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/ModelService.java @@ -0,0 +1,39 @@ +package com.tencent.supersonic.semantic.model.domain; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +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.ModelResp; +import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; +import java.util.List; +import java.util.Map; + +public interface ModelService { + + List getModelListWithAuth(String userName, Long domainId, AuthType authType); + + List getModelAuthList(String userName, AuthType authTypeEnum); + + List getModelByDomainIds(List domainIds); + + List getModelList(); + + List getModelList(List modelIds); + + ModelResp getModel(Long id); + + void updateModel(ModelReq modelReq, User user); + + void createModel(ModelReq modelReq, User user); + + void deleteModel(Long model); + + Map getModelMap(); + + Map getModelFullPathMap(); + + ModelSchemaResp fetchSingleModelSchema(Long modelId); + + List fetchModelSchema(ModelSchemaFilterReq modelSchemaFilterReq); +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/ClickHouseAdaptor.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/ClickHouseAdaptor.java index 4a3d48e7a..974a0e329 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/ClickHouseAdaptor.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/adaptor/engineadapter/ClickHouseAdaptor.java @@ -1,7 +1,7 @@ package com.tencent.supersonic.semantic.model.domain.adaptor.engineadapter; -import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; public class ClickHouseAdaptor extends EngineAdaptor { 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 e3a68bf29..dfbbde0d6 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 @@ -1,7 +1,7 @@ package com.tencent.supersonic.semantic.model.domain.adaptor.engineadapter; -import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; public class MysqlAdaptor extends EngineAdaptor { 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 48d603cdf..925e20281 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 @@ -25,7 +25,7 @@ public class DatabaseDO { private String description; /** - * 版本 + * */ private String version; @@ -127,6 +127,20 @@ public class DatabaseDO { this.description = description == null ? null : description.trim(); } + /** + * @return version + */ + public String getVersion() { + return version; + } + + /** + * @param version + */ + public void setVersion(String version) { + this.version = version == null ? null : version.trim(); + } + /** * 类型 mysql,clickhouse,tdw * @@ -234,16 +248,4 @@ public class DatabaseDO { public void setConfig(String config) { this.config = config == null ? null : config.trim(); } - - /** - * 版本信息 - * - */ - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } } \ 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 4aba80b86..b75151d07 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 @@ -38,13 +38,6 @@ public class DatabaseDOExample { oredCriteria = new ArrayList(); } - /** - * @mbg.generated - */ - public String getOrderByClause() { - return orderByClause; - } - /** * @mbg.generated */ @@ -55,8 +48,8 @@ public class DatabaseDOExample { /** * @mbg.generated */ - public boolean isDistinct() { - return distinct; + public String getOrderByClause() { + return orderByClause; } /** @@ -66,6 +59,13 @@ public class DatabaseDOExample { this.distinct = distinct; } + /** + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + /** * @mbg.generated */ @@ -117,13 +117,6 @@ public class DatabaseDOExample { distinct = false; } - /** - * @mbg.generated - */ - public Integer getLimitStart() { - return limitStart; - } - /** * @mbg.generated */ @@ -134,8 +127,8 @@ public class DatabaseDOExample { /** * @mbg.generated */ - public Integer getLimitEnd() { - return limitEnd; + public Integer getLimitStart() { + return limitStart; } /** @@ -145,6 +138,13 @@ public class DatabaseDOExample { this.limitEnd = limitEnd; } + /** + * @mbg.generated + */ + public Integer getLimitEnd() { + return limitEnd; + } + /** * s2_database null */ @@ -450,6 +450,76 @@ public class DatabaseDOExample { return (Criteria) this; } + public Criteria andVersionIsNull() { + addCriterion("version is null"); + return (Criteria) this; + } + + public Criteria andVersionIsNotNull() { + addCriterion("version is not null"); + return (Criteria) this; + } + + public Criteria andVersionEqualTo(String value) { + addCriterion("version =", value, "version"); + return (Criteria) this; + } + + public Criteria andVersionNotEqualTo(String value) { + addCriterion("version <>", value, "version"); + return (Criteria) this; + } + + public Criteria andVersionGreaterThan(String value) { + addCriterion("version >", value, "version"); + return (Criteria) this; + } + + public Criteria andVersionGreaterThanOrEqualTo(String value) { + addCriterion("version >=", value, "version"); + return (Criteria) this; + } + + public Criteria andVersionLessThan(String value) { + addCriterion("version <", value, "version"); + return (Criteria) this; + } + + public Criteria andVersionLessThanOrEqualTo(String value) { + addCriterion("version <=", value, "version"); + return (Criteria) this; + } + + public Criteria andVersionLike(String value) { + addCriterion("version like", value, "version"); + return (Criteria) this; + } + + public Criteria andVersionNotLike(String value) { + addCriterion("version not like", value, "version"); + return (Criteria) this; + } + + public Criteria andVersionIn(List values) { + addCriterion("version in", values, "version"); + return (Criteria) this; + } + + public Criteria andVersionNotIn(List values) { + addCriterion("version not in", values, "version"); + return (Criteria) this; + } + + public Criteria andVersionBetween(String value1, String value2) { + addCriterion("version between", value1, value2, "version"); + return (Criteria) this; + } + + public Criteria andVersionNotBetween(String value1, String value2) { + addCriterion("version not between", value1, value2, "version"); + return (Criteria) this; + } + public Criteria andTypeIsNull() { addCriterion("type is null"); return (Criteria) this; @@ -812,6 +882,38 @@ 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; @@ -847,37 +949,5 @@ 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 fb0e18766..96f0a940a 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 @@ -12,7 +12,7 @@ public class DatasourceDO { /** * 主题域ID */ - private Long domainId; + private Long modelId; /** * 数据源名称 @@ -76,19 +76,19 @@ public class DatasourceDO { /** * 主题域ID * - * @return domain_id 主题域ID + * @return model_id 主题域ID */ - public Long getDomainId() { - return domainId; + public Long getModelId() { + return modelId; } /** * 主题域ID * - * @param domainId 主题域ID + * @param modelId 主题域ID */ - public void setDomainId(Long domainId) { - this.domainId = domainId; + public void setModelId(Long modelId) { + this.modelId = modelId; } /** 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 136d0e44a..ce8fdf4f6 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 @@ -38,13 +38,6 @@ public class DatasourceDOExample { oredCriteria = new ArrayList(); } - /** - * @mbg.generated - */ - public String getOrderByClause() { - return orderByClause; - } - /** * @mbg.generated */ @@ -55,8 +48,8 @@ public class DatasourceDOExample { /** * @mbg.generated */ - public boolean isDistinct() { - return distinct; + public String getOrderByClause() { + return orderByClause; } /** @@ -66,6 +59,13 @@ public class DatasourceDOExample { this.distinct = distinct; } + /** + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + /** * @mbg.generated */ @@ -117,13 +117,6 @@ public class DatasourceDOExample { distinct = false; } - /** - * @mbg.generated - */ - public Integer getLimitStart() { - return limitStart; - } - /** * @mbg.generated */ @@ -134,8 +127,8 @@ public class DatasourceDOExample { /** * @mbg.generated */ - public Integer getLimitEnd() { - return limitEnd; + public Integer getLimitStart() { + return limitStart; } /** @@ -145,6 +138,13 @@ public class DatasourceDOExample { this.limitEnd = limitEnd; } + /** + * @mbg.generated + */ + public Integer getLimitEnd() { + return limitEnd; + } + /** * s2_datasource null */ @@ -250,63 +250,63 @@ public class DatasourceDOExample { return (Criteria) this; } - public Criteria andDomainIdIsNull() { - addCriterion("domain_id is null"); + public Criteria andModelIdIsNull() { + addCriterion("model_id is null"); return (Criteria) this; } - public Criteria andDomainIdIsNotNull() { - addCriterion("domain_id is not null"); + public Criteria andModelIdIsNotNull() { + addCriterion("model_id is not null"); return (Criteria) this; } - public Criteria andDomainIdEqualTo(Long value) { - addCriterion("domain_id =", value, "domainId"); + public Criteria andModelIdEqualTo(Long value) { + addCriterion("model_id =", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotEqualTo(Long value) { - addCriterion("domain_id <>", value, "domainId"); + public Criteria andModelIdNotEqualTo(Long value) { + addCriterion("model_id <>", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdGreaterThan(Long value) { - addCriterion("domain_id >", value, "domainId"); + public Criteria andModelIdGreaterThan(Long value) { + addCriterion("model_id >", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdGreaterThanOrEqualTo(Long value) { - addCriterion("domain_id >=", value, "domainId"); + public Criteria andModelIdGreaterThanOrEqualTo(Long value) { + addCriterion("model_id >=", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdLessThan(Long value) { - addCriterion("domain_id <", value, "domainId"); + public Criteria andModelIdLessThan(Long value) { + addCriterion("model_id <", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdLessThanOrEqualTo(Long value) { - addCriterion("domain_id <=", value, "domainId"); + public Criteria andModelIdLessThanOrEqualTo(Long value) { + addCriterion("model_id <=", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdIn(List values) { - addCriterion("domain_id in", values, "domainId"); + public Criteria andModelIdIn(List values) { + addCriterion("model_id in", values, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotIn(List values) { - addCriterion("domain_id not in", values, "domainId"); + public Criteria andModelIdNotIn(List values) { + addCriterion("model_id not in", values, "modelId"); return (Criteria) this; } - public Criteria andDomainIdBetween(Long value1, Long value2) { - addCriterion("domain_id between", value1, value2, "domainId"); + public Criteria andModelIdBetween(Long value1, Long value2) { + addCriterion("model_id between", value1, value2, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotBetween(Long value1, Long value2) { - addCriterion("domain_id not between", value1, value2, "domainId"); + public Criteria andModelIdNotBetween(Long value1, Long value2) { + addCriterion("model_id not between", value1, value2, "modelId"); return (Criteria) this; } @@ -872,6 +872,38 @@ 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; @@ -907,37 +939,5 @@ 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 0c6f8a2af..4beb5e7a6 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 @@ -12,7 +12,7 @@ public class DatasourceRelaDO { /** * */ - private Long domainId; + private Long modelId; /** * @@ -64,17 +64,17 @@ public class DatasourceRelaDO { } /** - * @return domain_id + * @return model_id */ - public Long getDomainId() { - return domainId; + public Long getModelId() { + return modelId; } /** - * @param domainId + * @param modelId */ - public void setDomainId(Long domainId) { - this.domainId = domainId; + public void setModelId(Long modelId) { + this.modelId = modelId; } /** 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 650f61c59..e63d0fae7 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 @@ -38,13 +38,6 @@ public class DatasourceRelaDOExample { oredCriteria = new ArrayList(); } - /** - * @mbg.generated - */ - public String getOrderByClause() { - return orderByClause; - } - /** * @mbg.generated */ @@ -55,8 +48,8 @@ public class DatasourceRelaDOExample { /** * @mbg.generated */ - public boolean isDistinct() { - return distinct; + public String getOrderByClause() { + return orderByClause; } /** @@ -66,6 +59,13 @@ public class DatasourceRelaDOExample { this.distinct = distinct; } + /** + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + /** * @mbg.generated */ @@ -117,13 +117,6 @@ public class DatasourceRelaDOExample { distinct = false; } - /** - * @mbg.generated - */ - public Integer getLimitStart() { - return limitStart; - } - /** * @mbg.generated */ @@ -134,8 +127,8 @@ public class DatasourceRelaDOExample { /** * @mbg.generated */ - public Integer getLimitEnd() { - return limitEnd; + public Integer getLimitStart() { + return limitStart; } /** @@ -145,6 +138,13 @@ public class DatasourceRelaDOExample { this.limitEnd = limitEnd; } + /** + * @mbg.generated + */ + public Integer getLimitEnd() { + return limitEnd; + } + /** * s2_datasource_rela null */ @@ -250,63 +250,63 @@ public class DatasourceRelaDOExample { return (Criteria) this; } - public Criteria andDomainIdIsNull() { - addCriterion("domain_id is null"); + public Criteria andModelIdIsNull() { + addCriterion("model_id is null"); return (Criteria) this; } - public Criteria andDomainIdIsNotNull() { - addCriterion("domain_id is not null"); + public Criteria andModelIdIsNotNull() { + addCriterion("model_id is not null"); return (Criteria) this; } - public Criteria andDomainIdEqualTo(Long value) { - addCriterion("domain_id =", value, "domainId"); + public Criteria andModelIdEqualTo(Long value) { + addCriterion("model_id =", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotEqualTo(Long value) { - addCriterion("domain_id <>", value, "domainId"); + public Criteria andModelIdNotEqualTo(Long value) { + addCriterion("model_id <>", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdGreaterThan(Long value) { - addCriterion("domain_id >", value, "domainId"); + public Criteria andModelIdGreaterThan(Long value) { + addCriterion("model_id >", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdGreaterThanOrEqualTo(Long value) { - addCriterion("domain_id >=", value, "domainId"); + public Criteria andModelIdGreaterThanOrEqualTo(Long value) { + addCriterion("model_id >=", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdLessThan(Long value) { - addCriterion("domain_id <", value, "domainId"); + public Criteria andModelIdLessThan(Long value) { + addCriterion("model_id <", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdLessThanOrEqualTo(Long value) { - addCriterion("domain_id <=", value, "domainId"); + public Criteria andModelIdLessThanOrEqualTo(Long value) { + addCriterion("model_id <=", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdIn(List values) { - addCriterion("domain_id in", values, "domainId"); + public Criteria andModelIdIn(List values) { + addCriterion("model_id in", values, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotIn(List values) { - addCriterion("domain_id not in", values, "domainId"); + public Criteria andModelIdNotIn(List values) { + addCriterion("model_id not in", values, "modelId"); return (Criteria) this; } - public Criteria andDomainIdBetween(Long value1, Long value2) { - addCriterion("domain_id between", value1, value2, "domainId"); + public Criteria andModelIdBetween(Long value1, Long value2) { + addCriterion("model_id between", value1, value2, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotBetween(Long value1, Long value2) { - addCriterion("domain_id not between", value1, value2, "domainId"); + public Criteria andModelIdNotBetween(Long value1, Long value2) { + addCriterion("model_id not between", value1, value2, "modelId"); return (Criteria) this; } @@ -335,6 +335,11 @@ public class DatasourceRelaDOExample { return (Criteria) this; } + public Criteria andDatasourceFromGreaterThanOrEqualTo(Long value) { + addCriterion("datasource_from >=", value, "datasourceFrom"); + return (Criteria) this; + } + public Criteria andDatasourceFromLessThan(Long value) { addCriterion("datasource_from <", value, "datasourceFrom"); return (Criteria) this; @@ -787,6 +792,38 @@ 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; @@ -822,37 +859,5 @@ 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/DictionaryDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryDO.java deleted file mode 100644 index c35b82689..000000000 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryDO.java +++ /dev/null @@ -1,278 +0,0 @@ -package com.tencent.supersonic.semantic.model.domain.dataobject; - -import java.util.Date; - -public class DictionaryDO { - - /** - * - */ - private Long id; - - /** - * 对应维度id、指标id等 - */ - private Long itemId; - - /** - * 对应维度、指标等 - */ - private String type; - - /** - * 1-开启写入字典,0-不开启 - */ - private Boolean isDictInfo; - - /** - * 创建时间 - */ - private Date createdAt; - - /** - * 更新时间 - */ - private Date updatedAt; - - /** - * 创建人 - */ - private String createdBy; - - /** - * 更新人 - */ - private String updatedBy; - - /** - * 1-删除,0-可用 - */ - private Boolean isDeleted; - - /** - * 字典黑名单 - */ - private String blackList; - - /** - * 字典白名单 - */ - private String whiteList; - - /** - * 字典规则 - */ - private String ruleList; - - /** - * @return id - */ - public Long getId() { - return id; - } - - /** - * @param id - */ - public void setId(Long id) { - this.id = id; - } - - /** - * 对应维度id、指标id等 - * - * @return item_id 对应维度id、指标id等 - */ - public Long getItemId() { - return itemId; - } - - /** - * 对应维度id、指标id等 - * - * @param itemId 对应维度id、指标id等 - */ - public void setItemId(Long itemId) { - this.itemId = itemId; - } - - /** - * 对应维度、指标等 - * - * @return type 对应维度、指标等 - */ - public String getType() { - return type; - } - - /** - * 对应维度、指标等 - * - * @param type 对应维度、指标等 - */ - public void setType(String type) { - this.type = type == null ? null : type.trim(); - } - - /** - * 1-开启写入字典,0-不开启 - * - * @return is_dict_Info 1-开启写入字典,0-不开启 - */ - public Boolean getIsDictInfo() { - return isDictInfo; - } - - /** - * 1-开启写入字典,0-不开启 - * - * @param isDictInfo 1-开启写入字典,0-不开启 - */ - public void setIsDictInfo(Boolean isDictInfo) { - this.isDictInfo = isDictInfo; - } - - /** - * 创建时间 - * - * @return created_at 创建时间 - */ - public Date getCreatedAt() { - return createdAt; - } - - /** - * 创建时间 - * - * @param createdAt 创建时间 - */ - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - /** - * 更新时间 - * - * @return updated_at 更新时间 - */ - public Date getUpdatedAt() { - return updatedAt; - } - - /** - * 更新时间 - * - * @param updatedAt 更新时间 - */ - public void setUpdatedAt(Date updatedAt) { - this.updatedAt = updatedAt; - } - - /** - * 创建人 - * - * @return created_by 创建人 - */ - public String getCreatedBy() { - return createdBy; - } - - /** - * 创建人 - * - * @param createdBy 创建人 - */ - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy == null ? null : createdBy.trim(); - } - - /** - * 更新人 - * - * @return updated_by 更新人 - */ - public String getUpdatedBy() { - return updatedBy; - } - - /** - * 更新人 - * - * @param updatedBy 更新人 - */ - public void setUpdatedBy(String updatedBy) { - this.updatedBy = updatedBy == null ? null : updatedBy.trim(); - } - - /** - * 1-删除,0-可用 - * - * @return is_deleted 1-删除,0-可用 - */ - public Boolean getIsDeleted() { - return isDeleted; - } - - /** - * 1-删除,0-可用 - * - * @param isDeleted 1-删除,0-可用 - */ - public void setIsDeleted(Boolean isDeleted) { - this.isDeleted = isDeleted; - } - - /** - * 字典黑名单 - * - * @return black_list 字典黑名单 - */ - public String getBlackList() { - return blackList; - } - - /** - * 字典黑名单 - * - * @param blackList 字典黑名单 - */ - public void setBlackList(String blackList) { - this.blackList = blackList == null ? null : blackList.trim(); - } - - /** - * 字典白名单 - * - * @return white_list 字典白名单 - */ - public String getWhiteList() { - return whiteList; - } - - /** - * 字典白名单 - * - * @param whiteList 字典白名单 - */ - public void setWhiteList(String whiteList) { - this.whiteList = whiteList == null ? null : whiteList.trim(); - } - - /** - * 字典规则 - * - * @return rule_list 字典规则 - */ - public String getRuleList() { - return ruleList; - } - - /** - * 字典规则 - * - * @param ruleList 字典规则 - */ - public void setRuleList(String ruleList) { - this.ruleList = ruleList == null ? null : ruleList.trim(); - } -} \ No newline at end of file diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryDOExample.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryDOExample.java deleted file mode 100644 index b91f929bc..000000000 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryDOExample.java +++ /dev/null @@ -1,863 +0,0 @@ -package com.tencent.supersonic.semantic.model.domain.dataobject; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -public class DictionaryDOExample { - - /** - * s2_dictionary - */ - protected String orderByClause; - - /** - * s2_dictionary - */ - protected boolean distinct; - - /** - * s2_dictionary - */ - protected List oredCriteria; - - /** - * s2_dictionary - */ - protected Integer limitStart; - - /** - * s2_dictionary - */ - protected Integer limitEnd; - - /** - * @mbg.generated - */ - public DictionaryDOExample() { - oredCriteria = new ArrayList(); - } - - /** - * @mbg.generated - */ - public String getOrderByClause() { - return orderByClause; - } - - /** - * @mbg.generated - */ - public void setOrderByClause(String orderByClause) { - this.orderByClause = orderByClause; - } - - /** - * @mbg.generated - */ - public boolean isDistinct() { - return distinct; - } - - /** - * @mbg.generated - */ - public void setDistinct(boolean distinct) { - this.distinct = 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) { - oredCriteria.add(criteria); - } - return criteria; - } - - /** - * @mbg.generated - */ - protected Criteria createCriteriaInternal() { - Criteria criteria = new Criteria(); - return criteria; - } - - /** - * @mbg.generated - */ - public void clear() { - oredCriteria.clear(); - orderByClause = null; - distinct = false; - } - - /** - * @mbg.generated - */ - public Integer getLimitStart() { - return limitStart; - } - - /** - * @mbg.generated - */ - public void setLimitStart(Integer limitStart) { - this.limitStart = limitStart; - } - - /** - * @mbg.generated - */ - public Integer getLimitEnd() { - return limitEnd; - } - - /** - * @mbg.generated - */ - public void setLimitEnd(Integer limitEnd) { - this.limitEnd = limitEnd; - } - - /** - * s2_dictionary null - */ - protected abstract static class GeneratedCriteria { - - protected List criteria; - - protected GeneratedCriteria() { - super(); - criteria = new ArrayList(); - } - - public boolean isValid() { - return criteria.size() > 0; - } - - public List getAllCriteria() { - return criteria; - } - - public List getCriteria() { - return criteria; - } - - protected void addCriterion(String condition) { - if (condition == null) { - throw new RuntimeException("Value for condition cannot be null"); - } - criteria.add(new Criterion(condition)); - } - - protected void addCriterion(String condition, Object value, String property) { - if (value == null) { - throw new RuntimeException("Value for " + property + " cannot be null"); - } - criteria.add(new Criterion(condition, value)); - } - - protected void addCriterion(String condition, Object value1, Object value2, String property) { - if (value1 == null || value2 == null) { - throw new RuntimeException("Between values for " + property + " cannot be null"); - } - criteria.add(new Criterion(condition, value1, value2)); - } - - public Criteria andIdIsNull() { - addCriterion("id is null"); - return (Criteria) this; - } - - public Criteria andIdIsNotNull() { - addCriterion("id is not null"); - return (Criteria) this; - } - - public Criteria andIdEqualTo(Long value) { - addCriterion("id =", value, "id"); - return (Criteria) this; - } - - public Criteria andIdNotEqualTo(Long value) { - addCriterion("id <>", value, "id"); - return (Criteria) this; - } - - public Criteria andIdGreaterThan(Long value) { - addCriterion("id >", value, "id"); - return (Criteria) this; - } - - public Criteria andIdGreaterThanOrEqualTo(Long value) { - addCriterion("id >=", value, "id"); - return (Criteria) this; - } - - public Criteria andIdLessThan(Long value) { - addCriterion("id <", value, "id"); - return (Criteria) this; - } - - public Criteria andIdLessThanOrEqualTo(Long value) { - addCriterion("id <=", value, "id"); - return (Criteria) this; - } - - public Criteria andIdIn(List values) { - addCriterion("id in", values, "id"); - return (Criteria) this; - } - - public Criteria andIdNotIn(List values) { - addCriterion("id not in", values, "id"); - return (Criteria) this; - } - - public Criteria andIdBetween(Long value1, Long value2) { - addCriterion("id between", value1, value2, "id"); - return (Criteria) this; - } - - public Criteria andIdNotBetween(Long value1, Long value2) { - addCriterion("id not between", value1, value2, "id"); - return (Criteria) this; - } - - public Criteria andItemIdIsNull() { - addCriterion("item_id is null"); - return (Criteria) this; - } - - public Criteria andItemIdIsNotNull() { - addCriterion("item_id is not null"); - return (Criteria) this; - } - - public Criteria andItemIdEqualTo(Long value) { - addCriterion("item_id =", value, "itemId"); - return (Criteria) this; - } - - public Criteria andItemIdNotEqualTo(Long value) { - addCriterion("item_id <>", value, "itemId"); - return (Criteria) this; - } - - public Criteria andItemIdGreaterThan(Long value) { - addCriterion("item_id >", value, "itemId"); - return (Criteria) this; - } - - public Criteria andItemIdGreaterThanOrEqualTo(Long value) { - addCriterion("item_id >=", value, "itemId"); - return (Criteria) this; - } - - public Criteria andItemIdLessThan(Long value) { - addCriterion("item_id <", value, "itemId"); - return (Criteria) this; - } - - public Criteria andItemIdLessThanOrEqualTo(Long value) { - addCriterion("item_id <=", value, "itemId"); - return (Criteria) this; - } - - public Criteria andItemIdIn(List values) { - addCriterion("item_id in", values, "itemId"); - return (Criteria) this; - } - - public Criteria andItemIdNotIn(List values) { - addCriterion("item_id not in", values, "itemId"); - return (Criteria) this; - } - - public Criteria andItemIdBetween(Long value1, Long value2) { - addCriterion("item_id between", value1, value2, "itemId"); - return (Criteria) this; - } - - public Criteria andItemIdNotBetween(Long value1, Long value2) { - addCriterion("item_id not between", value1, value2, "itemId"); - return (Criteria) this; - } - - public Criteria andTypeIsNull() { - addCriterion("type is null"); - return (Criteria) this; - } - - public Criteria andTypeIsNotNull() { - addCriterion("type is not null"); - return (Criteria) this; - } - - public Criteria andTypeEqualTo(String value) { - addCriterion("type =", value, "type"); - return (Criteria) this; - } - - public Criteria andTypeNotEqualTo(String value) { - addCriterion("type <>", value, "type"); - return (Criteria) this; - } - - public Criteria andTypeGreaterThan(String value) { - addCriterion("type >", value, "type"); - return (Criteria) this; - } - - public Criteria andTypeGreaterThanOrEqualTo(String value) { - addCriterion("type >=", value, "type"); - return (Criteria) this; - } - - public Criteria andTypeLessThan(String value) { - addCriterion("type <", value, "type"); - return (Criteria) this; - } - - public Criteria andTypeLessThanOrEqualTo(String value) { - addCriterion("type <=", value, "type"); - return (Criteria) this; - } - - public Criteria andTypeLike(String value) { - addCriterion("type like", value, "type"); - return (Criteria) this; - } - - public Criteria andTypeNotLike(String value) { - addCriterion("type not like", value, "type"); - return (Criteria) this; - } - - public Criteria andTypeIn(List values) { - addCriterion("type in", values, "type"); - return (Criteria) this; - } - - public Criteria andTypeNotIn(List values) { - addCriterion("type not in", values, "type"); - return (Criteria) this; - } - - public Criteria andTypeBetween(String value1, String value2) { - addCriterion("type between", value1, value2, "type"); - return (Criteria) this; - } - - public Criteria andTypeNotBetween(String value1, String value2) { - addCriterion("type not between", value1, value2, "type"); - return (Criteria) this; - } - - public Criteria andIsDictInfoIsNull() { - addCriterion("is_dict_Info is null"); - return (Criteria) this; - } - - public Criteria andIsDictInfoIsNotNull() { - addCriterion("is_dict_Info is not null"); - return (Criteria) this; - } - - public Criteria andIsDictInfoEqualTo(Boolean value) { - addCriterion("is_dict_Info =", value, "isDictInfo"); - return (Criteria) this; - } - - public Criteria andIsDictInfoNotEqualTo(Boolean value) { - addCriterion("is_dict_Info <>", value, "isDictInfo"); - return (Criteria) this; - } - - public Criteria andIsDictInfoGreaterThan(Boolean value) { - addCriterion("is_dict_Info >", value, "isDictInfo"); - return (Criteria) this; - } - - public Criteria andIsDictInfoGreaterThanOrEqualTo(Boolean value) { - addCriterion("is_dict_Info >=", value, "isDictInfo"); - return (Criteria) this; - } - - public Criteria andIsDictInfoLessThan(Boolean value) { - addCriterion("is_dict_Info <", value, "isDictInfo"); - return (Criteria) this; - } - - public Criteria andIsDictInfoLessThanOrEqualTo(Boolean value) { - addCriterion("is_dict_Info <=", value, "isDictInfo"); - return (Criteria) this; - } - - public Criteria andIsDictInfoIn(List values) { - addCriterion("is_dict_Info in", values, "isDictInfo"); - return (Criteria) this; - } - - public Criteria andIsDictInfoNotIn(List values) { - addCriterion("is_dict_Info not in", values, "isDictInfo"); - return (Criteria) this; - } - - public Criteria andIsDictInfoBetween(Boolean value1, Boolean value2) { - addCriterion("is_dict_Info between", value1, value2, "isDictInfo"); - return (Criteria) this; - } - - public Criteria andIsDictInfoNotBetween(Boolean value1, Boolean value2) { - addCriterion("is_dict_Info not between", value1, value2, "isDictInfo"); - return (Criteria) this; - } - - public Criteria andCreatedAtIsNull() { - addCriterion("created_at is null"); - return (Criteria) this; - } - - public Criteria andCreatedAtIsNotNull() { - addCriterion("created_at is not null"); - return (Criteria) this; - } - - public Criteria andCreatedAtEqualTo(Date value) { - addCriterion("created_at =", value, "createdAt"); - return (Criteria) this; - } - - public Criteria andCreatedAtNotEqualTo(Date value) { - addCriterion("created_at <>", value, "createdAt"); - return (Criteria) this; - } - - public Criteria andCreatedAtGreaterThan(Date value) { - addCriterion("created_at >", value, "createdAt"); - return (Criteria) this; - } - - public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) { - addCriterion("created_at >=", value, "createdAt"); - return (Criteria) this; - } - - public Criteria andCreatedAtLessThan(Date value) { - addCriterion("created_at <", value, "createdAt"); - return (Criteria) this; - } - - public Criteria andCreatedAtLessThanOrEqualTo(Date value) { - addCriterion("created_at <=", value, "createdAt"); - return (Criteria) this; - } - - public Criteria andCreatedAtIn(List values) { - addCriterion("created_at in", values, "createdAt"); - return (Criteria) this; - } - - public Criteria andCreatedAtNotIn(List values) { - addCriterion("created_at not in", values, "createdAt"); - return (Criteria) this; - } - - public Criteria andCreatedAtBetween(Date value1, Date value2) { - addCriterion("created_at between", value1, value2, "createdAt"); - return (Criteria) this; - } - - public Criteria andCreatedAtNotBetween(Date value1, Date value2) { - addCriterion("created_at not between", value1, value2, "createdAt"); - return (Criteria) this; - } - - public Criteria andUpdatedAtIsNull() { - addCriterion("updated_at is null"); - return (Criteria) this; - } - - public Criteria andUpdatedAtIsNotNull() { - addCriterion("updated_at is not null"); - return (Criteria) this; - } - - public Criteria andUpdatedAtEqualTo(Date value) { - addCriterion("updated_at =", value, "updatedAt"); - return (Criteria) this; - } - - public Criteria andUpdatedAtNotEqualTo(Date value) { - addCriterion("updated_at <>", value, "updatedAt"); - return (Criteria) this; - } - - public Criteria andUpdatedAtGreaterThan(Date value) { - addCriterion("updated_at >", value, "updatedAt"); - return (Criteria) this; - } - - public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) { - addCriterion("updated_at >=", value, "updatedAt"); - return (Criteria) this; - } - - public Criteria andUpdatedAtLessThan(Date value) { - addCriterion("updated_at <", value, "updatedAt"); - return (Criteria) this; - } - - public Criteria andUpdatedAtLessThanOrEqualTo(Date value) { - addCriterion("updated_at <=", value, "updatedAt"); - return (Criteria) this; - } - - public Criteria andUpdatedAtIn(List values) { - addCriterion("updated_at in", values, "updatedAt"); - return (Criteria) this; - } - - public Criteria andUpdatedAtNotIn(List values) { - addCriterion("updated_at not in", values, "updatedAt"); - return (Criteria) this; - } - - public Criteria andUpdatedAtBetween(Date value1, Date value2) { - addCriterion("updated_at between", value1, value2, "updatedAt"); - return (Criteria) this; - } - - public Criteria andUpdatedAtNotBetween(Date value1, Date value2) { - addCriterion("updated_at not between", value1, value2, "updatedAt"); - return (Criteria) this; - } - - public Criteria andCreatedByIsNull() { - addCriterion("created_by is null"); - return (Criteria) this; - } - - public Criteria andCreatedByIsNotNull() { - addCriterion("created_by is not null"); - return (Criteria) this; - } - - public Criteria andCreatedByEqualTo(String value) { - addCriterion("created_by =", value, "createdBy"); - return (Criteria) this; - } - - public Criteria andCreatedByNotEqualTo(String value) { - addCriterion("created_by <>", value, "createdBy"); - return (Criteria) this; - } - - public Criteria andCreatedByGreaterThan(String value) { - addCriterion("created_by >", value, "createdBy"); - return (Criteria) this; - } - - public Criteria andCreatedByGreaterThanOrEqualTo(String value) { - addCriterion("created_by >=", value, "createdBy"); - return (Criteria) this; - } - - public Criteria andCreatedByLessThan(String value) { - addCriterion("created_by <", value, "createdBy"); - return (Criteria) this; - } - - public Criteria andCreatedByLessThanOrEqualTo(String value) { - addCriterion("created_by <=", value, "createdBy"); - return (Criteria) this; - } - - public Criteria andCreatedByLike(String value) { - addCriterion("created_by like", value, "createdBy"); - return (Criteria) this; - } - - public Criteria andCreatedByNotLike(String value) { - addCriterion("created_by not like", value, "createdBy"); - return (Criteria) this; - } - - public Criteria andCreatedByIn(List values) { - addCriterion("created_by in", values, "createdBy"); - return (Criteria) this; - } - - public Criteria andCreatedByNotIn(List values) { - addCriterion("created_by not in", values, "createdBy"); - return (Criteria) this; - } - - public Criteria andCreatedByBetween(String value1, String value2) { - addCriterion("created_by between", value1, value2, "createdBy"); - return (Criteria) this; - } - - public Criteria andCreatedByNotBetween(String value1, String value2) { - addCriterion("created_by not between", value1, value2, "createdBy"); - return (Criteria) this; - } - - public Criteria andUpdatedByIsNull() { - addCriterion("updated_by is null"); - return (Criteria) this; - } - - public Criteria andUpdatedByIsNotNull() { - addCriterion("updated_by is not null"); - return (Criteria) this; - } - - public Criteria andUpdatedByEqualTo(String value) { - addCriterion("updated_by =", value, "updatedBy"); - return (Criteria) this; - } - - public Criteria andUpdatedByNotEqualTo(String value) { - addCriterion("updated_by <>", value, "updatedBy"); - return (Criteria) this; - } - - public Criteria andUpdatedByGreaterThan(String value) { - addCriterion("updated_by >", value, "updatedBy"); - return (Criteria) this; - } - - public Criteria andUpdatedByGreaterThanOrEqualTo(String value) { - addCriterion("updated_by >=", value, "updatedBy"); - return (Criteria) this; - } - - public Criteria andUpdatedByLessThan(String value) { - addCriterion("updated_by <", value, "updatedBy"); - return (Criteria) this; - } - - public Criteria andUpdatedByLessThanOrEqualTo(String value) { - addCriterion("updated_by <=", value, "updatedBy"); - return (Criteria) this; - } - - public Criteria andUpdatedByLike(String value) { - addCriterion("updated_by like", value, "updatedBy"); - return (Criteria) this; - } - - public Criteria andUpdatedByNotLike(String value) { - addCriterion("updated_by not like", value, "updatedBy"); - return (Criteria) this; - } - - public Criteria andUpdatedByIn(List values) { - addCriterion("updated_by in", values, "updatedBy"); - return (Criteria) this; - } - - public Criteria andUpdatedByNotIn(List values) { - addCriterion("updated_by not in", values, "updatedBy"); - return (Criteria) this; - } - - public Criteria andUpdatedByBetween(String value1, String value2) { - addCriterion("updated_by between", value1, value2, "updatedBy"); - return (Criteria) this; - } - - public Criteria andUpdatedByNotBetween(String value1, String value2) { - addCriterion("updated_by not between", value1, value2, "updatedBy"); - return (Criteria) this; - } - - public Criteria andIsDeletedIsNull() { - addCriterion("is_deleted is null"); - return (Criteria) this; - } - - public Criteria andIsDeletedIsNotNull() { - addCriterion("is_deleted is not null"); - return (Criteria) this; - } - - public Criteria andIsDeletedEqualTo(Boolean value) { - addCriterion("is_deleted =", value, "isDeleted"); - return (Criteria) this; - } - - public Criteria andIsDeletedNotEqualTo(Boolean value) { - addCriterion("is_deleted <>", value, "isDeleted"); - return (Criteria) this; - } - - public Criteria andIsDeletedGreaterThan(Boolean value) { - addCriterion("is_deleted >", value, "isDeleted"); - return (Criteria) this; - } - - public Criteria andIsDeletedGreaterThanOrEqualTo(Boolean value) { - addCriterion("is_deleted >=", value, "isDeleted"); - return (Criteria) this; - } - - public Criteria andIsDeletedLessThan(Boolean value) { - addCriterion("is_deleted <", value, "isDeleted"); - return (Criteria) this; - } - - public Criteria andIsDeletedLessThanOrEqualTo(Boolean value) { - addCriterion("is_deleted <=", value, "isDeleted"); - return (Criteria) this; - } - - public Criteria andIsDeletedIn(List values) { - addCriterion("is_deleted in", values, "isDeleted"); - return (Criteria) this; - } - - public Criteria andIsDeletedNotIn(List values) { - addCriterion("is_deleted not in", values, "isDeleted"); - return (Criteria) this; - } - - public Criteria andIsDeletedBetween(Boolean value1, Boolean value2) { - addCriterion("is_deleted between", value1, value2, "isDeleted"); - return (Criteria) this; - } - - public Criteria andIsDeletedNotBetween(Boolean value1, Boolean value2) { - addCriterion("is_deleted not between", value1, value2, "isDeleted"); - return (Criteria) this; - } - } - - /** - * s2_dictionary - */ - public static class Criteria extends GeneratedCriteria { - - protected Criteria() { - super(); - } - } - - /** - * s2_dictionary null - */ - public static class Criterion { - - private String condition; - - private Object value; - - private Object secondValue; - - private boolean noValue; - - private boolean singleValue; - - private boolean betweenValue; - - private boolean listValue; - - private String typeHandler; - - protected Criterion(String condition) { - super(); - this.condition = condition; - this.typeHandler = null; - this.noValue = true; - } - - protected Criterion(String condition, Object value, String typeHandler) { - super(); - this.condition = condition; - this.value = value; - this.typeHandler = typeHandler; - if (value instanceof List) { - this.listValue = true; - } else { - this.singleValue = true; - } - } - - protected Criterion(String condition, Object value) { - this(condition, value, null); - } - - protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { - super(); - this.condition = condition; - this.value = value; - this.secondValue = secondValue; - this.typeHandler = typeHandler; - this.betweenValue = true; - } - - 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/DictionaryTaskDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryTaskDO.java deleted file mode 100644 index ea1e90076..000000000 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryTaskDO.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.tencent.supersonic.semantic.model.domain.dataobject; - -public class DictionaryTaskDO { - - /** - * - */ - private Long id; - - /** - * 主体域ID - */ - private Long domainId; - - /** - * 任务最终运行状态 - */ - private Integer status; - - /** - * 任务耗时 - */ - private Long elapsedMs; - - /** - * 查询涉及的维度 - */ - private String dimensions; - - /** - * 查询涉及的指标 - */ - private String metrics; - - /** - * 查询的过滤信息 - */ - private String filters; - - /** - * 查询的排序信息 - */ - private String orderBy; - - /** - * 查询涉及的日期信息 - */ - private String dateInfo; - - /** - * @return id - */ - public Long getId() { - return id; - } - - /** - * @param id - */ - public void setId(Long id) { - this.id = id; - } - - /** - * 主体域ID - * - * @return domain_id 主体域ID - */ - public Long getDomainId() { - return domainId; - } - - /** - * 主体域ID - * - * @param domainId 主体域ID - */ - public void setDomainId(Long domainId) { - this.domainId = domainId; - } - - /** - * 任务最终运行状态 - * - * @return status 任务最终运行状态 - */ - public Integer getStatus() { - return status; - } - - /** - * 任务最终运行状态 - * - * @param status 任务最终运行状态 - */ - public void setStatus(Integer status) { - this.status = status; - } - - /** - * 任务耗时 - * - * @return elapsed_ms 任务耗时 - */ - public Long getElapsedMs() { - return elapsedMs; - } - - /** - * 任务耗时 - * - * @param elapsedMs 任务耗时 - */ - public void setElapsedMs(Long elapsedMs) { - this.elapsedMs = elapsedMs; - } - - /** - * 查询涉及的维度 - * - * @return dimensions 查询涉及的维度 - */ - public String getDimensions() { - return dimensions; - } - - /** - * 查询涉及的维度 - * - * @param dimensions 查询涉及的维度 - */ - public void setDimensions(String dimensions) { - this.dimensions = dimensions == null ? null : dimensions.trim(); - } - - /** - * 查询涉及的指标 - * - * @return metrics 查询涉及的指标 - */ - public String getMetrics() { - return metrics; - } - - /** - * 查询涉及的指标 - * - * @param metrics 查询涉及的指标 - */ - public void setMetrics(String metrics) { - this.metrics = metrics == null ? null : metrics.trim(); - } - - /** - * 查询的过滤信息 - * - * @return filters 查询的过滤信息 - */ - public String getFilters() { - return filters; - } - - /** - * 查询的过滤信息 - * - * @param filters 查询的过滤信息 - */ - public void setFilters(String filters) { - this.filters = filters == null ? null : filters.trim(); - } - - /** - * 查询的排序信息 - * - * @return order_by 查询的排序信息 - */ - public String getOrderBy() { - return orderBy; - } - - /** - * 查询的排序信息 - * - * @param orderBy 查询的排序信息 - */ - public void setOrderBy(String orderBy) { - this.orderBy = orderBy == null ? null : orderBy.trim(); - } - - /** - * 查询涉及的日期信息 - * - * @return date_info 查询涉及的日期信息 - */ - public String getDateInfo() { - return dateInfo; - } - - /** - * 查询涉及的日期信息 - * - * @param dateInfo 查询涉及的日期信息 - */ - public void setDateInfo(String dateInfo) { - this.dateInfo = dateInfo == null ? null : dateInfo.trim(); - } -} \ No newline at end of file diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryTaskDOExample.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryTaskDOExample.java deleted file mode 100644 index 7e721616c..000000000 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DictionaryTaskDOExample.java +++ /dev/null @@ -1,532 +0,0 @@ -package com.tencent.supersonic.semantic.model.domain.dataobject; - -import java.util.ArrayList; -import java.util.List; - -public class DictionaryTaskDOExample { - - /** - * s2_dictionary_task - */ - protected String orderByClause; - - /** - * s2_dictionary_task - */ - protected boolean distinct; - - /** - * s2_dictionary_task - */ - protected List oredCriteria; - - /** - * s2_dictionary_task - */ - protected Integer limitStart; - - /** - * s2_dictionary_task - */ - protected Integer limitEnd; - - /** - * @mbg.generated - */ - public DictionaryTaskDOExample() { - oredCriteria = new ArrayList(); - } - - /** - * @mbg.generated - */ - public String getOrderByClause() { - return orderByClause; - } - - /** - * @mbg.generated - */ - public void setOrderByClause(String orderByClause) { - this.orderByClause = orderByClause; - } - - /** - * @mbg.generated - */ - public boolean isDistinct() { - return distinct; - } - - /** - * @mbg.generated - */ - public void setDistinct(boolean distinct) { - this.distinct = 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) { - oredCriteria.add(criteria); - } - return criteria; - } - - /** - * @mbg.generated - */ - protected Criteria createCriteriaInternal() { - Criteria criteria = new Criteria(); - return criteria; - } - - /** - * @mbg.generated - */ - public void clear() { - oredCriteria.clear(); - orderByClause = null; - distinct = false; - } - - /** - * @mbg.generated - */ - public Integer getLimitStart() { - return limitStart; - } - - /** - * @mbg.generated - */ - public void setLimitStart(Integer limitStart) { - this.limitStart = limitStart; - } - - /** - * @mbg.generated - */ - public Integer getLimitEnd() { - return limitEnd; - } - - /** - * @mbg.generated - */ - public void setLimitEnd(Integer limitEnd) { - this.limitEnd = limitEnd; - } - - /** - * s2_dictionary_task null - */ - protected abstract static class GeneratedCriteria { - - protected List criteria; - - protected GeneratedCriteria() { - super(); - criteria = new ArrayList(); - } - - public boolean isValid() { - return criteria.size() > 0; - } - - public List getAllCriteria() { - return criteria; - } - - public List getCriteria() { - return criteria; - } - - protected void addCriterion(String condition) { - if (condition == null) { - throw new RuntimeException("Value for condition cannot be null"); - } - criteria.add(new Criterion(condition)); - } - - protected void addCriterion(String condition, Object value, String property) { - if (value == null) { - throw new RuntimeException("Value for " + property + " cannot be null"); - } - criteria.add(new Criterion(condition, value)); - } - - protected void addCriterion(String condition, Object value1, Object value2, String property) { - if (value1 == null || value2 == null) { - throw new RuntimeException("Between values for " + property + " cannot be null"); - } - criteria.add(new Criterion(condition, value1, value2)); - } - - public Criteria andIdIsNull() { - addCriterion("id is null"); - return (Criteria) this; - } - - public Criteria andIdIsNotNull() { - addCriterion("id is not null"); - return (Criteria) this; - } - - public Criteria andIdEqualTo(Long value) { - addCriterion("id =", value, "id"); - return (Criteria) this; - } - - public Criteria andIdNotEqualTo(Long value) { - addCriterion("id <>", value, "id"); - return (Criteria) this; - } - - public Criteria andIdGreaterThan(Long value) { - addCriterion("id >", value, "id"); - return (Criteria) this; - } - - public Criteria andIdGreaterThanOrEqualTo(Long value) { - addCriterion("id >=", value, "id"); - return (Criteria) this; - } - - public Criteria andIdLessThan(Long value) { - addCriterion("id <", value, "id"); - return (Criteria) this; - } - - public Criteria andIdLessThanOrEqualTo(Long value) { - addCriterion("id <=", value, "id"); - return (Criteria) this; - } - - public Criteria andIdIn(List values) { - addCriterion("id in", values, "id"); - return (Criteria) this; - } - - public Criteria andIdNotIn(List values) { - addCriterion("id not in", values, "id"); - return (Criteria) this; - } - - public Criteria andIdBetween(Long value1, Long value2) { - addCriterion("id between", value1, value2, "id"); - return (Criteria) this; - } - - public Criteria andIdNotBetween(Long value1, Long value2) { - addCriterion("id not between", value1, value2, "id"); - return (Criteria) this; - } - - public Criteria andDomainIdIsNull() { - addCriterion("domain_id is null"); - return (Criteria) this; - } - - public Criteria andDomainIdIsNotNull() { - addCriterion("domain_id is not null"); - return (Criteria) this; - } - - public Criteria andDomainIdEqualTo(Long value) { - addCriterion("domain_id =", value, "domainId"); - return (Criteria) this; - } - - public Criteria andDomainIdNotEqualTo(Long value) { - addCriterion("domain_id <>", value, "domainId"); - return (Criteria) this; - } - - public Criteria andDomainIdGreaterThan(Long value) { - addCriterion("domain_id >", value, "domainId"); - return (Criteria) this; - } - - public Criteria andDomainIdGreaterThanOrEqualTo(Long value) { - addCriterion("domain_id >=", value, "domainId"); - return (Criteria) this; - } - - public Criteria andDomainIdLessThan(Long value) { - addCriterion("domain_id <", value, "domainId"); - return (Criteria) this; - } - - public Criteria andDomainIdLessThanOrEqualTo(Long value) { - addCriterion("domain_id <=", value, "domainId"); - return (Criteria) this; - } - - public Criteria andDomainIdIn(List values) { - addCriterion("domain_id in", values, "domainId"); - return (Criteria) this; - } - - public Criteria andDomainIdNotIn(List values) { - addCriterion("domain_id not in", values, "domainId"); - return (Criteria) this; - } - - public Criteria andDomainIdBetween(Long value1, Long value2) { - addCriterion("domain_id between", value1, value2, "domainId"); - return (Criteria) this; - } - - public Criteria andDomainIdNotBetween(Long value1, Long value2) { - addCriterion("domain_id not between", value1, value2, "domainId"); - return (Criteria) this; - } - - public Criteria andStatusIsNull() { - addCriterion("status is null"); - return (Criteria) this; - } - - public Criteria andStatusIsNotNull() { - addCriterion("status is not null"); - return (Criteria) this; - } - - public Criteria andStatusEqualTo(Integer value) { - addCriterion("status =", value, "status"); - return (Criteria) this; - } - - public Criteria andStatusNotEqualTo(Integer value) { - addCriterion("status <>", value, "status"); - return (Criteria) this; - } - - public Criteria andStatusGreaterThan(Integer value) { - addCriterion("status >", value, "status"); - return (Criteria) this; - } - - public Criteria andStatusGreaterThanOrEqualTo(Integer value) { - addCriterion("status >=", value, "status"); - return (Criteria) this; - } - - public Criteria andStatusLessThan(Integer value) { - addCriterion("status <", value, "status"); - return (Criteria) this; - } - - public Criteria andStatusLessThanOrEqualTo(Integer value) { - addCriterion("status <=", value, "status"); - return (Criteria) this; - } - - public Criteria andStatusIn(List values) { - addCriterion("status in", values, "status"); - return (Criteria) this; - } - - public Criteria andStatusNotIn(List values) { - addCriterion("status not in", values, "status"); - return (Criteria) this; - } - - public Criteria andStatusBetween(Integer value1, Integer value2) { - addCriterion("status between", value1, value2, "status"); - return (Criteria) this; - } - - public Criteria andStatusNotBetween(Integer value1, Integer value2) { - addCriterion("status not between", value1, value2, "status"); - return (Criteria) this; - } - - public Criteria andElapsedMsIsNull() { - addCriterion("elapsed_ms is null"); - return (Criteria) this; - } - - public Criteria andElapsedMsIsNotNull() { - addCriterion("elapsed_ms is not null"); - return (Criteria) this; - } - - public Criteria andElapsedMsEqualTo(Long value) { - addCriterion("elapsed_ms =", value, "elapsedMs"); - return (Criteria) this; - } - - public Criteria andElapsedMsNotEqualTo(Long value) { - addCriterion("elapsed_ms <>", value, "elapsedMs"); - return (Criteria) this; - } - - public Criteria andElapsedMsGreaterThan(Long value) { - addCriterion("elapsed_ms >", value, "elapsedMs"); - return (Criteria) this; - } - - public Criteria andElapsedMsGreaterThanOrEqualTo(Long value) { - addCriterion("elapsed_ms >=", value, "elapsedMs"); - return (Criteria) this; - } - - public Criteria andElapsedMsLessThan(Long value) { - addCriterion("elapsed_ms <", value, "elapsedMs"); - return (Criteria) this; - } - - public Criteria andElapsedMsLessThanOrEqualTo(Long value) { - addCriterion("elapsed_ms <=", value, "elapsedMs"); - return (Criteria) this; - } - - public Criteria andElapsedMsIn(List values) { - addCriterion("elapsed_ms in", values, "elapsedMs"); - return (Criteria) this; - } - - public Criteria andElapsedMsNotIn(List values) { - addCriterion("elapsed_ms not in", values, "elapsedMs"); - return (Criteria) this; - } - - public Criteria andElapsedMsBetween(Long value1, Long value2) { - addCriterion("elapsed_ms between", value1, value2, "elapsedMs"); - return (Criteria) this; - } - - public Criteria andElapsedMsNotBetween(Long value1, Long value2) { - addCriterion("elapsed_ms not between", value1, value2, "elapsedMs"); - return (Criteria) this; - } - } - - /** - * s2_dictionary_task - */ - public static class Criteria extends GeneratedCriteria { - - protected Criteria() { - super(); - } - } - - /** - * s2_dictionary_task null - */ - public static class Criterion { - - private String condition; - - private Object value; - - private Object secondValue; - - private boolean noValue; - - private boolean singleValue; - - private boolean betweenValue; - - private boolean listValue; - - private String typeHandler; - - protected Criterion(String condition) { - super(); - this.condition = condition; - this.typeHandler = null; - this.noValue = true; - } - - protected Criterion(String condition, Object value, String typeHandler) { - super(); - this.condition = condition; - this.value = value; - this.typeHandler = typeHandler; - if (value instanceof List) { - this.listValue = true; - } else { - this.singleValue = true; - } - } - - protected Criterion(String condition, Object value) { - this(condition, value, null); - } - - protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { - super(); - this.condition = condition; - this.value = value; - this.secondValue = secondValue; - this.typeHandler = typeHandler; - this.betweenValue = true; - } - - 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 a48888117..c080f0e59 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 @@ -12,7 +12,7 @@ public class DimensionDO { /** * 主题域id */ - private Long domainId; + private Long modelId; /** * 所属数据源id @@ -84,6 +84,11 @@ public class DimensionDO { */ private String defaultValues; + /** + * + */ + private String dimValueMaps; + /** * 类型参数 */ @@ -94,11 +99,6 @@ public class DimensionDO { */ private String expr; - /** - * dimension value map info - */ - private String dimValueMaps; - /** * 维度ID * @@ -120,19 +120,19 @@ public class DimensionDO { /** * 主题域id * - * @return domain_id 主题域id + * @return model_id 主题域id */ - public Long getDomainId() { - return domainId; + public Long getModelId() { + return modelId; } /** * 主题域id * - * @param domainId 主题域id + * @param modelId 主题域id */ - public void setDomainId(Long domainId) { - this.domainId = domainId; + public void setModelId(Long modelId) { + this.modelId = modelId; } /** @@ -383,6 +383,20 @@ public class DimensionDO { this.defaultValues = defaultValues == null ? null : defaultValues.trim(); } + /** + * @return dim_value_maps + */ + public String getDimValueMaps() { + return dimValueMaps; + } + + /** + * @param dimValueMaps + */ + public void setDimValueMaps(String dimValueMaps) { + this.dimValueMaps = dimValueMaps == null ? null : dimValueMaps.trim(); + } + /** * 类型参数 * @@ -418,12 +432,4 @@ public class DimensionDO { public void setExpr(String expr) { this.expr = expr == null ? null : expr.trim(); } - - public String getDimValueMaps() { - return dimValueMaps; - } - - public void setDimValueMaps(String dimValueMaps) { - this.dimValueMaps = dimValueMaps; - } } \ 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 a44cbd256..ac78e595c 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 @@ -38,13 +38,6 @@ public class DimensionDOExample { oredCriteria = new ArrayList(); } - /** - * @mbg.generated - */ - public String getOrderByClause() { - return orderByClause; - } - /** * @mbg.generated */ @@ -55,8 +48,8 @@ public class DimensionDOExample { /** * @mbg.generated */ - public boolean isDistinct() { - return distinct; + public String getOrderByClause() { + return orderByClause; } /** @@ -66,6 +59,13 @@ public class DimensionDOExample { this.distinct = distinct; } + /** + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + /** * @mbg.generated */ @@ -117,13 +117,6 @@ public class DimensionDOExample { distinct = false; } - /** - * @mbg.generated - */ - public Integer getLimitStart() { - return limitStart; - } - /** * @mbg.generated */ @@ -134,8 +127,8 @@ public class DimensionDOExample { /** * @mbg.generated */ - public Integer getLimitEnd() { - return limitEnd; + public Integer getLimitStart() { + return limitStart; } /** @@ -145,6 +138,13 @@ public class DimensionDOExample { this.limitEnd = limitEnd; } + /** + * @mbg.generated + */ + public Integer getLimitEnd() { + return limitEnd; + } + /** * s2_dimension null */ @@ -250,63 +250,63 @@ public class DimensionDOExample { return (Criteria) this; } - public Criteria andDomainIdIsNull() { - addCriterion("domain_id is null"); + public Criteria andModelIdIsNull() { + addCriterion("model_id is null"); return (Criteria) this; } - public Criteria andDomainIdIsNotNull() { - addCriterion("domain_id is not null"); + public Criteria andModelIdIsNotNull() { + addCriterion("model_id is not null"); return (Criteria) this; } - public Criteria andDomainIdEqualTo(Long value) { - addCriterion("domain_id =", value, "domainId"); + public Criteria andModelIdEqualTo(Long value) { + addCriterion("model_id =", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotEqualTo(Long value) { - addCriterion("domain_id <>", value, "domainId"); + public Criteria andModelIdNotEqualTo(Long value) { + addCriterion("model_id <>", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdGreaterThan(Long value) { - addCriterion("domain_id >", value, "domainId"); + public Criteria andModelIdGreaterThan(Long value) { + addCriterion("model_id >", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdGreaterThanOrEqualTo(Long value) { - addCriterion("domain_id >=", value, "domainId"); + public Criteria andModelIdGreaterThanOrEqualTo(Long value) { + addCriterion("model_id >=", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdLessThan(Long value) { - addCriterion("domain_id <", value, "domainId"); + public Criteria andModelIdLessThan(Long value) { + addCriterion("model_id <", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdLessThanOrEqualTo(Long value) { - addCriterion("domain_id <=", value, "domainId"); + public Criteria andModelIdLessThanOrEqualTo(Long value) { + addCriterion("model_id <=", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdIn(List values) { - addCriterion("domain_id in", values, "domainId"); + public Criteria andModelIdIn(List values) { + addCriterion("model_id in", values, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotIn(List values) { - addCriterion("domain_id not in", values, "domainId"); + public Criteria andModelIdNotIn(List values) { + addCriterion("model_id not in", values, "modelId"); return (Criteria) this; } - public Criteria andDomainIdBetween(Long value1, Long value2) { - addCriterion("domain_id between", value1, value2, "domainId"); + public Criteria andModelIdBetween(Long value1, Long value2) { + addCriterion("model_id between", value1, value2, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotBetween(Long value1, Long value2) { - addCriterion("domain_id not between", value1, value2, "domainId"); + public Criteria andModelIdNotBetween(Long value1, Long value2) { + addCriterion("model_id not between", value1, value2, "modelId"); return (Criteria) this; } @@ -1239,6 +1239,76 @@ public class DimensionDOExample { addCriterion("default_values not between", value1, value2, "defaultValues"); return (Criteria) this; } + + public Criteria andDimValueMapsIsNull() { + addCriterion("dim_value_maps is null"); + return (Criteria) this; + } + + public Criteria andDimValueMapsIsNotNull() { + addCriterion("dim_value_maps is not null"); + return (Criteria) this; + } + + public Criteria andDimValueMapsEqualTo(String value) { + addCriterion("dim_value_maps =", value, "dimValueMaps"); + return (Criteria) this; + } + + public Criteria andDimValueMapsNotEqualTo(String value) { + addCriterion("dim_value_maps <>", value, "dimValueMaps"); + return (Criteria) this; + } + + public Criteria andDimValueMapsGreaterThan(String value) { + addCriterion("dim_value_maps >", value, "dimValueMaps"); + return (Criteria) this; + } + + public Criteria andDimValueMapsGreaterThanOrEqualTo(String value) { + addCriterion("dim_value_maps >=", value, "dimValueMaps"); + return (Criteria) this; + } + + public Criteria andDimValueMapsLessThan(String value) { + addCriterion("dim_value_maps <", value, "dimValueMaps"); + return (Criteria) this; + } + + public Criteria andDimValueMapsLessThanOrEqualTo(String value) { + addCriterion("dim_value_maps <=", value, "dimValueMaps"); + return (Criteria) this; + } + + public Criteria andDimValueMapsLike(String value) { + addCriterion("dim_value_maps like", value, "dimValueMaps"); + return (Criteria) this; + } + + public Criteria andDimValueMapsNotLike(String value) { + addCriterion("dim_value_maps not like", value, "dimValueMaps"); + return (Criteria) this; + } + + public Criteria andDimValueMapsIn(List values) { + addCriterion("dim_value_maps in", values, "dimValueMaps"); + return (Criteria) this; + } + + public Criteria andDimValueMapsNotIn(List values) { + addCriterion("dim_value_maps not in", values, "dimValueMaps"); + return (Criteria) this; + } + + public Criteria andDimValueMapsBetween(String value1, String value2) { + addCriterion("dim_value_maps between", value1, value2, "dimValueMaps"); + return (Criteria) this; + } + + public Criteria andDimValueMapsNotBetween(String value1, String value2) { + addCriterion("dim_value_maps not between", value1, value2, "dimValueMaps"); + return (Criteria) this; + } } /** @@ -1272,6 +1342,38 @@ 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; @@ -1307,37 +1409,5 @@ 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/DimensionDOWithDictInfo.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDOWithDictInfo.java deleted file mode 100644 index 468c7be2b..000000000 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DimensionDOWithDictInfo.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tencent.supersonic.semantic.model.domain.dataobject; - -import lombok.Data; - - -@Data -public class DimensionDOWithDictInfo extends DimensionDO { - - - private boolean isDictInfo; - - -} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainDO.java index 22639f934..48e791125 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainDO.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainDO.java @@ -74,12 +74,6 @@ public class DomainDO { */ private String viewOrg; - - /** - * 主题域实体信息 - */ - private String entity; - /** * 自增ID * @@ -331,12 +325,4 @@ public class DomainDO { public void setViewOrg(String viewOrg) { this.viewOrg = viewOrg == null ? null : viewOrg.trim(); } - - public String getEntity() { - return entity; - } - - public void setEntity(String entity) { - this.entity = entity; - } } \ 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 36f5ea790..b72c33737 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 @@ -38,13 +38,6 @@ public class DomainDOExample { oredCriteria = new ArrayList(); } - /** - * @mbg.generated - */ - public String getOrderByClause() { - return orderByClause; - } - /** * @mbg.generated */ @@ -55,8 +48,8 @@ public class DomainDOExample { /** * @mbg.generated */ - public boolean isDistinct() { - return distinct; + public String getOrderByClause() { + return orderByClause; } /** @@ -66,6 +59,13 @@ public class DomainDOExample { this.distinct = distinct; } + /** + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + /** * @mbg.generated */ @@ -117,13 +117,6 @@ public class DomainDOExample { distinct = false; } - /** - * @mbg.generated - */ - public Integer getLimitStart() { - return limitStart; - } - /** * @mbg.generated */ @@ -134,8 +127,8 @@ public class DomainDOExample { /** * @mbg.generated */ - public Integer getLimitEnd() { - return limitEnd; + public Integer getLimitStart() { + return limitStart; } /** @@ -145,6 +138,13 @@ public class DomainDOExample { this.limitEnd = limitEnd; } + /** + * @mbg.generated + */ + public Integer getLimitEnd() { + return limitEnd; + } + /** * s2_domain null */ @@ -1142,6 +1142,38 @@ 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; @@ -1177,37 +1209,5 @@ 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/DomainExtendDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainExtendDO.java deleted file mode 100644 index f8228c628..000000000 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainExtendDO.java +++ /dev/null @@ -1,255 +0,0 @@ -package com.tencent.supersonic.semantic.model.domain.dataobject; - -import java.util.Date; - -public class DomainExtendDO { - - /** - * - */ - private Long id; - - /** - * 主题域id - */ - private Long domainId; - - /** - * 默认指标 - */ - private String defaultMetrics; - - /** - * 创建时间 - */ - private Date createdAt; - - /** - * 更新时间 - */ - private Date updatedAt; - - /** - * 创建人 - */ - private String createdBy; - - /** - * 更新人 - */ - private String updatedBy; - - /** - * 主题域扩展信息状态, 0-删除,1-生效 - */ - private Integer status; - - /** - * 不可见指标信息 - */ - private String metricsInvisible; - - /** - * 不可见维度信息 - */ - private String dimensionsInvisible; - - /** - * 实体信息 - */ - private String entityInfo; - - /** - * @return id - */ - public Long getId() { - return id; - } - - /** - * @param id - */ - public void setId(Long id) { - this.id = id; - } - - /** - * 主题域id - * - * @return domain_id 主题域id - */ - public Long getDomainId() { - return domainId; - } - - /** - * 主题域id - * - * @param domainId 主题域id - */ - public void setDomainId(Long domainId) { - this.domainId = domainId; - } - - /** - * 默认指标 - * - * @return default_metrics 默认指标 - */ - public String getDefaultMetrics() { - return defaultMetrics; - } - - /** - * 默认指标 - * - * @param defaultMetrics 默认指标 - */ - public void setDefaultMetrics(String defaultMetrics) { - this.defaultMetrics = defaultMetrics == null ? null : defaultMetrics.trim(); - } - - /** - * 创建时间 - * - * @return created_at 创建时间 - */ - public Date getCreatedAt() { - return createdAt; - } - - /** - * 创建时间 - * - * @param createdAt 创建时间 - */ - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - /** - * 更新时间 - * - * @return updated_at 更新时间 - */ - public Date getUpdatedAt() { - return updatedAt; - } - - /** - * 更新时间 - * - * @param updatedAt 更新时间 - */ - public void setUpdatedAt(Date updatedAt) { - this.updatedAt = updatedAt; - } - - /** - * 创建人 - * - * @return created_by 创建人 - */ - public String getCreatedBy() { - return createdBy; - } - - /** - * 创建人 - * - * @param createdBy 创建人 - */ - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy == null ? null : createdBy.trim(); - } - - /** - * 更新人 - * - * @return updated_by 更新人 - */ - public String getUpdatedBy() { - return updatedBy; - } - - /** - * 更新人 - * - * @param updatedBy 更新人 - */ - public void setUpdatedBy(String updatedBy) { - this.updatedBy = updatedBy == null ? null : updatedBy.trim(); - } - - /** - * 主题域扩展信息状态, 0-删除,1-生效 - * - * @return status 主题域扩展信息状态, 0-删除,1-生效 - */ - public Integer getStatus() { - return status; - } - - /** - * 主题域扩展信息状态, 0-删除,1-生效 - * - * @param status 主题域扩展信息状态, 0-删除,1-生效 - */ - public void setStatus(Integer status) { - this.status = status; - } - - /** - * 不可见指标信息 - * - * @return metrics_invisible 不可见指标信息 - */ - public String getMetricsInvisible() { - return metricsInvisible; - } - - /** - * 不可见指标信息 - * - * @param metricsInvisible 不可见指标信息 - */ - public void setMetricsInvisible(String metricsInvisible) { - this.metricsInvisible = metricsInvisible == null ? null : metricsInvisible.trim(); - } - - /** - * 不可见维度信息 - * - * @return dimensions_invisible 不可见维度信息 - */ - public String getDimensionsInvisible() { - return dimensionsInvisible; - } - - /** - * 不可见维度信息 - * - * @param dimensionsInvisible 不可见维度信息 - */ - public void setDimensionsInvisible(String dimensionsInvisible) { - this.dimensionsInvisible = dimensionsInvisible == null ? null : dimensionsInvisible.trim(); - } - - /** - * 实体信息 - * - * @return entity_info 实体信息 - */ - public String getEntityInfo() { - return entityInfo; - } - - /** - * 实体信息 - * - * @param entityInfo 实体信息 - */ - public void setEntityInfo(String entityInfo) { - this.entityInfo = entityInfo == null ? null : entityInfo.trim(); - } -} \ 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 2c7a526a6..040bb2e55 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 @@ -12,7 +12,7 @@ public class MetricDO { /** * 主体域ID */ - private Long domainId; + private Long modelId; /** * 指标名称 @@ -101,19 +101,19 @@ public class MetricDO { /** * 主体域ID * - * @return domain_id 主体域ID + * @return model_id 主体域ID */ - public Long getDomainId() { - return domainId; + public Long getModelId() { + return modelId; } /** * 主体域ID * - * @param domainId 主体域ID + * @param modelId 主体域ID */ - public void setDomainId(Long domainId) { - this.domainId = domainId; + public void setModelId(Long modelId) { + this.modelId = modelId; } /** 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 673a42cad..98d32eddf 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 @@ -38,13 +38,6 @@ public class MetricDOExample { oredCriteria = new ArrayList(); } - /** - * @mbg.generated - */ - public String getOrderByClause() { - return orderByClause; - } - /** * @mbg.generated */ @@ -55,8 +48,8 @@ public class MetricDOExample { /** * @mbg.generated */ - public boolean isDistinct() { - return distinct; + public String getOrderByClause() { + return orderByClause; } /** @@ -66,6 +59,13 @@ public class MetricDOExample { this.distinct = distinct; } + /** + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + /** * @mbg.generated */ @@ -117,13 +117,6 @@ public class MetricDOExample { distinct = false; } - /** - * @mbg.generated - */ - public Integer getLimitStart() { - return limitStart; - } - /** * @mbg.generated */ @@ -134,8 +127,8 @@ public class MetricDOExample { /** * @mbg.generated */ - public Integer getLimitEnd() { - return limitEnd; + public Integer getLimitStart() { + return limitStart; } /** @@ -145,6 +138,13 @@ public class MetricDOExample { this.limitEnd = limitEnd; } + /** + * @mbg.generated + */ + public Integer getLimitEnd() { + return limitEnd; + } + /** * s2_metric null */ @@ -250,63 +250,63 @@ public class MetricDOExample { return (Criteria) this; } - public Criteria andDomainIdIsNull() { - addCriterion("domain_id is null"); + public Criteria andModelIdIsNull() { + addCriterion("model_id is null"); return (Criteria) this; } - public Criteria andDomainIdIsNotNull() { - addCriterion("domain_id is not null"); + public Criteria andModelIdIsNotNull() { + addCriterion("model_id is not null"); return (Criteria) this; } - public Criteria andDomainIdEqualTo(Long value) { - addCriterion("domain_id =", value, "domainId"); + public Criteria andModelIdEqualTo(Long value) { + addCriterion("model_id =", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotEqualTo(Long value) { - addCriterion("domain_id <>", value, "domainId"); + public Criteria andModelIdNotEqualTo(Long value) { + addCriterion("model_id <>", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdGreaterThan(Long value) { - addCriterion("domain_id >", value, "domainId"); + public Criteria andModelIdGreaterThan(Long value) { + addCriterion("model_id >", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdGreaterThanOrEqualTo(Long value) { - addCriterion("domain_id >=", value, "domainId"); + public Criteria andModelIdGreaterThanOrEqualTo(Long value) { + addCriterion("model_id >=", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdLessThan(Long value) { - addCriterion("domain_id <", value, "domainId"); + public Criteria andModelIdLessThan(Long value) { + addCriterion("model_id <", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdLessThanOrEqualTo(Long value) { - addCriterion("domain_id <=", value, "domainId"); + public Criteria andModelIdLessThanOrEqualTo(Long value) { + addCriterion("model_id <=", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdIn(List values) { - addCriterion("domain_id in", values, "domainId"); + public Criteria andModelIdIn(List values) { + addCriterion("model_id in", values, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotIn(List values) { - addCriterion("domain_id not in", values, "domainId"); + public Criteria andModelIdNotIn(List values) { + addCriterion("model_id not in", values, "modelId"); return (Criteria) this; } - public Criteria andDomainIdBetween(Long value1, Long value2) { - addCriterion("domain_id between", value1, value2, "domainId"); + public Criteria andModelIdBetween(Long value1, Long value2) { + addCriterion("model_id between", value1, value2, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotBetween(Long value1, Long value2) { - addCriterion("domain_id not between", value1, value2, "domainId"); + public Criteria andModelIdNotBetween(Long value1, Long value2) { + addCriterion("model_id not between", value1, value2, "modelId"); return (Criteria) this; } @@ -1212,6 +1212,38 @@ 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; @@ -1247,37 +1279,5 @@ 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 new file mode 100644 index 000000000..c16bf1852 --- /dev/null +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDO.java @@ -0,0 +1,272 @@ +package com.tencent.supersonic.semantic.model.domain.dataobject; + +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/DomainExtendDOExample.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDOExample.java similarity index 57% rename from semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainExtendDOExample.java rename to semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDOExample.java index 22fa5bb78..7721ae42f 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/DomainExtendDOExample.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/ModelDOExample.java @@ -4,47 +4,40 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -public class DomainExtendDOExample { +public class ModelDOExample { /** - * s2_domain_extend + * s2_model */ protected String orderByClause; /** - * s2_domain_extend + * s2_model */ protected boolean distinct; /** - * s2_domain_extend + * s2_model */ protected List oredCriteria; /** - * s2_domain_extend + * s2_model */ protected Integer limitStart; /** - * s2_domain_extend + * s2_model */ protected Integer limitEnd; /** * @mbg.generated */ - public DomainExtendDOExample() { + public ModelDOExample() { oredCriteria = new ArrayList(); } - /** - * @mbg.generated - */ - public String getOrderByClause() { - return orderByClause; - } - /** * @mbg.generated */ @@ -55,8 +48,8 @@ public class DomainExtendDOExample { /** * @mbg.generated */ - public boolean isDistinct() { - return distinct; + public String getOrderByClause() { + return orderByClause; } /** @@ -66,6 +59,13 @@ public class DomainExtendDOExample { this.distinct = distinct; } + /** + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + /** * @mbg.generated */ @@ -117,13 +117,6 @@ public class DomainExtendDOExample { distinct = false; } - /** - * @mbg.generated - */ - public Integer getLimitStart() { - return limitStart; - } - /** * @mbg.generated */ @@ -134,8 +127,8 @@ public class DomainExtendDOExample { /** * @mbg.generated */ - public Integer getLimitEnd() { - return limitEnd; + public Integer getLimitStart() { + return limitStart; } /** @@ -146,7 +139,14 @@ public class DomainExtendDOExample { } /** - * s2_domain_extend null + * @mbg.generated + */ + public Integer getLimitEnd() { + return limitEnd; + } + + /** + * s2_model null */ protected abstract static class GeneratedCriteria { @@ -250,6 +250,146 @@ public class DomainExtendDOExample { return (Criteria) this; } + public Criteria andNameIsNull() { + addCriterion("name is null"); + return (Criteria) this; + } + + public Criteria andNameIsNotNull() { + addCriterion("name is not null"); + return (Criteria) this; + } + + public Criteria andNameEqualTo(String value) { + addCriterion("name =", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotEqualTo(String value) { + addCriterion("name <>", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThan(String value) { + addCriterion("name >", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThanOrEqualTo(String value) { + addCriterion("name >=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThan(String value) { + addCriterion("name <", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThanOrEqualTo(String value) { + addCriterion("name <=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLike(String value) { + addCriterion("name like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotLike(String value) { + addCriterion("name not like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameIn(List values) { + addCriterion("name in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameNotIn(List values) { + addCriterion("name not in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameBetween(String value1, String value2) { + addCriterion("name between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andNameNotBetween(String value1, String value2) { + addCriterion("name not between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andBizNameIsNull() { + addCriterion("biz_name is null"); + return (Criteria) this; + } + + public Criteria andBizNameIsNotNull() { + addCriterion("biz_name is not null"); + return (Criteria) this; + } + + public Criteria andBizNameEqualTo(String value) { + addCriterion("biz_name =", value, "bizName"); + return (Criteria) this; + } + + public Criteria andBizNameNotEqualTo(String value) { + addCriterion("biz_name <>", value, "bizName"); + return (Criteria) this; + } + + public Criteria andBizNameGreaterThan(String value) { + addCriterion("biz_name >", value, "bizName"); + return (Criteria) this; + } + + public Criteria andBizNameGreaterThanOrEqualTo(String value) { + addCriterion("biz_name >=", value, "bizName"); + return (Criteria) this; + } + + public Criteria andBizNameLessThan(String value) { + addCriterion("biz_name <", value, "bizName"); + return (Criteria) this; + } + + public Criteria andBizNameLessThanOrEqualTo(String value) { + addCriterion("biz_name <=", value, "bizName"); + return (Criteria) this; + } + + public Criteria andBizNameLike(String value) { + addCriterion("biz_name like", value, "bizName"); + return (Criteria) this; + } + + public Criteria andBizNameNotLike(String value) { + addCriterion("biz_name not like", value, "bizName"); + return (Criteria) this; + } + + public Criteria andBizNameIn(List values) { + addCriterion("biz_name in", values, "bizName"); + return (Criteria) this; + } + + public Criteria andBizNameNotIn(List values) { + addCriterion("biz_name not in", values, "bizName"); + return (Criteria) this; + } + + public Criteria andBizNameBetween(String value1, String value2) { + addCriterion("biz_name between", value1, value2, "bizName"); + return (Criteria) this; + } + + public Criteria andBizNameNotBetween(String value1, String value2) { + addCriterion("biz_name not between", value1, value2, "bizName"); + return (Criteria) this; + } + public Criteria andDomainIdIsNull() { addCriterion("domain_id is null"); return (Criteria) this; @@ -310,188 +450,343 @@ public class DomainExtendDOExample { return (Criteria) this; } - public Criteria andDefaultMetricsIsNull() { - addCriterion("default_metrics is null"); + public Criteria andViewerIsNull() { + addCriterion("viewer is null"); return (Criteria) this; } - public Criteria andDefaultMetricsIsNotNull() { - addCriterion("default_metrics is not null"); + public Criteria andViewerIsNotNull() { + addCriterion("viewer is not null"); return (Criteria) this; } - public Criteria andDefaultMetricsEqualTo(String value) { - addCriterion("default_metrics =", value, "defaultMetrics"); + public Criteria andViewerEqualTo(String value) { + addCriterion("viewer =", value, "viewer"); return (Criteria) this; } - public Criteria andDefaultMetricsNotEqualTo(String value) { - addCriterion("default_metrics <>", value, "defaultMetrics"); + public Criteria andViewerNotEqualTo(String value) { + addCriterion("viewer <>", value, "viewer"); return (Criteria) this; } - public Criteria andDefaultMetricsGreaterThan(String value) { - addCriterion("default_metrics >", value, "defaultMetrics"); + public Criteria andViewerGreaterThan(String value) { + addCriterion("viewer >", value, "viewer"); return (Criteria) this; } - public Criteria andDefaultMetricsLessThan(String value) { - addCriterion("default_metrics <", value, "defaultMetrics"); + public Criteria andViewerGreaterThanOrEqualTo(String value) { + addCriterion("viewer >=", value, "viewer"); return (Criteria) this; } - public Criteria andDefaultMetricsLessThanOrEqualTo(String value) { - addCriterion("default_metrics <=", value, "defaultMetrics"); + public Criteria andViewerLessThan(String value) { + addCriterion("viewer <", value, "viewer"); return (Criteria) this; } - public Criteria andDefaultMetricsLike(String value) { - addCriterion("default_metrics like", value, "defaultMetrics"); + public Criteria andViewerLessThanOrEqualTo(String value) { + addCriterion("viewer <=", value, "viewer"); return (Criteria) this; } - public Criteria andDefaultMetricsNotLike(String value) { - addCriterion("default_metrics not like", value, "defaultMetrics"); + public Criteria andViewerLike(String value) { + addCriterion("viewer like", value, "viewer"); return (Criteria) this; } - public Criteria andDefaultMetricsIn(List values) { - addCriterion("default_metrics in", values, "defaultMetrics"); + public Criteria andViewerNotLike(String value) { + addCriterion("viewer not like", value, "viewer"); return (Criteria) this; } - public Criteria andDefaultMetricsNotIn(List values) { - addCriterion("default_metrics not in", values, "defaultMetrics"); + public Criteria andViewerIn(List values) { + addCriterion("viewer in", values, "viewer"); return (Criteria) this; } - public Criteria andDefaultMetricsBetween(String value1, String value2) { - addCriterion("default_metrics between", value1, value2, "defaultMetrics"); + public Criteria andViewerNotIn(List values) { + addCriterion("viewer not in", values, "viewer"); return (Criteria) this; } - public Criteria andDefaultMetricsNotBetween(String value1, String value2) { - addCriterion("default_metrics not between", value1, value2, "defaultMetrics"); + public Criteria andViewerBetween(String value1, String value2) { + addCriterion("viewer between", value1, value2, "viewer"); return (Criteria) this; } - public Criteria andCreatedAtIsNull() { - addCriterion("created_at is null"); + public Criteria andViewerNotBetween(String value1, String value2) { + addCriterion("viewer not between", value1, value2, "viewer"); return (Criteria) this; } - public Criteria andCreatedAtIsNotNull() { - addCriterion("created_at is not null"); + public Criteria andViewOrgIsNull() { + addCriterion("view_org is null"); return (Criteria) this; } - public Criteria andCreatedAtEqualTo(Date value) { - addCriterion("created_at =", value, "createdAt"); + public Criteria andViewOrgIsNotNull() { + addCriterion("view_org is not null"); return (Criteria) this; } - public Criteria andCreatedAtNotEqualTo(Date value) { - addCriterion("created_at <>", value, "createdAt"); + public Criteria andViewOrgEqualTo(String value) { + addCriterion("view_org =", value, "viewOrg"); return (Criteria) this; } - public Criteria andCreatedAtGreaterThan(Date value) { - addCriterion("created_at >", value, "createdAt"); + public Criteria andViewOrgNotEqualTo(String value) { + addCriterion("view_org <>", value, "viewOrg"); return (Criteria) this; } - public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) { - addCriterion("created_at >=", value, "createdAt"); + public Criteria andViewOrgGreaterThan(String value) { + addCriterion("view_org >", value, "viewOrg"); return (Criteria) this; } - public Criteria andCreatedAtLessThan(Date value) { - addCriterion("created_at <", value, "createdAt"); + public Criteria andViewOrgGreaterThanOrEqualTo(String value) { + addCriterion("view_org >=", value, "viewOrg"); return (Criteria) this; } - public Criteria andCreatedAtLessThanOrEqualTo(Date value) { - addCriterion("created_at <=", value, "createdAt"); + public Criteria andViewOrgLessThan(String value) { + addCriterion("view_org <", value, "viewOrg"); return (Criteria) this; } - public Criteria andCreatedAtIn(List values) { - addCriterion("created_at in", values, "createdAt"); + public Criteria andViewOrgLessThanOrEqualTo(String value) { + addCriterion("view_org <=", value, "viewOrg"); return (Criteria) this; } - public Criteria andCreatedAtNotIn(List values) { - addCriterion("created_at not in", values, "createdAt"); + public Criteria andViewOrgLike(String value) { + addCriterion("view_org like", value, "viewOrg"); return (Criteria) this; } - public Criteria andCreatedAtBetween(Date value1, Date value2) { - addCriterion("created_at between", value1, value2, "createdAt"); + public Criteria andViewOrgNotLike(String value) { + addCriterion("view_org not like", value, "viewOrg"); return (Criteria) this; } - public Criteria andCreatedAtNotBetween(Date value1, Date value2) { - addCriterion("created_at not between", value1, value2, "createdAt"); + public Criteria andViewOrgIn(List values) { + addCriterion("view_org in", values, "viewOrg"); return (Criteria) this; } - public Criteria andUpdatedAtIsNull() { - addCriterion("updated_at is null"); + public Criteria andViewOrgNotIn(List values) { + addCriterion("view_org not in", values, "viewOrg"); return (Criteria) this; } - public Criteria andUpdatedAtIsNotNull() { - addCriterion("updated_at is not null"); + public Criteria andViewOrgBetween(String value1, String value2) { + addCriterion("view_org between", value1, value2, "viewOrg"); return (Criteria) this; } - public Criteria andUpdatedAtEqualTo(Date value) { - addCriterion("updated_at =", value, "updatedAt"); + public Criteria andViewOrgNotBetween(String value1, String value2) { + addCriterion("view_org not between", value1, value2, "viewOrg"); return (Criteria) this; } - public Criteria andUpdatedAtNotEqualTo(Date value) { - addCriterion("updated_at <>", value, "updatedAt"); + public Criteria andAdminIsNull() { + addCriterion("admin is null"); return (Criteria) this; } - public Criteria andUpdatedAtGreaterThan(Date value) { - addCriterion("updated_at >", value, "updatedAt"); + public Criteria andAdminIsNotNull() { + addCriterion("admin is not null"); return (Criteria) this; } - public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) { - addCriterion("updated_at >=", value, "updatedAt"); + public Criteria andAdminEqualTo(String value) { + addCriterion("admin =", value, "admin"); return (Criteria) this; } - public Criteria andUpdatedAtLessThan(Date value) { - addCriterion("updated_at <", value, "updatedAt"); + public Criteria andAdminNotEqualTo(String value) { + addCriterion("admin <>", value, "admin"); return (Criteria) this; } - public Criteria andUpdatedAtLessThanOrEqualTo(Date value) { - addCriterion("updated_at <=", value, "updatedAt"); + public Criteria andAdminGreaterThan(String value) { + addCriterion("admin >", value, "admin"); return (Criteria) this; } - public Criteria andUpdatedAtIn(List values) { - addCriterion("updated_at in", values, "updatedAt"); + public Criteria andAdminGreaterThanOrEqualTo(String value) { + addCriterion("admin >=", value, "admin"); return (Criteria) this; } - public Criteria andUpdatedAtNotIn(List values) { - addCriterion("updated_at not in", values, "updatedAt"); + public Criteria andAdminLessThan(String value) { + addCriterion("admin <", value, "admin"); return (Criteria) this; } - public Criteria andUpdatedAtBetween(Date value1, Date value2) { - addCriterion("updated_at between", value1, value2, "updatedAt"); + public Criteria andAdminLessThanOrEqualTo(String value) { + addCriterion("admin <=", value, "admin"); return (Criteria) this; } - public Criteria andUpdatedAtNotBetween(Date value1, Date value2) { - addCriterion("updated_at not between", value1, value2, "updatedAt"); + public Criteria andAdminLike(String value) { + addCriterion("admin like", value, "admin"); + return (Criteria) this; + } + + public Criteria andAdminNotLike(String value) { + addCriterion("admin not like", value, "admin"); + return (Criteria) this; + } + + public Criteria andAdminIn(List values) { + addCriterion("admin in", values, "admin"); + return (Criteria) this; + } + + public Criteria andAdminNotIn(List values) { + addCriterion("admin not in", values, "admin"); + return (Criteria) this; + } + + public Criteria andAdminBetween(String value1, String value2) { + addCriterion("admin between", value1, value2, "admin"); + return (Criteria) this; + } + + public Criteria andAdminNotBetween(String value1, String value2) { + addCriterion("admin not between", value1, value2, "admin"); + return (Criteria) this; + } + + public Criteria andAdminOrgIsNull() { + addCriterion("admin_org is null"); + return (Criteria) this; + } + + public Criteria andAdminOrgIsNotNull() { + addCriterion("admin_org is not null"); + return (Criteria) this; + } + + public Criteria andAdminOrgEqualTo(String value) { + addCriterion("admin_org =", value, "adminOrg"); + return (Criteria) this; + } + + public Criteria andAdminOrgNotEqualTo(String value) { + addCriterion("admin_org <>", value, "adminOrg"); + return (Criteria) this; + } + + public Criteria andAdminOrgGreaterThan(String value) { + addCriterion("admin_org >", value, "adminOrg"); + return (Criteria) this; + } + + public Criteria andAdminOrgGreaterThanOrEqualTo(String value) { + addCriterion("admin_org >=", value, "adminOrg"); + return (Criteria) this; + } + + public Criteria andAdminOrgLessThan(String value) { + addCriterion("admin_org <", value, "adminOrg"); + return (Criteria) this; + } + + public Criteria andAdminOrgLessThanOrEqualTo(String value) { + addCriterion("admin_org <=", value, "adminOrg"); + return (Criteria) this; + } + + public Criteria andAdminOrgLike(String value) { + addCriterion("admin_org like", value, "adminOrg"); + return (Criteria) this; + } + + public Criteria andAdminOrgNotLike(String value) { + addCriterion("admin_org not like", value, "adminOrg"); + return (Criteria) this; + } + + public Criteria andAdminOrgIn(List values) { + addCriterion("admin_org in", values, "adminOrg"); + return (Criteria) this; + } + + public Criteria andAdminOrgNotIn(List values) { + addCriterion("admin_org not in", values, "adminOrg"); + return (Criteria) this; + } + + public Criteria andAdminOrgBetween(String value1, String value2) { + addCriterion("admin_org between", value1, value2, "adminOrg"); + return (Criteria) this; + } + + public Criteria andAdminOrgNotBetween(String value1, String value2) { + addCriterion("admin_org not between", value1, value2, "adminOrg"); + return (Criteria) this; + } + + public Criteria andIsOpenIsNull() { + addCriterion("is_open is null"); + return (Criteria) this; + } + + public Criteria andIsOpenIsNotNull() { + addCriterion("is_open is not null"); + return (Criteria) this; + } + + public Criteria andIsOpenEqualTo(Integer value) { + addCriterion("is_open =", value, "isOpen"); + return (Criteria) this; + } + + public Criteria andIsOpenNotEqualTo(Integer value) { + addCriterion("is_open <>", value, "isOpen"); + return (Criteria) this; + } + + public Criteria andIsOpenGreaterThan(Integer value) { + addCriterion("is_open >", value, "isOpen"); + return (Criteria) this; + } + + public Criteria andIsOpenGreaterThanOrEqualTo(Integer value) { + addCriterion("is_open >=", value, "isOpen"); + return (Criteria) this; + } + + public Criteria andIsOpenLessThan(Integer value) { + addCriterion("is_open <", value, "isOpen"); + return (Criteria) this; + } + + public Criteria andIsOpenLessThanOrEqualTo(Integer value) { + addCriterion("is_open <=", value, "isOpen"); + return (Criteria) this; + } + + public Criteria andIsOpenIn(List values) { + addCriterion("is_open in", values, "isOpen"); + return (Criteria) this; + } + + public Criteria andIsOpenNotIn(List values) { + addCriterion("is_open not in", values, "isOpen"); + return (Criteria) this; + } + + public Criteria andIsOpenBetween(Integer value1, Integer value2) { + addCriterion("is_open between", value1, value2, "isOpen"); + return (Criteria) this; + } + + public Criteria andIsOpenNotBetween(Integer value1, Integer value2) { + addCriterion("is_open not between", value1, value2, "isOpen"); return (Criteria) this; } @@ -565,6 +860,66 @@ public class DomainExtendDOExample { return (Criteria) this; } + public Criteria andCreatedAtIsNull() { + addCriterion("created_at is null"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNotNull() { + addCriterion("created_at is not null"); + return (Criteria) this; + } + + public Criteria andCreatedAtEqualTo(Date value) { + addCriterion("created_at =", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotEqualTo(Date value) { + addCriterion("created_at <>", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThan(Date value) { + addCriterion("created_at >", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("created_at >=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThan(Date value) { + addCriterion("created_at <", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThanOrEqualTo(Date value) { + addCriterion("created_at <=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtIn(List values) { + addCriterion("created_at in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotIn(List values) { + addCriterion("created_at not in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtBetween(Date value1, Date value2) { + addCriterion("created_at between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotBetween(Date value1, Date value2) { + addCriterion("created_at not between", value1, value2, "createdAt"); + return (Criteria) this; + } + public Criteria andUpdatedByIsNull() { addCriterion("updated_by is null"); return (Criteria) this; @@ -635,69 +990,69 @@ public class DomainExtendDOExample { return (Criteria) this; } - public Criteria andStatusIsNull() { - addCriterion("status is null"); + public Criteria andUpdatedAtIsNull() { + addCriterion("updated_at is null"); return (Criteria) this; } - public Criteria andStatusIsNotNull() { - addCriterion("status is not null"); + public Criteria andUpdatedAtIsNotNull() { + addCriterion("updated_at is not null"); return (Criteria) this; } - public Criteria andStatusEqualTo(Integer value) { - addCriterion("status =", value, "status"); + public Criteria andUpdatedAtEqualTo(Date value) { + addCriterion("updated_at =", value, "updatedAt"); return (Criteria) this; } - public Criteria andStatusNotEqualTo(Integer value) { - addCriterion("status <>", value, "status"); + public Criteria andUpdatedAtNotEqualTo(Date value) { + addCriterion("updated_at <>", value, "updatedAt"); return (Criteria) this; } - public Criteria andStatusGreaterThan(Integer value) { - addCriterion("status >", value, "status"); + public Criteria andUpdatedAtGreaterThan(Date value) { + addCriterion("updated_at >", value, "updatedAt"); return (Criteria) this; } - public Criteria andStatusGreaterThanOrEqualTo(Integer value) { - addCriterion("status >=", value, "status"); + public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("updated_at >=", value, "updatedAt"); return (Criteria) this; } - public Criteria andStatusLessThan(Integer value) { - addCriterion("status <", value, "status"); + public Criteria andUpdatedAtLessThan(Date value) { + addCriterion("updated_at <", value, "updatedAt"); return (Criteria) this; } - public Criteria andStatusLessThanOrEqualTo(Integer value) { - addCriterion("status <=", value, "status"); + public Criteria andUpdatedAtLessThanOrEqualTo(Date value) { + addCriterion("updated_at <=", value, "updatedAt"); return (Criteria) this; } - public Criteria andStatusIn(List values) { - addCriterion("status in", values, "status"); + public Criteria andUpdatedAtIn(List values) { + addCriterion("updated_at in", values, "updatedAt"); return (Criteria) this; } - public Criteria andStatusNotIn(List values) { - addCriterion("status not in", values, "status"); + public Criteria andUpdatedAtNotIn(List values) { + addCriterion("updated_at not in", values, "updatedAt"); return (Criteria) this; } - public Criteria andStatusBetween(Integer value1, Integer value2) { - addCriterion("status between", value1, value2, "status"); + public Criteria andUpdatedAtBetween(Date value1, Date value2) { + addCriterion("updated_at between", value1, value2, "updatedAt"); return (Criteria) this; } - public Criteria andStatusNotBetween(Integer value1, Integer value2) { - addCriterion("status not between", value1, value2, "status"); + public Criteria andUpdatedAtNotBetween(Date value1, Date value2) { + addCriterion("updated_at not between", value1, value2, "updatedAt"); return (Criteria) this; } } /** - * s2_domain_extend + * s2_model */ public static class Criteria extends GeneratedCriteria { @@ -707,7 +1062,7 @@ public class DomainExtendDOExample { } /** - * s2_domain_extend null + * s2_model null */ public static class Criterion { @@ -727,6 +1082,38 @@ public class DomainExtendDOExample { 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; @@ -762,37 +1149,5 @@ public class DomainExtendDOExample { 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/UpdateDimValueDictBatchDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/UpdateDimValueDictBatchDO.java deleted file mode 100644 index 50aab4671..000000000 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/UpdateDimValueDictBatchDO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tencent.supersonic.semantic.model.domain.dataobject; - -import java.util.ArrayList; -import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class UpdateDimValueDictBatchDO { - - private List itemIdList = new ArrayList<>(); - private String rules; -} \ 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 fc72737c8..df10e714a 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 @@ -12,7 +12,7 @@ public class ViewInfoDO { /** * */ - private Long domainId; + private Long modelId; /** * datasource、dimension、metric @@ -59,17 +59,17 @@ public class ViewInfoDO { } /** - * @return domain_id + * @return model_id */ - public Long getDomainId() { - return domainId; + public Long getModelId() { + return modelId; } /** - * @param domainId + * @param modelId */ - public void setDomainId(Long domainId) { - this.domainId = domainId; + public void setModelId(Long modelId) { + this.modelId = modelId; } /** 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 9de28bcda..912796161 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 @@ -38,13 +38,6 @@ public class ViewInfoDOExample { oredCriteria = new ArrayList(); } - /** - * @mbg.generated - */ - public String getOrderByClause() { - return orderByClause; - } - /** * @mbg.generated */ @@ -55,8 +48,8 @@ public class ViewInfoDOExample { /** * @mbg.generated */ - public boolean isDistinct() { - return distinct; + public String getOrderByClause() { + return orderByClause; } /** @@ -66,6 +59,13 @@ public class ViewInfoDOExample { this.distinct = distinct; } + /** + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + /** * @mbg.generated */ @@ -117,13 +117,6 @@ public class ViewInfoDOExample { distinct = false; } - /** - * @mbg.generated - */ - public Integer getLimitStart() { - return limitStart; - } - /** * @mbg.generated */ @@ -134,8 +127,8 @@ public class ViewInfoDOExample { /** * @mbg.generated */ - public Integer getLimitEnd() { - return limitEnd; + public Integer getLimitStart() { + return limitStart; } /** @@ -145,6 +138,13 @@ public class ViewInfoDOExample { this.limitEnd = limitEnd; } + /** + * @mbg.generated + */ + public Integer getLimitEnd() { + return limitEnd; + } + /** * s2_view_info null */ @@ -250,63 +250,63 @@ public class ViewInfoDOExample { return (Criteria) this; } - public Criteria andDomainIdIsNull() { - addCriterion("domain_id is null"); + public Criteria andModelIdIsNull() { + addCriterion("model_id is null"); return (Criteria) this; } - public Criteria andDomainIdIsNotNull() { - addCriterion("domain_id is not null"); + public Criteria andModelIdIsNotNull() { + addCriterion("model_id is not null"); return (Criteria) this; } - public Criteria andDomainIdEqualTo(Long value) { - addCriterion("domain_id =", value, "domainId"); + public Criteria andModelIdEqualTo(Long value) { + addCriterion("model_id =", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotEqualTo(Long value) { - addCriterion("domain_id <>", value, "domainId"); + public Criteria andModelIdNotEqualTo(Long value) { + addCriterion("model_id <>", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdGreaterThan(Long value) { - addCriterion("domain_id >", value, "domainId"); + public Criteria andModelIdGreaterThan(Long value) { + addCriterion("model_id >", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdGreaterThanOrEqualTo(Long value) { - addCriterion("domain_id >=", value, "domainId"); + public Criteria andModelIdGreaterThanOrEqualTo(Long value) { + addCriterion("model_id >=", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdLessThan(Long value) { - addCriterion("domain_id <", value, "domainId"); + public Criteria andModelIdLessThan(Long value) { + addCriterion("model_id <", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdLessThanOrEqualTo(Long value) { - addCriterion("domain_id <=", value, "domainId"); + public Criteria andModelIdLessThanOrEqualTo(Long value) { + addCriterion("model_id <=", value, "modelId"); return (Criteria) this; } - public Criteria andDomainIdIn(List values) { - addCriterion("domain_id in", values, "domainId"); + public Criteria andModelIdIn(List values) { + addCriterion("model_id in", values, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotIn(List values) { - addCriterion("domain_id not in", values, "domainId"); + public Criteria andModelIdNotIn(List values) { + addCriterion("model_id not in", values, "modelId"); return (Criteria) this; } - public Criteria andDomainIdBetween(Long value1, Long value2) { - addCriterion("domain_id between", value1, value2, "domainId"); + public Criteria andModelIdBetween(Long value1, Long value2) { + addCriterion("model_id between", value1, value2, "modelId"); return (Criteria) this; } - public Criteria andDomainIdNotBetween(Long value1, Long value2) { - addCriterion("domain_id not between", value1, value2, "domainId"); + public Criteria andModelIdNotBetween(Long value1, Long value2) { + addCriterion("model_id not between", value1, value2, "modelId"); return (Criteria) this; } @@ -672,6 +672,38 @@ 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; @@ -707,37 +739,5 @@ 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/manager/DatasourceYamlManager.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/manager/DatasourceYamlManager.java index 74f78b4b1..a9ba48b4c 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/manager/DatasourceYamlManager.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/manager/DatasourceYamlManager.java @@ -4,17 +4,17 @@ import com.tencent.supersonic.semantic.api.model.pojo.DatasourceDetail; import com.tencent.supersonic.semantic.api.model.pojo.Dim; import com.tencent.supersonic.semantic.api.model.pojo.Identify; import com.tencent.supersonic.semantic.api.model.pojo.Measure; +import com.tencent.supersonic.semantic.api.model.response.DatabaseResp; import com.tencent.supersonic.semantic.api.model.yaml.DatasourceYamlTpl; import com.tencent.supersonic.semantic.api.model.yaml.DimensionTimeTypeParamsTpl; import com.tencent.supersonic.semantic.api.model.yaml.DimensionYamlTpl; import com.tencent.supersonic.semantic.api.model.yaml.IdentifyYamlTpl; import com.tencent.supersonic.semantic.api.model.yaml.MeasureYamlTpl; -import com.tencent.supersonic.semantic.api.model.response.DatabaseResp; -import com.tencent.supersonic.semantic.model.domain.utils.SysTimeDimensionBuilder; 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.pojo.Datasource; import com.tencent.supersonic.semantic.model.domain.pojo.DatasourceQueryEnum; +import com.tencent.supersonic.semantic.model.domain.utils.SysTimeDimensionBuilder; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Datasource.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Datasource.java index 0361679b9..286512309 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Datasource.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Datasource.java @@ -9,7 +9,7 @@ import lombok.Data; @Data public class Datasource extends SchemaItem { - private Long domainId; + private Long modelId; private Long databaseId; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Dimension.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Dimension.java index c3c0a416b..fba360e7e 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Dimension.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Dimension.java @@ -3,8 +3,8 @@ package com.tencent.supersonic.semantic.model.domain.pojo; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; -import lombok.Data; import java.util.List; +import lombok.Data; @Data public class Dimension extends SchemaItem { @@ -14,7 +14,7 @@ public class Dimension extends SchemaItem { private String expr; - private Long domainId; + private Long modelId; private Long datasourceId; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Domain.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Domain.java index 3470147da..d4b2726c6 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Domain.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Domain.java @@ -1,10 +1,10 @@ package com.tencent.supersonic.semantic.model.domain.pojo; -import com.tencent.supersonic.semantic.api.model.pojo.Entity; -import com.tencent.supersonic.semantic.api.model.request.DomainReq; import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import com.tencent.supersonic.semantic.api.model.pojo.Entity; import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; +import com.tencent.supersonic.semantic.api.model.request.DomainReq; import java.util.List; import lombok.Data; import org.springframework.beans.BeanUtils; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/JdbcDataSource.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/JdbcDataSource.java index c4f24750b..fe96ffd49 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/JdbcDataSource.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/JdbcDataSource.java @@ -9,7 +9,6 @@ import com.alibaba.druid.wall.WallFilter; import com.tencent.supersonic.semantic.api.model.enums.DataTypeEnum; import com.tencent.supersonic.semantic.api.model.response.DatabaseResp; import com.tencent.supersonic.semantic.model.domain.utils.JdbcDataSourceUtils; - import java.util.Arrays; import java.util.Map; import java.util.Properties; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/MetaFilter.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/MetaFilter.java index b33e18e18..087662383 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/MetaFilter.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/MetaFilter.java @@ -1,7 +1,7 @@ package com.tencent.supersonic.semantic.model.domain.pojo; -import lombok.Data; import java.util.List; +import lombok.Data; @Data @@ -15,7 +15,7 @@ public class MetaFilter { private String createdBy; - private List domainIds; + private List modelIds; private Integer sensitiveLevel; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Metric.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Metric.java index 174e17342..771915de1 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Metric.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Metric.java @@ -10,7 +10,7 @@ import lombok.Data; public class Metric extends SchemaItem { - private Long domainId; + private Long modelId; //measure_proxy ratio expr cumulative derived private String type; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/MetricFilter.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/MetricFilter.java index 334f2f453..38ac698e3 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/MetricFilter.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/MetricFilter.java @@ -7,4 +7,6 @@ public class MetricFilter extends MetaFilter { private String type; + private String key; + } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Model.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Model.java new file mode 100644 index 000000000..5ee661b85 --- /dev/null +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/pojo/Model.java @@ -0,0 +1,38 @@ +package com.tencent.supersonic.semantic.model.domain.pojo; + + +import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import com.tencent.supersonic.semantic.api.model.pojo.Entity; +import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; +import com.tencent.supersonic.semantic.api.model.request.ModelReq; +import java.util.List; +import lombok.Data; +import org.springframework.beans.BeanUtils; + + +@Data +public class Model extends SchemaItem { + + private Long domainId; + + private Integer isOpen; + + private List viewers; + + private List viewOrgs; + + private List admins; + + private List adminOrgs; + + private Entity entity; + + public static Model create(ModelReq modelReq) { + Model model = new Model(); + BeanUtils.copyProperties(modelReq, model); + model.setStatus(StatusEnum.ONLINE.getCode()); + return model; + } + + +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DatasourceRepository.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DatasourceRepository.java index 486849340..e5f3fed00 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DatasourceRepository.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DatasourceRepository.java @@ -3,10 +3,8 @@ package com.tencent.supersonic.semantic.model.domain.repository; import com.tencent.supersonic.semantic.model.domain.dataobject.DatasourceDO; import com.tencent.supersonic.semantic.model.domain.dataobject.DatasourceRelaDO; - import java.util.List; - public interface DatasourceRepository { void createDatasource(DatasourceDO datasourceDO); @@ -15,7 +13,7 @@ public interface DatasourceRepository { List getDatasourceList(); - List getDatasourceList(Long domainId); + List getDatasourceList(Long modelId); DatasourceDO getDatasourceById(Long id); @@ -27,7 +25,7 @@ public interface DatasourceRepository { DatasourceRelaDO getDatasourceRelaById(Long id); - List getDatasourceRelaList(Long domainId); + List getDatasourceRelaList(Long modelId); void deleteDatasourceRela(Long id); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DateInfoRepository.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DateInfoRepository.java index e5d313b80..5ace70fc1 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DateInfoRepository.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DateInfoRepository.java @@ -4,7 +4,6 @@ package com.tencent.supersonic.semantic.model.domain.repository; import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter; import com.tencent.supersonic.semantic.api.model.request.DateInfoReq; import com.tencent.supersonic.semantic.model.domain.dataobject.DateInfoDO; - import java.util.List; public interface DateInfoRepository { diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DimensionRepository.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DimensionRepository.java index 476c86961..fd6d0c850 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DimensionRepository.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DimensionRepository.java @@ -4,7 +4,6 @@ import com.tencent.supersonic.semantic.model.domain.dataobject.DimensionDO; import com.tencent.supersonic.semantic.model.domain.pojo.DimensionFilter; import java.util.List; - public interface DimensionRepository { diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DomainRepository.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DomainRepository.java index 5aacb9b9e..99b48704b 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DomainRepository.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/DomainRepository.java @@ -2,7 +2,6 @@ package com.tencent.supersonic.semantic.model.domain.repository; import com.tencent.supersonic.semantic.model.domain.dataobject.DomainDO; - import java.util.List; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/MetricRepository.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/MetricRepository.java index 891233dd0..b65d1aaae 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/MetricRepository.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/MetricRepository.java @@ -1,9 +1,8 @@ package com.tencent.supersonic.semantic.model.domain.repository; -import com.tencent.supersonic.semantic.model.domain.pojo.MetricFilter; import com.tencent.supersonic.semantic.model.domain.dataobject.MetricDO; - +import com.tencent.supersonic.semantic.model.domain.pojo.MetricFilter; import java.util.List; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/ModelRepository.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/ModelRepository.java new file mode 100644 index 000000000..3712403e5 --- /dev/null +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/ModelRepository.java @@ -0,0 +1,18 @@ +package com.tencent.supersonic.semantic.model.domain.repository; + +import com.tencent.supersonic.semantic.model.domain.dataobject.ModelDO; +import java.util.List; + +public interface ModelRepository { + + void createModel(ModelDO modelDO); + + void updateModel(ModelDO modelDO); + + void deleteModel(Long id); + + List getModelList(); + + ModelDO getModelById(Long id); + +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DatasourceConverter.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DatasourceConverter.java index 71c366259..56066a31b 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DatasourceConverter.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DatasourceConverter.java @@ -3,6 +3,8 @@ package com.tencent.supersonic.semantic.model.domain.utils; import com.alibaba.fastjson.JSONObject; 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.common.util.BeanMapper; import com.tencent.supersonic.semantic.api.model.enums.MetricTypeEnum; import com.tencent.supersonic.semantic.api.model.pojo.DatasourceDetail; import com.tencent.supersonic.semantic.api.model.pojo.Dim; @@ -15,8 +17,6 @@ import com.tencent.supersonic.semantic.api.model.request.MetricReq; import com.tencent.supersonic.semantic.api.model.response.DatasourceRelaResp; import com.tencent.supersonic.semantic.api.model.response.DatasourceResp; import com.tencent.supersonic.semantic.api.model.response.MeasureResp; -import com.tencent.supersonic.common.pojo.enums.StatusEnum; -import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.semantic.model.domain.dataobject.DatasourceDO; import com.tencent.supersonic.semantic.model.domain.dataobject.DatasourceRelaDO; import com.tencent.supersonic.semantic.model.domain.pojo.Datasource; @@ -104,7 +104,7 @@ public class DatasourceConverter { dimensionReq.setDescription(dim.getName()); dimensionReq.setSemanticType("CATEGORY"); dimensionReq.setDatasourceId(datasource.getId()); - dimensionReq.setDomainId(datasource.getDomainId()); + dimensionReq.setModelId(datasource.getModelId()); dimensionReq.setExpr(dim.getBizName()); dimensionReq.setType("categorical"); return dimensionReq; @@ -114,9 +114,9 @@ public class DatasourceConverter { measure.setDatasourceId(datasource.getId()); MetricReq metricReq = new MetricReq(); metricReq.setName(measure.getName()); - metricReq.setBizName(measure.getBizName().replace(datasource.getBizName() + "_", "")); + metricReq.setBizName(measure.getBizName().replaceFirst(datasource.getBizName() + "_", "")); metricReq.setDescription(measure.getName()); - metricReq.setDomainId(datasource.getDomainId()); + metricReq.setModelId(datasource.getModelId()); metricReq.setMetricType(MetricTypeEnum.ATOMIC); MetricTypeParams exprTypeParams = new MetricTypeParams(); exprTypeParams.setExpr(measure.getBizName()); @@ -132,7 +132,7 @@ public class DatasourceConverter { dimensionReq.setDescription(identify.getName()); dimensionReq.setSemanticType("CATEGORY"); dimensionReq.setDatasourceId(datasource.getId()); - dimensionReq.setDomainId(datasource.getDomainId()); + dimensionReq.setModelId(datasource.getModelId()); dimensionReq.setExpr(identify.getBizName()); dimensionReq.setType(identify.getType()); return dimensionReq; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DimensionConverter.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DimensionConverter.java index 347096a7c..1280e1df7 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DimensionConverter.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/DimensionConverter.java @@ -1,20 +1,18 @@ package com.tencent.supersonic.semantic.model.domain.utils; import com.alibaba.fastjson.JSONObject; +import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; -import com.tencent.supersonic.semantic.api.model.yaml.DimensionYamlTpl; import com.tencent.supersonic.semantic.api.model.request.DimensionReq; import com.tencent.supersonic.semantic.api.model.response.DatasourceResp; import com.tencent.supersonic.semantic.api.model.response.DimensionResp; -import com.tencent.supersonic.common.util.BeanMapper; +import com.tencent.supersonic.semantic.api.model.yaml.DimensionYamlTpl; import com.tencent.supersonic.semantic.model.domain.dataobject.DimensionDO; import com.tencent.supersonic.semantic.model.domain.pojo.Dimension; - import java.util.ArrayList; import java.util.List; import java.util.Map; - import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; import org.springframework.util.CollectionUtils; @@ -46,11 +44,11 @@ public class DimensionConverter { public static DimensionResp convert2DimensionResp(DimensionDO dimensionDO, - Map fullPathMap, - Map datasourceRespMap) { + Map fullPathMap, + Map datasourceRespMap) { DimensionResp dimensionResp = new DimensionResp(); BeanUtils.copyProperties(dimensionDO, dimensionResp); - dimensionResp.setFullPath(fullPathMap.get(dimensionDO.getDomainId()) + dimensionDO.getBizName()); + dimensionResp.setFullPath(fullPathMap.get(dimensionDO.getModelId()) + dimensionDO.getBizName()); dimensionResp.setDatasourceId( datasourceRespMap.getOrDefault(dimensionResp.getDatasourceId(), new DatasourceResp()).getId()); dimensionResp.setDatasourceName( 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 1443f0710..81a81743a 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,21 +3,17 @@ 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.util.JsonUtil; -import com.tencent.supersonic.semantic.api.model.pojo.Entity; +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; @@ -41,7 +37,6 @@ public class DomainConvert { domainDO.setAdminOrg(String.join(",", domain.getAdminOrgs())); domainDO.setViewer(String.join(",", domain.getViewers())); domainDO.setViewOrg(String.join(",", domain.getViewOrgs())); - domainDO.setEntity(JsonUtil.toString(domain.getEntity())); return domainDO; } @@ -57,12 +52,11 @@ public class DomainConvert { ? Lists.newArrayList() : Arrays.asList(domainDO.getViewer().split(","))); domainResp.setViewOrgs(StringUtils.isBlank(domainDO.getViewOrg()) ? Lists.newArrayList() : Arrays.asList(domainDO.getViewOrg().split(","))); - domainResp.setEntity(JsonUtil.toObject(domainDO.getEntity(), Entity.class)); return domainResp; } 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/JdbcDataSourceUtils.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/JdbcDataSourceUtils.java index 7b6750dfc..0d83aaee0 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/JdbcDataSourceUtils.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/JdbcDataSourceUtils.java @@ -10,9 +10,9 @@ import static com.tencent.supersonic.common.pojo.Constants.PATTERN_JDBC_TYPE; import static com.tencent.supersonic.common.pojo.Constants.SPACE; import com.alibaba.druid.util.StringUtils; +import com.tencent.supersonic.common.util.MD5Util; import com.tencent.supersonic.semantic.api.model.enums.DataTypeEnum; import com.tencent.supersonic.semantic.api.model.response.DatabaseResp; -import com.tencent.supersonic.common.util.MD5Util; import com.tencent.supersonic.semantic.model.domain.pojo.Database; import com.tencent.supersonic.semantic.model.domain.pojo.JdbcDataSource; import java.sql.Connection; 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 bbb84a32f..8ea77d952 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,15 +3,15 @@ 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.DomainResp; -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; @@ -54,15 +54,14 @@ public class MetricConverter { } - public static MetricResp convert2MetricDesc(MetricDO metricDO, Map domainMap) { + public static MetricResp convert2MetricDesc(MetricDO metricDO, Map modelMap) { MetricResp metricDesc = new MetricResp(); BeanUtils.copyProperties(metricDO, metricDesc); metricDesc.setTypeParams(JSONObject.parseObject(metricDO.getTypeParams(), MetricTypeParams.class)); metricDesc.setDataFormat(JSONObject.parseObject(metricDO.getDataFormat(), DataFormat.class)); - DomainResp domainResp = domainMap.get(metricDO.getDomainId()); - if (domainResp != null) { - metricDesc.setFullPath(domainMap.get(metricDO.getDomainId()).getFullPath() + metricDO.getBizName()); - metricDesc.setDomainName(domainMap.get(metricDO.getDomainId()).getName()); + ModelResp modelResp = modelMap.get(metricDO.getModelId()); + if (modelResp != null) { + metricDesc.setModelName(modelResp.getName()); } return metricDesc; } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/ModelConvert.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/ModelConvert.java new file mode 100644 index 000000000..0aabce1a5 --- /dev/null +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/ModelConvert.java @@ -0,0 +1,71 @@ +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.common.util.JsonUtil; +import com.tencent.supersonic.semantic.api.model.pojo.Entity; +import com.tencent.supersonic.semantic.api.model.request.ModelReq; +import com.tencent.supersonic.semantic.api.model.response.DomainResp; +import com.tencent.supersonic.semantic.api.model.response.ModelResp; +import com.tencent.supersonic.semantic.model.domain.dataobject.ModelDO; +import com.tencent.supersonic.semantic.model.domain.pojo.Model; +import java.util.Arrays; +import java.util.Date; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; + +public class ModelConvert { + + public static Model convert(ModelReq modelReq) { + Model model = new Model(); + BeanUtils.copyProperties(modelReq, model); + model.setStatus(StatusEnum.ONLINE.getCode()); + return model; + } + + public static ModelDO convert(Model model, User user) { + ModelDO modelDO = new ModelDO(); + BeanUtils.copyProperties(model, modelDO); + modelDO.setCreatedBy(user.getName()); + modelDO.setUpdatedBy(user.getName()); + modelDO.setCreatedAt(new Date()); + modelDO.setUpdatedAt(new Date()); + modelDO.setAdmin(String.join(",", model.getAdmins())); + modelDO.setAdminOrg(String.join(",", model.getAdminOrgs())); + modelDO.setViewer(String.join(",", model.getViewers())); + modelDO.setViewOrg(String.join(",", model.getViewOrgs())); + modelDO.setEntity(JsonUtil.toString(model.getEntity())); + return modelDO; + } + + public static ModelResp convert(ModelDO modelDO) { + ModelResp modelResp = new ModelResp(); + BeanUtils.copyProperties(modelDO, modelResp); + modelResp.setAdmins(StringUtils.isBlank(modelDO.getAdmin()) + ? Lists.newArrayList() : Arrays.asList(modelDO.getAdmin().split(","))); + modelResp.setAdminOrgs(StringUtils.isBlank(modelDO.getAdminOrg()) + ? Lists.newArrayList() : Arrays.asList(modelDO.getAdminOrg().split(","))); + modelResp.setViewers(StringUtils.isBlank(modelDO.getViewer()) + ? Lists.newArrayList() : Arrays.asList(modelDO.getViewer().split(","))); + modelResp.setViewOrgs(StringUtils.isBlank(modelDO.getViewOrg()) + ? Lists.newArrayList() : Arrays.asList(modelDO.getViewOrg().split(","))); + modelResp.setEntity(JsonUtil.toObject(modelDO.getEntity(), Entity.class)); + return modelResp; + } + + public static ModelResp convert(ModelDO modelDO, + Map domainRespMap) { + ModelResp modelResp = convert(modelDO); + DomainResp domainResp = domainRespMap.get(modelResp.getDomainId()); + if (domainResp != null) { + String fullBizNamePath = domainResp.getFullPath() + modelResp.getBizName(); + modelResp.setFullPath(fullBizNamePath); + } + return modelResp; + } + + +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/SqlUtils.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/SqlUtils.java index ea2f71963..bf9a75a6e 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/SqlUtils.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/SqlUtils.java @@ -2,8 +2,8 @@ package com.tencent.supersonic.semantic.model.domain.utils; import static com.tencent.supersonic.common.pojo.Constants.AT_SYMBOL; -import com.tencent.supersonic.semantic.api.model.enums.DataTypeEnum; import com.tencent.supersonic.common.pojo.QueryColumn; +import com.tencent.supersonic.semantic.api.model.enums.DataTypeEnum; 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.pojo.JdbcDataSource; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DatasourceRelaDOMapper.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DatasourceRelaDOMapper.java index 65777f0a9..e347807a2 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DatasourceRelaDOMapper.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DatasourceRelaDOMapper.java @@ -2,7 +2,6 @@ package com.tencent.supersonic.semantic.model.infrastructure.mapper; import com.tencent.supersonic.semantic.model.domain.dataobject.DatasourceRelaDO; import com.tencent.supersonic.semantic.model.domain.dataobject.DatasourceRelaDOExample; - import java.util.List; import org.apache.ibatis.annotations.Mapper; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DateInfoMapper.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DateInfoMapper.java index 57617967f..bc682046e 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DateInfoMapper.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DateInfoMapper.java @@ -3,7 +3,6 @@ package com.tencent.supersonic.semantic.model.infrastructure.mapper; import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter; import com.tencent.supersonic.semantic.model.domain.dataobject.DateInfoDO; - import java.util.List; import org.apache.ibatis.annotations.Mapper; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DimensionDOCustomMapper.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DimensionDOCustomMapper.java index f9bb9a746..b96005c00 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DimensionDOCustomMapper.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DimensionDOCustomMapper.java @@ -2,7 +2,6 @@ package com.tencent.supersonic.semantic.model.infrastructure.mapper; import com.tencent.supersonic.semantic.model.domain.dataobject.DimensionDO; - import java.util.List; import org.apache.ibatis.annotations.Mapper; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DimensionDOMapper.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DimensionDOMapper.java index 597754a84..ab690c405 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DimensionDOMapper.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DimensionDOMapper.java @@ -1,11 +1,9 @@ package com.tencent.supersonic.semantic.model.infrastructure.mapper; - import com.tencent.supersonic.semantic.model.domain.dataobject.DimensionDO; import com.tencent.supersonic.semantic.model.domain.dataobject.DimensionDOExample; -import org.apache.ibatis.annotations.Mapper; - import java.util.List; +import org.apache.ibatis.annotations.Mapper; @Mapper public interface DimensionDOMapper { diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DomainDOMapper.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DomainDOMapper.java index 95a9ed246..c1780515e 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DomainDOMapper.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/DomainDOMapper.java @@ -2,7 +2,6 @@ package com.tencent.supersonic.semantic.model.infrastructure.mapper; import com.tencent.supersonic.semantic.model.domain.dataobject.DomainDO; import com.tencent.supersonic.semantic.model.domain.dataobject.DomainDOExample; - import java.util.List; import org.apache.ibatis.annotations.Mapper; @@ -48,4 +47,4 @@ public interface DomainDOMapper { * @mbg.generated */ int updateByPrimaryKey(DomainDO record); -} +} \ No newline at end of file diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/MetricDOCustomMapper.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/MetricDOCustomMapper.java index b51d3b404..6f93a3849 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/MetricDOCustomMapper.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/MetricDOCustomMapper.java @@ -1,13 +1,10 @@ package com.tencent.supersonic.semantic.model.infrastructure.mapper; - import com.tencent.supersonic.semantic.model.domain.dataobject.MetricDO; - -import java.util.List; import com.tencent.supersonic.semantic.model.domain.pojo.MetricFilter; +import java.util.List; import org.apache.ibatis.annotations.Mapper; - @Mapper public interface MetricDOCustomMapper { diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/MetricDOMapper.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/MetricDOMapper.java index 4de46bdd8..dbaef94d9 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/MetricDOMapper.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/MetricDOMapper.java @@ -2,7 +2,6 @@ package com.tencent.supersonic.semantic.model.infrastructure.mapper; import com.tencent.supersonic.semantic.model.domain.dataobject.MetricDO; import com.tencent.supersonic.semantic.model.domain.dataobject.MetricDOExample; - import java.util.List; import org.apache.ibatis.annotations.Mapper; @@ -58,4 +57,4 @@ public interface MetricDOMapper { * @mbg.generated */ int updateByPrimaryKey(MetricDO record); -} +} \ No newline at end of file diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/ModelDOMapper.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/ModelDOMapper.java new file mode 100644 index 000000000..090cdf85e --- /dev/null +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/ModelDOMapper.java @@ -0,0 +1,76 @@ +package com.tencent.supersonic.semantic.model.infrastructure.mapper; + +import com.tencent.supersonic.semantic.model.domain.dataobject.ModelDO; +import com.tencent.supersonic.semantic.model.domain.dataobject.ModelDOExample; +import java.util.List; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface ModelDOMapper { + + /** + * @mbg.generated + */ + long countByExample(ModelDOExample example); + + /** + * @mbg.generated + */ + int deleteByPrimaryKey(Long id); + + /** + * @mbg.generated + */ + int insert(ModelDO record); + + /** + * @mbg.generated + */ + int insertSelective(ModelDO record); + + /** + * @mbg.generated + */ + List selectByExampleWithBLOBs(ModelDOExample example); + + /** + * @mbg.generated + */ + List selectByExample(ModelDOExample example); + + /** + * @mbg.generated + */ + ModelDO selectByPrimaryKey(Long id); + + /** + * @mbg.generated + */ + int updateByExampleSelective(@Param("record") ModelDO record, @Param("example") ModelDOExample example); + + /** + * @mbg.generated + */ + int updateByExampleWithBLOBs(@Param("record") ModelDO record, @Param("example") ModelDOExample example); + + /** + * @mbg.generated + */ + int updateByExample(@Param("record") ModelDO record, @Param("example") ModelDOExample example); + + /** + * @mbg.generated + */ + int updateByPrimaryKeySelective(ModelDO record); + + /** + * @mbg.generated + */ + int updateByPrimaryKeyWithBLOBs(ModelDO record); + + /** + * @mbg.generated + */ + int updateByPrimaryKey(ModelDO record); +} \ No newline at end of file diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/ViewInfoDOMapper.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/ViewInfoDOMapper.java index 097d143d7..0d296c553 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/ViewInfoDOMapper.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/ViewInfoDOMapper.java @@ -2,7 +2,6 @@ package com.tencent.supersonic.semantic.model.infrastructure.mapper; import com.tencent.supersonic.semantic.model.domain.dataobject.ViewInfoDO; import com.tencent.supersonic.semantic.model.domain.dataobject.ViewInfoDOExample; - import java.util.List; import org.apache.ibatis.annotations.Mapper; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DatabaseRepositoryImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DatabaseRepositoryImpl.java index a0214c790..fde25f9b7 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DatabaseRepositoryImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DatabaseRepositoryImpl.java @@ -40,7 +40,6 @@ public class DatabaseRepositoryImpl implements DatabaseRepository { DatabaseDOExample databaseDOExample = new DatabaseDOExample(); databaseDOExample.createCriteria().andDomainIdEqualTo(domainId); return databaseDOMapper.selectByExampleWithBLOBs(databaseDOExample); - } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DatasourceRepositoryImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DatasourceRepositoryImpl.java index d53e9ef3c..e6c713299 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DatasourceRepositoryImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DatasourceRepositoryImpl.java @@ -43,9 +43,9 @@ public class DatasourceRepositoryImpl implements DatasourceRepository { } @Override - public List getDatasourceList(Long domainId) { + public List getDatasourceList(Long modelId) { DatasourceDOExample datasourceExample = new DatasourceDOExample(); - datasourceExample.createCriteria().andDomainIdEqualTo(domainId); + datasourceExample.createCriteria().andModelIdEqualTo(modelId); return datasourceMapper.selectByExampleWithBLOBs(datasourceExample); } @@ -76,9 +76,9 @@ public class DatasourceRepositoryImpl implements DatasourceRepository { @Override - public List getDatasourceRelaList(Long domainId) { + public List getDatasourceRelaList(Long modelId) { DatasourceRelaDOExample datasourceRelaDOExample = new DatasourceRelaDOExample(); - datasourceRelaDOExample.createCriteria().andDomainIdEqualTo(domainId); + datasourceRelaDOExample.createCriteria().andModelIdEqualTo(modelId); return datasourceRelaDOMapper.selectByExample(datasourceRelaDOExample); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DateInfoRepositoryImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DateInfoRepositoryImpl.java index 6ac386c14..43b2b1ad6 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DateInfoRepositoryImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DateInfoRepositoryImpl.java @@ -3,9 +3,9 @@ package com.tencent.supersonic.semantic.model.infrastructure.repository; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Stopwatch; +import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter; import com.tencent.supersonic.semantic.api.model.request.DateInfoReq; -import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.semantic.model.domain.dataobject.DateInfoDO; import com.tencent.supersonic.semantic.model.domain.repository.DateInfoRepository; import com.tencent.supersonic.semantic.model.infrastructure.mapper.DateInfoMapper; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DimensionRepositoryImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DimensionRepositoryImpl.java index 4fa484720..da692bf93 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DimensionRepositoryImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DimensionRepositoryImpl.java @@ -2,8 +2,8 @@ package com.tencent.supersonic.semantic.model.infrastructure.repository; import com.tencent.supersonic.semantic.model.domain.dataobject.DimensionDO; import com.tencent.supersonic.semantic.model.domain.dataobject.DimensionDOExample; -import com.tencent.supersonic.semantic.model.domain.repository.DimensionRepository; import com.tencent.supersonic.semantic.model.domain.pojo.DimensionFilter; +import com.tencent.supersonic.semantic.model.domain.repository.DimensionRepository; import com.tencent.supersonic.semantic.model.infrastructure.mapper.DimensionDOCustomMapper; import com.tencent.supersonic.semantic.model.infrastructure.mapper.DimensionDOMapper; import java.util.List; @@ -28,9 +28,7 @@ public class DimensionRepositoryImpl implements DimensionRepository { @Override public void createDimension(DimensionDO dimensionDO) { - dimensionDOMapper.insert(dimensionDO); - } @Override @@ -53,7 +51,7 @@ public class DimensionRepositoryImpl implements DimensionRepository { @Override public List getDimensionListOfDomain(Long domainId) { DimensionDOExample dimensionDOExample = new DimensionDOExample(); - dimensionDOExample.createCriteria().andDomainIdEqualTo(domainId); + dimensionDOExample.createCriteria().andModelIdEqualTo(domainId); return dimensionDOMapper.selectByExampleWithBLOBs(dimensionDOExample); } @@ -98,8 +96,8 @@ public class DimensionRepositoryImpl implements DimensionRepository { if (dimensionFilter.getCreatedBy() != null) { dimensionDOExample.getOredCriteria().get(0).andCreatedByEqualTo(dimensionFilter.getCreatedBy()); } - if (CollectionUtils.isNotEmpty(dimensionFilter.getDomainIds())) { - dimensionDOExample.getOredCriteria().get(0).andDomainIdIn(dimensionFilter.getDomainIds()); + if (CollectionUtils.isNotEmpty(dimensionFilter.getModelIds())) { + dimensionDOExample.getOredCriteria().get(0).andModelIdIn(dimensionFilter.getModelIds()); } if (dimensionFilter.getSensitiveLevel() != null) { dimensionDOExample.getOredCriteria().get(0).andSensitiveLevelEqualTo(dimensionFilter.getSensitiveLevel()); diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DomainRepositoryImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DomainRepositoryImpl.java index 8b6a475f0..582c976f6 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DomainRepositoryImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/DomainRepositoryImpl.java @@ -5,7 +5,6 @@ import com.tencent.supersonic.semantic.model.domain.dataobject.DomainDOExample; import com.tencent.supersonic.semantic.model.domain.repository.DomainRepository; import com.tencent.supersonic.semantic.model.infrastructure.mapper.DomainDOMapper; import java.util.List; - import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/MetricRepositoryImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/MetricRepositoryImpl.java index 10acb3c5a..dbe58d0f0 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/MetricRepositoryImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/MetricRepositoryImpl.java @@ -8,7 +8,6 @@ import com.tencent.supersonic.semantic.model.domain.repository.MetricRepository; import com.tencent.supersonic.semantic.model.infrastructure.mapper.MetricDOCustomMapper; import com.tencent.supersonic.semantic.model.infrastructure.mapper.MetricDOMapper; import java.util.List; -import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -45,7 +44,7 @@ public class MetricRepositoryImpl implements MetricRepository { @Override public List getMetricList(Long domainId) { MetricDOExample metricDOExample = new MetricDOExample(); - metricDOExample.createCriteria().andDomainIdEqualTo(domainId); + metricDOExample.createCriteria().andModelIdEqualTo(domainId); return metricDOMapper.selectByExampleWithBLOBs(metricDOExample); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/ModelRepositoryImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/ModelRepositoryImpl.java new file mode 100644 index 000000000..c12e81760 --- /dev/null +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/ModelRepositoryImpl.java @@ -0,0 +1,43 @@ +package com.tencent.supersonic.semantic.model.infrastructure.repository; + +import com.tencent.supersonic.semantic.model.domain.dataobject.ModelDO; +import com.tencent.supersonic.semantic.model.domain.dataobject.ModelDOExample; +import com.tencent.supersonic.semantic.model.domain.repository.ModelRepository; +import com.tencent.supersonic.semantic.model.infrastructure.mapper.ModelDOMapper; +import java.util.List; +import org.springframework.stereotype.Component; + +@Component +public class ModelRepositoryImpl implements ModelRepository { + + private ModelDOMapper modelDOMapper; + + public ModelRepositoryImpl(ModelDOMapper modelDOMapper) { + this.modelDOMapper = modelDOMapper; + } + + @Override + public void createModel(ModelDO modelDO) { + modelDOMapper.insert(modelDO); + } + + @Override + public void updateModel(ModelDO modelDO) { + modelDOMapper.updateByPrimaryKeyWithBLOBs(modelDO); + } + + @Override + public void deleteModel(Long id) { + modelDOMapper.deleteByPrimaryKey(id); + } + + @Override + public List getModelList() { + return modelDOMapper.selectByExampleWithBLOBs(new ModelDOExample()); + } + + @Override + public ModelDO getModelById(Long id) { + return modelDOMapper.selectByPrimaryKey(id); + } +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/ViewInfoRepositoryImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/ViewInfoRepositoryImpl.java index 5c8c15f8f..719ef5246 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/ViewInfoRepositoryImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/ViewInfoRepositoryImpl.java @@ -20,7 +20,7 @@ public class ViewInfoRepositoryImpl implements ViewInfoRepository { @Override public List getViewInfoList(Long domainId) { ViewInfoDOExample viewInfoDOExample = new ViewInfoDOExample(); - viewInfoDOExample.createCriteria().andDomainIdEqualTo(domainId); + viewInfoDOExample.createCriteria().andModelIdEqualTo(domainId); return viewInfoDOMapper.selectByExampleWithBLOBs(viewInfoDOExample); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DatabaseController.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DatabaseController.java index c5f20f1c0..16ac8afea 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DatabaseController.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DatabaseController.java @@ -35,7 +35,6 @@ public class DatabaseController { return databaseService.testConnect(databaseReq, user); } - @PostMapping("/createOrUpdateDatabase") public DatabaseResp createOrUpdateDatabase(@RequestBody DatabaseReq databaseReq, HttpServletRequest request, @@ -56,7 +55,7 @@ public class DatabaseController { @PostMapping("/executeSql") public QueryResultWithSchemaResp executeSql(@RequestBody SqlExecuteReq sqlExecuteReq) { - return databaseService.executeSql(sqlExecuteReq.getSql(), sqlExecuteReq.getDomainId()); + return databaseService.executeSql(sqlExecuteReq.getSql(), sqlExecuteReq.getModelId()); } @RequestMapping("/getDbNames/{id}") diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DatasourceController.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DatasourceController.java index 7708d7706..35428bc14 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DatasourceController.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DatasourceController.java @@ -49,14 +49,14 @@ public class DatasourceController { return datasourceService.updateDatasource(datasourceReq, user); } - @GetMapping("/getDatasourceList/{domainId}") - public List getDatasourceList(@PathVariable("domainId") Long domainId) { - return datasourceService.getDatasourceListNoMeasurePrefix(domainId); + @GetMapping("/getDatasourceList/{modelId}") + public List getDatasourceList(@PathVariable("modelId") Long modelId) { + return datasourceService.getDatasourceListNoMeasurePrefix(modelId); } - @GetMapping("/getMeasureListOfDomain/{domainId}") - public List getMeasureListOfDomain(@PathVariable("domainId") Long domainId) { - return datasourceService.getMeasureListOfDomain(domainId); + @GetMapping("/getMeasureListOfModel/{modelId}") + public List getMeasureListOfModel(@PathVariable("modelId") Long modelId) { + return datasourceService.getMeasureListOfModel(modelId); } @@ -77,9 +77,9 @@ public class DatasourceController { return datasourceService.createOrUpdateDatasourceRela(datasourceRelaReq, user); } - @GetMapping("/getDatasourceRelaList/{domainId}") - public List getDatasourceRelaList(@PathVariable("domainId") Long domainId) { - return datasourceService.getDatasourceRelaList(domainId); + @GetMapping("/getDatasourceRelaList/{modelId}") + public List getDatasourceRelaList(@PathVariable("modelId") Long modelId) { + return datasourceService.getDatasourceRelaList(modelId); } @DeleteMapping("/deleteDatasourceRela/{id}") 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 3d3b53ecd..3bc1264d1 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 @@ -57,16 +57,16 @@ public class DimensionController { } - @GetMapping("/getDimensionList/{domainId}") - public List getDimension(@PathVariable("domainId") Long domainId) { - return dimensionService.getDimensions(domainId); + @GetMapping("/getDimensionList/{modelId}") + public List getDimension(@PathVariable("modelId") Long modelId) { + return dimensionService.getDimensions(modelId); } - @GetMapping("/{domainId}/{dimensionName}") - public DimensionResp getDimensionDescByNameAndId(@PathVariable("domainId") Long domainId, + @GetMapping("/{modelId}/{dimensionName}") + public DimensionResp getDimensionDescByNameAndId(@PathVariable("modelId") Long modelId, @PathVariable("dimensionName") String dimensionBizName) { - return dimensionService.getDimension(dimensionBizName, domainId); + return dimensionService.getDimension(dimensionBizName, modelId); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DomainController.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DomainController.java index f22512aaf..12daf9754 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DomainController.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/DomainController.java @@ -3,10 +3,8 @@ package com.tencent.supersonic.semantic.model.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.request.DomainReq; -import com.tencent.supersonic.semantic.api.model.request.DomainSchemaFilterReq; 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.DomainSchemaResp; import com.tencent.supersonic.semantic.model.domain.DomainService; import java.util.Arrays; import java.util.List; @@ -56,26 +54,13 @@ public class DomainController { return true; } - - /** - * get domain list - * - * @param - */ @GetMapping("/getDomainList") public List getDomainList(HttpServletRequest request, HttpServletResponse response) { User user = UserHolder.findUser(request, response); - return domainService.getDomainListForAdmin(user.getName()); + return domainService.getDomainListWithAdminAuth(user); } - - /** - * get domain by id - * - * @param id - * @return - */ @GetMapping("/getDomain/{id}") public DomainResp getDomain(@PathVariable("id") Long id) { return domainService.getDomain(id); @@ -87,13 +72,4 @@ public class DomainController { .collect(Collectors.toList())); } - @PostMapping("/schema") - public List fetchDomainSchema(@RequestBody DomainSchemaFilterReq filter, - HttpServletRequest request, - HttpServletResponse response) { - User user = UserHolder.findUser(request, response); - return domainService.fetchDomainSchema(filter, user); - } - - } 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 5fcc16acd..b97b74340 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 @@ -52,9 +52,9 @@ public class MetricController { } - @GetMapping("/getMetricList/{domainId}") - public List getMetricList(@PathVariable("domainId") Long domainId) { - return metricService.getMetrics(domainId); + @GetMapping("/getMetricList/{modelId}") + public List getMetricList(@PathVariable("modelId") Long modelId) { + return metricService.getMetrics(modelId); } @@ -63,9 +63,9 @@ public class MetricController { return metricService.queryMetric(pageMetrricReq); } - @GetMapping("getMetric/{domainId}/{bizName}") - public MetricResp getMetric(@PathVariable("domainId") Long domainId, @PathVariable("bizName") String bizName) { - return metricService.getMetric(domainId, bizName); + @GetMapping("getMetric/{modelId}/{bizName}") + public MetricResp getMetric(@PathVariable("modelId") Long modelId, @PathVariable("bizName") String bizName) { + return metricService.getMetric(modelId, bizName); } 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 new file mode 100644 index 000000000..1e9fa8d84 --- /dev/null +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/ModelController.java @@ -0,0 +1,77 @@ +package com.tencent.supersonic.semantic.model.rest; + +import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; +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 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 +@RequestMapping("/api/semantic/model") +public class ModelController { + + private ModelService modelService; + + public ModelController(ModelService modelService) { + this.modelService = modelService; + } + + @PostMapping("/createModel") + public Boolean createModel(@RequestBody ModelReq modelReq, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + modelService.createModel(modelReq, user); + return true; + } + + @PostMapping("/updateModel") + public Boolean updateModel(@RequestBody ModelReq modelReq, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + modelService.updateModel(modelReq, user); + return true; + } + + @DeleteMapping("/deleteModel/{modelId}") + public Boolean deleteModel(@PathVariable("modelId") Long modelId) { + modelService.deleteModel(modelId); + return true; + } + + @GetMapping("/getModelList/{domainId}") + public List getModelList(@PathVariable("domainId") Long domainId, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + return modelService.getModelListWithAuth(user.getName(), domainId, AuthType.ADMIN); + } + + + @GetMapping("/getModel/{id}") + public ModelResp getModel(@PathVariable("id") Long id) { + return modelService.getModel(id); + } + + @GetMapping("/getModelListByIds/{modelIds}") + public List getModelListByIds(@PathVariable("modelIds") String modelIds) { + return modelService.getModelList(Arrays.stream(modelIds.split(",")).map(Long::parseLong) + .collect(Collectors.toList())); + } + +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/ViewInfoController.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/ViewInfoController.java index a88f028d9..e7dc98c84 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/ViewInfoController.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/ViewInfoController.java @@ -4,10 +4,9 @@ package com.tencent.supersonic.semantic.model.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.request.ViewInfoReq; -import com.tencent.supersonic.semantic.api.model.response.DomainSchemaRelaResp; -import com.tencent.supersonic.semantic.model.domain.dataobject.ViewInfoDO; +import com.tencent.supersonic.semantic.api.model.response.ModelSchemaRelaResp; import com.tencent.supersonic.semantic.model.application.ViewInfoServiceImpl; - +import com.tencent.supersonic.semantic.model.domain.dataobject.ViewInfoDO; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -37,9 +36,9 @@ public class ViewInfoController { return viewInfoServiceImpl.createOrUpdateViewInfo(viewInfoReq, user); } - @GetMapping("/getViewInfoList/{domainId}") - public List getViewInfoList(@PathVariable("domainId") Long domainId) { - return viewInfoServiceImpl.getViewInfoList(domainId); + @GetMapping("/getViewInfoList/{modelId}") + public List getViewInfoList(@PathVariable("modelId") Long modelId) { + return viewInfoServiceImpl.getViewInfoList(modelId); } @DeleteMapping("/deleteViewInfo/{id}") @@ -47,9 +46,9 @@ public class ViewInfoController { viewInfoServiceImpl.deleteViewInfo(id); } - @GetMapping("/getDomainSchemaRela/{domainId}") - public List getDomainSchema(@PathVariable("domainId") Long domainId) { - return viewInfoServiceImpl.getDomainSchema(domainId); + @GetMapping("/getDomainSchemaRela/{modelId}") + public List getDomainSchema(@PathVariable("modelId") Long modelId) { + return viewInfoServiceImpl.getDomainSchema(modelId); } diff --git a/semantic/model/src/main/resources/mapper/DatabaseDOMapper.xml b/semantic/model/src/main/resources/mapper/DatabaseDOMapper.xml index 7ebe89615..bc9cd5c02 100644 --- a/semantic/model/src/main/resources/mapper/DatabaseDOMapper.xml +++ b/semantic/model/src/main/resources/mapper/DatabaseDOMapper.xml @@ -52,7 +52,8 @@ id - , domain_id, name, description, version, type, created_at, created_by, updated_at, updated_by + , domain_id, name, description, version, type, created_at, created_by, updated_at, + updated_by config @@ -110,15 +111,15 @@ insert into s2_database (id, domain_id, name, - description, version, type, created_at, - created_by, updated_at, updated_by, - config) + description, version, type, + created_at, created_by, updated_at, + updated_by, config) values (#{id,jdbcType=BIGINT}, #{domainId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, - #{description,jdbcType=VARCHAR},#{version,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR}, - #{createdAt,jdbcType=TIMESTAMP}, - #{createdBy,jdbcType=VARCHAR}, #{updatedAt,jdbcType=TIMESTAMP}, - #{updatedBy,jdbcType=VARCHAR}, - #{config,jdbcType=LONGVARCHAR}) + #{description,jdbcType=VARCHAR}, #{version,jdbcType=VARCHAR}, + #{type,jdbcType=VARCHAR}, + #{createdAt,jdbcType=TIMESTAMP}, #{createdBy,jdbcType=VARCHAR}, + #{updatedAt,jdbcType=TIMESTAMP}, + #{updatedBy,jdbcType=VARCHAR}, #{config,jdbcType=LONGVARCHAR}) @@ -245,7 +246,7 @@ set domain_id = #{domainId,jdbcType=BIGINT}, name = #{name,jdbcType=VARCHAR}, description = #{description,jdbcType=VARCHAR}, - version = #{version,jdbcType=VARCHAR}, + version = #{version,jdbcType=VARCHAR}, type = #{type,jdbcType=VARCHAR}, created_at = #{createdAt,jdbcType=TIMESTAMP}, created_by = #{createdBy,jdbcType=VARCHAR}, @@ -260,7 +261,7 @@ set domain_id = #{domainId,jdbcType=BIGINT}, name = #{name,jdbcType=VARCHAR}, description = #{description,jdbcType=VARCHAR}, - version = #{version,jdbcType=VARCHAR}, + version = #{version,jdbcType=VARCHAR}, type = #{type,jdbcType=VARCHAR}, created_at = #{createdAt,jdbcType=TIMESTAMP}, created_by = #{createdBy,jdbcType=VARCHAR}, diff --git a/semantic/model/src/main/resources/mapper/DatasourceDOMapper.xml b/semantic/model/src/main/resources/mapper/DatasourceDOMapper.xml index 86f9dd6e3..32ecd9641 100644 --- a/semantic/model/src/main/resources/mapper/DatasourceDOMapper.xml +++ b/semantic/model/src/main/resources/mapper/DatasourceDOMapper.xml @@ -5,7 +5,7 @@ - + @@ -52,8 +52,8 @@ id - , domain_id, name, biz_name, description, database_id, created_at, created_by, - updated_at, updated_by + , model_id, name, biz_name, description, database_id, created_at, created_by, updated_at, + updated_by datasource_detail @@ -110,11 +110,11 @@ - insert into s2_datasource (id, domain_id, name, + insert into s2_datasource (id, model_id, name, biz_name, description, database_id, created_at, created_by, updated_at, updated_by, datasource_detail) - values (#{id,jdbcType=BIGINT}, #{domainId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, + values (#{id,jdbcType=BIGINT}, #{modelId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{bizName,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{databaseId,jdbcType=BIGINT}, #{createdAt,jdbcType=TIMESTAMP}, #{createdBy,jdbcType=VARCHAR}, @@ -128,8 +128,8 @@ id, - - domain_id, + + model_id, name, @@ -163,8 +163,8 @@ #{id,jdbcType=BIGINT}, - - #{domainId,jdbcType=BIGINT}, + + #{modelId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, @@ -207,8 +207,8 @@ parameterType="com.tencent.supersonic.semantic.model.domain.dataobject.DatasourceDO"> update s2_datasource - - domain_id = #{domainId,jdbcType=BIGINT}, + + model_id = #{modelId,jdbcType=BIGINT}, name = #{name,jdbcType=VARCHAR}, @@ -243,7 +243,7 @@ update s2_datasource - set domain_id = #{domainId,jdbcType=BIGINT}, + set model_id = #{modelId,jdbcType=BIGINT}, name = #{name,jdbcType=VARCHAR}, biz_name = #{bizName,jdbcType=VARCHAR}, description = #{description,jdbcType=VARCHAR}, @@ -258,7 +258,7 @@ update s2_datasource - set domain_id = #{domainId,jdbcType=BIGINT}, + set model_id = #{modelId,jdbcType=BIGINT}, name = #{name,jdbcType=VARCHAR}, biz_name = #{bizName,jdbcType=VARCHAR}, description = #{description,jdbcType=VARCHAR}, diff --git a/semantic/model/src/main/resources/mapper/DatasourceRelaDOMapper.xml b/semantic/model/src/main/resources/mapper/DatasourceRelaDOMapper.xml index 6c2fe6359..229ce4ac7 100644 --- a/semantic/model/src/main/resources/mapper/DatasourceRelaDOMapper.xml +++ b/semantic/model/src/main/resources/mapper/DatasourceRelaDOMapper.xml @@ -5,7 +5,7 @@ - + @@ -47,8 +47,8 @@ id - , domain_id, datasource_from, datasource_to, join_key, created_at, created_by, - updated_at, updated_by + , model_id, datasource_from, datasource_to, join_key, created_at, created_by, updated_at, + updated_by + select + + distinct - - - - - id, domain_id, datasource_id, name, biz_name, description, status, sensitive_level, - type, created_at, created_by, updated_at, updated_by, semantic_type, alias, default_values, dim_value_maps - - - type_params, expr - - - - - - delete from s2_dimension - where id = #{id,jdbcType=BIGINT} - - - insert into s2_dimension (id, domain_id, datasource_id, - name, biz_name, description, - status, sensitive_level, type, - created_at, created_by, updated_at, - updated_by, semantic_type, alias, - default_values, type_params, expr, - dim_value_maps - ) - values (#{id,jdbcType=BIGINT}, #{domainId,jdbcType=BIGINT}, #{datasourceId,jdbcType=BIGINT}, - #{name,jdbcType=VARCHAR}, #{bizName,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, - #{status,jdbcType=INTEGER}, #{sensitiveLevel,jdbcType=INTEGER}, #{type,jdbcType=VARCHAR}, - #{createdAt,jdbcType=TIMESTAMP}, #{createdBy,jdbcType=VARCHAR}, #{updatedAt,jdbcType=TIMESTAMP}, - #{updatedBy,jdbcType=VARCHAR}, #{semanticType,jdbcType=VARCHAR}, #{alias,jdbcType=VARCHAR}, - #{defaultValues,jdbcType=VARCHAR}, #{typeParams,jdbcType=LONGVARCHAR}, #{expr,jdbcType=LONGVARCHAR}, - #{dimValueMaps,jdbcType=VARCHAR} - ) - - - insert into s2_dimension - - - id, - - - domain_id, - - - datasource_id, - - - name, - - - biz_name, - - - description, - - - status, - - - sensitive_level, - - - type, - - - created_at, - - - created_by, - - - updated_at, - - - updated_by, - - - semantic_type, - - - alias, - - - default_values, - - - dim_value_maps, - - - type_params, - - - expr, - - - - - #{id,jdbcType=BIGINT}, - - - #{domainId,jdbcType=BIGINT}, - - - #{datasourceId,jdbcType=BIGINT}, - - - #{name,jdbcType=VARCHAR}, - - - #{bizName,jdbcType=VARCHAR}, - - - #{description,jdbcType=VARCHAR}, - - - #{status,jdbcType=INTEGER}, - - - #{sensitiveLevel,jdbcType=INTEGER}, - - - #{type,jdbcType=VARCHAR}, - - - #{createdAt,jdbcType=TIMESTAMP}, - - - #{createdBy,jdbcType=VARCHAR}, - - - #{updatedAt,jdbcType=TIMESTAMP}, - - - #{updatedBy,jdbcType=VARCHAR}, - - - #{semanticType,jdbcType=VARCHAR}, - - - #{alias,jdbcType=VARCHAR}, - - - #{defaultValues,jdbcType=VARCHAR}, - - - #{dimValueMaps,jdbcType=VARCHAR}, - - - #{typeParams,jdbcType=LONGVARCHAR}, - - - #{expr,jdbcType=LONGVARCHAR}, - - - - - - update s2_dimension - - - domain_id = #{domainId,jdbcType=BIGINT}, - - - datasource_id = #{datasourceId,jdbcType=BIGINT}, - - - name = #{name,jdbcType=VARCHAR}, - - - biz_name = #{bizName,jdbcType=VARCHAR}, - - - description = #{description,jdbcType=VARCHAR}, - - - status = #{status,jdbcType=INTEGER}, - - - sensitive_level = #{sensitiveLevel,jdbcType=INTEGER}, - - - type = #{type,jdbcType=VARCHAR}, - - - created_at = #{createdAt,jdbcType=TIMESTAMP}, - - - created_by = #{createdBy,jdbcType=VARCHAR}, - - - updated_at = #{updatedAt,jdbcType=TIMESTAMP}, - - - updated_by = #{updatedBy,jdbcType=VARCHAR}, - - - semantic_type = #{semanticType,jdbcType=VARCHAR}, - - - alias = #{alias,jdbcType=VARCHAR}, - - - default_values = #{defaultValues,jdbcType=VARCHAR}, - - - dim_value_maps = #{dimValueMaps,jdbcType=VARCHAR}, - - - type_params = #{typeParams,jdbcType=LONGVARCHAR}, - - - expr = #{expr,jdbcType=LONGVARCHAR}, - - - where id = #{id,jdbcType=BIGINT} - - - update s2_dimension - set domain_id = #{domainId,jdbcType=BIGINT}, - datasource_id = #{datasourceId,jdbcType=BIGINT}, - name = #{name,jdbcType=VARCHAR}, - biz_name = #{bizName,jdbcType=VARCHAR}, - description = #{description,jdbcType=VARCHAR}, - status = #{status,jdbcType=INTEGER}, - sensitive_level = #{sensitiveLevel,jdbcType=INTEGER}, - type = #{type,jdbcType=VARCHAR}, - created_at = #{createdAt,jdbcType=TIMESTAMP}, - created_by = #{createdBy,jdbcType=VARCHAR}, - updated_at = #{updatedAt,jdbcType=TIMESTAMP}, - updated_by = #{updatedBy,jdbcType=VARCHAR}, - semantic_type = #{semanticType,jdbcType=VARCHAR}, - alias = #{alias,jdbcType=VARCHAR}, - default_values = #{defaultValues,jdbcType=VARCHAR}, - dim_value_maps = #{dimValueMaps,jdbcType=VARCHAR}, - type_params = #{typeParams,jdbcType=LONGVARCHAR}, - expr = #{expr,jdbcType=LONGVARCHAR} - where id = #{id,jdbcType=BIGINT} - - - update s2_dimension - set domain_id = #{domainId,jdbcType=BIGINT}, - datasource_id = #{datasourceId,jdbcType=BIGINT}, - name = #{name,jdbcType=VARCHAR}, - biz_name = #{bizName,jdbcType=VARCHAR}, - description = #{description,jdbcType=VARCHAR}, - status = #{status,jdbcType=INTEGER}, - sensitive_level = #{sensitiveLevel,jdbcType=INTEGER}, - type = #{type,jdbcType=VARCHAR}, - created_at = #{createdAt,jdbcType=TIMESTAMP}, - created_by = #{createdBy,jdbcType=VARCHAR}, - updated_at = #{updatedAt,jdbcType=TIMESTAMP}, - updated_by = #{updatedBy,jdbcType=VARCHAR}, - semantic_type = #{semanticType,jdbcType=VARCHAR}, - alias = #{alias,jdbcType=VARCHAR}, - default_values = #{defaultValues,jdbcType=VARCHAR}, - dim_value_maps = #{dimValueMaps,jdbcType=VARCHAR} - where id = #{id,jdbcType=BIGINT} - + + , + + from s2_dimension + + + + + order by ${orderByClause} + + + + + + delete + from s2_dimension + where id = #{id,jdbcType=BIGINT} + + + insert into s2_dimension (id, model_id, datasource_id, + name, biz_name, description, + status, sensitive_level, type, + created_at, created_by, updated_at, + updated_by, semantic_type, alias, + default_values, dim_value_maps, type_params, + expr) + values (#{id,jdbcType=BIGINT}, #{modelId,jdbcType=BIGINT}, #{datasourceId,jdbcType=BIGINT}, + #{name,jdbcType=VARCHAR}, #{bizName,jdbcType=VARCHAR}, + #{description,jdbcType=VARCHAR}, + #{status,jdbcType=INTEGER}, #{sensitiveLevel,jdbcType=INTEGER}, + #{type,jdbcType=VARCHAR}, + #{createdAt,jdbcType=TIMESTAMP}, #{createdBy,jdbcType=VARCHAR}, + #{updatedAt,jdbcType=TIMESTAMP}, + #{updatedBy,jdbcType=VARCHAR}, #{semanticType,jdbcType=VARCHAR}, + #{alias,jdbcType=VARCHAR}, + #{defaultValues,jdbcType=VARCHAR}, #{dimValueMaps,jdbcType=VARCHAR}, + #{typeParams,jdbcType=LONGVARCHAR}, + #{expr,jdbcType=LONGVARCHAR}) + + + insert into s2_dimension + + + id, + + + model_id, + + + datasource_id, + + + name, + + + biz_name, + + + description, + + + status, + + + sensitive_level, + + + type, + + + created_at, + + + created_by, + + + updated_at, + + + updated_by, + + + semantic_type, + + + alias, + + + default_values, + + + dim_value_maps, + + + type_params, + + + expr, + + + + + #{id,jdbcType=BIGINT}, + + + #{modelId,jdbcType=BIGINT}, + + + #{datasourceId,jdbcType=BIGINT}, + + + #{name,jdbcType=VARCHAR}, + + + #{bizName,jdbcType=VARCHAR}, + + + #{description,jdbcType=VARCHAR}, + + + #{status,jdbcType=INTEGER}, + + + #{sensitiveLevel,jdbcType=INTEGER}, + + + #{type,jdbcType=VARCHAR}, + + + #{createdAt,jdbcType=TIMESTAMP}, + + + #{createdBy,jdbcType=VARCHAR}, + + + #{updatedAt,jdbcType=TIMESTAMP}, + + + #{updatedBy,jdbcType=VARCHAR}, + + + #{semanticType,jdbcType=VARCHAR}, + + + #{alias,jdbcType=VARCHAR}, + + + #{defaultValues,jdbcType=VARCHAR}, + + + #{dimValueMaps,jdbcType=VARCHAR}, + + + #{typeParams,jdbcType=LONGVARCHAR}, + + + #{expr,jdbcType=LONGVARCHAR}, + + + + + + update s2_dimension + + + model_id = #{modelId,jdbcType=BIGINT}, + + + datasource_id = #{datasourceId,jdbcType=BIGINT}, + + + name = #{name,jdbcType=VARCHAR}, + + + biz_name = #{bizName,jdbcType=VARCHAR}, + + + description = #{description,jdbcType=VARCHAR}, + + + status = #{status,jdbcType=INTEGER}, + + + sensitive_level = #{sensitiveLevel,jdbcType=INTEGER}, + + + type = #{type,jdbcType=VARCHAR}, + + + created_at = #{createdAt,jdbcType=TIMESTAMP}, + + + created_by = #{createdBy,jdbcType=VARCHAR}, + + + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + + + updated_by = #{updatedBy,jdbcType=VARCHAR}, + + + semantic_type = #{semanticType,jdbcType=VARCHAR}, + + + alias = #{alias,jdbcType=VARCHAR}, + + + default_values = #{defaultValues,jdbcType=VARCHAR}, + + + dim_value_maps = #{dimValueMaps,jdbcType=VARCHAR}, + + + type_params = #{typeParams,jdbcType=LONGVARCHAR}, + + + expr = #{expr,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update s2_dimension + set model_id = #{modelId,jdbcType=BIGINT}, + datasource_id = #{datasourceId,jdbcType=BIGINT}, + name = #{name,jdbcType=VARCHAR}, + biz_name = #{bizName,jdbcType=VARCHAR}, + description = #{description,jdbcType=VARCHAR}, + status = #{status,jdbcType=INTEGER}, + sensitive_level = #{sensitiveLevel,jdbcType=INTEGER}, + type = #{type,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + semantic_type = #{semanticType,jdbcType=VARCHAR}, + alias = #{alias,jdbcType=VARCHAR}, + default_values = #{defaultValues,jdbcType=VARCHAR}, + dim_value_maps = #{dimValueMaps,jdbcType=VARCHAR}, + type_params = #{typeParams,jdbcType=LONGVARCHAR}, + expr = #{expr,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=BIGINT} + + + update s2_dimension + set model_id = #{modelId,jdbcType=BIGINT}, + datasource_id = #{datasourceId,jdbcType=BIGINT}, + name = #{name,jdbcType=VARCHAR}, + biz_name = #{bizName,jdbcType=VARCHAR}, + description = #{description,jdbcType=VARCHAR}, + status = #{status,jdbcType=INTEGER}, + sensitive_level = #{sensitiveLevel,jdbcType=INTEGER}, + type = #{type,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + semantic_type = #{semanticType,jdbcType=VARCHAR}, + alias = #{alias,jdbcType=VARCHAR}, + default_values = #{defaultValues,jdbcType=VARCHAR}, + dim_value_maps = #{dimValueMaps,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + \ No newline at end of file diff --git a/semantic/model/src/main/resources/mapper/DomainDOMapper.xml b/semantic/model/src/main/resources/mapper/DomainDOMapper.xml index 3d27b8f19..1ff98d709 100644 --- a/semantic/model/src/main/resources/mapper/DomainDOMapper.xml +++ b/semantic/model/src/main/resources/mapper/DomainDOMapper.xml @@ -18,7 +18,6 @@ - @@ -54,7 +53,7 @@ id , name, biz_name, parent_id, status, created_at, created_by, updated_at, updated_by, - admin, admin_org, is_open, viewer, view_org, entity + admin, admin_org, is_open, viewer, view_org view_org = #{viewOrg,jdbcType=VARCHAR}, - - entity = #{entity,jdbcType=VARCHAR}, - where id = #{id,jdbcType=BIGINT} @@ -271,8 +261,7 @@ admin_org = #{adminOrg,jdbcType=VARCHAR}, is_open = #{isOpen,jdbcType=INTEGER}, viewer = #{viewer,jdbcType=VARCHAR}, - view_org = #{viewOrg,jdbcType=VARCHAR}, - entity = #{entity,jdbcType=VARCHAR} + view_org = #{viewOrg,jdbcType=VARCHAR} where id = #{id,jdbcType=BIGINT} \ No newline at end of file diff --git a/semantic/model/src/main/resources/mapper/MetricDOMapper.xml b/semantic/model/src/main/resources/mapper/MetricDOMapper.xml index bd3175540..357fe78c0 100644 --- a/semantic/model/src/main/resources/mapper/MetricDOMapper.xml +++ b/semantic/model/src/main/resources/mapper/MetricDOMapper.xml @@ -1,316 +1,338 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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} + + + + + + - - - - - - - id, domain_id, name, biz_name, description, status, sensitive_level, type, created_at, + + + + id + , model_id, name, biz_name, description, status, sensitive_level, type, created_at, created_by, updated_at, updated_by, data_format_type, data_format, alias - - - type_params - - - - - - delete from s2_metric - where id = #{id,jdbcType=BIGINT} - - - insert into s2_metric (id, domain_id, name, - biz_name, description, status, - sensitive_level, type, created_at, - created_by, updated_at, updated_by, - data_format_type, data_format, alias, - type_params) - values (#{id,jdbcType=BIGINT}, #{domainId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, - #{bizName,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{status,jdbcType=INTEGER}, - #{sensitiveLevel,jdbcType=INTEGER}, #{type,jdbcType=VARCHAR}, #{createdAt,jdbcType=TIMESTAMP}, - #{createdBy,jdbcType=VARCHAR}, #{updatedAt,jdbcType=TIMESTAMP}, #{updatedBy,jdbcType=VARCHAR}, - #{dataFormatType,jdbcType=VARCHAR}, #{dataFormat,jdbcType=VARCHAR}, #{alias,jdbcType=VARCHAR}, - #{typeParams,jdbcType=LONGVARCHAR}) - - - insert into s2_metric - - - id, - - - domain_id, - - - name, - - - biz_name, - - - description, - - - status, - - - sensitive_level, - - - type, - - - created_at, - - - created_by, - - - updated_at, - - - updated_by, - - - data_format_type, - - - data_format, - - - alias, - - - type_params, - - - - - #{id,jdbcType=BIGINT}, - - - #{domainId,jdbcType=BIGINT}, - - - #{name,jdbcType=VARCHAR}, - - - #{bizName,jdbcType=VARCHAR}, - - - #{description,jdbcType=VARCHAR}, - - - #{status,jdbcType=INTEGER}, - - - #{sensitiveLevel,jdbcType=INTEGER}, - - - #{type,jdbcType=VARCHAR}, - - - #{createdAt,jdbcType=TIMESTAMP}, - - - #{createdBy,jdbcType=VARCHAR}, - - - #{updatedAt,jdbcType=TIMESTAMP}, - - - #{updatedBy,jdbcType=VARCHAR}, - - - #{dataFormatType,jdbcType=VARCHAR}, - - - #{dataFormat,jdbcType=VARCHAR}, - - - #{alias,jdbcType=VARCHAR}, - - - #{typeParams,jdbcType=LONGVARCHAR}, - - - - - - update s2_metric - - - domain_id = #{domainId,jdbcType=BIGINT}, - - - name = #{name,jdbcType=VARCHAR}, - - - biz_name = #{bizName,jdbcType=VARCHAR}, - - - description = #{description,jdbcType=VARCHAR}, - - - status = #{status,jdbcType=INTEGER}, - - - sensitive_level = #{sensitiveLevel,jdbcType=INTEGER}, - - - type = #{type,jdbcType=VARCHAR}, - - - created_at = #{createdAt,jdbcType=TIMESTAMP}, - - - created_by = #{createdBy,jdbcType=VARCHAR}, - - - updated_at = #{updatedAt,jdbcType=TIMESTAMP}, - - - updated_by = #{updatedBy,jdbcType=VARCHAR}, - - - data_format_type = #{dataFormatType,jdbcType=VARCHAR}, - - - data_format = #{dataFormat,jdbcType=VARCHAR}, - - - alias = #{alias,jdbcType=VARCHAR}, - - - type_params = #{typeParams,jdbcType=LONGVARCHAR}, - - - where id = #{id,jdbcType=BIGINT} - - - update s2_metric - set domain_id = #{domainId,jdbcType=BIGINT}, - name = #{name,jdbcType=VARCHAR}, - biz_name = #{bizName,jdbcType=VARCHAR}, - description = #{description,jdbcType=VARCHAR}, - status = #{status,jdbcType=INTEGER}, - sensitive_level = #{sensitiveLevel,jdbcType=INTEGER}, - type = #{type,jdbcType=VARCHAR}, - created_at = #{createdAt,jdbcType=TIMESTAMP}, - created_by = #{createdBy,jdbcType=VARCHAR}, - updated_at = #{updatedAt,jdbcType=TIMESTAMP}, - updated_by = #{updatedBy,jdbcType=VARCHAR}, - data_format_type = #{dataFormatType,jdbcType=VARCHAR}, - data_format = #{dataFormat,jdbcType=VARCHAR}, - alias = #{alias,jdbcType=VARCHAR}, - type_params = #{typeParams,jdbcType=LONGVARCHAR} - where id = #{id,jdbcType=BIGINT} - - - update s2_metric - set domain_id = #{domainId,jdbcType=BIGINT}, - name = #{name,jdbcType=VARCHAR}, - biz_name = #{bizName,jdbcType=VARCHAR}, - description = #{description,jdbcType=VARCHAR}, - status = #{status,jdbcType=INTEGER}, - sensitive_level = #{sensitiveLevel,jdbcType=INTEGER}, - type = #{type,jdbcType=VARCHAR}, - created_at = #{createdAt,jdbcType=TIMESTAMP}, - created_by = #{createdBy,jdbcType=VARCHAR}, - updated_at = #{updatedAt,jdbcType=TIMESTAMP}, - updated_by = #{updatedBy,jdbcType=VARCHAR}, - data_format_type = #{dataFormatType,jdbcType=VARCHAR}, - data_format = #{dataFormat,jdbcType=VARCHAR}, - alias = #{alias,jdbcType=VARCHAR} - where id = #{id,jdbcType=BIGINT} - + + + type_params + + + + + + delete + from s2_metric + where id = #{id,jdbcType=BIGINT} + + + insert into s2_metric (id, model_id, name, + biz_name, description, status, + sensitive_level, type, created_at, + created_by, updated_at, updated_by, + data_format_type, data_format, alias, + type_params) + values (#{id,jdbcType=BIGINT}, #{modelId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, + #{bizName,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, + #{status,jdbcType=INTEGER}, + #{sensitiveLevel,jdbcType=INTEGER}, #{type,jdbcType=VARCHAR}, + #{createdAt,jdbcType=TIMESTAMP}, + #{createdBy,jdbcType=VARCHAR}, #{updatedAt,jdbcType=TIMESTAMP}, + #{updatedBy,jdbcType=VARCHAR}, + #{dataFormatType,jdbcType=VARCHAR}, #{dataFormat,jdbcType=VARCHAR}, + #{alias,jdbcType=VARCHAR}, + #{typeParams,jdbcType=LONGVARCHAR}) + + + insert into s2_metric + + + id, + + + model_id, + + + name, + + + biz_name, + + + description, + + + status, + + + sensitive_level, + + + type, + + + created_at, + + + created_by, + + + updated_at, + + + updated_by, + + + data_format_type, + + + data_format, + + + alias, + + + type_params, + + + + + #{id,jdbcType=BIGINT}, + + + #{modelId,jdbcType=BIGINT}, + + + #{name,jdbcType=VARCHAR}, + + + #{bizName,jdbcType=VARCHAR}, + + + #{description,jdbcType=VARCHAR}, + + + #{status,jdbcType=INTEGER}, + + + #{sensitiveLevel,jdbcType=INTEGER}, + + + #{type,jdbcType=VARCHAR}, + + + #{createdAt,jdbcType=TIMESTAMP}, + + + #{createdBy,jdbcType=VARCHAR}, + + + #{updatedAt,jdbcType=TIMESTAMP}, + + + #{updatedBy,jdbcType=VARCHAR}, + + + #{dataFormatType,jdbcType=VARCHAR}, + + + #{dataFormat,jdbcType=VARCHAR}, + + + #{alias,jdbcType=VARCHAR}, + + + #{typeParams,jdbcType=LONGVARCHAR}, + + + + + + update s2_metric + + + model_id = #{modelId,jdbcType=BIGINT}, + + + name = #{name,jdbcType=VARCHAR}, + + + biz_name = #{bizName,jdbcType=VARCHAR}, + + + description = #{description,jdbcType=VARCHAR}, + + + status = #{status,jdbcType=INTEGER}, + + + sensitive_level = #{sensitiveLevel,jdbcType=INTEGER}, + + + type = #{type,jdbcType=VARCHAR}, + + + created_at = #{createdAt,jdbcType=TIMESTAMP}, + + + created_by = #{createdBy,jdbcType=VARCHAR}, + + + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + + + updated_by = #{updatedBy,jdbcType=VARCHAR}, + + + data_format_type = #{dataFormatType,jdbcType=VARCHAR}, + + + data_format = #{dataFormat,jdbcType=VARCHAR}, + + + alias = #{alias,jdbcType=VARCHAR}, + + + type_params = #{typeParams,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update s2_metric + set model_id = #{modelId,jdbcType=BIGINT}, + name = #{name,jdbcType=VARCHAR}, + biz_name = #{bizName,jdbcType=VARCHAR}, + description = #{description,jdbcType=VARCHAR}, + status = #{status,jdbcType=INTEGER}, + sensitive_level = #{sensitiveLevel,jdbcType=INTEGER}, + type = #{type,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + data_format_type = #{dataFormatType,jdbcType=VARCHAR}, + data_format = #{dataFormat,jdbcType=VARCHAR}, + alias = #{alias,jdbcType=VARCHAR}, + type_params = #{typeParams,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=BIGINT} + + + update s2_metric + set model_id = #{modelId,jdbcType=BIGINT}, + name = #{name,jdbcType=VARCHAR}, + biz_name = #{bizName,jdbcType=VARCHAR}, + description = #{description,jdbcType=VARCHAR}, + status = #{status,jdbcType=INTEGER}, + sensitive_level = #{sensitiveLevel,jdbcType=INTEGER}, + type = #{type,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + created_by = #{createdBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + data_format_type = #{dataFormatType,jdbcType=VARCHAR}, + data_format = #{dataFormat,jdbcType=VARCHAR}, + alias = #{alias,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + \ No newline at end of file diff --git a/semantic/model/src/main/resources/mapper/ModelDOMapper.xml b/semantic/model/src/main/resources/mapper/ModelDOMapper.xml new file mode 100644 index 000000000..4e7fa4bb0 --- /dev/null +++ b/semantic/model/src/main/resources/mapper/ModelDOMapper.xml @@ -0,0 +1,430 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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} + + + + + + + + + + + id + , name, biz_name, domain_id, viewer, view_org, admin, admin_org, is_open, created_by, + created_at, updated_by, updated_at + + + entity + + + + + + delete + from s2_model + where id = #{id,jdbcType=BIGINT} + + + insert into s2_model (id, name, biz_name, + domain_id, viewer, view_org, + admin, admin_org, is_open, + created_by, created_at, updated_by, + updated_at, entity) + values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{bizName,jdbcType=VARCHAR}, + #{domainId,jdbcType=BIGINT}, #{viewer,jdbcType=VARCHAR}, + #{viewOrg,jdbcType=VARCHAR}, + #{admin,jdbcType=VARCHAR}, #{adminOrg,jdbcType=VARCHAR}, #{isOpen,jdbcType=INTEGER}, + #{createdBy,jdbcType=VARCHAR}, #{createdAt,jdbcType=TIMESTAMP}, + #{updatedBy,jdbcType=VARCHAR}, + #{updatedAt,jdbcType=TIMESTAMP}, #{entity,jdbcType=LONGVARCHAR}) + + + insert into s2_model + + + id, + + + name, + + + biz_name, + + + domain_id, + + + viewer, + + + view_org, + + + admin, + + + admin_org, + + + is_open, + + + created_by, + + + created_at, + + + updated_by, + + + updated_at, + + + entity, + + + + + #{id,jdbcType=BIGINT}, + + + #{name,jdbcType=VARCHAR}, + + + #{bizName,jdbcType=VARCHAR}, + + + #{domainId,jdbcType=BIGINT}, + + + #{viewer,jdbcType=VARCHAR}, + + + #{viewOrg,jdbcType=VARCHAR}, + + + #{admin,jdbcType=VARCHAR}, + + + #{adminOrg,jdbcType=VARCHAR}, + + + #{isOpen,jdbcType=INTEGER}, + + + #{createdBy,jdbcType=VARCHAR}, + + + #{createdAt,jdbcType=TIMESTAMP}, + + + #{updatedBy,jdbcType=VARCHAR}, + + + #{updatedAt,jdbcType=TIMESTAMP}, + + + #{entity,jdbcType=LONGVARCHAR}, + + + + + + update s2_model + + + id = #{record.id,jdbcType=BIGINT}, + + + name = #{record.name,jdbcType=VARCHAR}, + + + biz_name = #{record.bizName,jdbcType=VARCHAR}, + + + domain_id = #{record.domainId,jdbcType=BIGINT}, + + + viewer = #{record.viewer,jdbcType=VARCHAR}, + + + view_org = #{record.viewOrg,jdbcType=VARCHAR}, + + + admin = #{record.admin,jdbcType=VARCHAR}, + + + admin_org = #{record.adminOrg,jdbcType=VARCHAR}, + + + is_open = #{record.isOpen,jdbcType=INTEGER}, + + + created_by = #{record.createdBy,jdbcType=VARCHAR}, + + + created_at = #{record.createdAt,jdbcType=TIMESTAMP}, + + + updated_by = #{record.updatedBy,jdbcType=VARCHAR}, + + + updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}, + + + entity = #{record.entity,jdbcType=LONGVARCHAR}, + + + + + + + + update s2_model + set id = #{record.id,jdbcType=BIGINT}, + name = #{record.name,jdbcType=VARCHAR}, + biz_name = #{record.bizName,jdbcType=VARCHAR}, + domain_id = #{record.domainId,jdbcType=BIGINT}, + viewer = #{record.viewer,jdbcType=VARCHAR}, + view_org = #{record.viewOrg,jdbcType=VARCHAR}, + admin = #{record.admin,jdbcType=VARCHAR}, + admin_org = #{record.adminOrg,jdbcType=VARCHAR}, + is_open = #{record.isOpen,jdbcType=INTEGER}, + created_by = #{record.createdBy,jdbcType=VARCHAR}, + created_at = #{record.createdAt,jdbcType=TIMESTAMP}, + updated_by = #{record.updatedBy,jdbcType=VARCHAR}, + updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}, + entity = #{record.entity,jdbcType=LONGVARCHAR} + + + + + + update s2_model + set id = #{record.id,jdbcType=BIGINT}, + name = #{record.name,jdbcType=VARCHAR}, + biz_name = #{record.bizName,jdbcType=VARCHAR}, + domain_id = #{record.domainId,jdbcType=BIGINT}, + viewer = #{record.viewer,jdbcType=VARCHAR}, + view_org = #{record.viewOrg,jdbcType=VARCHAR}, + admin = #{record.admin,jdbcType=VARCHAR}, + admin_org = #{record.adminOrg,jdbcType=VARCHAR}, + is_open = #{record.isOpen,jdbcType=INTEGER}, + created_by = #{record.createdBy,jdbcType=VARCHAR}, + created_at = #{record.createdAt,jdbcType=TIMESTAMP}, + updated_by = #{record.updatedBy,jdbcType=VARCHAR}, + updated_at = #{record.updatedAt,jdbcType=TIMESTAMP} + + + + + + update s2_model + + + name = #{name,jdbcType=VARCHAR}, + + + biz_name = #{bizName,jdbcType=VARCHAR}, + + + domain_id = #{domainId,jdbcType=BIGINT}, + + + viewer = #{viewer,jdbcType=VARCHAR}, + + + view_org = #{viewOrg,jdbcType=VARCHAR}, + + + admin = #{admin,jdbcType=VARCHAR}, + + + admin_org = #{adminOrg,jdbcType=VARCHAR}, + + + is_open = #{isOpen,jdbcType=INTEGER}, + + + created_by = #{createdBy,jdbcType=VARCHAR}, + + + created_at = #{createdAt,jdbcType=TIMESTAMP}, + + + updated_by = #{updatedBy,jdbcType=VARCHAR}, + + + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + + + entity = #{entity,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update s2_model + set name = #{name,jdbcType=VARCHAR}, + biz_name = #{bizName,jdbcType=VARCHAR}, + domain_id = #{domainId,jdbcType=BIGINT}, + viewer = #{viewer,jdbcType=VARCHAR}, + view_org = #{viewOrg,jdbcType=VARCHAR}, + admin = #{admin,jdbcType=VARCHAR}, + admin_org = #{adminOrg,jdbcType=VARCHAR}, + is_open = #{isOpen,jdbcType=INTEGER}, + created_by = #{createdBy,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + entity = #{entity,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=BIGINT} + + + update s2_model + set name = #{name,jdbcType=VARCHAR}, + biz_name = #{bizName,jdbcType=VARCHAR}, + domain_id = #{domainId,jdbcType=BIGINT}, + viewer = #{viewer,jdbcType=VARCHAR}, + view_org = #{viewOrg,jdbcType=VARCHAR}, + admin = #{admin,jdbcType=VARCHAR}, + admin_org = #{adminOrg,jdbcType=VARCHAR}, + is_open = #{isOpen,jdbcType=INTEGER}, + created_by = #{createdBy,jdbcType=VARCHAR}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + updated_by = #{updatedBy,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/semantic/model/src/main/resources/mapper/ViewInfoDOMapper.xml b/semantic/model/src/main/resources/mapper/ViewInfoDOMapper.xml index 06be22d1a..2bf8ba19d 100644 --- a/semantic/model/src/main/resources/mapper/ViewInfoDOMapper.xml +++ b/semantic/model/src/main/resources/mapper/ViewInfoDOMapper.xml @@ -5,7 +5,7 @@ - + @@ -49,7 +49,7 @@ id - , domain_id, type, created_at, created_by, updated_at, updated_by + , model_id, type, created_at, created_by, updated_at, updated_by config @@ -106,10 +106,10 @@ - insert into s2_view_info (id, domain_id, type, + insert into s2_view_info (id, model_id, type, created_at, created_by, updated_at, updated_by, config) - values (#{id,jdbcType=BIGINT}, #{domainId,jdbcType=BIGINT}, #{type,jdbcType=VARCHAR}, + values (#{id,jdbcType=BIGINT}, #{modelId,jdbcType=BIGINT}, #{type,jdbcType=VARCHAR}, #{createdAt,jdbcType=TIMESTAMP}, #{createdBy,jdbcType=VARCHAR}, #{updatedAt,jdbcType=TIMESTAMP}, #{updatedBy,jdbcType=VARCHAR}, #{config,jdbcType=LONGVARCHAR}) @@ -121,8 +121,8 @@ id, - - domain_id, + + model_id, type, @@ -147,8 +147,8 @@ #{id,jdbcType=BIGINT}, - - #{domainId,jdbcType=BIGINT}, + + #{modelId,jdbcType=BIGINT}, #{type,jdbcType=VARCHAR}, @@ -182,8 +182,8 @@ parameterType="com.tencent.supersonic.semantic.model.domain.dataobject.ViewInfoDO"> update s2_view_info - - domain_id = #{domainId,jdbcType=BIGINT}, + + model_id = #{modelId,jdbcType=BIGINT}, type = #{type,jdbcType=VARCHAR}, @@ -209,7 +209,7 @@ update s2_view_info - set domain_id = #{domainId,jdbcType=BIGINT}, + set model_id = #{modelId,jdbcType=BIGINT}, type = #{type,jdbcType=VARCHAR}, created_at = #{createdAt,jdbcType=TIMESTAMP}, created_by = #{createdBy,jdbcType=VARCHAR}, @@ -221,7 +221,7 @@ update s2_view_info - set domain_id = #{domainId,jdbcType=BIGINT}, + set model_id = #{modelId,jdbcType=BIGINT}, type = #{type,jdbcType=VARCHAR}, created_at = #{createdAt,jdbcType=TIMESTAMP}, created_by = #{createdBy,jdbcType=VARCHAR}, diff --git a/semantic/model/src/main/resources/mapper/custom/DateInfoMapper.xml b/semantic/model/src/main/resources/mapper/custom/DateInfoMapper.xml index 6ff811b16..a779eff32 100644 --- a/semantic/model/src/main/resources/mapper/custom/DateInfoMapper.xml +++ b/semantic/model/src/main/resources/mapper/custom/DateInfoMapper.xml @@ -20,7 +20,7 @@ insert into s2_available_date_info (`type`, item_id, date_format, start_date, end_date, unavailable_date, created_by, - updated_by,date_period) + updated_by, date_period) values (#{type}, #{itemId}, #{dateFormat}, #{startDate}, #{endDate}, #{unavailableDateList}, #{createdBy}, #{updatedBy}, #{datePeriod}) ON DUPLICATE KEY UPDATE @@ -44,7 +44,7 @@ and item_id in + separator=","> #{item} diff --git a/semantic/model/src/main/resources/mapper/custom/DimensionDOCustomMapper.xml b/semantic/model/src/main/resources/mapper/custom/DimensionDOCustomMapper.xml index ee4fb0362..14f6c9db4 100644 --- a/semantic/model/src/main/resources/mapper/custom/DimensionDOCustomMapper.xml +++ b/semantic/model/src/main/resources/mapper/custom/DimensionDOCustomMapper.xml @@ -9,7 +9,7 @@ - + @@ -55,13 +55,13 @@ id - , name, biz_name, description, status, domain_id, type, type_params, expr, datasource_id, + , name, biz_name, description, status, model_id, type, type_params, expr, datasource_id, created_at, created_by, updated_by, updated_at, semantic_type insert into s2_dimension (name, biz_name, - description, status, domain_id, + description, status, model_id, type, type_params, expr, datasource_id, created_at, created_by, updated_by, updated_at, semantic_type,sensitive_level) @@ -69,7 +69,7 @@ (#{dimension.name,jdbcType=VARCHAR}, #{dimension.bizName,jdbcType=VARCHAR}, #{dimension.description,jdbcType=VARCHAR}, #{dimension.status,jdbcType=INTEGER}, - #{dimension.domainId,jdbcType=BIGINT}, + #{dimension.modelId,jdbcType=BIGINT}, #{dimension.type,jdbcType=VARCHAR}, #{dimension.typeParams,jdbcType=VARCHAR}, #{dimension.expr,jdbcType=VARCHAR}, #{dimension.datasourceId,jdbcType=BIGINT}, #{dimension.createdAt,jdbcType=TIMESTAMP}, @@ -87,7 +87,7 @@ biz_name = #{dimension.bizName,jdbcType=VARCHAR}, description = #{dimension.description,jdbcType=VARCHAR}, status = #{dimension.status,jdbcType=INTEGER}, - domain_id = #{dimension.domainId,jdbcType=BIGINT}, + model_id = #{dimension.modelId,jdbcType=BIGINT}, type = #{dimension.type,jdbcType=VARCHAR}, type_params = #{dimension.typeParams,jdbcType=VARCHAR}, datasource_id = #{dimension.datasourceId,jdbcType=BIGINT}, diff --git a/semantic/model/src/main/resources/mapper/custom/MetricDOCustomMapper.xml b/semantic/model/src/main/resources/mapper/custom/MetricDOCustomMapper.xml index 0e2047e18..ac2c20e72 100644 --- a/semantic/model/src/main/resources/mapper/custom/MetricDOCustomMapper.xml +++ b/semantic/model/src/main/resources/mapper/custom/MetricDOCustomMapper.xml @@ -5,7 +5,7 @@ - + @@ -52,7 +52,7 @@ id - , domain_id, name, biz_name, description, type, created_at, created_by, updated_at, + , model_id, name, biz_name, description, type, created_at, created_by, updated_at, updated_by @@ -60,14 +60,14 @@ - insert into s2_metric (domain_id, name, + insert into s2_metric (model_id, name, biz_name, description, type,status,sensitive_level, created_at, created_by, updated_at, updated_by, type_params ) values - ( #{metric.domainId,jdbcType=BIGINT}, #{metric.name,jdbcType=VARCHAR}, + ( #{metric.modelId,jdbcType=BIGINT}, #{metric.name,jdbcType=VARCHAR}, #{metric.bizName,jdbcType=VARCHAR}, #{metric.description,jdbcType=VARCHAR}, #{metric.type,jdbcType=VARCHAR}, #{metric.status,jdbcType=VARCHAR},#{metric.sensitiveLevel,jdbcType=VARCHAR}, @@ -81,7 +81,7 @@ update s2_metric - set domain_id = #{metric.domainId,jdbcType=BIGINT}, + set model_id = #{metric.modelId,jdbcType=BIGINT}, name = #{metric.name,jdbcType=VARCHAR}, biz_name = #{metric.bizName,jdbcType=VARCHAR}, description = #{metric.description,jdbcType=VARCHAR}, @@ -98,26 +98,35 @@ diff --git a/semantic/model/src/main/resources/sql.ddl/s2_database.sql b/semantic/model/src/main/resources/sql.ddl/s2_database.sql index c429234f8..cfaf67bd3 100644 --- a/semantic/model/src/main/resources/sql.ddl/s2_database.sql +++ b/semantic/model/src/main/resources/sql.ddl/s2_database.sql @@ -4,7 +4,7 @@ CREATE TABLE `s2_database` `domain_id` bigint(20) NOT NULL COMMENT '主题域ID', `name` varchar(255) NOT NULL COMMENT '名称', `description` varchar(500) DEFAULT NULL COMMENT '描述', - `version` varchar(64) DEFAULT NULL COMMENT '版本', + `version` varchar(64) DEFAULT NULL COMMENT '版本', `type` varchar(20) NOT NULL COMMENT '类型 mysql,clickhouse,tdw', `config` text NOT NULL COMMENT '配置信息', `created_at` datetime NOT NULL COMMENT '创建时间', diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/executor/QueryExecutor.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/executor/QueryExecutor.java index 7561c00f9..13072d888 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/executor/QueryExecutor.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/executor/QueryExecutor.java @@ -8,5 +8,5 @@ public interface QueryExecutor { boolean accept(QueryStatement queryStatement); - QueryResultWithSchemaResp execute(Catalog catalog,QueryStatement queryStatement); + QueryResultWithSchemaResp execute(Catalog catalog, QueryStatement queryStatement); } diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/optimizer/QueryOptimizer.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/optimizer/QueryOptimizer.java index 956e852d0..ebd08503a 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/optimizer/QueryOptimizer.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/optimizer/QueryOptimizer.java @@ -4,5 +4,6 @@ import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; import com.tencent.supersonic.semantic.query.persistence.pojo.QueryStatement; public interface QueryOptimizer { + void rewrite(QueryStructReq queryStructCmd, QueryStatement queryStatement); } diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/SqlParser.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/SqlParser.java index c68ec43ce..6c04231bc 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/SqlParser.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/SqlParser.java @@ -5,5 +5,6 @@ import com.tencent.supersonic.semantic.model.domain.Catalog; import com.tencent.supersonic.semantic.query.persistence.pojo.QueryStatement; public interface SqlParser { + QueryStatement explain(MetricReq metricReq, boolean isAgg, Catalog catalog) throws Exception; } diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/CalciteSqlParser.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/CalciteSqlParser.java index a1b60c3c7..51d1e9337 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/CalciteSqlParser.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/CalciteSqlParser.java @@ -3,14 +3,15 @@ package com.tencent.supersonic.semantic.query.parser.calcite; import com.tencent.supersonic.semantic.api.query.request.MetricReq; import com.tencent.supersonic.semantic.model.domain.Catalog; import com.tencent.supersonic.semantic.query.parser.SqlParser; -import com.tencent.supersonic.semantic.query.parser.calcite.planner.AggPlanner; import com.tencent.supersonic.semantic.query.parser.calcite.dsl.SemanticModel; +import com.tencent.supersonic.semantic.query.parser.calcite.planner.AggPlanner; import com.tencent.supersonic.semantic.query.parser.calcite.schema.SemanticSchema; import com.tencent.supersonic.semantic.query.persistence.pojo.QueryStatement; import org.springframework.stereotype.Component; @Component("CalciteSqlParser") public class CalciteSqlParser implements SqlParser { + private final SemanticSchemaManager semanticSchemaManager; public CalciteSqlParser( diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/Configuration.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/Configuration.java index 4e66c1b26..8a72b31fb 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/Configuration.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/Configuration.java @@ -1,8 +1,8 @@ package com.tencent.supersonic.semantic.query.parser.calcite; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.DSLSqlValidatorImpl; import com.tencent.supersonic.semantic.query.parser.calcite.schema.SemanticSqlDialect; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.DSLSqlValidatorImpl; import java.util.Properties; import org.apache.calcite.avatica.util.Casing; import org.apache.calcite.avatica.util.Quoting; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/SemanticSchemaManager.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/SemanticSchemaManager.java index 5bed67838..8a7c63822 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/SemanticSchemaManager.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/SemanticSchemaManager.java @@ -54,18 +54,18 @@ public class SemanticSchemaManager { public SemanticModel reload(String rootPath) { SemanticModel semanticModel = new SemanticModel(); semanticModel.setRootPath(rootPath); - Map domainFullPathMap = catalog.getDomainFullPath(); - log.info("domainFullPathMap {}", domainFullPathMap); - Set domainIds = domainFullPathMap.entrySet().stream().filter(e -> e.getValue().startsWith(rootPath)) - .map(e -> e.getKey()).collect(Collectors.toSet()); - if (domainIds.isEmpty()) { - log.error("get domainId empty {}", rootPath); + Map modelFullPathMap = catalog.getModelFullPath(); + log.info("modelFullPathMap {}", modelFullPathMap); + Set modelIds = modelFullPathMap.entrySet().stream().filter(e -> e.getValue().startsWith(rootPath)) + .map(Entry::getKey).collect(Collectors.toSet()); + if (modelIds.isEmpty()) { + log.error("get modelIds empty {}", rootPath); return semanticModel; } Map> dimensionYamlTpls = new HashMap<>(); List datasourceYamlTpls = new ArrayList<>(); List metricYamlTpls = new ArrayList<>(); - catalog.getModelYamlTplByDomainIds(domainIds, dimensionYamlTpls, datasourceYamlTpls, metricYamlTpls); + catalog.getModelYamlTplByMoldelIds(modelIds, dimensionYamlTpls, datasourceYamlTpls, metricYamlTpls); if (!datasourceYamlTpls.isEmpty()) { Map dataSourceMap = datasourceYamlTpls.stream().map(d -> getDatasource(d)) .collect(Collectors.toMap(DataSource::getName, item -> item, (k1, k2) -> k1)); diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/planner/AggPlanner.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/planner/AggPlanner.java index e4eb17197..e80b09e1e 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/planner/AggPlanner.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/planner/AggPlanner.java @@ -2,12 +2,12 @@ package com.tencent.supersonic.semantic.query.parser.calcite.planner; import com.tencent.supersonic.semantic.api.query.request.MetricReq; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.Renderer; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.TableView; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.DataSourceNode; import com.tencent.supersonic.semantic.query.parser.calcite.dsl.DataSource; import com.tencent.supersonic.semantic.query.parser.calcite.schema.SchemaBuilder; import com.tencent.supersonic.semantic.query.parser.calcite.schema.SemanticSchema; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.Renderer; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.TableView; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.DataSourceNode; import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.SemanticNode; import com.tencent.supersonic.semantic.query.parser.calcite.sql.render.FilterRender; import com.tencent.supersonic.semantic.query.parser.calcite.sql.render.OutputRender; 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 f699e02bd..53698e782 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 @@ -2,15 +2,15 @@ package com.tencent.supersonic.semantic.query.parser.calcite.sql; import com.tencent.supersonic.semantic.api.query.request.MetricReq; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.MeasureNode; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.MetricNode; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.SemanticNode; 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.dsl.Identify; import com.tencent.supersonic.semantic.query.parser.calcite.dsl.Measure; import com.tencent.supersonic.semantic.query.parser.calcite.dsl.Metric; import com.tencent.supersonic.semantic.query.parser.calcite.schema.SemanticSchema; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.MeasureNode; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.MetricNode; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.SemanticNode; import java.util.HashSet; import java.util.List; import java.util.Optional; 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 054f518eb..58e61ed7a 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 @@ -21,7 +21,6 @@ import lombok.extern.slf4j.Slf4j; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.parser.SqlParser; import org.apache.calcite.sql.validate.SqlValidatorScope; -import org.springframework.util.CollectionUtils; @Slf4j public class DataSourceNode extends SemanticNode { @@ -61,16 +60,20 @@ public class DataSourceNode extends SemanticNode { metricCommand.getMetrics().stream().filter(m -> !schemaMetricName.contains(m)).forEach(m -> measures.add(m)); } + public static void mergeQueryFilterDimensionMeasure(SemanticSchema schema, MetricReq metricCommand, - Set queryDimension, List measures,SqlValidatorScope scope) throws Exception { - if(Objects.nonNull(metricCommand.getWhere()) && !metricCommand.getWhere().isEmpty()) { + 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()); - for(String filterCondition : filterConditions) { - if(schemaMetricName.contains(filterCondition)) { - schema.getMetrics().stream().filter(m->m.getName().equalsIgnoreCase(filterCondition)).forEach(m -> m.getMetricTypeParams().getMeasures().stream().forEach(mm -> queryMeasures.add(mm.getName()))); + Set queryMeasures = new HashSet<>(measures); + 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() + .forEach(mm -> queryMeasures.add(mm.getName()))); continue; } queryDimension.add(filterCondition); @@ -118,7 +121,7 @@ public class DataSourceNode extends SemanticNode { } filterMeasure.addAll(sourceMeasure); filterMeasure.addAll(dimension); - mergeQueryFilterDimensionMeasure(schema,metricCommand,queryDimension,measures,scope); + mergeQueryFilterDimensionMeasure(schema, metricCommand, queryDimension, measures, scope); boolean isAllMatch = checkMatch(sourceMeasure, queryDimension, measures, dimension, metricCommand, scope); if (isAllMatch) { log.info("baseDataSource match all "); diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/node/SemanticNode.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/node/SemanticNode.java index b143816cc..32bb9ab2b 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/node/SemanticNode.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/node/SemanticNode.java @@ -2,8 +2,8 @@ package com.tencent.supersonic.semantic.query.parser.calcite.sql.node; import com.tencent.supersonic.semantic.query.parser.calcite.Configuration; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.Optimization; import com.tencent.supersonic.semantic.query.parser.calcite.schema.SemanticSqlDialect; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.Optimization; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -16,9 +16,11 @@ import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlKind; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlSelect; +import org.apache.calcite.sql.SqlWriterConfig; import org.apache.calcite.sql.advise.SqlSimpleParser; import org.apache.calcite.sql.parser.SqlParser; import org.apache.calcite.sql.parser.SqlParserPos; +import org.apache.calcite.sql.pretty.SqlPrettyWriter; import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.commons.lang3.StringUtils; @@ -40,7 +42,12 @@ public abstract class SemanticNode { public static String getSql(SqlNode sqlNode) { SqlSimpleParser sqlSimpleParser = new SqlSimpleParser("", Configuration.getParserConfig()); - return sqlSimpleParser.simplifySql(sqlNode.toSqlString(SemanticSqlDialect.DEFAULT).getSql()); + SqlWriterConfig config = SqlPrettyWriter.config().withDialect(SemanticSqlDialect.DEFAULT) + .withKeywordsLowerCase(true).withClauseEndsLine(true).withAlwaysUseParentheses(false) + .withSelectListItemsOnSeparateLines(false).withUpdateSetListNewline(false).withIndentation(0); + return sqlSimpleParser.simplifySql(sqlNode.toSqlString((c) -> { + return config; + }).getSql()); } public static boolean isNumeric(String expr) { diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/render/FilterRender.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/render/FilterRender.java index ea34771f7..063c27c01 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/render/FilterRender.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/render/FilterRender.java @@ -2,14 +2,14 @@ package com.tencent.supersonic.semantic.query.parser.calcite.sql.render; import com.tencent.supersonic.semantic.api.query.request.MetricReq; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.Renderer; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.FilterNode; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.MetricNode; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.TableView; 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.Metric; import com.tencent.supersonic.semantic.query.parser.calcite.schema.SemanticSchema; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.Renderer; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.TableView; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.FilterNode; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.MetricNode; import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.SemanticNode; import java.util.ArrayList; import java.util.HashSet; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/render/JoinRender.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/render/JoinRender.java index 675a93f57..5970709f0 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/render/JoinRender.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/render/JoinRender.java @@ -1,18 +1,18 @@ package com.tencent.supersonic.semantic.query.parser.calcite.sql.render; import com.tencent.supersonic.semantic.api.query.request.MetricReq; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.Renderer; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.AggFunctionNode; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.DataSourceNode; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.FilterNode; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.MetricNode; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.TableView; 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.dsl.Identify; import com.tencent.supersonic.semantic.query.parser.calcite.dsl.Metric; import com.tencent.supersonic.semantic.query.parser.calcite.schema.SemanticSchema; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.Renderer; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.TableView; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.AggFunctionNode; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.DataSourceNode; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.FilterNode; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.MetricNode; import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.SemanticNode; import java.util.ArrayList; import java.util.Arrays; @@ -28,7 +28,6 @@ import org.apache.calcite.sql.JoinConditionType; import org.apache.calcite.sql.JoinType; import org.apache.calcite.sql.SqlBasicCall; import org.apache.calcite.sql.SqlJoin; -import org.apache.calcite.sql.SqlKind; import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.fun.SqlStdOperatorTable; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/render/OutputRender.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/render/OutputRender.java index bc1562cf4..df67c09c8 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/render/OutputRender.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/calcite/sql/render/OutputRender.java @@ -1,12 +1,12 @@ package com.tencent.supersonic.semantic.query.parser.calcite.sql.render; -import com.tencent.supersonic.semantic.api.query.request.MetricReq; import com.tencent.supersonic.common.pojo.ColumnOrder; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.Renderer; -import com.tencent.supersonic.semantic.query.parser.calcite.sql.TableView; +import com.tencent.supersonic.semantic.api.query.request.MetricReq; import com.tencent.supersonic.semantic.query.parser.calcite.dsl.DataSource; import com.tencent.supersonic.semantic.query.parser.calcite.schema.SemanticSchema; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.Renderer; +import com.tencent.supersonic.semantic.query.parser.calcite.sql.TableView; import com.tencent.supersonic.semantic.query.parser.calcite.sql.node.SemanticNode; import java.util.ArrayList; import java.util.List; 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 58fc6cd16..72911f6ef 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 @@ -70,7 +70,7 @@ public class CalculateAggConverter implements SemanticConverter { return generateRatioSqlCommand(queryStructCmd, engineTypeEnum, version); } ParseSqlReq sqlCommand = new ParseSqlReq(); - sqlCommand.setRootPath(catalog.getDomainFullPath(queryStructCmd.getDomainId())); + sqlCommand.setRootPath(catalog.getModelFullPath(queryStructCmd.getModelId())); String metricTableName = "v_metric_tb_tmp"; MetricTable metricTable = new MetricTable(); metricTable.setAlias(metricTableName); @@ -107,7 +107,7 @@ public class CalculateAggConverter implements SemanticConverter { return false; } //todo ck类型暂不拼with语句 - if (queryStructCmd.getDomainId().equals(34L)) { + if (queryStructCmd.getModelId().equals(34L)) { return false; } int nonSumFunction = 0; @@ -130,7 +130,7 @@ public class CalculateAggConverter implements SemanticConverter { @Override public void converter(Catalog catalog, QueryStructReq queryStructCmd, ParseSqlReq sqlCommend, MetricReq metricCommand) throws Exception { - DatabaseResp databaseResp = catalog.getDatabaseByDomainId(queryStructCmd.getDomainId()); + DatabaseResp databaseResp = catalog.getDatabaseByModelId(queryStructCmd.getModelId()); ParseSqlReq parseSqlReq = generateSqlCommend(queryStructCmd, EngineTypeEnum.valueOf(databaseResp.getType().toUpperCase()), databaseResp.getVersion()); sqlCommend.setSql(parseSqlReq.getSql()); @@ -160,7 +160,7 @@ public class CalculateAggConverter implements SemanticConverter { throws Exception { check(queryStructCmd); ParseSqlReq sqlCommand = new ParseSqlReq(); - sqlCommand.setRootPath(catalog.getDomainFullPath(queryStructCmd.getDomainId())); + sqlCommand.setRootPath(catalog.getModelFullPath(queryStructCmd.getModelId())); String metricTableName = "v_metric_tb_tmp"; MetricTable metricTable = new MetricTable(); metricTable.setAlias(metricTableName); @@ -180,7 +180,7 @@ public class CalculateAggConverter implements SemanticConverter { case MYSQL: if (Objects.nonNull(version) && version.startsWith(mysqlLowVersion)) { sqlCommand.setSupportWith(false); - sql = new MysqlEngineSql().sql(queryStructCmd, isOver, metricTableName); + sql = new MysqlEngineSql().sql(queryStructCmd, isOver, metricTableName); break; } case DORIS: @@ -199,7 +199,7 @@ public class CalculateAggConverter implements SemanticConverter { if (f.getFunc().equals(AggOperatorEnum.RATIO_OVER) || f.getFunc().equals(AggOperatorEnum.RATIO_ROLL)) { return String.format("( (%s-%s_roll)/cast(%s_roll as DOUBLE) ) as %s_%s,%s", f.getColumn(), f.getColumn(), f.getColumn(), f.getColumn(), - f.getFunc().getOperator(),f.getColumn()); + f.getFunc().getOperator(), f.getColumn()); } else { return f.getColumn(); } @@ -336,8 +336,8 @@ public class CalculateAggConverter implements SemanticConverter { if (f.getFunc().equals(AggOperatorEnum.RATIO_OVER) || f.getFunc().equals(AggOperatorEnum.RATIO_ROLL)) { return String.format( "if(%s_roll!=0, (%s-%s_roll)/%s_roll , 0) as %s_%s,%s", - f.getColumn(), f.getColumn(), f.getColumn(), f.getColumn(), - f.getColumn(),f.getFunc().getOperator(),f.getColumn()); + f.getColumn(), f.getColumn(), f.getColumn(), f.getColumn(), + f.getColumn(), f.getFunc().getOperator(), f.getColumn()); } else { return f.getColumn(); } 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 d035a0a0a..d6de703ad 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,13 +24,14 @@ public class DefaultDimValueConverter implements SemanticConverter { } @Override - public void converter(Catalog catalog, QueryStructReq queryStructCmd, ParseSqlReq sqlCommend, MetricReq metricCommand) throws Exception { - List dimensionResps = catalog.getDimensions(queryStructCmd.getDomainId()); + 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() .filter(dimensionResp -> !CollectionUtils.isEmpty(dimensionResp.getDefaultValues())) .collect(Collectors.toList()); - if(CollectionUtils.isEmpty(dimensionResps)){ + if (CollectionUtils.isEmpty(dimensionResps)) { return; } log.info("dimension with default values:{}, queryStruct:{}", dimensionResps, queryStructCmd); 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 8d8f9225a..08ac6e0cc 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 @@ -48,15 +48,15 @@ public class MultiSourceJoin implements SemanticConverter { if (CollectionUtils.isEmpty(groups) || CollectionUtils.isEmpty(aggregators)) { return; } - Long domainId = queryStructCmd.getDomainId(); + Long modelId = queryStructCmd.getModelId(); List aggs = aggregators.stream().map(Aggregator::getColumn).collect(Collectors.toList()); - Map dimensionMap = catalog.getDimensions(domainId).stream() + Map dimensionMap = catalog.getDimensions(modelId).stream() .filter(dimensionDesc -> fields.contains(dimensionDesc.getBizName())) .collect(Collectors.toMap(DimensionResp::getBizName, dimensionDesc -> dimensionDesc)); - List metricDescList = catalog.getMetrics(domainId).stream() + List metricDescList = catalog.getMetrics(modelId).stream() .filter(metricDesc -> aggs.contains(metricDesc.getBizName())) .collect(Collectors.toList()); - Map datasourceMap = catalog.getDatasourceList(domainId) + Map datasourceMap = catalog.getDatasourceList(modelId) .stream().collect(Collectors.toMap(DatasourceResp::getId, datasource -> datasource)); //check groups filters and aggs is in same datasource if (!isInSameDatasource(new ArrayList<>(dimensionMap.values()), metricDescList)) { @@ -133,5 +133,5 @@ public class MultiSourceJoin implements SemanticConverter { 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 2fa035396..598c4c6e6 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 @@ -63,7 +63,7 @@ public class ParserDefaultConverter implements SemanticConverter { sqlCommend.setVariables(queryStructCmd.getParams().stream() .collect(Collectors.toMap(Param::getName, Param::getValue, (k1, k2) -> k1))); sqlCommend.setLimit(queryStructCmd.getLimit()); - String rootPath = catalog.getDomainFullPath(queryStructCmd.getDomainId()); + String rootPath = catalog.getModelFullPath(queryStructCmd.getModelId()); sqlCommend.setRootPath(rootPath); // todo tmp delete @@ -84,7 +84,7 @@ public class ParserDefaultConverter implements SemanticConverter { } else { String group = queryStructCmd.getGroups().get(0).equalsIgnoreCase("sys_imp_date") ? queryStructCmd.getGroups().get(1) : queryStructCmd.getGroups().get(0); - DimensionResp dimension = catalog.getDimension(group, queryStructCmd.getDomainId()); + DimensionResp dimension = catalog.getDimension(group, queryStructCmd.getModelId()); String datasourceBizName = dimension.getDatasourceBizName(); if (Strings.isNotEmpty(datasourceBizName)) { internalMetricNamePrefix = datasourceBizName + UNDERLINE; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/persistence/pojo/QueryStatement.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/persistence/pojo/QueryStatement.java index e7e971cb9..ba30e4ea4 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/persistence/pojo/QueryStatement.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/persistence/pojo/QueryStatement.java @@ -4,7 +4,8 @@ import lombok.Data; @Data public class QueryStatement { - private Long domainId = 0L; + + private Long modelId = 0L; private String sql = ""; private String sourceId = ""; private String errMsg = ""; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/persistence/repository/StatRepositoryImpl.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/persistence/repository/StatRepositoryImpl.java index 2ea4c7a8c..76d9f889b 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/persistence/repository/StatRepositoryImpl.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/persistence/repository/StatRepositoryImpl.java @@ -4,10 +4,10 @@ import static com.tencent.supersonic.common.pojo.Constants.AT_SYMBOL; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; import com.tencent.supersonic.semantic.api.model.pojo.QueryStat; 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.query.persistence.mapper.StatMapper; import java.util.ArrayList; import java.util.Comparator; @@ -44,8 +44,8 @@ public class StatRepositoryImpl implements StatRepository { statInfos.stream().forEach(stat -> { String dimensions = stat.getDimensions(); String metrics = stat.getMetrics(); - updateStatMapInfo(map, dimensions, TypeEnums.DIMENSION.getName(), stat.getDomainId()); - updateStatMapInfo(map, metrics, TypeEnums.METRIC.getName(), stat.getDomainId()); + updateStatMapInfo(map, dimensions, TypeEnums.DIMENSION.getName(), stat.getModelId()); + updateStatMapInfo(map, metrics, TypeEnums.METRIC.getName(), stat.getModelId()); }); map.forEach((k, v) -> { @@ -65,13 +65,13 @@ public class StatRepositoryImpl implements StatRepository { return statMapper.getStatInfo(itemUseCommend); } - private void updateStatMapInfo(Map map, String dimensions, String type, Long domainId) { + private void updateStatMapInfo(Map map, String dimensions, String type, Long modelId) { if (Strings.isNotEmpty(dimensions)) { try { List dimensionList = mapper.readValue(dimensions, new TypeReference>() { }); dimensionList.stream().forEach(dimension -> { - String key = domainId + AT_SYMBOL + AT_SYMBOL + type + AT_SYMBOL + AT_SYMBOL + dimension; + String key = modelId + AT_SYMBOL + AT_SYMBOL + type + AT_SYMBOL + AT_SYMBOL + dimension; if (map.containsKey(key)) { map.put(key, map.get(key) + 1); } else { @@ -84,9 +84,9 @@ public class StatRepositoryImpl implements StatRepository { } } - private void updateStatMapInfo(Map map, Long domainId, String type) { - if (Objects.nonNull(domainId)) { - String key = type + AT_SYMBOL + AT_SYMBOL + domainId; + private void updateStatMapInfo(Map map, Long modelId, String type) { + if (Objects.nonNull(modelId)) { + String key = type + AT_SYMBOL + AT_SYMBOL + modelId; if (map.containsKey(key)) { map.put(key, map.get(key) + 1); } else { 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 cafcb9203..68eef591b 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,11 +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.*; +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.QueryStructReq; import com.tencent.supersonic.semantic.api.query.response.ItemUseResp; -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 com.tencent.supersonic.semantic.query.service.QueryService; +import com.tencent.supersonic.semantic.query.service.SemanticQueryEngine; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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 3ef7b88ca..d3d3951fd 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 @@ -3,24 +3,25 @@ package com.tencent.supersonic.semantic.query.rest; import com.github.pagehelper.PageInfo; 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.request.DomainSchemaFilterReq; +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.DomainSchemaResp; 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.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; @RestController @@ -31,30 +32,27 @@ public class SchemaController { private SchemaService schemaService; @PostMapping - public List fetchDomainSchema(@RequestBody DomainSchemaFilterReq filter, + public List fetchModelSchema(@RequestBody ModelSchemaFilterReq filter, HttpServletRequest request, HttpServletResponse response) { User user = UserHolder.findUser(request, response); - return schemaService.fetchDomainSchema(filter, user); + return schemaService.fetchModelSchema(filter, user); } - /** - * get domain list - * - * @param - */ @GetMapping("/domain/list") public List getDomainList(HttpServletRequest request, HttpServletResponse response) { User user = UserHolder.findUser(request, response); - return schemaService.getDomainListForAdmin(user); + return schemaService.getDomainList(user); } - @GetMapping("/domain/view/list") - public List getDomainListForViewer(HttpServletRequest request, - HttpServletResponse response) { + @GetMapping("/model/list") + public List getModelList(@RequestParam("domainId") Long domainId, + @RequestParam("authType") String authType, + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); - return schemaService.getDomainListForViewer(user); + return schemaService.getModelList(user, AuthType.valueOf(authType), domainId); } @PostMapping("/dimension/page") diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/QueryService.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/QueryService.java index 676f2a1f6..5a79395c5 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/QueryService.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/QueryService.java @@ -4,8 +4,8 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.semantic.api.model.pojo.QueryStat; import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; import com.tencent.supersonic.semantic.api.query.request.ItemUseReq; -import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; 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.semantic.api.query.response.ItemUseResp; import java.util.List; 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 0b2601c4b..6bbb5aec9 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,11 +2,11 @@ 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.cache.CacheUtils; 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.semantic.api.model.request.DomainSchemaFilterReq; -import com.tencent.supersonic.semantic.api.model.response.DomainSchemaResp; +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; import com.tencent.supersonic.semantic.api.query.pojo.Cache; import com.tencent.supersonic.semantic.api.query.request.ItemUseReq; @@ -59,16 +59,16 @@ public class QueryServiceImpl implements QueryService { @Override public Object queryBySql(QueryDslReq querySqlCmd, User user) throws Exception { - DomainSchemaFilterReq filter = new DomainSchemaFilterReq(); - List domainIds = new ArrayList<>(); - domainIds.add(querySqlCmd.getDomainId()); + ModelSchemaFilterReq filter = new ModelSchemaFilterReq(); + List modelIds = new ArrayList<>(); + modelIds.add(querySqlCmd.getModelId()); - filter.setDomainIds(domainIds); + filter.setModelIds(modelIds); SchemaService schemaService = ContextUtils.getBean(SchemaService.class); - List domainSchemas = schemaService.fetchDomainSchema(filter, user); + List domainSchemas = schemaService.fetchModelSchema(filter, user); QueryStatement queryStatement = queryReqConverter.convert(querySqlCmd, domainSchemas); - queryStatement.setDomainId(querySqlCmd.getDomainId()); + queryStatement.setModelId(querySqlCmd.getModelId()); return semanticQueryEngine.execute(queryStatement); } @@ -78,7 +78,7 @@ public class QueryServiceImpl implements QueryService { log.info("[queryStructCmd:{}]", queryStructCmd); try { statUtils.initStatInfo(queryStructCmd, user); - String cacheKey = cacheUtils.generateCacheKey(queryStructCmd.getDomainId().toString(), + String cacheKey = cacheUtils.generateCacheKey(queryStructCmd.getModelId().toString(), queryStructCmd.generateCommandMd5()); handleGlobalCacheDisable(queryStructCmd); boolean isCache = isCache(queryStructCmd); @@ -121,7 +121,7 @@ public class QueryServiceImpl implements QueryService { throws Exception { statUtils.initStatInfo(queryMultiStructReq.getQueryStructReqs().get(0), user); String cacheKey = cacheUtils.generateCacheKey( - queryMultiStructReq.getQueryStructReqs().get(0).getDomainId().toString(), + queryMultiStructReq.getQueryStructReqs().get(0).getModelId().toString(), queryMultiStructReq.generateCommandMd5()); boolean isCache = isCache(queryMultiStructReq); QueryResultWithSchemaResp queryResultWithColumns; 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 6e125621e..ccf903e41 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 @@ -2,25 +2,26 @@ package com.tencent.supersonic.semantic.query.service; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.semantic.api.model.request.DomainSchemaFilterReq; +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.DomainSchemaResp; 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 java.util.List; public interface SchemaService { - List fetchDomainSchema(DomainSchemaFilterReq filter, User user); - - List getDomainListForAdmin(User user); - - List getDomainListForViewer(User user); + List fetchModelSchema(ModelSchemaFilterReq filter, User user); PageInfo queryDimension(PageDimensionReq pageDimensionReq, User user); PageInfo queryMetric(PageMetricReq pageMetricReq, User user); + + List getDomainList(User user); + + List getModelList(User user, AuthType authType, Long domainId); } 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 6617178bb..7f105efd9 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 @@ -4,21 +4,24 @@ 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.semantic.api.model.request.DomainSchemaFilterReq; +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.DomainSchemaResp; 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.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 java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -31,33 +34,35 @@ import org.springframework.util.CollectionUtils; public class SchemaServiceImpl implements SchemaService { private final QueryService queryService; - private final DomainService domainService; + private final ModelService modelService; private final DimensionService dimensionService; private final MetricService metricService; + private final DomainService domainService; public SchemaServiceImpl(QueryService queryService, - DomainService domainService, + ModelService modelService, DimensionService dimensionService, - MetricService metricService) { + MetricService metricService, + DomainService domainService) { this.queryService = queryService; - this.domainService = domainService; + this.modelService = modelService; this.dimensionService = dimensionService; this.metricService = metricService; + this.domainService = domainService; } @Override - public List fetchDomainSchema(DomainSchemaFilterReq filter, User user) { - List domainSchemaDescList = domainService.fetchDomainSchema(filter, user); + public List fetchModelSchema(ModelSchemaFilterReq filter, User user) { + List domainSchemaDescList = modelService.fetchModelSchema(filter); List statInfos = queryService.getStatInfo(new ItemUseReq()); log.debug("statInfos:{}", statInfos); fillCnt(domainSchemaDescList, statInfos); return domainSchemaDescList; - } - private void fillCnt(List domainSchemaDescList, List statInfos) { + private void fillCnt(List domainSchemaDescList, List statInfos) { Map typeIdAndStatPair = statInfos.stream() .collect(Collectors.toMap( @@ -65,13 +70,13 @@ public class SchemaServiceImpl implements SchemaService { itemUseInfo -> itemUseInfo, (item1, item2) -> item1)); log.debug("typeIdAndStatPair:{}", typeIdAndStatPair); - for (DomainSchemaResp domainSchemaDesc : domainSchemaDescList) { + for (ModelSchemaResp domainSchemaDesc : domainSchemaDescList) { fillDimCnt(domainSchemaDesc, typeIdAndStatPair); fillMetricCnt(domainSchemaDesc, typeIdAndStatPair); } } - private void fillMetricCnt(DomainSchemaResp domainSchemaDesc, Map typeIdAndStatPair) { + private void fillMetricCnt(ModelSchemaResp domainSchemaDesc, Map typeIdAndStatPair) { List metrics = domainSchemaDesc.getMetrics(); if (CollectionUtils.isEmpty(domainSchemaDesc.getMetrics())) { return; @@ -88,7 +93,7 @@ public class SchemaServiceImpl implements SchemaService { domainSchemaDesc.setMetrics(metrics); } - private void fillDimCnt(DomainSchemaResp domainSchemaDesc, Map typeIdAndStatPair) { + private void fillDimCnt(ModelSchemaResp domainSchemaDesc, Map typeIdAndStatPair) { List dimensions = domainSchemaDesc.getDimensions(); if (CollectionUtils.isEmpty(domainSchemaDesc.getDimensions())) { return; @@ -104,16 +109,6 @@ public class SchemaServiceImpl implements SchemaService { domainSchemaDesc.setDimensions(dimensions); } - @Override - public List getDomainListForAdmin(User user) { - return domainService.getDomainListForAdmin(user.getName()); - } - - @Override - public List getDomainListForViewer(User user) { - return domainService.getDomainListForViewer(user.getName()); - } - @Override public PageInfo queryDimension(PageDimensionReq pageDimensionCmd, User user) { return dimensionService.queryDimension(pageDimensionCmd); @@ -123,4 +118,15 @@ public class SchemaServiceImpl implements SchemaService { public PageInfo queryMetric(PageMetricReq pageMetricCmd, User user) { return metricService.queryMetric(pageMetricCmd); } + + @Override + public List getDomainList(User user) { + return domainService.getDomainListWithAdminAuth(user); + } + + @Override + public List getModelList(User user, AuthType authTypeEnum, Long domainId) { + return modelService.getModelListWithAuth(user.getName(), domainId, authTypeEnum); + } + } diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SemanticQueryEngineImpl.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SemanticQueryEngineImpl.java index 1b9a82f17..5d03b4312 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SemanticQueryEngineImpl.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/SemanticQueryEngineImpl.java @@ -36,8 +36,8 @@ public class SemanticQueryEngineImpl implements SemanticQueryEngine { if (queryExecutor != null) { queryResultWithColumns = queryExecutor.execute(catalog, queryStatement); queryResultWithColumns.setSql(queryStatement.getSql()); - if (queryStatement.getDomainId() > 0) { - queryUtils.fillItemNameInfo(queryResultWithColumns, queryStatement.getDomainId()); + if (queryStatement.getModelId() > 0) { + queryUtils.fillItemNameInfo(queryResultWithColumns, queryStatement.getModelId()); } } return queryResultWithColumns; @@ -46,7 +46,7 @@ public class SemanticQueryEngineImpl implements SemanticQueryEngine { public QueryStatement plan(QueryStructReq queryStructCmd) throws Exception { QueryStatement queryStatement = queryParser.logicSql(queryStructCmd); queryUtils.checkSqlParse(queryStatement); - queryStatement.setDomainId(queryStructCmd.getDomainId()); + queryStatement.setModelId(queryStructCmd.getModelId()); log.info("queryStatement:{}", queryStatement); for (QueryOptimizer queryOptimizer : ComponentFactory.getQueryOptimizers()) { queryOptimizer.rewrite(queryStructCmd, queryStatement); diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/ComponentFactory.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/ComponentFactory.java index bcdbe9874..19e3a851b 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/ComponentFactory.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/ComponentFactory.java @@ -43,7 +43,7 @@ public class ComponentFactory { } public static List getQueryOptimizers() { - if(queryOptimizers.isEmpty()){ + if (queryOptimizers.isEmpty()) { initQueryOptimizer(); } return queryOptimizers; @@ -59,9 +59,11 @@ public class ComponentFactory { public static void setSqlParser(SqlParser parser) { sqlParser = parser; } + private static void initQueryOptimizer() { queryOptimizers.add(getBean("DetailQuery", DetailQuery.class)); } + private static void initSemanticConverter() { semanticConverters.add(getBean("DefaultDimValueConverter", DefaultDimValueConverter.class)); semanticConverters.add(getBean("CalculateAggConverter", CalculateAggConverter.class)); 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 62e0f3782..9fdd3ce46 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,18 +12,23 @@ 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.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.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.common.pojo.Constants; -import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException; -import com.tencent.supersonic.common.pojo.exception.InvalidPermissionException; +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 java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; @@ -35,9 +40,6 @@ 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.DomainService; -import com.tencent.supersonic.semantic.model.domain.MetricService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.ProceedingJoinPoint; @@ -66,7 +68,7 @@ public class DataPermissionAOP { @Autowired private MetricService metricService; @Autowired - private DomainService domainService; + private ModelService modelService; @Value("${permission.data.enable:true}") private Boolean permissionDataEnable; @@ -77,7 +79,7 @@ public class DataPermissionAOP { @Around(value = "dataPermissionAOP()") public Object around(ProceedingJoinPoint point) throws Throwable { Object[] args = point.getArgs(); - QueryStructReq queryStructCmd = (QueryStructReq) args[0]; + QueryStructReq queryStructReq = (QueryStructReq) args[0]; User user = (User) args[1]; if (!permissionDataEnable) { @@ -90,29 +92,29 @@ public class DataPermissionAOP { } // 1. determine whether the subject field is visible - doDomainVisible(user, queryStructCmd); + doDomainVisible(user, queryStructReq); // 2. fetch data permission meta information - Long domainId = queryStructCmd.getDomainId(); - Set res4Privilege = queryStructUtils.getResNameEnExceptInternalCol(queryStructCmd); - log.info("classId:{}, res4Privilege:{}", domainId, res4Privilege); + Long modelId = queryStructReq.getModelId(); + Set res4Privilege = queryStructUtils.getResNameEnExceptInternalCol(queryStructReq); + log.info("modelId:{}, res4Privilege:{}", modelId, res4Privilege); - Set sensitiveResByDomain = getHighSensitiveColsByDomainId(domainId); + Set sensitiveResByModel = getHighSensitiveColsByModelId(modelId); Set sensitiveResReq = res4Privilege.parallelStream() - .filter(res -> sensitiveResByDomain.contains(res)).collect(Collectors.toSet()); - log.info("this query domainId:{}, sensitiveResReq:{}", domainId, sensitiveResReq); + .filter(sensitiveResByModel::contains).collect(Collectors.toSet()); + log.info("this query domainId:{}, sensitiveResReq:{}", modelId, sensitiveResReq); // query user privilege info HttpServletRequest request = (HttpServletRequest) args[2]; - AuthorizedResourceResp authorizedResource = getAuthorizedResource(user, request, domainId, sensitiveResReq); + AuthorizedResourceResp authorizedResource = getAuthorizedResource(user, request, modelId, sensitiveResReq); // get sensitiveRes that user has privilege - Set resAuthSet = getAuthResNameSet(authorizedResource, queryStructCmd.getDomainId()); + Set resAuthSet = getAuthResNameSet(authorizedResource, queryStructReq.getModelId()); // 3.if sensitive fields without permission are involved in filter, thrown an exception - doFilterCheckLogic(queryStructCmd, resAuthSet, sensitiveResReq); + doFilterCheckLogic(queryStructReq, resAuthSet, sensitiveResReq); // 4.row permission pre-filter - doRowPermission(queryStructCmd, authorizedResource); + doRowPermission(queryStructReq, authorizedResource); // 5.proceed QueryResultWithSchemaResp queryResultWithColumns = (QueryResultWithSchemaResp) point.proceed(); @@ -120,7 +122,7 @@ public class DataPermissionAOP { if (CollectionUtils.isEmpty(sensitiveResReq) || allSensitiveResReqIsOk(sensitiveResReq, resAuthSet)) { // if sensitiveRes is empty log.info("sensitiveResReq is empty"); - return getQueryResultWithColumns(queryResultWithColumns, domainId, authorizedResource); + return getQueryResultWithColumns(queryResultWithColumns, modelId, authorizedResource); } // 6.if the column has no permission, hit * @@ -128,7 +130,7 @@ public class DataPermissionAOP { .collect(Collectors.toSet()); QueryResultWithSchemaResp queryResultAfterDesensitization = desensitizationData(queryResultWithColumns, need2Apply); - addPromptInfoInfo(domainId, queryResultAfterDesensitization, authorizedResource); + addPromptInfoInfo(modelId, queryResultAfterDesensitization, authorizedResource); return queryResultAfterDesensitization; @@ -136,27 +138,27 @@ public class DataPermissionAOP { private void doDomainVisible(User user, QueryStructReq queryStructCmd) { Boolean visible = true; - Long domainId = queryStructCmd.getDomainId(); - List classListForViewer = domainService.getDomainListForViewer(user.getName()); - if (CollectionUtils.isEmpty(classListForViewer)) { + Long domainId = queryStructCmd.getModelId(); + List modelListVisible = modelService.getModelListWithAuth(user.getName(), null, AuthType.VISIBLE); + if (CollectionUtils.isEmpty(modelListVisible)) { visible = false; } else { - Map> id2domainDesc = classListForViewer.stream() - .collect(Collectors.groupingBy(classInfo -> classInfo.getId())); + Map> id2domainDesc = modelListVisible.stream() + .collect(Collectors.groupingBy(SchemaItem::getId)); if (!CollectionUtils.isEmpty(id2domainDesc) && !id2domainDesc.containsKey(domainId)) { visible = false; } } if (!visible) { - List domainIds = new ArrayList<>(); - domainIds.add(domainId); - List classInfos = domainService.getDomainList(domainIds); - if (CollectionUtils.isEmpty(classInfos)) { + 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 = classInfos.get(0).getName(); + String domainName = modelInfos.get(0).getName(); throw new InvalidPermissionException( "You do not have domain:" + domainName + " permission, please contact admin for details"); @@ -176,12 +178,12 @@ public class DataPermissionAOP { if (!CollectionUtils.isEmpty(filters)) { log.debug("dimensionFilters:{}", filters); - List domainIds = new ArrayList<>(); - domainIds.add(domainId); - List classInfos = domainService.getDomainList(domainIds); - String classNameCn = ""; - if (!CollectionUtils.isEmpty(classInfos)) { - classNameCn = classInfos.get(0).getName(); + List modelIds = new ArrayList<>(); + modelIds.add(domainId); + List modelInfos = modelService.getModelList(modelIds); + String modelNameCn = ""; + if (!CollectionUtils.isEmpty(modelInfos)) { + modelNameCn = modelInfos.get(0).getName(); } List exprList = new ArrayList<>(); @@ -196,7 +198,7 @@ public class DataPermissionAOP { String message = String.format(promptInfo, CollectionUtils.isEmpty(descList) ? exprList : descList); queryResultWithColumns.setQueryAuthorization( - new QueryAuthorization(classNameCn, exprList, descList, message)); + new QueryAuthorization(modelNameCn, exprList, descList, message)); log.info("queryResultWithColumns:{}", queryResultWithColumns); } } @@ -240,7 +242,7 @@ public class DataPermissionAOP { authResGrpList.stream().forEach(authResGrp -> { List cols = authResGrp.getGroup(); if (!CollectionUtils.isEmpty(cols)) { - cols.stream().filter(col -> domainId.equals(Long.parseLong(col.getDomainId()))) + cols.stream().filter(col -> domainId.equals(Long.parseLong(col.getModelId()))) .forEach(col -> resAuthName.add(col.getName())); } @@ -256,17 +258,17 @@ public class DataPermissionAOP { QueryAuthResReq queryAuthResReq = new QueryAuthResReq(); queryAuthResReq.setUser(user.getName()); queryAuthResReq.setResources(resourceReqList); - queryAuthResReq.setDomainId(domainId + ""); + queryAuthResReq.setModelId(domainId + ""); AuthorizedResourceResp authorizedResource = fetchAuthRes(request, queryAuthResReq); log.info("user:{}, domainId:{}, after queryAuthorizedResources:{}", user.getName(), domainId, authorizedResource); return authorizedResource; } - private Set getHighSensitiveColsByDomainId(Long domainId) { + private Set getHighSensitiveColsByModelId(Long modelId) { Set highSensitiveCols = new HashSet<>(); - List highSensitiveDimensions = dimensionService.getHighSensitiveDimension(domainId); - List highSensitiveMetrics = metricService.getHighSensitiveMetric(domainId); + List highSensitiveDimensions = dimensionService.getHighSensitiveDimension(modelId); + List highSensitiveMetrics = metricService.getHighSensitiveMetric(modelId); if (!CollectionUtils.isEmpty(highSensitiveDimensions)) { highSensitiveDimensions.stream().forEach(dim -> highSensitiveCols.add(dim.getBizName())); } @@ -373,16 +375,16 @@ public class DataPermissionAOP { .filter(res -> !resAuthName.contains(res) && sensitiveResReq.contains(res)).collect(Collectors.toSet()); Set nameCnSet = new HashSet<>(); - List domainIds = new ArrayList<>(); - domainIds.add(queryStructCmd.getDomainId()); - List classInfos = domainService.getDomainList(domainIds); - String classNameCn = Constants.EMPTY; - if (!CollectionUtils.isEmpty(classInfos)) { - classNameCn = classInfos.get(0).getName(); + List modelIds = new ArrayList<>(); + modelIds.add(queryStructCmd.getModelId()); + List modelInfos = modelService.getModelList(modelIds); + String modelNameCn = Constants.EMPTY; + if (!CollectionUtils.isEmpty(modelInfos)) { + modelNameCn = modelInfos.get(0).getName(); } - List dimensionDescList = dimensionService.getDimensions(queryStructCmd.getDomainId()); - String finalDomainNameCn = classNameCn; + List dimensionDescList = dimensionService.getDimensions(queryStructCmd.getModelId()); + String finalDomainNameCn = modelNameCn; dimensionDescList.stream().filter(dim -> need2Apply.contains(dim.getBizName())) .forEach(dim -> nameCnSet.add(finalDomainNameCn + MINUS + dim.getName())); 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 01573fddd..308f671b5 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 @@ -11,7 +11,6 @@ import static com.tencent.supersonic.common.pojo.Constants.WEEK; import com.google.common.base.Strings; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.semantic.api.model.response.ItemDateResp; - import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; @@ -20,7 +19,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.StringJoiner; - import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; 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 942d525c2..6bdb2e08c 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,6 +7,12 @@ 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; @@ -17,9 +23,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - @Aspect @Component @Slf4j @@ -43,7 +46,7 @@ public class DimValueAspect { Object[] args = joinPoint.getArgs(); QueryStructReq queryStructReq = (QueryStructReq) args[0]; - Long domainId = queryStructReq.getDomainId(); + Long domainId = queryStructReq.getModelId(); List dimensions = dimensionService.getDimensions(domainId); Map> dimAndAliasAndTechNamePair = new ConcurrentHashMap<>(); @@ -60,7 +63,8 @@ public class DimValueAspect { return queryResultWithColumns; } - private void rewriteDimValue(QueryResultWithSchemaResp queryResultWithColumns, Map> dimAndTechNameAndBizNamePair) { + private void rewriteDimValue(QueryResultWithSchemaResp queryResultWithColumns, + Map> dimAndTechNameAndBizNamePair) { if (!selectDimValueMap(queryResultWithColumns.getColumns(), dimAndTechNameAndBizNamePair)) { return; } @@ -81,8 +85,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; } @@ -111,7 +117,9 @@ 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); + boolean f = + aliasPair.containsKey(valueSingle) ? valuesNew.add(aliasPair.get(valueSingle)) + : valuesNew.add(valueSingle); } filter.setValue(valuesNew); } 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 eedad9e29..2c0dda7ac 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,19 +1,19 @@ package com.tencent.supersonic.semantic.query.utils; -import com.tencent.supersonic.common.util.calcite.SqlParseUtils; -import com.tencent.supersonic.common.util.calcite.SqlParserInfo; +import com.tencent.supersonic.common.util.jsqlparser.CCJSqlParserUtils; import com.tencent.supersonic.semantic.api.model.request.SqlExecuteReq; -import com.tencent.supersonic.semantic.api.model.response.DomainSchemaResp; +import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; import com.tencent.supersonic.semantic.api.query.pojo.MetricTable; import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq; import com.tencent.supersonic.semantic.api.query.request.QueryDslReq; -import com.tencent.supersonic.semantic.model.domain.DomainService; -import com.tencent.supersonic.semantic.query.service.SemanticQueryEngine; +import com.tencent.supersonic.semantic.model.domain.ModelService; import com.tencent.supersonic.semantic.query.persistence.pojo.QueryStatement; +import com.tencent.supersonic.semantic.query.service.SemanticQueryEngine; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -23,21 +23,21 @@ import org.springframework.util.CollectionUtils; public class QueryReqConverter { @Autowired - private DomainService domainService; + private ModelService domainService; @Autowired private SemanticQueryEngine parserService; - public QueryStatement convert(QueryDslReq databaseReq, List domainSchemas) throws Exception { + public QueryStatement convert(QueryDslReq databaseReq, List domainSchemas) throws Exception { List tables = new ArrayList<>(); MetricTable metricTable = new MetricTable(); String sql = databaseReq.getSql(); - SqlParserInfo sqlParseInfo = SqlParseUtils.getSqlParseInfo(sql); - List allFields = sqlParseInfo.getAllFields(); + List allFields = CCJSqlParserUtils.getAllFields(sql); + String tableName = CCJSqlParserUtils.getTableName(sql); - if (CollectionUtils.isEmpty(domainSchemas)) { + if (CollectionUtils.isEmpty(domainSchemas) || StringUtils.isEmpty(tableName)) { return new QueryStatement(); } @@ -50,21 +50,21 @@ public class QueryReqConverter { .collect(Collectors.toSet()); metricTable.setMetrics(allFields.stream().filter(entry -> metrics.contains(entry.toLowerCase())) - .map(entry -> entry.toLowerCase()).collect(Collectors.toList())); + .map(String::toLowerCase).collect(Collectors.toList())); Set collect = allFields.stream().filter(entry -> dimensions.contains(entry.toLowerCase())) - .map(entry -> entry.toLowerCase()).collect(Collectors.toSet()); + .map(String::toLowerCase).collect(Collectors.toSet()); for (String internalCol : QueryStructUtils.internalCols) { if (sql.contains(internalCol)) { collect.add(internalCol); } } metricTable.setDimensions(new ArrayList<>(collect)); - metricTable.setAlias(sqlParseInfo.getTableName().toLowerCase()); + metricTable.setAlias(tableName.toLowerCase()); tables.add(metricTable); ParseSqlReq result = new ParseSqlReq(); BeanUtils.copyProperties(databaseReq, result); - result.setRootPath(domainService.getDomainFullPath(databaseReq.getDomainId())); + result.setRootPath(domainService.getModelFullPathMap().get(databaseReq.getModelId())); result.setTables(tables); QueryStatement queryStatement = parserService.physicalSql(result); 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 23d5756a2..b3efc6d44 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 @@ -1,17 +1,16 @@ package com.tencent.supersonic.semantic.query.utils; -import com.tencent.supersonic.common.pojo.DateConf.DateMode; -import com.tencent.supersonic.common.pojo.enums.TypeEnums; import com.tencent.supersonic.common.pojo.Aggregator; import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; +import com.tencent.supersonic.common.pojo.DateConf.DateMode; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter; +import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; 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.response.MetricResp; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; import com.tencent.supersonic.semantic.model.domain.Catalog; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -20,7 +19,6 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; - import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; import org.springframework.stereotype.Component; @@ -50,7 +48,7 @@ public class QueryStructUtils { private List getDimensionIds(QueryStructReq queryStructCmd) { List dimensionIds = new ArrayList<>(); - List dimensions = catalog.getDimensions(queryStructCmd.getDomainId()); + List dimensions = catalog.getDimensions(queryStructCmd.getModelId()); Map> pair = dimensions.stream() .collect(Collectors.groupingBy(DimensionResp::getBizName)); for (String group : queryStructCmd.getGroups()) { @@ -71,7 +69,7 @@ public class QueryStructUtils { private List getMetricIds(QueryStructReq queryStructCmd) { List metricIds = new ArrayList<>(); - List metrics = catalog.getMetrics(queryStructCmd.getDomainId()); + List metrics = catalog.getMetrics(queryStructCmd.getModelId()); Map> pair = metrics.stream().collect(Collectors.groupingBy(SchemaItem::getBizName)); for (Aggregator agg : queryStructCmd.getAggregators()) { if (pair.containsKey(agg.getColumn())) { 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 c185aa141..18b9e3fee 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 @@ -3,11 +3,11 @@ package com.tencent.supersonic.semantic.query.utils; import static com.tencent.supersonic.common.pojo.Constants.JOIN_UNDERLINE; import static com.tencent.supersonic.common.pojo.Constants.UNIONALL; -import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.Aggregator; +import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.QueryColumn; import com.tencent.supersonic.common.util.cache.CacheUtils; import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; -import com.tencent.supersonic.common.pojo.QueryColumn; 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.QueryResultWithSchemaResp; @@ -64,11 +64,11 @@ public class QueryUtils { } - public void fillItemNameInfo(QueryResultWithSchemaResp queryResultWithColumns, Long domainId) { - List metricDescList = catalog.getMetrics(domainId); - List dimensionDescList = catalog.getDimensions(domainId); - Map metricRespMap = - metricDescList.stream().collect(Collectors.toMap(MetricResp::getBizName, a -> a,(k1, k2)->k1)); + 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 namePair = new HashMap<>(); Map nameTypePair = new HashMap<>(); addSysTimeDimension(namePair, nameTypePair); @@ -82,7 +82,7 @@ public class QueryUtils { }); List columns = queryResultWithColumns.getColumns(); columns.forEach(column -> { - String nameEn = column.getNameEn(); + String nameEn = column.getNameEn().toLowerCase(); if (nameEn.contains(JOIN_UNDERLINE)) { nameEn = nameEn.split(JOIN_UNDERLINE)[1]; } @@ -92,7 +92,7 @@ public class QueryUtils { if (nameTypePair.containsKey(nameEn)) { column.setShowType(nameTypePair.get(nameEn)); } - if(metricRespMap.containsKey(nameEn)){ + if (metricRespMap.containsKey(nameEn)) { column.setDataFormatType(metricRespMap.get(nameEn).getDataFormatType()); column.setDataFormat(metricRespMap.get(nameEn).getDataFormat()); } @@ -113,7 +113,7 @@ public class QueryUtils { namePair.putAll(metricNameFromAgg); List columns = queryResultWithColumns.getColumns(); columns.forEach(column -> { - String nameEn = column.getNameEn(); + String nameEn = column.getNameEn().toLowerCase(); if (nameEn.contains(JOIN_UNDERLINE)) { nameEn = nameEn.split(JOIN_UNDERLINE)[1]; } diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/SqlFilterUtils.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/SqlFilterUtils.java index 40f8caa93..ed29c7ac4 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/SqlFilterUtils.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/SqlFilterUtils.java @@ -5,10 +5,10 @@ import static com.tencent.supersonic.common.pojo.Constants.PARENTHESES_START; import static com.tencent.supersonic.common.pojo.Constants.SPACE; import static com.tencent.supersonic.common.pojo.Constants.SYS_VAR; +import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; import com.tencent.supersonic.semantic.api.query.pojo.Criterion; import com.tencent.supersonic.semantic.api.query.pojo.Filter; -import com.tencent.supersonic.common.pojo.Constants; import java.util.ArrayList; import java.util.List; import java.util.Objects; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/SqlGenerateUtils.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/SqlGenerateUtils.java index 9ebd14765..852e4a420 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/SqlGenerateUtils.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/SqlGenerateUtils.java @@ -1,14 +1,15 @@ package com.tencent.supersonic.semantic.query.utils; +import static com.tencent.supersonic.common.pojo.Constants.JOIN_UNDERLINE; + +import com.tencent.supersonic.common.pojo.Aggregator; import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; -import com.tencent.supersonic.common.pojo.Aggregator; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import static com.tencent.supersonic.common.pojo.Constants.JOIN_UNDERLINE; @Component @Slf4j diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/StatUtils.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/StatUtils.java index bea256fb0..eeb22d539 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/StatUtils.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/StatUtils.java @@ -4,13 +4,13 @@ import com.alibaba.ttl.TransmittableThreadLocal; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.tencent.supersonic.auth.api.authentication.pojo.User; +import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; import com.tencent.supersonic.semantic.api.model.enums.QueryTypeBackEnum; import com.tencent.supersonic.semantic.api.model.enums.QueryTypeEnum; import com.tencent.supersonic.semantic.api.model.pojo.QueryStat; import com.tencent.supersonic.semantic.api.query.request.ItemUseReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; import com.tencent.supersonic.semantic.api.query.response.ItemUseResp; -import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; import com.tencent.supersonic.semantic.query.persistence.repository.StatRepository; import java.util.ArrayList; import java.util.List; @@ -81,7 +81,7 @@ public class StatUtils { try { queryStatInfo.setTraceId(traceId) - .setClassId(queryStructCmd.getDomainId()) + .setClassId(queryStructCmd.getModelId()) .setUser(user) .setQueryType(QueryTypeEnum.STRUCT.getValue()) .setQueryTypeBack(QueryTypeBackEnum.NORMAL.getState()) diff --git a/semantic/query/src/main/resources/mapper/StatMapper.xml b/semantic/query/src/main/resources/mapper/StatMapper.xml index 1276db21b..69c0090fd 100644 --- a/semantic/query/src/main/resources/mapper/StatMapper.xml +++ b/semantic/query/src/main/resources/mapper/StatMapper.xml @@ -5,10 +5,10 @@ + type="com.tencent.supersonic.semantic.api.model.pojo.QueryStat"> - + @@ -40,17 +40,18 @@ insert into s2_query_stat_info - ( - trace_id, domain_id, `user`, query_type, query_type_back, query_sql_cmd, sql_cmd_md5, query_struct_cmd, struct_cmd_md5, `sql`, sql_md5, query_engine, - elapsed_ms, query_state, native_query, start_date, end_date, dimensions, metrics, select_cols, agg_cols, filter_cols, group_by_cols, - order_by_cols, use_result_cache, use_sql_cache, sql_cache_key, result_cache_key - ) - values - ( - #{traceId}, #{domainId}, #{user}, #{queryType}, #{queryTypeBack}, #{querySqlCmd}, #{querySqlCmdMd5}, #{queryStructCmd}, #{queryStructCmdMd5}, #{sql}, #{sqlMd5}, #{queryEngine}, - #{elapsedMs}, #{queryState}, #{nativeQuery}, #{startDate}, #{endDate}, #{dimensions}, #{metrics}, #{selectCols}, #{aggCols}, #{filterCols}, #{groupByCols}, - #{orderByCols}, #{useResultCache}, #{useSqlCache}, #{sqlCacheKey}, #{resultCacheKey} - ) + (trace_id, model_id, `user`, query_type, query_type_back, query_sql_cmd, sql_cmd_md5, + query_struct_cmd, struct_cmd_md5, `sql`, sql_md5, query_engine, + elapsed_ms, query_state, native_query, start_date, end_date, dimensions, metrics, + select_cols, agg_cols, filter_cols, group_by_cols, + order_by_cols, use_result_cache, use_sql_cache, sql_cache_key, result_cache_key) + values (#{traceId}, #{modelId}, #{user}, #{queryType}, #{queryTypeBack}, #{querySqlCmd}, + #{querySqlCmdMd5}, #{queryStructCmd}, #{queryStructCmdMd5}, #{sql}, #{sqlMd5}, + #{queryEngine}, + #{elapsedMs}, #{queryState}, #{nativeQuery}, #{startDate}, #{endDate}, + #{dimensions}, #{metrics}, #{selectCols}, #{aggCols}, #{filterCols}, #{groupByCols}, + #{orderByCols}, #{useResultCache}, #{useSqlCache}, #{sqlCacheKey}, + #{resultCacheKey})