Browse Source

页面sql解析

master
xueyinfei 1 week ago
parent
commit
a5a2b7b64e
  1. 13
      src/main/java/com/guozhi/bloodanalysis/controller/BloodAnalysisController.java
  2. 15
      src/main/java/com/guozhi/bloodanalysis/entity/vo/BloodAnalysisBySql.java
  3. 114
      src/main/java/com/guozhi/bloodanalysis/parser/SqlParser.java
  4. 26
      src/main/java/com/guozhi/bloodanalysis/parser/utils/ExportParseResultUtil.java
  5. 8
      src/main/java/com/guozhi/bloodanalysis/service/BloodAnalysisService.java

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

@ -1,16 +1,17 @@
package com.guozhi.bloodanalysis.controller;
import com.guozhi.bloodanalysis.parser.SqlParser;
import com.guozhi.bloodanalysis.entity.vo.BloodAnalysisBySql;
import com.guozhi.bloodanalysis.service.BloodAnalysisService;
import com.guozhi.bloodanalysis.utils.ApiResult;
import com.guozhi.bloodanalysis.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.FileNotFoundException;
import java.util.List;
import java.util.Map;
@RestController
public class BloodAnalysisController {
@ -33,4 +34,10 @@ public class BloodAnalysisController {
return ApiResult.success("启动任务成功,请稍后查看");
}
}
@PostMapping("/sql/analysis")
public ApiResult<List<Map<String,String>>> analysisBySQL(@RequestBody BloodAnalysisBySql sqlModel) throws Exception {
List<Map<String,String>> result = bloodAnalysisService.analysisBySQL(sqlModel);
return ApiResult.success(result);
}
}

15
src/main/java/com/guozhi/bloodanalysis/entity/vo/BloodAnalysisBySql.java

@ -0,0 +1,15 @@
package com.guozhi.bloodanalysis.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BloodAnalysisBySql {
private String sqlType;
private Integer defaultSystem;
private String defaultModel;
private String sql;
}

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

