]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7129 SONAR-7135 optimize SQL requests on MySQL
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Mon, 7 Mar 2016 12:44:05 +0000 (13:44 +0100)
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Wed, 16 Mar 2016 17:01:14 +0000 (18:01 +0100)
sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml
sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java

index ebfb03f5e33dec375c12920bb23f0a118c302001..8dc2a0e550cfcad43515ce20ccf62e4bce3d6fb6 100644 (file)
       </if>
       <if test="query.nameOrKeyQuery!=null">
         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
             <foreach collection="query.qualifiers" item="qualifier" open="(" close=")" separator=",">
               #{qualifier}
             </foreach>
-            AND ri.kee like #{query.nameOrKeyQueryToSqlForResourceIndex} ESCAPE '/')
-          OR p.kee = #{query.nameOrKeyQuery})
+          )
+        )
       </if>
     </where>
   </sql>
     </if>
     <if test="query.nameOrKeyQuery!=null">
       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 '/'
+        )
+      )
     </if>
   </sql>
 
index edbb597dc98c92fa3cd605637cfa9585eeab1c16..0d835b443def8211ecbe24c1ce09f68ac76a96a8 100644 (file)
@@ -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<ComponentDtoWithSnapshotId> 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<ComponentDtoWithSnapshotId> components = underTest.selectDirectChildren(dbSession, dbQuery);