package com.hubspot.singularity;
import java.util.Comparator;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.ComparisonChain;
public class SingularityTaskHistoryQuery {
private final Optional<String> requestId;
private final Optional<String> deployId;
private final Optional<String> runId;
private final Optional<String> host;
private final Optional<ExtendedTaskState> lastTaskStatus;
private final Optional<Long> startedBefore;
private final Optional<Long> startedAfter;
private final Optional<Long> updatedBefore;
private final Optional<Long> updatedAfter;
private final Optional<OrderDirection> orderDirection;
public SingularityTaskHistoryQuery(String requestId) {
this(Optional.of(requestId), Optional.<String> absent(), Optional.<String> absent(), Optional.<String>absent(), Optional.<ExtendedTaskState> absent(), Optional.<Long> absent(), Optional.<Long> absent(),
Optional.<Long>absent(), Optional.<Long>absent(), Optional.<OrderDirection> absent());
}
public SingularityTaskHistoryQuery(Optional<String> requestId, Optional<String> deployId, Optional<String> runId, Optional<String> host, Optional<ExtendedTaskState> lastTaskStatus, Optional<Long> startedBefore,
Optional<Long> startedAfter, Optional<Long> updatedBefore, Optional<Long> updatedAfter, Optional<OrderDirection> orderDirection) {
this.requestId = requestId;
this.deployId = deployId;
this.runId = runId;
this.host = host;
this.lastTaskStatus = lastTaskStatus;
this.startedBefore = startedBefore;
this.startedAfter = startedAfter;
this.updatedBefore = updatedBefore;
this.updatedAfter = updatedAfter;
this.orderDirection = orderDirection;
}
public Optional<String> getRequestId() {
return requestId;
}
public Optional<String> getDeployId() {
return deployId;
}
public Optional<String> getRunId() {
return runId;
}
public Optional<String> getHost() {
return host;
}
public Optional<ExtendedTaskState> getLastTaskStatus() {
return lastTaskStatus;
}
public Optional<Long> getStartedBefore() {
return startedBefore;
}
public Optional<Long> getStartedAfter() {
return startedAfter;
}
public Optional<Long> getUpdatedBefore() {
return updatedBefore;
}
public Optional<Long> getUpdatedAfter() {
return updatedAfter;
}
public Optional<OrderDirection> getOrderDirection() {
return orderDirection;
}
public Predicate<SingularityTaskIdHistory> getHistoryFilter() {
return new Predicate<SingularityTaskIdHistory>() {
@Override
public boolean apply(SingularityTaskIdHistory input) {
final SingularityTaskId taskId = input.getTaskId();
if (requestId.isPresent() && !requestId.get().equals(taskId.getRequestId())) {
return false;
}
if (host.isPresent() && !host.get().equals(taskId.getHost())) {
return false;
}
if (deployId.isPresent() && !deployId.get().equals(taskId.getDeployId())) {
return false;
}
if (runId.isPresent() && !runId.get().equals(input.getRunId().or(""))) {
return false;
}
if (lastTaskStatus.isPresent()) {
if (!input.getLastTaskState().isPresent()) {
return false;
}
if (lastTaskStatus.get() != input.getLastTaskState().get()) {
return false;
}
}
if (startedAfter.isPresent() && startedAfter.get() >= taskId.getStartedAt()) {
return false;
}
if (startedBefore.isPresent() && startedBefore.get() <= taskId.getStartedAt()) {
return false;
}
if (updatedAfter.isPresent() && updatedAfter.get() >= input.getUpdatedAt()) {
return false;
}
if (updatedBefore.isPresent() && updatedBefore.get() <= input.getUpdatedAt()) {
return false;
}
return true;
}
};
}
public Comparator<SingularityTaskIdHistory> getComparator() {
final OrderDirection localOrderDirection = orderDirection.or(OrderDirection.DESC);
return new Comparator<SingularityTaskIdHistory>() {
@Override
public int compare(SingularityTaskIdHistory o1, SingularityTaskIdHistory o2) {
ComparisonChain chain = ComparisonChain.start();
if (localOrderDirection == OrderDirection.ASC) {
chain = chain.compare(o1.getTaskId().getStartedAt(), o2.getTaskId().getStartedAt());
} else {
chain = chain.compare(o2.getTaskId().getStartedAt(), o1.getTaskId().getStartedAt());
}
return chain.compare(o1.getTaskId().getRequestId(), o2.getTaskId().getRequestId()).result();
}
};
}
@Override
public String toString() {
return "SingularityTaskHistoryQuery{" +
"requestId=" + requestId +
", deployId=" + deployId +
", runId=" + runId +
", host=" + host +
", lastTaskStatus=" + lastTaskStatus +
", startedBefore=" + startedBefore +
", startedAfter=" + startedAfter +
", updatedBefore=" + updatedBefore +
", updatedAfter=" + updatedAfter +
", orderDirection=" + orderDirection +
'}';
}
}