mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-14 05:43:51 +00:00
(improvement)[chat] Skip the corrector for complex SQL, and do not add the HAVING field to the SELECT clause (#1754)
This commit is contained in:
@@ -12,11 +12,28 @@ import org.springframework.util.CollectionUtils;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
public class SqlAsHelper {
|
||||
|
||||
private static void extractAliasesFromSelect(PlainSelect plainSelect, Set<String> aliases) {
|
||||
// Extract aliases from SELECT items
|
||||
for (SelectItem selectItem : plainSelect.getSelectItems()) {
|
||||
Alias alias = selectItem.getAlias();
|
||||
if (alias != null) {
|
||||
aliases.add(alias.getName());
|
||||
}
|
||||
}
|
||||
FunctionAliasVisitor visitor = new FunctionAliasVisitor(aliases);
|
||||
for (SelectItem selectItem : plainSelect.getSelectItems()) {
|
||||
selectItem.accept(visitor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static List<String> getAsFields(String sql) {
|
||||
List<PlainSelect> plainSelectList = SqlSelectHelper.getPlainSelect(sql);
|
||||
if (CollectionUtils.isEmpty(plainSelectList)) {
|
||||
@@ -43,17 +60,14 @@ public class SqlAsHelper {
|
||||
return new ArrayList<>(aliases);
|
||||
}
|
||||
|
||||
private static void extractAliasesFromSelect(PlainSelect plainSelect, Set<String> aliases) {
|
||||
// Extract aliases from SELECT items
|
||||
for (SelectItem selectItem : plainSelect.getSelectItems()) {
|
||||
Alias alias = selectItem.getAlias();
|
||||
if (alias != null) {
|
||||
aliases.add(alias.getName());
|
||||
}
|
||||
}
|
||||
FunctionAliasVisitor visitor = new FunctionAliasVisitor(aliases);
|
||||
for (SelectItem selectItem : plainSelect.getSelectItems()) {
|
||||
selectItem.accept(visitor);
|
||||
}
|
||||
public static Map<String, String> getFieldMapFilterByAsFields(String sql,
|
||||
Map<String, String> fieldNameMap) {
|
||||
// Delete aliases if they exist
|
||||
List<String> asFields = SqlAsHelper.getAsFields(sql);
|
||||
Set<String> asFieldsSet = new HashSet<>(asFields);
|
||||
fieldNameMap = fieldNameMap.entrySet().stream()
|
||||
.filter(entry -> !asFieldsSet.contains(entry.getKey()))
|
||||
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
|
||||
return fieldNameMap;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,9 @@ import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.function.UnaryOperator;
|
||||
|
||||
/** Sql Parser replace Helper */
|
||||
/**
|
||||
* Sql Parser replace Helper
|
||||
*/
|
||||
@Slf4j
|
||||
public class SqlReplaceHelper {
|
||||
public static String replaceAggFields(String sql,
|
||||
@@ -180,6 +182,8 @@ public class SqlReplaceHelper {
|
||||
return selectStatement.toString();
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static void replaceFieldsInPlainOneSelect(Map<String, String> fieldNameMap,
|
||||
boolean exactReplace, PlainSelect plainSelect) {
|
||||
// 1. replace where fields
|
||||
|
||||
@@ -2,11 +2,14 @@ package com.tencent.supersonic.common.jsqlparser;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
|
||||
import net.sf.jsqlparser.statement.select.PlainSelect;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/** Sql Parser valid Helper */
|
||||
/**
|
||||
* Sql Parser valid Helper
|
||||
*/
|
||||
@Slf4j
|
||||
public class SqlValidHelper {
|
||||
|
||||
@@ -75,4 +78,9 @@ public class SqlValidHelper {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isComplexSQL(String sql) {
|
||||
List<PlainSelect> plainSelect = SqlSelectHelper.getPlainSelect(sql);
|
||||
return !CollectionUtils.isEmpty(plainSelect) && plainSelect.size() >= 2;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user