通过阅读源码,得出一下一些结论,如果论坛小伙伴能给出一些确认信息,那即是最好的,先在此谢过:
-
对于我们的query语句,首先通过flex&bison词法语法解析成对应sentence:总共有如下几种sentence
AdminSentences
ExplainSentence
MaintainSentences
MatchSentence
MutateSentences
ProcessControlSentences
SequentialSentences
TraverseSentences
UserSentences -
根据生成的sentence通过validator进行验证参数的合法性,如果通过以后,那么进行toPlan的操作,也就是生成执行计划的过程:对于执行计划,首先通过PlannersRegister注册一些复杂的Planer,也就是我们在src/graph/planner目录下看到的ngql自研语句和openCypher的MATCH以及相关子语句的Planer。对于这些Planer的生成,是通过Validator的父类toPlan方法,结合对应src/graph/context下面的ctx,再配合Register的Planer通过transform方法来生成对应复杂的Plan的(这块我感觉我的理解没有问题)
-
那么为什么不注册其他的Planer呢,因为在我的理解来说别的Planer由于过于简单,所以直接在每一个子validator类中直接调用对应toPlan方法来生成执行计划。(这个地方可以从子类的validator看出,未注册的Planer所对应的都有toPlan方法)
-
将生成的ExecutionPlan,拿到root,然后调用scheduler的schedule方法,通过DAG的方式组织调用执行。
以上是我所有的理解,希望知道人士给一个指导,在次谢过