mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-10 11:07:06 +00:00
(improvement)(project) The Corrector is integrated into the Semantic module as an intermediate step for translating S2QL into SQL (#306)
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
package com.tencent.supersonic.chat.api.pojo.request;
|
package com.tencent.supersonic.chat.api.pojo.request;
|
||||||
|
|
||||||
import com.google.common.base.Objects;
|
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.Data;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import com.tencent.supersonic.chat.utils.ComponentFactory;
|
|||||||
import com.tencent.supersonic.common.pojo.DateConf;
|
import com.tencent.supersonic.common.pojo.DateConf;
|
||||||
import com.tencent.supersonic.common.util.ContextUtils;
|
import com.tencent.supersonic.common.util.ContextUtils;
|
||||||
import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum;
|
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 lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
|||||||
@@ -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.SqlParserSelectFunctionHelper;
|
||||||
import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper;
|
import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper;
|
||||||
import com.tencent.supersonic.knowledge.service.SchemaService;
|
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.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import com.tencent.supersonic.chat.plugin.PluginRecallResult;
|
|||||||
import com.tencent.supersonic.chat.query.QueryManager;
|
import com.tencent.supersonic.chat.query.QueryManager;
|
||||||
import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery;
|
import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery;
|
||||||
import com.tencent.supersonic.common.pojo.Constants;
|
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 org.springframework.util.CollectionUtils;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@@ -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.enums.QueryTypeEnum;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.ExplainResp;
|
import com.tencent.supersonic.semantic.api.model.response.ExplainResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp;
|
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.ExplainSqlReq;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq;
|
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.request.QueryStructReq;
|
||||||
|
|||||||
@@ -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.auth.api.authentication.pojo.User;
|
||||||
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
|
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
|
||||||
import com.tencent.supersonic.common.pojo.enums.FilterType;
|
import com.tencent.supersonic.common.pojo.enums.FilterType;
|
||||||
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.Filter;
|
import com.tencent.supersonic.common.pojo.Filter;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq;
|
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.request.QueryStructReq;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|||||||
@@ -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.auth.api.authentication.pojo.User;
|
||||||
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
|
import com.tencent.supersonic.chat.api.pojo.response.QueryResult;
|
||||||
import com.tencent.supersonic.common.pojo.enums.FilterType;
|
import com.tencent.supersonic.common.pojo.enums.FilterType;
|
||||||
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.Filter;
|
import com.tencent.supersonic.common.pojo.Filter;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq;
|
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.request.QueryStructReq;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ import com.tencent.supersonic.common.util.ContextUtils;
|
|||||||
import com.tencent.supersonic.common.util.DateUtils;
|
import com.tencent.supersonic.common.util.DateUtils;
|
||||||
import com.tencent.supersonic.knowledge.service.SchemaService;
|
import com.tencent.supersonic.knowledge.service.SchemaService;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp;
|
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 com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.time.DayOfWeek;
|
import java.time.DayOfWeek;
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ import com.tencent.supersonic.knowledge.utils.HanlpHelper;
|
|||||||
import com.tencent.supersonic.knowledge.utils.NatureHelper;
|
import com.tencent.supersonic.knowledge.utils.NatureHelper;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.ExplainResp;
|
import com.tencent.supersonic.semantic.api.model.response.ExplainResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp;
|
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.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import com.tencent.supersonic.chat.config.DefaultMetric;
|
|||||||
import com.tencent.supersonic.chat.config.Dim4Dict;
|
import com.tencent.supersonic.chat.config.Dim4Dict;
|
||||||
import com.tencent.supersonic.common.pojo.QueryColumn;
|
import com.tencent.supersonic.common.pojo.QueryColumn;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp;
|
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.Filter;
|
import com.tencent.supersonic.common.pojo.Filter;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
||||||
import com.tencent.supersonic.common.pojo.Constants;
|
import com.tencent.supersonic.common.pojo.Constants;
|
||||||
import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum;
|
import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum;
|
||||||
|
|||||||
@@ -7,18 +7,20 @@ import com.tencent.supersonic.chat.query.QueryManager;
|
|||||||
import com.tencent.supersonic.common.pojo.Aggregator;
|
import com.tencent.supersonic.common.pojo.Aggregator;
|
||||||
import com.tencent.supersonic.common.pojo.Constants;
|
import com.tencent.supersonic.common.pojo.Constants;
|
||||||
import com.tencent.supersonic.common.pojo.DateConf;
|
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.Order;
|
||||||
import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum;
|
import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum;
|
||||||
import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum;
|
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.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.QueryMultiStructReq;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryS2QLReq;
|
import com.tencent.supersonic.semantic.api.query.request.QueryS2QLReq;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
@@ -29,7 +31,9 @@ import java.util.stream.Collectors;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.sf.jsqlparser.JSQLParserException;
|
import net.sf.jsqlparser.JSQLParserException;
|
||||||
import net.sf.jsqlparser.expression.Expression;
|
import net.sf.jsqlparser.expression.Expression;
|
||||||
|
import net.sf.jsqlparser.expression.Function;
|
||||||
import net.sf.jsqlparser.expression.LongValue;
|
import net.sf.jsqlparser.expression.LongValue;
|
||||||
|
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
|
||||||
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
|
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
|
||||||
import net.sf.jsqlparser.schema.Column;
|
import net.sf.jsqlparser.schema.Column;
|
||||||
import net.sf.jsqlparser.schema.Table;
|
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.Select;
|
||||||
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
|
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
|
||||||
import net.sf.jsqlparser.statement.select.SelectItem;
|
import net.sf.jsqlparser.statement.select.SelectItem;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.logging.log4j.util.Strings;
|
import org.apache.logging.log4j.util.Strings;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
@@ -159,50 +164,93 @@ public class QueryReqBuilder {
|
|||||||
* @param queryStructReq
|
* @param queryStructReq
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static QueryS2QLReq buildS2QLReq(QueryStructReq queryStructReq) {
|
public static QueryS2QLReq buildS2QLReq(QueryStructReq queryStructReq) throws JSQLParserException {
|
||||||
|
|
||||||
Select select = new Select();
|
Select select = new Select();
|
||||||
|
//1.Set the select items (columns)
|
||||||
// Set the select items (columns)
|
|
||||||
PlainSelect plainSelect = new PlainSelect();
|
PlainSelect plainSelect = new PlainSelect();
|
||||||
List<SelectItem> selectItems = new ArrayList<>();
|
List<SelectItem> selectItems = new ArrayList<>();
|
||||||
|
List<String> groups = queryStructReq.getGroups();
|
||||||
selectItems.add(new SelectExpressionItem(new Column("column1")));
|
if (!CollectionUtils.isEmpty(groups)) {
|
||||||
selectItems.add(new SelectExpressionItem(new Column("column2")));
|
for (String group : groups) {
|
||||||
|
selectItems.add(new SelectExpressionItem(new Column(group)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List<Aggregator> 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);
|
plainSelect.setSelectItems(selectItems);
|
||||||
|
//2.Set the table name
|
||||||
// Set the table name
|
Table table = new Table(Constants.TABLE_PREFIX + queryStructReq.getModelId());
|
||||||
Table table = new Table("table1");
|
|
||||||
plainSelect.setFromItem(table);
|
plainSelect.setFromItem(table);
|
||||||
|
|
||||||
// Set the order by clause
|
//3.Set the order by clause
|
||||||
OrderByElement orderByElement = new OrderByElement();
|
List<Order> orders = queryStructReq.getOrders();
|
||||||
orderByElement.setExpression(new Column("column1"));
|
if (!CollectionUtils.isEmpty(orders)) {
|
||||||
plainSelect.setOrderByElements(Collections.singletonList(orderByElement));
|
List<OrderByElement> orderByElements = new ArrayList<>();
|
||||||
|
for (Order order : orders) {
|
||||||
// Set the group by clause
|
OrderByElement orderByElement = new OrderByElement();
|
||||||
GroupByElement groupByElement = new GroupByElement();
|
orderByElement.setExpression(new Column(order.getColumn()));
|
||||||
groupByElement.addGroupByExpression(new Column("column1"));
|
orderByElement.setAsc(false);
|
||||||
plainSelect.setGroupByElement(groupByElement);
|
if (Constants.ASC_UPPER.equalsIgnoreCase(order.getDirection())) {
|
||||||
|
orderByElement.setAsc(true);
|
||||||
// Set the having clause
|
}
|
||||||
Expression havingExpression = null;
|
orderByElements.add(orderByElement);
|
||||||
try {
|
}
|
||||||
havingExpression = CCJSqlParserUtil.parseCondExpression("condition2");
|
plainSelect.setOrderByElements(orderByElements);
|
||||||
} catch (JSQLParserException e) {
|
|
||||||
log.error("");
|
|
||||||
}
|
}
|
||||||
plainSelect.setHaving(havingExpression);
|
|
||||||
|
|
||||||
// Set the limit clause
|
//4.Set the group by clause
|
||||||
Limit limit = new Limit();
|
if (!CollectionUtils.isEmpty(groups) && !queryStructReq.getNativeQuery()) {
|
||||||
limit.setRowCount(new LongValue(10));
|
GroupByElement groupByElement = new GroupByElement();
|
||||||
plainSelect.setLimit(limit);
|
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);
|
select.setSelectBody(plainSelect);
|
||||||
|
|
||||||
|
//5.Set where
|
||||||
|
List<Filter> 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();
|
QueryS2QLReq result = new QueryS2QLReq();
|
||||||
result.setSql(select.toString());
|
result.setSql(sql);
|
||||||
result.setModelId(queryStructReq.getModelId());
|
result.setModelId(queryStructReq.getModelId());
|
||||||
result.setVariables(new HashMap<>());
|
result.setVariables(new HashMap<>());
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -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_END;
|
||||||
import static com.tencent.supersonic.common.pojo.Constants.PARENTHESES_START;
|
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.SPACE;
|
||||||
import static com.tencent.supersonic.common.pojo.Constants.SYS_VAR;
|
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.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.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -4,7 +4,7 @@ import com.google.gson.Gson;
|
|||||||
import com.tencent.supersonic.chat.api.pojo.SchemaElement;
|
import com.tencent.supersonic.chat.api.pojo.SchemaElement;
|
||||||
import com.tencent.supersonic.chat.api.pojo.request.QueryFilter;
|
import com.tencent.supersonic.chat.api.pojo.request.QueryFilter;
|
||||||
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
|
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.enums.AggregateTypeEnum;
|
||||||
import com.tencent.supersonic.common.pojo.DateConf;
|
import com.tencent.supersonic.common.pojo.DateConf;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,23 @@
|
|||||||
package com.tencent.supersonic.chat.utils;
|
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.junit.jupiter.api.Test;
|
||||||
|
import org.mockito.MockedStatic;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QueryReqBuilderTest
|
* QueryReqBuilderTest
|
||||||
@@ -9,9 +25,52 @@ import org.junit.jupiter.api.Test;
|
|||||||
class QueryReqBuilderTest {
|
class QueryReqBuilderTest {
|
||||||
|
|
||||||
@Test
|
@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<Order> 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<ContextUtils> 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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -64,4 +64,6 @@ public class Constants {
|
|||||||
|
|
||||||
public static final Long DEFAULT_FREQUENCY = 100000L;
|
public static final Long DEFAULT_FREQUENCY = 100000L;
|
||||||
|
|
||||||
|
public static final String TABLE_PREFIX = "t_";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@@ -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 java.util.List;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
@@ -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.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -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;
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||||
@@ -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.APOSTROPHE;
|
||||||
import static com.tencent.supersonic.common.pojo.Constants.COMMA;
|
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.google.common.base.Strings;
|
||||||
import com.tencent.supersonic.common.pojo.DateConf;
|
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.LocalDate;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
@@ -21,6 +21,7 @@ import java.util.List;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.StringJoiner;
|
import java.util.StringJoiner;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
import lombok.Data;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.tuple.ImmutablePair;
|
import org.apache.commons.lang3.tuple.ImmutablePair;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
@@ -30,7 +31,8 @@ import org.springframework.util.CollectionUtils;
|
|||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
public class DateUtils {
|
@Data
|
||||||
|
public class DateModeUtils {
|
||||||
|
|
||||||
@Value("${query.parameter.sys.date:sys_imp_date}")
|
@Value("${query.parameter.sys.date:sys_imp_date}")
|
||||||
private String sysDateCol;
|
private String sysDateCol;
|
||||||
@@ -227,6 +229,9 @@ public class DateUtils {
|
|||||||
|
|
||||||
|
|
||||||
public String recentDateStr(ItemDateResp dateDate, DateConf dateInfo) {
|
public String recentDateStr(ItemDateResp dateDate, DateConf dateInfo) {
|
||||||
|
if (Objects.isNull(dateDate)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
if (DAY.equalsIgnoreCase(dateInfo.getPeriod())) {
|
if (DAY.equalsIgnoreCase(dateInfo.getPeriod())) {
|
||||||
return recentDayStr(dateDate, dateInfo);
|
return recentDayStr(dateDate, dateInfo);
|
||||||
}
|
}
|
||||||
@@ -315,6 +320,11 @@ public class DateUtils {
|
|||||||
LocalDate.now().minusDays(1));
|
LocalDate.now().minusDays(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getDateWhereStr(DateConf dateInfo) {
|
||||||
|
ItemDateResp dateDate = null;
|
||||||
|
return getDateWhereStr(dateInfo, dateDate);
|
||||||
|
}
|
||||||
|
|
||||||
public String getDateWhereStr(DateConf dateInfo, ItemDateResp dateDate) {
|
public String getDateWhereStr(DateConf dateInfo, ItemDateResp dateDate) {
|
||||||
String dateStr = "";
|
String dateStr = "";
|
||||||
switch (dateInfo.getDateMode()) {
|
switch (dateInfo.getDateMode()) {
|
||||||
@@ -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<String> getFiltersCol(List<Filter> filters) {
|
||||||
|
List<String> filterCols = new ArrayList<>();
|
||||||
|
if (CollectionUtils.isEmpty(filters)) {
|
||||||
|
return filterCols;
|
||||||
|
}
|
||||||
|
for (Filter filter : filters) {
|
||||||
|
filterCols.addAll(getFilterCol(filter));
|
||||||
|
}
|
||||||
|
return filterCols;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getFilterCol(Filter filter) {
|
||||||
|
List<String> filterCols = new ArrayList<>();
|
||||||
|
if (Filter.Relation.FILTER.equals(filter.getRelation())) {
|
||||||
|
if (Strings.isNotEmpty(filter.getBizName())) {
|
||||||
|
filterCols.add(filter.getBizName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Filter> children = filter.getChildren();
|
||||||
|
if (!CollectionUtils.isEmpty(children)) {
|
||||||
|
for (Filter child : children) {
|
||||||
|
filterCols.addAll(getFilterCol(child));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filterCols;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getWhereClause(List<Filter> 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<Filter> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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.entity.EntityFilterQuery;
|
||||||
import com.tencent.supersonic.chat.query.rule.metric.MetricEntityQuery;
|
import com.tencent.supersonic.chat.query.rule.metric.MetricEntityQuery;
|
||||||
import com.tencent.supersonic.common.pojo.DateConf;
|
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 com.tencent.supersonic.util.DataUtils;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|||||||
@@ -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.MetricGroupByQuery;
|
||||||
import com.tencent.supersonic.chat.query.rule.metric.MetricTopNQuery;
|
import com.tencent.supersonic.chat.query.rule.metric.MetricTopNQuery;
|
||||||
import com.tencent.supersonic.common.pojo.DateConf;
|
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 com.tencent.supersonic.util.DataUtils;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|||||||
@@ -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.MetricFilterQuery;
|
||||||
import com.tencent.supersonic.chat.query.rule.metric.MetricGroupByQuery;
|
import com.tencent.supersonic.chat.query.rule.metric.MetricGroupByQuery;
|
||||||
import com.tencent.supersonic.common.pojo.DateConf;
|
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 com.tencent.supersonic.util.DataUtils;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.jupiter.api.Order;
|
import org.junit.jupiter.api.Order;
|
||||||
|
|||||||
@@ -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.chat.query.rule.metric.MetricEntityQuery;
|
||||||
import com.tencent.supersonic.common.pojo.DateConf;
|
import com.tencent.supersonic.common.pojo.DateConf;
|
||||||
import com.tencent.supersonic.integration.BaseQueryTest;
|
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 com.tencent.supersonic.util.DataUtils;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
|||||||
@@ -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.api.pojo.request.QueryReq;
|
||||||
import com.tencent.supersonic.chat.parser.llm.interpret.MetricOption;
|
import com.tencent.supersonic.chat.parser.llm.interpret.MetricOption;
|
||||||
import com.tencent.supersonic.common.pojo.DateConf;
|
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;
|
import java.util.Set;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package com.tencent.supersonic.semantic.api.query.request;
|
|||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.tencent.supersonic.semantic.api.query.pojo.Cache;
|
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.semantic.api.query.pojo.Param;
|
||||||
import com.tencent.supersonic.common.pojo.Aggregator;
|
import com.tencent.supersonic.common.pojo.Aggregator;
|
||||||
import com.tencent.supersonic.common.pojo.DateConf;
|
import com.tencent.supersonic.common.pojo.DateConf;
|
||||||
|
|||||||
@@ -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.DatabaseResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.DatasourceResp;
|
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.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.MeasureResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.MetricResp;
|
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.ModelResp;
|
||||||
|
|||||||
@@ -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.DatasourceRelaResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.DatasourceResp;
|
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.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.MeasureResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.MetricResp;
|
import com.tencent.supersonic.semantic.api.model.response.MetricResp;
|
||||||
import com.tencent.supersonic.semantic.model.domain.DatabaseService;
|
import com.tencent.supersonic.semantic.model.domain.DatabaseService;
|
||||||
|
|||||||
@@ -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.DatabaseResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.DatasourceResp;
|
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.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.MeasureResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.MetricResp;
|
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.DatasourceYamlTpl;
|
||||||
|
|||||||
@@ -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.request.DatasourceReq;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.DatasourceRelaResp;
|
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.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 com.tencent.supersonic.semantic.api.model.response.MeasureResp;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|||||||
@@ -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.model.domain.pojo.EngineTypeEnum;
|
||||||
import com.tencent.supersonic.semantic.query.parser.SemanticConverter;
|
import com.tencent.supersonic.semantic.query.parser.SemanticConverter;
|
||||||
import com.tencent.supersonic.semantic.query.service.SemanticQueryEngine;
|
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.QueryStructUtils;
|
||||||
import com.tencent.supersonic.semantic.query.utils.SqlGenerateUtils;
|
import com.tencent.supersonic.semantic.query.utils.SqlGenerateUtils;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -410,8 +410,8 @@ public class CalculateAggConverter implements SemanticConverter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static String getTimeDim(QueryStructReq queryStructCmd) {
|
private static String getTimeDim(QueryStructReq queryStructCmd) {
|
||||||
DateUtils dateUtils = ContextUtils.getContext().getBean(DateUtils.class);
|
DateModeUtils dateModeUtils = ContextUtils.getContext().getBean(DateModeUtils.class);
|
||||||
return dateUtils.getSysDateCol(queryStructCmd.getDateInfo());
|
return dateModeUtils.getSysDateCol(queryStructCmd.getDateInfo());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getLimit(QueryStructReq queryStructCmd) {
|
private static String getLimit(QueryStructReq queryStructCmd) {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.tencent.supersonic.semantic.query.parser.convert;
|
package com.tencent.supersonic.semantic.query.parser.convert;
|
||||||
|
|
||||||
import com.tencent.supersonic.semantic.api.model.response.DimensionResp;
|
import com.tencent.supersonic.semantic.api.model.response.DimensionResp;
|
||||||
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.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.MetricReq;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq;
|
import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package com.tencent.supersonic.semantic.query.parser.convert;
|
|||||||
import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
|
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.DimensionResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.MetricResp;
|
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.MetricReq;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq;
|
import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
||||||
|
|||||||
@@ -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.DatasourceResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.DimensionResp;
|
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.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.MetricReq;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq;
|
import com.tencent.supersonic.semantic.api.query.request.ParseSqlReq;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
||||||
|
|||||||
@@ -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.Aggregator;
|
||||||
|
import com.tencent.supersonic.common.pojo.Constants;
|
||||||
import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum;
|
import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum;
|
||||||
import com.tencent.supersonic.common.util.DateUtils;
|
import com.tencent.supersonic.common.util.DateUtils;
|
||||||
import com.tencent.supersonic.common.util.jsqlparser.SqlParserReplaceHelper;
|
import com.tencent.supersonic.common.util.jsqlparser.SqlParserReplaceHelper;
|
||||||
@@ -46,7 +47,6 @@ import org.springframework.util.CollectionUtils;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class QueryReqConverter {
|
public class QueryReqConverter {
|
||||||
|
|
||||||
public static final String TABLE_PREFIX = "t_";
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ModelService domainService;
|
private ModelService domainService;
|
||||||
@Autowired
|
@Autowired
|
||||||
@@ -135,7 +135,7 @@ public class QueryReqConverter {
|
|||||||
Map<String, String> fieldNameToBizNameMap = getFieldNameToBizNameMap(modelSchemaResp);
|
Map<String, String> fieldNameToBizNameMap = getFieldNameToBizNameMap(modelSchemaResp);
|
||||||
String sql = databaseReq.getSql();
|
String sql = databaseReq.getSql();
|
||||||
log.info("convert name to bizName before:{}", sql);
|
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);
|
log.info("convert name to bizName after:{}", replaceFields);
|
||||||
databaseReq.setSql(replaceFields);
|
databaseReq.setSql(replaceFields);
|
||||||
}
|
}
|
||||||
@@ -202,7 +202,8 @@ public class QueryReqConverter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void correctTableName(QueryS2QLReq databaseReq) {
|
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);
|
databaseReq.setSql(sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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.ExplainResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp;
|
import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp;
|
import com.tencent.supersonic.semantic.api.model.response.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.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.ExplainSqlReq;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.ItemUseReq;
|
import com.tencent.supersonic.semantic.api.query.request.ItemUseReq;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.MetricReq;
|
import com.tencent.supersonic.semantic.api.query.request.MetricReq;
|
||||||
|
|||||||
@@ -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.ModelResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.DimensionResp;
|
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.MetricResp;
|
||||||
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.Filter;
|
import com.tencent.supersonic.common.pojo.Filter;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
||||||
import com.tencent.supersonic.common.pojo.Constants;
|
import com.tencent.supersonic.common.pojo.Constants;
|
||||||
import com.tencent.supersonic.common.pojo.exception.InvalidPermissionException;
|
import com.tencent.supersonic.common.pojo.exception.InvalidPermissionException;
|
||||||
|
|||||||
@@ -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.pojo.DimValueMap;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.DimensionResp;
|
import com.tencent.supersonic.semantic.api.model.response.DimensionResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp;
|
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.Filter;
|
import com.tencent.supersonic.common.pojo.Filter;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryS2QLReq;
|
import com.tencent.supersonic.semantic.api.query.request.QueryS2QLReq;
|
||||||
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
|
||||||
import com.tencent.supersonic.semantic.model.domain.DimensionService;
|
import com.tencent.supersonic.semantic.model.domain.DimensionService;
|
||||||
|
|||||||
@@ -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;
|
||||||
import com.tencent.supersonic.common.pojo.DateConf.DateMode;
|
import com.tencent.supersonic.common.pojo.DateConf.DateMode;
|
||||||
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
|
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.StringUtil;
|
||||||
import com.tencent.supersonic.common.util.jsqlparser.FilterExpression;
|
import com.tencent.supersonic.common.util.jsqlparser.FilterExpression;
|
||||||
import com.tencent.supersonic.common.util.jsqlparser.SqlParserAddHelper;
|
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.request.ModelSchemaFilterReq;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.DimSchemaResp;
|
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.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.MetricResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp;
|
import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp;
|
||||||
import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp;
|
import com.tencent.supersonic.semantic.api.model.response.ModelSchemaResp;
|
||||||
@@ -67,7 +69,7 @@ public class QueryStructUtils {
|
|||||||
internalCols.addAll(internalTimeCols);
|
internalCols.addAll(internalTimeCols);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final DateUtils dateUtils;
|
private final DateModeUtils dateModeUtils;
|
||||||
private final SqlFilterUtils sqlFilterUtils;
|
private final SqlFilterUtils sqlFilterUtils;
|
||||||
private final Catalog catalog;
|
private final Catalog catalog;
|
||||||
@Value("${internal.metric.cnt.suffix:internal_cnt}")
|
@Value("${internal.metric.cnt.suffix:internal_cnt}")
|
||||||
@@ -82,10 +84,10 @@ public class QueryStructUtils {
|
|||||||
private String variablePrefix = "'${";
|
private String variablePrefix = "'${";
|
||||||
|
|
||||||
public QueryStructUtils(
|
public QueryStructUtils(
|
||||||
DateUtils dateUtils,
|
DateModeUtils dateModeUtils,
|
||||||
SqlFilterUtils sqlFilterUtils, Catalog catalog) {
|
SqlFilterUtils sqlFilterUtils, Catalog catalog) {
|
||||||
|
|
||||||
this.dateUtils = dateUtils;
|
this.dateModeUtils = dateModeUtils;
|
||||||
this.sqlFilterUtils = sqlFilterUtils;
|
this.sqlFilterUtils = sqlFilterUtils;
|
||||||
this.catalog = catalog;
|
this.catalog = catalog;
|
||||||
}
|
}
|
||||||
@@ -145,19 +147,19 @@ public class QueryStructUtils {
|
|||||||
|| Strings.isEmpty(dateDate.getStartDate())
|
|| Strings.isEmpty(dateDate.getStartDate())
|
||||||
&& Strings.isEmpty(dateDate.getEndDate())) {
|
&& Strings.isEmpty(dateDate.getEndDate())) {
|
||||||
if (dateInfo.getDateMode().equals(DateMode.LIST)) {
|
if (dateInfo.getDateMode().equals(DateMode.LIST)) {
|
||||||
return dateUtils.listDateStr(dateDate, dateInfo);
|
return dateModeUtils.listDateStr(dateDate, dateInfo);
|
||||||
}
|
}
|
||||||
if (dateInfo.getDateMode().equals(DateMode.BETWEEN)) {
|
if (dateInfo.getDateMode().equals(DateMode.BETWEEN)) {
|
||||||
return dateUtils.betweenDateStr(dateDate, dateInfo);
|
return dateModeUtils.betweenDateStr(dateDate, dateInfo);
|
||||||
}
|
}
|
||||||
if (dateUtils.hasAvailableDataMode(dateInfo)) {
|
if (dateModeUtils.hasAvailableDataMode(dateInfo)) {
|
||||||
return dateUtils.hasDataModeStr(dateDate, dateInfo);
|
return dateModeUtils.hasDataModeStr(dateDate, dateInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
return dateUtils.defaultRecentDateInfo(queryStructCmd.getDateInfo());
|
return dateModeUtils.defaultRecentDateInfo(queryStructCmd.getDateInfo());
|
||||||
}
|
}
|
||||||
log.info("dateDate:{}", dateDate);
|
log.info("dateDate:{}", dateDate);
|
||||||
return dateUtils.getDateWhereStr(dateInfo, dateDate);
|
return dateModeUtils.getDateWhereStr(dateInfo, dateDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -177,7 +179,7 @@ public class QueryStructUtils {
|
|||||||
return whereFromDate;
|
return whereFromDate;
|
||||||
} else if (Strings.isEmpty(whereFromDate) && Strings.isEmpty(whereClauseFromFilter)) {
|
} else if (Strings.isEmpty(whereFromDate) && Strings.isEmpty(whereClauseFromFilter)) {
|
||||||
log.info("the current date information is empty, enter the date initialization logic");
|
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;
|
return whereClauseFromFilter;
|
||||||
}
|
}
|
||||||
@@ -283,19 +285,19 @@ public class QueryStructUtils {
|
|||||||
public String generateZipperWhere(QueryStatement queryStatement, QueryStructReq queryStructReq) {
|
public String generateZipperWhere(QueryStatement queryStatement, QueryStructReq queryStructReq) {
|
||||||
if (Objects.nonNull(queryStatement.getParseSqlReq().getSql())) {
|
if (Objects.nonNull(queryStatement.getParseSqlReq().getSql())) {
|
||||||
String sql = SqlParserRemoveHelper.removeWhere(queryStatement.getParseSqlReq().getSql(),
|
String sql = SqlParserRemoveHelper.removeWhere(queryStatement.getParseSqlReq().getSql(),
|
||||||
dateUtils.getDateCol());
|
dateModeUtils.getDateCol());
|
||||||
if (!CollectionUtils.isEmpty(queryStatement.getMetricReq().getDimensions())) {
|
if (!CollectionUtils.isEmpty(queryStatement.getMetricReq().getDimensions())) {
|
||||||
List<String> dimension = queryStatement.getMetricReq().getDimensions().stream()
|
List<String> dimension = queryStatement.getMetricReq().getDimensions().stream()
|
||||||
.filter(d -> !dateUtils.getDateCol().contains(d.toLowerCase())).collect(
|
.filter(d -> !dateModeUtils.getDateCol().contains(d.toLowerCase())).collect(
|
||||||
Collectors.toList());
|
Collectors.toList());
|
||||||
dimension.add(dateUtils.getDateColBegin(queryStructReq.getDateInfo()));
|
dimension.add(dateModeUtils.getDateColBegin(queryStructReq.getDateInfo()));
|
||||||
dimension.add(dateUtils.getDateColEnd(queryStructReq.getDateInfo()));
|
dimension.add(dateModeUtils.getDateColEnd(queryStructReq.getDateInfo()));
|
||||||
queryStatement.getMetricReq().setDimensions(dimension);
|
queryStatement.getMetricReq().setDimensions(dimension);
|
||||||
}
|
}
|
||||||
return SqlParserAddHelper.addWhere(sql,
|
return SqlParserAddHelper.addWhere(sql,
|
||||||
SqlParserSelectHelper.getTimeFilter(queryStatement.getTimeRanges(),
|
SqlParserSelectHelper.getTimeFilter(queryStatement.getTimeRanges(),
|
||||||
dateUtils.getDateColBegin(queryStructReq.getDateInfo()),
|
dateModeUtils.getDateColBegin(queryStructReq.getDateInfo()),
|
||||||
dateUtils.getDateColEnd(queryStructReq.getDateInfo())));
|
dateModeUtils.getDateColEnd(queryStructReq.getDateInfo())));
|
||||||
}
|
}
|
||||||
return queryStatement.getSql();
|
return queryStatement.getSql();
|
||||||
}
|
}
|
||||||
@@ -306,7 +308,7 @@ public class QueryStructUtils {
|
|||||||
List<String> wheres = new ArrayList<>();
|
List<String> wheres = new ArrayList<>();
|
||||||
if (!CollectionUtils.isEmpty(timeRanges)) {
|
if (!CollectionUtils.isEmpty(timeRanges)) {
|
||||||
for (ImmutablePair<String, String> range : timeRanges) {
|
for (ImmutablePair<String, String> range : timeRanges) {
|
||||||
String strWhere = dateUtils.getDateWhereStr(queryStructCmd.getDateInfo(), range);
|
String strWhere = dateModeUtils.getDateWhereStr(queryStructCmd.getDateInfo(), range);
|
||||||
if (!strWhere.isEmpty()) {
|
if (!strWhere.isEmpty()) {
|
||||||
wheres.add(strWhere);
|
wheres.add(strWhere);
|
||||||
}
|
}
|
||||||
@@ -337,11 +339,11 @@ public class QueryStructUtils {
|
|||||||
}
|
}
|
||||||
switch (dateConf.getPeriod()) {
|
switch (dateConf.getPeriod()) {
|
||||||
case DAY:
|
case DAY:
|
||||||
return dateUtils.recentDay(dateDate, dateConf);
|
return dateModeUtils.recentDay(dateDate, dateConf);
|
||||||
case WEEK:
|
case WEEK:
|
||||||
return dateUtils.recentWeek(dateDate, dateConf);
|
return dateModeUtils.recentWeek(dateDate, dateConf);
|
||||||
case MONTH:
|
case MONTH:
|
||||||
List<ImmutablePair<String, String>> rets = dateUtils.recentMonth(dateDate, dateConf);
|
List<ImmutablePair<String, String>> rets = dateModeUtils.recentMonth(dateDate, dateConf);
|
||||||
Optional<String> minBegins = rets.stream().map(i -> i.left).sorted().findFirst();
|
Optional<String> minBegins = rets.stream().map(i -> i.left).sorted().findFirst();
|
||||||
Optional<String> maxBegins = rets.stream().map(i -> i.right).sorted(Comparator.reverseOrder())
|
Optional<String> maxBegins = rets.stream().map(i -> i.right).sorted(Comparator.reverseOrder())
|
||||||
.findFirst();
|
.findFirst();
|
||||||
@@ -387,13 +389,13 @@ public class QueryStructUtils {
|
|||||||
}
|
}
|
||||||
switch (dateConf.getPeriod()) {
|
switch (dateConf.getPeriod()) {
|
||||||
case DAY:
|
case DAY:
|
||||||
ret.add(dateUtils.recentDay(dateDate, dateConf));
|
ret.add(dateModeUtils.recentDay(dateDate, dateConf));
|
||||||
break;
|
break;
|
||||||
case WEEK:
|
case WEEK:
|
||||||
ret.add(dateUtils.recentWeek(dateDate, dateConf));
|
ret.add(dateModeUtils.recentWeek(dateDate, dateConf));
|
||||||
break;
|
break;
|
||||||
case MONTH:
|
case MONTH:
|
||||||
List<ImmutablePair<String, String>> rets = dateUtils.recentMonth(dateDate, dateConf);
|
List<ImmutablePair<String, String>> rets = dateModeUtils.recentMonth(dateDate, dateConf);
|
||||||
ret.addAll(rets);
|
ret.addAll(rets);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -426,10 +428,10 @@ public class QueryStructUtils {
|
|||||||
if (Objects.isNull(f.getFieldName()) || !internalCols.contains(f.getFieldName().toLowerCase())) {
|
if (Objects.isNull(f.getFieldName()) || !internalCols.contains(f.getFieldName().toLowerCase())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (Objects.isNull(f.getFieldValue()) || !dateUtils.isDateStr(f.getFieldValue().toString())) {
|
if (Objects.isNull(f.getFieldValue()) || !dateModeUtils.isDateStr(f.getFieldValue().toString())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
period = dateUtils.getPeriodByCol(f.getFieldName().toLowerCase());
|
period = dateModeUtils.getPeriodByCol(f.getFieldName().toLowerCase());
|
||||||
if ("".equals(period)) {
|
if ("".equals(period)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -465,7 +467,7 @@ public class QueryStructUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getDateCol() {
|
public List<String> getDateCol() {
|
||||||
return dateUtils.getDateCol();
|
return dateModeUtils.getDateCol();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getVariablePrefix() {
|
public String getVariablePrefix() {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.tencent.supersonic.auth.api.authentication.pojo.User;
|
import com.tencent.supersonic.auth.api.authentication.pojo.User;
|
||||||
import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum;
|
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.common.util.jsqlparser.SqlParserSelectHelper;
|
||||||
import com.tencent.supersonic.semantic.api.model.enums.QueryTypeBackEnum;
|
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.enums.QueryTypeEnum;
|
||||||
|
|||||||
Reference in New Issue
Block a user