From be45c77d7b596d2afaf7d5981d13007a100faf24 Mon Sep 17 00:00:00 2001 From: Sébastien Lesaint Date: Fri, 27 Jan 2017 16:51:21 +0100 Subject: SONAR-8650 add organization parameter to api/projects/ghosts --- .../java/org/sonar/db/component/ComponentDao.java | 27 +- .../org/sonar/db/component/ComponentMapper.java | 7 +- .../org/sonar/db/component/ComponentMapper.xml | 13 +- .../org/sonar/db/component/ComponentDaoTest.java | 39 ++- .../org/sonar/db/component/ComponentDbTester.java | 16 +- .../ComponentDaoTest/select_ghost_projects.xml | 335 --------------------- 6 files changed, 68 insertions(+), 369 deletions(-) delete mode 100644 sonar-db/src/test/resources/org/sonar/db/component/ComponentDaoTest/select_ghost_projects.xml (limited to 'sonar-db/src') diff --git a/sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java b/sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java index d475e9ead20..7deb692a59a 100644 --- a/sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java +++ b/sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java @@ -41,7 +41,6 @@ import org.sonar.db.DbSession; import org.sonar.db.RowNotFoundException; import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.collect.Maps.newHashMapWithExpectedSize; import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; import static org.apache.commons.lang.StringUtils.isBlank; @@ -263,20 +262,12 @@ public class ComponentDao implements Dao { return DatabaseUtils.buildLikeValue(textQuery.toUpperCase(Locale.ENGLISH), BEFORE_AND_AFTER); } - public List selectGhostProjects(DbSession session, int offset, int limit, @Nullable String query) { - Map parameters = newHashMapWithExpectedSize(2); - addProjectQualifier(parameters); - addPartialQueryParameterIfNotNull(parameters, query); - - return mapper(session).selectGhostProjects(parameters, new RowBounds(offset, limit)); + public List selectGhostProjects(DbSession session, String organizationUuid, @Nullable String query, int offset, int limit) { + return mapper(session).selectGhostProjects(organizationUuid, queryParameterFrom(query), new RowBounds(offset, limit)); } - public long countGhostProjects(DbSession session, @Nullable String query) { - Map parameters = newHashMapWithExpectedSize(2); - addProjectQualifier(parameters); - addPartialQueryParameterIfNotNull(parameters, query); - - return mapper(session).countGhostProjects(parameters); + public long countGhostProjects(DbSession session, String organizationUuid, @Nullable String query) { + return mapper(session).countGhostProjects(organizationUuid, queryParameterFrom(query)); } /** @@ -317,12 +308,16 @@ public class ComponentDao implements Dao { private static void addPartialQueryParameterIfNotNull(Map parameters, @Nullable String keyOrNameFilter) { // TODO rely on resource_index table and match exactly the key if (keyOrNameFilter != null) { - parameters.put("query", "%" + keyOrNameFilter.toUpperCase(Locale.ENGLISH) + "%"); + parameters.put("query", queryParameterFrom(keyOrNameFilter)); } } - private static void addProjectQualifier(Map parameters) { - parameters.put("qualifier", Qualifiers.PROJECT); + @CheckForNull + private static String queryParameterFrom(@Nullable String keyOrNameFilter) { + if (keyOrNameFilter != null) { + return "%" + keyOrNameFilter.toUpperCase(Locale.ENGLISH) + "%"; + } + return null; } public void insert(DbSession session, ComponentDto item) { diff --git a/sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java b/sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java index 2cddadffbd4..23bda21a9e9 100644 --- a/sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java +++ b/sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java @@ -21,7 +21,6 @@ package org.sonar.db.component; import java.util.Collection; import java.util.List; -import java.util.Map; import java.util.Set; import javax.annotation.CheckForNull; import javax.annotation.Nullable; @@ -122,14 +121,14 @@ public interface ComponentMapper { int countProvisioned(@Param("organizationUuid") String organizationUuid, @Nullable @Param("keyOrNameLike") String keyOrNameLike, @Param("qualifiers") Set qualifiers); - List selectGhostProjects(Map parameters, RowBounds rowBounds); + List selectGhostProjects(@Param("organizationUuid") String organizationUuid, @Nullable @Param("query") String query, RowBounds rowBounds); + + long countGhostProjects(@Param("organizationUuid") String organizationUuid, @Nullable @Param("query") String query); List selectComponentsHavingSameKeyOrderedById(String key); List selectProjectsByNameQuery(@Param("nameQuery") @Nullable String nameQuery, @Param("includeModules") boolean includeModules); - long countGhostProjects(Map parameters); - void selectForIndexing(@Param("projectUuid") @Nullable String projectUuid, ResultHandler handler); void insert(ComponentDto componentDto); diff --git a/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml b/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml index b8a97b3df49..79b19813fff 100644 --- a/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml @@ -380,23 +380,24 @@ - + inner join snapshots s1 on s1.component_uuid = p.uuid and s1.status='U' left join snapshots s2 on s2.component_uuid = p.uuid and s2.status='P' where s2.id is null - and p.qualifier=#{qualifier,jdbcType=VARCHAR} + and p.qualifier='TRK' and p.copy_component_uuid is null and ( diff --git a/sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java b/sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java index 646a54be31a..2ac7254b0ce 100644 --- a/sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java +++ b/sonar-db/src/test/java/org/sonar/db/component/ComponentDaoTest.java @@ -49,6 +49,7 @@ import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.guava.api.Assertions.assertThat; import static org.sonar.db.component.ComponentTesting.newDeveloper; +import static org.sonar.db.component.ComponentTesting.newDirectory; import static org.sonar.db.component.ComponentTesting.newFileDto; import static org.sonar.db.component.ComponentTesting.newModuleDto; import static org.sonar.db.component.ComponentTesting.newProjectCopy; @@ -596,13 +597,39 @@ public class ComponentDaoTest { @Test public void select_ghost_projects() { - db.prepareDbUnit(getClass(), "select_ghost_projects.xml"); - - List result = underTest.selectGhostProjects(dbSession, 0, 10, null); + OrganizationDto organization = db.organizations().insert(); - assertThat(result).hasSize(1); - assertThat(result.get(0).key()).isEqualTo("org.ghost.project"); - assertThat(underTest.countGhostProjects(dbSession, null)).isEqualTo(1); + // ghosts because has at least one snapshot with status U but none with status P + ComponentDto ghostProject = db.components().insertProject(organization); + db.components().insertSnapshot(ghostProject, dto -> dto.setStatus("U")); + db.components().insertSnapshot(ghostProject, dto -> dto.setStatus("U")); + ComponentDto ghostProject2 = db.components().insertProject(organization); + db.components().insertSnapshot(ghostProject2, dto -> dto.setStatus("U")); + ComponentDto disabledGhostProject = db.components().insertProject(dto -> dto.setEnabled(false)); + db.components().insertSnapshot(disabledGhostProject, dto -> dto.setStatus("U")); + + ComponentDto project1 = db.components().insertProject(organization); + db.components().insertSnapshot(project1, dto -> dto.setStatus("P")); + db.components().insertSnapshot(project1, dto -> dto.setStatus("U")); + ComponentDto module = db.components().insertComponent(newModuleDto(project1)); + ComponentDto dir = db.components().insertComponent(newDirectory(module, "foo")); + db.components().insertComponent(newFileDto(module, dir, "bar")); + + ComponentDto provisionedProject = db.components().insertProject(organization); + + // not a ghost because has at least one snapshot with status P + ComponentDto project2 = db.components().insertProject(organization); + db.components().insertSnapshot(project2, dto -> dto.setStatus("P")); + + // not a ghost because it's not a project + ComponentDto view = db.components().insertView(organization); + db.components().insertSnapshot(view, dto -> dto.setStatus("U")); + db.components().insertComponent(newProjectCopy("do", project1, view)); + + assertThat(underTest.selectGhostProjects(dbSession, organization.getUuid(), null, 0, 10)) + .extracting(ComponentDto::uuid) + .containsOnly(ghostProject.uuid(), ghostProject2.uuid(), disabledGhostProject.uuid()); + assertThat(underTest.countGhostProjects(dbSession, organization.getUuid(), null)).isEqualTo(3); } @Test diff --git a/sonar-db/src/test/java/org/sonar/db/component/ComponentDbTester.java b/sonar-db/src/test/java/org/sonar/db/component/ComponentDbTester.java index 67d438cb847..d8f93680b66 100644 --- a/sonar-db/src/test/java/org/sonar/db/component/ComponentDbTester.java +++ b/sonar-db/src/test/java/org/sonar/db/component/ComponentDbTester.java @@ -95,7 +95,7 @@ public class ComponentDbTester { } public ComponentDto insertView(OrganizationDto organizationDto) { - return insertComponentImpl(newView(organizationDto), dto -> {}); + return insertComponentImpl(newView(organizationDto), noExtraConfiguration()); } public ComponentDto insertView(OrganizationDto organizationDto, Consumer dtoPopulator) { @@ -111,7 +111,7 @@ public class ComponentDbTester { } public ComponentDto insertDeveloper(String name, Consumer dtoPopulator) { - return insertComponentImpl(newDeveloper(db.getDefaultOrganization(), name), noExtraConfiguration()); + return insertComponentImpl(newDeveloper(db.getDefaultOrganization(), name), dtoPopulator); } public ComponentDto insertDeveloper(String name) { @@ -145,4 +145,16 @@ public class ComponentDbTester { db.commit(); return snapshot; } + + public SnapshotDto insertSnapshot(ComponentDto componentDto) { + return insertSnapshot(componentDto, noExtraConfiguration()); + } + + public SnapshotDto insertSnapshot(ComponentDto componentDto, Consumer consumer) { + SnapshotDto snapshotDto = SnapshotTesting.newAnalysis(componentDto); + consumer.accept(snapshotDto); + SnapshotDto snapshot = dbClient.snapshotDao().insert(dbSession, snapshotDto); + db.commit(); + return snapshot; + } } diff --git a/sonar-db/src/test/resources/org/sonar/db/component/ComponentDaoTest/select_ghost_projects.xml b/sonar-db/src/test/resources/org/sonar/db/component/ComponentDaoTest/select_ghost_projects.xml deleted file mode 100644 index f5ad3efa9c2..00000000000 --- a/sonar-db/src/test/resources/org/sonar/db/component/ComponentDaoTest/select_ghost_projects.xml +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- cgit v1.2.3