From a42e0a794703ef9b8c9c0ab7d849df3b720fdc43 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Mon, 29 Jan 2018 17:49:14 +0100 Subject: [PATCH] SONAR-10052 fix N+1 syndrome when loading profile descendants --- .../db/qualityprofile/QualityProfileDao.java | 19 ++++--- .../qualityprofile/QualityProfileMapper.java | 2 +- .../qualityprofile/QualityProfileMapper.xml | 9 ++-- .../qualityprofile/QualityProfileDaoTest.java | 52 ++++++++++++++++++- .../server/qualityprofile/RuleActivator.java | 8 ++- .../qualityprofile/ws/DeleteAction.java | 12 +++-- .../qualityprofile/ws/InheritanceAction.java | 5 +- ...gisterQualityProfilesNotificationTest.java | 15 +++--- 8 files changed, 89 insertions(+), 33 deletions(-) diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java index 8820d57cad0..1a1d7701ae1 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java @@ -38,6 +38,7 @@ import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import static com.google.common.base.Preconditions.checkArgument; +import static java.util.Collections.emptyList; import static org.sonar.db.DatabaseUtils.executeLargeInputs; import static org.sonar.db.DatabaseUtils.executeLargeUpdates; @@ -148,19 +149,21 @@ public class QualityProfileDao implements Dao { return mapper(dbSession).selectByLanguage(organization.getUuid(), language); } - public List selectChildren(DbSession dbSession, QProfileDto profile) { - return mapper(dbSession).selectChildren(profile.getKee()); + public List selectChildren(DbSession dbSession, Collection profiles) { + List uuids = profiles.stream().map(QProfileDto::getKee).collect(MoreCollectors.toArrayList(profiles.size())); + return DatabaseUtils.executeLargeInputs(uuids, chunk -> mapper(dbSession).selectChildren(chunk)); } /** - * All descendants, in the top-down order. + * All descendants, in any order. The specified profiles are not included into results. */ - public List selectDescendants(DbSession dbSession, QProfileDto profile) { - List descendants = new ArrayList<>(); - for (QProfileDto child : selectChildren(dbSession, profile)) { - descendants.add(child); - descendants.addAll(selectDescendants(dbSession, child)); + public Collection selectDescendants(DbSession dbSession, Collection profiles) { + if (profiles.isEmpty()) { + return emptyList(); } + Collection children = selectChildren(dbSession, profiles); + List descendants = new ArrayList<>(children); + descendants.addAll(selectDescendants(dbSession, children)); return descendants; } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileMapper.java index 5dcb7fc1a61..fd3751cc09a 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileMapper.java @@ -76,7 +76,7 @@ public interface QualityProfileMapper { // INHERITANCE - List selectChildren(String uuid); + List selectChildren(@Param("uuids") Collection uuids); // PROJECTS diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml index e7f433fb441..2bbeecc2b0b 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml @@ -201,14 +201,15 @@ and oqp.organization_uuid = #{organizationUuid, jdbcType=VARCHAR} +