Browse Source

页面sql解析

master
xueyinfei 1 month ago
parent
commit
09da0b8a2b
  1. 6
      src/main/java/com/guozhi/bloodanalysis/controller/BloodAnalysisController.java
  2. 14
      src/main/java/com/guozhi/bloodanalysis/parser/SqlParser.java
  3. 13
      src/main/java/com/guozhi/bloodanalysis/parser/common/AsTableParser.java
  4. 12
      src/main/java/com/guozhi/bloodanalysis/parser/common/CreateParser.java
  5. 13
      src/main/java/com/guozhi/bloodanalysis/parser/common/InsertParser.java
  6. 9
      src/main/java/com/guozhi/bloodanalysis/parser/common/ParserContext.java
  7. 25
      src/main/java/com/guozhi/bloodanalysis/parser/common/SelectParser.java
  8. 35
      src/main/java/com/guozhi/bloodanalysis/parser/common/UpdateParser.java
  9. 6
      src/main/java/com/guozhi/bloodanalysis/parser/utils/KColumnProvider.java
  10. 46
      src/main/java/com/guozhi/bloodanalysis/service/BloodAnalysisService.java

6
src/main/java/com/guozhi/bloodanalysis/controller/BloodAnalysisController.java

@ -40,8 +40,10 @@ public class BloodAnalysisController {
} }
@PostMapping("/sql/analysis") @PostMapping("/sql/analysis")
public ApiResult<Map<String,Object>> analysisBySQL(@RequestBody BloodAnalysisBySql sqlModel) throws Exception { public ApiResult<Map<String,Object>> analysisBySQL(HttpServletRequest request,@RequestBody BloodAnalysisBySql sqlModel) throws Exception {
List<Map<String,Object>> relation = bloodAnalysisService.analysisBySQL(sqlModel); String dashUserName = request.getHeader("dashUserName");
String dashPassword = request.getHeader("dashPassword");
List<Map<String,Object>> relation = bloodAnalysisService.analysisBySQL(sqlModel,dashUserName,dashPassword);
Map<String,Object> result = tableService.getTableAndColumn(relation); Map<String,Object> result = tableService.getTableAndColumn(relation);
return ApiResult.success(result); return ApiResult.success(result);
} }

14
src/main/java/com/guozhi/bloodanalysis/parser/SqlParser.java

