mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-11 03:58:14 +00:00
[improvement](chat) rule and llm support replace metric (#415)
* [improvement] replace metric * [improvement] replace metric * [improvement] supports replace metric --------- Co-authored-by: zuopengge
This commit is contained in:
@@ -154,7 +154,6 @@ public class QueryServiceImpl implements QueryService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//5. postProcessor
|
//5. postProcessor
|
||||||
postProcessors.forEach(postProcessor -> {
|
postProcessors.forEach(postProcessor -> {
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
@@ -163,7 +162,6 @@ public class QueryServiceImpl implements QueryService {
|
|||||||
.interfaceName(postProcessor.getClass().getSimpleName())
|
.interfaceName(postProcessor.getClass().getSimpleName())
|
||||||
.type(CostType.POSTPROCESSOR.getType()).build());
|
.type(CostType.POSTPROCESSOR.getType()).build());
|
||||||
});
|
});
|
||||||
|
|
||||||
//6. responder
|
//6. responder
|
||||||
parseResponders.forEach(parseResponder -> {
|
parseResponders.forEach(parseResponder -> {
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
@@ -351,8 +349,12 @@ public class QueryServiceImpl implements QueryService {
|
|||||||
.map(o -> o.getName()).collect(Collectors.toList());
|
.map(o -> o.getName()).collect(Collectors.toList());
|
||||||
String correctorSql = parseInfo.getSqlInfo().getCorrectS2SQL();
|
String correctorSql = parseInfo.getSqlInfo().getCorrectS2SQL();
|
||||||
log.info("before replaceMetrics:{}", correctorSql);
|
log.info("before replaceMetrics:{}", correctorSql);
|
||||||
correctorSql = SqlParserAddHelper.addFieldsToSelect(correctorSql, metrics);
|
log.info("filteredMetrics:{},metrics:{}", filteredMetrics, metrics);
|
||||||
correctorSql = SqlParserRemoveHelper.removeSelect(correctorSql, filteredMetrics);
|
Map<String, String> fieldMap = new HashMap<>();
|
||||||
|
if (CollectionUtils.isNotEmpty(filteredMetrics) && CollectionUtils.isNotEmpty(metrics)) {
|
||||||
|
fieldMap.put(filteredMetrics.get(0), metrics.get(0));
|
||||||
|
correctorSql = SqlParserReplaceHelper.replaceSelectFields(correctorSql, fieldMap);
|
||||||
|
}
|
||||||
log.info("after replaceMetrics:{}", correctorSql);
|
log.info("after replaceMetrics:{}", correctorSql);
|
||||||
parseInfo.getSqlInfo().setCorrectS2SQL(correctorSql);
|
parseInfo.getSqlInfo().setCorrectS2SQL(correctorSql);
|
||||||
}
|
}
|
||||||
@@ -547,9 +549,9 @@ public class QueryServiceImpl implements QueryService {
|
|||||||
if (CollectionUtils.isNotEmpty(queryData.getDimensions())) {
|
if (CollectionUtils.isNotEmpty(queryData.getDimensions())) {
|
||||||
parseInfo.setDimensions(queryData.getDimensions());
|
parseInfo.setDimensions(queryData.getDimensions());
|
||||||
}
|
}
|
||||||
if (CollectionUtils.isNotEmpty(queryData.getMetrics())) {
|
//if (CollectionUtils.isNotEmpty(queryData.getMetrics())) {
|
||||||
parseInfo.setMetrics(queryData.getMetrics());
|
// parseInfo.setMetrics(queryData.getMetrics());
|
||||||
}
|
//}
|
||||||
if (CollectionUtils.isNotEmpty(queryData.getDimensionFilters())) {
|
if (CollectionUtils.isNotEmpty(queryData.getDimensionFilters())) {
|
||||||
parseInfo.setDimensionFilters(queryData.getDimensionFilters());
|
parseInfo.setDimensionFilters(queryData.getDimensionFilters());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,29 +39,6 @@ import java.util.Set;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class SqlParserRemoveHelper {
|
public class SqlParserRemoveHelper {
|
||||||
|
|
||||||
public static String removeSelect(String sql, List<String> filteredMetrics) {
|
|
||||||
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
|
|
||||||
SelectBody selectBody = selectStatement.getSelectBody();
|
|
||||||
|
|
||||||
if (!(selectBody instanceof PlainSelect)) {
|
|
||||||
return sql;
|
|
||||||
}
|
|
||||||
List<SelectItem> selectItemList = ((PlainSelect) selectBody).getSelectItems();
|
|
||||||
selectItemList.removeIf(o -> {
|
|
||||||
Expression expression = ((SelectExpressionItem) o).getExpression();
|
|
||||||
if (expression instanceof Column) {
|
|
||||||
Column column = (Column) expression;
|
|
||||||
String columnName = column.getColumnName();
|
|
||||||
if (filteredMetrics.contains(columnName)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
((PlainSelect) selectBody).setSelectItems(selectItemList);
|
|
||||||
return selectStatement.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String removeSelect(String sql, Set<String> fields) {
|
public static String removeSelect(String sql, Set<String> fields) {
|
||||||
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
|
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
|
||||||
if (selectStatement == null) {
|
if (selectStatement == null) {
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.sf.jsqlparser.expression.Alias;
|
import net.sf.jsqlparser.expression.Alias;
|
||||||
import net.sf.jsqlparser.expression.Expression;
|
import net.sf.jsqlparser.expression.Expression;
|
||||||
@@ -17,6 +19,7 @@ import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
|
|||||||
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
|
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
|
||||||
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
|
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
|
||||||
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
|
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
|
||||||
|
import net.sf.jsqlparser.schema.Column;
|
||||||
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.Join;
|
||||||
import net.sf.jsqlparser.statement.select.OrderByElement;
|
import net.sf.jsqlparser.statement.select.OrderByElement;
|
||||||
@@ -36,6 +39,44 @@ import org.springframework.util.CollectionUtils;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class SqlParserReplaceHelper {
|
public class SqlParserReplaceHelper {
|
||||||
|
|
||||||
|
public static String replaceSelectFields(String sql, Map<String, String> fieldNameMap) {
|
||||||
|
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
|
||||||
|
SelectBody selectBody = selectStatement.getSelectBody();
|
||||||
|
if (!(selectBody instanceof PlainSelect)) {
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
|
((PlainSelect) selectBody).getSelectItems().stream().forEach(o -> {
|
||||||
|
SelectExpressionItem selectExpressionItem = (SelectExpressionItem) o;
|
||||||
|
String alias = "";
|
||||||
|
if (selectExpressionItem.getExpression() instanceof Function) {
|
||||||
|
Function function = (Function) selectExpressionItem.getExpression();
|
||||||
|
Column column = (Column) function.getParameters().getExpressions().get(0);
|
||||||
|
if (fieldNameMap.containsKey(column.getColumnName())) {
|
||||||
|
String value = fieldNameMap.get(column.getColumnName());
|
||||||
|
alias = value;
|
||||||
|
List<Expression> expressions = new ArrayList<>();
|
||||||
|
expressions.add(new Column(value));
|
||||||
|
function.getParameters().setExpressions(expressions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (selectExpressionItem.getExpression() instanceof Column) {
|
||||||
|
Column column = (Column) selectExpressionItem.getExpression();
|
||||||
|
String columnName = column.getColumnName();
|
||||||
|
if (fieldNameMap.containsKey(columnName)) {
|
||||||
|
String value = fieldNameMap.get(columnName);
|
||||||
|
alias = value;
|
||||||
|
if (StringUtils.isNotBlank(value)) {
|
||||||
|
selectExpressionItem.setExpression(new Column(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(selectExpressionItem.getAlias()) && StringUtils.isNotBlank(alias)) {
|
||||||
|
selectExpressionItem.getAlias().setName(alias);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return selectStatement.toString();
|
||||||
|
}
|
||||||
|
|
||||||
public static String replaceValue(String sql, Map<String, Map<String, String>> filedNameToValueMap) {
|
public static String replaceValue(String sql, Map<String, Map<String, String>> filedNameToValueMap) {
|
||||||
return replaceValue(sql, filedNameToValueMap, true);
|
return replaceValue(sql, filedNameToValueMap, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,27 @@ import org.junit.jupiter.api.Test;
|
|||||||
*/
|
*/
|
||||||
class SqlParserReplaceHelperTest {
|
class SqlParserReplaceHelperTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void replaceSelectField() {
|
||||||
|
|
||||||
|
String sql = "SELECT 维度1,sum(播放量) FROM 数据库 "
|
||||||
|
+ "WHERE (歌手名 = '张三') AND 数据日期 = '2023-11-17' GROUP BY 维度1";
|
||||||
|
Map<String, String> fieldMap = new HashMap<>();
|
||||||
|
fieldMap.put("播放量", "播放量1");
|
||||||
|
sql = SqlParserReplaceHelper.replaceSelectFields(sql, fieldMap);
|
||||||
|
System.out.println(sql);
|
||||||
|
Assert.assertEquals("SELECT 维度1, sum(播放量1) FROM 数据库 "
|
||||||
|
+ "WHERE (歌手名 = '张三') AND 数据日期 = '2023-11-17' GROUP BY 维度1", sql);
|
||||||
|
|
||||||
|
sql = "SELECT 维度1,播放量 FROM 数据库 "
|
||||||
|
+ "WHERE (歌手名 = '张三') AND 数据日期 = '2023-11-17' GROUP BY 维度1";
|
||||||
|
fieldMap = new HashMap<>();
|
||||||
|
fieldMap.put("播放量", "播放量1");
|
||||||
|
sql = SqlParserReplaceHelper.replaceSelectFields(sql, fieldMap);
|
||||||
|
System.out.println(sql);
|
||||||
|
Assert.assertEquals("SELECT 维度1, 播放量1 FROM 数据库 WHERE (歌手名 = '张三') AND 数据日期 = '2023-11-17' GROUP BY 维度1", sql);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void replaceValue() {
|
void replaceValue() {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user