(improvement)(chat) Fixed an error in struct sql query order by aggregate metric (#374)

This commit is contained in:
lexluo09
2023-11-13 16:06:10 +08:00
committed by GitHub
parent 0f02e21eaa
commit 5feac0c14e
3 changed files with 34 additions and 18 deletions

View File

@@ -331,12 +331,6 @@ public class QueryServiceImpl implements QueryService {
QueryReq queryReq = new QueryReq(); QueryReq queryReq = new QueryReq();
queryReq.setQueryFilters(new QueryFilters()); queryReq.setQueryFilters(new QueryFilters());
queryReq.setUser(user); queryReq.setUser(user);
//correct s2sql
semanticCorrectors.stream().forEach(correction -> {
correction.correct(queryReq, semanticQuery.getParseInfo());
});
//update parserInfo
parseInfoService.updateParseInfo(semanticQuery.getParseInfo());
} }
QueryResult queryResult = semanticQuery.execute(user); QueryResult queryResult = semanticQuery.execute(user);
queryResult.setChatContext(semanticQuery.getParseInfo()); queryResult.setChatContext(semanticQuery.getParseInfo());

View File

@@ -5,26 +5,28 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Function; import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.conditional.OrExpression; import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
import net.sf.jsqlparser.expression.operators.relational.ComparisonOperator; import net.sf.jsqlparser.expression.operators.relational.ComparisonOperator;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
import net.sf.jsqlparser.statement.select.GroupByElement; import net.sf.jsqlparser.statement.select.GroupByElement;
import net.sf.jsqlparser.statement.select.Join;
import net.sf.jsqlparser.statement.select.OrderByElement; import net.sf.jsqlparser.statement.select.OrderByElement;
import net.sf.jsqlparser.statement.select.PlainSelect; 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.SubSelect;
import net.sf.jsqlparser.statement.select.Join;
import net.sf.jsqlparser.statement.select.SelectBody; import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.SelectItem; import net.sf.jsqlparser.statement.select.SelectItem;
import net.sf.jsqlparser.statement.select.SelectVisitorAdapter; import net.sf.jsqlparser.statement.select.SelectVisitorAdapter;
import net.sf.jsqlparser.statement.select.SubSelect;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@@ -102,6 +104,7 @@ public class SqlParserReplaceHelper {
//2. replace select fields //2. replace select fields
for (SelectItem selectItem : plainSelect.getSelectItems()) { for (SelectItem selectItem : plainSelect.getSelectItems()) {
selectItem.accept(visitor); selectItem.accept(visitor);
replaceAsName(fieldNameMap, selectItem);
} }
//3. replace oder by fields //3. replace oder by fields
@@ -134,6 +137,21 @@ public class SqlParserReplaceHelper {
} }
} }
private static void replaceAsName(Map<String, String> fieldNameMap, SelectItem selectItem) {
if (selectItem instanceof SelectExpressionItem) {
SelectExpressionItem expressionItem = (SelectExpressionItem) selectItem;
Alias alias = expressionItem.getAlias();
if (Objects.isNull(alias)) {
return;
}
String aliasName = alias.getName();
String replaceFieldName = fieldNameMap.get(aliasName);
if (StringUtils.isNotBlank(replaceFieldName)) {
alias.setName(replaceFieldName);
}
}
}
public static String replaceFunction(String sql, Map<String, String> functionMap) { public static String replaceFunction(String sql, Map<String, String> functionMap) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql); Select selectStatement = SqlParserSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody(); SelectBody selectBody = selectStatement.getSelectBody();
@@ -236,7 +254,7 @@ public class SqlParserReplaceHelper {
} }
private static void replaceOrderByFunction(Map<String, String> functionMap, private static void replaceOrderByFunction(Map<String, String> functionMap,
List<OrderByElement> orderByElementList) { List<OrderByElement> orderByElementList) {
if (Objects.isNull(orderByElementList)) { if (Objects.isNull(orderByElementList)) {
return; return;
} }

View File

@@ -21,6 +21,7 @@ import java.util.stream.Collectors;
import lombok.Data; import lombok.Data;
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.Alias;
import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Function; import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.LongValue; import net.sf.jsqlparser.expression.LongValue;
@@ -200,8 +201,9 @@ public class QueryStructReq {
List<Aggregator> aggregators = queryStructReq.getAggregators(); List<Aggregator> aggregators = queryStructReq.getAggregators();
if (!CollectionUtils.isEmpty(aggregators)) { if (!CollectionUtils.isEmpty(aggregators)) {
for (Aggregator aggregator : aggregators) { for (Aggregator aggregator : aggregators) {
String columnName = aggregator.getColumn();
if (queryStructReq.getNativeQuery()) { if (queryStructReq.getNativeQuery()) {
selectItems.add(new SelectExpressionItem(new Column(aggregator.getColumn()))); selectItems.add(new SelectExpressionItem(new Column(columnName)));
} else { } else {
Function sumFunction = new Function(); Function sumFunction = new Function();
AggOperatorEnum func = aggregator.getFunc(); AggOperatorEnum func = aggregator.getFunc();
@@ -213,8 +215,10 @@ public class QueryStructReq {
sumFunction.setName("count"); sumFunction.setName("count");
sumFunction.setDistinct(true); sumFunction.setDistinct(true);
} }
sumFunction.setParameters(new ExpressionList(new Column(aggregator.getColumn()))); sumFunction.setParameters(new ExpressionList(new Column(columnName)));
selectItems.add(new SelectExpressionItem(sumFunction)); SelectExpressionItem selectExpressionItem = new SelectExpressionItem(sumFunction);
selectExpressionItem.setAlias(new Alias(columnName));
selectItems.add(selectExpressionItem);
} }
} }
} }