mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-16 15:12:26 +00:00
[improvement][headless] Determine if the SQL is supported by agg for more complex scenarios (#1872)
This commit is contained in:
@@ -22,7 +22,9 @@ import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/** Sql Parser Select function Helper */
|
||||
/**
|
||||
* Sql Parser Select function Helper
|
||||
*/
|
||||
@Slf4j
|
||||
public class SqlSelectFunctionHelper {
|
||||
|
||||
@@ -42,17 +44,21 @@ public class SqlSelectFunctionHelper {
|
||||
}
|
||||
|
||||
public static Set<String> getFunctions(String sql) {
|
||||
Select selectStatement = SqlSelectHelper.getSelect(sql);
|
||||
if (!(selectStatement instanceof PlainSelect)) {
|
||||
return new HashSet<>();
|
||||
Set<Select> allSelect = SqlSelectHelper.getAllSelect(sql);
|
||||
Set<String> result = new HashSet<>();
|
||||
for (Select select : allSelect) {
|
||||
if (!(select instanceof PlainSelect)) {
|
||||
continue;
|
||||
}
|
||||
PlainSelect plainSelect = (PlainSelect) select;
|
||||
List<SelectItem<?>> selectItems = plainSelect.getSelectItems();
|
||||
FunctionVisitor visitor = new FunctionVisitor();
|
||||
for (SelectItem selectItem : selectItems) {
|
||||
selectItem.accept(visitor);
|
||||
}
|
||||
result.addAll(visitor.getFunctionNames());
|
||||
}
|
||||
PlainSelect plainSelect = (PlainSelect) selectStatement;
|
||||
List<SelectItem<?>> selectItems = plainSelect.getSelectItems();
|
||||
FunctionVisitor visitor = new FunctionVisitor();
|
||||
for (SelectItem selectItem : selectItems) {
|
||||
selectItem.accept(visitor);
|
||||
}
|
||||
return visitor.getFunctionNames();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Function getFunction(Expression expression,
|
||||
|
||||
@@ -812,6 +812,10 @@ public class SqlSelectHelper {
|
||||
}
|
||||
}
|
||||
|
||||
public static Set<Select> getAllSelect(String sql) {
|
||||
return getAllSelect(getSelect(sql));
|
||||
}
|
||||
|
||||
public static Set<Select> getAllSelect(Select selectStatement) {
|
||||
Set<Select> selects = new HashSet<>();
|
||||
collectSelects(selectStatement, selects);
|
||||
|
||||
Reference in New Issue
Block a user