in src/main/java/com/uber/cadence/internal/testservice/TestWorkflowMutableStateImpl.java [1558:1609]
public QueryWorkflowResponse query(QueryWorkflowRequest queryRequest) throws TException {
QueryId queryId = new QueryId(executionId);
Optional<WorkflowExecutionCloseStatus> optCloseStatus = getCloseStatus();
if (optCloseStatus.isPresent() && queryRequest.getQueryRejectCondition() != null) {
WorkflowExecutionCloseStatus closeStatus = optCloseStatus.get();
boolean rejectNotOpen =
queryRequest.getQueryRejectCondition() == QueryRejectCondition.NOT_OPEN;
boolean rejectNotCompletedCleanly =
queryRequest.getQueryRejectCondition() == QueryRejectCondition.NOT_COMPLETED_CLEANLY
&& closeStatus != WorkflowExecutionCloseStatus.COMPLETED;
if (rejectNotOpen || rejectNotCompletedCleanly) {
return new QueryWorkflowResponse()
.setQueryRejected(new QueryRejected().setCloseStatus(closeStatus));
}
}
CompletableFuture<QueryWorkflowResponse> result = new CompletableFuture<>();
queries.put(queryId.getQueryId(), result);
if (queryRequest.getQueryConsistencyLevel() == QueryConsistencyLevel.STRONG) {
pendingQueries.put(queryId.getQueryId(), queryRequest.getQuery());
} else {
PollForDecisionTaskResponse task =
new PollForDecisionTaskResponse()
.setTaskToken(queryId.toBytes())
.setWorkflowExecution(executionId.getExecution())
.setWorkflowType(startRequest.getWorkflowType())
.setQuery(queryRequest.getQuery())
.setWorkflowExecutionTaskList(startRequest.getTaskList());
TaskListId taskListId =
new TaskListId(
queryRequest.getDomain(),
stickyExecutionAttributes == null
? startRequest.getTaskList().getName()
: stickyExecutionAttributes.getWorkerTaskList().getName());
queryRequests.put(queryId.getQueryId(), task);
store.sendQueryTask(executionId, taskListId, task);
}
try {
return result.get();
} catch (InterruptedException e) {
return new QueryWorkflowResponse();
} catch (ExecutionException e) {
Throwable cause = e.getCause();
if (cause instanceof TException) {
throw (TException) cause;
}
throw new InternalServiceError(Throwables.getStackTraceAsString(cause));
}
}