2015-04-04 3 views
0

Я пытаюсь использовать presto-parser. Что мне нужно знать, как анализировать и извлекать тело запроса наших из созданного Statement:Использование превью-анализатора Facebook

SqlParser SQL_PARSER = new SqlParser(); 
Statement statement = SQL_PARSER.createStatement(query); 

Там не кажется каким-либо образом, чтобы получить, что от Statement геттер/сеттеров. Я отлаживал объект Statement, и из представления отладки вижу значения, которые мне нужно получить.

См:

enter image description here

Мне нужно, чтобы получить выбрать из, где, группеПо, OrderBy и предельные значения, которые были извлечены из по SqlParser.

ответ

3

Из строки sql вы можете получить Query (который расширяет выписку), отбрасывая Statement. Query.getQueryBody возвращает QueryBody, который вы можете наложить на QuerySpecification (который распространяется QueryBody). С QuerySpecification вы можете получить то, что ищете. Вот простой пример:

public class PrestoParserTest { 
    public static void main(String[] args) { 
     SqlParser parser = new SqlParser(); 
     String sql = "select * from xyz where x=y group by x order by y limit 10"; 
     Query query = (Query)parser.createStatement(sql); 
     QuerySpecification body = (QuerySpecification)query.getQueryBody(); 
     Select select = body.getSelect(); 
     System.out.println("Columns = " + select.getSelectItems()); 
     System.out.println("From = " + body.getFrom().get()); 
     Optional<Expression> where = body.getWhere(); 
     System.out.println("Where = " + where.get()); 
     System.out.println("Group by = " + body.getGroupBy()); 
     System.out.println("Order by = " + body.getOrderBy()); 
     System.out.println("Limit = " + body.getLimit().get()); 

    } 
} 

Запуск этого возвращается:

Columns = [*] 
From = Table{xyz} 
Where = ("x" = "y") 
Group by = ["x"] 
Order by = [SortItem{sortKey="y", ordering=ASCENDING, nullOrdering=UNDEFINED}] 
Limit = 10 
+1

Как насчет заявления «UPDATE», гоп-анализатор, кажется, не поддерживает это? – xybrek

+0

С беглым взглядом на кодовую базу, похоже, что она не поддерживается. Это возможно, потому что двигатель на самом деле не предназначен для этого, но я все равно был бы удивлен, если бы это было так, просто с точки зрения полноты. –

+1

'UPDATE' не поддерживается в соответствии с [файлом определения ANTLR] (https://github.com/facebook/presto/blob/master/presto-parser/src/main/antlr4/com/facebook/presto/sql/ анализатор/SqlBase.g4). –

Смежные вопросы