From: Sébastien Lesaint Date: Thu, 22 Sep 2016 12:27:38 +0000 (+0200) Subject: SONAR-8096 add selectByQuery to OrganizationDao X-Git-Tag: 6.2-RC1~598 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=28248a5effa3c9f70a3ca63c3306ed6241b9ff3e;p=sonarqube.git SONAR-8096 add selectByQuery to OrganizationDao does not yet implement any actual filtering, only paging --- diff --git a/sonar-db/src/main/java/org/sonar/db/organization/OrganizationDao.java b/sonar-db/src/main/java/org/sonar/db/organization/OrganizationDao.java index 8a25287d351..7f04710b193 100644 --- a/sonar-db/src/main/java/org/sonar/db/organization/OrganizationDao.java +++ b/sonar-db/src/main/java/org/sonar/db/organization/OrganizationDao.java @@ -19,6 +19,7 @@ */ package org.sonar.db.organization; +import java.util.List; import java.util.Optional; import org.sonar.db.Dao; import org.sonar.db.DbSession; @@ -32,6 +33,10 @@ public class OrganizationDao implements Dao { getMapper(dbSession).insert(organization); } + public List selectByQuery(DbSession dbSession, int offset, int limit) { + return getMapper(dbSession).selectByQuery(offset, limit); + } + public Optional selectByUuid(DbSession dbSession, String uuid) { requireNonNull(uuid, "uuid can't be null"); return Optional.ofNullable(getMapper(dbSession).selectByUuid(uuid)); diff --git a/sonar-db/src/main/java/org/sonar/db/organization/OrganizationMapper.java b/sonar-db/src/main/java/org/sonar/db/organization/OrganizationMapper.java index bcf515eae94..c507c84b76a 100644 --- a/sonar-db/src/main/java/org/sonar/db/organization/OrganizationMapper.java +++ b/sonar-db/src/main/java/org/sonar/db/organization/OrganizationMapper.java @@ -19,12 +19,15 @@ */ package org.sonar.db.organization; +import java.util.List; import javax.annotation.CheckForNull; import org.apache.ibatis.annotations.Param; public interface OrganizationMapper { void insert(@Param("organization") OrganizationDto organization); + List selectByQuery(@Param("offset") int offset, @Param("pageSize") int pageSize); + @CheckForNull OrganizationDto selectByKey(@Param("key") String key); diff --git a/sonar-db/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml b/sonar-db/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml index 259d5761240..cef2aa5cd97 100644 --- a/sonar-db/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml @@ -3,32 +3,69 @@ - uuid as "uuid", - kee as "key", - name as "name", - description as "description", - url as "url", - avatar_url as "avatarUrl", - created_at as "createdAt", - updated_at as "updatedAt" + org.uuid as "uuid", + org.kee as "key", + org.name as "name", + org.description as "description", + org.url as "url", + org.avatar_url as "avatarUrl", + org.created_at as "createdAt", + org.updated_at as "updatedAt" - + + + + + + + + + from organizations org + + insert into organizations ( diff --git a/sonar-db/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java b/sonar-db/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java index ad77e9b4cbf..41c8faab4d6 100644 --- a/sonar-db/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java +++ b/sonar-db/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Optional; +import java.util.Random; import org.apache.ibatis.exceptions.PersistenceException; import org.junit.Rule; import org.junit.Test; @@ -33,17 +34,18 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; public class OrganizationDaoTest { private static final OrganizationDto ORGANIZATION_DTO = new OrganizationDto() - .setUuid("a uuid") - .setKey("the_key") - .setName("the name") - .setDescription("the description") - .setUrl("the url") - .setAvatarUrl("the avatar url") - .setCreatedAt(1_999_000L) - .setUpdatedAt(1_888_000L); + .setUuid("a uuid") + .setKey("the_key") + .setName("the name") + .setDescription("the description") + .setUrl("the url") + .setAvatarUrl("the avatar url") + .setCreatedAt(1_999_000L) + .setUpdatedAt(1_888_000L); @Rule public final DbTester dbTester = DbTester.create(System2.INSTANCE); @@ -80,7 +82,7 @@ public class OrganizationDaoTest { @Test public void description_url_and_avatarUrl_are_optional() { - insertOrganization(ORGANIZATION_DTO.setDescription(null).setUrl(null).setAvatarUrl(null)); + insertOrganization(copyOf(ORGANIZATION_DTO).setDescription(null).setUrl(null).setAvatarUrl(null)); Map row = selectSingleRow(); assertThat(row.get("uuid")).isEqualTo(ORGANIZATION_DTO.getUuid()); @@ -98,11 +100,11 @@ public class OrganizationDaoTest { insertOrganization(ORGANIZATION_DTO); OrganizationDto dto = new OrganizationDto() - .setUuid(ORGANIZATION_DTO.getUuid()) - .setKey("other key") - .setName("other name") - .setCreatedAt(2_999_000L) - .setUpdatedAt(2_888_000L); + .setUuid(ORGANIZATION_DTO.getUuid()) + .setKey("other key") + .setName("other name") + .setCreatedAt(2_999_000L) + .setUpdatedAt(2_888_000L); expectedException.expect(PersistenceException.class); @@ -130,7 +132,7 @@ public class OrganizationDaoTest { } @Test - public void selectByLKey_is_case_sensitive() { + public void selectByKey_is_case_sensitive() { insertOrganization(ORGANIZATION_DTO); assertThat(underTest.selectByKey(dbSession, ORGANIZATION_DTO.getKey().toUpperCase(Locale.ENGLISH))).isEmpty(); @@ -163,6 +165,75 @@ public class OrganizationDaoTest { assertThat(underTest.selectByUuid(dbSession, ORGANIZATION_DTO.getUuid().toUpperCase(Locale.ENGLISH))).isEmpty(); } + @Test + public void selectByQuery_returns_empty_when_table_is_empty() { + assertThat(underTest.selectByQuery(dbSession, 1, 1)).isEmpty(); + } + + @Test + public void selectByQuery_returns_single_row_of_table_when_requesting_first_page_of_size_1_or_more() { + insertOrganization(ORGANIZATION_DTO); + + assertThat(underTest.selectByQuery(dbSession, 0, 1)) + .hasSize(1) + .extracting("uuid") + .containsOnly(ORGANIZATION_DTO.getUuid()); + + assertThat(underTest.selectByQuery(dbSession, 0, 10)) + .hasSize(1) + .extracting("uuid") + .containsOnly(ORGANIZATION_DTO.getUuid()); + } + + @Test + public void selectByQuery_returns_empty_on_table_with_single_row_when_not_requesting_the_first_page() { + insertOrganization(ORGANIZATION_DTO); + + assertThat(underTest.selectByQuery(dbSession, 1, 1)).isEmpty(); + assertThat(underTest.selectByQuery(dbSession, Math.abs(new Random().nextInt(10)) + 1, 1)).isEmpty(); + assertThat(underTest.selectByQuery(dbSession, 1, 10)).isEmpty(); + } + + @Test + public void selectByQuery_returns_rows_ordered_by_createdAt_descending_applying_requested_paging() { + long time = 1_999_999L; + insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid3").setKey("key-3").setCreatedAt(time)); + insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid1").setKey("key-1").setCreatedAt(time + 1_000)); + insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid2").setKey("key-2").setCreatedAt(time + 2_000)); + insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid5").setKey("key-5").setCreatedAt(time + 3_000)); + insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid4").setKey("key-4").setCreatedAt(time + 5_000)); + + assertThat(underTest.selectByQuery(dbSession, 0, 1)) + .extracting("uuid", "key") + .containsExactly(tuple("uuid4", "key-4")); + assertThat(underTest.selectByQuery(dbSession, 1, 1)) + .extracting("uuid", "key") + .containsExactly(tuple("uuid5", "key-5")); + assertThat(underTest.selectByQuery(dbSession, 2, 1)) + .extracting("uuid", "key") + .containsExactly(tuple("uuid2", "key-2")); + assertThat(underTest.selectByQuery(dbSession, 3, 1)) + .extracting("uuid", "key") + .containsExactly(tuple("uuid1", "key-1")); + assertThat(underTest.selectByQuery(dbSession, 4, 1)) + .extracting("uuid", "key") + .containsExactly(tuple("uuid3", "key-3")); + assertThat(underTest.selectByQuery(dbSession, 5, 1)) + .isEmpty(); + + assertThat(underTest.selectByQuery(dbSession, 0, 5)) + .extracting("uuid") + .containsExactly("uuid4", "uuid5", "uuid2", "uuid1", "uuid3"); + assertThat(underTest.selectByQuery(dbSession, 5, 5)) + .isEmpty(); + assertThat(underTest.selectByQuery(dbSession, 0, 3)) + .extracting("uuid") + .containsExactly("uuid4", "uuid5", "uuid2"); + assertThat(underTest.selectByQuery(dbSession, 3, 3)) + .extracting("uuid") + .containsExactly("uuid1", "uuid3"); + } + private void insertOrganization(OrganizationDto dto) { underTest.insert(dbSession, dto); dbSession.commit(); @@ -183,10 +254,22 @@ public class OrganizationDaoTest { private Map selectSingleRow() { List> rows = dbTester.select("select" + - " uuid as \"uuid\", kee as \"key\", name as \"name\", description as \"description\", url as \"url\", avatar_url as \"avatarUrl\"," + - " created_at as \"createdAt\", updated_at as \"updatedAt\"" + - " from organizations"); + " uuid as \"uuid\", kee as \"key\", name as \"name\", description as \"description\", url as \"url\", avatar_url as \"avatarUrl\"," + + " created_at as \"createdAt\", updated_at as \"updatedAt\"" + + " from organizations"); assertThat(rows).hasSize(1); return rows.get(0); } + + private static OrganizationDto copyOf(OrganizationDto organizationDto) { + return new OrganizationDto() + .setUuid(organizationDto.getUuid()) + .setKey(organizationDto.getKey()) + .setName(organizationDto.getName()) + .setDescription(organizationDto.getDescription()) + .setUrl(organizationDto.getUrl()) + .setAvatarUrl(organizationDto.getAvatarUrl()) + .setCreatedAt(organizationDto.getCreatedAt()) + .setUpdatedAt(organizationDto.getUpdatedAt()); + } }