一种基于vastbase面向对象编程中对象方法的链式调用方法与流程

文档序号:35404432发布日期:2023-09-09 19:08阅读:36来源:国知局
一种基于vastbase面向对象编程中对象方法的链式调用方法与流程

本发明属于链式调用方法,尤其涉及一种基于vastbase面向对象编程中对象方法的链式调用方法及系统。


背景技术:

1、面向对象编程(oop)是一种编程范式,其中程序的功能被组织成对象的集合,这些对象通过相互之间的消息传递进行交互。在oop中,链式调用是一种常用的编程技巧,它允许通过在一个对象上调用方法并返回该对象本身,从而可以在一行代码中连续调用多个方法。支持链式调用的面向对象编程语言提供了适当的语法和语义支持,使得开发人员能够轻松地使用链式调用编写简洁和可读的代码。通过合理应用链式调用技术,可以改善代码的可维护性和可扩展性,并提高开发效率。

2、当前vastbase数据库增强了type功能,支持面向对象,允许创建成员变量和成员方法,并且能够在pl/pgsql过程语言中使用对象类型,调用对象成员方法。但相比于对象方法的链式调用,vastbase使用的传统的函数调用方式存在以下不足之处:(1)冗余变量使用:当需要对多个函数进行连续调用时,传统写法需要使用中间变量来保存每个函数调用的结果,从而导致代码中出现大量的冗余变量,降低了代码的可读性和简洁性;(2)缺乏直观性:传统的vastbase语法要求每个函数调用都需要在括号中明确指定参数,导致代码的层级结构不够直观,难以快速理解函数调用的顺序和关系。因此,需要提供一种方案支持对象方法的链式调用以完善vastbase的面向对象编程范式。

3、此外,pl/pgsql过程语言的语法并不支持链式调用,因此要想支持函数方法的调用链,一种可行的方案是定义一个处理器函数,函数的参数为函数调用链的字符串,函数的功能是将函数调用链字符串转换成传统的函数调用方式并且执行。该方案的优点是实现方便,并不需要修改pl/pgsql的语法,但并不简洁直观,每次需要实施链式调用时都必须调用该处理器方法。因此,要想完美支持对象方法的链式调用,还是需要设计和定义新的语法规则,使其能够在pl/pgsql过程语言中支持链式调用的函数形式。


技术实现思路

1、为了解决pl/pgsql过程语言不支持链式调用的问题,本发明提供了一种在vastbase数据库的pl/pgsql过程语言中实现object.m1(args1).m2(args2)形式的函数调用的方法,使用户能够以一种更简洁、更直观的方式编写代码。本发明方法通过支持链式调用,可以减少中间变量的使用,简化代码结构,并提高代码的可读性和可维护性。

2、术语解释

3、vastbase数据库:vastbase数据库是海量数据基于开源opengauss内核开发的企业级关系型数据库,其中,vastbase在a兼容模式下,支持创建对象类型,并在对象类型里创建构造器函数、成员属性、成员方法和静态方法。

4、链式调用:链式调用是一种编程风格,它允许通过在方法调用之间连续地使用点操作符来构建复杂的操作链。在链式调用中,每个方法调用都返回一个对象,该对象又可以继续调用其他方法,形成一个链式的调用序列。

5、pl/pgsql:pl/pgsql是一种编程语言,可以用于在vastbase数据库中编写存储过程、触发器、函数和匿名代码块,它是vastbase提供的一种内置扩展语言,用于扩展数据库的功能和灵活性。

6、sql引擎:sql引擎是vastbase数据库的一个高度优化和功能丰富的核心组件,具备词法语法解析、语义分析、查询优化等功能,是负责解析、优化和执行sql查询的模块。

7、面向对象支持:vastbase数据库增强了type类型的创建,支持面向对象编程,允许创建成员变量和成员方法,并且能够在pl/pgsql过程语言中使用对象类型,调用对象成员方法。对象的成员方法与普通函数一样,在pg_proc系统表有记录,但是protypekind的值是m表示该函数是成员方法,且第一个参数的类型是对象类型,该参数在以对象形式调用时需要省略。

8、本发明利用vastbase数据库中的pl/pgsql、sql引擎和面向对象支持功能,来增强方法函数调用的语法,支持对象方法的链式调用。

9、vastbase数据库的pl/pgsql与sql引擎对于对象方法调用的协同工作流程如图1所示,包括以下步骤:

