presto(九)——restful api之execute

2017-03-15  本文已影响0人  hello高world

1、看状态

@Path("/v1/execute")
public class ExecuteResource
{
    private final HttpServerInfo serverInfo;
    private final HttpClient httpClient;
    private final JsonCodec<QueryResults> queryResultsCodec;

2、看执行方法

ExecuteResource.java(@Path("/v1/execute"))

 @POST
    @Produces(MediaType.APPLICATION_JSON)
    public Response createQuery(String query, @Context HttpServletRequest servletRequest)
    {
        assertRequest(!isNullOrEmpty(query), "SQL query is empty");

        ClientSession clientSession = createClientSessionForRequest(servletRequest, serverUri(), new Duration(2, MINUTES));
        StatementClient client = new StatementClient(httpClient, queryResultsCodec, clientSession, query);

        List<Column> columns = getColumns(client);
        Iterator<List<Object>> iterator = flatten(new ResultsPageIterator(client));
        SimpleQueryResults results = new SimpleQueryResults(columns, iterator);

        return Response.ok(results, MediaType.APPLICATION_JSON_TYPE).build();
    }
    

有没有发现跟上一节的很相似:

QueryResource.java(@Path("/v1/query"))

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public Response createQuery(
            String statement,
            @Context HttpServletRequest servletRequest,
            @Context UriInfo uriInfo)
    {
        assertRequest(!isNullOrEmpty(statement), "SQL statement is empty");

        Session session = createSessionForRequest(servletRequest, transactionManager, accessControl, sessionPropertyManager, queryIdGenerator.createNextQueryId());

        QueryInfo queryInfo = queryManager.createQuery(session, statement);
        URI pagesUri = uriBuilderFrom(uriInfo.getRequestUri()).appendPath(queryInfo.getQueryId().toString()).build();
        return Response.created(pagesUri).entity(queryInfo).build();
    }

我们先看看返回值:
QueryResource返回的是uri+queryInfo (链接地址+查询信息)
ExecuteResource返回的是results (结果)

其实还有一个类:

@Path("/v1/statement")
public class StatementResource

同样也有createQuery方法:

@POST
    @Produces(MediaType.APPLICATION_JSON)
    public Response createQuery(
            String statement,
            @Context HttpServletRequest servletRequest,
            @Context UriInfo uriInfo)
            throws InterruptedException
    {
        assertRequest(!isNullOrEmpty(statement), "SQL statement is empty");

        Session session = createSessionForRequest(servletRequest, transactionManager, accessControl, sessionPropertyManager, queryIdGenerator.createNextQueryId());

        ExchangeClient exchangeClient = exchangeClientSupplier.get(deltaMemoryInBytes -> { });
        Query query = new Query(session, statement, queryManager, exchangeClient);
        queries.put(query.getQueryId(), query);

        return getQueryResults(query, Optional.empty(), uriInfo, new Duration(1, MILLISECONDS));
    }

3、三个不同的类相同方法对比

Execute Resource

The execute resource is what the client sends queries to. It is
available at the path ``/v1/execute``, and accepts a query as a POST
and returns JSON.

Query Resource

The query resource takes a SQL query. It is available at the path
``/v1/query`` and accepts several HTTP methods.

Statement Resource

This is the standard resource used by the client to execute a
statement. When executing a statement, the Presto client will
call this resource repeatedly to get the status of an ongoing
statement execution as well as the results of a completed
statement.

可以看出来Statement Resource这种是标准的用于client查询用的。

上一篇下一篇

猜你喜欢

热点阅读