aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-db-dao
diff options
context:
space:
mode:
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2017-09-04 17:44:40 +0200
committerStas Vilchik <stas.vilchik@sonarsource.com>2017-09-11 11:28:29 +0200
commit205cd6c0fa154a9fc8bff8607134c6eb53d234ad (patch)
tree1f861068750eaf9273f8483daf9ef3e05e08c17a /server/sonar-db-dao
parent09e1d1190d89d44d4168996532ee8223e62d87ca (diff)
downloadsonarqube-205cd6c0fa154a9fc8bff8607134c6eb53d234ad.tar.gz
sonarqube-205cd6c0fa154a9fc8bff8607134c6eb53d234ad.zip
SONAR-9181 WS api/projects/search filters on provisioned projects
Diffstat (limited to 'server/sonar-db-dao')
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentQuery.java12
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml7
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java35
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentQueryTest.java2
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 &lt; #{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 &lt; #{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