]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-15828 Refactor `ProjectDao#selectApplicationsByKeys` to use `executeLargeInputs...
authorKlaudio Sinani <klaudio.sinani@sonarsource.com>
Mon, 24 Jan 2022 15:34:29 +0000 (16:34 +0100)
committersonartech <sonartech@sonarsource.com>
Tue, 25 Jan 2022 20:03:05 +0000 (20:03 +0000)
server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java
server/sonar-db-dao/src/test/java/org/sonar/db/project/ProjectDaoTest.java

index 4167cead120e174db191aed8db96ebeb821a8339..a8e8e5dfe1bbb296f60db4663225238206d40a47 100644 (file)
@@ -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<ProjectDto> selectProjects(DbSession session) {
index 9bb9a1e00c88f0856806005d13b273c4b7a54935..1bcfedea58d592c9af30e3b3efc07c829e08bb3b 100644 (file)
  */
 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<ProjectDto>();
+
+    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<String> applicationsId = new HashSet<>();
+
+    List<Tuple> 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<ProjectDto> 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("");