I write following code to get the optimized RelNode

<code>
val configBuilder = Frameworks.newConfigBuilder()
configBuilder.defaultSchema(rootSchema)
val frameworkConfig = configBuilder.build()

val planner = Frameworks.getPlanner(frameworkConfig)

val sql2 = """ select * from "insight_user"."user_tab" as t1 join
"view"."logic_table_1" as t2 on t1."email" = t2."user" where t2."status" =
'fail' limit 10 """
val sqlNode = planner.parse(sql2)
val validate = planner.validate(sqlNode)
val rel = planner.rel(validate).project()

val cluster = rel.getCluster
val optPlanner = cluster.getPlanner.asInstanceOf[VolcanoPlanner]
// println(optPlanner.getRules)
optPlanner.addRule(FilterJoinRule.FILTER_ON_JOIN)
val desiredTraits  =
cluster.traitSet().replace(EnumerableConvention.INSTANCE)
val mid = optPlanner.changeTraits(rel, desiredTraits)
optPlanner.setRoot(mid)
val optimized = optPlanner.findBestExp()
</code>

Now I want to rewrite the `optimized` RelNode.




Danny Chan <[email protected]> 于2020年3月5日周四 下午10:33写道:

> Is your optimize an implementation ? Or heuristic or needs some metadata?
>
> Yang Liu <[email protected]>于2020年3月5日 周四下午3:48写道:
>
> > In Calcite, after optimization provided by the default VolcanoPlanner, we
> > can get an optimized RelNode, but can we have a further optimization? For
> > example I want to add an ElasticsearchSort or something like that to
> limit
> > the dataset we will handle.
> >
> > Someone suggests we can define a RelOptRule, but since VolcanoPlanner
> > handles the optimization in dynamic programming way, not sure if the rule
> > can be applied in the right order.
> >
> > Any ideas are welcome~
> >
>

Reply via email to