diff options
author | Claire Villard <claire.villard@sonarsource.com> | 2024-10-01 18:42:45 +0200 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2024-10-14 20:03:02 +0000 |
commit | d7c1632113c8c1fe15766e3728a831a146c1de21 (patch) | |
tree | 4841a280c7c4f2c88511a31b3747decc50a350f1 /server/sonar-db-dao | |
parent | f135567f2bc832f2a24c4cf3d32d0b53d6f22cf8 (diff) | |
download | sonarqube-d7c1632113c8c1fe15766e3728a831a146c1de21.tar.gz sonarqube-d7c1632113c8c1fe15766e3728a831a146c1de21.zip |
SONAR-23213 'api/system/migrate_measures' endpoint
Diffstat (limited to 'server/sonar-db-dao')
8 files changed, 267 insertions, 53 deletions
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 9bc71dc3534..402e09abe5f 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 @@ -19,6 +19,7 @@ */ package org.sonar.db.component; +import com.google.common.annotations.VisibleForTesting; import java.util.Collection; import java.util.LinkedList; import java.util.List; @@ -136,6 +137,24 @@ public class BranchDao implements Dao { return mapper(session).countByNeedIssueSync(needIssueSync); } + public List<String> selectUuidsWithMeasuresMigratedFalse(DbSession session, int limit) { + return mapper(session).selectUuidsWithMeasuresMigratedFalse(limit); + } + + public int countByMeasuresMigratedFalse(DbSession session) { + return mapper(session).countByMeasuresMigratedFalse(); + } + + public long updateMeasuresMigrated(DbSession dbSession, String branchUuid, boolean measuresMigrated) { + long now = system2.now(); + return mapper(dbSession).updateMeasuresMigrated(branchUuid, measuresMigrated, now); + } + + @VisibleForTesting + boolean isMeasuresMigrated(DbSession dbSession, String uuid) { + return mapper(dbSession).isMeasuresMigrated(uuid); + } + public int countAll(DbSession session) { return mapper(session).countAll(); } @@ -178,8 +197,4 @@ public class BranchDao implements Dao { return false; } - public long updateMeasuresMigrated(DbSession dbSession, String branchUuid, boolean measuresMigrated) { - long now = system2.now(); - return mapper(dbSession).updateMeasuresMigrated(branchUuid, measuresMigrated, now); - } } 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 24cdbacc68c..95adbb62244 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 @@ -73,4 +73,10 @@ public interface BranchMapper { short doAnyOfComponentsNeedIssueSync(@Param("componentKeys") List<String> components); int updateMeasuresMigrated(@Param("uuid") String uuid, @Param("measuresMigrated") boolean measuresMigrated, @Param("now") long now); + + boolean isMeasuresMigrated(String uuid); + + List<String> selectUuidsWithMeasuresMigratedFalse(int limit); + + int countByMeasuresMigratedFalse(); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/portfolio/PortfolioDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/portfolio/PortfolioDao.java index cbcfd25b3c6..0a6863b6fe6 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/portfolio/PortfolioDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/portfolio/PortfolioDao.java @@ -19,6 +19,7 @@ */ package org.sonar.db.portfolio; +import com.google.common.annotations.VisibleForTesting; import java.util.List; import java.util.Optional; import java.util.Set; @@ -253,6 +254,24 @@ public class PortfolioDao implements Dao { mapper(dbSession).deleteBranch(portfolioUuid, projectUuid, branchUuid); } + public long updateMeasuresMigrated(DbSession dbSession, String branchUuid, boolean measuresMigrated) { + long now = system2.now(); + return mapper(dbSession).updateMeasuresMigrated(branchUuid, measuresMigrated, now); + } + + public List<String> selectUuidsWithMeasuresMigratedFalse(DbSession session, int limit) { + return mapper(session).selectUuidsWithMeasuresMigratedFalse(limit); + } + + public int countByMeasuresMigratedFalse(DbSession session) { + return mapper(session).countByMeasuresMigratedFalse(); + } + + @VisibleForTesting + boolean isMeasuresMigrated(DbSession dbSession, String uuid) { + return mapper(dbSession).isMeasuresMigrated(uuid); + } + /* * Utils */ @@ -268,8 +287,4 @@ public class PortfolioDao implements Dao { return portfolioDto.isRoot() ? Qualifiers.VIEW : Qualifiers.SUBVIEW; } - public long updateMeasuresMigrated(DbSession dbSession, String branchUuid, boolean measuresMigrated) { - long now = system2.now(); - return mapper(dbSession).updateMeasuresMigrated(branchUuid, measuresMigrated, now); - } } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/portfolio/PortfolioMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/portfolio/PortfolioMapper.java index 2e273acc6d7..1dbb66749bb 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/portfolio/PortfolioMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/portfolio/PortfolioMapper.java @@ -113,4 +113,10 @@ public interface PortfolioMapper { List<PortfolioDto> selectRootOfReferencersToAppBranch(@Param("appUuid") String appUuid, @Param("appBranchKey") String appBranchKey); int updateMeasuresMigrated(@Param("uuid") String uuid, @Param("measuresMigrated") boolean measuresMigrated, @Param("now") long now); + + List<String> selectUuidsWithMeasuresMigratedFalse(int limit); + + int countByMeasuresMigratedFalse(); + + boolean isMeasuresMigrated(@Param("uuid") String branchUuid); } 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 eafb0b008cb..238da88d1bd 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 @@ -256,4 +256,45 @@ where uuid = #{uuid, jdbcType=VARCHAR} </update> + + <select id="isMeasuresMigrated" resultType="boolean"> + select + pb.measures_migrated + from project_branches pb + where + pb.uuid = #{uuid, jdbcType=VARCHAR} + </select> + + <select id="selectUuidsWithMeasuresMigratedFalse" resultType="java.lang.String" parameterType="int"> + SELECT pb.uuid + FROM project_branches pb + WHERE pb.measures_migrated = ${_false} + ORDER BY pb.uuid ASC + LIMIT #{limit} + </select> + + <select id="selectUuidsWithMeasuresMigratedFalse" resultType="java.lang.String" parameterType="int" databaseId="oracle"> + SELECT * FROM ( + SELECT pb.uuid + FROM project_branches pb + WHERE pb.measures_migrated = ${_false} + ORDER BY pb.uuid ASC + ) WHERE rownum <= #{limit} + </select> + + <select id="selectUuidsWithMeasuresMigratedFalse" resultType="java.lang.String" parameterType="int" databaseId="mssql"> + SELECT top(#{limit, jdbcType=INTEGER}) pb.uuid + FROM project_branches pb + WHERE pb.measures_migrated = ${_false} + ORDER BY pb.uuid ASC + </select> + + <select id="countByMeasuresMigratedFalse" resultType="int"> + select + count(pb.uuid) + from project_branches pb + where + pb.measures_migrated = ${_false} + </select> + </mapper> diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/portfolio/PortfolioMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/portfolio/PortfolioMapper.xml index 832fc96bb4a..db973bc0b50 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/portfolio/PortfolioMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/portfolio/PortfolioMapper.xml @@ -544,6 +544,50 @@ measures_migrated = #{measuresMigrated, jdbcType=BOOLEAN}, updated_at = #{now, jdbcType=BIGINT} where - uuid = #{uuid, jdbcType=VARCHAR} + root_uuid = #{uuid, jdbcType=VARCHAR} </update> + + <select id="selectUuidsWithMeasuresMigratedFalse" resultType="java.lang.String" parameterType="int"> + SELECT p.uuid + FROM portfolios p + WHERE p.measures_migrated = ${_false} + AND p.parent_uuid is null + ORDER BY p.uuid ASC + LIMIT #{limit} + </select> + + <select id="selectUuidsWithMeasuresMigratedFalse" resultType="java.lang.String" parameterType="int" databaseId="oracle"> + SELECT * FROM ( + SELECT p.uuid + FROM portfolios p + WHERE p.measures_migrated = ${_false} + AND p.parent_uuid is null + ORDER BY p.uuid ASC + ) WHERE rownum <= #{limit} + </select> + + <select id="selectUuidsWithMeasuresMigratedFalse" resultType="java.lang.String" parameterType="int" databaseId="mssql"> + SELECT top(#{limit, jdbcType=INTEGER}) p.uuid + FROM portfolios p + WHERE p.measures_migrated = ${_false} + AND p.parent_uuid is null + ORDER BY p.uuid ASC + </select> + + <select id="countByMeasuresMigratedFalse" resultType="int"> + select + count(p.uuid) + from portfolios p + where + p.measures_migrated = ${_false} + and p.parent_uuid is null + </select> + + <select id="isMeasuresMigrated" resultType="boolean"> + select + p.measures_migrated + from portfolios p + where + p.uuid = #{uuid, jdbcType=VARCHAR} + </select> </mapper> 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 8f42fc67056..f11f90f271c 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 @@ -39,13 +39,11 @@ 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.dialect.Oracle; import org.sonar.db.metric.MetricDto; import org.sonar.db.project.ProjectDto; import org.sonar.db.protobuf.DbProjectBranches; import org.sonar.server.platform.db.migration.adhoc.AddMeasuresMigratedColumnToProjectBranchesTable; -import static java.lang.String.format; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; @@ -656,6 +654,70 @@ public class BranchDaoTest { } @Test + public void selectUuidsWithMeasuresMigratedFalse() throws SQLException { + createMeasuresMigratedColumn(); + + // master branch with flag set to false + ComponentDto notMigratedProject = db.components().insertPrivateProject(); + // branches & PRs + ComponentDto migratedBranch = db.components().insertProjectBranch(notMigratedProject, b -> b.setBranchType(BRANCH)); + ComponentDto notMigratedBranch = db.components().insertProjectBranch(notMigratedProject, b -> b.setBranchType(BranchType.BRANCH)); + ComponentDto migratedPR = db.components().insertProjectBranch(notMigratedProject, b -> b.setBranchType(BranchType.PULL_REQUEST)); + ComponentDto notMigratedPR = db.components().insertProjectBranch(notMigratedProject, b -> b.setBranchType(PULL_REQUEST)); + + db.getDbClient().branchDao().updateMeasuresMigrated(dbSession, migratedBranch.branchUuid(), true); + db.getDbClient().branchDao().updateMeasuresMigrated(dbSession, notMigratedBranch.branchUuid(), false); + db.getDbClient().branchDao().updateMeasuresMigrated(dbSession, migratedPR.branchUuid(), true); + + assertThat(underTest.selectUuidsWithMeasuresMigratedFalse(dbSession, 10)) + .hasSize(3) + .containsOnly(notMigratedProject.branchUuid(), notMigratedBranch.branchUuid(), notMigratedPR.branchUuid()); + + assertThat(underTest.selectUuidsWithMeasuresMigratedFalse(dbSession, 1)) + .hasSize(1) + .containsOnly(notMigratedProject.branchUuid()); + } + + @Test + public void countByMeasuresMigratedFalse() throws SQLException { + createMeasuresMigratedColumn(); + + // master branch with flag set to false + ComponentDto project = db.components().insertPrivateProject(); + // branches & PRs + ComponentDto branch1 = db.components().insertProjectBranch(project, b -> b.setBranchType(BRANCH)); + ComponentDto branch2 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)); + ComponentDto branch3 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST)); + db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST)); + + db.getDbClient().branchDao().updateMeasuresMigrated(dbSession, branch1.branchUuid(), true); + db.getDbClient().branchDao().updateMeasuresMigrated(dbSession, branch2.branchUuid(), false); + db.getDbClient().branchDao().updateMeasuresMigrated(dbSession, branch3.branchUuid(), true); + + assertThat(underTest.countByMeasuresMigratedFalse(dbSession)).isEqualTo(3); + } + + @Test + public void updateMeasuresMigrated() throws SQLException { + createMeasuresMigratedColumn(); + + ComponentDto project = db.components().insertPrivateProject(); + String uuid1 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)).uuid(); + String uuid2 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)).uuid(); + + underTest.updateMeasuresMigrated(dbSession, uuid1, true); + underTest.updateMeasuresMigrated(dbSession, uuid2, false); + + assertThat(underTest.isMeasuresMigrated(dbSession, uuid1)).isTrue(); + assertThat(underTest.isMeasuresMigrated(dbSession, uuid2)).isFalse(); + } + + private void createMeasuresMigratedColumn() throws SQLException { + AddMeasuresMigratedColumnToProjectBranchesTable migration = new AddMeasuresMigratedColumnToProjectBranchesTable(db.getDbClient().getDatabase()); + migration.execute(); + } + + @Test public void countAll() { assertThat(underTest.countAll(dbSession)).isZero(); @@ -780,31 +842,4 @@ public class BranchDaoTest { assertThat(underTest.doAnyOfComponentsNeedIssueSync(dbSession, componentKeys)).isTrue(); } - - @Test - public void updateMeasuresMigrated() throws SQLException { - new AddMeasuresMigratedColumnToProjectBranchesTable(db.getDbClient().getDatabase()).execute(); - - ComponentDto project = db.components().insertPrivateProject(); - String uuid1 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)).uuid(); - String uuid2 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)).uuid(); - - underTest.updateMeasuresMigrated(dbSession, uuid1, true); - underTest.updateMeasuresMigrated(dbSession, uuid2, false); - - assertThat(getMeasuresMigrated(uuid1)).isTrue(); - assertThat(getMeasuresMigrated(uuid2)).isFalse(); - } - - private boolean getMeasuresMigrated(String uuid1) { - List<Map<String, Object>> select = db.select(dbSession, - format("select measures_migrated as \"MIGRATED\" from project_branches where uuid = '%s'", uuid1)); - - assertThat(select).hasSize(1); - Object value = select.get(0).get("MIGRATED"); - if (db.getDbClient().getDatabase().getDialect().getId().equals(Oracle.ID)) { - return (long) value == 1; - } - return (boolean) value; - } } diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/portfolio/PortfolioDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/portfolio/PortfolioDaoTest.java index ae12b1b059d..9ea18c73c0e 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/portfolio/PortfolioDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/portfolio/PortfolioDaoTest.java @@ -20,8 +20,6 @@ package org.sonar.db.portfolio; import java.sql.SQLException; -import java.util.List; -import java.util.Map; import java.util.Set; import org.junit.Rule; import org.junit.Test; @@ -32,12 +30,10 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.audit.AuditPersister; import org.sonar.db.component.BranchDto; -import org.sonar.db.dialect.Oracle; import org.sonar.db.project.ApplicationProjectDto; import org.sonar.db.project.ProjectDto; import org.sonar.server.platform.db.migration.adhoc.AddMeasuresMigratedColumnToPortfoliosTable; -import static java.lang.String.format; import static java.util.Collections.emptySet; import static java.util.Collections.singleton; import static org.assertj.core.api.Assertions.assertThat; @@ -715,20 +711,76 @@ public class PortfolioDaoTest { portfolioDao.updateMeasuresMigrated(session, portfolio1.getUuid(), true); portfolioDao.updateMeasuresMigrated(session, portfolio2.getUuid(), false); - assertThat(getMeasuresMigrated(portfolio1.getUuid())).isTrue(); - assertThat(getMeasuresMigrated(portfolio2.getUuid())).isFalse(); + assertThat(portfolioDao.isMeasuresMigrated(session, portfolio1.getUuid())).isTrue(); + assertThat(portfolioDao.isMeasuresMigrated(session, portfolio2.getUuid())).isFalse(); } - private boolean getMeasuresMigrated(String uuid1) { - List<Map<String, Object>> select = db.select(session, - format("select measures_migrated as \"MIGRATED\" from portfolios where uuid = '%s'", uuid1)); + @Test + public void selectUuidsWithMeasuresMigratedFalse() throws SQLException { + createMeasuresMigratedColumn(); + + PortfolioDto migratedRoot = db.components().insertPrivatePortfolioDto(); + PortfolioDto migratedChild1 = addPortfolio(migratedRoot); + PortfolioDto notMigratedRoot = db.components().insertPrivatePortfolioDto(); + PortfolioDto notMigratedChild = addPortfolio(notMigratedRoot); + PortfolioDto notMigratedRoot2 = db.components().insertPrivatePortfolioDto(); + + // a parent portfolio and its children are expected to have the same migration status + db.getDbClient().portfolioDao().updateMeasuresMigrated(session, migratedRoot.getUuid(), true); + db.getDbClient().portfolioDao().updateMeasuresMigrated(session, migratedChild1.getUuid(), true); + db.getDbClient().portfolioDao().updateMeasuresMigrated(session, notMigratedRoot.getUuid(), false); + db.getDbClient().portfolioDao().updateMeasuresMigrated(session, notMigratedChild.getUuid(), false); + + assertThat(portfolioDao.selectUuidsWithMeasuresMigratedFalse(session, 10)) + .hasSize(2) + .containsOnly(notMigratedRoot.getUuid(), notMigratedRoot2.getUuid()); + + assertThat(portfolioDao.selectUuidsWithMeasuresMigratedFalse(session, 1)) + .hasSize(1) + .containsOnly(notMigratedRoot.getUuid()); + } + + @Test + public void countByMeasuresMigratedFalse() throws SQLException { + createMeasuresMigratedColumn(); + + PortfolioDto root = db.components().insertPrivatePortfolioDto(); + PortfolioDto child1 = addPortfolio(root); + PortfolioDto root2 = db.components().insertPrivatePortfolioDto(); + PortfolioDto child2 = addPortfolio(root2); + PortfolioDto root3 = db.components().insertPrivatePortfolioDto(); + db.components().insertPrivatePortfolioDto(); + + // a parent portfolio and its children are expected to have the same migration status + db.getDbClient().portfolioDao().updateMeasuresMigrated(session, root.getUuid(), true); + db.getDbClient().portfolioDao().updateMeasuresMigrated(session, child1.getUuid(), true); + db.getDbClient().portfolioDao().updateMeasuresMigrated(session, root2.getUuid(), false); + db.getDbClient().portfolioDao().updateMeasuresMigrated(session, child2.getUuid(), false); + db.getDbClient().portfolioDao().updateMeasuresMigrated(session, root3.getUuid(), false); + + assertThat(portfolioDao.countByMeasuresMigratedFalse(session)).isEqualTo(3); + } + + @Test + public void updateMeasuresMigrated() throws SQLException { + createMeasuresMigratedColumn(); + + PortfolioDto portfolio1 = db.components().insertPrivatePortfolioDto("name1"); + PortfolioDto portfolio2 = db.components().insertPrivatePortfolioDto("name2"); + PortfolioDto portfolio3 = db.components().insertPrivatePortfolioDto("name3", + p -> p.setRootUuid(portfolio1.getUuid()).setParentUuid(portfolio1.getUuid())); + + portfolioDao.updateMeasuresMigrated(session, portfolio1.getUuid(), true); + portfolioDao.updateMeasuresMigrated(session, portfolio2.getUuid(), false); + + assertThat(portfolioDao.isMeasuresMigrated(session, portfolio1.getUuid())).isTrue(); + assertThat(portfolioDao.isMeasuresMigrated(session, portfolio2.getUuid())).isFalse(); + assertThat(portfolioDao.isMeasuresMigrated(session, portfolio3.getUuid())).isTrue(); + } - assertThat(select).hasSize(1); - Object value = select.get(0).get("MIGRATED"); - if (db.getDbClient().getDatabase().getDialect().getId().equals(Oracle.ID)) { - return (long) value == 1; - } - return (boolean) value; + private void createMeasuresMigratedColumn() throws SQLException { + AddMeasuresMigratedColumnToPortfoliosTable migration = new AddMeasuresMigratedColumnToPortfoliosTable(db.getDbClient().getDatabase()); + migration.execute(); } private PortfolioDto addPortfolio(PortfolioDto parent) { |