10、1.pl/pgsql词法解析器接收输入的代码语句(以obj.m(args)为例),并调用sql引擎的词法解析器对代码进行词法解析。

11、2.sql引擎的词法解析器将代码分解为一系列的词法单元,并进行相应的词法分析和处理。

12、3.pl/pgsql词法解析器对sql引擎返回的词法单元进行相应的处理,如前瞻缓存sql引擎词法解析结果等。

13、4.pl/pgsql语法解析器根据词法解析器的输出词法单元进行语法解析,并匹配相应的语法规则来验证和构建语法树,以理解代码的结构和语义,并构建相应的sql语句传递给sql引擎。在这个过程中,语法解析过程会判断obj的类型是否是对象类型,m是否是成员函数,如果都符合则会把obj.m(args)形式的调用转换成select m(obj,args)的sql语句。

14、5.sql引擎对pl/pgsql传递进来的sql语句进行解析、优化和执行sql查询等处理。

15、从上述流程可以看出,对象方法的调用obj.m(args)最终是通过转换成传统的函数调用m(obj,args)来实现的。因此,我们考虑可以在底层通过将对象方法链式调用转换成传统函数嵌套调用来实现该链式语法,比如将obj.m1(args1).m2(args2)的调用,转换成m2(m1(obj,args1),args2)的调用。想要实现这个目的,通常有如下两套方案:

16、1.在pl/pgsql语法解析阶段就将对象方法的链式调用转换成函数嵌套调用,如将obj.m1(args1).m2(args2)转换成select m2(m1(obj,args1),args2)的sql语句。然而,pl/pgsql的语法解析更多的是将编程语句转换成sql语句,因此对于该方案,sql引擎将无法区分该语句本身是函数调用还是对象方法调用。如果链式调用的方法是普通函数而不是成员方法,但是在sql引擎的语义解析阶段不知道此为链式调用,导致逃过了检查,出现了错误的用法(普通函数不应该支持链式调用)。因此对于普通函数误用链式调用的语义检查同样也需要放在pl/pgsql的语法解析阶段,这将加大语法语义解析的困难。

17、2.添加一种新的sql引擎语法解析规则,该规则用于解析对象方法的链式调用,并构建一个等同于传统函数嵌套调用的语法树,如obj.m1(args1).m2(args2),将构建一个等同于m2(m1(obj,args1),args2)调用规则的语法树。但是,由于vastbase的命名解析规则,函数调用表达式可能由模式名(schema)和函数名(function)组成,即schema.function(args),因此vastbase的语法解析工具bison在解析对象方法链式语法obj.m1(args1)时,会与函数表达式schema.function(args)语法产生移进规约冲突(这两个语法都是标识符.和标识符()的形式)。

18、综上可以看出,方案1会加大语义解析的难度,方案2的语法实现困难。因此我们考虑在解析obj.m(arg)流程(如图1)的基础上,结合方案1和方案2,构建一种新的对象方法链式调用的语法实现方法,本发明方法的具体流程如图3所示。在pl/pgsql的语法解析阶段,只解析转换对象方法链式调用的第一层,如将obj.m1(args1).m2(args2)语句仅转换成select m1(obj,args1).m2(args2)的sql语句。然后在sql引擎的语法解析阶段添加如图4所示的语法解析规则,该规则构建一个等同于传统函数嵌套调用的语法树,并在该语法树的每一层方法调用中添加一个标识,用于区分方法调用和普通函数调用,如针对m1(obj,args1).m2(args2)表达式,将构建一个等同于m2(m1(obj,args1),args2)的语法树。本发明方案语义解析简单,仅通过一个标识就可以区分是方法调用,还是普通函数调用,同时语法实现简单,仅需在pl/pgsql解析obj.m1(args)的基础上(图1流程),拼接上述的方法调用即可完成转换。除此之外,经过pl/pgsql的简单处理,本方案无需其他处理,就可以统一解析function(args0).m1(args1)形式和obj.m1(args1).m2(args2)形式的链式调用。

19、具体地,本发明提供了一种基于vastbase面向对象编程中对象方法的链式调用方法,其目的是使vastbase数据库在支持面向对象的基础上支持链式调用,本方法包括在vastbase数据库sql引擎的语法解析阶段添加一条新的sql引擎语法解析规则,该语法解析规则用于解析对象方法的链式调用,并为其构建一个等同于传统函数嵌套调用的语法树,同时在该语法树的每一层方法调用中添加一个方法调用标识,该标识用于区分方法调用和普通函数调用。

