mongo的动态数据源

1,202 阅读1分钟

前文

接着上文说到,数据源的动态支持,对于一些关系数据库都满足的差不多了,但是对于非关系型数据库还是不行,所以咱就增加这么一项功能:

1.支持测试链接
2.支持mongo语句测试
3.支持执行语功能

正文

第一点效果展示 image.png 第二点效果展示

image.png 核心代码 采用的市mongo的基本语法执行器,官网查看

MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
builder.connectTimeout(1000);
builder.maxWaitTime(1000);
builder.socketTimeout(1000);
builder.serverSelectionTimeout(1000);
String url=alertDsConfig.getDsUrl().replace(alertDsConfig.getDsUrl().split("/")[3],"");
url = url.replace("//", "//"+alertDsConfig.getDsUname() + ":" + AesEncryptUtils.decrypt(alertDsConfig.getDsPasswd(), aesSecretKey) + "@");
//将连接的数据库替换为空格 此操作不入库防止认证拦截
MongoClientURI uri = new MongoClientURI(url,builder);
MongoClient mongoClient = new MongoClient(uri);
mongoClient.getConnectPoint();
MongoDatabase database = mongoClient.getDatabase(alertDsConfig.getDsUrl().split("/")[3]);
String queryRegExp = "\.find\((.*?)\)";
Pattern r = Pattern.compile(queryRegExp);
Matcher matcher = r.matcher(sql);
if (!matcher.find()) {
    return R.error("sql不合法");
}
String tableRegExp = "getCollection\('(\w+?)'\)";
String columnNameRegExp = "'(\w+?)':1";
String table = GetWithRegExps(sql, tableRegExp).get(0);
String query = GetWithRegExps(sql, queryRegExp).get(0);
String search = query.split("\},")[0] + "}";
Document doc = new Document();
doc.append("find", table);
if (query.split("\},").length > 1) {
    String show = query.split("\},")[1];
    List<String> columnNames = GetWithRegExps(show, columnNameRegExp);
    Document projection = new Document();
    for (int j = 0; j < columnNames.size(); j++) {
        projection.put(columnNames.get(i), 1);
        doc.append("projection", projection);
    }
}
Document filter = Document.parse(search);
doc.append("filter", filter);
if (StrUtil.isNotEmpty(limit)) {
    doc.append("limit", Integer.valueOf(limit));
}
Document result = database.runCommand(doc);
Map<String, Object> o = (Map<String, Object>) result.get("cursor");
List<LinkedHashMap<String, Object>> mapList = (List<LinkedHashMap<String, Object>>) o.get("firstBatch");
i = mapList.size();
mongoClient.close();