From a107ea241311333fdb276d6bd0cba4036d9ec653 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Fri, 29 Jun 2018 10:27:34 +0200 Subject: [PATCH] SONARCLOUD-78 fix project_6m_inactive_projects regarding branches --- .../sonar/db/component/ComponentQuery.java | 17 ++++++++++++-- .../sonar/db/component/ComponentMapper.xml | 21 +++++++++++++++++ .../sonar/db/component/ComponentDaoTest.java | 23 ++++++++++++++++++- .../db/component/ComponentQueryTest.java | 4 ++-- 4 files changed, 60 insertions(+), 5 deletions(-) diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentQuery.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentQuery.java index b5afda44e30..b2062ad2a69 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentQuery.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentQuery.java @@ -39,6 +39,7 @@ public class ComponentQuery { private final Set componentUuids; private final Set componentKeys; private final Long analyzedBefore; + private final Long anyBranchAnalyzedBefore; private final Long anyBranchAnalyzedAfter; private final Date createdAfter; private final boolean onProvisionedOnly; @@ -52,6 +53,7 @@ public class ComponentQuery { this.componentKeys = builder.componentKeys; this.isPrivate = builder.isPrivate; this.analyzedBefore = builder.analyzedBefore; + this.anyBranchAnalyzedBefore = builder.anyBranchAnalyzedBefore; this.anyBranchAnalyzedAfter = builder.anyBranchAnalyzedAfter; this.createdAfter = builder.createdAfter; this.onProvisionedOnly = builder.onProvisionedOnly; @@ -106,6 +108,11 @@ public class ComponentQuery { return analyzedBefore; } + @CheckForNull + public Long getAnyBranchAnalyzedBefore() { + return anyBranchAnalyzedBefore; + } + @CheckForNull public Long getAnyBranchAnalyzedAfter() { return anyBranchAnalyzedAfter; @@ -138,6 +145,7 @@ public class ComponentQuery { private Set componentUuids; private Set componentKeys; private Long analyzedBefore; + private Long anyBranchAnalyzedBefore; private Long anyBranchAnalyzedAfter; private Date createdAfter; private boolean onProvisionedOnly = false; @@ -180,8 +188,13 @@ public class ComponentQuery { return this; } - public Builder setAnalyzedBefore(@Nullable Long analyzedBefore) { - this.analyzedBefore = analyzedBefore; + public Builder setAnalyzedBefore(@Nullable Long l) { + this.analyzedBefore = l; + return this; + } + + public Builder setAnyBranchAnalyzedBefore(@Nullable Long l) { + this.anyBranchAnalyzedBefore = l; return this; } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml index 2bf6826e053..4dcc61d5277 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml @@ -434,6 +434,27 @@ ) ) + + and ( + exists( + -- branches of projects + select 1 from snapshots s + inner join project_branches pb on s.component_uuid = pb.uuid + where pb.project_uuid = p.uuid + and s.status='P' + and s.islast = ${_true} + and s.created_at < #{query.anyBranchAnalyzedBefore,jdbcType=BIGINT} + ) + or exists ( + -- applications, portfolios + select 1 from snapshots s + where s.component_uuid = p.uuid + and s.status='P' + and s.islast = ${_true} + and s.created_at < #{query.anyBranchAnalyzedBefore,jdbcType=BIGINT} + ) + ) + and p.created_at >= #{query.createdAfter,jdbcType=TIMESTAMP} diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java index 13bce57e910..b58ef55e99f 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java @@ -1605,7 +1605,7 @@ public class ComponentDaoTest { db.components().insertSnapshot(recentProject, s -> s.setCreatedAt(recentTime).setLast(true)); db.components().insertSnapshot(recentProject, s -> s.setCreatedAt(aLongTimeAgo).setLast(false)); - // before date + // before date on main branch assertThat(selectProjectUuidsByQuery(q -> q.setAnalyzedBefore(recentTime))) .containsExactlyInAnyOrder(oldProject.uuid()); assertThat(selectProjectUuidsByQuery(q -> q.setAnalyzedBefore(aLongTimeAgo))) @@ -1613,6 +1613,14 @@ public class ComponentDaoTest { assertThat(selectProjectUuidsByQuery(q -> q.setAnalyzedBefore(recentTime + 1_000L))) .containsExactlyInAnyOrder(oldProject.uuid(), recentProject.uuid()); + // before date on any branch + assertThat(selectProjectUuidsByQuery(q -> q.setAnyBranchAnalyzedBefore(recentTime))) + .containsExactlyInAnyOrder(oldProject.uuid()); + assertThat(selectProjectUuidsByQuery(q -> q.setAnyBranchAnalyzedBefore(aLongTimeAgo))) + .isEmpty(); + assertThat(selectProjectUuidsByQuery(q -> q.setAnyBranchAnalyzedBefore(recentTime + 1_000L))) + .containsExactlyInAnyOrder(oldProject.uuid(), recentProject.uuid()); + // after date assertThat(selectProjectUuidsByQuery(q -> q.setAnyBranchAnalyzedAfter(recentTime - 1_000L))) .containsExactlyInAnyOrder(recentProject.uuid()); @@ -1637,6 +1645,19 @@ public class ComponentDaoTest { db.components().insertSnapshot(recentProjectBranch, s -> s.setCreatedAt(recentTime).setLast(true)); db.components().insertSnapshot(recentProjectBranch, s -> s.setCreatedAt(aLongTimeAgo).setLast(false)); + // before date on main branch only + assertThat(selectProjectUuidsByQuery(q -> q.setAnalyzedBefore(recentTime))).isEmpty(); + assertThat(selectProjectUuidsByQuery(q -> q.setAnalyzedBefore(aLongTimeAgo))).isEmpty(); + assertThat(selectProjectUuidsByQuery(q -> q.setAnalyzedBefore(recentTime + 1_000L))).isEmpty(); + + // before date on any branch + assertThat(selectProjectUuidsByQuery(q -> q.setAnyBranchAnalyzedBefore(recentTime))) + .containsExactlyInAnyOrder(oldProject.uuid()); + assertThat(selectProjectUuidsByQuery(q -> q.setAnyBranchAnalyzedBefore(aLongTimeAgo))) + .isEmpty(); + assertThat(selectProjectUuidsByQuery(q -> q.setAnyBranchAnalyzedBefore(recentTime + 1_000L))) + .containsExactlyInAnyOrder(oldProject.uuid(), recentProject.uuid()); + // after date assertThat(selectProjectUuidsByQuery(q -> q.setAnyBranchAnalyzedAfter(recentTime - 1_000L))) .containsExactlyInAnyOrder(recentProject.uuid()); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentQueryTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentQueryTest.java index f619b5fe09f..7815d5d5d4e 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentQueryTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentQueryTest.java @@ -39,7 +39,7 @@ public class ComponentQueryTest { public void build_query() { ComponentQuery underTest = ComponentQuery.builder() .setNameOrKeyQuery("key") - .setAnalyzedBefore(100L) + .setAnyBranchAnalyzedBefore(100L) .setAnyBranchAnalyzedAfter(200L) .setCreatedAfter(new Date(300L)) .setQualifiers(PROJECT) @@ -47,7 +47,7 @@ public class ComponentQueryTest { assertThat(underTest.getNameOrKeyQuery()).isEqualTo("key"); assertThat(underTest.getQualifiers()).containsOnly(PROJECT); - assertThat(underTest.getAnalyzedBefore()).isEqualTo(100L); + assertThat(underTest.getAnyBranchAnalyzedBefore()).isEqualTo(100L); assertThat(underTest.getAnyBranchAnalyzedAfter()).isEqualTo(200L); assertThat(underTest.getCreatedAfter().getTime()).isEqualTo(300L); assertThat(underTest.isOnProvisionedOnly()).isFalse(); -- 2.39.5