Hello.

I am not sure what you mean by "introspection".
I assume you have seen this blog post about the 3 calcite IRs that you mention: 
https://www.feldera.com/blog/calcite-irs/

Visitors are the way to go for traversing these data structures.

Mihai
________________________________
From: Matthew McMillian <matthewgmcmill...@gmail.com>
Sent: Thursday, January 25, 2024 7:28 PM
To: dev@calcite.apache.org <dev@calcite.apache.org>
Subject: [Question] Query Introspection on SqlNode, RexNode, and RelNode

Hi Calcite Devs,

Before I start, I just wanted to say that Calcite is a really awesome
framework! It's awesome to see a community come together to create such a
cool tool.

For reference, I'm using Calcite 1.36.

I'm newer to the Calcite ecosystem, but I have been experimenting with its
features for some time. I'm interested in using Calcite's different IRs
(SqlNode, RexNode, and RelNode in particular) to introspect a query. In
particular, I'm interested in analyzing a query's tree/plan and finding out
details about the query. Some examples to illustrate what I'm interested in
finding out (though not all the questions I might want to ask) are:
- At some arbitrary expression, what columns are referenced in that
expression?
- At some arbitrary expression, what functions are used in that expression?
- At some arbitrary expression, is this a subquery?
- At some arbitrary expression, what does the structure of the query look
like? Does it contain any subqueries or common table expressions?

>From what I've read in the JavaDocs, there are a few utilities that have
caught my eye, but I'm not 100% sure I'm looking in the right places.
- For SqlNode, I haven't noticed anything that can help me discover/collect
information from arbitrary nodes in a SqlNode tree. I've noticed that a
Visitor class is available, which is extremely useful. Does Calcite offer
any built-in introspection in this area, or is it expected that the
framework user extend the Visitor class to perform such introspection?
- For RexNode, I was unable to find anything that can allow me to
introspect RexNodes. I see that RexNodes also has a Visitor class, but I
have similar questions to the previous bullet point about built-in
introspection. In addition, I've also been unable to figure out how to
resolve RexInputRefs back to their source expressions so I could perform
analysis.
- For RelNode, I've found that the class RelMetadataQuery is very helpful
for analyzing a relational tree, but I've struggled to find out how to
introspect the details of LogicalProjects since a good chunk of the data
model's details (not structure) correspond to RexNodes.

My question for the team is: I've read through the documentation and have
checked out the JavaDocs quite a bit, but I haven't been able to find
the idiomatic way to perform this type of introspection in Calcite. Does
the team have any pointers on what parts of the codebase are valuable for
this type of introspection? Is this type of introspection even possible in
vanilla Calcite, or is this something that I would need to extend myself?
Are some of the areas I've called out even the right places to look to
solve the kind of introspection questions I've mentioned? Any guidance /
pointers in this area to get me set in the right direction would be greatly
appreciated.

Thank you for your time,
Matthew McMillian

Reply via email to