Hi Hequn, it has been very hard to find even a very small tutorial of how to create my on rule in Calcite+Flink. What I did was copy a Calcite rule to my project and try to understand it. I am working with the FilterJoinRule [1] which is one rule the Flink is modifying it. In the end I want to create a rule for Join operators that allow me to choose between different implementations of Join algorithms (nested-loop, sort-merge, hash).
If you have any step-by-step on understanding the "RelOptRuleCall" parameter would be very nice =). but I guess I have to keep digging into the code... Thanks anyway! [1] https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java *--* *-- Felipe Gutierrez* *-- skype: felipe.o.gutierrez* *--* *https://felipeogutierrez.blogspot.com <https://felipeogutierrez.blogspot.com>* On Tue, Jul 9, 2019 at 2:10 PM Hequn Cheng <chenghe...@gmail.com> wrote: > Hi Felipe, > > > what is the relation of RelFactories [1] when I use it to create the > INSTANCE of my rule? > The `RelFactories.LOGICAL_BUILDER` can be used during the rule > transformation, i.e., the `RelFactories.LOGICAL_BUILDER` is a > `RelBuilderFactory` which contains a `create` method can be used to create > a `RelBuilder`. The `RelBuilder`[1] is used to create relational > expressions. > > Maybe we can also post the question in the Calcite mailing list. They may > give more details. :-) > > Best, > Hequn > > [1] > https://github.com/hequn8128/calcite/blob/master/core/src/main/java/org/apache/calcite/tools/RelBuilder.java > > > On Tue, Jul 9, 2019 at 4:06 PM Felipe Gutierrez < > felipe.o.gutier...@gmail.com> wrote: > >> Hi Hequn, >> >> what is the relation of RelFactories [1] when I use it to create the >> INSTANCE of my rule? For example: >> >> public static final MyFilterRule INSTANCE = new >> MyFilterRule(Filter.class, RelFactories.LOGICAL_BUILDER); >> >> then I create a CalciteCOnfigBuilder using "new >> CalciteConfigBuilder().addLogicalOptRuleSet(), .addNormRuleSet(), >> .addPhysicalOptRuleSet()". >> >> [1] >> https://calcite.apache.org/apidocs/org/apache/calcite/rel/core/RelFactories.html#LOGICAL_BUILDER >> *--* >> *-- Felipe Gutierrez* >> >> *-- skype: felipe.o.gutierrez* >> *--* *https://felipeogutierrez.blogspot.com >> <https://felipeogutierrez.blogspot.com>* >> >> >> On Tue, Jul 9, 2019 at 5:06 AM Hequn Cheng <chenghe...@gmail.com> wrote: >> >>> Hi Felipe, >>> >>> > I would like to create a logical filter if there is no filter set on >>> the logical query. How should I implement it? >>> Do you mean you want to add a LogicalFilter node if the query even >>> doesn't contain filter? Logically, this can be done through a rule. >>> However, it sounds a little hack and you have to pay attention to semantic >>> problems. One thing you have to notice is that you can't change the RowType >>> when you perform your rules, i.e., for NodeA -> rule -> NodeB, NodeB should >>> contain the same row type with NodeA. >>> There are a lot of rules in Flink which I think is a good example for >>> you. You can find these rules in the class of `FlinkRuleSets`. >>> >>> > I see my LogicalFilter been created when I call "tableEnv.explain()" >>> method. I suppose that I can add some logical filters on the plan. >>> The `LogicalFilter` and `DataStreamCalc` is not created by your Filter >>> rule. If you remove your filter rule, there is nothing change for the plan. >>> >>> Best, Hequn >>> >>> On Mon, Jul 8, 2019 at 11:13 PM Felipe Gutierrez < >>> felipe.o.gutier...@gmail.com> wrote: >>> >>>> Hi, >>>> >>>> I am a newbie in Apache Calcite. I am trying to use it with Apache >>>> Flink. To start I am trying to create a HelloWorld which just add a logical >>>> filter on my query. >>>> 1 - I have my Flink app using Table API [1]. >>>> 2 - I have created my Calcite filter rule which is applied to my FLink >>>> query if I use CalciteConfig cc = new >>>> CalciteConfigBuilder().addLogicalOptRuleSet(RuleSets.ofList(MyFilterRule.INSTANCE)).build() >>>> [2]; >>>> 3 - The debug thread only goes to my rule if there is a filter on my >>>> query. >>>> >>>> I would like to create a logical filter if there is no filter set on >>>> the logical query. How should I implement it? >>>> I see my LogicalFilter been created when I call "tableEnv.explain()" >>>> method. I suppose that I can add some logical filters on the plan. >>>> >>>> == Abstract Syntax Tree == >>>> LogicalFilter(condition=[>=($6, 50)]) >>>> LogicalTableScan(table=[[TicketsStation01Plat01]]) >>>> >>>> == Optimized Logical Plan == >>>> DataStreamCalc(select=[sensorId, sensorType, platformId, platformType, >>>> stationId, timestamp, value, trip, eventTime], where=[>=(value, 50)]) >>>> StreamTableSourceScan(table=[[TicketsStation01Plat01]], >>>> fields=[sensorId, sensorType, platformId, platformType, stationId, >>>> timestamp, value, trip, eventTime], source=[SensorTuples]) >>>> >>>> == Physical Execution Plan == >>>> .... >>>> >>>> Thanks, >>>> Felipe >>>> >>>> [1] >>>> https://github.com/felipegutierrez/explore-flink/blob/master/src/main/java/org/sense/flink/examples/stream/table/HelloWorldCalcitePlanTableAPI.java#L62 >>>> [2] >>>> https://github.com/felipegutierrez/explore-flink/blob/master/src/main/java/org/sense/calcite/rules/MyFilterRule.java#L14 >>>> *--* >>>> *-- Felipe Gutierrez* >>>> >>>> *-- skype: felipe.o.gutierrez* >>>> *--* *https://felipeogutierrez.blogspot.com >>>> <https://felipeogutierrez.blogspot.com>* >>>> >>>