diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2015-05-04 16:41:00 +0200 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2015-05-04 16:50:33 +0200 |
commit | 251f4d5bce46fb9b57895e90c86e0e3dfbeb4bba (patch) | |
tree | 6b320f720d340aa563522b7d88d673d17ba0b311 /server | |
parent | 437be6c974d4de7691e630ab2f9f026e34059cce (diff) | |
download | sonarqube-251f4d5bce46fb9b57895e90c86e0e3dfbeb4bba.tar.gz sonarqube-251f4d5bce46fb9b57895e90c86e0e3dfbeb4bba.zip |
SONAR-6464 Optimize query that return file source hashes in /batch/project WS
Diffstat (limited to 'server')
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"); |