From dcd83ed960518f9250bd90d548a9f18a9913261f Mon Sep 17 00:00:00 2001 From: Klaudio Sinani Date: Mon, 24 Jan 2022 16:34:29 +0100 Subject: [PATCH] SONAR-15828 Refactor `ProjectDao#selectApplicationsByKeys` to use `executeLargeInputs` method. --- .../java/org/sonar/db/project/ProjectDao.java | 5 ++- .../org/sonar/db/project/ProjectDaoTest.java | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java index 4167cead120..a8e8e5dfe1b 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java @@ -29,6 +29,8 @@ import org.sonar.db.DbSession; import org.sonar.db.audit.AuditPersister; import org.sonar.db.audit.model.ComponentNewValue; +import static org.sonar.db.DatabaseUtils.executeLargeInputs; + public class ProjectDao implements Dao { private final System2 system2; private final AuditPersister auditPersister; @@ -76,7 +78,8 @@ public class ProjectDao implements Dao { if (keys.isEmpty()) { return Collections.emptyList(); } - return mapper(session).selectApplicationsByKeys(keys); + + return executeLargeInputs(keys, partition -> mapper(session).selectApplicationsByKeys(partition)); } public List selectProjects(DbSession session) { diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/project/ProjectDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/project/ProjectDaoTest.java index 9bb9a1e00c8..1bcfedea58d 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/project/ProjectDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/project/ProjectDaoTest.java @@ -19,12 +19,16 @@ */ package org.sonar.db.project; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; import javax.annotation.Nullable; +import org.assertj.core.groups.Tuple; import org.junit.Rule; import org.junit.Test; import org.sonar.api.impl.utils.AlwaysIncreasingSystem2; @@ -109,6 +113,34 @@ public class ProjectDaoTest { tuple("projectName_p1", "projectKee_o2_p1", "uuid_o2_p1", "desc_p1", "tag1,tag2", false)); } + @Test + public void select_applications_by_keys() { + var applications = new ArrayList(); + + for (int i = 0; i < 1500; i++) { + ProjectDto project = db.components().insertPrivateProjectDto(); + ProjectDto app = db.components().insertPrivateApplicationDto(); + db.components().addApplicationProject(app, project); + applications.add(i, app); + } + + Set applicationsId = new HashSet<>(); + + List applicationsData = applications + .stream() + .map(x -> { + applicationsId.add(x.getKey()); + return tuple(x.getKey(), x.getName(), x.getUuid(), x.getDescription(), x.isPrivate()); + }) + .collect(Collectors.toList()); + + List selectedApplications = projectDao.selectApplicationsByKeys(db.getSession(), applicationsId); + + assertThat(selectedApplications) + .extracting(ProjectDto::getKey, ProjectDto::getName, ProjectDto::getUuid, ProjectDto::getDescription, ProjectDto::isPrivate) + .containsExactlyInAnyOrderElementsOf(applicationsData); + } + @Test public void update_tags() { ProjectDto dto1 = createProject("o1", "p1").setTagsString(""); -- 2.39.5