2015-04-04 42 views
0

我正在嘗試使用presto-parser。我需要知道的是如何分析和提取查詢身體產生Statement我們:使用Facebook presto-parser

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

似乎有沒有什麼辦法讓從Statement getter/setter方法。我調試了Statement對象,我可以從調試視圖中看到我需要的值。

參見:

enter image description here

我需要選擇,來自哪裏,GROUPBY,ORDERBY,並由SqlParser提取出該限制值。

回答

3

從sql字符串中,您可以通過丟棄Statement來獲得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 2015-04-06 08:07:29

+0

通過代碼庫的粗略瀏覽,它看起來不受支持。這是可能的,因爲引擎並不是真的意味着這一點,但從完整性的角度來看,如果是這樣的話,我仍然會感到驚訝。 – 2015-04-06 22:22:15

+1

根據[ANTLR定義文件]不支持'UPDATE'(https://github.com/facebook/presto/blob/master/presto-parser/src/main/antlr4/com/facebook/presto/sql/解析器/ SqlBase.g4)。 – 2016-03-16 20:46:44