diff options
author | alain <108417558+alain-kermis-sonarsource@users.noreply.github.com> | 2022-09-28 14:29:30 +0200 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2022-09-28 20:04:08 +0000 |
commit | 98aa88962583e2e8f59a5dd110aaa980282e6fe5 (patch) | |
tree | 05debe672be885aa58a100ace56162c4fc68a89a | |
parent | bb10a3475add71296daadd37480798d7f961e6ec (diff) | |
download | sonarqube-98aa88962583e2e8f59a5dd110aaa980282e6fe5.tar.gz sonarqube-98aa88962583e2e8f59a5dd110aaa980282e6fe5.zip |
SONAR-17195 Move unanalyzed language flags to project level for telemetry
11 files changed, 113 insertions, 95 deletions
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<PrAndBranchCountByProjectDto> countPrAndBranchByProjectUuid(DbSession dbSession){ - return mapper(dbSession).countPrAndBranchByProjectUuid(); + public List<PrBranchAnalyzedLanguageCountByProjectDto> countPrBranchAnalyzedLanguageByProjectUuid(DbSession dbSession){ + return mapper(dbSession).countPrBranchAnalyzedLanguageByProjectUuid(); } public List<BranchDto> selectByUuids(DbSession session, Collection<String> 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<BranchDto> selectByProjectUuid(@Param("projectUuid") String projectUuid); - List<PrAndBranchCountByProjectDto> countPrAndBranchByProjectUuid(); + List<PrBranchAnalyzedLanguageCountByProjectDto> countPrBranchAnalyzedLanguageByProjectUuid(); List<BranchDto> selectByBranchKeys(@Param("branchKeyByProjectUuid") Map<String, String> 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/PrBranchAnalyzedLanguageCountByProjectDto.java index ef9149bfb8c..c4aa693479d 100644 --- 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/PrBranchAnalyzedLanguageCountByProjectDto.java @@ -19,11 +19,13 @@ */ package org.sonar.db.component; -public class PrAndBranchCountByProjectDto { +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; @@ -48,4 +50,20 @@ public class PrAndBranchCountByProjectDto { 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> - <select id="countPrAndBranchByProjectUuid" resultType="org.sonar.db.component.PrAndBranchCountByProjectDto"> - select project_uuid as projectUuid, + <select id="countPrBranchAnalyzedLanguageByProjectUuid" resultType="org.sonar.db.component.PrBranchAnalyzedLanguageCountByProjectDto"> + 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 </select> 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<String> customSecurityConfigs; private final List<UserTelemetryDto> users; private final List<Project> 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<Boolean> hasUnanalyzedC() { - return Optional.ofNullable(hasUnanalyzedC); - } - - public Optional<Boolean> hasUnanalyzedCpp() { - return Optional.ofNullable(hasUnanalyzedCpp); - } - public List<String> 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<String> customSecurityConfigs; private List<UserTelemetryDto> users; private List<Project> 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<String> 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<Boolean> hasUnanalyzedC() { + return Optional.ofNullable(hasUnanalyzedC); + } + + public Optional<Boolean> 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 @@ -230,21 +230,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 .setCustomSecurityConfigs(Arrays.asList("php", "java")) @@ -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<UserTelemetryDto> 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<TelemetryData.ProjectStatistics> 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<TelemetryData.ProjectStatistics> 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<String, String> scmByProject = getAnalysisPropertyByProject(dbSession, SONAR_ANALYSIS_DETECTEDSCM); Map<String, String> ciByProject = getAnalysisPropertyByProject(dbSession, SONAR_ANALYSIS_DETECTEDCI); Map<String, ProjectAlmKeyAndProject> almAndUrlByProject = getAlmAndUrlByProject(dbSession); List<String> projectUuids = dbClient.projectDao().selectAllProjectUuids(dbSession); - Map<String, PrAndBranchCountByProjectDto> prAndBranchCountByProjects = dbClient.branchDao().countPrAndBranchByProjectUuid(dbSession) - .stream().collect(Collectors.toMap(PrAndBranchCountByProjectDto::getProjectUuid, Function.identity())); + Map<String, PrBranchAnalyzedLanguageCountByProjectDto> prAndBranchCountByProjects = dbClient.branchDao().countPrBranchAnalyzedLanguageByProjectUuid(dbSession) + .stream().collect(Collectors.toMap(PrBranchAnalyzedLanguageCountByProjectDto::getProjectUuid, Function.identity())); + boolean isCommunityEdition = editionProvider.get().filter(edition -> edition.equals(COMMUNITY)).isPresent(); List<TelemetryData.ProjectStatistics> 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<PrBranchAnalyzedLanguageCountByProjectDto> 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 |