@Override public void onFailure(Throwable throwable) { fail(throwable); } }, directExecutor());
@Override public boolean isDone() { return getState().isDone(); }
private <T extends Statement> DataDefinitionExecution<T> createDataDefinitionExecution( String query, Session session, ResourceGroupId resourceGroup, T statement, List<Expression> parameters, WarningCollector warningCollector) { @SuppressWarnings("unchecked") DataDefinitionTask<T> task = (DataDefinitionTask<T>) tasks.get(statement.getClass()); checkArgument(task != null, "no task for statement: %s", statement.getClass().getSimpleName()); QueryStateMachine stateMachine = QueryStateMachine.begin( query, session, locationFactory.createQueryLocation(session.getQueryId()), resourceGroup, task.isTransactionControl(), transactionManager, accessControl, executor, metadata, warningCollector); stateMachine.setUpdateType(task.getName()); return new DataDefinitionExecution<>(task, statement, transactionManager, metadata, accessControl, stateMachine, parameters); } }
@Override public DataDefinitionExecution<?> createQueryExecution( QueryId queryId, String query, Session session, Statement statement) { URI self = locationFactory.createQueryLocation(queryId); DataDefinitionTask<Statement> task = getTask(statement); checkArgument(task != null, "no task for statement: %s", statement.getClass().getSimpleName()); QueryStateMachine stateMachine = QueryStateMachine.begin(queryId, query, session, self, task.isTransactionControl(), transactionManager, executor); stateMachine.setUpdateType(task.getName()); return new DataDefinitionExecution<>(task, statement, transactionManager, metadata, accessControl, stateMachine); }
@Override public void start() { try { // transition to running if (!stateMachine.transitionToRunning()) { // query already running or finished return; } ListenableFuture<?> future = task.execute(statement, transactionManager, metadata, accessControl, stateMachine, parameters); Futures.addCallback(future, new FutureCallback<Object>() { @Override public void onSuccess(@Nullable Object result) { stateMachine.transitionToFinishing(); } @Override public void onFailure(Throwable throwable) { fail(throwable); } }, directExecutor()); } catch (Throwable e) { fail(e); throwIfInstanceOf(e, Error.class); } }
@Override public void start() { try { // transition to running if (!stateMachine.transitionToRunning()) { // query already running or finished return; } CompletableFuture<?> future = task.execute(statement, transactionManager, metadata, accessControl, stateMachine); future.whenComplete((o, throwable) -> { if (throwable == null) { stateMachine.transitionToFinishing(); } else { fail(throwable); } }); } catch (Throwable e) { fail(e); if (!(e instanceof RuntimeException)) { throw Throwables.propagate(e); } } }