[英]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.