@@ -40,7 +40,7 @@ import org.sonar.core.util.Uuids; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.ce.CeActivityDto; | |||
import org.sonar.db.ce.CeActivityQuery; | |||
import org.sonar.db.ce.CeTaskQuery; | |||
import org.sonar.db.ce.CeQueueDto; | |||
import org.sonar.db.ce.CeTaskTypes; | |||
import org.sonar.db.component.ComponentDto; | |||
@@ -142,7 +142,7 @@ public class ActivityAction implements CeWsAction { | |||
private ActivityResponse doHandle(ActivityWsRequest request) { | |||
DbSession dbSession = dbClient.openSession(false); | |||
try { | |||
CeActivityQuery query = buildQuery(dbSession, request); | |||
CeTaskQuery query = buildQuery(dbSession, request); | |||
checkPermissions(query); | |||
TaskResult queuedTasks = loadQueuedTasks(dbSession, request, query); | |||
TaskResult pastTasks = loadPastTasks(dbSession, request, query, queuedTasks.total); | |||
@@ -159,8 +159,8 @@ public class ActivityAction implements CeWsAction { | |||
} | |||
} | |||
private CeActivityQuery buildQuery(DbSession dbSession, ActivityWsRequest request) { | |||
CeActivityQuery query = new CeActivityQuery(); | |||
private CeTaskQuery buildQuery(DbSession dbSession, ActivityWsRequest request) { | |||
CeTaskQuery query = new CeTaskQuery(); | |||
query.setType(request.getType()); | |||
query.setOnlyCurrents(request.getOnlyCurrents()); | |||
query.setMinSubmittedAt(dateToLong(parseDateTimeQuietly(request.getMinSubmittedAt()))); | |||
@@ -175,7 +175,7 @@ public class ActivityAction implements CeWsAction { | |||
return query; | |||
} | |||
private void loadComponentUuids(DbSession dbSession, ActivityWsRequest request, CeActivityQuery query) { | |||
private void loadComponentUuids(DbSession dbSession, ActivityWsRequest request, CeTaskQuery query) { | |||
String componentUuid = request.getComponentId(); | |||
String componentQuery = request.getComponentQuery(); | |||
@@ -184,12 +184,12 @@ public class ActivityAction implements CeWsAction { | |||
} | |||
if (componentQuery != null) { | |||
ComponentQuery componentDtoQuery = ComponentQuery.builder().setNameOrKeyQuery(componentQuery).setQualifiers(Qualifiers.PROJECT, Qualifiers.VIEW).build(); | |||
List<ComponentDto> componentDtos = dbClient.componentDao().selectByQuery(dbSession, componentDtoQuery, 0, CeActivityQuery.MAX_COMPONENT_UUIDS); | |||
List<ComponentDto> componentDtos = dbClient.componentDao().selectByQuery(dbSession, componentDtoQuery, 0, CeTaskQuery.MAX_COMPONENT_UUIDS); | |||
query.setComponentUuids(Lists.transform(componentDtos, ComponentDtoFunctions.toUuid())); | |||
} | |||
} | |||
private TaskResult loadQueuedTasks(DbSession dbSession, ActivityWsRequest request, CeActivityQuery query) { | |||
private TaskResult loadQueuedTasks(DbSession dbSession, ActivityWsRequest request, CeTaskQuery query) { | |||
int total = dbClient.ceQueueDao().countByQuery(dbSession, query); | |||
List<CeQueueDto> dtos = dbClient.ceQueueDao().selectByQueryInDescOrder(dbSession, query, | |||
Paging.forPageIndex(request.getPage()) | |||
@@ -199,7 +199,7 @@ public class ActivityAction implements CeWsAction { | |||
return new TaskResult(tasks, total); | |||
} | |||
private TaskResult loadPastTasks(DbSession dbSession, ActivityWsRequest request, CeActivityQuery query, int totalQueuedTasks) { | |||
private TaskResult loadPastTasks(DbSession dbSession, ActivityWsRequest request, CeTaskQuery query, int totalQueuedTasks) { | |||
int total = dbClient.ceActivityDao().countByQuery(dbSession, query); | |||
// we have to take into account the total number of queue tasks found | |||
int offset = Math.max(0, offset(request.getPage(), request.getPageSize()) - totalQueuedTasks); | |||
@@ -209,7 +209,7 @@ public class ActivityAction implements CeWsAction { | |||
return new TaskResult(ceTasks, total); | |||
} | |||
private void checkPermissions(CeActivityQuery query) { | |||
private void checkPermissions(CeTaskQuery query) { | |||
List<String> componentUuids = query.getComponentUuids(); | |||
if (componentUuids != null && componentUuids.size() == 1) { | |||
if (!isAllowedOnComponentUuid(userSession, componentUuids.get(0))) { |
@@ -28,7 +28,7 @@ import org.sonar.core.util.Uuids; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.ce.CeActivityDto; | |||
import org.sonar.db.ce.CeActivityQuery; | |||
import org.sonar.db.ce.CeTaskQuery; | |||
import org.sonar.db.ce.CeQueueDto; | |||
import org.sonar.server.user.UserSession; | |||
import org.sonar.server.ws.WsUtils; | |||
@@ -71,7 +71,7 @@ public class ComponentAction implements CeWsAction { | |||
DbSession dbSession = dbClient.openSession(false); | |||
try { | |||
List<CeQueueDto> queueDtos = dbClient.ceQueueDao().selectByComponentUuid(dbSession, componentUuid); | |||
CeActivityQuery activityQuery = new CeActivityQuery() | |||
CeTaskQuery activityQuery = new CeTaskQuery() | |||
.setComponentUuid(componentUuid) | |||
.setOnlyCurrents(true); | |||
List<CeActivityDto> activityDtos = dbClient.ceActivityDao().selectByQuery(dbSession, activityQuery, 0, 1); |
@@ -64,7 +64,7 @@ public class CeActivityDao implements Dao { | |||
/** | |||
* Ordered by id desc -> newest to oldest | |||
*/ | |||
public List<CeActivityDto> selectByQuery(DbSession dbSession, CeActivityQuery query, int offset, int pageSize) { | |||
public List<CeActivityDto> selectByQuery(DbSession dbSession, CeTaskQuery query, int offset, int pageSize) { | |||
if (query.isShortCircuitedByComponentUuids()) { | |||
return Collections.emptyList(); | |||
} | |||
@@ -72,7 +72,7 @@ public class CeActivityDao implements Dao { | |||
return mapper(dbSession).selectByQuery(query, new RowBounds(offset, pageSize)); | |||
} | |||
public int countByQuery(DbSession dbSession, CeActivityQuery query) { | |||
public int countByQuery(DbSession dbSession, CeTaskQuery query) { | |||
if (query.isShortCircuitedByComponentUuids()) { | |||
return 0; | |||
} |
@@ -33,11 +33,11 @@ public interface CeActivityMapper { | |||
List<CeActivityDto> selectByComponentUuid(@Param("componentUuid") String componentUuid); | |||
List<CeActivityDto> selectByQuery(@Param("query") CeActivityQuery query, RowBounds rowBounds); | |||
List<CeActivityDto> selectByQuery(@Param("query") CeTaskQuery query, RowBounds rowBounds); | |||
List<CeActivityDto> selectOlderThan(@Param("beforeDate") long beforeDate); | |||
int countByQuery(@Param("query") CeActivityQuery query); | |||
int countByQuery(@Param("query") CeTaskQuery query); | |||
void insert(CeActivityDto dto); | |||
@@ -46,7 +46,7 @@ public class CeQueueDao implements Dao { | |||
return mapper(session).selectAllInAscOrder(); | |||
} | |||
public List<CeQueueDto> selectByQueryInDescOrder(DbSession dbSession, CeActivityQuery query, Paging paging) { | |||
public List<CeQueueDto> selectByQueryInDescOrder(DbSession dbSession, CeTaskQuery query, Paging paging) { | |||
if (query.isShortCircuitedByComponentUuids() | |||
|| query.isOnlyCurrents() | |||
|| query.getMaxExecutedAt() != null) { | |||
@@ -56,7 +56,7 @@ public class CeQueueDao implements Dao { | |||
return mapper(dbSession).selectByQueryInDescOrder(query, new RowBounds(paging.offset(), paging.pageSize())); | |||
} | |||
public int countByQuery(DbSession dbSession, CeActivityQuery query) { | |||
public int countByQuery(DbSession dbSession, CeTaskQuery query) { | |||
if (query.isShortCircuitedByComponentUuids() | |||
|| query.isOnlyCurrents() | |||
|| query.getMaxExecutedAt() != null) { |
@@ -31,9 +31,9 @@ public interface CeQueueMapper { | |||
List<CeQueueDto> selectAllInAscOrder(); | |||
List<CeQueueDto> selectByQueryInDescOrder(@Param("query") CeActivityQuery query, RowBounds rowBounds); | |||
List<CeQueueDto> selectByQueryInDescOrder(@Param("query") CeTaskQuery query, RowBounds rowBounds); | |||
int countByQuery(@Param("query") CeActivityQuery query); | |||
int countByQuery(@Param("query") CeTaskQuery query); | |||
List<String> selectEligibleForPeek(); | |||
@@ -26,7 +26,10 @@ import org.sonar.db.DatabaseUtils; | |||
import static java.util.Collections.singletonList; | |||
public class CeActivityQuery { | |||
/** | |||
* Db Query used for CE_QUEUE and CE_ACTIVITY tables | |||
*/ | |||
public class CeTaskQuery { | |||
public static final int MAX_COMPONENT_UUIDS = DatabaseUtils.PARTITION_SIZE_FOR_ORACLE; | |||
@@ -42,7 +45,7 @@ public class CeActivityQuery { | |||
return componentUuids; | |||
} | |||
public CeActivityQuery setComponentUuids(@Nullable List<String> l) { | |||
public CeTaskQuery setComponentUuids(@Nullable List<String> l) { | |||
this.componentUuids = l; | |||
return this; | |||
} | |||
@@ -51,7 +54,7 @@ public class CeActivityQuery { | |||
return componentUuids != null && (componentUuids.isEmpty() || componentUuids.size() > MAX_COMPONENT_UUIDS); | |||
} | |||
public CeActivityQuery setComponentUuid(@Nullable String s) { | |||
public CeTaskQuery setComponentUuid(@Nullable String s) { | |||
if (s == null) { | |||
this.componentUuids = null; | |||
} else { | |||
@@ -64,7 +67,7 @@ public class CeActivityQuery { | |||
return onlyCurrents; | |||
} | |||
public CeActivityQuery setOnlyCurrents(boolean onlyCurrents) { | |||
public CeTaskQuery setOnlyCurrents(boolean onlyCurrents) { | |||
this.onlyCurrents = onlyCurrents; | |||
return this; | |||
} | |||
@@ -74,7 +77,7 @@ public class CeActivityQuery { | |||
return statuses; | |||
} | |||
public CeActivityQuery setStatuses(@Nullable List<String> statuses) { | |||
public CeTaskQuery setStatuses(@Nullable List<String> statuses) { | |||
this.statuses = statuses; | |||
return this; | |||
} | |||
@@ -84,7 +87,7 @@ public class CeActivityQuery { | |||
return type; | |||
} | |||
public CeActivityQuery setType(@Nullable String type) { | |||
public CeTaskQuery setType(@Nullable String type) { | |||
this.type = type; | |||
return this; | |||
} | |||
@@ -94,7 +97,7 @@ public class CeActivityQuery { | |||
return maxExecutedAt; | |||
} | |||
public CeActivityQuery setMaxExecutedAt(@Nullable Long l) { | |||
public CeTaskQuery setMaxExecutedAt(@Nullable Long l) { | |||
this.maxExecutedAt = l; | |||
return this; | |||
} | |||
@@ -104,7 +107,7 @@ public class CeActivityQuery { | |||
return minSubmittedAt; | |||
} | |||
public CeActivityQuery setMinSubmittedAt(@Nullable Long l) { | |||
public CeTaskQuery setMinSubmittedAt(@Nullable Long l) { | |||
this.minSubmittedAt = l; | |||
return this; | |||
} |
@@ -96,30 +96,30 @@ public class CeActivityDaoTest { | |||
insert("TASK_4", "views", null, CeActivityDto.Status.SUCCESS); | |||
// no filters | |||
CeActivityQuery query = new CeActivityQuery().setStatuses(Collections.<String>emptyList()); | |||
CeTaskQuery query = new CeTaskQuery().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"); | |||
query = new CeTaskQuery().setComponentUuid("PROJECT_1"); | |||
dtos = underTest.selectByQuery(db.getSession(), query, 0, 100); | |||
assertThat(dtos).extracting("uuid").containsExactly("TASK_2", "TASK_1"); | |||
// select by status | |||
query = new CeActivityQuery().setStatuses(singletonList(CeActivityDto.Status.SUCCESS.name())); | |||
query = new CeTaskQuery().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); | |||
query = new CeTaskQuery().setType(REPORT); | |||
dtos = underTest.selectByQuery(db.getSession(), query, 0, 100); | |||
assertThat(dtos).extracting("uuid").containsExactly("TASK_3", "TASK_2", "TASK_1"); | |||
query = new CeActivityQuery().setType("views"); | |||
query = new CeTaskQuery().setType("views"); | |||
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"); | |||
query = new CeTaskQuery().setType(REPORT).setOnlyCurrents(true).setComponentUuid("PROJECT_1"); | |||
dtos = underTest.selectByQuery(db.getSession(), query, 0, 100); | |||
assertThat(dtos).extracting("uuid").containsExactly("TASK_2"); | |||
} | |||
@@ -132,25 +132,25 @@ public class CeActivityDaoTest { | |||
insert("TASK_4", "views", null, CeActivityDto.Status.SUCCESS); | |||
// no filters | |||
CeActivityQuery query = new CeActivityQuery(); | |||
CeTaskQuery query = new CeTaskQuery(); | |||
assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(4); | |||
// select by component uuid | |||
query = new CeActivityQuery().setComponentUuid("PROJECT_1"); | |||
query = new CeTaskQuery().setComponentUuid("PROJECT_1"); | |||
assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(2); | |||
// select by status | |||
query = new CeActivityQuery().setStatuses(singletonList(CeActivityDto.Status.SUCCESS.name())); | |||
query = new CeTaskQuery().setStatuses(singletonList(CeActivityDto.Status.SUCCESS.name())); | |||
assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(3); | |||
// select by type | |||
query = new CeActivityQuery().setType(REPORT); | |||
query = new CeTaskQuery().setType(REPORT); | |||
assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(3); | |||
query = new CeActivityQuery().setType("views"); | |||
query = new CeTaskQuery().setType("views"); | |||
assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(1); | |||
// select by multiple conditions | |||
query = new CeActivityQuery().setType(REPORT).setOnlyCurrents(true).setComponentUuid("PROJECT_1"); | |||
query = new CeTaskQuery().setType(REPORT).setOnlyCurrents(true).setComponentUuid("PROJECT_1"); | |||
assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(1); | |||
} | |||
@@ -158,7 +158,7 @@ public class CeActivityDaoTest { | |||
public void selectByQuery_no_results_if_shortcircuited_by_component_uuids() { | |||
insert("TASK_1", REPORT, "PROJECT_1", CeActivityDto.Status.SUCCESS); | |||
CeActivityQuery query = new CeActivityQuery(); | |||
CeTaskQuery query = new CeTaskQuery(); | |||
query.setComponentUuids(Collections.<String>emptyList()); | |||
assertThat(underTest.selectByQuery(db.getSession(), query, 0, 0)).isEmpty(); | |||
} | |||
@@ -167,7 +167,7 @@ public class CeActivityDaoTest { | |||
public void countByQuery_no_results_if_shortcircuited_by_component_uuids() { | |||
insert("TASK_1", REPORT, "PROJECT_1", CeActivityDto.Status.SUCCESS); | |||
CeActivityQuery query = new CeActivityQuery(); | |||
CeTaskQuery query = new CeTaskQuery(); | |||
query.setComponentUuids(Collections.<String>emptyList()); | |||
assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(0); | |||
} | |||
@@ -178,17 +178,17 @@ public class CeActivityDaoTest { | |||
insertWithDates("UUID2", 1_460_000_000_000L, 1_480_000_000_000L); | |||
// search by min submitted date | |||
CeActivityQuery query = new CeActivityQuery().setMinSubmittedAt(1_455_000_000_000L); | |||
CeTaskQuery query = new CeTaskQuery().setMinSubmittedAt(1_455_000_000_000L); | |||
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); | |||
query = new CeTaskQuery().setMaxExecutedAt(1_475_000_000_000L); | |||
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() | |||
query = new CeTaskQuery() | |||
.setMinSubmittedAt(1_400_000_000_000L) | |||
.setMaxExecutedAt(1_475_000_000_000L); | |||
assertThat(underTest.selectByQuery(db.getSession(), query, 0, 5)).extracting("uuid").containsOnly("UUID1"); |
@@ -213,7 +213,7 @@ public class CeQueueDaoTest { | |||
.setCreatedAt(120_000L)); | |||
// select by component uuid, status, task type and minimum submitted at | |||
CeActivityQuery query = new CeActivityQuery() | |||
CeTaskQuery query = new CeTaskQuery() | |||
.setComponentUuids(newArrayList("PROJECT_1", "PROJECT_2")) | |||
.setStatuses(singletonList(CeQueueDto.Status.PENDING.name())) | |||
.setType(CeTaskTypes.REPORT) | |||
@@ -234,7 +234,7 @@ public class CeQueueDaoTest { | |||
.setTaskType(CeTaskTypes.REPORT) | |||
.setCreatedAt(100_000L)); | |||
CeActivityQuery query = new CeActivityQuery().setOnlyCurrents(true); | |||
CeTaskQuery query = new CeTaskQuery().setOnlyCurrents(true); | |||
List<CeQueueDto> result = underTest.selectByQueryInDescOrder(db.getSession(), query, Paging.forPageIndex(1).withPageSize(1_000).andTotal(1_000)); | |||
int total = underTest.countByQuery(db.getSession(), query); | |||
@@ -251,7 +251,7 @@ public class CeQueueDaoTest { | |||
.setTaskType(CeTaskTypes.REPORT) | |||
.setCreatedAt(100_000L)); | |||
CeActivityQuery query = new CeActivityQuery().setMaxExecutedAt(1_000_000_000_000L); | |||
CeTaskQuery query = new CeTaskQuery().setMaxExecutedAt(1_000_000_000_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); | |||
@@ -268,7 +268,7 @@ public class CeQueueDaoTest { | |||
.setTaskType(CeTaskTypes.REPORT) | |||
.setCreatedAt(100_000L)); | |||
CeActivityQuery query = new CeActivityQuery().setComponentUuids(Collections.<String>emptyList()); | |||
CeTaskQuery query = new CeTaskQuery().setComponentUuids(Collections.<String>emptyList()); | |||
List<CeQueueDto> result = underTest.selectByQueryInDescOrder(db.getSession(), query, Paging.forPageIndex(1).withPageSize(1_000).andTotal(1_000)); | |||
int total = underTest.countByQuery(db.getSession(), query); |
@@ -27,9 +27,9 @@ import org.junit.Test; | |||
import static java.util.Arrays.asList; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
public class CeActivityQueryTest { | |||
public class CeTaskQueryTest { | |||
CeActivityQuery underTest = new CeActivityQuery(); | |||
CeTaskQuery underTest = new CeTaskQuery(); | |||
@Test | |||
public void no_filter_on_component_uuids_by_default() { | |||
@@ -69,11 +69,11 @@ public class CeActivityQueryTest { | |||
@Test | |||
public void short_circuited_if_too_many_component_uuid_filters() { | |||
List<String> uuids = new ArrayList<>(); | |||
for (int i = 0; i < CeActivityQuery.MAX_COMPONENT_UUIDS + 2; i++) { | |||
for (int i = 0; i < CeTaskQuery.MAX_COMPONENT_UUIDS + 2; i++) { | |||
uuids.add(String.valueOf(i)); | |||
} | |||
underTest.setComponentUuids(uuids); | |||
assertThat(underTest.getComponentUuids()).hasSize(CeActivityQuery.MAX_COMPONENT_UUIDS + 2); | |||
assertThat(underTest.getComponentUuids()).hasSize(CeTaskQuery.MAX_COMPONENT_UUIDS + 2); | |||
assertThat(underTest.isShortCircuitedByComponentUuids()).isTrue(); | |||
} | |||
} |