refactor: 版本查询优化

This commit is contained in:
zhangdahai112 2022-01-22 17:02:31 +08:00 committed by jianxing
parent 1aa2f94833
commit 7adb8aeeee
19 changed files with 414 additions and 503 deletions

View File

@ -65,5 +65,7 @@ public class TestCase implements Serializable {
private String refId;
private Byte latest;
private static final long serialVersionUID = 1L;
}

View File

@ -2133,6 +2133,66 @@ public class TestCaseExample {
addCriterion("ref_id not between", value1, value2, "refId");
return (Criteria) this;
}
public Criteria andLatestIsNull() {
addCriterion("latest is null");
return (Criteria) this;
}
public Criteria andLatestIsNotNull() {
addCriterion("latest is not null");
return (Criteria) this;
}
public Criteria andLatestEqualTo(Byte value) {
addCriterion("latest =", value, "latest");
return (Criteria) this;
}
public Criteria andLatestNotEqualTo(Byte value) {
addCriterion("latest <>", value, "latest");
return (Criteria) this;
}
public Criteria andLatestGreaterThan(Byte value) {
addCriterion("latest >", value, "latest");
return (Criteria) this;
}
public Criteria andLatestGreaterThanOrEqualTo(Byte value) {
addCriterion("latest >=", value, "latest");
return (Criteria) this;
}
public Criteria andLatestLessThan(Byte value) {
addCriterion("latest <", value, "latest");
return (Criteria) this;
}
public Criteria andLatestLessThanOrEqualTo(Byte value) {
addCriterion("latest <=", value, "latest");
return (Criteria) this;
}
public Criteria andLatestIn(List<Byte> values) {
addCriterion("latest in", values, "latest");
return (Criteria) this;
}
public Criteria andLatestNotIn(List<Byte> values) {
addCriterion("latest not in", values, "latest");
return (Criteria) this;
}
public Criteria andLatestBetween(Byte value1, Byte value2) {
addCriterion("latest between", value1, value2, "latest");
return (Criteria) this;
}
public Criteria andLatestNotBetween(Byte value1, Byte value2) {
addCriterion("latest not between", value1, value2, "latest");
return (Criteria) this;
}
}
public static class Criteria extends GeneratedCriteria {

View File

@ -32,6 +32,7 @@
<result column="case_public" jdbcType="BIT" property="casePublic" />
<result column="version_id" jdbcType="VARCHAR" property="versionId" />
<result column="ref_id" jdbcType="VARCHAR" property="refId" />
<result column="latest" jdbcType="TINYINT" property="latest" />
</resultMap>
<resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="io.metersphere.base.domain.TestCaseWithBLOBs">
<result column="prerequisite" jdbcType="LONGVARCHAR" property="prerequisite" />
@ -103,7 +104,7 @@
id, node_id, test_id, node_path, project_id, `name`, `type`, maintainer, priority,
`method`, create_time, update_time, sort, num, other_test_name, review_status, tags,
demand_id, demand_name, `status`, step_model, custom_num, create_user, original_status,
delete_time, delete_user_id, `order`, case_public, version_id, ref_id
delete_time, delete_user_id, `order`, case_public, version_id, ref_id, latest
</sql>
<sql id="Blob_Column_List">
prerequisite, remark, steps, step_description, expected_result, custom_fields
@ -167,8 +168,8 @@
custom_num, create_user, original_status,
delete_time, delete_user_id, `order`,
case_public, version_id, ref_id,
prerequisite, remark, steps,
step_description, expected_result,
latest, prerequisite, remark,
steps, step_description, expected_result,
custom_fields)
values (#{id,jdbcType=VARCHAR}, #{nodeId,jdbcType=VARCHAR}, #{testId,jdbcType=VARCHAR},
#{nodePath,jdbcType=VARCHAR}, #{projectId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR},
@ -180,8 +181,8 @@
#{customNum,jdbcType=VARCHAR}, #{createUser,jdbcType=VARCHAR}, #{originalStatus,jdbcType=VARCHAR},
#{deleteTime,jdbcType=BIGINT}, #{deleteUserId,jdbcType=VARCHAR}, #{order,jdbcType=BIGINT},
#{casePublic,jdbcType=BIT}, #{versionId,jdbcType=VARCHAR}, #{refId,jdbcType=VARCHAR},
#{prerequisite,jdbcType=LONGVARCHAR}, #{remark,jdbcType=LONGVARCHAR}, #{steps,jdbcType=LONGVARCHAR},
#{stepDescription,jdbcType=LONGVARCHAR}, #{expectedResult,jdbcType=LONGVARCHAR},
#{latest,jdbcType=TINYINT}, #{prerequisite,jdbcType=LONGVARCHAR}, #{remark,jdbcType=LONGVARCHAR},
#{steps,jdbcType=LONGVARCHAR}, #{stepDescription,jdbcType=LONGVARCHAR}, #{expectedResult,jdbcType=LONGVARCHAR},
#{customFields,jdbcType=LONGVARCHAR})
</insert>
<insert id="insertSelective" parameterType="io.metersphere.base.domain.TestCaseWithBLOBs">
@ -277,6 +278,9 @@
<if test="refId != null">
ref_id,
</if>
<if test="latest != null">
latest,
</if>
<if test="prerequisite != null">
prerequisite,
</if>
@ -387,6 +391,9 @@
<if test="refId != null">
#{refId,jdbcType=VARCHAR},
</if>
<if test="latest != null">
#{latest,jdbcType=TINYINT},
</if>
<if test="prerequisite != null">
#{prerequisite,jdbcType=LONGVARCHAR},
</if>
@ -506,6 +513,9 @@
<if test="record.refId != null">
ref_id = #{record.refId,jdbcType=VARCHAR},
</if>
<if test="record.latest != null">
latest = #{record.latest,jdbcType=TINYINT},
</if>
<if test="record.prerequisite != null">
prerequisite = #{record.prerequisite,jdbcType=LONGVARCHAR},
</if>
@ -561,6 +571,7 @@
case_public = #{record.casePublic,jdbcType=BIT},
version_id = #{record.versionId,jdbcType=VARCHAR},
ref_id = #{record.refId,jdbcType=VARCHAR},
latest = #{record.latest,jdbcType=TINYINT},
prerequisite = #{record.prerequisite,jdbcType=LONGVARCHAR},
remark = #{record.remark,jdbcType=LONGVARCHAR},
steps = #{record.steps,jdbcType=LONGVARCHAR},
@ -602,7 +613,8 @@
`order` = #{record.order,jdbcType=BIGINT},
case_public = #{record.casePublic,jdbcType=BIT},
version_id = #{record.versionId,jdbcType=VARCHAR},
ref_id = #{record.refId,jdbcType=VARCHAR}
ref_id = #{record.refId,jdbcType=VARCHAR},
latest = #{record.latest,jdbcType=TINYINT}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
@ -697,6 +709,9 @@
<if test="refId != null">
ref_id = #{refId,jdbcType=VARCHAR},
</if>
<if test="latest != null">
latest = #{latest,jdbcType=TINYINT},
</if>
<if test="prerequisite != null">
prerequisite = #{prerequisite,jdbcType=LONGVARCHAR},
</if>
@ -749,6 +764,7 @@
case_public = #{casePublic,jdbcType=BIT},
version_id = #{versionId,jdbcType=VARCHAR},
ref_id = #{refId,jdbcType=VARCHAR},
latest = #{latest,jdbcType=TINYINT},
prerequisite = #{prerequisite,jdbcType=LONGVARCHAR},
remark = #{remark,jdbcType=LONGVARCHAR},
steps = #{steps,jdbcType=LONGVARCHAR},
@ -787,7 +803,8 @@
`order` = #{order,jdbcType=BIGINT},
case_public = #{casePublic,jdbcType=BIT},
version_id = #{versionId,jdbcType=VARCHAR},
ref_id = #{refId,jdbcType=VARCHAR}
ref_id = #{refId,jdbcType=VARCHAR},
latest = #{latest,jdbcType=TINYINT}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper>

View File

@ -180,28 +180,9 @@
<property name="objectKey" value="request.combine.tags"/>
</include>
</if>
<if test="request.versionId != null">
and ad.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and ad.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
ad.version_id = (SELECT project_version.id
FROM api_definition tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = ad.ref_id
LIMIT 1)
OR
ad.version_id = (SELECT tmp.version_id
FROM api_definition tmp
WHERE ref_id = ad.ref_id
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="ad"/>
</include>
<if test="request.filters != null and request.filters.size() > 0">
<foreach collection="request.filters.entrySet()" index="key" item="values">
<if test="values != null and values.size() > 0">
@ -439,30 +420,9 @@
#{nodeId}
</foreach>
</if>
<if test="request.versionId != null">
and atc.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and atc.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
atc.version_id = (SELECT project_version.id
FROM api_scenario tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = atc.ref_id
LIMIT 1)
OR
atc.version_id = (SELECT tmp.version_id
FROM api_scenario tmp
WHERE ref_id = atc.ref_id
GROUP BY ref_id
HAVING max(latest) = 0
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="atc"/>
</include>
<if test="request.combine != null">
<include refid="scenarioCombine">
<property name="condition" value="request.combine"/>
@ -513,30 +473,9 @@
and (atc.name like CONCAT('%', #{request.name},'%')
or atc.num like CONCAT('%', #{request.name},'%'))
</if>
<if test="request.versionId != null">
and atc.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and atc.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
atc.version_id = (SELECT project_version.id
FROM load_test tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = atc.ref_id
LIMIT 1)
OR
atc.version_id = (SELECT tmp.version_id
FROM load_test tmp
WHERE ref_id = atc.ref_id
GROUP BY ref_id
HAVING max(latest) = 0
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="atc"/>
</include>
<if test="request.combine != null">
<include refid="loadCaseCombine">
<property name="condition" value="request.combine"/>
@ -594,4 +533,16 @@
<include refid="Update_By_Example_Where_Clause" />
</if>
</update>
<sql id="queryVersionCondition">
<if test="request.versionId != null">
and ${versionTable}.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and ${versionTable}.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND ${versionTable}.latest = 1
</if>
</sql>
</mapper>

View File

@ -475,39 +475,9 @@
)
)
</if>
<if test="request.versionId != null">
and api_definition.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and api_definition.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
version_id = (SELECT project_version.id
FROM api_definition tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = api_definition.ref_id
LIMIT 1)
OR
version_id = (SELECT project_version.id
FROM api_definition tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id AND NOT EXISTS(SELECT ref_id
FROM api_definition tmp2
JOIN project_version
ON tmp2.project_id =
project_version.project_id AND
version_id =
project_version.id AND
latest = TRUE
WHERE tmp.ref_id = tmp2.ref_id)
WHERE tmp.ref_id = api_definition.ref_id
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="api_definition"/>
</include>
</where>
<if test="request.orders != null and request.orders.size() > 0">
order by
@ -743,39 +713,9 @@
and api_definition.id in
(SELECT api_definition_id FROM api_test_case)
</if>
<if test="request.refId != null">
AND ref_id = #{request.refId}
</if>
<if test="request.versionId != null">
AND version_id = #{request.versionId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
version_id = (SELECT project_version.id
FROM api_definition tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = api_definition.ref_id
LIMIT 1)
OR
version_id = (SELECT project_version.id
FROM api_definition tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id AND NOT EXISTS(SELECT ref_id
FROM api_definition tmp2
JOIN project_version
ON tmp2.project_id =
project_version.project_id AND
version_id =
project_version.id AND
latest = TRUE
WHERE tmp.ref_id = tmp2.ref_id)
WHERE tmp.ref_id = api_definition.ref_id
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="api_definition"/>
</include>
</where>
</sql>
@ -843,39 +783,9 @@
and api_definition.id in
(SELECT api_definition_id FROM api_test_case)
</if>
<if test="request.refId != null">
AND ref_id = #{request.refId}
</if>
<if test="request.versionId != null">
AND version_id = #{request.versionId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
version_id = (SELECT project_version.id
FROM api_definition tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = api_definition.ref_id
LIMIT 1)
OR
version_id = (SELECT project_version.id
FROM api_definition tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id AND NOT EXISTS(SELECT ref_id
FROM api_definition tmp2
JOIN project_version
ON tmp2.project_id =
project_version.project_id AND
version_id =
project_version.id AND
latest = TRUE
WHERE tmp.ref_id = tmp2.ref_id)
WHERE tmp.ref_id = api_definition.ref_id
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="api_definition"/>
</include>
</where>
</sql>
@ -950,4 +860,16 @@
<include refid="io.metersphere.base.mapper.ApiDefinitionMapper.Example_Where_Clause"/>
</if>
</select>
<sql id="queryVersionCondition">
<if test="request.versionId != null">
and ${versionTable}.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and ${versionTable}.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND ${versionTable}.latest = 1
</if>
</sql>
</mapper>

View File

@ -318,39 +318,9 @@
where pc.test_plan_id = #{request.planId}
)
</if>
<if test="request.refId != null">
AND ref_id = #{request.refId}
</if>
<if test="request.versionId != null">
AND version_id = #{request.versionId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
version_id = (SELECT project_version.id
FROM api_scenario tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = api_scenario.ref_id
LIMIT 1)
OR
version_id = (SELECT project_version.id
FROM api_scenario tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id AND NOT EXISTS(SELECT ref_id
FROM api_scenario tmp2
JOIN project_version
ON tmp2.project_id =
project_version.project_id AND
version_id =
project_version.id AND
latest = TRUE
WHERE tmp.ref_id = tmp2.ref_id)
WHERE tmp.ref_id = api_scenario.ref_id
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="api_scenario"/>
</include>
</where>
</sql>
@ -674,4 +644,16 @@
LEFT JOIN project on api_scenario.project_id = project.id
WHERE api_scenario.id = #{id}
</select>
<sql id="queryVersionCondition">
<if test="request.versionId != null">
and ${versionTable}.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and ${versionTable}.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND ${versionTable}.latest = 1
</if>
</sql>
</mapper>

View File

@ -419,29 +419,9 @@
<if test="request.toUpdate !=null and request.toUpdate == true">
and (t1.update_time >= #{request.updateTime} or t2.status = 'error')
</if>
<if test="request.versionId != null">
AND t1.version_id = #{request.versionId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
t1.version_id = (SELECT project_version.id
FROM api_definition tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = a.ref_id
LIMIT 1)
OR
t1.version_id = (SELECT project_version.id
FROM api_definition tmp
JOIN project_version ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id
WHERE ref_id = a.ref_id
GROUP BY ref_id
HAVING MAX(latest) = 0
ORDER BY MAX(project_version.create_time) DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="t1"/>
</include>
GROUP BY t1.id,
t1.project_id,
t1.name,
@ -787,4 +767,16 @@
#{v}
</foreach>
</update>
<sql id="queryVersionCondition">
<if test="request.versionId != null">
and ${versionTable}.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and ${versionTable}.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND ${versionTable}.latest = 1
</if>
</sql>
</mapper>

View File

@ -166,39 +166,9 @@
</if>
</foreach>
</if>
<if test="request.refId != null">
AND ref_id = #{request.refId}
</if>
<if test="request.versionId != null">
AND version_id = #{request.versionId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
version_id = (SELECT project_version.id
FROM load_test tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = load_test.ref_id
LIMIT 1)
OR
version_id = (SELECT project_version.id
FROM load_test tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id AND NOT EXISTS(SELECT ref_id
FROM load_test tmp2
JOIN project_version
ON tmp2.project_id =
project_version.project_id AND
version_id =
project_version.id AND
latest = TRUE
WHERE tmp.ref_id = tmp2.ref_id)
WHERE tmp.ref_id = load_test.ref_id
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="load_test"/>
</include>
</where>
<if test="request.orders != null and request.orders.size() > 0">
ORDER BY
@ -305,4 +275,16 @@
</if>
order by `order` desc limit 1;
</select>
<sql id="queryVersionCondition">
<if test="request.versionId != null">
and ${versionTable}.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and ${versionTable}.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND ${versionTable}.latest = 1
</if>
</sql>
</mapper>

View File

@ -30,21 +30,9 @@
#{apiId}
</foreach>
</if>
<if test="request.refId != null">
AND api.ref_id = #{request.refId}
</if>
<if test="request.versionId != null">
AND api.version_id = #{request.versionId}
</if>
<if test="request.versionId == null and request.refId == null">
AND api.version_id = (SELECT project_version.id
FROM api_definition tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id
WHERE ref_id = api.ref_id
ORDER BY project_version.create_time DESC
LIMIT 1)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="api"/>
</include>
<if test="request.orderCondition == 'createTimeDesc'">
ORDER BY api.create_time DESC
</if>
@ -67,4 +55,15 @@
</where>
</select>
<sql id="queryVersionCondition">
<if test="request.versionId != null">
and ${versionTable}.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and ${versionTable}.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND ${versionTable}.latest = 1
</if>
</sql>
</mapper>

View File

@ -83,7 +83,7 @@ public interface ExtTestCaseMapper {
List<TrackCountResult> countRelevance(@Param("projectId") String projectId);
long countRelevanceCreatedThisWeek(@Param("projectId") String projectId,@Param("firstDayTimestamp") long firstDayTimestamp, @Param("lastDayTimestamp") long lastDayTimestamp);
long countRelevanceCreatedThisWeek(@Param("projectId") String projectId, @Param("firstDayTimestamp") long firstDayTimestamp, @Param("lastDayTimestamp") long lastDayTimestamp);
int countCoverage(@Param("projectId") String projectId);
@ -92,13 +92,15 @@ public interface ExtTestCaseMapper {
List<TrackCountResult> countRelevanceMaintainer(@Param("projectId") String projectId);
int getTestPlanBug(@Param("planId") String planId);
int getTestPlanCase(@Param("planId") String planId);
int getTestPlanPassCase(@Param("planId") String planId);
List<TestCaseDTO> listForMinder(@Param("request") QueryTestCaseRequest request);
List<TestCaseDTO> getTestCaseByIds(@Param("ids")List<String> ids);
List<TestCaseDTO> getTestCaseByIds(@Param("ids") List<String> ids);
void updateTestCaseCustomNumByProjectId(@Param("projectId") String projectId);
@ -124,7 +126,7 @@ public interface ExtTestCaseMapper {
List<String> getIdsOrderByUpdateTime(@Param("projectId") String projectId);
Long getLastOrder(@Param("projectId")String projectId, @Param("baseOrder") Long baseOrder);
Long getLastOrder(@Param("projectId") String projectId, @Param("baseOrder") Long baseOrder);
Long getPreOrder(@Param("projectId") String projectId, @Param("baseOrder") Long baseOrder);
@ -139,4 +141,10 @@ public interface ExtTestCaseMapper {
int countByWorkSpaceId(String workSpaceId);
long trashCount(@Param("projectId") String projectId);
int addLatestVersion(@Param("refId") String refId);
int clearLatestVersion(@Param("refId") String refId);
int setLatestVersion(@Param("refId") String refId, @Param("versionId") String versionId);
}

View File

@ -126,39 +126,9 @@
#{nodeId}
</foreach>
</if>
<if test="request.versionId != null">
and test_case.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and test_case.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
version_id = (SELECT project_version.id
FROM test_case tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = test_case.ref_id
LIMIT 1)
OR
version_id = (SELECT project_version.id
FROM test_case tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id AND NOT EXISTS(SELECT ref_id
FROM test_case tmp2
JOIN project_version
ON tmp2.project_id =
project_version.project_id AND
version_id =
project_version.id AND
latest = TRUE
WHERE tmp.ref_id = tmp2.ref_id)
WHERE tmp.ref_id = test_case.ref_id
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="test_case"/>
</include>
<include refid="filters"/>
</where>
</sql>
@ -642,39 +612,9 @@
<if test="request.caseCoverage == 'coverage' ">
and test_case.id in (select distinct test_case_test.test_case_id from test_case_test)
</if>
<if test="request.versionId != null">
and test_case.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and test_case.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
version_id = (SELECT project_version.id
FROM test_case tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = test_case.ref_id
LIMIT 1)
OR
version_id = (SELECT project_version.id
FROM test_case tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id AND NOT EXISTS(SELECT ref_id
FROM test_case tmp2
JOIN project_version
ON tmp2.project_id =
project_version.project_id AND
version_id =
project_version.id AND
latest = TRUE
WHERE tmp.ref_id = tmp2.ref_id)
WHERE tmp.ref_id = test_case.ref_id
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="test_case"/>
</include>
</where>
</sql>
@ -733,39 +673,9 @@
<if test="request.caseCoverage == 'coverage' ">
and test_case.id in (select distinct test_case_test.test_case_id from test_case_test)
</if>
<if test="request.versionId != null">
and test_case.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and test_case.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
version_id = (SELECT project_version.id
FROM test_case tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = test_case.ref_id
LIMIT 1)
OR
version_id = (SELECT project_version.id
FROM test_case tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id AND NOT EXISTS(SELECT ref_id
FROM test_case tmp2
JOIN project_version
ON tmp2.project_id =
project_version.project_id AND
version_id =
project_version.id AND
latest = TRUE
WHERE tmp.ref_id = tmp2.ref_id)
WHERE tmp.ref_id = test_case.ref_id
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="test_case"/>
</include>
</where>
</sql>
@ -1057,4 +967,61 @@
AND STATUS = 'Trash'
</select>
<sql id="queryVersionCondition">
<if test="request.versionId != null">
and ${versionTable}.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and ${versionTable}.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND ${versionTable}.latest = 1
</if>
</sql>
<update id="addLatestVersion">
UPDATE test_case
INNER JOIN (
SELECT
test_case.*
FROM
test_case
LEFT JOIN project_version ON test_case.version_id = project_version.id
<where>
<if test="refId != null">
ref_id = #{refId}
</if>
</where>
GROUP BY
ref_id
HAVING
max(test_case.latest) = 0
ORDER BY
project_version.create_time desc
LIMIT 1
) t
ON test_case.id = t.id
SET test_case.latest = 1
</update>
<update id="clearLatestVersion">
UPDATE test_case
SET latest = 0
<where>
<if test="refId != null">
and ref_id = #{refId}
</if>
</where>
</update>
<update id="setLatestVersion">
UPDATE test_case
SET latest = 1
<where>
<if test="refId != null">
ref_id = #{refId}
</if>
</where>
AND version_id = #{versionId}
</update>
</mapper>

View File

@ -139,32 +139,9 @@
</if>
</foreach>
</if>
<if test="request.versionId != null">
and a.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and a.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
a.version_id = (SELECT project_version.id
FROM api_definition tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = a.ref_id
LIMIT 1)
OR
a.version_id = (SELECT project_version.id
FROM api_definition tmp
JOIN project_version ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id
WHERE ref_id = a.ref_id
GROUP BY ref_id
HAVING MAX(latest) = 0
ORDER BY MAX(project_version.create_time) DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="a"/>
</include>
<if test="request.orders != null and request.orders.size() > 0">
order by
<foreach collection="request.orders" separator="," item="order">
@ -371,4 +348,16 @@
</if>
order by `order` desc limit 1;
</select>
<sql id="queryVersionCondition">
<if test="request.versionId != null">
and ${versionTable}.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and ${versionTable}.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND ${versionTable}.latest = 1
</if>
</sql>
</mapper>

View File

@ -193,32 +193,9 @@
</foreach>
</if>
</where>
<if test="request.versionId != null">
and lt.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and lt.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
lt.version_id = (SELECT project_version.id
FROM load_test tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = lt.ref_id
LIMIT 1)
OR
lt.version_id = (SELECT project_version.id
FROM load_test tmp
JOIN project_version ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id
WHERE ref_id = lt.ref_id
GROUP BY ref_id
HAVING MAX(latest) = 0
ORDER BY MAX(project_version.create_time) DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="lt"/>
</include>
<if test="request.orders != null and request.orders.size() > 0">
order by
<foreach collection="request.orders" separator="," item="order">
@ -371,4 +348,16 @@
set status = null
where id = #{0}
</update>
<sql id="queryVersionCondition">
<if test="request.versionId != null">
and ${versionTable}.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and ${versionTable}.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND ${versionTable}.latest = 1
</if>
</sql>
</mapper>

View File

@ -171,39 +171,9 @@
<if test="request.method != null">
and test_case.method = #{request.method}
</if>
<if test="request.versionId != null">
and test_case.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and test_case.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
version_id = (SELECT project_version.id
FROM test_case tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = test_case.ref_id
LIMIT 1)
OR
version_id = (SELECT project_version.id
FROM test_case tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id AND NOT EXISTS(SELECT ref_id
FROM test_case tmp2
JOIN project_version
ON tmp2.project_id =
project_version.project_id AND
version_id =
project_version.id AND
latest = TRUE
WHERE tmp.ref_id = tmp2.ref_id)
WHERE tmp.ref_id = test_case.ref_id
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="test_case"/>
</include>
and (test_case.status != 'Trash' or test_case.status is null)
<include refid="filter"/>
</where>
@ -585,4 +555,16 @@
</if>
order by `order` desc limit 1;
</select>
<sql id="queryVersionCondition">
<if test="request.versionId != null">
and ${versionTable}.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and ${versionTable}.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND ${versionTable}.latest = 1
</if>
</sql>
</mapper>

View File

@ -167,39 +167,9 @@
<if test="request.method != null">
and test_case.method = #{request.method}
</if>
<if test="request.versionId != null">
and test_case.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and test_case.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND (
version_id = (SELECT project_version.id
FROM test_case tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
WHERE ref_id = test_case.ref_id
LIMIT 1)
OR
version_id = (SELECT project_version.id
FROM test_case tmp
JOIN project_version
ON tmp.project_id = project_version.project_id AND
tmp.version_id = project_version.id AND NOT EXISTS(SELECT ref_id
FROM test_case tmp2
JOIN project_version
ON tmp2.project_id =
project_version.project_id AND
version_id =
project_version.id AND
latest = TRUE
WHERE tmp.ref_id = tmp2.ref_id)
WHERE tmp.ref_id = test_case.ref_id
ORDER BY tmp.update_time DESC
LIMIT 1)
)
</if>
<include refid="queryVersionCondition">
<property name="versionTable" value="test_case"/>
</include>
<include refid="filter"/>
</where>
</sql>
@ -492,4 +462,16 @@
</if>
order by `order` desc limit 1;
</select>
<sql id="queryVersionCondition">
<if test="request.versionId != null">
and ${versionTable}.version_id = #{request.versionId}
</if>
<if test="request.refId != null">
and ${versionTable}.ref_id = #{request.refId}
</if>
<if test="request.versionId == null and request.refId == null and request.id == null">
AND ${versionTable}.latest = 1
</if>
</sql>
</mapper>

View File

@ -0,0 +1,8 @@
package io.metersphere.commons.constants;
public class VersionConstants {
//最新版本
public static Byte LATEST = 1;
//非最新版本 可以不用设置数据库 default = 0
public static Byte NOT_LATEST = 0;
}

View File

@ -22,6 +22,7 @@ import io.metersphere.base.mapper.ext.ExtTestCaseMapper;
import io.metersphere.commons.constants.TestCaseConstants;
import io.metersphere.commons.constants.TestCaseReviewStatus;
import io.metersphere.commons.constants.UserGroupType;
import io.metersphere.commons.constants.VersionConstants;
import io.metersphere.commons.exception.MSException;
import io.metersphere.commons.user.SessionUser;
import io.metersphere.commons.utils.*;
@ -206,7 +207,8 @@ public class TestCaseService {
//从版本选择直接创建
request.setRefId(request.getId());
}
//完全新增一条记录直接就是最新
request.setLatest(VersionConstants.LATEST);
testCaseMapper.insert(request);
saveFollows(request.getId(), request.getFollows());
return request;
@ -306,9 +308,11 @@ public class TestCaseService {
testCase.setCreateUser(SessionUtils.getUserId());
testCase.setOrder(oldTestCase.getOrder());
testCase.setRefId(oldTestCase.getRefId());
testCase.setLatest(null);
DealWithOtherInfo(testCase, oldTestCase.getId());
testCaseMapper.insertSelective(testCase);
}
checkAndSetLatestVersion(testCase.getRefId(), testCase.getVersionId(), testCase.getProjectId());
}
/**
@ -2490,6 +2494,30 @@ public class TestCaseService {
if (CollectionUtils.isNotEmpty(testCaseList)) {
testCaseMapper.deleteByExample(e);
}
//检查最新版本
checkAndSetLatestVersion(refId, version, testCaseList.get(0).getProjectId());
}
/**
* 检查设置最新版本
*
* @param refId
* @param versionId
*/
private void checkAndSetLatestVersion(String refId, String versionId, String projectId) {
TestCaseExample e = new TestCaseExample();
e.createCriteria().andRefIdEqualTo(refId).andLatestEqualTo(VersionConstants.LATEST);
//如果因为删除导致没有了最新的版本则按照版本创建顺序选择一个版本为最新版本
if (testCaseMapper.countByExample(e) == 0) {
extTestCaseMapper.addLatestVersion(refId);
} else {
//已经存在了最新版本 但是要判断这个所谓的最新版本是否是版本管理里面最新版本
String latestVersion = extProjectVersionMapper.getDefaultVersion(projectId);
if (StringUtils.equals(versionId, latestVersion)) {
extTestCaseMapper.clearLatestVersion(refId);
extTestCaseMapper.setLatestVersion(refId, versionId);
}
}
}
public void deleteTestCasePublic(String versionId, String refId) {

View File

@ -195,4 +195,56 @@ ALTER TABLE `test_plan_report_content` ADD COLUMN `error_report_cases` LONGTEXT
ALTER TABLE `test_plan_report_content` ADD COLUMN `error_report_scenarios` LONGTEXT COMMENT '误报状态场景用例';
-- 缺陷相关配置
ALTER TABLE project ADD issue_config TEXT NULL;
ALTER TABLE project
ADD issue_config TEXT NULL;
-- 增加 latest 字段优化最新版本查询
ALTER TABLE test_case
ADD latest tinyint DEFAULT 0 COMMENT '是否为最新版本 0:否1:是';
ALTER TABLE api_definition
ADD latest tinyint DEFAULT 0 COMMENT '是否为最新版本 0:否1:是';
ALTER TABLE api_scenario
ADD latest tinyint DEFAULT 0 COMMENT '是否为最新版本 0:否1:是';
ALTER TABLE load_test
ADD latest tinyint DEFAULT 0 COMMENT '是否为最新版本 0:否1:是';
-- 设置最新版本的数据
UPDATE test_case
SET latest = 1
WHERE version_id = (
SELECT id
FROM project_version
WHERE project_version.project_id = test_case.project_id
AND project_version.latest = 1
);
UPDATE api_definition
SET latest = 1
WHERE version_id = (
SELECT id
FROM project_version
WHERE project_version.project_id = api_definition.project_id
AND project_version.latest = 1
);
UPDATE api_scenario
SET latest = 1
WHERE version_id = (
SELECT id
FROM project_version
WHERE project_version.project_id = api_scenario.project_id
AND project_version.latest = 1
);
UPDATE load_test
SET latest = 1
WHERE version_id = (
SELECT id
FROM project_version
WHERE project_version.project_id = load_test.project_id
AND project_version.latest = 1
);

View File

@ -23,7 +23,6 @@
ref="versionHistory"
:version-data="versionData"
:current-id="currentTestCaseInfo.id"
:is-test-case-version="true"
@confirmOtherInfo="confirmOtherInfo"
:current-project-id="currentProjectId"
@compare="compare" @checkout="checkout" @create="create" @del="del"/>