Pranav, there are `QueryExecution` that holding logicalPlan, optimizedPlan and sparkPlan(physical) in Spark: https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/QueryExecution.scala
In fact, my code is similar to it. I have an object holding ValidatedSqlNode, LogicalRelNode, physicalRelNode. On Tue, 23 Aug 2022 at 23:03, Benchao Li <[email protected]> wrote: > Pranav, > There is a doc[1] which talks about how to write a rule. You can also take > a look at existing > rules such as FilterTableScanRule[2], ProjectTableScanRule[3] for > reference. > > [1] https://calcite.apache.org/docs/howto.html#create-a-planner-rule > [2] > > https://github.com/apache/calcite/blob/7de37aefaaa72959a0145053319fae2956fbb9f1/core/src/main/java/org/apache/calcite/rel/rules/FilterTableScanRule.java > [3] > > https://github.com/apache/calcite/blob/7de37aefaaa72959a0145053319fae2956fbb9f1/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java > > Pranav Deshpande <[email protected]> 于2022年8月22日周一 23:00写道: > > > Hi Benchao, > > Thank you very much for referring me to this document. > > > > Could you please provide me with a pointer on how to write the optimizer > > rule(s) you mentioned in part I of your answer? > > > > Regards, > > Pranav > > > > On Sat, Aug 20, 2022 at 11:35 PM Benchao Li <[email protected]> > wrote: > > > > > I agree that a separate planner rule is better. Besides, if you are > > > constructing the optimizing rules > > > by yourself in your project, you can avoid this by not adding > > > `FilterTableScanRule` and > > > `ProjectTableScanRule`. > > > > > > Pranav, > > > there is a doc[1] about how to contribute to Calcite. > > > > > > [1] https://calcite.apache.org/develop/#contributing > > > > > > Jiajun Xie <[email protected]> 于2022年8月21日周日 09:00写道: > > > > > > > Agree with Hyde, there are many problems when converting a physical > > > > RelNode directly to SQL. For example, > > > > https://issues.apache.org/jira/browse/CALCITE-2915 > > > > > > > > In my project, I have an object holding Logical RelNode and > Physical > > > > RelNode. When I want to convert sql, I can use Logical RelNode. I > hope > > > it's > > > > useful to you, Pranav. > > > > > > > > On Sun, 21 Aug 2022 at 02:50, Julian Hyde <[email protected]> > > > wrote: > > > > > > > > > It doesn’t seem quite right to convert a physical RelNode directly > to > > > > SQL. > > > > > It’s probably better to map it back to logical RelNode(s) first. > > > > > > > > > > I don’t know whether we have the software to do that mapping. If we > > > > don’t, > > > > > consider using planner rules. They’re often the right way in > Calcite. > > > > > > > > > > Julian > > > > > > > > > > > On Aug 20, 2022, at 03:26, Pranav Deshpande < > > > > > [email protected]> wrote: > > > > > > > > > > > > Hi Bencaho, > > > > > > Thank you very much for your reply. Could you please tell me the > > > > > procedure > > > > > > to create this issue on JIRA? > > > > > > > > > > > > Thanks & Regards, > > > > > > Pranav > > > > > > > > > > > >> On Fri, Aug 19, 2022 at 11:13 PM Benchao Li < > [email protected] > > > > > > > > wrote: > > > > > >> > > > > > >> Pranav, > > > > > >> > > > > > >> This is a good question. To me, I would take this as a bug, and > we > > > > could > > > > > >> improve the > > > > > >> RelToSqlConverter to treat BindableTableScan specially. > > > > > >> Could you please help log a Jira issue? Contributions are > welcome! > > > > > >> > > > > > >> Pranav Deshpande <[email protected]> 于2022年8月20日周六 > > > > 02:13写道: > > > > > >> > > > > > >>> Hi Team, > > > > > >>> How can I convert a BindableTableScan with projects and Filters > > > back > > > > > to a > > > > > >>> RelTree with a project node, a filter node and a tablescan > node? > > > > > >>> > > > > > >>> I am doing this because I encountered the following issue > (steps > > > > > detailed > > > > > >>> below). > > > > > >>> > > > > > >>> 1. I have a query:eg. Select colA, colB from myTable where > colA > > > > 1; > > > > > >>> 2. The logical plan for this is a filter on top of a project on > > top > > > > of > > > > > a > > > > > >>> TableScan. > > > > > >>> 3. If the table we created is a ProjectableFilterableTable and > we > > > > have > > > > > >>> added the ProjectTableScan rule etc., then after optimization > we > > > > have a > > > > > >>> single node which is a tablescan that contains filters and > > project > > > > and > > > > > >> can > > > > > >>> be executed by the bindable convention. > > > > > >>> 4. If I convert this node to a SQL, I get the wrong SQL. > > > > > >>> > > > > > >>> To get a SQL, I do the following: > > > > > >>> > > > > > >>> RelToSqlConverter converter = new > > > > > >>> > > RelToSqlConverter(SqlDialect.DatabaseProduct.CALCITE.getDialect()); > > > > > >>> SqlNode sqlNode = converter.visitRoot(rablescan).asStatement(); > > > > > >>> > > > > > >>> This only gives me Select * from myTable; > > > > > >>> > > > > > >>> However, if I only have a ScannableTable and we haven't added > the > > > > > >>> ProjectTableScan rule etc. then for the physical plan we also > > get a > > > > > >>> BindableFilter on top of a BindableProject on top of a > > > > > BindableTablescan. > > > > > >>> > > > > > >>> If i convert this back using the same code then I get the > correct > > > > > >> statement > > > > > >>> back: Select colA, colB from myTable where colA > 1 > > > > > >>> > > > > > >>> Hence I would like to know how to convert a BindableTableScan > > with > > > > > >> projects > > > > > >>> and Filters back to a RelTree with a project node, a filter > node > > > and > > > > a > > > > > >>> tablescan node & would appreciate the community's help on the > > same. > > > > > >>> > > > > > >>> Thanks & Regards, > > > > > >>> Pranav > > > > > >>> > > > > > >> > > > > > >> > > > > > >> -- > > > > > >> > > > > > >> Best, > > > > > >> Benchao Li > > > > > >> > > > > > > > > > > > > > > > > > > -- > > > > > > Best, > > > Benchao Li > > > > > > > > -- > > Best, > Benchao Li >
