aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-db/src
diff options
context:
space:
mode:
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>2016-06-28 17:51:53 +0200
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>2016-07-04 15:20:29 +0200
commitacb655ff30cad999efcd21dafe556429bbb54d11 (patch)
tree8c863fc258bc03270f61d7fa081d680c607c0324 /sonar-db/src
parent1fee723699376696a3abdafc12c6edc25872dfd0 (diff)
downloadsonarqube-acb655ff30cad999efcd21dafe556429bbb54d11.tar.gz
sonarqube-acb655ff30cad999efcd21dafe556429bbb54d11.zip
SONAR-7705 take deleteAnalyses out of PurgeCommands.deleteComponents
Diffstat (limited to 'sonar-db/src')
-rw-r--r--sonar-db/src/main/java/org/sonar/db/purge/PurgeCommands.java40
-rw-r--r--sonar-db/src/main/java/org/sonar/db/purge/PurgeDao.java1
-rw-r--r--sonar-db/src/main/java/org/sonar/db/purge/PurgeMapper.java8
-rw-r--r--sonar-db/src/main/resources/org/sonar/db/purge/PurgeMapper.xml30
-rw-r--r--sonar-db/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java25
-rw-r--r--sonar-db/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldDeleteResource.xml20
6 files changed, 101 insertions, 23 deletions
diff --git a/sonar-db/src/main/java/org/sonar/db/purge/PurgeCommands.java b/sonar-db/src/main/java/org/sonar/db/purge/PurgeCommands.java
index 222fe42cf70..27248d17ce9 100644
--- a/sonar-db/src/main/java/org/sonar/db/purge/PurgeCommands.java
+++ b/sonar-db/src/main/java/org/sonar/db/purge/PurgeCommands.java
@@ -54,6 +54,10 @@ class PurgeCommands {
return purgeMapper.selectSnapshotIdsAndUuids(query).stream().map(IdUuidPair::getUuid).collect(Collectors.toList());
}
+ void deleteAnalyses(String rootUuid) {
+ deleteAnalyses(purgeMapper.selectSnapshotIdsAndUuids(PurgeSnapshotQuery.create().setComponentUuid(rootUuid)));
+ }
+
void deleteComponents(List<IdUuidPair> componentIdUuids) {
List<List<Long>> componentIdPartitions = Lists.partition(IdUuidPairs.ids(componentIdUuids), MAX_RESOURCES_PER_QUERY);
List<List<String>> componentUuidsPartitions = Lists.partition(IdUuidPairs.uuids(componentIdUuids), MAX_RESOURCES_PER_QUERY);
@@ -61,10 +65,6 @@ class PurgeCommands {
// voluntarily grouped by tables in order to benefit from JDBC batch mode.
// Batch requests can only relate to the same PreparedStatement.
- for (List<String> componentUuidPartition : componentUuidsPartitions) {
- deleteSnapshots(purgeMapper.selectSnapshotIdAndUuidsByComponent(componentUuidPartition));
- }
-
// possible missing optimization: filter requests according to resource scope
profiler.start("deleteResourceLinks (project_links)");
@@ -181,6 +181,38 @@ class PurgeCommands {
profiler.stop();
}
+ @VisibleForTesting
+ protected void deleteAnalyses(List<IdUuidPair> analysisIdUuids) {
+ List<List<Long>> snapshotIdsPartition = Lists.partition(IdUuidPairs.ids(analysisIdUuids), MAX_SNAPSHOTS_PER_QUERY);
+ List<List<String>> snapshotUuidsPartition = Lists.partition(IdUuidPairs.uuids(analysisIdUuids), MAX_SNAPSHOTS_PER_QUERY);
+
+ deleteSnapshotDuplications(snapshotUuidsPartition);
+
+ profiler.start("deleteAnalyses (events)");
+ for (List<String> partSnapshotUuids : snapshotUuidsPartition) {
+ purgeMapper.deleteSnapshotEvents(partSnapshotUuids);
+ }
+ session.commit();
+ profiler.stop();
+
+ profiler.start("deleteAnalyses (project_measures)");
+ for (List<Long> partSnapshotIds : snapshotIdsPartition) {
+ purgeMapper.deleteSnapshotMeasures(partSnapshotIds);
+ }
+ session.commit();
+ profiler.stop();
+
+ profiler.start("deleteAnalyses (snapshots)");
+ for (List<String> partSnapshotUuids : snapshotUuidsPartition) {
+ purgeMapper.deleteAnalyses(partSnapshotUuids);
+ }
+ for (List<Long> snapshotIdPartition : snapshotIdsPartition) {
+ purgeMapper.deleteDescendantSnapshots(snapshotIdPartition);
+ }
+ session.commit();
+ profiler.stop();
+ }
+
void purgeSnapshots(PurgeSnapshotQuery... queries) {
// use LinkedHashSet to keep order by remove duplicated ids
LinkedHashSet<IdUuidPair> snapshotIds = Sets.newLinkedHashSet(from(asList(queries))
diff --git a/sonar-db/src/main/java/org/sonar/db/purge/PurgeDao.java b/sonar-db/src/main/java/org/sonar/db/purge/PurgeDao.java
index 489017dd01a..286404d8909 100644
--- a/sonar-db/src/main/java/org/sonar/db/purge/PurgeDao.java
+++ b/sonar-db/src/main/java/org/sonar/db/purge/PurgeDao.java
@@ -151,6 +151,7 @@ public class PurgeDao implements Dao {
private static void deleteProject(String rootUuid, PurgeMapper mapper, PurgeCommands commands) {
List<IdUuidPair> childrenIds = mapper.selectComponentsByProjectUuid(rootUuid);
+ commands.deleteAnalyses(rootUuid);
commands.deleteComponents(childrenIds);
commands.deleteFileSources(rootUuid);
commands.deleteCeActivity(rootUuid);
diff --git a/sonar-db/src/main/java/org/sonar/db/purge/PurgeMapper.java b/sonar-db/src/main/java/org/sonar/db/purge/PurgeMapper.java
index 2c2b5298739..a66f2d959f6 100644
--- a/sonar-db/src/main/java/org/sonar/db/purge/PurgeMapper.java
+++ b/sonar-db/src/main/java/org/sonar/db/purge/PurgeMapper.java
@@ -27,14 +27,16 @@ public interface PurgeMapper {
List<IdUuidPair> selectSnapshotIdsAndUuids(PurgeSnapshotQuery query);
- List<IdUuidPair> selectSnapshotIdAndUuidsByComponent(@Param("componentUuids") List<String> componentUuids);
-
/**
* Returns the list of components of a project from a project_uuid. The project itself is also returned.
*/
List<IdUuidPair> selectComponentsByProjectUuid(String projectUuid);
- void deleteSnapshot(@Param("snapshotIds") List<Long> snapshotIds);
+ void deleteAnalyses(@Param("analysisUuids") List<String> analysisUuids);
+
+ void deleteDescendantSnapshots(@Param("snapshotIds") List<Long> snapshotIds);
+
+ void deleteSnapshot(@Param("snapshotUuids") List<String> snapshotUuids);
void deleteSnapshotDuplications(@Param("analysisUuids") List<String> analysisUuids);
diff --git a/sonar-db/src/main/resources/org/sonar/db/purge/PurgeMapper.xml b/sonar-db/src/main/resources/org/sonar/db/purge/PurgeMapper.xml
index ecbbda75bbc..39914441ae8 100644
--- a/sonar-db/src/main/resources/org/sonar/db/purge/PurgeMapper.xml
+++ b/sonar-db/src/main/resources/org/sonar/db/purge/PurgeMapper.xml
@@ -46,18 +46,6 @@
</where>
</select>
- <select id="selectSnapshotIdAndUuidsByComponent" parameterType="map" resultType="IdUuidPair">
- select
- s.id as id, s.uuid as uuid
- from
- snapshots s
- where
- s.component_uuid in
- <foreach collection="componentUuids" open="(" close=")" item="componentUuid" separator=",">
- #{componentUuid}
- </foreach>
- </select>
-
<select id="selectPurgeableAnalysesWithEvents" parameterType="String" resultType="PurgeableAnalysis">
select
s.uuid as "analysisUuid", s.created_at as "date", ${_true} as "hasEvents", islast as "isLast"
@@ -131,6 +119,24 @@
</foreach>
</delete>
+ <delete id="deleteAnalyses" parameterType="map">
+ delete from snapshots
+ where
+ uuid in
+ <foreach collection="analysisUuids" open="(" close=")" item="analysisUuid" separator=",">
+ #{analysisUuid}
+ </foreach>
+ </delete>
+
+ <delete id="deleteDescendantSnapshots" parameterType="map">
+ delete from snapshots
+ where
+ root_snapshot_id in
+ <foreach collection="snapshotIds" open="(" close=")" item="snapshotId" separator=",">
+ #{snapshotId}
+ </foreach>
+ </delete>
+
<delete id="deleteSnapshotWastedMeasures" parameterType="map">
delete from project_measures
<where>
diff --git a/sonar-db/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java b/sonar-db/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java
index 0f97b1c41c1..81ffbc99a4b 100644
--- a/sonar-db/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java
+++ b/sonar-db/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java
@@ -88,19 +88,36 @@ public class PurgeCommandsTest {
}
@Test
- public void shouldDeleteResource() {
+ public void shouldDeleteComponentsAndChildrenTables() {
dbTester.prepareDbUnit(getClass(), "shouldDeleteResource.xml");
- new PurgeCommands(dbTester.getSession(), profiler).deleteComponents(newArrayList(new IdUuidPair(1L, "uuid_1")));
+ PurgeCommands purgeCommands = new PurgeCommands(dbTester.getSession(), profiler);
+ purgeCommands.deleteComponents(newArrayList(new IdUuidPair(1L, "uuid_1")));
assertThat(dbTester.countRowsOfTable("projects")).isZero();
- assertThat(dbTester.countRowsOfTable("snapshots")).isZero();
- assertThat(dbTester.countRowsOfTable("events")).isZero();
+ assertThat(dbTester.countRowsOfTable("snapshots")).isEqualTo(1);
+ assertThat(dbTester.countRowsOfTable("events")).isEqualTo(2);
assertThat(dbTester.countRowsOfTable("issues")).isZero();
assertThat(dbTester.countRowsOfTable("issue_changes")).isZero();
assertThat(dbTester.countRowsOfTable("authors")).isZero();
}
+
+ @Test
+ public void shouldDeleteAnalyses() {
+ dbTester.prepareDbUnit(getClass(), "shouldDeleteResource.xml");
+
+ PurgeCommands purgeCommands = new PurgeCommands(dbTester.getSession(), profiler);
+ purgeCommands.deleteAnalyses("uuid_1");
+
+ assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(1);
+ assertThat(dbTester.countRowsOfTable("snapshots")).isZero();
+ assertThat(dbTester.countRowsOfTable("events")).isEqualTo(0);
+ assertThat(dbTester.countRowsOfTable("issues")).isEqualTo(1);
+ assertThat(dbTester.countRowsOfTable("issue_changes")).isEqualTo(1);
+ assertThat(dbTester.countRowsOfTable("authors")).isEqualTo(2);
+ }
+
/**
* Test that SQL queries execution do not fail with a huge number of parameter
*/
diff --git a/sonar-db/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldDeleteResource.xml b/sonar-db/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldDeleteResource.xml
index fc649ec3664..8fc495eb985 100644
--- a/sonar-db/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldDeleteResource.xml
+++ b/sonar-db/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldDeleteResource.xml
@@ -57,6 +57,26 @@
created_at="1228222680000"
event_data="[null]"/>
+ <events id="2"
+ analysis_uuid="u1"
+ component_uuid="[null]"
+ name="Version 1.0"
+ category="VERSION"
+ description="[null]"
+ event_date="1228222680000"
+ created_at="1228222680000"
+ event_data="[null]"/>
+
+ <events id="3"
+ analysis_uuid="u1"
+ component_uuid="[null]"
+ name="Version 1.0"
+ category="VERSION"
+ description="[null]"
+ event_date="1228222680000"
+ created_at="1228222680000"
+ event_data="[null]"/>
+
<issues id="1"
kee="ABCDE"
component_uuid="uuid_1"