diff options
author | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2016-06-28 17:51:53 +0200 |
---|---|---|
committer | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2016-07-04 15:20:29 +0200 |
commit | acb655ff30cad999efcd21dafe556429bbb54d11 (patch) | |
tree | 8c863fc258bc03270f61d7fa081d680c607c0324 /sonar-db/src | |
parent | 1fee723699376696a3abdafc12c6edc25872dfd0 (diff) | |
download | sonarqube-acb655ff30cad999efcd21dafe556429bbb54d11.tar.gz sonarqube-acb655ff30cad999efcd21dafe556429bbb54d11.zip |
SONAR-7705 take deleteAnalyses out of PurgeCommands.deleteComponents
Diffstat (limited to 'sonar-db/src')
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" |