From: Simon Brandhof Date: Mon, 7 Mar 2016 12:44:05 +0000 (+0100) Subject: SONAR-7129 SONAR-7135 optimize SQL requests on MySQL X-Git-Tag: 5.5-M11~129 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=0c0d65aec9621e191245ba7a41baca618129ebbb;p=sonarqube.git SONAR-7129 SONAR-7135 optimize SQL requests on MySQL --- diff --git a/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml b/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml index ebfb03f5e33..8dc2a0e550c 100644 --- a/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml @@ -289,17 +289,18 @@ AND ( - exists ( - select 1 - from resource_index ri - where - ri.resource_id=p.id + p.kee=#{query.nameOrKeyQuery} + OR + p.id IN ( + SELECT ri.resource_id + FROM resource_index ri + WHERE ri.kee like #{query.nameOrKeyQueryToSqlForResourceIndex} ESCAPE '/' AND ri.qualifier in #{qualifier} - AND ri.kee like #{query.nameOrKeyQueryToSqlForResourceIndex} ESCAPE '/') - OR p.kee = #{query.nameOrKeyQuery}) + ) + ) @@ -354,13 +355,20 @@ AND ( - exists ( - select 1 - from resource_index ri - where - (ri.resource_id=p.id OR ri.resource_id=p.copy_resource_id) - AND ri.kee like #{query.nameOrKeyQueryToSqlForResourceIndex} ESCAPE '/') - OR p.kee = #{query.nameOrKeyQuery}) + p.kee=#{query.nameOrKeyQuery} + OR + p.id IN ( + SELECT ri.resource_id + FROM resource_index ri + WHERE ri.kee like #{query.nameOrKeyQueryToSqlForResourceIndex} ESCAPE '/' + ) + OR + p.copy_resource_id IN ( + SELECT ri.resource_id + FROM resource_index ri + WHERE ri.kee like #{query.nameOrKeyQueryToSqlForResourceIndex} ESCAPE '/' + ) + ) diff --git a/sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java b/sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java index edbb597dc98..0d835b443de 100644 --- a/sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java +++ b/sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java @@ -774,8 +774,8 @@ public class ComponentDaoTest { ComponentDto project = newProjectDto().setKey("project-key").setUuid("project-uuid"); SnapshotDto projectSnapshot = componentDb.insertProjectAndSnapshot(project); SnapshotDto moduleSnapshot = componentDb.insertComponentAndSnapshot(newModuleDto("module-1-uuid", project), projectSnapshot); - componentDb.insertComponentAndSnapshot(newFileDto(project, "file-1-uuid").setKey("file-key-1"), projectSnapshot); - componentDb.insertComponentAndSnapshot(newFileDto(project, "file-2-uuid").setKey("file-key-2"), moduleSnapshot); + componentDb.insertComponentAndSnapshot(newFileDto(project, "file-1-uuid").setKey("file-key-1").setName("File one"), projectSnapshot); + componentDb.insertComponentAndSnapshot(newFileDto(project, "file-2-uuid").setKey("file-key-2").setName("File two"), moduleSnapshot); db.commit(); componentDb.indexProjects(); @@ -869,7 +869,7 @@ public class ComponentDaoTest { } @Test - public void select_direct_children_of_a_view() { + public void list_direct_children_of_a_view() { ComponentDto view = newView("view-uuid"); SnapshotDto viewSnapshot = componentDb.insertViewAndSnapshot(view); // one subview @@ -880,6 +880,25 @@ public class ComponentDaoTest { componentDb.insertProjectAndSnapshot(project); componentDb.insertComponentAndSnapshot(newProjectCopy("project-copy-uuid", project, view), viewSnapshot); componentDb.indexProjects(); + ComponentTreeQuery dbQuery = newTreeQuery(viewSnapshot).build(); + + List components = underTest.selectDirectChildren(dbSession, dbQuery); + + assertThat(components).extracting("uuid").containsOnly("project-copy-uuid", "subview-uuid"); + } + + @Test + public void search_direct_children_of_a_view() { + ComponentDto view = newView("view-uuid"); + SnapshotDto viewSnapshot = componentDb.insertViewAndSnapshot(view); + // one subview + ComponentDto subView = newSubView(view, "subview-uuid", "subview-key").setName("subview name"); + componentDb.insertComponentAndSnapshot(subView, viewSnapshot); + // one project and its copy linked to the view + ComponentDto project = newProjectDto("project-uuid").setName("project name"); + componentDb.insertProjectAndSnapshot(project); + componentDb.insertComponentAndSnapshot(newProjectCopy("project-copy-uuid", project, view), viewSnapshot); + componentDb.indexProjects(); ComponentTreeQuery dbQuery = newTreeQuery(viewSnapshot).setNameOrKeyQuery("name").build(); List components = underTest.selectDirectChildren(dbSession, dbQuery);