提交 fb244ef8 authored 作者: Matrix's avatar Matrix

refactor(SQL执行器): 代码优化

上级 066c0cf7
......@@ -4,11 +4,13 @@ import cn.hutool.core.util.ReUtil;
import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.matrix.actuators.usecase.CaseActuator;
import org.matrix.actuators.httpclient.HttpClientActuator;
import org.matrix.actuators.Actuator;
import org.matrix.actuators.datasource.DataSourceDTO;
import org.matrix.actuators.datasource.IDataSourceService;
import org.matrix.actuators.httpclient.HttpClientActuator;
import org.matrix.actuators.httpclient.HttpRequestDetail;
import org.matrix.actuators.httpclient.HttpResponseDetail;
import org.matrix.actuators.usecase.CaseActuator;
import org.matrix.config.HttpRequestConfig;
import org.matrix.database.entity.DynamicVariable;
import org.matrix.database.entity.Example;
......@@ -17,8 +19,6 @@ import org.matrix.database.service.IConnectService;
import org.matrix.database.service.IDynamicVariableService;
import org.matrix.database.service.IExampleService;
import org.matrix.database.service.ITestCaseService;
import org.matrix.actuators.httpclient.HttpRequestDetail;
import org.matrix.actuators.httpclient.HttpResponseDetail;
import org.matrix.enums.DynamicVarType;
import org.matrix.exception.GlobalException;
import org.springframework.context.annotation.Lazy;
......@@ -102,51 +102,58 @@ public class SqlExpActuator implements Actuator {
private String parseVar(Long envId, Integer takenIndex, Long projectId, DynamicVariable dynamicVar) {
DynamicVarType varType = dynamicVar.getType();
log.info("[SQL解析器] 当前解析的动态变量是: {}", JSON.toJSONString(dynamicVar));
// 1.如果是常量则直接返回
// 依据变量类型的不同调用不同的Handler
if (varType == CONSTANT_VARIABLE) {
return dynamicVar.getDetail();
} else if (varType == SQL_VARIABLE) {
return handleSqlVar(envId, takenIndex, projectId, dynamicVar);
} else if (varType == HTTP_VARIABLE) {
return handleHttpVar(envId, projectId, dynamicVar);
} else if (varType == CASE_VARIABLE) {
return handleCaseVar(envId, projectId, dynamicVar);
} else {
throw new GlobalException("不支持的动态变量类型: " + varType);
}
// 2.如果是SQL变量,则需要解析SQL
if (varType == SQL_VARIABLE) {
// 首先替换掉#{id}这类的共享变量(如果有的话)
String sqlExp = dynamicVar.getSqlExpDetail().getSqlExp();
sqlExp = replaceEnvVar(sqlExp, envId);
List<SqlRegObject> dynamicVarList = findDynamicVarList(dynamicVar.getDetail());
// 解析SQL表达式,判断是可以直接执行的SQL还是需要再递归解析动态变量
if (isEmpty(dynamicVarList)) {
// 如果查到的动态变量列表为空,则直接执行SQL
List<Map<String, Object>> resultList = runSql(dynamicVar, envId);
return takenResultString(resultList, dynamicVar.getTakenField(), Math.toIntExact(takenIndex));
} else {
// 如果还存在动态变量,则继续递归解析
for (SqlRegObject sqlReg : dynamicVarList) {
DynamicVariable recVar = varService.getByName(sqlReg.getVarName(), projectId)
.orElseThrow(() -> new GlobalException(
String.format("没有找到项目id = %d 下,name = %s的变量", projectId, sqlReg.getVarName())));
String calculatedValue = parseVar(envId, sqlReg.getIndex(), projectId, recVar);
sqlExp = sqlExp.replaceAll(sqlReg.getVarName(), calculatedValue);
}
// 将里面的动态变量全部计算完替换之后返回出去
return sqlExp;
}
private String handleCaseVar(Long envId, Long projectId, DynamicVariable dynamicVar) {
CaseActuator caseActuator = new CaseActuator(envId, projectId);
long caseId = Long.parseLong(dynamicVar.getDetail());
TestCase testCase = Optional.of(caseService.getById(caseId))
.orElseThrow(() -> new GlobalException(String.format("没有找到id = %d 的TestCase", caseId)));
HttpResponseDetail responseDetail = (HttpResponseDetail) caseActuator.executeTestCase(testCase).getBaseTestCaseRequestDetail();
return responseDetail.getResponseBody();
}
private String handleHttpVar(Long envId, Long projectId, DynamicVariable dynamicVar) {
HttpClientActuator httpClient = new HttpClientActuator(new HttpRequestConfig(), envId, projectId);
HttpRequestDetail httpRequestDetail = JSON.parseObject(dynamicVar.getDetail(), HttpRequestDetail.class);
return httpClient.sendHttpRequest(httpRequestDetail).getResponseBody();
}
private String handleSqlVar(Long envId, Integer takenIndex, Long projectId, DynamicVariable dynamicVar) {
// 首先替换掉#{id}这类的共享变量(如果有的话)
String sqlExp = dynamicVar.getSqlExpDetail().getSqlExp();
sqlExp = replaceEnvVar(sqlExp, envId);
List<SqlRegObject> dynamicVarList = findDynamicVarList(dynamicVar.getDetail());
// 解析SQL表达式,判断是可以直接执行的SQL还是需要再递归解析动态变量
if (isEmpty(dynamicVarList)) {
// 如果查到的动态变量列表为空,则直接执行SQL
List<Map<String, Object>> resultList = runSql(dynamicVar, envId);
return takenResultString(resultList, dynamicVar.getTakenField(), Math.toIntExact(takenIndex));
} else {
// 如果还存在动态变量,则继续递归解析
for (SqlRegObject sqlReg : dynamicVarList) {
DynamicVariable recVar = varService.getByName(sqlReg.getVarName(), projectId)
.orElseThrow(() -> new GlobalException(
String.format("没有找到项目id = %d 下,name = %s的变量", projectId, sqlReg.getVarName())));
String calculatedValue = parseVar(envId, sqlReg.getIndex(), projectId, recVar);
sqlExp = sqlExp.replaceAll(sqlReg.getVarName(), calculatedValue);
}
// 将里面的动态变量全部计算完替换之后返回出去
return sqlExp;
}
// 3.如果是HTTP接口,则调用http接口
if (varType == HTTP_VARIABLE) {
HttpClientActuator httpClient = new HttpClientActuator(new HttpRequestConfig(), envId, projectId);
HttpRequestDetail httpRequestDetail = JSON.parseObject(dynamicVar.getDetail(), HttpRequestDetail.class);
return httpClient.sendHttpRequest(httpRequestDetail).getResponseBody();
}
// 4.如果是测试用例,则调用测试用例执行器
if (varType == CASE_VARIABLE) {
CaseActuator caseActuator = new CaseActuator(envId, projectId);
long caseId = Long.parseLong(dynamicVar.getDetail());
TestCase testCase = Optional.of(caseService.getById(caseId))
.orElseThrow(() -> new GlobalException(String.format("没有找到id = %d 的TestCase", caseId)));
HttpResponseDetail responseDetail = (HttpResponseDetail) caseActuator.executeTestCase(testCase).getBaseTestCaseRequestDetail();
return responseDetail.getResponseBody();
}
return "";
}
/**
......
package org.matrix.testNg;
/**
* DataProvider.
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2021/12/27 at 6:01 PM
* Suffering is the most powerful teacher of life.
*/
public class DataProvider {
}
......@@ -84,15 +84,6 @@
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论