From b9f5e0a35450ed065cd5e2ccd2fc7c57d0333176 Mon Sep 17 00:00:00 2001 From: lexluo09 <39718951+lexluo09@users.noreply.github.com> Date: Wed, 1 Nov 2023 22:34:55 +0800 Subject: [PATCH] (improvement)(project) The Corrector is integrated into the Semantic module as an intermediate step for translating S2QL into SQL (#306) --- .../chat/api/pojo/request/QueryFilter.java | 2 +- .../llm/interpret/MetricInterpretParser.java | 2 +- .../parser/llm/s2ql/LLMResponseService.java | 2 +- .../chat/parser/plugin/PluginParser.java | 2 +- .../chat/query/rule/RuleSemanticQuery.java | 2 +- .../query/rule/metric/MetricEntityQuery.java | 4 +- .../query/rule/metric/MetricFilterQuery.java | 4 +- .../chat/service/SemanticService.java | 2 +- .../chat/service/impl/QueryServiceImpl.java | 2 +- .../chat/utils/DictQueryHelper.java | 4 +- .../chat/utils/QueryReqBuilder.java | 116 ++++++--- .../chat}/utils/SqlFilterUtils.java | 8 +- .../context/SemanticParseObjectHelper.java | 2 +- .../chat/utils/QueryReqBuilderTest.java | 61 ++++- .../supersonic/common/pojo/Constants.java | 2 + .../supersonic/common}/pojo/Criterion.java | 5 +- .../supersonic/common}/pojo/Filter.java | 5 +- .../supersonic/common/pojo}/ItemDateResp.java | 2 +- .../pojo}/enums/FilterOperatorEnum.java | 2 +- .../supersonic/common/util/DateModeUtils.java | 16 +- .../common/util/SqlFilterUtils.java | 245 ++++++++++++++++++ .../integration/EntityQueryTest.java | 2 +- .../integration/MetricQueryTest.java | 2 +- .../integration/MultiTurnsTest.java | 2 +- .../integration/mapper/MapperTest.java | 2 +- .../tencent/supersonic/util/DataUtils.java | 2 +- .../api/query/request/QueryStructReq.java | 2 +- .../model/application/CatalogImpl.java | 2 +- .../application/DatasourceServiceImpl.java | 2 +- .../semantic/model/domain/Catalog.java | 2 +- .../model/domain/DatasourceService.java | 2 +- .../parser/convert/CalculateAggConverter.java | 6 +- .../convert/DefaultDimValueConverter.java | 4 +- .../parser/convert/MetricCheckConverter.java | 2 +- .../query/parser/convert/MultiSourceJoin.java | 2 +- .../parser/convert/QueryReqConverter.java | 7 +- .../query/service/QueryServiceImpl.java | 4 +- .../query/utils/DataPermissionAOP.java | 4 +- .../semantic/query/utils/DimValueAspect.java | 4 +- .../query/utils/QueryStructUtils.java | 56 ++-- .../semantic/query/utils/StatUtils.java | 1 + 41 files changed, 483 insertions(+), 117 deletions(-) rename {semantic/query/src/main/java/com/tencent/supersonic/semantic/query => chat/core/src/main/java/com/tencent/supersonic/chat}/utils/SqlFilterUtils.java (97%) rename {semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query => common/src/main/java/com/tencent/supersonic/common}/pojo/Criterion.java (93%) rename {semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query => common/src/main/java/com/tencent/supersonic/common}/pojo/Filter.java (91%) rename {semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response => common/src/main/java/com/tencent/supersonic/common/pojo}/ItemDateResp.java (87%) rename {semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query => common/src/main/java/com/tencent/supersonic/common/pojo}/enums/FilterOperatorEnum.java (94%) rename semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DateUtils.java => common/src/main/java/com/tencent/supersonic/common/util/DateModeUtils.java (97%) create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/SqlFilterUtils.java diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilter.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilter.java index 820cbf742..35e753ac3 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilter.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilter.java @@ -1,7 +1,7 @@ package com.tencent.supersonic.chat.api.pojo.request; import com.google.common.base.Objects; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import lombok.Data; import lombok.ToString; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/interpret/MetricInterpretParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/interpret/MetricInterpretParser.java index b006ab2e1..3ca8095d5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/interpret/MetricInterpretParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/interpret/MetricInterpretParser.java @@ -25,7 +25,7 @@ import com.tencent.supersonic.chat.utils.ComponentFactory; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/s2ql/LLMResponseService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/s2ql/LLMResponseService.java index 8d0ee873c..a3c0b4092 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/s2ql/LLMResponseService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/s2ql/LLMResponseService.java @@ -22,7 +22,7 @@ import com.tencent.supersonic.common.util.jsqlparser.FilterExpression; import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectFunctionHelper; import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper; import com.tencent.supersonic.knowledge.service.SchemaService; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/PluginParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/PluginParser.java index 6b130570a..2e5c99673 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/PluginParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/PluginParser.java @@ -19,7 +19,7 @@ import com.tencent.supersonic.chat.plugin.PluginRecallResult; import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; import com.tencent.supersonic.common.pojo.Constants; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import org.springframework.util.CollectionUtils; import java.util.HashMap; import java.util.List; 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 dcdd3c83f..f88f81a27 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 @@ -23,7 +23,7 @@ import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.semantic.api.model.enums.QueryTypeEnum; import com.tencent.supersonic.semantic.api.model.response.ExplainResp; import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.semantic.api.query.request.ExplainSqlReq; import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; 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 1fd72808e..9a7e50f80 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 @@ -3,8 +3,8 @@ package com.tencent.supersonic.chat.query.rule.metric; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.common.pojo.enums.FilterType; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; -import com.tencent.supersonic.semantic.api.query.pojo.Filter; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.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; 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 7270cc052..00e050441 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 @@ -7,8 +7,8 @@ import static com.tencent.supersonic.chat.query.rule.QueryMatchOption.RequireNum import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.common.pojo.enums.FilterType; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; -import com.tencent.supersonic.semantic.api.query.pojo.Filter; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.Filter; import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; import java.util.ArrayList; 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 5a0a4d286..40147bfae 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 @@ -41,7 +41,7 @@ import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.DateUtils; import com.tencent.supersonic.knowledge.service.SchemaService; import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; import java.text.DecimalFormat; import java.time.DayOfWeek; 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 44a437a3c..6790e8e2c 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 @@ -53,7 +53,7 @@ import com.tencent.supersonic.knowledge.utils.HanlpHelper; import com.tencent.supersonic.knowledge.utils.NatureHelper; import com.tencent.supersonic.semantic.api.model.response.ExplainResp; import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; 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 494f472fd..b43149ab8 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 @@ -6,8 +6,8 @@ import com.tencent.supersonic.chat.config.DefaultMetric; import com.tencent.supersonic.chat.config.Dim4Dict; import com.tencent.supersonic.common.pojo.QueryColumn; 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.common.pojo.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.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; 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 455c75c0c..41641ffa5 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 @@ -7,18 +7,20 @@ import com.tencent.supersonic.chat.query.QueryManager; 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.Filter; import com.tencent.supersonic.common.pojo.Order; import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.util.DateModeUtils; +import com.tencent.supersonic.common.util.jsqlparser.SqlParserAddHelper; import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum; -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.QueryS2QLReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; import java.time.LocalDate; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; @@ -29,7 +31,9 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.Function; import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; @@ -40,6 +44,7 @@ import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectExpressionItem; import net.sf.jsqlparser.statement.select.SelectItem; +import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; import org.springframework.util.CollectionUtils; @@ -159,50 +164,93 @@ public class QueryReqBuilder { * @param queryStructReq * @return */ - public static QueryS2QLReq buildS2QLReq(QueryStructReq queryStructReq) { - + public static QueryS2QLReq buildS2QLReq(QueryStructReq queryStructReq) throws JSQLParserException { Select select = new Select(); - - // Set the select items (columns) + //1.Set the select items (columns) PlainSelect plainSelect = new PlainSelect(); List selectItems = new ArrayList<>(); - - selectItems.add(new SelectExpressionItem(new Column("column1"))); - selectItems.add(new SelectExpressionItem(new Column("column2"))); + List groups = queryStructReq.getGroups(); + if (!CollectionUtils.isEmpty(groups)) { + for (String group : groups) { + selectItems.add(new SelectExpressionItem(new Column(group))); + } + } + List aggregators = queryStructReq.getAggregators(); + if (!CollectionUtils.isEmpty(aggregators)) { + for (Aggregator aggregator : aggregators) { + if (queryStructReq.getNativeQuery()) { + selectItems.add(new SelectExpressionItem(new Column(aggregator.getColumn()))); + } else { + Function sumFunction = new Function(); + AggOperatorEnum func = aggregator.getFunc(); + if (AggOperatorEnum.UNKNOWN.equals(func)) { + func = AggOperatorEnum.SUM; + } + sumFunction.setName(func.getOperator()); + sumFunction.setParameters(new ExpressionList(new Column(aggregator.getColumn()))); + selectItems.add(new SelectExpressionItem(sumFunction)); + } + } + } plainSelect.setSelectItems(selectItems); - - // Set the table name - Table table = new Table("table1"); + //2.Set the table name + Table table = new Table(Constants.TABLE_PREFIX + queryStructReq.getModelId()); plainSelect.setFromItem(table); - // Set the order by clause - OrderByElement orderByElement = new OrderByElement(); - orderByElement.setExpression(new Column("column1")); - plainSelect.setOrderByElements(Collections.singletonList(orderByElement)); - - // Set the group by clause - GroupByElement groupByElement = new GroupByElement(); - groupByElement.addGroupByExpression(new Column("column1")); - plainSelect.setGroupByElement(groupByElement); - - // Set the having clause - Expression havingExpression = null; - try { - havingExpression = CCJSqlParserUtil.parseCondExpression("condition2"); - } catch (JSQLParserException e) { - log.error(""); + //3.Set the order by clause + List orders = queryStructReq.getOrders(); + if (!CollectionUtils.isEmpty(orders)) { + List orderByElements = new ArrayList<>(); + for (Order order : orders) { + OrderByElement orderByElement = new OrderByElement(); + orderByElement.setExpression(new Column(order.getColumn())); + orderByElement.setAsc(false); + if (Constants.ASC_UPPER.equalsIgnoreCase(order.getDirection())) { + orderByElement.setAsc(true); + } + orderByElements.add(orderByElement); + } + plainSelect.setOrderByElements(orderByElements); } - plainSelect.setHaving(havingExpression); - // Set the limit clause - Limit limit = new Limit(); - limit.setRowCount(new LongValue(10)); - plainSelect.setLimit(limit); + //4.Set the group by clause + if (!CollectionUtils.isEmpty(groups) && !queryStructReq.getNativeQuery()) { + GroupByElement groupByElement = new GroupByElement(); + for (String group : groups) { + groupByElement.addGroupByExpression(new Column(group)); + } + plainSelect.setGroupByElement(groupByElement); + } + //7.Set the limit clause + if (Objects.nonNull(queryStructReq.getLimit())) { + Limit limit = new Limit(); + limit.setRowCount(new LongValue(queryStructReq.getLimit())); + plainSelect.setLimit(limit); + } select.setSelectBody(plainSelect); + //5.Set where + List dimensionFilters = queryStructReq.getDimensionFilters(); + SqlFilterUtils sqlFilterUtils = ContextUtils.getBean(SqlFilterUtils.class); + String whereClause = sqlFilterUtils.getWhereClause(dimensionFilters); + + String sql = select.toString(); + if (StringUtils.isNotBlank(whereClause)) { + Expression expression = CCJSqlParserUtil.parseCondExpression(whereClause); + sql = SqlParserAddHelper.addWhere(sql, expression); + } + + //6.Set DateInfo + DateModeUtils dateModeUtils = ContextUtils.getBean(DateModeUtils.class); + String dateWhereStr = dateModeUtils.getDateWhereStr(queryStructReq.getDateInfo()); + if (StringUtils.isNotBlank(dateWhereStr)) { + Expression expression = CCJSqlParserUtil.parseCondExpression(dateWhereStr); + sql = SqlParserAddHelper.addWhere(sql, expression); + } + QueryS2QLReq result = new QueryS2QLReq(); - result.setSql(select.toString()); + result.setSql(sql); result.setModelId(queryStructReq.getModelId()); result.setVariables(new HashMap<>()); return result; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/SqlFilterUtils.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/SqlFilterUtils.java similarity index 97% rename from semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/SqlFilterUtils.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/utils/SqlFilterUtils.java index 95c71a48a..fd8655bf7 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/SqlFilterUtils.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/SqlFilterUtils.java @@ -1,14 +1,14 @@ -package com.tencent.supersonic.semantic.query.utils; +package com.tencent.supersonic.chat.utils; import static com.tencent.supersonic.common.pojo.Constants.PARENTHESES_END; 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.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 com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.Criterion; +import com.tencent.supersonic.common.pojo.Filter; import java.util.ArrayList; import java.util.List; import java.util.Objects; 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 95ab92959..5b18d3ea7 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 @@ -4,7 +4,7 @@ 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.FilterOperatorEnum; import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum; import com.tencent.supersonic.common.pojo.DateConf; diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/utils/QueryReqBuilderTest.java b/chat/core/src/test/java/com/tencent/supersonic/chat/utils/QueryReqBuilderTest.java index 42ba7c11b..05d00b577 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/utils/QueryReqBuilderTest.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/utils/QueryReqBuilderTest.java @@ -1,7 +1,23 @@ package com.tencent.supersonic.chat.utils; +import com.tencent.supersonic.common.pojo.Aggregator; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.pojo.DateConf.DateMode; +import com.tencent.supersonic.common.pojo.Order; +import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; +import com.tencent.supersonic.common.util.ContextUtils; +import com.tencent.supersonic.common.util.DateModeUtils; +import com.tencent.supersonic.semantic.api.query.request.QueryS2QLReq; +import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import net.sf.jsqlparser.JSQLParserException; +import org.junit.Assert; import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; /** * QueryReqBuilderTest @@ -9,9 +25,52 @@ import org.junit.jupiter.api.Test; class QueryReqBuilderTest { @Test - void buildS2QLReq() { + void buildS2QLReq() throws JSQLParserException { + init(); + QueryStructReq queryStructReq = new QueryStructReq(); + queryStructReq.setModelId(1L); + queryStructReq.setNativeQuery(false); + Aggregator aggregator = new Aggregator(); + aggregator.setFunc(AggOperatorEnum.UNKNOWN); + aggregator.setColumn("pv"); + queryStructReq.setAggregators(Arrays.asList(aggregator)); + queryStructReq.setGroups(Arrays.asList("department")); + + DateConf dateConf = new DateConf(); + dateConf.setDateMode(DateMode.LIST); + dateConf.setDateList(Arrays.asList("2023-08-01")); + queryStructReq.setDateInfo(dateConf); + + List orders = new ArrayList<>(); + Order order = new Order(); + order.setColumn("uv"); + orders.add(order); + queryStructReq.setOrders(orders); + + QueryS2QLReq queryS2QLReq = QueryReqBuilder.buildS2QLReq(queryStructReq); + Assert.assertEquals( + "SELECT department, SUM(pv) FROM t_1 WHERE (sys_imp_date IN ('2023-08-01')) " + + "GROUP BY department ORDER BY uv LIMIT 2000", queryS2QLReq.getSql()); + + queryStructReq.setNativeQuery(true); + queryS2QLReq = QueryReqBuilder.buildS2QLReq(queryStructReq); + Assert.assertEquals( + "SELECT department, pv FROM t_1 WHERE (sys_imp_date IN ('2023-08-01')) " + + "ORDER BY uv LIMIT 2000", + queryS2QLReq.getSql()); } + + private void init() { + MockedStatic mockContextUtils = Mockito.mockStatic(ContextUtils.class); + SqlFilterUtils sqlFilterUtils = new SqlFilterUtils(); + mockContextUtils.when(() -> ContextUtils.getBean(SqlFilterUtils.class)).thenReturn(sqlFilterUtils); + DateModeUtils dateModeUtils = new DateModeUtils(); + mockContextUtils.when(() -> ContextUtils.getBean(DateModeUtils.class)).thenReturn(dateModeUtils); + dateModeUtils.setSysDateCol("sys_imp_date"); + dateModeUtils.setSysDateWeekCol("sys_imp_week"); + dateModeUtils.setSysDateMonthCol("sys_imp_month"); + } } \ No newline at end of file diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/Constants.java b/common/src/main/java/com/tencent/supersonic/common/pojo/Constants.java index 79fb6d1d0..cd08b6885 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/Constants.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/Constants.java @@ -64,4 +64,6 @@ public class Constants { public static final Long DEFAULT_FREQUENCY = 100000L; + public static final String TABLE_PREFIX = "t_"; + } diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Criterion.java b/common/src/main/java/com/tencent/supersonic/common/pojo/Criterion.java similarity index 93% rename from semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Criterion.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/Criterion.java index 162779ba1..1b9e40ef9 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Criterion.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/Criterion.java @@ -1,10 +1,9 @@ -package com.tencent.supersonic.semantic.api.query.pojo; +package com.tencent.supersonic.common.pojo; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.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/common/src/main/java/com/tencent/supersonic/common/pojo/Filter.java similarity index 91% rename from semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Filter.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/Filter.java index 9c3d2506e..cd2bb7d7b 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/pojo/Filter.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/Filter.java @@ -1,9 +1,8 @@ -package com.tencent.supersonic.semantic.api.query.pojo; +package com.tencent.supersonic.common.pojo; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.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/model/response/ItemDateResp.java b/common/src/main/java/com/tencent/supersonic/common/pojo/ItemDateResp.java similarity index 87% rename from semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/ItemDateResp.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/ItemDateResp.java index 7914a5d77..256c08468 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/ItemDateResp.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/ItemDateResp.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.semantic.api.model.response; +package com.tencent.supersonic.common.pojo; import java.util.ArrayList; import java.util.List; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/enums/FilterOperatorEnum.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/FilterOperatorEnum.java similarity index 94% rename from semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/enums/FilterOperatorEnum.java rename to common/src/main/java/com/tencent/supersonic/common/pojo/enums/FilterOperatorEnum.java index fd6823f37..7c4b10c83 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/query/enums/FilterOperatorEnum.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/FilterOperatorEnum.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.semantic.api.query.enums; +package com.tencent.supersonic.common.pojo.enums; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DateUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/DateModeUtils.java similarity index 97% rename from semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DateUtils.java rename to common/src/main/java/com/tencent/supersonic/common/util/DateModeUtils.java index fef6c26ca..7d0fde4d4 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/utils/DateUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/DateModeUtils.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.semantic.query.utils; +package com.tencent.supersonic.common.util; import static com.tencent.supersonic.common.pojo.Constants.APOSTROPHE; import static com.tencent.supersonic.common.pojo.Constants.COMMA; @@ -10,7 +10,7 @@ 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 com.tencent.supersonic.common.pojo.ItemDateResp; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; @@ -21,6 +21,7 @@ import java.util.List; import java.util.Objects; import java.util.StringJoiner; import java.util.regex.Pattern; +import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.ImmutablePair; import org.springframework.beans.factory.annotation.Value; @@ -30,7 +31,8 @@ import org.springframework.util.CollectionUtils; @Slf4j @Component -public class DateUtils { +@Data +public class DateModeUtils { @Value("${query.parameter.sys.date:sys_imp_date}") private String sysDateCol; @@ -227,6 +229,9 @@ public class DateUtils { public String recentDateStr(ItemDateResp dateDate, DateConf dateInfo) { + if (Objects.isNull(dateDate)) { + return ""; + } if (DAY.equalsIgnoreCase(dateInfo.getPeriod())) { return recentDayStr(dateDate, dateInfo); } @@ -315,6 +320,11 @@ public class DateUtils { LocalDate.now().minusDays(1)); } + public String getDateWhereStr(DateConf dateInfo) { + ItemDateResp dateDate = null; + return getDateWhereStr(dateInfo, dateDate); + } + public String getDateWhereStr(DateConf dateInfo, ItemDateResp dateDate) { String dateStr = ""; switch (dateInfo.getDateMode()) { diff --git a/common/src/main/java/com/tencent/supersonic/common/util/SqlFilterUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/SqlFilterUtils.java new file mode 100644 index 000000000..97668a4ff --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/SqlFilterUtils.java @@ -0,0 +1,245 @@ +package com.tencent.supersonic.common.util; + +import static com.tencent.supersonic.common.pojo.Constants.PARENTHESES_END; +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.common.pojo.Criterion; +import com.tencent.supersonic.common.pojo.Filter; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.StringJoiner; +import java.util.regex.Pattern; +import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.util.Strings; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + + +@Component +@Slf4j +public class SqlFilterUtils { + + private static String pattern = "^'.*?'$"; + private static String numericPattern = "^[0-9]+$"; + + public List getFiltersCol(List filters) { + List filterCols = new ArrayList<>(); + if (CollectionUtils.isEmpty(filters)) { + return filterCols; + } + for (Filter filter : filters) { + filterCols.addAll(getFilterCol(filter)); + } + return filterCols; + } + + private List getFilterCol(Filter filter) { + List filterCols = new ArrayList<>(); + if (Filter.Relation.FILTER.equals(filter.getRelation())) { + if (Strings.isNotEmpty(filter.getBizName())) { + filterCols.add(filter.getBizName()); + } + } + + List children = filter.getChildren(); + if (!CollectionUtils.isEmpty(children)) { + for (Filter child : children) { + filterCols.addAll(getFilterCol(child)); + } + } + return filterCols; + } + + + public String getWhereClause(List filters) { + StringJoiner joiner = new StringJoiner(Constants.AND_UPPER); + + if (!CollectionUtils.isEmpty(filters)) { + filters.stream() + .forEach(filter -> { + if (Strings.isNotEmpty(dealFilter(filter))) { + joiner.add(SPACE + dealFilter(filter) + SPACE); + } + }); + log.info("getWhereClause, where sql : {}", joiner.toString()); + return joiner.toString(); + } + + return ""; + } + + public String dealFilter(Filter filter) { + if (Objects.isNull(filter)) { + return ""; + } + if (Strings.isNotEmpty(filter.getBizName()) && filter.getBizName().endsWith(SYS_VAR)) { + return ""; + } + StringBuilder condition = new StringBuilder(); + if (Filter.Relation.FILTER.equals(filter.getRelation())) { + return dealSingleFilter(filter); + } + + List children = filter.getChildren(); + condition.append(PARENTHESES_START); + StringJoiner joiner = new StringJoiner(SPACE + filter.getRelation().name() + SPACE); + for (Filter child : children) { + joiner.add(dealFilter(child)); + } + condition.append(joiner.toString()); + condition.append(PARENTHESES_END); + return condition.toString(); + } + + // todo deal metric filter + private String dealSingleFilter(Filter filter) { + String name = filter.getBizName(); + Object value = filter.getValue(); + FilterOperatorEnum operator = filter.getOperator(); + + String dataType = Criterion.StringDataType.STRING.name(); + + Criterion criterion = new Criterion(name, operator, value, dataType); + return generator(criterion); + } + + private String generator(Criterion criterion) { + log.info("criterion :{}", criterion); + String sqlPart; + switch (criterion.getOperator()) { + case SQL_PART: + sqlPart = sqlPartLogic(criterion); + break; + + case IS_NULL: + case IS_NOT_NULL: + sqlPart = judgeNullLogic(criterion); + break; + + case EQUALS: + case NOT_EQUALS: + case GREATER_THAN: + case GREATER_THAN_EQUALS: + case MINOR_THAN: + case MINOR_THAN_EQUALS: + sqlPart = singleValueLogic(criterion); + break; + + case BETWEEN: + sqlPart = betweenLogic(criterion); + break; + + case IN: + case NOT_IN: + sqlPart = inLogic(criterion); + break; + case LIKE: + sqlPart = likeLogic(criterion); + + break; + default: + throw new IllegalStateException("Unexpected value: " + criterion.getOperator()); + } + return sqlPart; + } + + private String likeLogic(Criterion criterion) { + if (Objects.isNull(criterion) || Objects.isNull(criterion.getValue())) { + throw new RuntimeException("criterion.getValue() can not be null"); + } + StringBuilder whereClause = new StringBuilder(); + whereClause.append(criterion.getColumn() + SPACE + criterion.getOperator().getValue() + SPACE); + String value = criterion.getValue().toString(); + if (criterion.isNeedApostrophe() && !Pattern.matches(pattern, value)) { + // like click => 'like%' + whereClause.append(Constants.APOSTROPHE + value + Constants.PERCENT_SIGN + Constants.APOSTROPHE); + + } else { + // like 'click' => 'like%' + whereClause.append(Constants.APOSTROPHE + value.replaceAll(Constants.APOSTROPHE, Constants.PERCENT_SIGN) + + Constants.APOSTROPHE); + } + return whereClause.toString(); + } + + private String inLogic(Criterion criterion) { + if (Objects.isNull(criterion) || Objects.isNull(criterion.getValue())) { + throw new RuntimeException("criterion.getValue() can not be null"); + } + + StringBuilder whereClause = new StringBuilder(); + whereClause.append(criterion.getColumn() + SPACE + criterion.getOperator().getValue() + SPACE); + List values = (List) criterion.getValue(); + whereClause.append(PARENTHESES_START); + StringJoiner joiner = new StringJoiner(","); + if (criterion.isNeedApostrophe()) { + values.stream().forEach(value -> joiner.add(valueApostropheLogic(value.toString()))); + } else { + values.stream().forEach(value -> joiner.add(value.toString())); + } + whereClause.append(joiner); + whereClause.append(PARENTHESES_END); + return whereClause.toString(); + } + + private String betweenLogic(Criterion criterion) { + if (Objects.isNull(criterion) || Objects.isNull(criterion.getValue())) { + throw new RuntimeException("criterion.getValue() can not be null"); + } + List values = (List) criterion.getValue(); + if (values.size() != 2) { + throw new RuntimeException("between value size should be 2"); + } + + if (criterion.isNeedApostrophe()) { + return String.format("(%s >= %s and %s <= %s)", criterion.getColumn(), + valueApostropheLogic(values.get(0).toString()), + criterion.getColumn(), valueApostropheLogic(values.get(1).toString())); + } + return String.format("(%s >= %s and %s <= %s)", criterion.getColumn(), values.get(0).toString(), + criterion.getColumn(), values.get(1).toString()); + } + + private String singleValueLogic(Criterion criterion) { + if (Objects.isNull(criterion) || Objects.isNull(criterion.getValue())) { + throw new RuntimeException("criterion.getValue() can not be null"); + } + StringBuilder whereClause = new StringBuilder(); + whereClause.append(criterion.getColumn() + SPACE + criterion.getOperator().getValue() + SPACE); + String value = criterion.getValue().toString(); + if (criterion.isNeedApostrophe()) { + value = valueApostropheLogic(value); + } + whereClause.append(value); + return whereClause.toString(); + } + + private String valueApostropheLogic(String value) { + if (Pattern.matches(pattern, value) || Pattern.matches(numericPattern, value)) { + return value; + } + return Constants.APOSTROPHE + value + Constants.APOSTROPHE; + } + + private String judgeNullLogic(Criterion criterion) { + + if (Objects.isNull(criterion) || Objects.isNull(criterion.getColumn())) { + throw new RuntimeException("criterion.getColumn() can not be null"); + } + return String.format("( %s %s)", criterion.getColumn(), criterion.getOperator().getValue()); + } + + private String sqlPartLogic(Criterion criterion) { + if (Objects.isNull(criterion) || Objects.isNull(criterion.getValue())) { + throw new RuntimeException("criterion.getValue() can not be null"); + } + return PARENTHESES_START + SPACE + criterion.getValue().toString() + SPACE + PARENTHESES_END; + } + + +} \ No newline at end of file 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 a001e3677..a0f2b7e1c 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 @@ -7,7 +7,7 @@ import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.query.rule.entity.EntityFilterQuery; 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.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.util.DataUtils; import org.junit.Test; import java.util.ArrayList; 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 d44c5cd55..f02ea3df6 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 @@ -13,7 +13,7 @@ import com.tencent.supersonic.chat.query.rule.metric.MetricFilterQuery; import com.tencent.supersonic.chat.query.rule.metric.MetricGroupByQuery; import com.tencent.supersonic.chat.query.rule.metric.MetricTopNQuery; import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.util.DataUtils; import org.junit.Assert; import org.junit.Test; 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..5e4015437 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 @@ -5,7 +5,7 @@ import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.query.rule.metric.MetricFilterQuery; import com.tencent.supersonic.chat.query.rule.metric.MetricGroupByQuery; import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.util.DataUtils; import org.junit.Test; import org.junit.jupiter.api.Order; diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/mapper/MapperTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/mapper/MapperTest.java index b0aeefc35..d9cd0ec3e 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/integration/mapper/MapperTest.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/integration/mapper/MapperTest.java @@ -10,7 +10,7 @@ import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.query.rule.metric.MetricEntityQuery; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.integration.BaseQueryTest; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.util.DataUtils; import org.junit.Test; 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 50938af67..4d5c576de 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 @@ -15,7 +15,7 @@ import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.parser.llm.interpret.MetricOption; import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import java.util.Set; 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 70c45adff..8f3d79d36 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 @@ -2,7 +2,7 @@ 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.common.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; 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 c24dc070f..7b0fd39fb 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 @@ -4,7 +4,7 @@ import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter; 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.common.pojo.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.response.ModelResp; 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 314206c10..da8fe79b8 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 @@ -22,7 +22,7 @@ import com.tencent.supersonic.semantic.api.model.response.DatabaseResp; 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.DimensionResp; -import com.tencent.supersonic.semantic.api.model.response.ItemDateResp; +import com.tencent.supersonic.common.pojo.ItemDateResp; import com.tencent.supersonic.semantic.api.model.response.MeasureResp; import com.tencent.supersonic.semantic.api.model.response.MetricResp; import com.tencent.supersonic.semantic.model.domain.DatabaseService; 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 811047556..275516cd6 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 @@ -4,7 +4,7 @@ import com.tencent.supersonic.semantic.api.model.pojo.ItemDateFilter; 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.common.pojo.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; 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 40a9b4c61..c584ddd74 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 @@ -10,7 +10,7 @@ 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.common.pojo.ItemDateResp; import com.tencent.supersonic.semantic.api.model.response.MeasureResp; import java.util.List; import java.util.Map; 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 190066c83..866b60ae1 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 @@ -15,7 +15,7 @@ import com.tencent.supersonic.semantic.model.domain.Catalog; import com.tencent.supersonic.semantic.model.domain.pojo.EngineTypeEnum; import com.tencent.supersonic.semantic.query.parser.SemanticConverter; import com.tencent.supersonic.semantic.query.service.SemanticQueryEngine; -import com.tencent.supersonic.semantic.query.utils.DateUtils; +import com.tencent.supersonic.common.util.DateModeUtils; import com.tencent.supersonic.semantic.query.utils.QueryStructUtils; import com.tencent.supersonic.semantic.query.utils.SqlGenerateUtils; import java.util.ArrayList; @@ -410,8 +410,8 @@ public class CalculateAggConverter implements SemanticConverter { } private static String getTimeDim(QueryStructReq queryStructCmd) { - DateUtils dateUtils = ContextUtils.getContext().getBean(DateUtils.class); - return dateUtils.getSysDateCol(queryStructCmd.getDateInfo()); + DateModeUtils dateModeUtils = ContextUtils.getContext().getBean(DateModeUtils.class); + return dateModeUtils.getSysDateCol(queryStructCmd.getDateInfo()); } private static String getLimit(QueryStructReq queryStructCmd) { 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 b362306d1..f16efd084 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 @@ -1,8 +1,8 @@ package com.tencent.supersonic.semantic.query.parser.convert; import com.tencent.supersonic.semantic.api.model.response.DimensionResp; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; -import com.tencent.supersonic.semantic.api.query.pojo.Filter; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.Filter; import com.tencent.supersonic.semantic.api.query.request.MetricReq; import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/MetricCheckConverter.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/MetricCheckConverter.java index 49b2f6451..0f6e11eee 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/MetricCheckConverter.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/MetricCheckConverter.java @@ -3,7 +3,7 @@ package com.tencent.supersonic.semantic.query.parser.convert; import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException; import com.tencent.supersonic.semantic.api.model.response.DimensionResp; import com.tencent.supersonic.semantic.api.model.response.MetricResp; -import com.tencent.supersonic.semantic.api.query.pojo.Filter; +import com.tencent.supersonic.common.pojo.Filter; import com.tencent.supersonic.semantic.api.query.request.MetricReq; import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; 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 5cb1039c3..c919058da 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 @@ -8,7 +8,7 @@ import com.tencent.supersonic.semantic.api.model.pojo.Measure; 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.MetricResp; -import com.tencent.supersonic.semantic.api.query.pojo.Filter; +import com.tencent.supersonic.common.pojo.Filter; import com.tencent.supersonic.semantic.api.query.request.MetricReq; import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/QueryReqConverter.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/QueryReqConverter.java index f14064d34..13dfa3553 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/QueryReqConverter.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/parser/convert/QueryReqConverter.java @@ -2,6 +2,7 @@ package com.tencent.supersonic.semantic.query.parser.convert; import com.tencent.supersonic.common.pojo.Aggregator; +import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; import com.tencent.supersonic.common.util.DateUtils; import com.tencent.supersonic.common.util.jsqlparser.SqlParserReplaceHelper; @@ -46,7 +47,6 @@ import org.springframework.util.CollectionUtils; @Slf4j public class QueryReqConverter { - public static final String TABLE_PREFIX = "t_"; @Autowired private ModelService domainService; @Autowired @@ -135,7 +135,7 @@ public class QueryReqConverter { Map fieldNameToBizNameMap = getFieldNameToBizNameMap(modelSchemaResp); String sql = databaseReq.getSql(); log.info("convert name to bizName before:{}", sql); - String replaceFields = SqlParserReplaceHelper.replaceFields(sql, fieldNameToBizNameMap, false); + String replaceFields = SqlParserReplaceHelper.replaceFields(sql, fieldNameToBizNameMap, true); log.info("convert name to bizName after:{}", replaceFields); databaseReq.setSql(replaceFields); } @@ -202,7 +202,8 @@ public class QueryReqConverter { } public void correctTableName(QueryS2QLReq databaseReq) { - String sql = SqlParserReplaceHelper.replaceTable(databaseReq.getSql(), TABLE_PREFIX + databaseReq.getModelId()); + String sql = SqlParserReplaceHelper.replaceTable(databaseReq.getSql(), + Constants.TABLE_PREFIX + databaseReq.getModelId()); databaseReq.setSql(sql); } 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 c16d49d1f..223cce915 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 @@ -17,9 +17,9 @@ import com.tencent.supersonic.semantic.api.model.request.ModelSchemaFilterReq; import com.tencent.supersonic.semantic.api.model.response.ExplainResp; 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.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; import com.tencent.supersonic.semantic.api.query.pojo.Cache; -import com.tencent.supersonic.semantic.api.query.pojo.Filter; +import com.tencent.supersonic.common.pojo.Filter; import com.tencent.supersonic.semantic.api.query.request.ExplainSqlReq; import com.tencent.supersonic.semantic.api.query.request.ItemUseReq; import com.tencent.supersonic.semantic.api.query.request.MetricReq; 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 dd0637795..5a919b34e 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 @@ -20,8 +20,8 @@ import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaR import com.tencent.supersonic.semantic.api.model.response.ModelResp; import com.tencent.supersonic.semantic.api.model.response.DimensionResp; import com.tencent.supersonic.semantic.api.model.response.MetricResp; -import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum; -import com.tencent.supersonic.semantic.api.query.pojo.Filter; +import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.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.InvalidPermissionException; 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 98577189f..70ba42f12 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 @@ -8,8 +8,8 @@ import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper; import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap; import com.tencent.supersonic.semantic.api.model.response.DimensionResp; 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.common.pojo.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.Filter; import com.tencent.supersonic.semantic.api.query.request.QueryS2QLReq; import com.tencent.supersonic.semantic.api.query.request.QueryStructReq; import com.tencent.supersonic.semantic.model.domain.DimensionService; 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 74b0b07eb..d4fa9dd78 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 @@ -11,6 +11,8 @@ import com.tencent.supersonic.common.pojo.Aggregator; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.DateConf.DateMode; import com.tencent.supersonic.common.pojo.enums.TypeEnums; +import com.tencent.supersonic.common.util.DateModeUtils; +import com.tencent.supersonic.common.util.SqlFilterUtils; import com.tencent.supersonic.common.util.StringUtil; import com.tencent.supersonic.common.util.jsqlparser.FilterExpression; import com.tencent.supersonic.common.util.jsqlparser.SqlParserAddHelper; @@ -21,7 +23,7 @@ import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; import com.tencent.supersonic.semantic.api.model.request.ModelSchemaFilterReq; 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.ItemDateResp; +import com.tencent.supersonic.common.pojo.ItemDateResp; import com.tencent.supersonic.semantic.api.model.response.MetricResp; import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp; import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp; @@ -67,7 +69,7 @@ public class QueryStructUtils { internalCols.addAll(internalTimeCols); } - private final DateUtils dateUtils; + private final DateModeUtils dateModeUtils; private final SqlFilterUtils sqlFilterUtils; private final Catalog catalog; @Value("${internal.metric.cnt.suffix:internal_cnt}") @@ -82,10 +84,10 @@ public class QueryStructUtils { private String variablePrefix = "'${"; public QueryStructUtils( - DateUtils dateUtils, + DateModeUtils dateModeUtils, SqlFilterUtils sqlFilterUtils, Catalog catalog) { - this.dateUtils = dateUtils; + this.dateModeUtils = dateModeUtils; this.sqlFilterUtils = sqlFilterUtils; this.catalog = catalog; } @@ -145,19 +147,19 @@ public class QueryStructUtils { || Strings.isEmpty(dateDate.getStartDate()) && Strings.isEmpty(dateDate.getEndDate())) { if (dateInfo.getDateMode().equals(DateMode.LIST)) { - return dateUtils.listDateStr(dateDate, dateInfo); + return dateModeUtils.listDateStr(dateDate, dateInfo); } if (dateInfo.getDateMode().equals(DateMode.BETWEEN)) { - return dateUtils.betweenDateStr(dateDate, dateInfo); + return dateModeUtils.betweenDateStr(dateDate, dateInfo); } - if (dateUtils.hasAvailableDataMode(dateInfo)) { - return dateUtils.hasDataModeStr(dateDate, dateInfo); + if (dateModeUtils.hasAvailableDataMode(dateInfo)) { + return dateModeUtils.hasDataModeStr(dateDate, dateInfo); } - return dateUtils.defaultRecentDateInfo(queryStructCmd.getDateInfo()); + return dateModeUtils.defaultRecentDateInfo(queryStructCmd.getDateInfo()); } log.info("dateDate:{}", dateDate); - return dateUtils.getDateWhereStr(dateInfo, dateDate); + return dateModeUtils.getDateWhereStr(dateInfo, dateDate); } @@ -177,7 +179,7 @@ public class QueryStructUtils { return whereFromDate; } else if (Strings.isEmpty(whereFromDate) && Strings.isEmpty(whereClauseFromFilter)) { log.info("the current date information is empty, enter the date initialization logic"); - return dateUtils.defaultRecentDateInfo(queryStructCmd.getDateInfo()); + return dateModeUtils.defaultRecentDateInfo(queryStructCmd.getDateInfo()); } return whereClauseFromFilter; } @@ -283,19 +285,19 @@ public class QueryStructUtils { public String generateZipperWhere(QueryStatement queryStatement, QueryStructReq queryStructReq) { if (Objects.nonNull(queryStatement.getParseSqlReq().getSql())) { String sql = SqlParserRemoveHelper.removeWhere(queryStatement.getParseSqlReq().getSql(), - dateUtils.getDateCol()); + dateModeUtils.getDateCol()); if (!CollectionUtils.isEmpty(queryStatement.getMetricReq().getDimensions())) { List dimension = queryStatement.getMetricReq().getDimensions().stream() - .filter(d -> !dateUtils.getDateCol().contains(d.toLowerCase())).collect( + .filter(d -> !dateModeUtils.getDateCol().contains(d.toLowerCase())).collect( Collectors.toList()); - dimension.add(dateUtils.getDateColBegin(queryStructReq.getDateInfo())); - dimension.add(dateUtils.getDateColEnd(queryStructReq.getDateInfo())); + dimension.add(dateModeUtils.getDateColBegin(queryStructReq.getDateInfo())); + dimension.add(dateModeUtils.getDateColEnd(queryStructReq.getDateInfo())); queryStatement.getMetricReq().setDimensions(dimension); } return SqlParserAddHelper.addWhere(sql, SqlParserSelectHelper.getTimeFilter(queryStatement.getTimeRanges(), - dateUtils.getDateColBegin(queryStructReq.getDateInfo()), - dateUtils.getDateColEnd(queryStructReq.getDateInfo()))); + dateModeUtils.getDateColBegin(queryStructReq.getDateInfo()), + dateModeUtils.getDateColEnd(queryStructReq.getDateInfo()))); } return queryStatement.getSql(); } @@ -306,7 +308,7 @@ public class QueryStructUtils { List wheres = new ArrayList<>(); if (!CollectionUtils.isEmpty(timeRanges)) { for (ImmutablePair range : timeRanges) { - String strWhere = dateUtils.getDateWhereStr(queryStructCmd.getDateInfo(), range); + String strWhere = dateModeUtils.getDateWhereStr(queryStructCmd.getDateInfo(), range); if (!strWhere.isEmpty()) { wheres.add(strWhere); } @@ -337,11 +339,11 @@ public class QueryStructUtils { } switch (dateConf.getPeriod()) { case DAY: - return dateUtils.recentDay(dateDate, dateConf); + return dateModeUtils.recentDay(dateDate, dateConf); case WEEK: - return dateUtils.recentWeek(dateDate, dateConf); + return dateModeUtils.recentWeek(dateDate, dateConf); case MONTH: - List> rets = dateUtils.recentMonth(dateDate, dateConf); + List> rets = dateModeUtils.recentMonth(dateDate, dateConf); Optional minBegins = rets.stream().map(i -> i.left).sorted().findFirst(); Optional maxBegins = rets.stream().map(i -> i.right).sorted(Comparator.reverseOrder()) .findFirst(); @@ -387,13 +389,13 @@ public class QueryStructUtils { } switch (dateConf.getPeriod()) { case DAY: - ret.add(dateUtils.recentDay(dateDate, dateConf)); + ret.add(dateModeUtils.recentDay(dateDate, dateConf)); break; case WEEK: - ret.add(dateUtils.recentWeek(dateDate, dateConf)); + ret.add(dateModeUtils.recentWeek(dateDate, dateConf)); break; case MONTH: - List> rets = dateUtils.recentMonth(dateDate, dateConf); + List> rets = dateModeUtils.recentMonth(dateDate, dateConf); ret.addAll(rets); break; default: @@ -426,10 +428,10 @@ public class QueryStructUtils { if (Objects.isNull(f.getFieldName()) || !internalCols.contains(f.getFieldName().toLowerCase())) { continue; } - if (Objects.isNull(f.getFieldValue()) || !dateUtils.isDateStr(f.getFieldValue().toString())) { + if (Objects.isNull(f.getFieldValue()) || !dateModeUtils.isDateStr(f.getFieldValue().toString())) { continue; } - period = dateUtils.getPeriodByCol(f.getFieldName().toLowerCase()); + period = dateModeUtils.getPeriodByCol(f.getFieldName().toLowerCase()); if ("".equals(period)) { continue; } @@ -465,7 +467,7 @@ public class QueryStructUtils { } public List getDateCol() { - return dateUtils.getDateCol(); + return dateModeUtils.getDateCol(); } public String getVariablePrefix() { 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 74a41fc54..52397c6ba 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 @@ -5,6 +5,7 @@ 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.common.util.SqlFilterUtils; import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper; import com.tencent.supersonic.semantic.api.model.enums.QueryTypeBackEnum; import com.tencent.supersonic.semantic.api.model.enums.QueryTypeEnum;