diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2017-09-04 17:44:40 +0200 |
---|---|---|
committer | Stas Vilchik <stas.vilchik@sonarsource.com> | 2017-09-11 11:28:29 +0200 |
commit | 205cd6c0fa154a9fc8bff8607134c6eb53d234ad (patch) | |
tree | 1f861068750eaf9273f8483daf9ef3e05e08c17a /server/sonar-db-dao | |
parent | 09e1d1190d89d44d4168996532ee8223e62d87ca (diff) | |
download | sonarqube-205cd6c0fa154a9fc8bff8607134c6eb53d234ad.tar.gz sonarqube-205cd6c0fa154a9fc8bff8607134c6eb53d234ad.zip |
SONAR-9181 WS api/projects/search filters on provisioned projects
Diffstat (limited to 'server/sonar-db-dao')
4 files changed, 47 insertions, 9 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 2568f8ba22b..11335fc10d2 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 @@ -36,6 +36,7 @@ public class ComponentQuery { private final Boolean isPrivate; private final Set<Long> componentIds; private final Long analyzedBefore; + private final boolean onProvisionedOnly; private ComponentQuery(Builder builder) { this.nameOrKeyQuery = builder.nameOrKeyQuery; @@ -45,6 +46,7 @@ public class ComponentQuery { this.componentIds = builder.componentIds; this.isPrivate = builder.isPrivate; this.analyzedBefore = builder.analyzedBefore; + this.onProvisionedOnly = builder.onProvisionedOnly; } public String[] getQualifiers() { @@ -91,6 +93,10 @@ public class ComponentQuery { return analyzedBefore; } + public boolean isOnProvisionedOnly() { + return onProvisionedOnly; + } + public static Builder builder() { return new Builder(); } @@ -103,6 +109,7 @@ public class ComponentQuery { private Boolean isPrivate; private Set<Long> componentIds; private Long analyzedBefore; + private boolean onProvisionedOnly = false; public Builder setNameOrKeyQuery(@Nullable String nameOrKeyQuery) { this.nameOrKeyQuery = nameOrKeyQuery; @@ -142,6 +149,11 @@ public class ComponentQuery { return this; } + public Builder setOnProvisionedOnly(boolean onProvisionedOnly) { + this.onProvisionedOnly = onProvisionedOnly; + return this; + } + public ComponentQuery build() { checkArgument(qualifiers != null && qualifiers.length > 0, "At least one qualifier must be provided"); checkArgument(nameOrKeyQuery != null || partialMatchOnKey == null, "A query must be provided if a partial match on key is specified."); 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 d9e90aa8110..0e189b06595 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 @@ -250,8 +250,8 @@ <sql id="sqlSelectByQuery"> from projects p <if test="query.analyzedBefore!=null"> - inner join snapshots s on s.component_uuid=p.uuid and s.status='P' and s.islast=${_true} - and s.created_at < #{query.analyzedBefore,jdbcType=BIGINT} + inner join snapshots sa on sa.component_uuid=p.uuid + and sa.status='P' and sa.islast=${_true} and sa.created_at < #{query.analyzedBefore,jdbcType=BIGINT} </if> where p.enabled=${_true} @@ -296,6 +296,9 @@ and p.private=${_false} </if> </if> + <if test="query.isOnProvisionedOnly()"> + and not exists(select 1 from snapshots sp where sp.component_uuid=p.uuid) + </if> </sql> <select id="selectDescendants" resultType="Component"> 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 484612e7e28..490dcc5210d 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 @@ -26,6 +26,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Supplier; import javax.annotation.Nullable; import org.apache.ibatis.session.RowBounds; import org.assertj.core.api.ListAssert; @@ -628,40 +629,60 @@ public class ComponentDaoTest { String viewUuid = db.components().insertProjectAndSnapshot(ComponentTesting.newView(organization)).getComponentUuid(); Set<String> projectQualifiers = newHashSet(Qualifiers.PROJECT); + Supplier<ComponentQuery.Builder> query = () -> ComponentQuery.builder().setQualifiers(Qualifiers.PROJECT).setOnProvisionedOnly(true); assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), null, projectQualifiers, new RowBounds(0, 10))) .extracting(ComponentDto::uuid) .containsOnly(provisionedProject.uuid()); + assertThat(underTest.selectByQuery(dbSession, organization.getUuid(), query.get().build(), 0, 10)) + .extracting(ComponentDto::uuid) + .containsOnly(provisionedProject.uuid()); // pagination - assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), null, projectQualifiers, new RowBounds(2, 10))) - .isEmpty(); + assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), null, projectQualifiers, new RowBounds(2, 10))).isEmpty(); + assertThat(underTest.selectByQuery(dbSession, organization.getUuid(), query.get().build(), 2, 10)).isEmpty(); // filter on qualifiers - assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), null, newHashSet("XXX"), new RowBounds(0, 10))) - .isEmpty(); + assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), null, newHashSet("XXX"), new RowBounds(0, 10))).isEmpty(); + assertThat(underTest.selectByQuery(dbSession, organization.getUuid(), query.get().setQualifiers("XXX").build(), 0, 10)).isEmpty(); assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), null, newHashSet(Qualifiers.PROJECT, "XXX"), new RowBounds(0, 10))) .extracting(ComponentDto::uuid) .containsOnly(provisionedProject.uuid()); + assertThat(underTest.selectByQuery(dbSession, organization.getUuid(), query.get().setQualifiers(Qualifiers.PROJECT, "XXX").build(), 0, 10)) + .extracting(ComponentDto::uuid) + .containsOnly(provisionedProject.uuid()); assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), null, newHashSet(Qualifiers.PROJECT, Qualifiers.VIEW), new RowBounds(0, 10))) .extracting(ComponentDto::uuid) .containsOnly(provisionedProject.uuid(), provisionedView.uuid()); + assertThat(underTest.selectByQuery(dbSession, organization.getUuid(), query.get().setQualifiers(Qualifiers.PROJECT, Qualifiers.VIEW).build(), 0, 10)) + .extracting(ComponentDto::uuid) + .containsOnly(provisionedProject.uuid(), provisionedView.uuid()); // match key assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), provisionedProject.getDbKey(), projectQualifiers, new RowBounds(0, 10))) .extracting(ComponentDto::uuid) .containsExactly(provisionedProject.uuid()); + assertThat(underTest.selectByQuery(dbSession, organization.getUuid(), query.get().setNameOrKeyQuery(provisionedProject.getDbKey()).build(), 0, 10)) + .extracting(ComponentDto::uuid) + .containsExactly(provisionedProject.uuid()); assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), "pROvisiONed.proJEcT", projectQualifiers, new RowBounds(0, 10))) .extracting(ComponentDto::uuid) .containsExactly(provisionedProject.uuid()); - assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), "missing", projectQualifiers, new RowBounds(0, 10))) - .isEmpty(); - assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), "to be escaped '\"\\%", projectQualifiers, new RowBounds(0, 10))) + assertThat(underTest.selectByQuery(dbSession, organization.getUuid(), query.get().setNameOrKeyQuery("pROvisiONed.proJEcT").setPartialMatchOnKey(true).build(), 0, 10)) + .extracting(ComponentDto::uuid) + .containsExactly(provisionedProject.uuid()); + assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), "missing", projectQualifiers, new RowBounds(0, 10))).isEmpty(); + assertThat(underTest.selectByQuery(dbSession, organization.getUuid(), query.get().setNameOrKeyQuery("missing").setPartialMatchOnKey(true).build(), 0, 10)).isEmpty(); + assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), "to be escaped '\"\\%", projectQualifiers, new RowBounds(0, 10))).isEmpty(); + assertThat(underTest.selectByQuery(dbSession, organization.getUuid(), query.get().setNameOrKeyQuery("to be escaped '\"\\%").setPartialMatchOnKey(true).build(), 0, 10)) .isEmpty(); // match name assertThat(underTest.selectProvisioned(dbSession, organization.getUuid(), "ned proj", projectQualifiers, new RowBounds(0, 10))) .extracting(ComponentDto::uuid) .containsExactly(provisionedProject.uuid()); + assertThat(underTest.selectByQuery(dbSession, organization.getUuid(), query.get().setNameOrKeyQuery("ned proj").setPartialMatchOnKey(true).build(), 0, 10)) + .extracting(ComponentDto::uuid) + .containsExactly(provisionedProject.uuid()); } @Test 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 d69f98c277f..018cec3f8b6 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 @@ -44,6 +44,8 @@ public class ComponentQueryTest { assertThat(underTest.getLanguage()).isEqualTo("java"); assertThat(underTest.getQualifiers()).containsOnly(PROJECT); assertThat(underTest.getAnalyzedBefore()).isEqualTo(1_000_000_000L); + assertThat(underTest.isOnProvisionedOnly()).isFalse(); + assertThat(underTest.isPartialMatchOnKey()).isFalse(); } @Test |