mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-10 19:38:13 +00:00
(improvement)(chat) Fixed an error in struct sql query order by aggregate metric (#374)
This commit is contained in:
@@ -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());
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user