@ -1,6 +1,7 @@
package com.guozhi.bloodanalysis.parser; package com.guozhi.bloodanalysis.parser;
import com.guozhi.bloodanalysis.entity.DataLineageInfo; import com.guozhi.bloodanalysis.entity.DataLineageInfo;
import com.guozhi.bloodanalysis.entity.vo.BloodAnalysisBySql;
import com.guozhi.bloodanalysis.exception.BusinessException; import com.guozhi.bloodanalysis.exception.BusinessException;
import com.guozhi.bloodanalysis.parser.clean.GenericLogNormalizer; import com.guozhi.bloodanalysis.parser.clean.GenericLogNormalizer;
import com.guozhi.bloodanalysis.parser.common.*; import com.guozhi.bloodanalysis.parser.common.*;
@ -49,7 +50,7 @@ public class SqlParser {
@Autowired @Autowired
ApplicationContext applicationContext; ApplicationContext applicationContext;
public void parse(DataLineageInfo dataLineageInfo, List<Map<Integer, String>> databaseList) throws Exception { public void parse(DataLineageInfo dataLineageInfo, List<Map<Integer, String>> databaseList,List<Map<String,Integer>> systemMap) throws Exception {
String sqlText = ""; String sqlText = "";
try { try {
List<String> targetSqlList = new ArrayList<>(); List<String> targetSqlList = new ArrayList<>();
@ -73,6 +74,7 @@ public class SqlParser {
Integer defaultSystem = dataLineageInfo.getSsysId(); Integer defaultSystem = dataLineageInfo.getSsysId();
this.parserContext.setDefaultDb(defaultSystem); this.parserContext.setDefaultDb(defaultSystem);
this.parserContext.setDefaultSchema(defaultSchema); this.parserContext.setDefaultSchema(defaultSchema);
this.parserContext.setDbList(systemMap);
int length = targetSqlList.size(); int length = targetSqlList.size();
for (String s : targetSqlList) { for (String s : targetSqlList) {
sqlText = s; sqlText = s;
@ -155,20 +157,22 @@ public class SqlParser {
} }
} }
public List<Map<String,Object>> parse(String procSql, String dbType, Integer defaultSystem, String defaultModel) throws Exception { public List<Map<String,Object>> parse(BloodAnalysisBySql sqlModel, List<Map<String,Integer>> list) throws Exception {
try { try {
String sqlText = ""; String sqlText = "";
List<Map<String,Object>> resultList = new ArrayList<>(); List<Map<String,Object>> resultList = new ArrayList<>();
List<String> targetSqlList = new ArrayList<>(); List<String> targetSqlList = new ArrayList<>();
String sql = new GenericLogNormalizer().normalizer(procSql,dbType); String sql = new GenericLogNormalizer().normalizer(sqlModel.getSql(),sqlModel.getSqlType());
sql = optDeclare(sql,null); sql = optDeclare(sql,null);
sql = optDeclare2(sql); sql = optDeclare2(sql);
if(sql.trim().equals("")){ if(sql.trim().equals("")){
throw new BusinessException("errorSQLparse"); throw new BusinessException("errorSQLparse");
} }
targetSqlList.add(sql); targetSqlList.add(sql);
this.parserContext.setDefaultDb(defaultSystem); this.parserContext.setDefaultDb(sqlModel.getDefaultSystem());
this.parserContext.setDefaultSchema(defaultModel); this.parserContext.setDefaultSchema(sqlModel.getDefaultModel());
this.parserContext.setDbList(list); //系统表里面的 系统名称和 id的对照表
String dbType = sqlModel.getSqlType();
for (String s : targetSqlList) { for (String s : targetSqlList) {
sqlText = s; sqlText = s;
if ("ORACLE".equals(dbType)) { if ("ORACLE".equals(dbType)) {

13
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.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
@Component @Component
@NoArgsConstructor @NoArgsConstructor
@ -64,9 +65,21 @@ public class AsTableParser extends BaseParser{
}else{//普通表名//StringUtils.isNotBlank(fullName) }else{//普通表名//StringUtils.isNotBlank(fullName)
String[] nameInfo=SpUtils.analyseTableName(fullName); String[] nameInfo=SpUtils.analyseTableName(fullName);
vTable=new VTable(nameInfo[2],nameInfo[2]); vTable=new VTable(nameInfo[2],nameInfo[2]);
if (nameInfo[0] != null){
List<Map<String,Integer>> list = mParserContext.getDbList();
if (list != null && list.size() >0){
for (Map<String, Integer> map : list) {
vTable.db = map.get(nameInfo[0]) == null ? mParserContext.getDefaultDb() : map.get(nameInfo[0]);
}
}
}else{
vTable.db=mParserContext.getDefaultDb(); vTable.db=mParserContext.getDefaultDb();
}
vTable.schema=nameInfo[1];
if(vTable.schema==null){
vTable.schema=mParserContext.getDefaultSchema(); vTable.schema=mParserContext.getDefaultSchema();
} }
}
if(StringUtils.isNotBlank(tableAlias)){ if(StringUtils.isNotBlank(tableAlias)){
vTable.setAlias(tableAlias); vTable.setAlias(tableAlias);
} }

12
src/main/java/com/guozhi/bloodanalysis/parser/common/CreateParser.java

@ -42,8 +42,20 @@ public class CreateParser extends BaseParser {
String[] nameInfo= SpUtils.analyseTableName(tableName); String[] nameInfo= SpUtils.analyseTableName(tableName);
//用表名和别名初始化一个表 //用表名和别名初始化一个表
mTable=new VTable(nameInfo[2],nameInfo[2]); mTable=new VTable(nameInfo[2],nameInfo[2]);
if (nameInfo[0] != null){
List<Map<String,Integer>> list = mParserContext.getDbList();
if (list != null && list.size() >0){
for (Map<String, Integer> map : list) {
mTable.db = map.get(nameInfo[0]) == null ? mParserContext.getDefaultDb() : map.get(nameInfo[0]);
}
}
}else{
mTable.db=mParserContext.getDefaultDb(); mTable.db=mParserContext.getDefaultDb();
}
mTable.schema=nameInfo[1];
if(mTable.schema==null){
mTable.schema=mParserContext.getDefaultSchema(); mTable.schema=mParserContext.getDefaultSchema();
}
//设置并判断是否临时表,如:CREATE MULTISET|VOLATILE的为临时表 //设置并判断是否临时表,如:CREATE MULTISET|VOLATILE的为临时表
mTable.setCreated(isEvTable(mCreateSql.toString())); mTable.setCreated(isEvTable(mCreateSql.toString()));
TColumnDefinitionList cdList = ctSql.getColumnList(); TColumnDefinitionList cdList = ctSql.getColumnList();

13
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.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import com.guozhi.bloodanalysis.parser.utils.ExprToColumn; import com.guozhi.bloodanalysis.parser.utils.ExprToColumn;
import com.guozhi.bloodanalysis.parser.utils.KColumnProvider; import com.guozhi.bloodanalysis.parser.utils.KColumnProvider;
@ -58,8 +59,20 @@ public class InsertParser extends BaseParser{
// System.out.println(mInsertSql.toString()); // System.out.println(mInsertSql.toString());
String[] nameInfo= SpUtils.analyseTableName(targetTableName); String[] nameInfo= SpUtils.analyseTableName(targetTableName);
tTable=new VTable(nameInfo[2],nameInfo[2]); tTable=new VTable(nameInfo[2],nameInfo[2]);
if (nameInfo[0] != null){
List<Map<String,Integer>> list = mParserContext.getDbList();
if (list != null && list.size() >0){
for (Map<String, Integer> map : list) {
tTable.db = map.get(nameInfo[0]) == null ? mParserContext.getDefaultDb() : map.get(nameInfo[0]);
}
}
}else{
tTable.db=mParserContext.getDefaultDb(); tTable.db=mParserContext.getDefaultDb();
}
tTable.schema=nameInfo[1];
if(tTable.schema==null){
tTable.schema=mParserContext.getDefaultSchema(); tTable.schema=mParserContext.getDefaultSchema();
}
boolean exportColumn=false; boolean exportColumn=false;
VTable createdTable=mParserContext.findExistedTable(tTable.getFullName(),false); VTable createdTable=mParserContext.findExistedTable(tTable.getFullName(),false);
//在解析的时候前面已经创建了临时表,这里再次使用就直接使用临时表 //在解析的时候前面已经创建了临时表,这里再次使用就直接使用临时表

9
src/main/java/com/guozhi/bloodanalysis/parser/common/ParserContext.java

@ -29,6 +29,8 @@ public class ParserContext {
*/ */
private String etlSrcTabName; private String etlSrcTabName;
private List<Map<String,Integer>> dbList;
public VTable findExistedTable(String tableName, boolean isCopy) { public VTable findExistedTable(String tableName, boolean isCopy) {
if (isCopy) { if (isCopy) {
return copyTable(mCreatedTables.get(tableName)); return copyTable(mCreatedTables.get(tableName));
@ -138,4 +140,11 @@ public class ParserContext {
this.etlSrcTabName = etlSrcTabName; this.etlSrcTabName = etlSrcTabName;
} }
public List<Map<String, Integer>> getDbList() {
return dbList;
}
public void setDbList(List<Map<String, Integer>> dbList) {
this.dbList = dbList;
}
} }

25
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.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import com.guozhi.bloodanalysis.parser.utils.ExprToColumn; import com.guozhi.bloodanalysis.parser.utils.ExprToColumn;
import com.guozhi.bloodanalysis.parser.utils.KDatabaseProvider; import com.guozhi.bloodanalysis.parser.utils.KDatabaseProvider;
@ -185,8 +186,20 @@ public class SelectParser extends BaseParser {
List<VTable> fromTables=vTable.getFromTables(); List<VTable> fromTables=vTable.getFromTables();
String[] nameInfo= SpUtils.analyseTableName(expr.toString()); String[] nameInfo= SpUtils.analyseTableName(expr.toString());
vTable=new VTable(nameInfo[2],nameInfo[2]); vTable=new VTable(nameInfo[2],nameInfo[2]);
if (nameInfo[0] != null){
List<Map<String,Integer>> list = mParserContext.getDbList();
if (list != null && list.size() >0){
for (Map<String, Integer> map : list) {
vTable.db = map.get(nameInfo[0]) == null ? mParserContext.getDefaultDb() : map.get(nameInfo[0]);
}
}
}else{
vTable.db=mParserContext.getDefaultDb(); vTable.db=mParserContext.getDefaultDb();
}
vTable.schema=nameInfo[1];
if(vTable.schema==null){
vTable.schema=mParserContext.getDefaultSchema(); vTable.schema=mParserContext.getDefaultSchema();
}
vTable.getFromTables().addAll(fromTables); vTable.getFromTables().addAll(fromTables);
break; break;
} }
@ -226,9 +239,21 @@ public class SelectParser extends BaseParser {
}else{//普通表名//StringUtils.isNotBlank(fullName) }else{//普通表名//StringUtils.isNotBlank(fullName)
String[] nameInfo=SpUtils.analyseTableName(fullName); String[] nameInfo=SpUtils.analyseTableName(fullName);
vTable=new VTable(nameInfo[2],nameInfo[2]); vTable=new VTable(nameInfo[2],nameInfo[2]);
if (nameInfo[0] != null){
List<Map<String,Integer>> list = mParserContext.getDbList();
if (list != null && list.size() >0){
for (Map<String, Integer> map : list) {
vTable.db = map.get(nameInfo[0]) == null ? mParserContext.getDefaultDb() : map.get(nameInfo[0]);
}
}
}else{
vTable.db=mParserContext.getDefaultDb(); vTable.db=mParserContext.getDefaultDb();
}
vTable.schema=nameInfo[1];
if(vTable.schema==null){
vTable.schema=mParserContext.getDefaultSchema(); vTable.schema=mParserContext.getDefaultSchema();
} }
}
if(StringUtils.isNotBlank(tableAlias)){ if(StringUtils.isNotBlank(tableAlias)){
vTable.setAlias(tableAlias); vTable.setAlias(tableAlias);

35
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.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import com.guozhi.bloodanalysis.parser.utils.ExprToColumn; import com.guozhi.bloodanalysis.parser.utils.ExprToColumn;
import com.guozhi.bloodanalysis.parser.utils.KColumnProvider; import com.guozhi.bloodanalysis.parser.utils.KColumnProvider;
@ -45,9 +46,22 @@ public class UpdateParser{
public void parse() { public void parse() {
TTable targetTable = mUpdateStmt.getTargetTable(); TTable targetTable = mUpdateStmt.getTargetTable();
String[] nameInfo = SpUtils.analyseTableName(targetTable.getFullName());
VTable updateTable = new VTable(targetTable.getName(), targetTable.getName()); VTable updateTable = new VTable(targetTable.getName(), targetTable.getName());
updateTable.db = mParserContext.getDefaultDb(); if (nameInfo[0] != null){
updateTable.schema = mParserContext.getDefaultSchema(); List<Map<String,Integer>> list = mParserContext.getDbList();
if (list != null && list.size() >0){
for (Map<String, Integer> 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; boolean exportColumn = false;
VTable createdTable = mParserContext.findExistedTable(updateTable.getFullName(),true); VTable createdTable = mParserContext.findExistedTable(updateTable.getFullName(),true);
if (createdTable == null) { if (createdTable == null) {
@ -127,10 +141,21 @@ public class UpdateParser{
} else if (StringUtils.isNotBlank(fullName)) {//普通表名 } else if (StringUtils.isNotBlank(fullName)) {//普通表名
String[] nameInfo = SpUtils.analyseTableName(fullName); String[] nameInfo = SpUtils.analyseTableName(fullName);
vTable = new VTable(nameInfo[2], nameInfo[2]); vTable = new VTable(nameInfo[2], nameInfo[2]);
vTable.db = mParserContext.getDefaultDb(); if (nameInfo[0] != null){
vTable.schema = mParserContext.getDefaultSchema(); List<Map<String,Integer>> list = mParserContext.getDbList();
if (list != null && list.size() >0){
for (Map<String, Integer> 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)) { if (StringUtils.isNotBlank(tableAlias)) {
vTable.setAlias(tableAlias); vTable.setAlias(tableAlias);
} }

6
src/main/java/com/guozhi/bloodanalysis/parser/utils/KColumnProvider.java

@ -34,7 +34,7 @@ public class KColumnProvider {
return table.getColumns(); return table.getColumns();
}else { }else {
String[] arr = tableName.split("\\."); String[] arr = tableName.split("\\.");
List<Map<String,String>> colList = metaBloodAnalysisMapper.getColumnsByTable(arr[arr.length-1], context.getDefaultDb(),context.getDefaultSchema()); List<Map<String,String>> colList = metaBloodAnalysisMapper.getColumnsByTable(arr[arr.length-1], vt.db,vt.schema);
if(colList.size()>0){ if(colList.size()>0){
List<KColumn> cols = new ArrayList<KColumn>(); List<KColumn> cols = new ArrayList<KColumn>();
for (Map<String, String> colMap : colList) { for (Map<String, String> colMap : colList) {
@ -42,8 +42,8 @@ public class KColumnProvider {
// col.columnPrefix = vt.alias; // col.columnPrefix = vt.alias;
col.columnName = colMap.get("colCode"); col.columnName = colMap.get("colCode");
col.alias = col.columnName; col.alias = col.columnName;
col.db = context.getDefaultDb(); col.db = vt.db;
col.schema = context.getDefaultSchema(); col.schema = vt.schema;
col.tableName = tableName; col.tableName = tableName;
col.isEvTable = true; col.isEvTable = true;
cols.add(col); cols.add(col);

46
src/main/java/com/guozhi/bloodanalysis/service/BloodAnalysisService.java

@ -71,15 +71,19 @@ public class BloodAnalysisService {
JSONObject data = obj.getJSONObject("data"); JSONObject data = obj.getJSONObject("data");
JSONArray totalList = data.getJSONArray("totalList"); JSONArray totalList = data.getJSONArray("totalList");
List<Map<Integer,String>> list = new ArrayList<>(); List<Map<Integer,String>> list = new ArrayList<>();
List<Map<String,Integer>> list2 = new ArrayList<>();
if (totalList !=null && totalList.size()>0){ if (totalList !=null && totalList.size()>0){
for (int i = 0; i < totalList.size(); i++) { for (int i = 0; i < totalList.size(); i++) {
JSONObject database = totalList.getJSONObject(i); JSONObject database = totalList.getJSONObject(i);
Map<Integer,String> map = new HashMap<>(); Map<Integer,String> map = new HashMap<>();
Map<String,Integer> map2 = new HashMap<>();
map.put(database.getInteger("id"),database.getString("type")); map.put(database.getInteger("id"),database.getString("type"));
map2.put(database.getString("name"),database.getInteger("id"));
list.add(map); list.add(map);
list2.add(map2);
} }
mapper.deleteAllBloodData(); 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<Map<Integer,String>> databaseList) throws Exception { public void parse(Integer pageNum, Integer pageSize, List<Map<Integer,String>> databaseList,List<Map<String,Integer>> systemMap) throws Exception {
PageHelper.startPage(pageNum,pageSize); PageHelper.startPage(pageNum,pageSize);
List<DataLineageInfo> list = dataLineageInfoMapper.search(); List<DataLineageInfo> list = dataLineageInfoMapper.search();
if (list != null && list.size()>0){ if (list != null && list.size()>0){
//访问dolphinscheduler接口,获取数据库名称以及对应的类型列表 //访问dolphinscheduler接口,获取数据库名称以及对应的类型列表
for (DataLineageInfo dataLineageInfo : list) { for (DataLineageInfo dataLineageInfo : list) {
SqlParser sqlParser = applicationContext.getBean(SqlParser.class); SqlParser sqlParser = applicationContext.getBean(SqlParser.class);
sqlParser.parse(dataLineageInfo,databaseList); sqlParser.parse(dataLineageInfo,databaseList,systemMap);
} }
} }
if (list != null && list.size() == pageSize){ if (list != null && list.size() == pageSize){
parse(pageNum+1,pageSize,databaseList); parse(pageNum+1,pageSize,databaseList,systemMap);
} }
} }
public List<Map<String, Object>> analysisBySQL(BloodAnalysisBySql sqlModel) throws Exception { public List<Map<String, Object>> analysisBySQL(BloodAnalysisBySql sqlModel, String dashUserName, String dashPassword) throws Exception {
List<Map<String,Integer>> 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<String,Integer> 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); SqlParser sqlParser = applicationContext.getBean(SqlParser.class);
return sqlParser.parse(sqlModel.getSql(), sqlModel.getSqlType(), sqlModel.getDefaultSystem(), sqlModel.getDefaultModel()); return sqlParser.parse(sqlModel, list);
} }
} }

Loading…
Cancel
Save