]> source.dussan.org Git - sonarqube.git/commitdiff
[NO-JIRA] Optimize query for 'ncloc' metric for largest branch per project
authorJacek Poreda <jacek.poreda@sonarsource.com>
Mon, 20 Feb 2023 11:05:32 +0000 (12:05 +0100)
committersonartech <sonartech@sonarsource.com>
Tue, 21 Feb 2023 12:02:56 +0000 (12:02 +0000)
server/sonar-db-dao/src/main/java/org/sonar/db/measure/LiveMeasureDao.java
server/sonar-db-dao/src/main/java/org/sonar/db/measure/LiveMeasureMapper.java
server/sonar-db-dao/src/main/resources/org/sonar/db/measure/LiveMeasureMapper.xml
server/sonar-db-dao/src/test/java/org/sonar/db/measure/LiveMeasureDaoTest.java

index 17441f112367f1e4153129793d0f7cb07eccc82f..9f04ff22b5e6b0da806ba6f4a84dcefcf9740bfd 100644 (file)
@@ -105,8 +105,8 @@ public class LiveMeasureDao implements Dao {
     return ncloc == null ? 0L : ncloc;
   }
 
-  public List<LargestBranchNclocDto> getLargestBranchNclocPerProject(DbSession dbSession) {
-    return mapper(dbSession).getLargestBranchNclocPerProject();
+  public List<LargestBranchNclocDto> getLargestBranchNclocPerProject(DbSession dbSession, String nclocMetricUuid) {
+    return mapper(dbSession).getLargestBranchNclocPerProject(nclocMetricUuid);
   }
 
   public List<ProjectLocDistributionDto> selectLargestBranchesLocDistribution(DbSession session, String nclocUuid, String nclocDistributionUuid) {
index 5891b136fd76e6457215611254e49f45e786bca4..e93f7742a246ff315aed69169902067752b43e9f 100644 (file)
@@ -62,7 +62,7 @@ public interface LiveMeasureMapper {
     @Param("private") Boolean privateProject,
     @Nullable @Param("projectUuidToExclude") String projectUuidToExclude);
 
-  List<LargestBranchNclocDto> getLargestBranchNclocPerProject();
+  List<LargestBranchNclocDto> getLargestBranchNclocPerProject(@Param("nclocUuid") String nclocUuid);
 
   List<ProjectLocDistributionDto> selectLargestBranchesLocDistribution(@Param("nclocUuid") String nclocUuid, @Param("nclocDistributionUuid") String nclocDistributionUuid);
 
index 23d5ba24e3651e8a6c8e1e9920b2127228446689..c4d49599fc1c389da9f241bd8c4a45143cbd3962 100644 (file)
   </select>
 
   <select id="getLargestBranchNclocPerProject" parameterType="map" resultType="LargestBranchNclocDto">
-    select tie_breaker.projectUuid,
-    tie_breaker.projectName,
-    tie_breaker.projectKey,
-    ncloc as loc,
-    pb.kee as branchName,
-    pb.branch_type as branchType
-      from
-        (select counter.projectUuid as projectUuid,
-          counter.maxncloc ncloc,
-          min(br.uuid) as branchUuid,
-          counter.projectName,
-          counter.projectKey
-          from
-            (select b.project_uuid as projectUuid,
-              p.name as projectName,
-              p.kee as projectKey,
-              max(lm.value) as maxncloc
-                from live_measures lm
-                inner join metrics m on m.uuid = lm.metric_uuid
-                inner join project_branches b on b.uuid = lm.component_uuid
-                inner join projects p on p.uuid = b.project_uuid and p.qualifier = 'TRK'
-                where m.name = 'ncloc'
-                group by b.project_uuid, p.name, p.kee) counter
-          inner join live_measures lmo on lmo.value = counter.maxncloc
-          inner join project_branches br on br.project_uuid = counter.projectUuid and br.uuid = lmo.component_uuid
-          group by counter.projectUuid, counter.maxncloc, counter.projectName, counter.projectKey) tie_breaker
-      inner join project_branches pb on tie_breaker.branchUuid = pb.uuid
-      order by ncloc desc
+    select loc_grouped_branches.projectUuid,
+        loc_grouped_branches.projectName,
+        loc_grouped_branches.projectKey,
+        loc_grouped_branches.ncloc as loc,
+        loc_grouped_branches.branchName,
+        loc_grouped_branches.branchType
+    from (
+       select pb.project_uuid as projectUuid,
+       p.name as projectName,
+       p.kee as projectKey,
+       pb.kee as branchName,
+       pb.branch_type as branchType,
+       lm.value as ncloc,
+       row_number() over (partition by pb.project_uuid order by lm.value desc, pb.uuid asc) row_number
+       from live_measures lm
+          inner join project_branches pb on pb.uuid = lm.component_uuid
+          inner join projects p on p.uuid = pb.project_uuid
+          where lm.metric_uuid = #{nclocUuid, jdbcType=VARCHAR}
+          and p.qualifier ='TRK'
+      ) loc_grouped_branches
+    where loc_grouped_branches.row_number = 1
+    order by ncloc desc
   </select>
 
   <select id="selectLargestBranchesLocDistribution" parameterType="map" resultType="ProjectLocDistribution">
           where lm.metric_uuid = #{nclocUuid, jdbcType=VARCHAR}
           and p.qualifier ='TRK'
       ) loc_grouped_branches
-    WHERE loc_grouped_branches.row_number = 1) as top_branches
+    WHERE loc_grouped_branches.row_number = 1) top_branches
     inner join live_measures lm2 on lm2.component_uuid = top_branches.uuid
     where lm2.metric_uuid = #{nclocDistributionUuid, jdbcType=VARCHAR}
   </select>
index 13cf0c87affb5748de8e477b0112bd64a5f7c46e..89e34ffd984ffb0b492bab831c64505b01c72277 100644 (file)
@@ -376,9 +376,10 @@ public class LiveMeasureDaoTest {
   @Test
   public void get_branch_with_max_ncloc_per_project() {
     Map<String, MetricDto> metrics = setupMetrics();
-    setupProjectsWithLoc(metrics.get("ncloc"), metrics.get("ncloc_language_distribution"), metrics.get("lines"));
+    MetricDto ncloc = metrics.get("ncloc");
+    setupProjectsWithLoc(ncloc, metrics.get("ncloc_language_distribution"), metrics.get("lines"));
 
-    List<LargestBranchNclocDto> results = underTest.getLargestBranchNclocPerProject(db.getSession());
+    List<LargestBranchNclocDto> results = underTest.getLargestBranchNclocPerProject(db.getSession(), ncloc.getUuid());
 
     assertThat(results).hasSize(5);
     assertLocForProject(results.get(0), "projectWithTieOnBranchSize", DEFAULT_MAIN_BRANCH_NAME, 250);