aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2015-05-04 16:41:00 +0200
committerJulien Lancelot <julien.lancelot@sonarsource.com>2015-05-04 16:50:33 +0200
commit251f4d5bce46fb9b57895e90c86e0e3dfbeb4bba (patch)
tree6b320f720d340aa563522b7d88d673d17ba0b311 /server
parent437be6c974d4de7691e630ab2f9f026e34059cce (diff)
downloadsonarqube-251f4d5bce46fb9b57895e90c86e0e3dfbeb4bba.tar.gz
sonarqube-251f4d5bce46fb9b57895e90c86e0e3dfbeb4bba.zip
SONAR-6464 Optimize query that return file source hashes in /batch/project WS
Diffstat (limited to 'server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/batch/ProjectRepositoryLoader.java15
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java4
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/component/db/ComponentDaoTest.java25
3 files changed, 39 insertions, 5 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/batch/ProjectRepositoryLoader.java b/server/sonar-server/src/main/java/org/sonar/server/batch/ProjectRepositoryLoader.java
index baac3ce42b2..1f463b5a253 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/batch/ProjectRepositoryLoader.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/batch/ProjectRepositoryLoader.java
@@ -56,7 +56,11 @@ import org.sonar.server.user.UserSession;
import javax.annotation.Nullable;
-import java.util.*;
+import java.util.Collections;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Maps.newHashMap;
@@ -110,7 +114,10 @@ public class ProjectRepositoryLoader implements ServerComponent {
TreeModuleSettings treeModuleSettings = new TreeModuleSettings(moduleUuidsByKey, moduleIdsByKey, modulesTree, modulesTreeSettings, module);
addSettingsToChildrenModules(ref, query.getModuleKey(), Maps.<String, String>newHashMap(), treeModuleSettings, hasScanPerm, session);
- addFileData(session, ref, modulesTree, module.uuid());
+ List<FilePathWithHashDto> files = module.isRootProject() ?
+ dbClient.componentDao().selectEnabledFilesFromProject(session, module.uuid()) :
+ dbClient.componentDao().selectEnabledDescendantFiles(session, module.uuid());
+ addFileData(session, ref, modulesTree, files);
// FIXME need real value but actually only used to know if there is a previous analysis in local issue tracking mode so any value is
// ok
@@ -282,13 +289,13 @@ public class ProjectRepositoryLoader implements ServerComponent {
}
}
- private void addFileData(DbSession session, ProjectRepositories ref, List<ComponentDto> moduleChildren, String moduleKey) {
+ private void addFileData(DbSession session, ProjectRepositories ref, List<ComponentDto> moduleChildren, List<FilePathWithHashDto> files) {
Map<String, String> moduleKeysByUuid = newHashMap();
for (ComponentDto module : moduleChildren) {
moduleKeysByUuid.put(module.uuid(), module.key());
}
- for (FilePathWithHashDto file : dbClient.componentDao().selectEnabledDescendantFiles(session, moduleKey)) {
+ for (FilePathWithHashDto file : files) {
// TODO should query E/S to know if blame is missing on this file
FileData fileData = new FileData(file.getSrcHash(), true);
ref.addFileData(moduleKeysByUuid.get(file.getModuleUuid()), file.getPath(), fileData);
diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java b/server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java
index 6f41f9280ae..c6cdff23f41 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java
@@ -107,6 +107,10 @@ public class ComponentDao extends BaseDao<ComponentMapper, ComponentDto, String>
return mapper(session).selectDescendantFiles(rootComponentUuid, Scopes.FILE, true);
}
+ public List<FilePathWithHashDto> selectEnabledFilesFromProject(DbSession session, String rootComponentUuid) {
+ return mapper(session).selectEnabledFilesFromProject(rootComponentUuid);
+ }
+
public List<ComponentDto> getByIds(final DbSession session, Collection<Long> ids) {
return DaoUtils.executeLargeInputs(ids, new Function<List<Long>, List<ComponentDto>>() {
@Override
diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/db/ComponentDaoTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/db/ComponentDaoTest.java
index 8c55ee6ce1d..6f62417470b 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/component/db/ComponentDaoTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/component/db/ComponentDaoTest.java
@@ -383,7 +383,7 @@ public class ComponentDaoTest extends AbstractDaoTestCase {
}
@Test
- public void select_enabled_module_files_tree() throws Exception {
+ public void select_enabled_module_files_tree_from_module() throws Exception {
setupData("select_module_files_tree");
// From root project
@@ -414,6 +414,29 @@ public class ComponentDaoTest extends AbstractDaoTestCase {
}
@Test
+ public void select_enabled_module_files_tree_from_project() throws Exception {
+ setupData("select_module_files_tree");
+
+ // From root project
+ List<FilePathWithHashDto> files = dao.selectEnabledFilesFromProject(session, "ABCD");
+ assertThat(files).extracting("uuid").containsOnly("EFGHI", "HIJK");
+ assertThat(files).extracting("moduleUuid").containsOnly("EFGH", "FGHI");
+ assertThat(files).extracting("srcHash").containsOnly("srcEFGHI", "srcHIJK");
+ assertThat(files).extracting("path").containsOnly("src/org/struts/pom.xml", "src/org/struts/RequestContext.java");
+
+ // From module
+ assertThat(dao.selectEnabledFilesFromProject(session, "EFGH")).isEmpty();
+
+ // From sub module
+ assertThat(dao.selectEnabledFilesFromProject(session, "FGHI")).isEmpty();
+
+ // From directory
+ assertThat(dao.selectEnabledFilesFromProject(session, "GHIJ")).isEmpty();
+
+ assertThat(dao.selectEnabledFilesFromProject(session, "unknown")).isEmpty();
+ }
+
+ @Test
public void insert() {
when(system2.now()).thenReturn(DateUtils.parseDate("2014-06-18").getTime());
setupData("empty");