Commit 0c95365e authored by zhu-mingye's avatar zhu-mingye

Merge remote-tracking branch 'origin/dev' into dev

parents e5a210de 8d6a9486
...@@ -16,4 +16,5 @@ public class StudioCADTO extends AbstractStatementDTO { ...@@ -16,4 +16,5 @@ public class StudioCADTO extends AbstractStatementDTO {
private Boolean statementSet; private Boolean statementSet;
private Integer type; private Integer type;
private String dialect; private String dialect;
private Integer databaseId;
} }
...@@ -257,10 +257,17 @@ public class StudioServiceImpl implements StudioService { ...@@ -257,10 +257,17 @@ public class StudioServiceImpl implements StudioService {
@Override @Override
public LineageResult getLineage(StudioCADTO studioCADTO) { public LineageResult getLineage(StudioCADTO studioCADTO) {
if (Asserts.isNotNullString(studioCADTO.getDialect()) && !studioCADTO.getDialect().equalsIgnoreCase("flinksql")) { if (Asserts.isNotNullString(studioCADTO.getDialect()) && !studioCADTO.getDialect().equalsIgnoreCase("flinksql")) {
if(Asserts.isNull(studioCADTO.getDatabaseId())){
return null;
}
DataBase dataBase = dataBaseService.getById(studioCADTO.getDatabaseId());
if (Asserts.isNull(dataBase)) {
return null;
}
if(studioCADTO.getDialect().equalsIgnoreCase("doris")){ if(studioCADTO.getDialect().equalsIgnoreCase("doris")){
return com.dlink.explainer.sqlLineage.LineageBuilder.getSqlLineage(studioCADTO.getStatement(),"mysql"); return com.dlink.explainer.sqlLineage.LineageBuilder.getSqlLineage(studioCADTO.getStatement(), "mysql", dataBase.getDriverConfig());
} else { } else {
return com.dlink.explainer.sqlLineage.LineageBuilder.getSqlLineage(studioCADTO.getStatement(),studioCADTO.getDialect().toLowerCase()); return com.dlink.explainer.sqlLineage.LineageBuilder.getSqlLineage(studioCADTO.getStatement(), studioCADTO.getDialect().toLowerCase(), dataBase.getDriverConfig());
} }
} else { } else {
addFlinkSQLEnv(studioCADTO); addFlinkSQLEnv(studioCADTO);
......
...@@ -11,6 +11,9 @@ import com.dlink.assertion.Asserts; ...@@ -11,6 +11,9 @@ import com.dlink.assertion.Asserts;
import com.dlink.explainer.lineage.LineageRelation; import com.dlink.explainer.lineage.LineageRelation;
import com.dlink.explainer.lineage.LineageResult; import com.dlink.explainer.lineage.LineageResult;
import com.dlink.explainer.lineage.LineageTable; import com.dlink.explainer.lineage.LineageTable;
import com.dlink.metadata.driver.Driver;
import com.dlink.metadata.driver.DriverConfig;
import com.dlink.model.Column;
import java.util.*; import java.util.*;
...@@ -122,25 +125,35 @@ public class LineageBuilder { ...@@ -122,25 +125,35 @@ public class LineageBuilder {
return LineageResult.build(tables, relations); return LineageResult.build(tables, relations);
} }
public static LineageResult getSqlLineage(String statement,String type) { public static LineageResult getSqlLineage(String statement, String type, DriverConfig driverConfig) {
List<LineageTable> tables = new ArrayList<>(); List<LineageTable> tables = new ArrayList<>();
List<LineageRelation> relations = new ArrayList<>(); List<LineageRelation> relations = new ArrayList<>();
Map<Integer, List<List<TableStat.Column>>> srcMap = new HashMap<>(); Map<Integer, List<List<TableStat.Column>>> srcMap = new HashMap<>();
Map<Integer, List<TableStat.Column>> tgtMap = new HashMap<>(); Map<Integer, List<TableStat.Column>> tgtMap = new HashMap<>();
Map<String, String> tableMap = new HashMap<>(); Map<String, String> tableMap = new HashMap<>();
List<TableStat.Column> allColumnList = new ArrayList<>(); List<TableStat.Column> allColumnList = new ArrayList<>();
String[] sqls = statement.split(";");
try { try {
List<SQLStatement> sqlStatements = SQLUtils.parseStatements(statement.toLowerCase(), type); List<SQLStatement> sqlStatements = SQLUtils.parseStatements(statement, type);
for (int n = 0; n < sqlStatements.size(); n++) { for (int n = 0; n < sqlStatements.size(); n++) {
SQLStatement sqlStatement = sqlStatements.get(n); SQLStatement sqlStatement = sqlStatements.get(n);
List<List<TableStat.Column>> srcLists = new ArrayList<>(); List<List<TableStat.Column>> srcLists = new ArrayList<>();
List<TableStat.Column> tgtList = new ArrayList<>(); List<TableStat.Column> tgtList = new ArrayList<>();
//只考虑insert语句 //只考虑insert语句
if (sqlStatement instanceof SQLInsertStatement) { if (sqlStatement instanceof SQLInsertStatement) {
String targetTable = ((SQLInsertStatement) sqlStatement).getTableName().toString(); String targetTable = ((SQLInsertStatement) sqlStatement).getTableName().toString().replace("`", "").replace("\"", "");
List<SQLExpr> columns = ((SQLInsertStatement) sqlStatement).getColumns(); List<SQLExpr> columns = ((SQLInsertStatement) sqlStatement).getColumns();
//处理target表中字段 //处理target表中字段
if (columns.size() <= 0 || sqls[n].contains("*")) {
Driver driver = Driver.build(driverConfig);
if(!targetTable.contains(".")){
return null;
}
List<Column> columns1 = driver.listColumns(targetTable.split("\\.")[0], targetTable.split("\\.")[1]);
for (Column column : columns1) {
tgtList.add(new TableStat.Column(targetTable, column.getName()));
}
} else {
for (SQLExpr column : columns) { for (SQLExpr column : columns) {
if (column instanceof SQLPropertyExpr) { if (column instanceof SQLPropertyExpr) {
tgtList.add(new TableStat.Column(targetTable, ((SQLPropertyExpr) column).getName().replace("`", "").replace("\"", ""))); tgtList.add(new TableStat.Column(targetTable, ((SQLPropertyExpr) column).getName().replace("`", "").replace("\"", "")));
...@@ -148,6 +161,7 @@ public class LineageBuilder { ...@@ -148,6 +161,7 @@ public class LineageBuilder {
tgtList.add(new TableStat.Column(targetTable, ((SQLIdentifierExpr) column).getName().replace("`", "").replace("\"", ""))); tgtList.add(new TableStat.Column(targetTable, ((SQLIdentifierExpr) column).getName().replace("`", "").replace("\"", "")));
} }
} }
}
//处理select 生成srcLists //处理select 生成srcLists
LineageColumn root = new LineageColumn(); LineageColumn root = new LineageColumn();
TreeNode<LineageColumn> rootNode = new TreeNode<>(root); TreeNode<LineageColumn> rootNode = new TreeNode<>(root);
......
...@@ -19,6 +19,7 @@ const StudioCA = (props: any) => { ...@@ -19,6 +19,7 @@ const StudioCA = (props: any) => {
statement:current.value, statement:current.value,
statementSet:current.task.statementSet, statementSet:current.task.statementSet,
dialect:current.task.dialect, dialect:current.task.dialect,
databaseId:current.task.databaseId,
type: 1, type: 1,
}); });
res.then((result)=>{ res.then((result)=>{
......
...@@ -48,4 +48,5 @@ export type CAParam = { ...@@ -48,4 +48,5 @@ export type CAParam = {
statementSet: boolean, statementSet: boolean,
type: number, type: number,
dialect?: string, dialect?: string,
databaseId?: number,
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment