jsqlparser描述:
JSqlParser 解析 SQL 语句并将其转换为 Java 类的层次结构。基本上的sql关键字和函数都可以被jsqlparser解析成对象层层包装。
实现的功能:
基础sql查询,条件查询,字段和表得别名,排序,分组,聚合,case when,基本上都是有得。
我的使用场景:
将一个表和字段不是数据库直接查询的表字段,进行通过jsqlparser来转换成elasticsearch中存储的表和字段进行到openlokeng中进行查询
界面输入:
openlookeng 执行:
举例:
首先在页面输入:SELECt t1.公司名称 from gxb.新规则表5 t1
然后通过解析后:SELECt eas_file_197_1_1_1_1_1_2.column2 FROM eas_file_197_1_1_1_1_1_2
解析对象:
自定义函数:
实际使用:
@Inject
private metadata metadata;
@Inject
private DataManager dataManager;
@Inject
private TimeSource timeSource;
@Inject
private Logger log;
@Inject
private DataServiceConfig dataServiceConfig;
@Inject
private CustomConfig customConfig;
private static final String CLASSIFY_NAME = "classifyName";
private static final String TABLE_NAME = "tableName";
private static final String TABLE_ALIAS = "tableAlias";
private static final String STATUS = "status";
private static final String SUCCESS = "success";
private static final String FAILED = "failed";
@Override
public Object execute(String sql, UserExt userExt, Page page){
if(Objects.isNull(page)) page = new Page();
long startTime = timeSource.currentTimeMillis();
String operateResult = "执行成功";
Map resultObj = new HashMap<>();
List> jsonArray = new ArrayList<>();
try {
Statements stmts = parseStatements(sql);
Page finalPage = page;
stmts.getStatements().forEach(stmt -> {
if (stmt instanceof Select) {
executeSelect(stmt,finalPage,jsonArray);
}
});
resultObj.put("data", jsonArray);
resultObj.put(STATUS, SUCCESS);
} catch (JSQLParserException e) {
operateResult = "执行失败,输入SQL语法错误";
resultObj.put(STATUS, FAILED);
throw new SQLParserException("输入SQL语法错误",e);
}catch (Exception e){
operateResult = "执行失败,接口处理异常";
resultObj.put(STATUS, FAILED);
throw new SQLParserException("接口处理异常",e);
}finally {
saveOperateHistory(sql, userExt, startTime, operateResult);
}
return resultObj;
}
private void executeSelect(Statement stmt, Page finalPage, List> jsonArray) {
Map tempMap = parseSelectSql((Select) stmt, finalPage);
String paramSql = formatSql((String) tempMap.get("sql"));
List tables = (List) tempMap.get("tables");
Map config = getDataServiceConfig(tables.get(0));
String database = config.get("database");
String schemaName = config.get("schema");
log.info("数据服务入参:");
log.info("sql: {}", paramSql);
log.info("database: {} | schemaName: {}", database, schemaName);
if(Objects.isNull(database) || Objects.isNull(schemaName) ){
throw new SQLParserException("database 或 schema 为空 ");
}
Page resultPage = (Page) tempMap.get("page");
RunQueryResponse response = invokeDataService(database, schemaName, paramSql);
if(resultPage.isSelectAll()){
resultPage.setTotalCount(response.getTotal().longValue());
resultPage.setPageCount(getPageCount(response.getTotal().longValue(), finalPage.getPageSize()));
}
resultPage.setList(response.getResult());
HashMap objHashMap = new HashMap<>();
tempMap.put("page", resultPage);
objHashMap.put("metas", tempMap);
jsonArray.add(objHashMap);
}
private Map getDataServiceConfig(SqlStatementEasTableVo entity) {
EasTable easTable = getEasTable(entity.getClassifyName(), entity.getName());
Map resultMap = new HashMap<>();
if(Objects.nonNull(easTable)){
String database = Objects.isNull(easTable.getDatabase()) ? "" : easTable.getDatabase().getAlias();
String schema = easTable.getSchema().getSchema().getName();
resultMap.put("database", database);
resultMap.put("schema", schema);
}
return resultMap;
}
private List parseSelectItem(PlainSelect selectBody, List