簡體   English   中英

如何修改 RelNode 樹?

[英]How to modify a RelNode tree?

我正在使用 Apache Calcite 根據對這些 SQL 查詢施加某些限制的策略來驗證和重寫 SQL。 我正在嘗試修改RelNode樹以重寫查詢以強制執行這些限制。 我希望能夠從查詢中刪除某些部分(在驗證之后)。 例如,我希望能夠刪除投影字段(我設法使用RelBuilder.projectExcept )並從查詢中刪除表掃描及其對應的列引用。

簡單的例子:

SELECT a.foo, b.bar, c.baz
FROM a, b, c
WHERE a.index = b.index AND b.index = c.index

假設我們要從查詢中刪除表c ,以得到以下結果:

SELECT a.foo, b.bar
FROM a, b
WHERE a.index = b.index

我試過使用RelBuilder但這不支持從樹中刪除節點。 我也考慮過使用RelVisitor的方法,但這似乎非常復雜。 我認為它本質上需要構建一個新的RelNode樹。 最后,使用RelRule實施規則似乎是一個合適的選擇,但我無法從 Calcite 文檔中弄清楚如何刪除特定的RelNode以及如何對其進行參數化(例如,如果表名是c ,則有條件地應用規則)。

誰能指出我的好方法? 或者,只修改SqlNode解析樹會更容易嗎?

規則將RelNode轉換為等效RelNode ,即兩者應具有相同的行。 假設您想在注冊了自定義規則的情況下使用HepPlanner ,它將最終使用RelOptUtil#verifyTypeEquivalence檢查原始 rel 和轉換后的 rel 是否具有相同的行。 我認為通過RelVisitor relNode通過SqlVisitor sqlNode你最好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM