diff --git a/src/main/java/com/guozhi/bloodanalysis/controller/BloodAnalysisController.java b/src/main/java/com/guozhi/bloodanalysis/controller/BloodAnalysisController.java index 0c85726..b26923e 100644 --- a/src/main/java/com/guozhi/bloodanalysis/controller/BloodAnalysisController.java +++ b/src/main/java/com/guozhi/bloodanalysis/controller/BloodAnalysisController.java @@ -40,8 +40,10 @@ public class BloodAnalysisController { } @PostMapping("/sql/analysis") - public ApiResult> analysisBySQL(@RequestBody BloodAnalysisBySql sqlModel) throws Exception { - List> relation = bloodAnalysisService.analysisBySQL(sqlModel); + public ApiResult> analysisBySQL(HttpServletRequest request,@RequestBody BloodAnalysisBySql sqlModel) throws Exception { + String dashUserName = request.getHeader("dashUserName"); + String dashPassword = request.getHeader("dashPassword"); + List> relation = bloodAnalysisService.analysisBySQL(sqlModel,dashUserName,dashPassword); Map result = tableService.getTableAndColumn(relation); return ApiResult.success(result); } diff --git a/src/main/java/com/guozhi/bloodanalysis/parser/SqlParser.java b/src/main/java/com/guozhi/bloodanalysis/parser/SqlParser.java index 29941f8..29a789a 100644 --- a/src/main/java/com/guozhi/bloodanalysis/parser/SqlParser.java +++ b/src/main/java/com/guozhi/bloodanalysis/parser/SqlParser.java @@ -1,6 +1,7 @@ package com.guozhi.bloodanalysis.parser; import com.guozhi.bloodanalysis.entity.DataLineageInfo; +import com.guozhi.bloodanalysis.entity.vo.BloodAnalysisBySql; import com.guozhi.bloodanalysis.exception.BusinessException; import com.guozhi.bloodanalysis.parser.clean.GenericLogNormalizer; import com.guozhi.bloodanalysis.parser.common.*; @@ -49,7 +50,7 @@ public class SqlParser { @Autowired ApplicationContext applicationContext; - public void parse(DataLineageInfo dataLineageInfo, List> databaseList) throws Exception { + public void parse(DataLineageInfo dataLineageInfo, List> databaseList,List> systemMap) throws Exception { String sqlText = ""; try { List targetSqlList = new ArrayList<>(); @@ -73,6 +74,7 @@ public class SqlParser { Integer defaultSystem = dataLineageInfo.getSsysId(); this.parserContext.setDefaultDb(defaultSystem); this.parserContext.setDefaultSchema(defaultSchema); + this.parserContext.setDbList(systemMap); int length = targetSqlList.size(); for (String s : targetSqlList) { sqlText = s; @@ -155,20 +157,22 @@ public class SqlParser { } } - public List> parse(String procSql, String dbType, Integer defaultSystem, String defaultModel) throws Exception { + public List> parse(BloodAnalysisBySql sqlModel, List> list) throws Exception { try { String sqlText = ""; List> resultList = new ArrayList<>(); List targetSqlList = new ArrayList<>(); - String sql = new GenericLogNormalizer().normalizer(procSql,dbType); + String sql = new GenericLogNormalizer().normalizer(sqlModel.getSql(),sqlModel.getSqlType()); sql = optDeclare(sql,null); sql = optDeclare2(sql); if(sql.trim().equals("")){ throw new BusinessException("errorSQLparse"); } targetSqlList.add(sql); - this.parserContext.setDefaultDb(defaultSystem); - this.parserContext.setDefaultSchema(defaultModel); + this.parserContext.setDefaultDb(sqlModel.getDefaultSystem()); + this.parserContext.setDefaultSchema(sqlModel.getDefaultModel()); + this.parserContext.setDbList(list); //系统表里面的 系统名称和 id的对照表 + String dbType = sqlModel.getSqlType(); for (String s : targetSqlList) { sqlText = s; if ("ORACLE".equals(dbType)) { diff --git a/src/main/java/com/guozhi/bloodanalysis/parser/common/AsTableParser.java b/src/main/java/com/guozhi/bloodanalysis/parser/common/AsTableParser.java index 6a138ee..d267f75 100644 --- a/src/main/java/com/guozhi/bloodanalysis/parser/common/AsTableParser.java +++ b/src/main/java/com/guozhi/bloodanalysis/parser/common/AsTableParser.java @@ -22,6 +22,7 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; +import java.util.Map; @Component @NoArgsConstructor @@ -64,8 +65,20 @@ public class AsTableParser extends BaseParser{ }else{//普通表名//StringUtils.isNotBlank(fullName) String[] nameInfo=SpUtils.analyseTableName(fullName); vTable=new VTable(nameInfo[2],nameInfo[2]); - vTable.db=mParserContext.getDefaultDb(); - vTable.schema=mParserContext.getDefaultSchema(); + if (nameInfo[0] != null){ + List> list = mParserContext.getDbList(); + if (list != null && list.size() >0){ + for (Map map : list) { + vTable.db = map.get(nameInfo[0]) == null ? mParserContext.getDefaultDb() : map.get(nameInfo[0]); + } + } + }else{ + vTable.db=mParserContext.getDefaultDb(); + } + vTable.schema=nameInfo[1]; + if(vTable.schema==null){ + vTable.schema=mParserContext.getDefaultSchema(); + } } if(StringUtils.isNotBlank(tableAlias)){ vTable.setAlias(tableAlias); diff --git a/src/main/java/com/guozhi/bloodanalysis/parser/common/CreateParser.java b/src/main/java/com/guozhi/bloodanalysis/parser/common/CreateParser.java index 3f6d37c..80cbb42 100644 --- a/src/main/java/com/guozhi/bloodanalysis/parser/common/CreateParser.java +++ b/src/main/java/com/guozhi/bloodanalysis/parser/common/CreateParser.java @@ -42,8 +42,20 @@ public class CreateParser extends BaseParser { String[] nameInfo= SpUtils.analyseTableName(tableName); //用表名和别名初始化一个表 mTable=new VTable(nameInfo[2],nameInfo[2]); - mTable.db=mParserContext.getDefaultDb(); - mTable.schema=mParserContext.getDefaultSchema(); + if (nameInfo[0] != null){ + List> list = mParserContext.getDbList(); + if (list != null && list.size() >0){ + for (Map map : list) { + mTable.db = map.get(nameInfo[0]) == null ? mParserContext.getDefaultDb() : map.get(nameInfo[0]); + } + } + }else{ + mTable.db=mParserContext.getDefaultDb(); + } + mTable.schema=nameInfo[1]; + if(mTable.schema==null){ + mTable.schema=mParserContext.getDefaultSchema(); + } //设置并判断是否临时表,如:CREATE MULTISET|VOLATILE的为临时表 mTable.setCreated(isEvTable(mCreateSql.toString())); TColumnDefinitionList cdList = ctSql.getColumnList(); diff --git a/src/main/java/com/guozhi/bloodanalysis/parser/common/InsertParser.java b/src/main/java/com/guozhi/bloodanalysis/parser/common/InsertParser.java index b678869..273c926 100644 --- a/src/main/java/com/guozhi/bloodanalysis/parser/common/InsertParser.java +++ b/src/main/java/com/guozhi/bloodanalysis/parser/common/InsertParser.java @@ -6,6 +6,7 @@ package com.guozhi.bloodanalysis.parser.common; import java.util.ArrayList; import java.util.List; +import java.util.Map; import com.guozhi.bloodanalysis.parser.utils.ExprToColumn; import com.guozhi.bloodanalysis.parser.utils.KColumnProvider; @@ -58,8 +59,20 @@ public class InsertParser extends BaseParser{ // System.out.println(mInsertSql.toString()); String[] nameInfo= SpUtils.analyseTableName(targetTableName); tTable=new VTable(nameInfo[2],nameInfo[2]); - tTable.db=mParserContext.getDefaultDb(); - tTable.schema=mParserContext.getDefaultSchema(); + if (nameInfo[0] != null){ + List> list = mParserContext.getDbList(); + if (list != null && list.size() >0){ + for (Map map : list) { + tTable.db = map.get(nameInfo[0]) == null ? mParserContext.getDefaultDb() : map.get(nameInfo[0]); + } + } + }else{ + tTable.db=mParserContext.getDefaultDb(); + } + tTable.schema=nameInfo[1]; + if(tTable.schema==null){ + tTable.schema=mParserContext.getDefaultSchema(); + } boolean exportColumn=false; VTable createdTable=mParserContext.findExistedTable(tTable.getFullName(),false); //在解析的时候前面已经创建了临时表,这里再次使用就直接使用临时表 diff --git a/src/main/java/com/guozhi/bloodanalysis/parser/common/ParserContext.java b/src/main/java/com/guozhi/bloodanalysis/parser/common/ParserContext.java index 49ae4c6..4434a1f 100644 --- a/src/main/java/com/guozhi/bloodanalysis/parser/common/ParserContext.java +++ b/src/main/java/com/guozhi/bloodanalysis/parser/common/ParserContext.java @@ -29,6 +29,8 @@ public class ParserContext { */ private String etlSrcTabName; + private List> dbList; + public VTable findExistedTable(String tableName, boolean isCopy) { if (isCopy) { return copyTable(mCreatedTables.get(tableName)); @@ -138,4 +140,11 @@ public class ParserContext { this.etlSrcTabName = etlSrcTabName; } + public List> getDbList() { + return dbList; + } + + public void setDbList(List> dbList) { + this.dbList = dbList; + } } diff --git a/src/main/java/com/guozhi/bloodanalysis/parser/common/SelectParser.java b/src/main/java/com/guozhi/bloodanalysis/parser/common/SelectParser.java index 9174338..09ee86b 100644 --- a/src/main/java/com/guozhi/bloodanalysis/parser/common/SelectParser.java +++ b/src/main/java/com/guozhi/bloodanalysis/parser/common/SelectParser.java @@ -10,6 +10,7 @@ package com.guozhi.bloodanalysis.parser.common; import java.util.ArrayList; import java.util.List; +import java.util.Map; import com.guozhi.bloodanalysis.parser.utils.ExprToColumn; import com.guozhi.bloodanalysis.parser.utils.KDatabaseProvider; @@ -185,9 +186,21 @@ public class SelectParser extends BaseParser { List fromTables=vTable.getFromTables(); String[] nameInfo= SpUtils.analyseTableName(expr.toString()); vTable=new VTable(nameInfo[2],nameInfo[2]); - vTable.db=mParserContext.getDefaultDb(); - vTable.schema=mParserContext.getDefaultSchema(); - vTable.getFromTables().addAll(fromTables); + if (nameInfo[0] != null){ + List> list = mParserContext.getDbList(); + if (list != null && list.size() >0){ + for (Map map : list) { + vTable.db = map.get(nameInfo[0]) == null ? mParserContext.getDefaultDb() : map.get(nameInfo[0]); + } + } + }else{ + vTable.db=mParserContext.getDefaultDb(); + } + vTable.schema=nameInfo[1]; + if(vTable.schema==null){ + vTable.schema=mParserContext.getDefaultSchema(); + } + vTable.getFromTables().addAll(fromTables); break; } @@ -226,8 +239,20 @@ public class SelectParser extends BaseParser { }else{//普通表名//StringUtils.isNotBlank(fullName) String[] nameInfo=SpUtils.analyseTableName(fullName); vTable=new VTable(nameInfo[2],nameInfo[2]); - vTable.db=mParserContext.getDefaultDb(); - vTable.schema=mParserContext.getDefaultSchema(); + if (nameInfo[0] != null){ + List> list = mParserContext.getDbList(); + if (list != null && list.size() >0){ + for (Map map : list) { + vTable.db = map.get(nameInfo[0]) == null ? mParserContext.getDefaultDb() : map.get(nameInfo[0]); + } + } + }else{ + vTable.db=mParserContext.getDefaultDb(); + } + vTable.schema=nameInfo[1]; + if(vTable.schema==null){ + vTable.schema=mParserContext.getDefaultSchema(); + } } if(StringUtils.isNotBlank(tableAlias)){ diff --git a/src/main/java/com/guozhi/bloodanalysis/parser/common/UpdateParser.java b/src/main/java/com/guozhi/bloodanalysis/parser/common/UpdateParser.java index 9d03f86..d296652 100644 --- a/src/main/java/com/guozhi/bloodanalysis/parser/common/UpdateParser.java +++ b/src/main/java/com/guozhi/bloodanalysis/parser/common/UpdateParser.java @@ -6,6 +6,7 @@ package com.guozhi.bloodanalysis.parser.common; import java.util.ArrayList; import java.util.List; +import java.util.Map; import com.guozhi.bloodanalysis.parser.utils.ExprToColumn; import com.guozhi.bloodanalysis.parser.utils.KColumnProvider; @@ -45,9 +46,22 @@ public class UpdateParser{ public void parse() { TTable targetTable = mUpdateStmt.getTargetTable(); + String[] nameInfo = SpUtils.analyseTableName(targetTable.getFullName()); VTable updateTable = new VTable(targetTable.getName(), targetTable.getName()); - updateTable.db = mParserContext.getDefaultDb(); - updateTable.schema = mParserContext.getDefaultSchema(); + if (nameInfo[0] != null){ + List> list = mParserContext.getDbList(); + if (list != null && list.size() >0){ + for (Map map : list) { + updateTable.db = map.get(nameInfo[0]) == null ? mParserContext.getDefaultDb() : map.get(nameInfo[0]); + } + } + }else{ + updateTable.db=mParserContext.getDefaultDb(); + } + updateTable.schema=nameInfo[1]; + if(updateTable.schema==null){ + updateTable.schema=mParserContext.getDefaultSchema(); + } boolean exportColumn = false; VTable createdTable = mParserContext.findExistedTable(updateTable.getFullName(),true); if (createdTable == null) { @@ -127,10 +141,21 @@ public class UpdateParser{ } else if (StringUtils.isNotBlank(fullName)) {//普通表名 String[] nameInfo = SpUtils.analyseTableName(fullName); vTable = new VTable(nameInfo[2], nameInfo[2]); - vTable.db = mParserContext.getDefaultDb(); - vTable.schema = mParserContext.getDefaultSchema(); + if (nameInfo[0] != null){ + List> list = mParserContext.getDbList(); + if (list != null && list.size() >0){ + for (Map map : list) { + vTable.db = map.get(nameInfo[0]) == null ? mParserContext.getDefaultDb() : map.get(nameInfo[0]); + } + } + }else{ + vTable.db=mParserContext.getDefaultDb(); + } + vTable.schema=nameInfo[1]; + if(vTable.schema==null){ + vTable.schema=mParserContext.getDefaultSchema(); + } } - if (StringUtils.isNotBlank(tableAlias)) { vTable.setAlias(tableAlias); } diff --git a/src/main/java/com/guozhi/bloodanalysis/parser/utils/KColumnProvider.java b/src/main/java/com/guozhi/bloodanalysis/parser/utils/KColumnProvider.java index 43aa32a..52829f5 100644 --- a/src/main/java/com/guozhi/bloodanalysis/parser/utils/KColumnProvider.java +++ b/src/main/java/com/guozhi/bloodanalysis/parser/utils/KColumnProvider.java @@ -34,7 +34,7 @@ public class KColumnProvider { return table.getColumns(); }else { String[] arr = tableName.split("\\."); - List> colList = metaBloodAnalysisMapper.getColumnsByTable(arr[arr.length-1], context.getDefaultDb(),context.getDefaultSchema()); + List> colList = metaBloodAnalysisMapper.getColumnsByTable(arr[arr.length-1], vt.db,vt.schema); if(colList.size()>0){ List cols = new ArrayList(); for (Map colMap : colList) { @@ -42,8 +42,8 @@ public class KColumnProvider { // col.columnPrefix = vt.alias; col.columnName = colMap.get("colCode"); col.alias = col.columnName; - col.db = context.getDefaultDb(); - col.schema = context.getDefaultSchema(); + col.db = vt.db; + col.schema = vt.schema; col.tableName = tableName; col.isEvTable = true; cols.add(col); diff --git a/src/main/java/com/guozhi/bloodanalysis/service/BloodAnalysisService.java b/src/main/java/com/guozhi/bloodanalysis/service/BloodAnalysisService.java index 504b426..61fdb62 100644 --- a/src/main/java/com/guozhi/bloodanalysis/service/BloodAnalysisService.java +++ b/src/main/java/com/guozhi/bloodanalysis/service/BloodAnalysisService.java @@ -71,15 +71,19 @@ public class BloodAnalysisService { JSONObject data = obj.getJSONObject("data"); JSONArray totalList = data.getJSONArray("totalList"); List> list = new ArrayList<>(); + List> list2 = new ArrayList<>(); if (totalList !=null && totalList.size()>0){ for (int i = 0; i < totalList.size(); i++) { JSONObject database = totalList.getJSONObject(i); Map map = new HashMap<>(); + Map map2 = new HashMap<>(); map.put(database.getInteger("id"),database.getString("type")); + map2.put(database.getString("name"),database.getInteger("id")); list.add(map); + list2.add(map2); } mapper.deleteAllBloodData(); - parse(pageNum,pageSize,list); + parse(pageNum,pageSize,list,list2); } } } @@ -90,23 +94,53 @@ public class BloodAnalysisService { } } - public void parse(Integer pageNum, Integer pageSize, List> databaseList) throws Exception { + public void parse(Integer pageNum, Integer pageSize, List> databaseList,List> systemMap) throws Exception { PageHelper.startPage(pageNum,pageSize); List list = dataLineageInfoMapper.search(); if (list != null && list.size()>0){ //访问dolphinscheduler接口,获取数据库名称以及对应的类型列表 for (DataLineageInfo dataLineageInfo : list) { SqlParser sqlParser = applicationContext.getBean(SqlParser.class); - sqlParser.parse(dataLineageInfo,databaseList); + sqlParser.parse(dataLineageInfo,databaseList,systemMap); } } if (list != null && list.size() == pageSize){ - parse(pageNum+1,pageSize,databaseList); + parse(pageNum+1,pageSize,databaseList,systemMap); } } - public List> analysisBySQL(BloodAnalysisBySql sqlModel) throws Exception { + public List> analysisBySQL(BloodAnalysisBySql sqlModel, String dashUserName, String dashPassword) throws Exception { + List> list = new ArrayList<>(); + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + // 1. 创建 POST 请求 + HttpGet get = new HttpGet(databaseUrl); + // 2. 设置请求头(可选) + get.setHeader("Content-Type", "application/json"); + get.setHeader("dashUserName",dashUserName); + get.setHeader("dashPassword",dashPassword); + // 4. 执行请求 + try (CloseableHttpResponse response = httpClient.execute(get)) { + // 5. 获取响应 + HttpEntity entity = response.getEntity(); + if (entity != null) { + String responseStr = EntityUtils.toString(entity); + JSONObject obj = JSON.parseObject(responseStr); + JSONObject data = obj.getJSONObject("data"); + JSONArray totalList = data.getJSONArray("totalList"); + if (totalList !=null && totalList.size()>0){ + for (int i = 0; i < totalList.size(); i++) { + JSONObject database = totalList.getJSONObject(i); + Map map = new HashMap<>(); + map.put(database.getString("name"),database.getInteger("id")); + list.add(map); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } SqlParser sqlParser = applicationContext.getBean(SqlParser.class); - return sqlParser.parse(sqlModel.getSql(), sqlModel.getSqlType(), sqlModel.getDefaultSystem(), sqlModel.getDefaultModel()); + return sqlParser.parse(sqlModel, list); } }