package com.hubspot.singularity.data.history;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.google.common.base.Optional;
import com.google.common.collect.Collections2;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.hubspot.singularity.OrderDirection;
import com.hubspot.singularity.SingularityTask;
import com.hubspot.singularity.SingularityTaskHistory;
import com.hubspot.singularity.SingularityTaskHistoryQuery;
import com.hubspot.singularity.SingularityTaskId;
import com.hubspot.singularity.SingularityTaskIdHistory;
import com.hubspot.singularity.config.SingularityConfiguration;
import com.hubspot.singularity.data.RequestManager;
import com.hubspot.singularity.data.TaskManager;
@Singleton
public class TaskHistoryHelper extends BlendedHistoryHelper<SingularityTaskIdHistory, SingularityTaskHistoryQuery> {
private final TaskManager taskManager;
private final RequestManager requestManager;
private final HistoryManager historyManager;
private final SingularityConfiguration configuration;
@Inject
public TaskHistoryHelper(TaskManager taskManager, HistoryManager historyManager, RequestManager requestManager, SingularityConfiguration configuration) {
this.taskManager = taskManager;
this.historyManager = historyManager;
this.requestManager = requestManager;
this.configuration = configuration;
}
private List<SingularityTaskIdHistory> getFromZk(List<String> requestIds) {
final List<SingularityTaskId> inactiveTasksInZk = taskManager.getInactiveTaskIds(requestIds);
return getTaskHistoriesFor(taskManager, inactiveTasksInZk);
}
private List<String> getRequestIds(SingularityTaskHistoryQuery query) {
if (query.getRequestId().isPresent()) {
return Collections.singletonList(query.getRequestId().get());
}
return requestManager.getAllRequestIds();
}
@Override
protected List<SingularityTaskIdHistory> getFromZk(SingularityTaskHistoryQuery query) {
final List<SingularityTaskIdHistory> filteredHistory = Lists.newArrayList(Iterables.filter(getFromZk(getRequestIds(query)), query.getHistoryFilter()));
Collections.sort(filteredHistory, query.getComparator());
return filteredHistory;
}
@Override
protected List<SingularityTaskIdHistory> getFromHistory(SingularityTaskHistoryQuery query, int historyStart, int numFromHistory) {
return historyManager.getTaskIdHistory(query.getRequestId(), query.getDeployId(), query.getRunId(), query.getHost(), query.getLastTaskStatus(), query.getStartedBefore(),
query.getStartedAfter(), query.getUpdatedBefore(), query.getUpdatedAfter(), query.getOrderDirection(), Optional.of(historyStart), numFromHistory);
}
public Optional<SingularityTask> getTask(SingularityTaskId taskId) {
Optional<SingularityTask> maybeTask = taskManager.getTask(taskId);
if (maybeTask.isPresent()) {
return maybeTask;
}
Optional<SingularityTaskHistory> history = historyManager.getTaskHistory(taskId.getId());
if (history.isPresent()) {
return Optional.of(history.get().getTask());
}
return Optional.absent();
}
public Optional<SingularityTaskIdHistory> getByRunId(String requestId, String runId) {
for (SingularityTaskIdHistory history : getFromZk(Collections.singletonList(requestId))) {
if (history.getRunId().isPresent() && history.getRunId().get().equals(runId)) {
return Optional.of(history);
}
}
Optional<SingularityTaskHistory> history = historyManager.getTaskHistoryByRunId(requestId, runId);
if (history.isPresent()) {
return Optional.of(SingularityTaskIdHistory.fromTaskIdAndTaskAndUpdates(history.get().getTask().getTaskId(), history.get().getTask(), history.get().getTaskUpdates()));
}
return Optional.absent();
}
@Override
protected boolean queryUsesZkFirst(SingularityTaskHistoryQuery query) {
if (configuration.isTaskHistoryQueryUsesZkFirst()) {
return true;
}
if (!query.getRequestId().isPresent()) {
return false;
}
if (query.getLastTaskStatus().isPresent()) {
return false;
}
if (query.getHost().isPresent()) {
return false;
}
if (query.getStartedAfter().isPresent()) {
return false;
}
if (query.getStartedBefore().isPresent()) {
return false;
}
if (query.getOrderDirection().isPresent() && query.getOrderDirection().get() == OrderDirection.ASC) {
return false;
}
return true;
}
@Override
protected Comparator<SingularityTaskIdHistory> getComparator(SingularityTaskHistoryQuery query) {
return query.getComparator();
}
@Override
protected Optional<Integer> getTotalCount(SingularityTaskHistoryQuery query) {
final int numFromZk = Collections2.filter(getFromZk(getRequestIds(query)), query.getHistoryFilter()).size();
final int numFromHistory = historyManager.getTaskIdHistoryCount(query.getRequestId(), query.getDeployId(), query.getRunId(), query.getHost(), query.getLastTaskStatus(), query.getStartedBefore(),
query.getStartedAfter(), query.getUpdatedBefore(), query.getUpdatedAfter());
return Optional.fromNullable(numFromZk + numFromHistory);
}
}