Presto-[19]-Query

StatementResource::createQuery()中构建一个Query

  public void createQuery(
            String statement, //查询SQL
            @Context HttpServletRequest servletRequest,
            @Context UriInfo uriInfo,
            @Suspended AsyncResponse asyncResponse)
构建一个Query

Query构建细节

Query query = Query.create(
                sessionContext,
                statement, //查询SQL
                queryManager,
                sessionPropertyManager,
                exchangeClient,
                responseExecutor,
                timeoutExecutor,
                blockEncodingSerde);
在Query的构造中利用QueryManager
QueryInfo queryInfo = queryManager.createQuery(sessionContext, query);

QueryManager的实现类SqlQueryManager::createQuery(..)

* 构建queryId
* 机器启动检测
* 构建session, sessionContext中含有catalog等信息
* antlr解析SQL得到statement
* 根据statement的类型获得QueryExecution
* 启动后台查询queueManager.submit(statement, queryExecution, queryExecutor)
SqlQueryManager

    @Override
    public QueryInfo createQuery(SessionContext sessionContext, String query)
    {
        //构建queryId
        QueryId queryId = queryIdGenerator.createNextQueryId();
        try {
            //机器启动检测
            if (!acceptQueries.get()) {
             //...
            }
            //构建session, sessionContext中含有catalog等信息
            session = sessionSupplier.createSession(queryId, sessionContext);

            if (query.length() > maxQueryLength) {
             //对query的长度有限制
            }

            //antlr解析SQL
            Statement wrappedStatement = sqlParser.createStatement(query, createParsingOptions(session));
            statement = unwrapExecuteStatement(wrappedStatement, sqlParser, session);
            List<Expression> parameters = wrappedStatement instanceof Execute ? ((Execute) wrappedStatement).getParameters() : emptyList();
            validateParameters(statement, parameters);

            //根据statement的类型构建queryExecution
            QueryExecutionFactory<?> queryExecutionFactory = executionFactories.get(statement.getClass());
            queryExecution = queryExecutionFactory.createQueryExecution(queryId, query, session, statement, parameters);
        }

        catch (ParsingException | PrestoException | SemanticException e) {
        //...
                }

        QueryInfo queryInfo = queryExecution.getQueryInfo();
        queryMonitor.queryCreatedEvent(queryInfo);

        queryExecution.addFinalQueryInfoListener(finalQueryInfo -> {
            // ....
            }
        });

        addStatsListeners(queryExecution);

        queries.put(queryId, queryExecution);

        // 启动后台查询
        queueManager.submit(statement, queryExecution, queryExecutor);

        return queryInfo;
        }

猜你喜欢

转载自blog.csdn.net/hjw199089/article/details/81415316