diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2016-02-11 21:20:18 +0100 |
---|---|---|
committer | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2016-02-15 13:44:59 +0100 |
commit | 89a93e795af89c98f5e99de60620c21287f7889e (patch) | |
tree | 105152b4d0ac83e11cdc6749b2e37c8b3b24e338 /sonar-db/src | |
parent | 8909ccd99b9bc5874f24395519d66e2bcb9bdacb (diff) | |
download | sonarqube-89a93e795af89c98f5e99de60620c21287f7889e.tar.gz sonarqube-89a93e795af89c98f5e99de60620c21287f7889e.zip |
SONAR-7187 WS api/ce/activity handles queue and past CE tasks
Diffstat (limited to 'sonar-db/src')
9 files changed, 165 insertions, 28 deletions
diff --git a/sonar-db/src/main/java/org/sonar/db/ce/CeActivityDao.java b/sonar-db/src/main/java/org/sonar/db/ce/CeActivityDao.java index d4922d8c7c6..97bf1f41c4f 100644 --- a/sonar-db/src/main/java/org/sonar/db/ce/CeActivityDao.java +++ b/sonar-db/src/main/java/org/sonar/db/ce/CeActivityDao.java @@ -64,11 +64,12 @@ public class CeActivityDao implements Dao { /** * Ordered by id desc -> newest to oldest */ - public List<CeActivityDto> selectByQuery(DbSession dbSession, CeActivityQuery query, RowBounds rowBounds) { + public List<CeActivityDto> selectByQuery(DbSession dbSession, CeActivityQuery query, int offset, int pageSize) { if (query.isShortCircuitedByComponentUuids()) { return Collections.emptyList(); } - return mapper(dbSession).selectByQuery(query, rowBounds); + + return mapper(dbSession).selectByQuery(query, new RowBounds(offset, pageSize)); } public int countByQuery(DbSession dbSession, CeActivityQuery query) { diff --git a/sonar-db/src/main/java/org/sonar/db/ce/CeActivityQuery.java b/sonar-db/src/main/java/org/sonar/db/ce/CeActivityQuery.java index 8813a996436..2681554dcab 100644 --- a/sonar-db/src/main/java/org/sonar/db/ce/CeActivityQuery.java +++ b/sonar-db/src/main/java/org/sonar/db/ce/CeActivityQuery.java @@ -32,7 +32,7 @@ public class CeActivityQuery { private boolean onlyCurrents = false; private List<String> componentUuids; - private CeActivityDto.Status status; + private List<String> statuses; private String type; private Long minSubmittedAt; private Long maxExecutedAt; @@ -70,12 +70,12 @@ public class CeActivityQuery { } @CheckForNull - public CeActivityDto.Status getStatus() { - return status; + public List<String> getStatuses() { + return statuses; } - public CeActivityQuery setStatus(@Nullable CeActivityDto.Status status) { - this.status = status; + public CeActivityQuery setStatuses(@Nullable List<String> statuses) { + this.statuses = statuses; return this; } diff --git a/sonar-db/src/main/java/org/sonar/db/ce/CeQueueDao.java b/sonar-db/src/main/java/org/sonar/db/ce/CeQueueDao.java index 1b58a57ccf9..09f0b964ea6 100644 --- a/sonar-db/src/main/java/org/sonar/db/ce/CeQueueDao.java +++ b/sonar-db/src/main/java/org/sonar/db/ce/CeQueueDao.java @@ -21,12 +21,15 @@ package org.sonar.db.ce; import com.google.common.base.Optional; import java.util.List; +import org.apache.ibatis.session.RowBounds; +import org.sonar.api.utils.Paging; import org.sonar.api.utils.System2; import org.sonar.db.Dao; import org.sonar.db.DbSession; -import static org.sonar.db.ce.CeQueueDto.Status.PENDING; +import static java.util.Collections.emptyList; import static org.sonar.db.ce.CeQueueDto.Status.IN_PROGRESS; +import static org.sonar.db.ce.CeQueueDto.Status.PENDING; public class CeQueueDao implements Dao { @@ -43,6 +46,26 @@ public class CeQueueDao implements Dao { return mapper(session).selectAllInAscOrder(); } + public List<CeQueueDto> selectByQueryInDescOrder(DbSession dbSession, CeActivityQuery query, Paging paging) { + if (query.isShortCircuitedByComponentUuids() + || query.isOnlyCurrents() + || query.getMaxExecutedAt() != null) { + return emptyList(); + } + + return mapper(dbSession).selectByQueryInDescOrder(query, new RowBounds(paging.offset(), paging.pageSize())); + } + + public int countByQuery(DbSession dbSession, CeActivityQuery query) { + if (query.isShortCircuitedByComponentUuids() + || query.isOnlyCurrents() + || query.getMaxExecutedAt() != null) { + return 0; + } + + return mapper(dbSession).countByQuery(query); + } + /** * Ordered by ascending id: oldest to newest */ @@ -55,8 +78,11 @@ public class CeQueueDao implements Dao { } public CeQueueDto insert(DbSession session, CeQueueDto dto) { - dto.setCreatedAt(system2.now()); - dto.setUpdatedAt(system2.now()); + if (dto.getCreatedAt() == 0L || dto.getUpdatedAt() == 0L) { + dto.setCreatedAt(system2.now()); + dto.setUpdatedAt(system2.now()); + } + mapper(session).insert(dto); return dto; } diff --git a/sonar-db/src/main/java/org/sonar/db/ce/CeQueueMapper.java b/sonar-db/src/main/java/org/sonar/db/ce/CeQueueMapper.java index 464007b9752..fb803a73fa8 100644 --- a/sonar-db/src/main/java/org/sonar/db/ce/CeQueueMapper.java +++ b/sonar-db/src/main/java/org/sonar/db/ce/CeQueueMapper.java @@ -23,6 +23,7 @@ import java.util.List; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.session.RowBounds; public interface CeQueueMapper { @@ -30,6 +31,10 @@ public interface CeQueueMapper { List<CeQueueDto> selectAllInAscOrder(); + List<CeQueueDto> selectByQueryInDescOrder(@Param("query") CeActivityQuery query, RowBounds rowBounds); + + int countByQuery(@Param("query") CeActivityQuery query); + List<String> selectEligibleForPeek(); @CheckForNull diff --git a/sonar-db/src/main/resources/org/sonar/db/ce/CeActivityMapper.xml b/sonar-db/src/main/resources/org/sonar/db/ce/CeActivityMapper.xml index c19c97a0800..d86c8f73212 100644 --- a/sonar-db/src/main/resources/org/sonar/db/ce/CeActivityMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/ce/CeActivityMapper.xml @@ -47,7 +47,7 @@ select <include refid="columns"/> <include refid="sqlSelectByQuery" /> - order by ca.id desc + order by ca.submitted_at desc, ca.id desc </select> <select id="countByQuery" parameterType="map" resultType="int"> @@ -67,8 +67,11 @@ #{cUuid} </foreach> </if> - <if test="query.status != null"> - and ca.status=#{query.status} + <if test="query.statuses != null and !query.statuses.isEmpty()"> + and ca.status in + <foreach collection="query.statuses" open="(" close=")" item="status" separator=","> + #{status} + </foreach> </if> <if test="query.type != null"> and ca.task_type=#{query.type} diff --git a/sonar-db/src/main/resources/org/sonar/db/ce/CeQueueMapper.xml b/sonar-db/src/main/resources/org/sonar/db/ce/CeQueueMapper.xml index f43a9e9b30c..b00fadad36a 100644 --- a/sonar-db/src/main/resources/org/sonar/db/ce/CeQueueMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/ce/CeQueueMapper.xml @@ -18,6 +18,10 @@ order by cq.created_at asc, cq.id asc </sql> + <sql id="orderByDescDateAndId"> + order by cq.created_at desc, cq.id asc + </sql> + <select id="selectByUuid" parameterType="String" resultType="org.sonar.db.ce.CeQueueDto"> select <include refid="columns"/> @@ -48,6 +52,42 @@ <include refid="orderByDateAndId"/> </select> + <select id="selectByQueryInDescOrder" resultType="org.sonar.db.ce.CeQueueDto"> + select + <include refid="columns"/> + <include refid="sqlSelectByQuery"/> + <include refid="orderByDescDateAndId"/> + </select> + + <select id="countByQuery" resultType="int"> + select count(id) + <include refid="sqlSelectByQuery"/> + </select> + + <sql id="sqlSelectByQuery"> + from ce_queue cq + <where> + <if test="query.componentUuids != null and query.componentUuids.size()>0"> + and cq.component_uuid in + <foreach collection="query.componentUuids" open="(" close=")" item="cUuid" separator=","> + #{cUuid} + </foreach> + </if> + <if test="query.statuses != null"> + and cq.status in + <foreach collection="query.statuses" open="(" close=")" item="status" separator=","> + #{status} + </foreach> + </if> + <if test="query.type != null"> + and cq.task_type=#{query.type} + </if> + <if test="query.minSubmittedAt != null"> + and cq.created_at >= #{query.minSubmittedAt} + </if> + </where> + </sql> + <select id="selectEligibleForPeek" resultType="String"> select cq.uuid from ce_queue cq diff --git a/sonar-db/src/test/java/org/sonar/db/ce/CeActivityDaoTest.java b/sonar-db/src/test/java/org/sonar/db/ce/CeActivityDaoTest.java index c1a15756f9b..cf726322310 100644 --- a/sonar-db/src/test/java/org/sonar/db/ce/CeActivityDaoTest.java +++ b/sonar-db/src/test/java/org/sonar/db/ce/CeActivityDaoTest.java @@ -22,7 +22,6 @@ package org.sonar.db.ce; import com.google.common.base.Optional; import java.util.Collections; import java.util.List; -import org.apache.ibatis.session.RowBounds; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -30,6 +29,7 @@ import org.sonar.api.utils.internal.TestSystem2; import org.sonar.db.DbTester; import org.sonar.test.DbTests; +import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.db.ce.CeTaskTypes.REPORT; @@ -96,31 +96,31 @@ public class CeActivityDaoTest { insert("TASK_4", "views", null, CeActivityDto.Status.SUCCESS); // no filters - CeActivityQuery query = new CeActivityQuery(); - List<CeActivityDto> dtos = underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10)); + CeActivityQuery query = new CeActivityQuery().setStatuses(Collections.<String>emptyList()); + List<CeActivityDto> dtos = underTest.selectByQuery(db.getSession(), query, 0, 10); assertThat(dtos).extracting("uuid").containsExactly("TASK_4", "TASK_3", "TASK_2", "TASK_1"); // select by component uuid query = new CeActivityQuery().setComponentUuid("PROJECT_1"); - dtos = underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10)); + dtos = underTest.selectByQuery(db.getSession(), query, 0, 100); assertThat(dtos).extracting("uuid").containsExactly("TASK_2", "TASK_1"); // select by status - query = new CeActivityQuery().setStatus(CeActivityDto.Status.SUCCESS); - dtos = underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10)); + query = new CeActivityQuery().setStatuses(singletonList(CeActivityDto.Status.SUCCESS.name())); + dtos = underTest.selectByQuery(db.getSession(), query, 0, 100); assertThat(dtos).extracting("uuid").containsExactly("TASK_4", "TASK_3", "TASK_1"); // select by type query = new CeActivityQuery().setType(REPORT); - dtos = underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10)); + dtos = underTest.selectByQuery(db.getSession(), query, 0, 100); assertThat(dtos).extracting("uuid").containsExactly("TASK_3", "TASK_2", "TASK_1"); query = new CeActivityQuery().setType("views"); - dtos = underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10)); + dtos = underTest.selectByQuery(db.getSession(), query, 0, 100); assertThat(dtos).extracting("uuid").containsExactly("TASK_4"); // select by multiple conditions query = new CeActivityQuery().setType(REPORT).setOnlyCurrents(true).setComponentUuid("PROJECT_1"); - dtos = underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10)); + dtos = underTest.selectByQuery(db.getSession(), query, 0, 100); assertThat(dtos).extracting("uuid").containsExactly("TASK_2"); } @@ -140,7 +140,7 @@ public class CeActivityDaoTest { assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(2); // select by status - query = new CeActivityQuery().setStatus(CeActivityDto.Status.SUCCESS); + query = new CeActivityQuery().setStatuses(singletonList(CeActivityDto.Status.SUCCESS.name())); assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(3); // select by type @@ -160,7 +160,7 @@ public class CeActivityDaoTest { CeActivityQuery query = new CeActivityQuery(); query.setComponentUuids(Collections.<String>emptyList()); - assertThat(underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10))).isEmpty(); + assertThat(underTest.selectByQuery(db.getSession(), query, 0, 0)).isEmpty(); } @Test @@ -179,19 +179,19 @@ public class CeActivityDaoTest { // search by min submitted date CeActivityQuery query = new CeActivityQuery().setMinSubmittedAt(1_455_000_000_000L); - assertThat(underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10))).extracting("uuid").containsOnly("UUID2"); + assertThat(underTest.selectByQuery(db.getSession(), query, 0, 5)).extracting("uuid").containsOnly("UUID2"); assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(1); // search by max executed date query = new CeActivityQuery().setMaxExecutedAt(1_475_000_000_000L); - assertThat(underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10))).extracting("uuid").containsOnly("UUID1"); + assertThat(underTest.selectByQuery(db.getSession(), query, 0, 5)).extracting("uuid").containsOnly("UUID1"); assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(1); // search by both dates query = new CeActivityQuery() .setMinSubmittedAt(1_400_000_000_000L) .setMaxExecutedAt(1_475_000_000_000L); - assertThat(underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10))).extracting("uuid").containsOnly("UUID1"); + assertThat(underTest.selectByQuery(db.getSession(), query, 0, 5)).extracting("uuid").containsOnly("UUID1"); assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(1); } diff --git a/sonar-db/src/test/java/org/sonar/db/ce/CeQueueDaoTest.java b/sonar-db/src/test/java/org/sonar/db/ce/CeQueueDaoTest.java index 247f735430e..943fbc14e52 100644 --- a/sonar-db/src/test/java/org/sonar/db/ce/CeQueueDaoTest.java +++ b/sonar-db/src/test/java/org/sonar/db/ce/CeQueueDaoTest.java @@ -20,15 +20,20 @@ package org.sonar.db.ce; import com.google.common.base.Optional; +import java.util.List; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; +import org.sonar.api.utils.Paging; import org.sonar.api.utils.System2; import org.sonar.api.utils.internal.TestSystem2; import org.sonar.db.DbTester; import org.sonar.test.DbTests; +import static com.google.common.collect.Lists.newArrayList; +import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.db.ce.CeQueueTesting.newCeQueueDto; @Category(DbTests.class) public class CeQueueDaoTest { @@ -169,6 +174,61 @@ public class CeQueueDaoTest { assertThat(peek.get().getUuid()).isEqualTo("TASK_2"); } + @Test + public void select_by_query() { + // task status not in query + insert(newCeQueueDto("TASK_1") + .setComponentUuid("PROJECT_1") + .setStatus(CeQueueDto.Status.IN_PROGRESS) + .setTaskType(CeTaskTypes.REPORT) + .setCreatedAt(100_000L)); + + // too early + insert(newCeQueueDto("TASK_3") + .setComponentUuid("PROJECT_1") + .setStatus(CeQueueDto.Status.PENDING) + .setTaskType(CeTaskTypes.REPORT) + .setCreatedAt(90_000L)); + + // task type not in query + insert(newCeQueueDto("TASK_4") + .setComponentUuid("PROJECT_2") + .setStatus(CeQueueDto.Status.PENDING) + .setTaskType("ANOTHER_TYPE") + .setCreatedAt(100_000L)); + + // correct + insert(newCeQueueDto("TASK_2") + .setComponentUuid("PROJECT_1") + .setStatus(CeQueueDto.Status.PENDING) + .setTaskType(CeTaskTypes.REPORT) + .setCreatedAt(100_000L)); + + // correct submitted later + insert(newCeQueueDto("TASK_5") + .setComponentUuid("PROJECT_1") + .setStatus(CeQueueDto.Status.PENDING) + .setTaskType(CeTaskTypes.REPORT) + .setCreatedAt(120_000L)); + + CeActivityQuery query = new CeActivityQuery() + .setComponentUuids(newArrayList("PROJECT_1", "PROJECT_2")) + .setStatuses(singletonList(CeQueueDto.Status.PENDING.name())) + .setType(CeTaskTypes.REPORT) + .setMinSubmittedAt(100_000L); + + List<CeQueueDto> result = underTest.selectByQueryInDescOrder(db.getSession(), query, Paging.forPageIndex(1).withPageSize(1_000).andTotal(1_000)); + int total = underTest.countByQuery(db.getSession(), query); + + assertThat(result).extracting("uuid").containsExactly("TASK_5", "TASK_2"); + assertThat(total).isEqualTo(2); + } + + private void insert(CeQueueDto dto) { + underTest.insert(db.getSession(), dto); + db.commit(); + } + private void insert(String uuid, String componentUuid, CeQueueDto.Status status) { CeQueueDto dto = new CeQueueDto(); dto.setUuid(uuid); @@ -177,6 +237,6 @@ public class CeQueueDaoTest { dto.setStatus(status); dto.setSubmitterLogin("henri"); underTest.insert(db.getSession(), dto); - db.getSession().commit(); + db.commit(); } } diff --git a/sonar-db/src/test/java/org/sonar/db/ce/CeQueueTesting.java b/sonar-db/src/test/java/org/sonar/db/ce/CeQueueTesting.java index 7e8974421ba..0f0a7564018 100644 --- a/sonar-db/src/test/java/org/sonar/db/ce/CeQueueTesting.java +++ b/sonar-db/src/test/java/org/sonar/db/ce/CeQueueTesting.java @@ -38,4 +38,6 @@ public class CeQueueTesting { .setUpdatedAt(nextLong()) .setStartedAt(nextLong()); } + + } |