From 62c31297a82541d5e1e46515155c224366ebf890 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Tue, 15 Sep 2015 12:01:40 +0200 Subject: [PATCH] Simplify deletion of a project in PurgeDao - Rename deleteResourceTree to deleteProject - deleteProject only takes a uuid as parameter (instead of a IdUUidPair) --- .../component/ComponentCleanerService.java | 4 +-- .../src/main/java/org/sonar/db/MyBatis.java | 2 -- .../java/org/sonar/db/purge/PurgeDao.java | 36 +++++++------------ .../java/org/sonar/db/purge/PurgeMapper.java | 7 ++-- .../org/sonar/db/purge/PurgeMapper.xml | 10 ++---- .../java/org/sonar/db/purge/PurgeDaoTest.java | 8 +++-- 6 files changed, 26 insertions(+), 41 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java b/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java index ee342adf1ad..943e587f0fd 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java @@ -29,8 +29,6 @@ import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.MyBatis; import org.sonar.db.component.ComponentDto; -import org.sonar.db.purge.IdUuidPair; -import org.sonar.db.purge.PurgeProfiler; import org.sonar.server.issue.index.IssueAuthorizationIndexer; import org.sonar.server.issue.index.IssueIndexer; import org.sonar.server.test.index.TestIndexer; @@ -75,7 +73,7 @@ public class ComponentCleanerService { if (hasNotProjectScope(project) || isNotDeletable(project)) { throw new IllegalArgumentException("Only projects can be deleted"); } - dbClient.purgeDao().deleteResourceTree(dbSession, new IdUuidPair(project.getId(), project.uuid()), new PurgeProfiler()); + dbClient.purgeDao().deleteProject(dbSession, project.uuid()); dbSession.commit(); deleteFromIndices(project.uuid()); diff --git a/sonar-db/src/main/java/org/sonar/db/MyBatis.java b/sonar-db/src/main/java/org/sonar/db/MyBatis.java index dbd1dba7bc4..e8345295856 100644 --- a/sonar-db/src/main/java/org/sonar/db/MyBatis.java +++ b/sonar-db/src/main/java/org/sonar/db/MyBatis.java @@ -96,7 +96,6 @@ import org.sonar.db.permission.PermissionTemplateUserDto; import org.sonar.db.permission.UserWithPermissionDto; import org.sonar.db.property.PropertiesMapper; import org.sonar.db.property.PropertyDto; -import org.sonar.db.purge.IdUuidPair; import org.sonar.db.purge.PurgeMapper; import org.sonar.db.purge.PurgeableSnapshotDto; import org.sonar.db.qualitygate.ProjectQgateAssociationDto; @@ -207,7 +206,6 @@ public class MyBatis { confBuilder.loadAlias("RequirementMigration", RequirementMigrationDto.class); confBuilder.loadAlias("Activity", ActivityDto.class); confBuilder.loadAlias("AnalysisReport", AnalysisReportDto.class); - confBuilder.loadAlias("IdUuidPair", IdUuidPair.class); confBuilder.loadAlias("FilePathWithHash", FilePathWithHashDto.class); confBuilder.loadAlias("UuidWithProjectUuid", UuidWithProjectUuidDto.class); confBuilder.loadAlias("Event", EventDto.class); 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 abd114538ce..75213d7d203 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 @@ -81,13 +81,13 @@ public class PurgeDao implements Dao { deleteOldClosedIssues(conf, mapper); } - private void deleteOldClosedIssues(PurgeConfiguration conf, PurgeMapper mapper) { + private static void deleteOldClosedIssues(PurgeConfiguration conf, PurgeMapper mapper) { Date toDate = conf.maxLiveDateOfClosedIssues(); mapper.deleteOldClosedIssueChanges(conf.rootProjectIdUuid().getUuid(), dateToLong(toDate)); mapper.deleteOldClosedIssues(conf.rootProjectIdUuid().getUuid(), dateToLong(toDate)); } - private void deleteAbortedBuilds(ResourceDto project, PurgeCommands commands) { + private static void deleteAbortedBuilds(ResourceDto project, PurgeCommands commands) { if (hasAbortedBuilds(project.getId(), commands)) { LOG.debug("<- Delete aborted builds"); PurgeSnapshotQuery query = PurgeSnapshotQuery.create() @@ -98,7 +98,7 @@ public class PurgeDao implements Dao { } } - private boolean hasAbortedBuilds(Long projectId, PurgeCommands commands) { + private static boolean hasAbortedBuilds(Long projectId, PurgeCommands commands) { PurgeSnapshotQuery query = PurgeSnapshotQuery.create() .setIslast(false) .setStatus(new String[] {"U"}) @@ -106,7 +106,7 @@ public class PurgeDao implements Dao { return !commands.selectSnapshotIds(query).isEmpty(); } - private void purge(ResourceDto project, String[] scopesWithoutHistoricalData, PurgeCommands purgeCommands) { + private static void purge(ResourceDto project, String[] scopesWithoutHistoricalData, PurgeCommands purgeCommands) { List projectSnapshotIds = purgeCommands.selectSnapshotIds( PurgeSnapshotQuery.create() .setResourceId(project.getId()) @@ -169,18 +169,11 @@ public class PurgeDao implements Dao { return result; } - public PurgeDao deleteResourceTree(IdUuidPair rootIdUuid, PurgeProfiler profiler) { - DbSession session = mybatis.openSession(true); - try { - return deleteResourceTree(session, rootIdUuid, profiler); - } finally { - MyBatis.closeQuietly(session); - } - } - - public PurgeDao deleteResourceTree(DbSession session, IdUuidPair rootIdUuid, PurgeProfiler profiler) { - deleteProject(rootIdUuid, mapper(session), new PurgeCommands(session, profiler)); - deleteFileSources(rootIdUuid.getUuid(), new PurgeCommands(session, profiler)); + public PurgeDao deleteProject(DbSession session, String uuid) { + PurgeProfiler profiler = new PurgeProfiler(); + PurgeCommands purgeCommands = new PurgeCommands(session, profiler); + deleteProject(uuid, mapper(session), purgeCommands); + deleteFileSources(uuid, purgeCommands); return this; } @@ -188,14 +181,9 @@ public class PurgeDao implements Dao { commands.deleteFileSources(rootUuid); } - private static void deleteProject(IdUuidPair rootProjectId, PurgeMapper mapper, PurgeCommands commands) { - List childrenIdUuid = mapper.selectProjectIdUuidsByRootId(rootProjectId.getId()); - for (IdUuidPair childId : childrenIdUuid) { - deleteProject(childId, mapper, commands); - } - - List componentIdUuids = mapper.selectComponentIdUuidsByRootId(rootProjectId.getId()); - commands.deleteResources(componentIdUuids); + private static void deleteProject(String rootUuid, PurgeMapper mapper, PurgeCommands commands) { + List childrenIds = mapper.selectComponentsByProjectUuid(rootUuid); + commands.deleteResources(childrenIds); } private void disableResource(IdUuidPair componentIdUuid, PurgeMapper mapper) { 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 2cc04037aed..e6c8c845fcd 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 @@ -29,9 +29,10 @@ public interface PurgeMapper { List selectSnapshotIdsByResource(@Param("resourceIds") List resourceIds); - List selectProjectIdUuidsByRootId(long rootResourceId); - - List selectComponentIdUuidsByRootId(long rootProjectId); + /** + * Returns the list of components of a project from a project_uuid. The project itself is also returned. + */ + List selectComponentsByProjectUuid(String projectUuid); void deleteSnapshot(@Param("snapshotIds") List snapshotIds); 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 49555dd8ca5..6307b26275b 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 @@ -72,7 +72,7 @@ not exists(select e.id from events e where e.snapshot_id=s.id) - select p.id, p.uuid from projects p where (p.id=#{id} or p.root_id=#{id}) and p.enabled=${_true} and not exists(select s.project_id from snapshots s where s.islast=${_true} and s.project_id=p.id) @@ -82,12 +82,8 @@ select id from metrics where delete_historical_data=${_true} - - - + select id, uuid from projects where project_uuid=#{uuid} diff --git a/sonar-db/src/test/java/org/sonar/db/purge/PurgeDaoTest.java b/sonar-db/src/test/java/org/sonar/db/purge/PurgeDaoTest.java index 84aaa26470a..0ff1acd378f 100644 --- a/sonar-db/src/test/java/org/sonar/db/purge/PurgeDaoTest.java +++ b/sonar-db/src/test/java/org/sonar/db/purge/PurgeDaoTest.java @@ -25,6 +25,7 @@ import org.junit.Test; import org.junit.experimental.categories.Category; import org.sonar.api.resources.Scopes; import org.sonar.api.utils.System2; +import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.test.DbTests; @@ -40,6 +41,8 @@ public class PurgeDaoTest { @Rule public DbTester dbTester = DbTester.create(system2); + DbSession dbSession = dbTester.getSession(); + PurgeDao underTest = dbTester.getDbClient().purgeDao(); @Test @@ -101,9 +104,10 @@ public class PurgeDaoTest { } @Test - public void should_delete_project_and_associated_data() { + public void delete_project_and_associated_data() { dbTester.prepareDbUnit(getClass(), "shouldDeleteProject.xml"); - underTest.deleteResourceTree(new IdUuidPair(1L, "A"), new PurgeProfiler()); + underTest.deleteProject(dbSession, "A"); + dbSession.commit(); assertThat(dbTester.countRowsOfTable("projects")).isZero(); assertThat(dbTester.countRowsOfTable("snapshots")).isZero(); assertThat(dbTester.countRowsOfTable("action_plans")).isZero(); -- 2.39.5