关于Planner的一些疑问确认

通过阅读源码,得出一下一些结论,如果论坛小伙伴能给出一些确认信息,那即是最好的,先在此谢过:

  1. 对于我们的query语句,首先通过flex&bison词法语法解析成对应sentence:总共有如下几种sentence
    AdminSentences
    ExplainSentence
    MaintainSentences
    MatchSentence
    MutateSentences
    ProcessControlSentences
    SequentialSentences
    TraverseSentences
    UserSentences

  2. 根据生成的sentence通过validator进行验证参数的合法性,如果通过以后,那么进行toPlan的操作,也就是生成执行计划的过程:对于执行计划,首先通过PlannersRegister注册一些复杂的Planer,也就是我们在src/graph/planner目录下看到的ngql自研语句和openCypher的MATCH以及相关子语句的Planer。对于这些Planer的生成,是通过Validator的父类toPlan方法,结合对应src/graph/context下面的ctx,再配合Register的Planer通过transform方法来生成对应复杂的Plan的(这块我感觉我的理解没有问题)

  3. 那么为什么不注册其他的Planer呢,因为在我的理解来说别的Planer由于过于简单,所以直接在每一个子validator类中直接调用对应toPlan方法来生成执行计划。(这个地方可以从子类的validator看出,未注册的Planer所对应的都有toPlan方法)

  4. 将生成的ExecutionPlan,拿到root,然后调用scheduler的schedule方法,通过DAG的方式组织调用执行。

以上是我所有的理解,希望知道人士给一个指导,在次谢过

1 个赞

我试着解释下哈(
因为第一次生成 plan 是在 validator 里而不是 planner,所以那些虽然在 planner/plan 下边的,但是没被注册的执行计划其实在 validator 里的第一次 to_plan 有用到过,planner 里的 register 只是为了有优化空间(可能 apply optimization rule 的)的计划做的,那些比如 admin 的执行是不需要 optmizer 的。

1 个赞