@ -155,6 +155,103 @@ public class SqlParser {
}
}
public List<Map<String,String>> parse(String procSql, String dbType, Integer defaultSystem, String defaultModel) throws Exception {
try {
String sqlText = "";
List<Map<String,String>> resultList = new ArrayList<>();
List<String> targetSqlList = new ArrayList<>();
String sql = new GenericLogNormalizer().normalizer(procSql,dbType);
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);
for (String s : targetSqlList) {
sqlText = s;
if ("ORACLE".equals(dbType)) {
if (Objects.equals(dbType, Oracle.toString())) {
if (sqlText != null) {
sqlText = sqlText.toUpperCase();
}
}
sqlParser = new TGSqlParser(EDbVendor.dbvoracle);
}
if ("MYSQL".equals(dbType)) {
sqlParser = new TGSqlParser(EDbVendor.dbvmysql);
}
if ("SQLSERVER".equals(dbType)) {
sqlParser = new TGSqlParser(EDbVendor.dbvmssql);
}
if ("TERADATA".equals(dbType)) {
sqlParser = new TGSqlParser(EDbVendor.dbvteradata);
}
if ("POSTGRESQL".equals(dbType)) {
sqlParser = new TGSqlParser(EDbVendor.dbvpostgresql);
}
if ("DB2".equals(dbType)) {
sqlParser = new TGSqlParser(EDbVendor.dbvdb2);
}
sqlParser.sqltext = sqlText;
int ret = sqlParser.parse();
List<KColumn> result = new ArrayList<>();
if (ret == 0) {
TStatementList statementList = sqlParser.getSqlstatements();
while (statementList.hasNext()) {
TCustomSqlStatement stmt = statementList.next();
parserContext.getTableInCurrentStatement().clear();
switch (stmt.sqlstatementtype) {
case sstselect:
result = parseSelect(stmt);
break;
case sstdelete:
result = parseDelete(stmt);
break;
case sstupdate:
result = parseUpdate(stmt);
break;
case sstinsert:
result = parseInsert(stmt);
break;
case sstcreatetable:
result = parseCreateTable(stmt);
break;
case sstcreateview:
break;
case sstoraclealtertablespace:
// parseAlterTable(stmt);
break;
case sstdroptable:
// parseDropTable(stmt);
break;
case sstmerge:
log.error("sstmerge["
+ stmt.sqlstatementtype
+ "][unknow sql type]sqltext:"
);
default:
log.error("[" + stmt.sqlstatementtype
+ "][unknow sql type]sqltext:"
);
break;
}
}
} else {
log.error(sqlParser.sqltext + sqlParser.getErrormessage());
}
if (result.size() > 0) {
resultList = exportParseResultUtil.expResult(result);
}
}
return resultList;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private String optDeclare(String sql,String procName) {
String returnSql=sql;
if(StringUtils.isNotEmpty(sql)){
@ -194,6 +291,7 @@ public class SqlParser {
}
//找出脚本结束的位置
if (procName != null && procName.length()>0){
Pattern lastPattern = Pattern.compile("(END)(\\s)+"+("".equals(procName)?";":procName));
Matcher lastMatcher = lastPattern.matcher(sql);
if(lastMatcher.find()){
@ -218,7 +316,20 @@ public class SqlParser {
returnSql = sql.substring(tempIndexBegin+6, tempIndex);
}
}
}else {
Pattern tempPattern = Pattern.compile("(END)(\\s)*;");
Matcher tempMatcher = tempPattern.matcher(sql);
Pattern tempPatternBegin = Pattern.compile("(\\s)(BEGIN)(\\s)");
Matcher tempMatcherBegin = tempPatternBegin.matcher(sql);
if(tempMatcher.find()){
int tempIndex = tempMatcher.start();
int tempIndexBegin = 0;
if(tempMatcherBegin.find()){
tempIndexBegin = tempMatcherBegin.start();
}
returnSql = sql.substring(tempIndexBegin+6, tempIndex);
}
}
}
return returnSql;
}
@ -250,7 +361,6 @@ public class SqlParser {
return returnVal.toString();
}
private List<KColumn> parseAlterTable(TCustomSqlStatement stmt) {
TAlterTableStatement alterTableStatement=(TAlterTableStatement)stmt;
AlterParser parser=new AlterParser(alterTableStatement,parserContext);

26
src/main/java/com/guozhi/bloodanalysis/parser/utils/ExportParseResultUtil.java

@ -31,6 +31,14 @@ public class ExportParseResultUtil {
log.info("解析结果导出完成");
}
public List<Map<String,String>> expResult(List<KColumn> kColumns) throws Exception{
List<String> result = new ArrayList<>();
for (KColumn tCol : kColumns) {
getOutList(kColumns, tCol, tCol.getRefColumns(), result);
}
return outTable(result);
}
private void outTable(List<String> result, DataLineageInfo dataLineageInfo){
for (String line : result) {
String lines [] = line.split(",");
@ -51,6 +59,24 @@ public class ExportParseResultUtil {
metaBloodAnalysisMapper.insert(metaBloodAnalysis);
}
}
private List<Map<String,String>> outTable(List<String> result){
List<Map<String,String>> list = new ArrayList<>();
for (String line : result) {
String lines [] = line.split(",");
Map<String,String> map = new HashMap<>();
map.put("sourceSysId",lines[0]);
map.put("sourceMdlName",lines[1]);
map.put("sourceTableName",lines[2]);
map.put("sourceColName",lines[3]);
map.put("targetSysId",lines[4]);
map.put("targetMdlName",lines[5]);
String[] arr = lines[6].split("\\.");
String targetTableName = arr[arr.length-1];
map.put("targetTableName",targetTableName);
map.put("targetColName",lines[7]);
}
return list;
}
private void getOutList(List<KColumn> kColumns,KColumn tCol,List<KColumn> sCols,List<String> list){
if(tCol.vColumn){

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

@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.guozhi.bloodanalysis.entity.DataLineageInfo;
import com.guozhi.bloodanalysis.entity.vo.BloodAnalysisBySql;
import com.guozhi.bloodanalysis.mapper.DataLineageInfoMapper;
import com.guozhi.bloodanalysis.mapper.MetaBloodAnalysisMapper;
import com.guozhi.bloodanalysis.parser.SqlParser;
@ -21,7 +22,6 @@ import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -50,8 +50,6 @@ public class BloodAnalysisService {
@Autowired
RedisUtils redisUtils;
// @Autowired
// HttpServletRequest request;
@Async
public void analysis(String dashUserName,String dashPassword) {
@ -107,4 +105,8 @@ public class BloodAnalysisService {
}
}
public List<Map<String, String>> analysisBySQL(BloodAnalysisBySql sqlModel) throws Exception {
SqlParser sqlParser = applicationContext.getBean(SqlParser.class);
return sqlParser.parse(sqlModel.getSql(), sqlModel.getSqlType(), sqlModel.getDefaultSystem(), sqlModel.getDefaultModel());
}
}

Loading…
Cancel
Save