aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-db/src
diff options
context:
space:
mode:
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2016-02-11 21:20:18 +0100
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2016-02-15 13:44:59 +0100
commit89a93e795af89c98f5e99de60620c21287f7889e (patch)
tree105152b4d0ac83e11cdc6749b2e37c8b3b24e338 /sonar-db/src
parent8909ccd99b9bc5874f24395519d66e2bcb9bdacb (diff)
downloadsonarqube-89a93e795af89c98f5e99de60620c21287f7889e.tar.gz
sonarqube-89a93e795af89c98f5e99de60620c21287f7889e.zip
SONAR-7187 WS api/ce/activity handles queue and past CE tasks
Diffstat (limited to 'sonar-db/src')
-rw-r--r--sonar-db/src/main/java/org/sonar/db/ce/CeActivityDao.java5
-rw-r--r--sonar-db/src/main/java/org/sonar/db/ce/CeActivityQuery.java10
-rw-r--r--sonar-db/src/main/java/org/sonar/db/ce/CeQueueDao.java32
-rw-r--r--sonar-db/src/main/java/org/sonar/db/ce/CeQueueMapper.java5
-rw-r--r--sonar-db/src/main/resources/org/sonar/db/ce/CeActivityMapper.xml9
-rw-r--r--sonar-db/src/main/resources/org/sonar/db/ce/CeQueueMapper.xml40
-rw-r--r--sonar-db/src/test/java/org/sonar/db/ce/CeActivityDaoTest.java28
-rw-r--r--sonar-db/src/test/java/org/sonar/db/ce/CeQueueDaoTest.java62
-rw-r--r--sonar-db/src/test/java/org/sonar/db/ce/CeQueueTesting.java2
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 &gt;= #{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());
}
+
+
}