From 98aa88962583e2e8f59a5dd110aaa980282e6fe5 Mon Sep 17 00:00:00 2001 From: alain <108417558+alain-kermis-sonarsource@users.noreply.github.com> Date: Wed, 28 Sep 2022 14:29:30 +0200 Subject: SONAR-17195 Move unanalyzed language flags to project level for telemetry --- .../src/main/java/org/sonar/db/MyBatis.java | 4 +- .../java/org/sonar/db/component/BranchDao.java | 4 +- .../java/org/sonar/db/component/BranchMapper.java | 2 +- .../db/component/PrAndBranchCountByProjectDto.java | 51 ---------------- .../PrBranchAnalyzedLanguageCountByProjectDto.java | 69 ++++++++++++++++++++++ .../org/sonar/db/component/BranchMapper.xml | 16 +++-- .../java/org/sonar/db/component/BranchDaoTest.java | 19 ++++-- .../org/sonar/server/telemetry/TelemetryData.java | 39 +++++------- .../server/telemetry/TelemetryDataJsonWriter.java | 5 +- .../telemetry/TelemetryDataJsonWriterTest.java | 45 +++++++------- .../server/telemetry/TelemetryDataLoaderImpl.java | 34 ++++++----- .../telemetry/TelemetryDataLoaderImplTest.java | 20 ++----- 12 files changed, 163 insertions(+), 145 deletions(-) delete mode 100644 server/sonar-db-dao/src/main/java/org/sonar/db/component/PrAndBranchCountByProjectDto.java create mode 100644 server/sonar-db-dao/src/main/java/org/sonar/db/component/PrBranchAnalyzedLanguageCountByProjectDto.java diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java b/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java index 02a2576417d..14da008f50e 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java @@ -56,7 +56,7 @@ import org.sonar.db.component.ComponentMapper; import org.sonar.db.component.ComponentWithModuleUuidDto; import org.sonar.db.component.FilePathWithHashDto; import org.sonar.db.component.KeyWithUuidDto; -import org.sonar.db.component.PrAndBranchCountByProjectDto; +import org.sonar.db.component.PrBranchAnalyzedLanguageCountByProjectDto; import org.sonar.db.component.ProjectLinkMapper; import org.sonar.db.component.ResourceDto; import org.sonar.db.component.ScrapAnalysisPropertyDto; @@ -224,7 +224,7 @@ public class MyBatis { confBuilder.loadAlias("ProjectBadgeToken", ProjectBadgeTokenDto.class); confBuilder.loadAlias("AnalysisPropertyValuePerProject", AnalysisPropertyValuePerProject.class); confBuilder.loadAlias("ProjectAlmKeyAndProject", ProjectAlmKeyAndProject.class); - confBuilder.loadAlias("PrAndBranchCountByProjectDto", PrAndBranchCountByProjectDto.class); + confBuilder.loadAlias("PrAndBranchCountByProjectDto", PrBranchAnalyzedLanguageCountByProjectDto.class); confBuilder.loadAlias("ProjectMapping", ProjectMappingDto.class); confBuilder.loadAlias("ProjectMeasure", ProjectMeasureDto.class); confBuilder.loadAlias("PurgeableAnalysis", PurgeableAnalysisDto.class); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java index 3ae1a2ce788..38cca4e8201 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java @@ -101,8 +101,8 @@ public class BranchDao implements Dao { return mapper(dbSession).selectByProjectUuid(project.getUuid()); } - public List countPrAndBranchByProjectUuid(DbSession dbSession){ - return mapper(dbSession).countPrAndBranchByProjectUuid(); + public List countPrBranchAnalyzedLanguageByProjectUuid(DbSession dbSession){ + return mapper(dbSession).countPrBranchAnalyzedLanguageByProjectUuid(); } public List selectByUuids(DbSession session, Collection uuids) { diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java index 75159c2b668..9f19580941c 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java @@ -47,7 +47,7 @@ public interface BranchMapper { Collection selectByProjectUuid(@Param("projectUuid") String projectUuid); - List countPrAndBranchByProjectUuid(); + List countPrBranchAnalyzedLanguageByProjectUuid(); List selectByBranchKeys(@Param("branchKeyByProjectUuid") Map branchKeyByProjectUuid); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/PrAndBranchCountByProjectDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/PrAndBranchCountByProjectDto.java deleted file mode 100644 index ef9149bfb8c..00000000000 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/PrAndBranchCountByProjectDto.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2022 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.db.component; - -public class PrAndBranchCountByProjectDto { - - private String projectUuid = null; - private Long pullRequest = null; - private Long branch = null; - - public String getProjectUuid() { - return projectUuid; - } - - public void setProjectUuid(String projectUuid) { - this.projectUuid = projectUuid; - } - - public Long getPullRequest() { - return pullRequest; - } - - public void setPullRequest(Long pullRequest) { - this.pullRequest = pullRequest; - } - - public Long getBranch() { - return branch; - } - - public void setBranch(Long branch) { - this.branch = branch; - } -} diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/PrBranchAnalyzedLanguageCountByProjectDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/PrBranchAnalyzedLanguageCountByProjectDto.java new file mode 100644 index 00000000000..c4aa693479d --- /dev/null +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/PrBranchAnalyzedLanguageCountByProjectDto.java @@ -0,0 +1,69 @@ +/* + * SonarQube + * Copyright (C) 2009-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.db.component; + +public class PrBranchAnalyzedLanguageCountByProjectDto { + + private String projectUuid = null; + private Long pullRequest = null; + private Long branch = null; + private Long unanalyzedCCount = null; + private Long unanalyzedCppCount = null; + + public String getProjectUuid() { + return projectUuid; + } + + public void setProjectUuid(String projectUuid) { + this.projectUuid = projectUuid; + } + + public Long getPullRequest() { + return pullRequest; + } + + public void setPullRequest(Long pullRequest) { + this.pullRequest = pullRequest; + } + + public Long getBranch() { + return branch; + } + + public void setBranch(Long branch) { + this.branch = branch; + } + + public Long getUnanalyzedCCount() { + return unanalyzedCCount; + } + + public void setUnanalyzedCCount(Long unanalyzedCCount) { + this.unanalyzedCCount = unanalyzedCCount; + } + + public Long getUnanalyzedCppCount() { + return unanalyzedCppCount; + } + + public void setUnanalyzedCppCount(Long unanalyzedCppCount) { + this.unanalyzedCppCount = unanalyzedCppCount; + } +} diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml index 3b7c0abe681..0cdef645451 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml @@ -111,11 +111,19 @@ pb.project_uuid = #{projectUuid, jdbcType=VARCHAR} - + select pb.project_uuid as projectUuid, sum(case when pb.branch_type = 'PULL_REQUEST' then 1 else 0 end) as pullRequest, - sum(case when pb.branch_type = 'BRANCH' then 1 else 0 end) as branch - from project_branches pb + sum(case when pb.branch_type = 'BRANCH' then 1 else 0 end) as branch, + ( + select count(1) as counter from live_measures lm + inner join metrics m on m.uuid = lm.metric_uuid and m.name = 'unanalyzed_c' + where lm.project_uuid = pb.project_uuid) as unanalyzedCCount, + ( + select count(1) as counter from live_measures lm + inner join metrics m on m.uuid = lm.metric_uuid and m.name = 'unanalyzed_cpp' + where lm.project_uuid = pb.project_uuid) as unanalyzedCppCount + from project_branches pb group by pb.project_uuid diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/component/BranchDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/component/BranchDaoTest.java index b7bb8b9bdb8..e58113a3212 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/component/BranchDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/component/BranchDaoTest.java @@ -38,6 +38,7 @@ import org.sonar.api.impl.utils.TestSystem2; import org.sonar.api.utils.System2; import org.sonar.db.DbSession; import org.sonar.db.DbTester; +import org.sonar.db.metric.MetricDto; import org.sonar.db.project.ProjectDto; import org.sonar.db.protobuf.DbProjectBranches; @@ -562,12 +563,20 @@ public class BranchDaoTest { ComponentDto project3 = db.components().insertPrivateProject(); db.components().insertProjectBranch(project3, b -> b.setBranchType(BRANCH).setKey("p3-branch-1")); - assertThat(underTest.countPrAndBranchByProjectUuid(db.getSession())) - .extracting(PrAndBranchCountByProjectDto::getProjectUuid, PrAndBranchCountByProjectDto::getBranch, PrAndBranchCountByProjectDto::getPullRequest) + MetricDto unanalyzedC = db.measures().insertMetric(m -> m.setKey("unanalyzed_c")); + MetricDto unanalyzedCpp = db.measures().insertMetric(m -> m.setKey("unanalyzed_cpp")); + db.measures().insertLiveMeasure(project1, unanalyzedC); + db.measures().insertLiveMeasure(project1, unanalyzedCpp); + db.measures().insertLiveMeasure(project2, unanalyzedCpp); + db.measures().insertLiveMeasure(project3, unanalyzedC); + + assertThat(underTest.countPrBranchAnalyzedLanguageByProjectUuid(db.getSession())) + .extracting(PrBranchAnalyzedLanguageCountByProjectDto::getProjectUuid, PrBranchAnalyzedLanguageCountByProjectDto::getBranch, PrBranchAnalyzedLanguageCountByProjectDto::getPullRequest, + PrBranchAnalyzedLanguageCountByProjectDto::getUnanalyzedCCount, PrBranchAnalyzedLanguageCountByProjectDto::getUnanalyzedCppCount) .containsExactlyInAnyOrder( - tuple(project1.uuid(), 3L, 3L), - tuple(project2.uuid(), 1L, 1L), - tuple(project3.uuid(), 2L, 0L) + tuple(project1.uuid(), 3L, 3L, 1L, 1L), + tuple(project2.uuid(), 1L, 1L, 0L, 1L), + tuple(project3.uuid(), 2L, 0L, 1L, 0L) ); } diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/telemetry/TelemetryData.java b/server/sonar-server-common/src/main/java/org/sonar/server/telemetry/TelemetryData.java index 09b2c1ee5a1..d8caa44576c 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/telemetry/TelemetryData.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/telemetry/TelemetryData.java @@ -41,8 +41,6 @@ public class TelemetryData { private final Long installationDate; private final String installationVersion; private final boolean inDocker; - private final Boolean hasUnanalyzedC; - private final Boolean hasUnanalyzedCpp; private final List customSecurityConfigs; private final List users; private final List projects; @@ -58,8 +56,6 @@ public class TelemetryData { installationDate = builder.installationDate; installationVersion = builder.installationVersion; inDocker = builder.inDocker; - hasUnanalyzedC = builder.hasUnanalyzedC; - hasUnanalyzedCpp = builder.hasUnanalyzedCpp; customSecurityConfigs = builder.customSecurityConfigs == null ? emptyList() : builder.customSecurityConfigs; users = builder.users; projects = builder.projects; @@ -102,14 +98,6 @@ public class TelemetryData { return inDocker; } - public Optional hasUnanalyzedC() { - return Optional.ofNullable(hasUnanalyzedC); - } - - public Optional hasUnanalyzedCpp() { - return Optional.ofNullable(hasUnanalyzedCpp); - } - public List getCustomSecurityConfigs() { return customSecurityConfigs; } @@ -140,8 +128,6 @@ public class TelemetryData { private Long installationDate; private String installationVersion; private boolean inDocker = false; - private Boolean hasUnanalyzedC; - private Boolean hasUnanalyzedCpp; private List customSecurityConfigs; private List users; private List projects; @@ -196,16 +182,6 @@ public class TelemetryData { return this; } - Builder setHasUnanalyzedC(@Nullable Boolean hasUnanalyzedC) { - this.hasUnanalyzedC = hasUnanalyzedC; - return this; - } - - Builder setHasUnanalyzedCpp(@Nullable Boolean hasUnanalyzedCpp) { - this.hasUnanalyzedCpp = hasUnanalyzedCpp; - return this; - } - Builder setCustomSecurityConfigs(List customSecurityConfigs) { this.customSecurityConfigs = customSecurityConfigs; return this; @@ -288,14 +264,19 @@ public class TelemetryData { private final String projectUuid; private final Long branchCount; private final Long pullRequestCount; + private final Boolean hasUnanalyzedC; + private final Boolean hasUnanalyzedCpp; private final String scm; private final String ci; private final String devopsPlatform; - ProjectStatistics(String projectUuid, Long branchCount, Long pullRequestCount, @Nullable String scm, @Nullable String ci, @Nullable String devopsPlatform) { + ProjectStatistics(String projectUuid, Long branchCount, Long pullRequestCount, @Nullable Boolean hasUnanalyzedC, @Nullable Boolean hasUnanalyzedCpp, + @Nullable String scm, @Nullable String ci, @Nullable String devopsPlatform) { this.projectUuid = projectUuid; this.branchCount = branchCount; this.pullRequestCount = pullRequestCount; + this.hasUnanalyzedC = hasUnanalyzedC; + this.hasUnanalyzedCpp = hasUnanalyzedCpp; this.scm = scm; this.ci = ci; this.devopsPlatform = devopsPlatform; @@ -327,5 +308,13 @@ public class TelemetryData { public String getDevopsPlatform() { return devopsPlatform; } + + public Optional hasUnanalyzedC() { + return Optional.ofNullable(hasUnanalyzedC); + } + + public Optional hasUnanalyzedCpp() { + return Optional.ofNullable(hasUnanalyzedCpp); + } } } diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/telemetry/TelemetryDataJsonWriter.java b/server/sonar-server-common/src/main/java/org/sonar/server/telemetry/TelemetryDataJsonWriter.java index c6ab6177ff8..8af18b0e16e 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/telemetry/TelemetryDataJsonWriter.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/telemetry/TelemetryDataJsonWriter.java @@ -61,9 +61,6 @@ public class TelemetryDataJsonWriter { json.endArray(); } - statistics.hasUnanalyzedC().ifPresent(hasUnanalyzedC -> json.prop("hasUnanalyzedC", hasUnanalyzedC)); - statistics.hasUnanalyzedCpp().ifPresent(hasUnanalyzedCpp -> json.prop("hasUnanalyzedCpp", hasUnanalyzedCpp)); - if (statistics.getInstallationDate() != null) { json.prop("installationDate", toUtc(statistics.getInstallationDate())); } @@ -132,6 +129,8 @@ public class TelemetryDataJsonWriter { json.prop("scm", project.getScm()); json.prop("ci", project.getCi()); json.prop("devopsPlatform", project.getDevopsPlatform()); + project.hasUnanalyzedC().ifPresent(hasUnanalyzedC -> json.prop("hasUnanalyzedC", hasUnanalyzedC)); + project.hasUnanalyzedCpp().ifPresent(hasUnanalyzedCpp -> json.prop("hasUnanalyzedCpp", hasUnanalyzedCpp)); json.endObject(); }); json.endArray(); diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/telemetry/TelemetryDataJsonWriterTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/telemetry/TelemetryDataJsonWriterTest.java index 4d6d482f62d..6bc9a0c35fe 100644 --- a/server/sonar-server-common/src/test/java/org/sonar/server/telemetry/TelemetryDataJsonWriterTest.java +++ b/server/sonar-server-common/src/test/java/org/sonar/server/telemetry/TelemetryDataJsonWriterTest.java @@ -229,21 +229,6 @@ public class TelemetryDataJsonWriterTest { "}"); } - @Test - public void writes_has_unanalyzed_languages() { - TelemetryData data = SOME_TELEMETRY_DATA - .setHasUnanalyzedC(true) - .setHasUnanalyzedCpp(false) - .build(); - - String json = writeTelemetryData(data); - - assertJson(json).isSimilarTo("{" + - " \"hasUnanalyzedC\":true," + - " \"hasUnanalyzedCpp\":false," + - "}"); - } - @Test public void writes_security_custom_config() { TelemetryData data = SOME_TELEMETRY_DATA @@ -325,9 +310,9 @@ public class TelemetryDataJsonWriterTest { } @Test - public void writes_all_projects_stats() { + public void writes_all_projects_stats_with_analyzed_languages() { TelemetryData data = SOME_TELEMETRY_DATA - .setProjectStatistics(getProjectStats()) + .setProjectStatistics(getProjectStats(true)) .build(); String json = writeTelemetryData(data); @@ -340,7 +325,9 @@ public class TelemetryDataJsonWriterTest { " \"pullRequestCount\": 2," + " \"scm\": \"scm-0\"," + " \"ci\": \"ci-0\"," + - " \"devopsPlatform\": \"devops-0\"" + + " \"devopsPlatform\": \"devops-0\"," + + " \"hasUnanalyzedC\": true," + + " \"hasUnanalyzedCpp\": false" + " }," + " {" + " \"projectUuid\": \"uuid-1\"," + @@ -348,7 +335,9 @@ public class TelemetryDataJsonWriterTest { " \"pullRequestCount\": 4," + " \"scm\": \"scm-1\"," + " \"ci\": \"ci-1\"," + - " \"devopsPlatform\": \"devops-1\"" + + " \"devopsPlatform\": \"devops-1\"," + + " \"hasUnanalyzedC\": false," + + " \"hasUnanalyzedCpp\": true" + " }," + " {" + " \"projectUuid\": \"uuid-2\"," + @@ -356,12 +345,24 @@ public class TelemetryDataJsonWriterTest { " \"pullRequestCount\": 6," + " \"scm\": \"scm-2\"," + " \"ci\": \"ci-2\"," + - " \"devopsPlatform\": \"devops-2\"" + + " \"devopsPlatform\": \"devops-2\"," + + " \"hasUnanalyzedC\": true," + + " \"hasUnanalyzedCpp\": false" + " }" + " ]" + "}"); } + @Test + public void writes_all_projects_stats_with_unanalyzed_languages() { + TelemetryData data = SOME_TELEMETRY_DATA + .setProjectStatistics(getProjectStats(false)) + .build(); + + String json = writeTelemetryData(data); + assertThat(json).doesNotContain("hasUnanalyzedC", "hasUnanalyzedCpp"); + } + @NotNull private static List getUsers() { return IntStream.range(0, 3) @@ -374,8 +375,8 @@ public class TelemetryDataJsonWriterTest { return IntStream.range(0, 3).mapToObj(i -> new TelemetryData.Project("uuid-" + i, 1L, "lang-" + i, (i + 1L) * 2L)).collect(Collectors.toList()); } - private List getProjectStats() { - return IntStream.range(0, 3).mapToObj(i -> new TelemetryData.ProjectStatistics("uuid-" + i, (i + 1L) * 2L, (i + 1L) * 2L, "scm-" + i, "ci-" + i, "devops-" + i)) + private List getProjectStats(boolean hasUnanalyzedLanguages) { + return IntStream.range(0, 3).mapToObj(i -> new TelemetryData.ProjectStatistics("uuid-" + i, (i + 1L) * 2L, (i + 1L) * 2L, hasUnanalyzedLanguages ? i % 2 == 0 : null, hasUnanalyzedLanguages ? i % 2 != 0 : null, "scm-" + i, "ci-" + i, "devops-" + i)) .collect(Collectors.toList()); } diff --git a/server/sonar-webserver-core/src/main/java/org/sonar/server/telemetry/TelemetryDataLoaderImpl.java b/server/sonar-webserver-core/src/main/java/org/sonar/server/telemetry/TelemetryDataLoaderImpl.java index 4c643684752..258e0128442 100644 --- a/server/sonar-webserver-core/src/main/java/org/sonar/server/telemetry/TelemetryDataLoaderImpl.java +++ b/server/sonar-webserver-core/src/main/java/org/sonar/server/telemetry/TelemetryDataLoaderImpl.java @@ -43,7 +43,7 @@ import org.sonar.db.DbSession; import org.sonar.db.alm.setting.ALM; import org.sonar.db.alm.setting.ProjectAlmKeyAndProject; import org.sonar.db.component.AnalysisPropertyValuePerProject; -import org.sonar.db.component.PrAndBranchCountByProjectDto; +import org.sonar.db.component.PrBranchAnalyzedLanguageCountByProjectDto; import org.sonar.db.measure.ProjectMeasureDto; import org.sonar.server.platform.DockerSupport; import org.sonar.server.property.InternalProperties; @@ -58,8 +58,6 @@ import static org.sonar.core.config.CorePropertyDefinitions.SONAR_ANALYSIS_DETEC import static org.sonar.core.platform.EditionProvider.Edition.COMMUNITY; import static org.sonar.core.platform.EditionProvider.Edition.DATACENTER; import static org.sonar.core.platform.EditionProvider.Edition.ENTERPRISE; -import static org.sonar.server.metric.UnanalyzedLanguageMetrics.UNANALYZED_CPP_KEY; -import static org.sonar.server.metric.UnanalyzedLanguageMetrics.UNANALYZED_C_KEY; @ServerSide public class TelemetryDataLoaderImpl implements TelemetryDataLoader { @@ -112,27 +110,30 @@ public class TelemetryDataLoaderImpl implements TelemetryDataLoader { data.setPlugins(plugins); try (DbSession dbSession = dbClient.openSession(false)) { data.setDatabase(loadDatabaseMetadata(dbSession)); - long numberOfUnanalyzedCMeasures = dbClient.liveMeasureDao().countProjectsHavingMeasure(dbSession, UNANALYZED_C_KEY); - long numberOfUnanalyzedCppMeasures = dbClient.liveMeasureDao().countProjectsHavingMeasure(dbSession, UNANALYZED_CPP_KEY); - editionProvider.get() - .filter(edition -> edition.equals(COMMUNITY)) - .ifPresent(edition -> { - data.setHasUnanalyzedC(numberOfUnanalyzedCMeasures > 0); - data.setHasUnanalyzedCpp(numberOfUnanalyzedCppMeasures > 0); - }); Map scmByProject = getAnalysisPropertyByProject(dbSession, SONAR_ANALYSIS_DETECTEDSCM); Map ciByProject = getAnalysisPropertyByProject(dbSession, SONAR_ANALYSIS_DETECTEDCI); Map almAndUrlByProject = getAlmAndUrlByProject(dbSession); List projectUuids = dbClient.projectDao().selectAllProjectUuids(dbSession); - Map prAndBranchCountByProjects = dbClient.branchDao().countPrAndBranchByProjectUuid(dbSession) - .stream().collect(Collectors.toMap(PrAndBranchCountByProjectDto::getProjectUuid, Function.identity())); + Map prAndBranchCountByProjects = dbClient.branchDao().countPrBranchAnalyzedLanguageByProjectUuid(dbSession) + .stream().collect(Collectors.toMap(PrBranchAnalyzedLanguageCountByProjectDto::getProjectUuid, Function.identity())); + boolean isCommunityEdition = editionProvider.get().filter(edition -> edition.equals(COMMUNITY)).isPresent(); List projectStatistics = new ArrayList<>(); for (String projectUuid : projectUuids) { - Long branchCount = Optional.ofNullable(prAndBranchCountByProjects.get(projectUuid)).map(PrAndBranchCountByProjectDto::getBranch).orElse(0L); - Long pullRequestCount = Optional.ofNullable(prAndBranchCountByProjects.get(projectUuid)).map(PrAndBranchCountByProjectDto::getPullRequest).orElse(0L); + Optional counts = ofNullable(prAndBranchCountByProjects.get(projectUuid)); + + Long branchCount = counts.map(PrBranchAnalyzedLanguageCountByProjectDto::getBranch).orElse(0L); + Long pullRequestCount = counts.map(PrBranchAnalyzedLanguageCountByProjectDto::getPullRequest).orElse(0L); + + Boolean hasUnanalyzedCMeasures = null; + Boolean hasUnanalyzedCppMeasures = null; + if (isCommunityEdition) { + hasUnanalyzedCMeasures = counts.map(PrBranchAnalyzedLanguageCountByProjectDto::getUnanalyzedCCount).orElse(0L) > 0; + hasUnanalyzedCppMeasures = counts.map(PrBranchAnalyzedLanguageCountByProjectDto::getUnanalyzedCppCount).orElse(0L) > 0; + } + String scm = Optional.ofNullable(scmByProject.get(projectUuid)).orElse(UNDETECTED); String ci = Optional.ofNullable(ciByProject.get(projectUuid)).orElse(UNDETECTED); String devopsPlatform = null; @@ -142,7 +143,8 @@ public class TelemetryDataLoaderImpl implements TelemetryDataLoader { } devopsPlatform = Optional.ofNullable(devopsPlatform).orElse(UNDETECTED); - projectStatistics.add(new TelemetryData.ProjectStatistics(projectUuid, branchCount, pullRequestCount, scm, ci, devopsPlatform)); + projectStatistics.add( + new TelemetryData.ProjectStatistics(projectUuid, branchCount, pullRequestCount, hasUnanalyzedCMeasures, hasUnanalyzedCppMeasures, scm, ci, devopsPlatform)); } data.setProjectStatistics(projectStatistics); diff --git a/server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java b/server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java index 1ef601422d5..6af70b31a0b 100644 --- a/server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java +++ b/server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java @@ -322,8 +322,9 @@ public class TelemetryDataLoaderImplTest { TelemetryData data = communityUnderTest.load(); - assertThat(data.hasUnanalyzedC().get()).isTrue(); - assertThat(data.hasUnanalyzedCpp().get()).isTrue(); + assertThat(data.getProjectStatistics()) + .extracting(TelemetryData.ProjectStatistics::hasUnanalyzedC, TelemetryData.ProjectStatistics::hasUnanalyzedCpp) + .containsExactlyInAnyOrder(tuple(Optional.of(true), Optional.of(true)), tuple(Optional.of(true), Optional.of(false))); } @Test @@ -338,18 +339,9 @@ public class TelemetryDataLoaderImplTest { TelemetryData data = communityUnderTest.load(); - assertThat(data.hasUnanalyzedC()).isEmpty(); - assertThat(data.hasUnanalyzedCpp()).isEmpty(); - } - - @Test - public void unanalyzed_languages_flags_are_set_to_false_when_no_unanalyzed_languages_and_edition_is_community() { - when(editionProvider.get()).thenReturn(Optional.of(COMMUNITY)); - - TelemetryData data = communityUnderTest.load(); - - assertThat(data.hasUnanalyzedC().get()).isFalse(); - assertThat(data.hasUnanalyzedCpp().get()).isFalse(); + assertThat(data.getProjectStatistics()) + .extracting(TelemetryData.ProjectStatistics::hasUnanalyzedC, TelemetryData.ProjectStatistics::hasUnanalyzedCpp) + .containsExactlyInAnyOrder(tuple(Optional.empty(), Optional.empty()), tuple(Optional.empty(), Optional.empty())); } @Test -- cgit v1.2.3