use of com.facebook.presto.thrift.api.udf.ThriftUdfResult in project presto by prestodb.
the class ThriftSqlFunctionExecutor method invokeUdfWithRetry.
private static CompletableFuture<ThriftUdfResult> invokeUdfWithRetry(ThriftUdfService thriftUdfService, ThriftUdfRequest request) {
CompletableFuture<ThriftUdfResult> resultFuture = invokeUdf(thriftUdfService, request);
for (int i = 0; i < DEFAULT_RETRY_ATTEMPTS; i++) {
resultFuture = resultFuture.thenApply(CompletableFuture::completedFuture).exceptionally(t -> {
Throwable e = t.getCause();
if (e instanceof PrestoException) {
throw (PrestoException) e;
}
if (e instanceof ThriftUdfServiceException && ((ThriftUdfServiceException) e).isRetryable()) {
return invokeUdf(thriftUdfService, request);
}
PrestoException prestoException = e instanceof ThriftUdfServiceException ? toPrestoException((ThriftUdfServiceException) e) : new PrestoException(GENERIC_INTERNAL_ERROR, e);
throw prestoException;
}).thenCompose(identity());
}
return resultFuture;
}
use of com.facebook.presto.thrift.api.udf.ThriftUdfResult in project presto by prestodb.
the class EchoFirstInputThriftUdfService method invokeUdf.
@Override
public ListenableFuture<ThriftUdfResult> invokeUdf(ThriftUdfRequest request) throws ThriftUdfServiceException {
ThriftUdfPage inputs = request.getInputs();
ThriftUdfPage result;
switch(inputs.getPageFormat()) {
case PRESTO_THRIFT:
PrestoThriftPage thriftPage = inputs.getThriftPage();
if (thriftPage.getThriftBlocks().isEmpty()) {
throw toThriftUdfServiceException(false, EchoFirstInputErrorCode.GENERIC_INTERNAL_ERROR.toErrorCode(), new UnsupportedOperationException("No input to echo"));
}
result = thriftPage(new PrestoThriftPage(ImmutableList.of(thriftPage.getThriftBlocks().get(0)), inputs.getThriftPage().getPositionCount()));
break;
case PRESTO_SERIALIZED:
PagesSerde pagesSerde = new PagesSerde(blockEncodingSerde, Optional.empty(), Optional.empty(), Optional.empty());
Page page = pagesSerde.deserialize(inputs.getPrestoPage().toSerializedPage());
if (page.getChannelCount() == 0) {
throw toThriftUdfServiceException(false, EchoFirstInputErrorCode.GENERIC_INTERNAL_ERROR.toErrorCode(), new UnsupportedOperationException("No input to echo"));
}
result = prestoPage(pagesSerde.serialize(new Page(page.getBlock(0))));
break;
default:
throw new UnsupportedOperationException();
}
return immediateFuture(new ThriftUdfResult(result, new ThriftUdfStats(100)));
}
Aggregations