CN113626071A - 函数注册方法、系统、电子设备及存储介质 - Google Patents
函数注册方法、系统、电子设备及存储介质 Download PDFInfo
- Publication number
- CN113626071A CN113626071A CN202110904004.2A CN202110904004A CN113626071A CN 113626071 A CN113626071 A CN 113626071A CN 202110904004 A CN202110904004 A CN 202110904004A CN 113626071 A CN113626071 A CN 113626071A
- Authority
- CN
- China
- Prior art keywords
- code
- function
- registration
- source
- data source
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 77
- 230000006870 function Effects 0.000 claims description 319
- 238000004891 communication Methods 0.000 claims description 15
- 238000004590 computer program Methods 0.000 claims description 8
- 238000012986 modification Methods 0.000 claims description 6
- 230000004048 modification Effects 0.000 claims description 6
- 238000011161 development Methods 0.000 abstract description 15
- 230000003044 adaptive effect Effects 0.000 abstract description 4
- 238000010586 diagram Methods 0.000 description 12
- 238000012545 processing Methods 0.000 description 7
- 229910021532 Calcite Inorganic materials 0.000 description 5
- 238000004364 calculation method Methods 0.000 description 5
- 230000009471 action Effects 0.000 description 3
- 238000012423 maintenance Methods 0.000 description 3
- 238000007726 management method Methods 0.000 description 3
- 230000008569 process Effects 0.000 description 3
- 238000013523 data management Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 230000014509 gene expression Effects 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明实施例涉及一种函数注册方法、系统、电子设备及存储介质,通过所述函数分发器获取函数的源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器;所调用的至少一个数据源对应的代码生成器生成至少一个数据源对应的注册代码;通过所述代码编译器对所述源代码和至少一个数据源对应的注册代码进行编译;通过所述依赖分发器将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,以实现注册;即本发明的实施例,通过函数分发器调用数据源(数据库或计算机框架)对应的代码生成器,生成对应的注册代码,并不需要开发人员进行数据源注册代码的适配开发,提高了开发效率。
Description
技术领域
本发明涉及计算机领域,尤其涉及一种函数注册方法、系统、电子设备及存储介质。
背景技术
现有的数据库管理系统,除了提供比较简单的查询和写入功能以外,也会提供一些封装的函数,即用户自定义函数(User Defined Function,简称UDF)以供用户调用。
为了实现用户成功调用UDF,需要开发人员先编写函数对应的源代码,然后将函数源代码在相应的数据库或计算框架中进行注册。
但是,由于数据库或计算框架有很多不同类型,开发人员需要针对每一种类型的数据库或计算机框架进行注册代码的编写,导致开发效率低。
发明内容
本发明提供了一种函数注册方法、系统、电子设备及存储介质,以解决现有技术中需要针对每一种类型的数据库或计算机框架进行注册代码的编写,开发效率低的技术问题。
第一方面,本发明提供了一种函数注册方法,应用于服务器,所述服务器上部署函数注册系统,所述函数注册系统包括函数分发器、代码生成器、代码编译器以及依赖分发器;所述方法包括:通过所述函数分发器获取函数的源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器;所调用的至少一个数据源对应的代码生成器生成至少一个数据源对应的注册代码;通过所述代码编译器对所述源代码和至少一个数据源对应的注册代码进行编译;通过所述依赖分发器将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,以实现注册。
作为可选的实施例,所述函数注册系统还包括函数编辑器和函数缓存器;所述通过所述函数分发器获取函数的源代码之前,还包括:通过所述函数编辑器接收用户对至少一个函数所编写的对应的至少一个源代码,并将所述至少一个源代码存储到所述函数缓存器中;所述通过所述函数分发器获取函数的源代码,包括:所述函数分发器从所述函数缓存器中逐个获取所述至少一个源代码。
作为可选的实施例,所述将所述至少一个源代码存储到所述函数缓存器中,包括:将源代码标识和所述至少一个源代码以一一对应的关系存储到所述函数缓存器中。
作为可选的实施例,所述函数注册系统还包括代码缓存器;所述生成至少一个数据源对应的注册代码之后,还包括:将所述源代码和所述至少一个数据源对应的注册代码存储到代码缓存器中;所述通过所述代码编译器对所述源代码和至少一个数据源对应的注册代码进行编译,包括:所述代码编译器从所述代码缓存器中逐个获取所述源代码和注册代码,并进行编译。
作为可选的实施例,所述将所述源代码和所述至少一个数据源对应的注册代码存储到代码缓存器中,包括:将所述源代码标识和至少一个数据源对应的注册代码以一一对应的关系存储到代码缓存器中。
作为可选的实施例,所述函数注册系统还包括依赖缓存器;所述通过所述代码编译器对所述源代码和至少一个数据源对应的注册代码进行编译之后,还包括:将编译后的源代码和至少一个数据源对应的注册代码存储到所述依赖缓存器中,并将依赖缓存器中所存储的其他编译代码引用到所述源代码和至少一个数据源对应的注册代码上;所述通过所述依赖分发器将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,包括:所述依赖分发器将从所述依赖缓存器中获取源代码、至少一个数据源对应的注册代码以及其他编译代码分别发送给对应的数据源。
作为可选的实施例,所述方法还包括:构建所述函数的配置文件,所述配置文件包括函数的关键信息;接收用户对所述配置文件中关键信息的修改。
作为可选的实施例,所述方法还包括:将函数的源代码以插件的形式存储在预设路径中;
所述通过所述函数分发器获取函数的源代码,包括:所述函数分发器通过扫描所述预设路径,获取所述预设路径下的函数的源代码的插件。
第二方面,本发明提供一种函数注册系统,包括函数分发器、代码生成器、代码编译器以及依赖分发器;其中,所述函数分发器用于,获取函数的源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器;所调用的至少一个数据源对应的代码生成器用于生成至少一个数据源对应的注册代码;所述代码编译器用于对所述源代码和至少一个数据源对应的注册代码进行编译;所述依赖分发器用于将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,以实现注册。
第三方面,本发明提供一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;存储器,用于存放计算机程序;处理器,用于执行存储器上所存放的程序时,实现第一方面任一项所述的函数注册方法的步骤。
第四方面,本发明提供一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如第一方面任一项所述的函数注册方法的步骤。
本发明实施例提供的函数注册方法、系统、电子设备及存储介质,所述方法应用于服务器,所述服务器上部署函数注册系统,所述函数注册系统包括函数分发器、代码生成器、代码编译器以及依赖分发器;通过所述函数分发器获取函数的源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器;所调用的至少一个数据源对应的代码生成器生成至少一个数据源对应的注册代码;通过所述代码编译器对所述源代码和至少一个数据源对应的注册代码进行编译;通过所述依赖分发器将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,以实现注册;即本发明的实施例,通过函数分发器调用数据源(数据库或计算机框架)对应的代码生成器,生成对应的注册代码,并不需要开发人员进行数据源注册代码的适配开发,提高了开发效率。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并与说明书一起用于解释本发明的原理。
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为现有技术提供的一种不同数据源的UDF注册方式示意图;
图2为本发明实施例提供的一种函数注册系统的架构图;
图3为本发明实施例提供的另一种函数注册系统的架构图;
图4为本发明实施例提供的一种函数注册方法的流程示意图;
图5为本发明实施例提供的另一种函数注册方法的流程示意图;
图6为本发明实施例提供的再一种函数注册方法的流程示意图;
图7为本发明实施例提供的又一种函数注册方法的流程示意图;
图8为本发明实施例提供的又一种函数注册方法的流程示意图;
图9a为本发明实施例提供的一种函数缓存器中的存储结构示意图;
图9b为本发明实施例提供的一种代码缓存器中的存储结构示意图;
图10为本发明实施例提供的一种电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
下面对本发明所涉及的名词进行解释:
用户自定义函数(User Defined Function,简称UDF):是一种广泛存在于数据管理系统当中的功能实现,可以通过用户自定义的方式来将特定的功能增量添加在原有数据管理系统的结构当中。
Hive:是一个基于MapReduce和HDFS的一种数据仓库,通过SQL语言进行访问控制,可以通过注册UDF的方式来定制用户的数据处理逻辑。
Spark:是一个数据计算框架,可以通过Spark SQL来进行数据的查询和计算,也可以通过注册UDF的方式来定制用户的数据处理逻辑。
SPI(Service Provider Interface)是Java中的一种服务发现机制,可以通过在ClassPath路径下的META-INFO/services文件夹中寻找文件,自动加载文件里所定义的类的技术。
Spark:是一个数据计算框架,可以通过Spark SQL来进行数据的查询和计算,也可以通过注册UDF的方式来定制用户的数据处理逻辑。
Calcite:是一个SQL数据查询优化器,本身类似于Spark,是一种计算引擎,支持通过注册UDF的方式来定制用户的数据处理逻辑。
Janino:是一个极小、极快的开源Java编译器,Janino不仅可以将Java源代码文件编译为字节码文件,还可以编译内存中的Java表达式、块、类和源码文件,加载字节码并在JVM中直接执行。
现有的数据库管理系统,除了提供比较简单的查询和写入的功能以外,也会提供一些用户自定义的函数,即UDF函数。UDF函数通常是一些封装好的数据处理逻辑,通过一些比较简单的方式实现调用,例如在一些SQL数据库当中(例如Hive),可以通过比较简单的SQL语句,调用到封装好的UDF函数,而不需要每一次调用都反复编写代码。例如,通过如下的SQL语句,就可以调用名称为trim的函数。
select trim(attr1)from table_1
为了实现用户成功调用UDF,开发人员在编写出函数对应的源代码后,会将函数在相应的数据库或计算框架中进行注册。举例来说,在Hive这种数据库中,其注册方式是将UDF写在一个类当中,然后通过SQL语句进行注册,其SQL语句如下:
CREATE TEMPORARY FUNCTION test_function as"org.xxx.xxx.xxx.TEST"
而在Spark这种计算框架当中,其注册方式是使用其内置的SparkSession来进行函数注册,其注册语句如下:
sparkSession.udf.register("test_function",new Function)
从上述例子可以看出,在这两种结构框架当中,虽然可以使用同样的函数体,但用户无法直接通过编码的方式,只写一次注册代码就将这个函数同时注册到不同的数据库和计算框架当中,也就是说,不同的数据库或计算框架需要不同的UDF注册方式。
而随着当前业务越来越复杂,一个业务处理系统中可能会用到很多不同类型的数据源(数据库或计算框架),为了在这些数据源中实现同一UDF,需要开发人员将几百个重复内容的代码翻译成不同数据源的注册方式,图1为现有技术提供的一种不同数据源的UDF注册方式示意图,如图1所示,开发人员针对不同的数据源(例如数据源A、数据源B以及数据源C)写出不同的UDF注册代码,然后分别将注册代码写入对应的数据源中进行注册。也就是说,开发人员会花费大量的时间在注册代码的翻译上,严重降低了一些业务处理系统的开发效率。
另外,服务的可维护性差,由于每份UDF的函数都是分别开发的,因此一旦其中一个函数出现bug,其辐射到的所有数据库中的代码都需要进行对应的改动,会占用很多维护时间,而且也会影响到服务的提供。
针对上述技术问题,本发明的技术构思在于,提供一种函数注册系统,该系统中包含函数分发器和代码生成器,函数分发器可以调用不同数据源对应的代码生成器,从而生成对应的注册代码,减少了开发人员重复开发注册代码工作,提高了开发效率。
图2为本发明实施例提供的一种函数注册系统的架构图,如图2所示,该函数注册系统包括函数分发器、至少一个代码生成器、代码编译器以及依赖分发器;其中,函数分发器获取函数的源代码,并调用至少一个数据源对应的代码生成器,代码生成器生成对应的注册代码,完成代码的编辑生成;代码编译器对从代码生成器获取的注册代码和源代码进行编译,并依赖分发器将编译完成的注册代码和源代码分发给对应的数据源,完成代码的编译分发。
在图2的基础上,图3为本发明实施例提供的另一种函数注册系统的架构图,如图3所示,该函数注册系统包括函数编辑器(或称之为编辑台)、函数缓存器、函数分发器、至少一个代码生成器(如图3包括代码生成器A、代码生成器B、代码生成器C)、代码缓存器、代码编译器、依赖缓存器以及依赖分发器;其中,函数编辑器、函数缓存器、函数分发器、代码生成器完成代码的编辑生成,代码缓存器、代码编译器、依赖缓存器以及依赖分发器完成代码的编译分发。
图4为本发明实施例提供的一种函数注册方法的流程示意图,该函数注册方法应用于服务器,所述服务器上部署函数注册系统,所述函数注册系统包括函数分发器、代码生成器、代码编译器以及依赖分发器,可参考图1所示。如图4所示,该函数注册方法包括:
步骤S101、通过所述函数分发器获取函数的源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器。
具体来说,函数分发器、代码生成器均为代码组件,其中,函数分发器可以获取待注册函数对应的源代码,所获取的源代码可以是开发人员通过开发平台针对函数编写的,也可以是已有的源代码。不同类型的数据源(数据库或者计算框架)对应有代码生成器,函数分发器可以统计需要注册的数据源的类型,从而确定要调用哪些代码生成器,例如若确定需要进行注册的数据源有数据源A、数据源B以及数据源C,则确定调用的代码生成器有代码生成器A、代码生成器B以及代码生成器C。
步骤S102、所调用的至少一个数据源对应的代码生成器生成至少一个数据源对应的注册代码。
举例来说,若步骤S101中确定调用代码生成器A、代码生成器B以及代码生成器C,则分别生成对应符合数据源A格式的注册代码A,符合数据源B格式的注册代码B,以及符合数据源C格式的注册代码C,其中,代码生成器采用动态代码生成技术。
步骤S103、通过所述代码编译器对所述源代码和至少一个数据源对应的注册代码进行编译。
具体来说,代码编译器可以将源代码和注册代码编译成更底层代码,更底层代码才能被服务器识别、执行。优选的,代码编译器采用动态编译技术。
步骤S104、通过所述依赖分发器将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,以实现注册。
举例来说,依赖分发器将编译后的源代码和注册代码A发送给数据源A的注册器,完成函数在数据源A的注册;依赖分发器将编译后的源代码和注册代码B发送给数据源B的注册器,完成函数在数据源B的注册;依赖分发器将编译后的源代码和注册代码 C发送给数据源C的注册器,完成函数在数据源C的注册。
可选的,在完成注册后,每个数据源的执行器可以接收用户的调用指令,从而实现成功过调用UDF。
本发明的实施例提供的函数注册方法,应用于服务器,所述服务器上部署函数注册系统,所述函数注册系统包括函数分发器、代码生成器、代码编译器以及依赖分发器;通过所述函数分发器获取函数的源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器;所调用的至少一个数据源对应的代码生成器生成至少一个数据源对应的注册代码;通过所述代码编译器对所述源代码和至少一个数据源对应的注册代码进行编译;通过所述依赖分发器将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,以实现注册;即本发明的实施例,通过函数分发器调用数据源(数据库或计算机框架)对应的代码生成器,生成对应的注册代码,并不需要开发人员进行数据源注册代码的适配开发,提高了开发效率。
在上述实施例的基础上,图5为本发明实施例提供的另一种函数注册方法的流程示意图,该方法应用于服务器,所述服务器上部署函数注册系统,所述函数注册系统包括函数分发器、代码生成器、代码编译器以及依赖分发器;所述函数注册系统还包括函数编辑器和函数缓存器,可参考图3所示。如图5所示,该函数注册方法包括:
步骤S201、通过所述函数编辑器接收用户对至少一个函数所编写的对应的至少一个源代码,并将所述至少一个源代码存储到所述函数缓存器中。
步骤S202、所述函数分发器从所述函数缓存器中逐个获取所述至少一个源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器。
步骤S203、所调用的至少一个数据源对应的代码生成器生成至少一个数据源对应的注册代码。
步骤S204、通过所述代码编译器对所述源代码和至少一个数据源对应的注册代码进行编译。
步骤S205、通过所述依赖分发器将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,以实现注册。
本实施例中的步骤S203-步骤S205的实现方式分别与上述实施例中的步骤S102-步骤S104的实现方式类似,此处不再赘述。
与上述实施例的区别在于,考虑到可能需要对多个函数都进行注册的情况,在本实施例中,通过所述函数编辑器接收用户对至少一个函数所编写的对应的至少一个源代码,并将所述至少一个源代码存储到所述函数缓存器中;所述函数分发器从所述函数缓存器中逐个获取所述至少一个源代码。
具体来说,首先函数编辑器接收开发人员撰写的源代码,主要是UDF的函数体、入参以及出参。函数编辑器会逐个接收UDF的源代码以后,并会逐个缓存到函数缓存器当中,函数分发器从函数缓存器中逐个取出源代码,防止函数分发器直接从函数编辑器中取出多个UDF源代码而导致函数分发器的运行堵塞。
作为可选的实施例,所述步骤S201中的将所述至少一个源代码存储到所述函数缓存器中,包括:将源代码标识和所述至少一个源代码以一一对应的关系存储到所述函数缓存器中。
具体来说,为每个函数的源代码构建唯一的源代码标识,在函数缓存器中,以源代码标识和源代码一一对应的方式进行存储。优选的,源代码标识可以为源代码的全路径名。
本发明的实施例提供的函数注册方法,所述函数编辑器接收用户对至少一个函数所编写的对应的至少一个源代码,并将所述至少一个源代码存储到所述函数缓存器中;所述函数分发器从所述函数缓存器中逐个获取所述至少一个源代码;即本发明实施例通过设置函数缓存器,防止函数分发器直接从函数编辑器中取出多个函数源代码而造成的运行堵塞。
在上述实施例的基础上,图6为本发明实施例提供的再一种函数注册方法的流程示意图,该方法应用于服务器,所述服务器上部署函数注册系统,所述函数注册系统包括函数分发器、代码生成器、代码编译器以及依赖分发器;所述函数注册系统还包括代码缓存器,可参考图3所示。如图6所示,该函数注册方法包括:
步骤S301、通过所述函数分发器获取函数的源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器。
步骤S302、所调用的至少一个数据源对应的代码生成器生成至少一个数据源对应的注册代码。
步骤S303、将所述源代码和所述至少一个数据源对应的注册代码存储到代码缓存器中。
步骤S304、所述代码编译器从所述代码缓存器中逐个获取所述源代码和注册代码,并进行编译。
步骤S305、通过所述依赖分发器将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,以实现注册。
本实施例中的步骤S301、步骤S302以及步骤S305实现方式分别与上述实施例中的步骤S101、步骤102以及步骤S104的实现方式类似,此处不再赘述。
与上述实施例的区别在于,考虑到调用多个数据源的代码生成器,从而生成多个数据源对应的注册代码的情况,在本实施例中,将所述源代码和所述至少一个数据源对应的注册代码存储到代码缓存器中;所述代码编译器从所述代码缓存器中逐个获取所述源代码和注册代码,并进行编译。
具体来说,若函数分发器统计出多个不同类型的数据源需要注册函数,则确定调用的这多个不同类型的数据源对应的代码生成器,多个代码生成器分别生成多个数据源对应的注册代码,在本实施例中,会将这多个数据源对应的注册代码和源代码存储到代码缓存器中,然后代码编译器从代码缓存器中逐个取出注册代码和源代码进行编译,从而防止了代码编译器直接接收多个代码生成器生成的注册代码而造成的运行堵塞。
作为可选的实施例,所述步骤S303包括:将所述源代码标识和至少一个数据源对应的注册代码以一一对应的关系存储到代码缓存器中。
具体来说,在代码缓存器中,可以不直接存储源代码,而是存储源代码标识,例如源代码的全体路径名,将源代码标识和多个不同数据源的注册代码以一一对应的关系存储进行存储。
本发明的实施例提供的函数注册方法,通过将所述源代码和所述至少一个数据源对应的注册代码存储到代码缓存器中;所述代码编译器从所述代码缓存器中逐个获取所述源代码和注册代码,并进行编译;即本发明实施例通过设置代码缓存器,防止代码编译器直接从多个代码生成器获取多个注册代码而造成的运行堵塞。
在上述实施例的基础上,图7为本发明实施例提供的又一种函数注册方法的流程示意图,该方法应用于服务器,所述服务器上部署函数注册系统,所述函数注册系统包括函数分发器、代码生成器、代码编译器以及依赖分发器;所述函数注册系统还包括依赖缓存器,可参考图3所示。如图7所示,该函数注册方法包括:
步骤S401、通过所述函数分发器获取函数的源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器。
步骤S402、所调用的至少一个数据源对应的代码生成器生成至少一个数据源对应的注册代码。
步骤S403、通过所述代码编译器对所述源代码和至少一个数据源对应的注册代码进行编译。
步骤S404、将编译后的源代码和至少一个数据源对应的注册代码存储到所述依赖缓存器中,并将依赖缓存器中所存储的其他编译代码引用到所述源代码和至少一个数据源对应的注册代码上。
步骤S405、所述依赖分发器将从所述依赖缓存器中获取源代码、至少一个数据源对应的注册代码以及其他编译代码分别发送给对应的数据源,以实现注册。
本实施例中的步骤S401-步骤S403的实现方式分别与上述实施例中的步骤S101-步骤103的实现方式类似,此处不再赘述。
与上述实施例的区别在于,考虑到除了接收用户通过开发平台编辑的源代码外,还可能需要引用其他代码库中代码的情况,在本实施例中,将编译后的源代码和至少一个数据源对应的注册代码存储到所述依赖缓存器中,并将依赖缓存器中所存储的其他编译代码引用到所述源代码和至少一个数据源对应的注册代码上;所述依赖分发器将从所述依赖缓存器中获取源代码、至少一个数据源对应的注册代码以及其他编译代码分别发送给对应的数据源,以实现注册。
具体来说,开发人员编辑某函数的源代码后,通过代码编译器编译成底层代码后,还需要引用其他代码库中的代码,将当前代码所需要的依赖,缓存在依赖缓存器中等待调用;然后依赖分发器会逐个调用依赖缓存器中的依赖,分发给不同数据源,分别进行UDF的注册。
作为可选的实施例,所述方法还包括:构建所述函数的配置文件,所述配置文件包括函数的关键信息;接收用户对所述配置文件中关键信息的修改。
具体来说,开发人员可以直接编写UDF的源代码,该种情况下,若开发人员需要修改相关的配置,或者移动相关代码所在的全路径,就需要修改源代码本身的配置,增加了很多工作量。而在本实施例中,可以构建函数的配置文件,配置文件直观记载了函数的关键信息(例如参数等信息),开发人员可以直接通过修改配置文件的方式,完成对UDF的修改。优选的,在Java当中,可以采用SPI技术(Service Provider Interface),是一种利用Java的反射机制来对特定路径下的配置文件进行服务发现的技术,可以将服务接口和服务实现分离以达到解耦的效果,大大提升了程序的可扩展性。
作为可选的实施例,所述方法还包括:将函数的源代码以插件的形式存储在预设路径中;所述步骤S101中的通过所述函数分发器获取函数的源代码,包括:所述函数分发器通过扫描所述预设路径,获取所述预设路径下的函数的源代码的插件,便于服务的维护。
具体来说,上述的基于配置文件修改UDF,但对于有新增UDF时,需要停掉服务端的服务,然后重新部署软件包才能够实现新UDF的加入。而在本实施例中,可以将函数的源代码以外置插件或者外置软件包的形式存储到预设路径下,函数分发器可以扫描该预设路径下的插件或者软件包,从而获取对应的函数的源代码。从而能实现了在不停止服务的情况下,动态对对应UDF进行扩容,便于服务的维护。
本实施例提供的函数注册方法,通过将编译后的源代码和至少一个数据源对应的注册代码存储到所述依赖缓存器中,并将依赖缓存器中所存储的其他编译代码引用到所述源代码和至少一个数据源对应的注册代码上;所述依赖分发器将从所述依赖缓存器中获取源代码、至少一个数据源对应的注册代码以及其他编译代码分别发送给对应的数据源;即本发明实施例通过设置依赖缓存器,实现了引用其他代码库中代码的功能。
在上述实施例的基础上,图8为本发明实施例提供的又一种函数注册方法的流程示意图,该方法应用于服务器,所述服务器上部署函数注册系统,包括函数编辑器、函数缓存器、函数分发器、代码生成器、代码缓存器、代码编译器、依赖缓存器以及依赖分发器,可参考图3所示。如图8所示,该函数注册方法包括:
步骤S501、通过所述函数编辑器接收用户对至少一个函数所编写的对应的至少一个源代码,并将所述至少一个源代码存储到所述函数缓存器中。
步骤S502、所述函数分发器从所述函数缓存器中逐个获取所述至少一个源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器。
步骤S503、所调用的至少一个数据源对应的代码生成器生成至少一个数据源对应的注册代码。
步骤S504、将所述源代码和所述至少一个数据源对应的注册代码存储到代码缓存器中。
步骤S505、所述代码编译器从所述代码缓存器中逐个获取所述源代码和注册代码,并进行编译。
步骤S506、将编译后的源代码和至少一个数据源对应的注册代码存储到所述依赖缓存器中,并将依赖缓存器中所存储的其他编译代码引用到所述源代码和至少一个数据源对应的注册代码上。
步骤S507、所述依赖分发器将从所述依赖缓存器中获取源代码、至少一个数据源对应的注册代码以及其他编译代码分别发送给对应的数据源。
现结合图3对本发明的实施例进行说明,首先函数编辑器负责接收开发人员撰写的源代码,主要是UDF的函数体、入参以及出参,函数编辑器将UDF的源代码接收以后,会缓存在函数缓存器当中,其中,会以源代码标识和源代码一对应的映射关系来对其进行存储;然后逐条交给函数分发器(若需要注册的函数较少,则函数编辑器可以直接与函数分发器连接,将相关的源代码直接交由函数分发器,而不需要函数缓存器),并且函数分发器会对底层的数据库以及计算框架的类型进行统计,确定要调用的代码生成器;然后代码生成器生成对应数据源的注册代码(图3中以数据源A调用代码生成器A、数据源B调用代码生成器B以及数据源C调用代码生成器C为例);然后这些源代码和注册代码会进入代码缓存器当中,等待下一步的调用。至此,代码的编辑生成阶段完成。
在代码编译和分发阶段,首先代码编译器会对代码缓存器中的源代码和注册代码逐条进行动态编译,将其转换成对应的底层代码;然后这些底层代码会形成对应数据库和计算框架所需要的依赖,缓存在依赖缓存器当中,等待依赖分发器的调用;由于每个数据库或者计算框架需要注册的UDF往往非常多,因此依赖分发器需要逐条调用依赖缓存器当中缓存好的依赖,分发给不同的数据库以及计算框架,分别进行UDF注册的操作。至此,代码编译和分发阶段完成。函数注册完成后,用户可以通过数据库的执行器直接调用对应的函数,并将调用结果返回给用户。
图9a为本发明实施例提供的一种函数缓存器中存储结构示意图,图9b为本发明实施例提供的一种代码缓存器中的存储结构示意图。为了进一步了解本发明,现结合图 3、图9a以及图9b,以基于Java来管理Spark SQL和Calcite函数的注册方法为例进行说明,在Spark SQL当中,可以实现Hive的UDF接口来对函数进行定义;在Calcite来说,函数可以通过反射的方式嵌入到Calcite当中。
参考图3所示,首先开发人员通过函数编辑器,或称之为编辑台(Concole)对函数体进行编写,然后编辑台会通过反射的方式将编写好的函数体加载到内存当中,存放到函数缓存器(Function Cache)当中,此处可以使用哈希表(HashMap)对这些函数缓存进行存储,其存储格式如图9b所示,key为函数体的全路径名(即图9a中的name1、name2、name3、name4),value为函数体对象(如图9a中的Function Body1、 Function Body2、FunctionBody3、Function Body4);然后函数分发器(Function Adapter) 会将函数缓存器当中的函数逐条分发给代码生成器,在此处会生成为Spark和Calcite 需要的函数注册代码;然后生成的注册代码和源代码会放入代码缓存器(Code Cache) 中,在这里,动态生成的代码会使用二维数组来进行管理,其存储格式如图9b所示(例如针对Spark SQL,按照name1和SparkFunction Register Code1一一对应存储,针对 Calcite,按照name1和Calcite FunctionRegister Code1一一对应存储,以此类推);然后代码缓存器中的代码会交给代码编译器,例如Janino进行代码编译,生成的依赖放入依赖缓存器当中进行管理,之后再由依赖分发器(Dependency Adapter)分发给Spark 注册器(Spark Register)和Calcite注册器(Calcite Register),完成注册。最后,用户可以通过Spark SQL和Calcite的执行器(Executor)调用已经注册完成的函数。
本发明的实施例提供的函数注册方法,通过所述函数编辑器接收用户对至少一个函数所编写的对应的至少一个源代码,并将所述至少一个源代码存储到所述函数缓存器中;所述函数分发器从所述函数缓存器中逐个获取所述至少一个源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器;所调用的至少一个数据源对应的代码生成器生成至少一个数据源对应的注册代码;所述代码编译器从所述代码缓存器中逐个获取所述源代码和注册代码,并进行编译;将编译后的源代码和至少一个数据源对应的注册代码存储到所述依赖缓存器中,并将依赖缓存器中所存储的其他编译代码引用到所述源代码和至少一个数据源对应的注册代码上;所述依赖分发器将从所述依赖缓存器中获取源代码、至少一个数据源对应的注册代码以及其他编译代码分别发送给对应的数据源;即本发明实施例通过函数分发器调用数据源(数据库或计算机框架)对应的代码生成器,生成对应的注册代码,并不需要开发人员进行数据源注册代码的适配开发,提高了开发效率。
本发明实施例还提供的一种函数注册系统的结构示意图,参考图2所示,所述函数注册系统包括函数分发器、代码生成器、代码编译器以及依赖分发器;其中,所述函数分发器用于,获取函数的源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器;所调用的至少一个数据源对应的代码生成器用于生成至少一个数据源对应的注册代码;所述代码编译器用于对所述源代码和至少一个数据源对应的注册代码进行编译;所述依赖分发器用于将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,以实现注册。
参考图3所示,作为本发明的可选实施例,所述函数注册系统还包括:函数编辑器和函数缓存器;其中,所述函数编辑器用于接收用户对至少一个函数所编写的对应的至少一个源代码,并将所述至少一个源代码存储到所述函数缓存器中;所述函数分发器用于从所述函数缓存器中逐个获取所述至少一个源代码。
作为本发明的可选实施例,所述函数缓存器用于将源代码标识和所述至少一个源代码以一一对应的关系进行存储。
作为本发明的可选实施例,所述函数注册系统还包括代码缓存器;所述代码缓存器用于将所述源代码和所述至少一个数据源对应的注册代码进行存储;所述代码编译器用于从所述代码缓存器中逐个获取所述源代码和注册代码,并进行编译。
作为本发明的可选实施例,所述代码缓存器具体用于将所述源代码标识和至少一个数据源对应的注册代码以一一对应的关系进行存储。
作为本发明的可选实施例,所述函数注册系统还包括依赖缓存器,所述依赖缓存器用于:将编译后的源代码和至少一个数据源对应的注册代码存储到所述依赖缓存器中,并将依赖缓存器中所存储的其他编译代码引用到所述源代码和至少一个数据源对应的注册代码上;所述依赖分发器用于将从所述依赖缓存器中获取源代码、至少一个数据源对应的注册代码以及其他编译代码分别发送给对应的数据源。
作为本发明的可选实施例,所述函数注册系统还包括配置模块(图2、图3未示出),所述配置模块用于构建所述函数的配置文件,所述配置文件包括函数的关键信息;接收用户对所述配置文件中关键信息的修改。
作为本发明的可选实施例,所述函数注册系统还包括外置模块(图2、图3未示出),外置模块用于将函数的源代码以插件的形式存储在预设路径中;所述函数分发器用于通过扫描所述预设路径,获取所述预设路径下的函数的源代码的插件。
本发明实施例提供的函数注册系统,其实现原理和技术效果与上述实施例类似,此处不再赘述。
如图10所示,本发明实施例提供了一种电子设备,包括处理器111、通信接口112、存储器113和通信总线114,其中,处理器111,通信接口112,存储器113通过通信总线114完成相互间的通信,
存储器113,用于存放计算机程序;
在本发明一个实施例中,处理器111,用于执行存储器113上所存放的程序时,实现前述任意一个方法实施例提供的函数注册方法的步骤。
本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如前述任意一个方法实施例提供的函数注册方法的步骤。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本发明的具体实施方式,使本领域技术人员能够理解或实现本发明。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所申请的原理和新颖特点相一致的最宽的范围。
Claims (11)
1.一种函数注册方法,其特征在于,应用于服务器,所述服务器上部署函数注册系统,所述函数注册系统包括函数分发器、代码生成器、代码编译器以及依赖分发器;所述方法包括:
通过所述函数分发器获取函数的源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器;
所调用的至少一个数据源对应的代码生成器生成至少一个数据源对应的注册代码;
通过所述代码编译器对所述源代码和至少一个数据源对应的注册代码进行编译;
通过所述依赖分发器将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,以实现注册。
2.根据权利要求1所述的方法,其特征在于,所述函数注册系统还包括函数编辑器和函数缓存器;
所述通过所述函数分发器获取函数的源代码之前,还包括:
通过所述函数编辑器接收用户对至少一个函数所编写的对应的至少一个源代码,并将所述至少一个源代码存储到所述函数缓存器中;
所述通过所述函数分发器获取函数的源代码,包括:
所述函数分发器从所述函数缓存器中逐个获取所述至少一个源代码。
3.根据权利要求2所述的方法,其特征在于,所述将所述至少一个源代码存储到所述函数缓存器中,包括:
将源代码标识和所述至少一个源代码以一一对应的关系存储到所述函数缓存器中。
4.根据权利要求3所述的方法,其特征在于,所述函数注册系统还包括代码缓存器;所述生成至少一个数据源对应的注册代码之后,还包括:
将所述源代码和所述至少一个数据源对应的注册代码存储到代码缓存器中;
所述通过所述代码编译器对所述源代码和至少一个数据源对应的注册代码进行编译,包括:
所述代码编译器从所述代码缓存器中逐个获取所述源代码和注册代码,并进行编译。
5.根据权利要求4所述的方法,其特征在于,所述将所述源代码和所述至少一个数据源对应的注册代码存储到代码缓存器中,包括:
将所述源代码标识和至少一个数据源对应的注册代码以一一对应的关系存储到代码缓存器中。
6.根据权利要求1所述的方法,其特征在于,所述函数注册系统还包括依赖缓存器;
所述通过所述代码编译器对所述源代码和至少一个数据源对应的注册代码进行编译之后,还包括:
将编译后的源代码和至少一个数据源对应的注册代码存储到所述依赖缓存器中,并将依赖缓存器中所存储的其他编译代码引用到所述源代码和至少一个数据源对应的注册代码上;
所述通过所述依赖分发器将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,包括:
所述依赖分发器将从所述依赖缓存器中获取源代码、至少一个数据源对应的注册代码以及其他编译代码分别发送给对应的数据源。
7.根据权利要求1-6任一项所述的方法,其特征在于,所述方法还包括:
构建所述函数的配置文件,所述配置文件包括函数的关键信息;
接收用户对所述配置文件中关键信息的修改。
8.根据权利要求1-6任一项所述的方法,其特征在于,所述方法还包括:
将函数的源代码以插件的形式存储在预设路径中;
所述通过所述函数分发器获取函数的源代码,包括:
所述函数分发器通过扫描所述预设路径,获取所述预设路径下的函数的源代码的插件。
9.一种函数注册系统,其特征在于,包括函数分发器、代码生成器、代码编译器以及依赖分发器;
其中,所述函数分发器用于,获取函数的源代码,并调用所述函数所要注册的至少一个数据源对应的代码生成器;
所调用的至少一个数据源对应的代码生成器用于生成至少一个数据源对应的注册代码;
所述代码编译器用于对所述源代码和至少一个数据源对应的注册代码进行编译;
所述依赖分发器用于将编译后的源代码和至少一个数据源对应的注册代码分别发送给对应的数据源,以实现注册。
10.一种电子设备,其特征在于,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
存储器,用于存放计算机程序;
处理器,用于执行存储器上所存放的程序时,实现权利要求1-8任一项所述的函数注册方法的步骤。
11.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-8任一项所述的函数注册方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110904004.2A CN113626071B (zh) | 2021-08-06 | 2021-08-06 | 函数注册方法、系统、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110904004.2A CN113626071B (zh) | 2021-08-06 | 2021-08-06 | 函数注册方法、系统、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113626071A true CN113626071A (zh) | 2021-11-09 |
CN113626071B CN113626071B (zh) | 2024-04-16 |
Family
ID=78383331
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110904004.2A Active CN113626071B (zh) | 2021-08-06 | 2021-08-06 | 函数注册方法、系统、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113626071B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114461296A (zh) * | 2021-12-29 | 2022-05-10 | 天翼云科技有限公司 | 基于Openresty的服务平台开发及访问方法 |
CN115033243A (zh) * | 2022-06-01 | 2022-09-09 | 北京四维图新科技股份有限公司 | 基于快速编译引擎的编译方法、系统及地图数据云平台 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101620536A (zh) * | 2009-08-17 | 2010-01-06 | 用友软件股份有限公司 | 一种调用功能函数的方法和装置 |
US20160092181A1 (en) * | 2014-09-30 | 2016-03-31 | Advanced Micro Devices, Inc. | Automatic source code generation for accelerated function calls |
CN109213683A (zh) * | 2018-09-06 | 2019-01-15 | 无线生活(杭州)信息科技有限公司 | 测试用例生成方法及装置 |
CN109446218A (zh) * | 2018-09-25 | 2019-03-08 | 中国平安人寿保险股份有限公司 | Sql语句生成方法、装置及计算机可读存储介质 |
CN109614089A (zh) * | 2018-12-30 | 2019-04-12 | 北京字节跳动网络技术有限公司 | 数据访问代码的自动生成方法、装置、设备及存储介质 |
CN110825369A (zh) * | 2019-11-07 | 2020-02-21 | 四川长虹电器股份有限公司 | 一种基于java语言的代码自动生成的方法 |
CN112487013A (zh) * | 2020-11-18 | 2021-03-12 | 中信银行股份有限公司 | 一种数据库操作代码生成方法和装置 |
CN112596737A (zh) * | 2020-12-28 | 2021-04-02 | 上海品顺信息科技有限公司 | 一种函数调用关系的扫描方法、系统、设备及存储介质 |
-
2021
- 2021-08-06 CN CN202110904004.2A patent/CN113626071B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101620536A (zh) * | 2009-08-17 | 2010-01-06 | 用友软件股份有限公司 | 一种调用功能函数的方法和装置 |
US20160092181A1 (en) * | 2014-09-30 | 2016-03-31 | Advanced Micro Devices, Inc. | Automatic source code generation for accelerated function calls |
CN109213683A (zh) * | 2018-09-06 | 2019-01-15 | 无线生活(杭州)信息科技有限公司 | 测试用例生成方法及装置 |
CN109446218A (zh) * | 2018-09-25 | 2019-03-08 | 中国平安人寿保险股份有限公司 | Sql语句生成方法、装置及计算机可读存储介质 |
CN109614089A (zh) * | 2018-12-30 | 2019-04-12 | 北京字节跳动网络技术有限公司 | 数据访问代码的自动生成方法、装置、设备及存储介质 |
CN110825369A (zh) * | 2019-11-07 | 2020-02-21 | 四川长虹电器股份有限公司 | 一种基于java语言的代码自动生成的方法 |
CN112487013A (zh) * | 2020-11-18 | 2021-03-12 | 中信银行股份有限公司 | 一种数据库操作代码生成方法和装置 |
CN112596737A (zh) * | 2020-12-28 | 2021-04-02 | 上海品顺信息科技有限公司 | 一种函数调用关系的扫描方法、系统、设备及存储介质 |
Non-Patent Citations (1)
Title |
---|
JAY1122: "Spark SQL UDF函数的两种注册方式", pages 4 - 60, Retrieved from the Internet <URL:http://swww.jianshu.com/p/70aeac27e1db/> * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114461296A (zh) * | 2021-12-29 | 2022-05-10 | 天翼云科技有限公司 | 基于Openresty的服务平台开发及访问方法 |
CN114461296B (zh) * | 2021-12-29 | 2024-01-02 | 天翼云科技有限公司 | 基于Openresty的服务平台开发及访问方法 |
CN115033243A (zh) * | 2022-06-01 | 2022-09-09 | 北京四维图新科技股份有限公司 | 基于快速编译引擎的编译方法、系统及地图数据云平台 |
Also Published As
Publication number | Publication date |
---|---|
CN113626071B (zh) | 2024-04-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10795660B1 (en) | Live code updates | |
US11360976B2 (en) | Deployment of javascript and typescript stored procedures and user-defined functions into database management systems | |
KR101795844B1 (ko) | 런타임 시스템 | |
US5339424A (en) | System and method for compiling and executing a computer program written in more than one programming language | |
US5307499A (en) | Interpretive object-oriented facility which can access pre-compiled classes | |
US8707278B2 (en) | Embedding class hierarchy into object models for multiple class inheritance | |
US20040003388A1 (en) | Preparation of a software configuration using an XML type programming language | |
US20050216282A1 (en) | System and method for business object discovery | |
US7860894B2 (en) | Template driven type and mode conversion | |
JPH06266563A (ja) | 複数同時オブジェクト・バージョンをサポートする効率的ルータ | |
JPH0869435A (ja) | ネットワークを介してリモート・プロシージャ・コール及びレスポンスを転送するための方法及びシステム | |
CN113626071B (zh) | 函数注册方法、系统、电子设备及存储介质 | |
US11579855B2 (en) | Reduced memory consumption of compiler-transformed asynchronous methods | |
CN114942796A (zh) | 插件编译及调用方法、装置、设备及存储介质 | |
US20050071809A1 (en) | System and method for serializing objects in a compiled programming language | |
US9207956B2 (en) | Class loading device for a java runtime environment, cluster system and method of executing a function | |
CN110457013B (zh) | 程序组件配置装置及方法 | |
Richardson et al. | Implementing Persistence in E. | |
US20190265956A1 (en) | Compiler-Generated Asynchronous Enumerable Object | |
US20010049817A1 (en) | System developing method, storage medium, information processing apparatus, information terminal apparatus, information processing system, and information processing method | |
Felser et al. | Dynamic software update of resource-constrained distributed embedded systems | |
US20050246677A1 (en) | Native method invocation (NMI) custom marshalling stub service | |
CN116680003A (zh) | 前端插件化系统 | |
US6941556B1 (en) | Method and system for type identification for multiple object interfaces in a distributed object environment | |
CN114610381A (zh) | 一种方法服务的调用方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |