mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-11 20:25:12 +00:00
[improvement][chat]Introduce AllFieldMapper to increase parsing robustness when normal pipeline fails.
[improvement][chat]Introduce `AllFieldMapper` to increase parsing robustness when normal pipeline fails.
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
package com.tencent.supersonic.common.jsqlparser;
|
||||
|
||||
import net.sf.jsqlparser.expression.Alias;
|
||||
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
|
||||
import net.sf.jsqlparser.statement.select.SelectItem;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public class AliasAcquireVisitor extends ExpressionVisitorAdapter {
|
||||
|
||||
private Set<String> aliases;
|
||||
|
||||
public AliasAcquireVisitor(Set<String> aliases) {
|
||||
this.aliases = aliases;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visit(SelectItem selectItem) {
|
||||
Alias alias = selectItem.getAlias();
|
||||
if (alias != null) {
|
||||
aliases.add(alias.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.tencent.supersonic.common.jsqlparser;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import net.sf.jsqlparser.expression.Alias;
|
||||
import net.sf.jsqlparser.expression.Expression;
|
||||
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
|
||||
@@ -11,6 +12,7 @@ import java.util.Set;
|
||||
public class FieldAcquireVisitor extends ExpressionVisitorAdapter {
|
||||
|
||||
private Set<String> fields;
|
||||
private Set<String> aliases = Sets.newHashSet();
|
||||
|
||||
public FieldAcquireVisitor(Set<String> fields) {
|
||||
this.fields = fields;
|
||||
@@ -26,8 +28,9 @@ public class FieldAcquireVisitor extends ExpressionVisitorAdapter {
|
||||
public void visit(SelectItem selectItem) {
|
||||
Alias alias = selectItem.getAlias();
|
||||
if (alias != null) {
|
||||
fields.add(alias.getName());
|
||||
aliases.add(alias.getName());
|
||||
}
|
||||
|
||||
Expression expression = selectItem.getExpression();
|
||||
if (expression != null) {
|
||||
expression.accept(this);
|
||||
|
||||
@@ -133,6 +133,15 @@ public class SqlSelectHelper {
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Set<String> getAliasFields(PlainSelect plainSelect) {
|
||||
Set<String> result = new HashSet<>();
|
||||
List<SelectItem<?>> selectItems = plainSelect.getSelectItems();
|
||||
for (SelectItem selectItem : selectItems) {
|
||||
selectItem.accept(new AliasAcquireVisitor(result));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static List<PlainSelect> getPlainSelect(Select selectStatement) {
|
||||
if (selectStatement == null) {
|
||||
return null;
|
||||
@@ -264,10 +273,14 @@ public class SqlSelectHelper {
|
||||
public static List<String> getAllSelectFields(String sql) {
|
||||
List<PlainSelect> plainSelects = getPlainSelects(getPlainSelect(sql));
|
||||
Set<String> results = new HashSet<>();
|
||||
Set<String> aliases = new HashSet<>();
|
||||
for (PlainSelect plainSelect : plainSelects) {
|
||||
List<String> fields = getFieldsByPlainSelect(plainSelect);
|
||||
results.addAll(fields);
|
||||
aliases.addAll(getAliasFields(plainSelect));
|
||||
}
|
||||
// do not account in aliases
|
||||
results.removeAll(aliases);
|
||||
return new ArrayList<>(results);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user