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;
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;
- }
}
<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,
- (
- 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
+ sum(case when pb.branch_type = 'BRANCH' then 1 else 0 end) as branch
+ from project_branches pb
group by pb.project_uuid
</select>
db.measures().insertLiveMeasure(project3, unanalyzedC);
assertThat(underTest.countPrBranchAnalyzedLanguageByProjectUuid(db.getSession()))
- .extracting(PrBranchAnalyzedLanguageCountByProjectDto::getProjectUuid, PrBranchAnalyzedLanguageCountByProjectDto::getBranch, PrBranchAnalyzedLanguageCountByProjectDto::getPullRequest,
- PrBranchAnalyzedLanguageCountByProjectDto::getUnanalyzedCCount, PrBranchAnalyzedLanguageCountByProjectDto::getUnanalyzedCppCount)
+ .extracting(PrBranchAnalyzedLanguageCountByProjectDto::getProjectUuid, PrBranchAnalyzedLanguageCountByProjectDto::getBranch, PrBranchAnalyzedLanguageCountByProjectDto::getPullRequest)
.containsExactlyInAnyOrder(
- tuple(project1.uuid(), 3L, 3L, 1L, 1L),
- tuple(project2.uuid(), 1L, 1L, 0L, 1L),
- tuple(project3.uuid(), 2L, 0L, 1L, 0L)
+ tuple(project1.uuid(), 3L, 3L),
+ tuple(project2.uuid(), 1L, 1L),
+ tuple(project3.uuid(), 2L, 0L)
);
}
private final List<UserTelemetryDto> users;
private final List<Project> projects;
private final List<ProjectStatistics> projectStatistics;
+ private final Boolean hasUnanalyzedC;
+ private final Boolean hasUnanalyzedCpp;
private final Set<String> customSecurityConfigs;
private TelemetryData(Builder builder) {
users = builder.users;
projects = builder.projects;
projectStatistics = builder.projectStatistics;
+ hasUnanalyzedC = builder.hasUnanalyzedC;
+ hasUnanalyzedCpp = builder.hasUnanalyzedCpp;
customSecurityConfigs = requireNonNullElse(builder.customSecurityConfigs, Set.of());
}
return isScimEnabled;
}
+ public Optional<Boolean> hasUnanalyzedC() {
+ return Optional.ofNullable(hasUnanalyzedC);
+ }
+
+ public Optional<Boolean> hasUnanalyzedCpp() {
+ return Optional.ofNullable(hasUnanalyzedCpp);
+ }
+
public Set<String> getCustomSecurityConfigs() {
return customSecurityConfigs;
}
private String installationVersion;
private boolean inDocker = false;
private boolean isScimEnabled;
+ private Boolean hasUnanalyzedC;
+ private Boolean hasUnanalyzedCpp;
private Set<String> customSecurityConfigs;
private List<UserTelemetryDto> users;
private List<Project> projects;
return this;
}
+ Builder setHasUnanalyzedC(@Nullable Boolean hasUnanalyzedC) {
+ this.hasUnanalyzedC = hasUnanalyzedC;
+ return this;
+ }
+
+ Builder setHasUnanalyzedCpp(@Nullable Boolean hasUnanalyzedCpp) {
+ this.hasUnanalyzedCpp = hasUnanalyzedCpp;
+ return this;
+ }
+
Builder setCustomSecurityConfigs(Set<String> customSecurityConfigs) {
this.customSecurityConfigs = customSecurityConfigs;
return this;
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 Boolean hasUnanalyzedC, @Nullable Boolean hasUnanalyzedCpp,
+ ProjectStatistics(String projectUuid, Long branchCount, Long pullRequestCount,
@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;
return devopsPlatform;
}
- public Optional<Boolean> hasUnanalyzedC() {
- return Optional.ofNullable(hasUnanalyzedC);
- }
-
- public Optional<Boolean> hasUnanalyzedCpp() {
- return Optional.ofNullable(hasUnanalyzedCpp);
- }
}
}
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()));
}
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();
assertJson(json).isSimilarTo("{" + format(" \"%s\":", SCIM_PROPERTY) + isScimEnabled + "}");
}
+ @Test
+ public void writes_has_unanalyzed_languages() {
+ TelemetryData data = telemetryBuilder()
+ .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 = telemetryBuilder()
@Test
public void writes_all_projects_stats_with_analyzed_languages() {
TelemetryData data = telemetryBuilder()
- .setProjectStatistics(attachProjectStats(true))
+ .setProjectStatistics(attachProjectStats())
.build();
String json = writeTelemetryData(data);
- assertJson(json).isSimilarTo("{" +
- " \"projects-general-stats\": [" +
- " {" +
- " \"projectUuid\": \"uuid-0\"," +
- " \"branchCount\": 2," +
- " \"pullRequestCount\": 2," +
- " \"scm\": \"scm-0\"," +
- " \"ci\": \"ci-0\"," +
- " \"devopsPlatform\": \"devops-0\"," +
- " \"hasUnanalyzedC\": true," +
- " \"hasUnanalyzedCpp\": false" +
- " }," +
- " {" +
- " \"projectUuid\": \"uuid-1\"," +
- " \"branchCount\": 4," +
- " \"pullRequestCount\": 4," +
- " \"scm\": \"scm-1\"," +
- " \"ci\": \"ci-1\"," +
- " \"devopsPlatform\": \"devops-1\"," +
- " \"hasUnanalyzedC\": false," +
- " \"hasUnanalyzedCpp\": true" +
- " }," +
- " {" +
- " \"projectUuid\": \"uuid-2\"," +
- " \"branchCount\": 6," +
- " \"pullRequestCount\": 6," +
- " \"scm\": \"scm-2\"," +
- " \"ci\": \"ci-2\"," +
- " \"devopsPlatform\": \"devops-2\"," +
- " \"hasUnanalyzedC\": true," +
- " \"hasUnanalyzedCpp\": false" +
- " }" +
- " ]" +
- "}");
+ assertJson(json).isSimilarTo("""
+ {
+ "projects-general-stats": [
+ {
+ "projectUuid": "uuid-0",
+ "branchCount": 2,
+ "pullRequestCount": 2,
+ "scm": "scm-0",
+ "ci": "ci-0",
+ "devopsPlatform": "devops-0"
+ },
+ {
+ "projectUuid": "uuid-1",
+ "branchCount": 4,
+ "pullRequestCount": 4,
+ "scm": "scm-1",
+ "ci": "ci-1",
+ "devopsPlatform": "devops-1"
+ },
+ {
+ "projectUuid": "uuid-2",
+ "branchCount": 6,
+ "pullRequestCount": 6,
+ "scm": "scm-2",
+ "ci": "ci-2",
+ "devopsPlatform": "devops-2"
+ }
+ ]
+ }
+ """
+ );
}
@Test
public void writes_all_projects_stats_with_unanalyzed_languages() {
TelemetryData data = telemetryBuilder()
- .setProjectStatistics(attachProjectStats(false))
+ .setProjectStatistics(attachProjectStats())
.build();
String json = writeTelemetryData(data);
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> attachProjectStats(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))
+ private List<TelemetryData.ProjectStatistics> attachProjectStats() {
+ return IntStream.range(0, 3).mapToObj(i -> new TelemetryData.ProjectStatistics("uuid-" + i, (i + 1L) * 2L, (i + 1L) * 2L, "scm-" + i, "ci-" + i, "devops-" + i))
.collect(Collectors.toList());
}
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;
import static org.sonar.server.telemetry.TelemetryDaemon.I_PROP_MESSAGE_SEQUENCE;
@ServerSide
try (DbSession dbSession = dbClient.openSession(false)) {
data.setDatabase(loadDatabaseMetadata(dbSession));
+ resolveUnanalyzedLanguageCode(data, dbSession);
resolveProjectStatistics(data, dbSession);
resolveProjects(data, dbSession);
resolveUsers(data, dbSession);
.build();
}
+ private void resolveUnanalyzedLanguageCode(TelemetryData.Builder data, DbSession 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);
+ });
+ }
+
private Long retrieveCurrentMessageSequenceNumber() {
return internalProperties.read(I_PROP_MESSAGE_SEQUENCE).map(Long::parseLong).orElse(0L);
}
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) {
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;
devopsPlatform = Optional.ofNullable(devopsPlatform).orElse(UNDETECTED);
projectStatistics.add(
- new TelemetryData.ProjectStatistics(projectUuid, branchCount, pullRequestCount, hasUnanalyzedCMeasures, hasUnanalyzedCppMeasures, scm, ci, devopsPlatform));
+ new TelemetryData.ProjectStatistics(projectUuid, branchCount, pullRequestCount, scm, ci, devopsPlatform));
}
data.setProjectStatistics(projectStatistics);
}
TelemetryData data = communityUnderTest.load();
- 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)));
+ assertThat(data.hasUnanalyzedC().get()).isTrue();
+ assertThat(data.hasUnanalyzedCpp().get()).isTrue();
}
@Test
TelemetryData data = communityUnderTest.load();
- assertThat(data.getProjectStatistics())
- .extracting(TelemetryData.ProjectStatistics::hasUnanalyzedC, TelemetryData.ProjectStatistics::hasUnanalyzedCpp)
- .containsExactlyInAnyOrder(tuple(Optional.empty(), Optional.empty()), tuple(Optional.empty(), Optional.empty()));
+ 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();
}
@Test