diff options
author | Steve Marion <steve.marion@sonarsource.com> | 2023-10-13 09:22:53 +0200 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2023-10-16 20:02:49 +0000 |
commit | f3b4b50cdceda15c22bc75d578ef81b34c850b7f (patch) | |
tree | 4ef92f75b1eb4ae5973df32937aa73472f82797b /server/sonar-db-dao/src | |
parent | 92b69f90be5767fa2d26b7d3e0201be5b29f26bf (diff) | |
download | sonarqube-f3b4b50cdceda15c22bc75d578ef81b34c850b7f.tar.gz sonarqube-f3b4b50cdceda15c22bc75d578ef81b34c850b7f.zip |
SONAR-20672 QualityProfileChange now record the version of SQ the change was done with. Added sq_version field in database. refactor QpChange insertion to batch insert at the same date to improve change grouping in UI. refactor rule impact. add "sonarQubeVersion" parameter to "api/qualityprofile/changelog" endpoint.
Diffstat (limited to 'server/sonar-db-dao/src')
5 files changed, 46 insertions, 4 deletions
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/QProfileChangeDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/QProfileChangeDaoIT.java index 8779e7d5ecf..4dd8044f262 100644 --- a/server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/QProfileChangeDaoIT.java +++ b/server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/QProfileChangeDaoIT.java @@ -22,6 +22,8 @@ package org.sonar.db.qualityprofile; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.annotation.Nullable; import org.junit.Rule; import org.junit.Test; @@ -96,6 +98,22 @@ public class QProfileChangeDaoIT { } @Test + public void whenBulkInsert_thenDateAreTheSame() { + List<QProfileChangeDto> changes = Stream.generate(QProfileChangeDto::new) + .peek(dto -> dto.setRulesProfileUuid("rule_profil_uuid").setChangeType("type")) + .limit(3) + .collect(Collectors.toList()); + + underTest.bulkInsert(dbSession, changes); + + assertThat(changes) + .noneMatch(dto -> dto.getCreatedAt() == 0L); + assertThat(changes) + .extracting(QProfileChangeDto::getCreatedAt) + .containsOnly(changes.get(0).getCreatedAt()); + } + + @Test public void selectByQuery_returns_empty_list_if_profile_does_not_exist() { List<QProfileChangeDto> changes = underTest.selectByQuery(dbSession, new QProfileChangeQuery("P1")); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QProfileChangeDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QProfileChangeDao.java index c30cf61fe68..77e6c5b0371 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QProfileChangeDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QProfileChangeDao.java @@ -39,10 +39,19 @@ public class QProfileChangeDao implements Dao { this.uuidFactory = uuidFactory; } + public void bulkInsert(DbSession dbSession, Collection<QProfileChangeDto> profileChangeDtos) { + long now = system2.now(); + profileChangeDtos.forEach(dto -> doInsertAtTime(dbSession, dto, now)); + } + public void insert(DbSession dbSession, QProfileChangeDto dto) { + doInsertAtTime(dbSession, dto, system2.now()); + } + + private void doInsertAtTime(DbSession dbSession, QProfileChangeDto dto, long time) { checkState(dto.getCreatedAt() == 0L, "Date of QProfileChangeDto must be set by DAO only. Got %s.", dto.getCreatedAt()); + dto.setCreatedAt(time); dto.setUuid(uuidFactory.create()); - dto.setCreatedAt(system2.now()); mapper(dbSession).insert(dto); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QProfileChangeDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QProfileChangeDto.java index 1ef6c4e3242..73dfe07e5c1 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QProfileChangeDto.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QProfileChangeDto.java @@ -37,6 +37,7 @@ public class QProfileChangeDto { private String data; private long createdAt; private RuleChangeDto ruleChange; + private String sqVersion; public String getUuid() { return uuid; @@ -47,6 +48,16 @@ public class QProfileChangeDto { return this; } + @CheckForNull + public String getSqVersion() { + return sqVersion; + } + + public QProfileChangeDto setSqVersion(String sqVersion) { + this.sqVersion = sqVersion; + return this; + } + public String getRulesProfileUuid() { return rulesProfileUuid; } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QProfileChangeMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QProfileChangeMapper.xml index fa0dda95378..6503fe3b4d3 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QProfileChangeMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QProfileChangeMapper.xml @@ -10,6 +10,7 @@ qpc.user_uuid as userUuid, qpc.change_type as changeType, qpc.change_data as data, + qpc.sq_version as sqVersion, rc.uuid as "rc_uuid", rc.old_clean_code_attribute as oldCleanCodeAttribute, rc.new_clean_code_attribute as newCleanCodeAttribute, @@ -30,7 +31,8 @@ user_uuid, change_type, change_data, - rule_change_uuid + rule_change_uuid, + sq_version ) values ( #{uuid, jdbcType=VARCHAR}, #{rulesProfileUuid, jdbcType=VARCHAR}, @@ -38,7 +40,8 @@ #{userUuid, jdbcType=VARCHAR}, #{changeType, jdbcType=VARCHAR}, #{data, jdbcType=VARCHAR}, - #{ruleChange.uuid, jdbcType=VARCHAR} + #{ruleChange.uuid, jdbcType=VARCHAR}, + #{sqVersion, jdbcType=VARCHAR} ) </insert> diff --git a/server/sonar-db-dao/src/schema/schema-sq.ddl b/server/sonar-db-dao/src/schema/schema-sq.ddl index bc77b77d309..100f7da4449 100644 --- a/server/sonar-db-dao/src/schema/schema-sq.ddl +++ b/server/sonar-db-dao/src/schema/schema-sq.ddl @@ -811,7 +811,8 @@ CREATE TABLE "QPROFILE_CHANGES"( "USER_UUID" CHARACTER VARYING(255), "CHANGE_DATA" CHARACTER LARGE OBJECT, "CREATED_AT" BIGINT NOT NULL, - "RULE_CHANGE_UUID" CHARACTER VARYING(40) + "RULE_CHANGE_UUID" CHARACTER VARYING(40), + "SQ_VERSION" CHARACTER VARYING(40) ); ALTER TABLE "QPROFILE_CHANGES" ADD CONSTRAINT "PK_QPROFILE_CHANGES" PRIMARY KEY("KEE"); CREATE INDEX "QP_CHANGES_RULES_PROFILE_UUID" ON "QPROFILE_CHANGES"("RULES_PROFILE_UUID" NULLS FIRST); |