Skip to content

Commit c617a79

Browse files
cody-simms-sonarsourcesonartech
authored andcommitted
SONAR-26689 Upgrade compliance reports module to support levels and nested subcategories
1 parent c23c4b4 commit c617a79

File tree

7 files changed

+30
-20
lines changed

7 files changed

+30
-20
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ version=25.12
66
# No change required for patch versions
77
versionEOL=2026-06-08
88
pdfreportVersion=2.0.0.388
9-
complianceReportsVersion=0.0.1.2480
9+
complianceReportsVersion=0.0.1.2515
1010
pluginApiVersion=13.4.3.4290
1111
description=Open source platform for continuous inspection of code quality
1212
projectTitle=SonarQube

server/sonar-server-common/src/it/java/org/sonar/server/rule/index/RuleIndexIT.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121

2222
import com.google.common.collect.ImmutableList;
2323
import com.google.common.collect.Sets;
24-
import io.sonarcloud.compliancereports.reports.MetadataRules.ComplianceCategoryRules;
25-
import io.sonarcloud.compliancereports.reports.MetadataRules.RepositoryRuleKey;
24+
import io.sonarcloud.compliancereports.reports.CategoryTree;
25+
import io.sonarcloud.compliancereports.reports.ComplianceCategoryRules;
26+
import io.sonarcloud.compliancereports.reports.RepositoryRuleKey;
2627
import java.util.ArrayList;
2728
import java.util.LinkedHashMap;
2829
import java.util.List;
@@ -207,10 +208,13 @@ void filter_by_compliance_category_rules() {
207208
RuleDto rule2 = createRule(setRepositoryKey("php"), setRuleKey("S002"));
208209
createRule(setRepositoryKey("java"), setRuleKey("S002"));
209210
index();
211+
ComplianceCategoryRules complianceCategoryRules = new ComplianceCategoryRules(new CategoryTree.CategoryTreeNode(
212+
"key", Set.of("php:S002", ":X001"), Set.of(), null, false, 0
213+
));
210214

211215
// key
212216
RuleQuery query = new RuleQuery()
213-
.setComplianceCategoryRules(List.of(new ComplianceCategoryRules(Set.of(RepositoryRuleKey.of("php:S002")), Set.of("X001"))));
217+
.setComplianceCategoryRules(List.of(complianceCategoryRules));
214218

215219
assertThat(underTest.search(query, new SearchOptions()).getUuids())
216220
.containsOnly(rule.getUuid(), rule1.getUuid(), rule2.getUuid());

server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndex.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
import co.elastic.clients.elasticsearch._types.aggregations.StringTermsBucket;
2626
import co.elastic.clients.util.NamedValue;
2727
import com.google.common.base.Joiner;
28-
import io.sonarcloud.compliancereports.reports.MetadataRules.ComplianceCategoryRules;
29-
import io.sonarcloud.compliancereports.reports.MetadataRules.RepositoryRuleKey;
28+
import io.sonarcloud.compliancereports.reports.ComplianceCategoryRules;
29+
import io.sonarcloud.compliancereports.reports.RepositoryRuleKey;
3030
import java.util.ArrayList;
3131
import java.util.Arrays;
3232
import java.util.Collection;
@@ -449,11 +449,11 @@ private static void addComplianceCategoriesFilter(Map<String, QueryBuilder> filt
449449
for (ComplianceCategoryRules rules : rulesCollection) {
450450
BoolQueryBuilder standardBoolQuery = boolQuery();
451451

452-
if (!rules.ruleKeys().isEmpty()) {
453-
standardBoolQuery.should().add(QueryBuilders.termsQuery(FIELD_RULE_RULE_KEY, rules.ruleKeys()));
452+
if (!rules.allRuleKeys().isEmpty()) {
453+
standardBoolQuery.should().add(QueryBuilders.termsQuery(FIELD_RULE_RULE_KEY, rules.allRuleKeys()));
454454
}
455-
if (!rules.repoRuleKeys().isEmpty()) {
456-
Collection<String> repoRuleKeys = rules.repoRuleKeys().stream().map(RepositoryRuleKey::toString).toList();
455+
if (!rules.allRepoRuleKeys().isEmpty()) {
456+
Collection<String> repoRuleKeys = rules.allRepoRuleKeys().stream().map(RepositoryRuleKey::toString).toList();
457457
standardBoolQuery.should().add(QueryBuilders.termsQuery(FIELD_RULE_KEY, repoRuleKeys));
458458
}
459459
boolQueryBuilder.must(standardBoolQuery);

server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
package org.sonar.server.rule.index;
2121

2222
import com.google.common.base.Preconditions;
23-
import io.sonarcloud.compliancereports.reports.MetadataRules.ComplianceCategoryRules;
23+
import io.sonarcloud.compliancereports.reports.ComplianceCategoryRules;
2424
import java.util.Collection;
2525
import javax.annotation.CheckForNull;
2626
import javax.annotation.Nullable;

server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueQueryFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import com.google.common.base.Joiner;
2323
import com.google.common.collect.ImmutableList;
2424
import io.sonarcloud.compliancereports.reports.MetadataRules;
25-
import io.sonarcloud.compliancereports.reports.MetadataRules.ComplianceCategoryRules;
25+
import io.sonarcloud.compliancereports.reports.ComplianceCategoryRules;
2626
import io.sonarcloud.compliancereports.reports.ReportKey;
2727
import java.time.Clock;
2828
import java.time.DateTimeException;
@@ -206,11 +206,11 @@ private Set<String> getRuleIds(DbSession session, Map<ReportKey, ComplianceCateg
206206

207207
for(Map.Entry<ReportKey, ComplianceCategoryRules> e : rulesByStandard.entrySet()) {
208208
ComplianceCategoryRules rules = e.getValue();
209-
Set<RuleKey> ruleKeys = rules.repoRuleKeys().stream().map(r -> RuleKey.of(r.repository(), r.rule())).collect(Collectors.toSet());
209+
Set<RuleKey> ruleKeys = rules.allRepoRuleKeys().stream().map(r -> RuleKey.of(r.repository(), r.rule())).collect(Collectors.toSet());
210210

211211
Set<String> ids = Stream.concat(
212212
dbClient.ruleDao().selectByKeys(session, ruleKeys).stream(),
213-
dbClient.ruleDao().selectByRuleKeys(session, rules.ruleKeys()).stream()
213+
dbClient.ruleDao().selectByRuleKeys(session, rules.allRuleKeys()).stream()
214214
).map(RuleDto::getUuid).collect(Collectors.toSet());
215215

216216
// standard doesn't exist or it doesn't have any rules associated to it

server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/RuleQueryFactoryIT.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
*/
2020
package org.sonar.server.rule.ws;
2121

22+
import io.sonarcloud.compliancereports.reports.ComplianceCategoryRules;
2223
import io.sonarcloud.compliancereports.reports.MetadataLoader;
2324
import io.sonarcloud.compliancereports.reports.MetadataRules;
24-
import io.sonarcloud.compliancereports.reports.MetadataRules.ComplianceCategoryRules;
25-
import io.sonarcloud.compliancereports.reports.MetadataRules.RepositoryRuleKey;
25+
import io.sonarcloud.compliancereports.reports.RepositoryRuleKey;
2626
import java.util.Set;
2727
import org.junit.Rule;
2828
import org.junit.Test;
@@ -147,8 +147,10 @@ public void create_rule_search_query() {
147147

148148
assertResult(result, qualityProfile, compareToQualityProfile);
149149
assertThat(result.includeExternal()).isFalse();
150-
assertThat(result.getComplianceCategoryRules()).containsOnly(
151-
new ComplianceCategoryRules(Set.of(RepositoryRuleKey.of("java:S001")), Set.of("S002", "3")));
150+
assertThat(result.getComplianceCategoryRules()).hasSize(1);
151+
assertThat(result.getComplianceCategoryRules().stream().findFirst().get())
152+
.extracting(ComplianceCategoryRules::allRepoRuleKeys, ComplianceCategoryRules::allRuleKeys)
153+
.containsOnly(Set.of(RepositoryRuleKey.of("java:S001")), Set.of("S002", "3"));
152154
}
153155

154156
@Test

server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleQueryFactory.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@
1919
*/
2020
package org.sonar.server.rule.ws;
2121

22+
import io.sonarcloud.compliancereports.reports.CategoryTree;
2223
import io.sonarcloud.compliancereports.reports.MetadataRules;
23-
import io.sonarcloud.compliancereports.reports.MetadataRules.ComplianceCategoryRules;
24+
import io.sonarcloud.compliancereports.reports.ComplianceCategoryRules;
2425
import io.sonarcloud.compliancereports.reports.ReportKey;
2526
import java.util.Date;
2627
import java.util.List;
2728
import java.util.Map;
2829
import java.util.Set;
30+
import java.util.function.Function;
2931
import org.sonar.api.rule.RuleStatus;
3032
import org.sonar.api.server.ServerSide;
3133
import org.sonar.api.server.ws.Request;
@@ -145,8 +147,10 @@ private void setComplianceFilter(RuleQuery query, Map<ReportKey, Set<String>> ca
145147
}
146148

147149
private List<ComplianceCategoryRules> getComplianceStandardRules(Map<ReportKey, Set<String>> categoriesByStandard) {
150+
var nonExistentComplianceRules = new ComplianceCategoryRules(new CategoryTree.CategoryTreeNode("empty", Set.of(":non-existing-uuid"),
151+
Set.of(), null, false, 0));
148152
return metadataRules.getRulesByStandard(categoriesByStandard).values().stream()
149-
.map(e -> e.isEmpty() ? new ComplianceCategoryRules(Set.of(), Set.of("non-existing-uuid")) : e)
153+
.map(e -> e.isEmpty() ? nonExistentComplianceRules : e)
150154
.toList();
151155
}
152156

0 commit comments

Comments
 (0)