20、第一方面,本发明基于vastbase面向对象编程中对象方法的链式调用方法供用户在vastbase数据库的pl/pgsql过程语言中链式调用对象的成员方法,本方法包括下述步骤:

21、s1.pl/pgsql模块在对象调用的基础上,将obj.m1(args1)语句转换成m1(obj,args1),然后拼接上后续的方法.m2(args2),构造成m1(obj,args1).m2(args2)的sql语句,并传入sql引擎中;

22、s2.添加一条新的sql引擎语法解析规则,该规则为m1(obj,args1).m2(args2)语句构建一个等同于m2(m1(obj,args1),args2)的语法树,将每个方法调用转换成语法树中的节点,并在该语法树的每一层方法调用中添加一个方法调用标识;

23、s3.在语义解析阶段,遍历每个函数调用节点进行验证,针对每个函数调用节点,检查该节点是否存在对应的函数,并验证该节点是否是方法调用,若该节点是方法调用,则继续验证其是否是成员方法,若是则取出第一个参数节点重复此判断,直到第一个参数节点不是函数节点;

24、s4.从最后一个节点开始,按照嵌套调用的逻辑执行函数,对于每个函数调用节点,将其函数调用的结果作为第一个参数传递给上一层的函数调用,并依次向上执行,最终得到整个方法调用链的结果,并返回给调用者。

25、进一步地,本发明基于vastbase面向对象编程中对象方法的链式调用方法步骤s2中新增的sql引擎语法解析规则方法表达式由一个函数调用加上一个方法链构成,所述方法链由多个方法调用构成。

26、进一步地,本发明基于vastbase面向对象编程中对象方法的链式调用方法步骤s2中所述语法树中函数节点的连接顺序与sql语句中的顺序相同。

27、进一步地,本发明基于vastbase面向对象编程中对象方法的链式调用方法步骤s3中若检查发现某个函数调用节点对应的函数不存在或验证发现某个函数调用节点是方法调用但不是成员方法,则报错处理。

28、进一步地,本发明基于vastbase面向对象编程中对象方法的链式调用方法可以统一解析function(args0).m1(args1)形式和obj.m1(args1).m2(args2)形式的链式调用。

29、第二方面,本发明提供了一种基于vastbase面向对象编程中对象方法的链式调用系统,本系统包括:

30、语句处理模块:用于对象方法函数语句的形式转换及拼接;

31、规则管理模块:用于添加新的sql引擎语法解析规则,利用新增规则构建函数嵌套调用的语法树,并在该语法树的每一层方法调用中添加一个方法调用标识;

32、检查验证模块:用于检查函数调用节点是否存在对应的函数、是否是方法调用、以及是否是成员方法;

33、函数执行模块:用于按照嵌套调用的逻辑由下至上逐层执行函数。

34、进一步地,本发明基于vastbase面向对象编程中对象方法的链式调用系统中所述规则管理模块添加的新sql引擎语法解析规则方法表达式由一个函数调用加上一个方法链构成,所述方法链由多个方法调用构成。

35、最后,本发明还提供了一种计算机可读存储介质,所述存储介质上存储有计算机程序,所述程序被处理器执行时实现上述的基于vastbase面向对象编程中对象方法的链式调用方法的步骤。

36、综上,本发明基于vastbase面向对象编程中对象方法的链式调用方法具有以下特点:

37、(1)本发明提供了一种在vastbase数据库的pl/pgsql过程语言中实现object.m1(args1).m2(args2)形式的函数调用的方法,解决了pl/pgsql过程语言不支持链式调用的问题,使用户能够以一种更简洁、更直观的方式编写代码。

38、(2)本发明方法通过支持链式调用,可以减少中间变量的使用,简化代码结构,并提高代码的可读性和可维护性。

39、(3)本发明方法语义解析简单,仅通过一个标识就可以区分方法调用和普通函数调用,同时语法实现简单,仅需在pl/pgsql解析obj.m1(args)的基础上拼接后续方法调用即可完成转换。

40、(4)经过pl/pgsql简单处理,本发明方法可以统一解析function(args0).m1(args1)形式和obj.m1(args1).m2(args2)形式的链式调用。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1