一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

推断封装和模块内依赖关系的制作方法

2022-07-17 01:31:06 来源:中国专利 TAG:
1.本发明涉及数据库的混合语言编程。这里是这样的技术:扩展数据库管理系统(dbms)以自动地发现和报告在dbms中实现的访客编程语言的访客模块所使用的依赖关系的分级体系。
背景技术
::2.数据持久性可采用各种逻辑形式。事务工作负载(oltp)由与在分析工作负载(olap)中使用的数据模型稍微不同的数据模型支持。文档和多媒体数据依赖于各种格式,比如javascript对象表示法(json)和可扩展标记语言(xml)。不同数据库模型更适合解决不同应用的需要的概念被称为混合语言持久性。3.解决这些混合语言要求的一种方式是具有分开的产品,所述分开的产品实现特定数据库模型以解决特定应用。这种示例包括oracle供给物,诸如作为键值仓库的berkeleydb、作为键值和分片数据库的oraclenosql数据库、作为存储器中数据库的oracletimesten和用于分析处理的essbase。4.各种开源和专有产品可用于支持单模型混合语言持久性方案。随着商业企业关系数据库已随着时间过去而发展,它们已在单个数据库管理系统内包括多种数据模型和访问方法。这种概念被称为多模型混合语言持久性,并且它允许许多应用使用相同的数据库管理系统,同时继续受益于特定应用所需的独特数据模型。5.现代编程语言(比如,javascript和python)受益于公开可用的库和添加件部件的丰富而巨大的生态系统。然而,即使是混合语言数据库系统也缺乏对具有多种编程语言的软件开发生命周期(sdlc)的通用支持。例如,对于javascript和python,封装管理和封装导入具有可能难以协调或无法协调的不一致的方案。不存在在数据库管理系统(dbms)内发现哪些访客语言软件部件依赖于哪些其它访客语言软件部件的清楚而一致的方式。附图说明6.在附图中:7.图1是描述示例性数据库管理系统(dbms)的方框图,为了识别许多访客模块中的特定访客模块的依赖关系,所述示例性数据库管理系统(dbms)产生基于从访客模块提取的元数据的依赖关系的报告;8.图2是描述用于诸如为了识别特定访客模块的依赖关系而产生基于从dbms中的访客模块提取的元数据的依赖关系的报告的示例性计算机处理的流程图;9.图3是描述示例性dbms的方框图,所述示例性dbms按照语言中立格式从访客模块提取由支持数据库视图的数据库表函数聚合的依赖关系元数据,所述数据库视图可被探询以发现模块依赖关系;10.图4是描述用于按照语言中立格式从访客模块提取由支持数据库视图的数据库表函数聚合的依赖关系元数据的示例性dbms处理的流程图,所述数据库视图可被探询以发现模块依赖关系,以便诸如用于识别特定访客模块的依赖关系;11.图5是描述配置用于由dbms执行的依赖关系发现的访客模块的示例性客户端程序的方框图;12.图6是描述用于配置用于由dbms执行的依赖关系发现的访客模块的客户端处理的流程图;13.图7描述用于模块a和模块b的示例性部署的示例性mle_module_introspection_view的选择查询的表格结果;14.图8描述用于模块a和模块b的示例性部署的示例性mle_module_content_hierarchy_view的选择查询的表格结果;15.图9是表示可实现本发明的实施例的计算机系统的方框图;16.图10是表示可被用于控制计算系统的操作的基本软件系统的方框图。具体实施方式17.在下面的描述中,为了解释的目的,阐述许多特定细节以便提供对本发明的彻底的理解。然而,将会清楚的是,可在没有这些特定细节的情况下实施本发明。在其它实例中,以方框图形式示出公知结构和装置以便避免不必要地模糊本发明。18.概述19.这里是这样的技术:扩展混合语言数据库管理系统(dbms)以自动地发现和报告在dbms中实现的访客编程语言的访客模块所使用的依赖关系的分级体系。包括依赖关系分级体系元数据的内省检测工具(introspectioninstrumentation)被产生和操作以揭示访客模块的相互依赖的依赖关系。在没有这里的封装内省技术的情况下,不存在发现访客模块包括哪些软件部件的清楚而统一的方式。例如,dbms可具有特权模型,该模型允许用户部署访客语言代码而不需要管理员特权,这可加剧对访客模块内省的需求。例如,可能存在这样的要求:不是访客模块开发者的数据库管理员(dba)能够检测访客模块包括哪些开源软件部件(诸如,库)的哪些版本。20.在实施例中,内省信息被插入到访客模块中作为嵌套数据类型,诸如javascript对象表示法(json)或可扩展标记语言(xml)。内省信息经语言专用导出机制而被导出,对于javascript或python,所述语言专用导出机制可以是返回嵌套数据类型的函数。21.这里的技术使模块内省信息展示为数据库视图。通过查询这个视图,用户被提供具有规范化形式的详细模块封装信息。如这里稍后所讨论,文档查询语言(诸如,jsonquery)可被用于去除任何嵌套数据类型的嵌套,并且提取具有规范化形式的所包含的数据。这种查询语言构造可促进(一个或多个)数据库视图,所述(一个或多个)数据库视图提取依赖关系元数据并且将依赖关系元数据组织成分级和/或表格形式。例如,dbms可从(所述一个或多个)数据库视图搜集部署的访客模块的列表。22.这里提供的各辅助助手工具负责每种访客语言的访客模块捆绑和部署。助手工具搜集捆绑信息,并且将该信息添加到访客模块源代码,诸如依赖关系元数据和内省函数。诸如当访客模块被部署时,对于每个访客模块,诸如利用保留名,产生数据库调用规范。这种任务由访客语言的辅助助手工具执行。通过将依赖关系内省检测工具集成到辅助助手部署工具中,这里的方案提供搜集依赖关系元数据并且将依赖关系元数据直接包括在每个部署的访客模块内的自动化方式。23.在实施例中,客户端捆绑程序从作为访客模块的一部分的(一个或多个)源文件提取指定访客模块的依赖关系的元数据。产生内省函数,所述内省函数返回指定依赖关系的元数据。为内省函数产生数据库调用规范。相同或不同的客户端程序向dbms发送:作为访客模块的一部分的(所述一个或多个)源文件、指定依赖关系的元数据、内省函数和用于内省函数的数据库调用规范。24.在实施例中,dbms从在dbms中实现的(一种或多种)访客编程语言中定义的(一个或多个)访客模块提取描述(所述一个或多个)访客模块的依赖关系的元数据。产生基于描述依赖关系的元数据的依赖关系的报告。dbms可基于依赖关系的报告来识别(一个或多个)特定访客模块所依赖的依赖关系的子集。25.1.0示例性计算机系统26.图1是描述实施例中的示例性数据库管理系统(dbms)100的方框图。为了识别许多访客模块中的特定访客模块的依赖关系,dbms100产生基于从访客模块提取的元数据的依赖关系的报告。dbms100包含未示出的一个或多个计算机并且由所述一个或多个计算机托管,所述一个或多个计算机中的每个计算机可以是机架服务器(诸如,刀片服务器)、个人计算机、大型计算机、虚拟计算机或其它计算装置。当dbms100包含多个计算机时,所述计算机通过通信网络而互连。27.根据在相关美国专利申请16/556,760中提供的技术,dbms100支持诸如具有多语言引擎(mle)软件层的混合语言(即,多语言)可编程数据库,诸如在oracle的graalmle中,对于多种访客编程语言,所述mle软件层能够个体地或作为组合嵌入有各解释器和/或虚拟机,诸如java虚拟机(jvm)、javascript解释器。例如,mle可解释文本脚本,产生字节码,解释字节码,和/或诸如通过即时(jit)编译来将字节码编译成本机机器指令。mle可包含jvm,所述jvm执行从多种访客编程语言111-112的源逻辑产生的字节码。28.根据在相关美国专利申请16/556,760中提供的技术,新的访客编程语言可或多或少作为插件被添加到dbms100,所述插件扩展dbms100以使其具有新的能力,诸如解释或者以其它方式执行按照所述新的访客编程语言编写的逻辑。例如,dbms100可最初被作为中间件从原始设备制造商(oem)或独立软件供应商(isv)提供,而不支持任何特定访客编程语言。在部署dbms100之后,对(一种或多种)特定的新的访客编程语言的支持可被添加到dbms100作为售后市场扩展。例如,dbms100是面向未来的,因为dbms100准备好包括当dbms100被最初部署时不存在的新的访客编程语言的实现。29.每个访客模块(诸如,121-123)是管理和/或词法(即,范围/可见性)单元,所述管理和/或词法单元定义(一个或多个)访客对象(未示出),诸如子程序,所述子程序相对于访客编程语言(诸如,111-112)而言是本机的并且可用于从访客模块的外部访问(诸如,公共访问)。根据实施例,访客模块121可包含其它对象,所述其它对象:a)也可进行公共访问,但不是子程序,诸如全局变量,诸如数据结构,b)仅可从访客模块121内访问,或c)仅可在访客编程语言111内访问。30.在实施例中,通过在dbms100中执行数据定义语言(ddl)语句,访客模块121可被创建用于访客编程语言111,诸如稍后在这里以及在相关申请16/556,760中所呈现。当被创建时,访客模块121可被登记在数据库模式(未示出)内,诸如在ddl语句中明确地命名的模式,或者被登记在默认模式内,诸如当前、全局和/或系统模式。因为模式用作命名空间,所以不同模式中的模块可具有相同的非限定名称,但具有不同的各自的名称限定符。31.在一个示例中,创建访客模块121的ddl语句包含访客编程语言111的源逻辑,dbms100执行所述源逻辑以创建访客模块121。在另一示例中,ddl语句引用访客编程语言111的脚本文件,dbms100执行所述脚本文件以创建访客模块121。在另一示例中,ddl语句引用大对象(lob),诸如字符lob(clob)或二进制lob(blob),所述大对象(lob)被作为字段值存储在dbms100中的数据库表的行中。32.如以上所解释,访客模块121可定义(一个或多个)访客对象,诸如访客子程序,所述访客对象被公开并且可由以下各方使用:同一访客编程语言111的其它访客模块(诸如,122)、其它访客编程语言(诸如,112)中的访客模块(诸如,123)和dbms100的本机的数据操纵语言(dml)(诸如,结构化查询语言(sql))。33.dml是领域专用语言(dsl),它的领域是数据库内容。dml被设计为访问包括关系键的数据库内的内容结构,诸如表、记录和字段。dml对于dbms100而言是本机的,因为dbms100最初被设计为解释或者以其它方式执行dml。例如,dbms100可具有严重依赖于dml的各方面的查询规划器。然而,查询规划器不知道区分访客编程语言的各方面,诸如访客编程语言的语法、语义和数据类型。34.dbms100可执行调用dbms110中的访客编程语言111和/或112的dml语句(未示出),诸如数据库查询。例如,如稍后这里所呈现,数据库管理员(dba)可导出访客编程语言140的子程序作为dml语句能够调用的用户定义函数(udf)或存储过程。35.例如,dml语句可以是查询。因此,访客编程语言111间接地可用于dml查询,而不使客户端暴露于访客编程语言111。例如,传统查询可调用复杂的udf,所述复杂的udf最初被实现为次优dml并且最终被访客编程语言111透明地翻新(诸如,重新实现和加速)。36.访客模块121-123中的每一个可导出(即,公开)和导入(即,使用)访客对象。访客模块(诸如,121)可依赖于多种依赖关系(诸如,141-142),所述多种依赖关系未被访客模块导出,而是替代地被实现为能够被链接到访客模块121中的软件库(诸如,第三方库和/或档案文件)。37.同样地,多个访客模块(诸如,121-122)可能需要诸如142的依赖关系。在各不同访客编程语言111-112中定义的访客模块121和123可能需要诸如141的依赖关系。38.在任何情况下,按照可能基于哪种访客编程语言实现访客模块的方式,访客模块121-123中的每一个提供识别需要的(一种或多种)依赖关系141-143的各元数据131-133。在实施例中,访客模块121-123中的每一个提供各访客编程语言中的各访客函数,dbms100可调用所述访客函数以提取对需要的(一种或多种)依赖关系编制目录的各元数据(诸如,131-133)。稍后在这里讨论依赖关系和依赖关系元数据提取。39.因此,通过元数据131的内省,dbms100可发现访客模块121依赖于依赖关系141-142。在提取元数据131-133之后,dbms100可产生报告(未示出)(诸如,用于立即使用或存储以供以后使用)或按照揭示访客模块121-123中的哪个访客模块依赖于哪些依赖关系141-143的方式总结元数据131-133的其它聚合。稍后在这里呈现示例性依赖关系报告。40.各种实施例可提供依赖关系报告可针对一个、一些或全部访客模块的每种依赖关系而包含的下面的示例性内容的各种组合:41.●依赖关系的名称,42.●依赖关系的版本号或发布日期,43.●依赖于依赖关系的至少一个访客模块的名称,44.●依赖于依赖关系的至少一种其它依赖关系的名称,45.●依赖关系所依赖的至少一种其它依赖关系的名称,46.●定义依赖关系的至少一个数据库模式的名称,47.●完整性值,48.●识别依赖关系的实现的通用资源标识符(uri),49.●当依赖关系的实现被包括在dbms中时的时间戳,50.●将依赖关系包括到dbms中的数据库用户或数据库角色的标识符,和/或51.●指示依赖关系是否仅用于开发的标记。52.完整性值可以是校验和,诸如循环冗余校验(crc)码或其它散列码,所述校验和能够被从访客模块的代码库计算以检测访客模块的代码库是否已被篡改。例如,访客模块可被实现为分发有由独立软件供应商(isv)或其他作者基于档案文件而计算的原始完整性值的档案文件中的库。例如,uri(诸如,通用资源定位器(url))可被用于检索原始档案文件和/或原始完整性值。依赖关系报告可指示原始完整性值是否与下面的完整性值匹配:a)当诸如在访客模块的部署期间档案文件被部署到dbms100中时的档案文件的完整性值,和/或b)当前针对dbms100存储的档案文件的完整性值。53.在一些情况下,仅为了开发目的而非为了生产用途,访客模块需要特定依赖关系。例如,依赖关系143可包含工具扩展,诸如用于集成开发环境(ide)的插件或用于单元测试的测试用例的测试套件。元数据132可包含标记,该标记指示访客模块122仅为了开发而需要依赖关系143。54.2.0示例性依赖关系发现和报告处理55.图2是描述用于诸如为了识别特定访客模块的依赖关系而产生基于从dbms中的访客模块提取的元数据的依赖关系的报告的示例性处理的流程图。参照图1讨论图2。56.步骤202、204和206的定时依赖于场景。在一个场景中,当访客模块121被部署到dbms100中时,那些步骤可立即发生。在另一场景中,那些步骤稍后按需发生,诸如用于dbms100中的(一个或多个)特定访客模块或所有访客模块的依赖关系的审核。稍后在这里呈现用于发起图3的处理的示例性数据库命令。57.从在dbms100中的(一种或多种)访客编程语言111-112中定义的一个或全部访客模块121-123,步骤202提取描述(一个或多个)访客模块的依赖关系(诸如,141-143)的元数据(诸如,131-133)。例如,如果场景需要部署特定访客模块121,则实施例可将元数据提取限制于描述一些依赖关系141-142的元数据131。如果场景替代地需要所有访客模块121-123的全面审核,则提取包括描述所有依赖关系141-143的所有元数据131-133。58.步骤204基于描述依赖关系的元数据产生依赖关系的报告。例如,在步骤202期间提取的元数据可被用于产生表格形式的依赖关系报告。表格数据的规范化可取决于实施例和/或场景。59.例如,报告的每个行可具有语义范围,所述语义范围包含一个访客模块的一种依赖关系、一个访客模块的所有依赖关系或包括同一依赖关系的所有访客模块。报告的每个行可被存储在数据库表的行中和/或打印为文本报告(诸如,电子表格)中的行项目。稍后在这里呈现用于元数据提取、解析和规范化的机制。60.步骤206的执行或省略取决于场景。在所有访客模块的全面审核或一个访客模块的部署中,由步骤204产生的依赖关系报告可能是足够的。然而,如这里稍后所解释,依赖关系报告可由dml语句诸如利用表函数来产生,和/或依赖关系报告可被记录为数据库表中的行。61.因此,步骤206可诸如利用dml语句来应用投影、分类、分组和/或过滤,以便以特定方式识别或者另一方面组织依赖关系和访客模块的列表。例如,步骤206可识别:a)哪些访客模块受到特定依赖关系的相同的陈旧(即,过时)或错误(即,有缺陷)的版本的影响,b)哪些访客模块诸如在将那些访客模块迁移到相同的最新版本时依赖于特定第三方库的任何版本(诸如,在版本的特定范围中),c)哪些访客模块依赖于两种依赖关系的不兼容版本,和/或d)哪些依赖关系具有篡改的实现。62.因此,即使诸如当每个访客模块应该具有它自己的依赖关系的相同版本的副本时实施例可能不需要访客模块之间的代码库文件的实际共享,开发者或dba也可对所有访客模块的组合代码库的相关部分具有或多或少定制并且统一的可见性。例如,在多租户dbms中,诸如在企业的私有云中,依赖关系和版本的多样性及其副本可能或多或少难以在不执行步骤206的情况下复查。63.3.0内省检测工具64.图3是描述实施例中的示例性dbms300的方框图。dbms300按照语言中立格式从访客模块提取由支持数据库视图的数据库表函数聚合的依赖关系元数据,所述数据库视图可被探询以发现模块依赖关系。dbms300可以是dbms100的实现。65.在dbms300内,访客模块320被实现在访客编程语言310中。访客模块320具有元数据341,元数据341指示访客模块320需要依赖关系380。访客模块320和其它访客模块(未示出)可依赖于其它依赖关系(未示出),如各元数据(诸如,342)所指示。66.数据库视图350在dbms300中被定义以提供对存储在元数据(诸如,341-342)中的依赖关系信息的访问。与由普通的(一个或多个)数据库表支持的通常的数据库视图不同,数据库视图350替代地由表函数390支持。例如,所有的数据库视图350、表函数390、访客模块320和调用规范360可在数据库模式和/或数据库词典中被个体地定义。67.与返回标量值的普通数据库函数不同,表函数390返回对象,该对象包含组织为行和列的集合的表格数据,dbms300可使用该对象,就好像返回的对象是诸如将会由子查询返回的数据库表或行集。在实施例中,表函数390是dbms300内的内置函数,它将元数据341-342变换并且聚合成表格形式。在实施例中,元数据341最初被格式化为良好形成的、独立的和/或分级的数据结构,示出为文档370,该数据结构被按照javascript对象表示法(json)编码,但访客编程语言310不需要是javascript。在实施例中,元数据341(即,文档370)被编码为可扩展标记语言(xml)。68.通过调用作为访客模块320中所包含的访客对象的内省函数330可按需产生元数据341。如这里前面所解释,访客模块320通过ddl语句的执行而被创建。在实施例中,该ddl语句包含作为dbms300最终调用以提取依赖关系元数据341的工厂的内省函数330的名称和/或签名。在实施例中,内省函数330的名称和签名由能够被dbms300调用的依赖关系元数据工厂函数的命名约定暗示(即,保留)。例如,dbms300中的所有访客编程语言中的所有访客模块中的每一个访客模块可包含具有dbms300期望的相同的名称和签名的访客函数。那些期望的访客函数不彼此干扰,并且不存在签名或名称的冲突,因为dbms300为每个访客模块提供单独的命名空间。69.创建了访客模块320的ddl语句或后续ddl语句可创建调用规范360,调用规范360促进从dml调用内省函数330。通常,内省函数330的调用参数和返回类型被反映在调用规范360中。因此,元数据341可由直接调用调用规范360的dml访问,调用规范360引起返回元数据341的内省函数330的调用。70.在实施例中,内省函数330和/或调用规范360被自动地产生。例如,创建内省函数330和/或调用规范360的(一个或多个)ddl语句可被自动地产生。在实施例中,这种自动产生可被或多或少集成在捆绑工具中,所述捆绑工具准备访客模块以便加载到dbms300中。例如,访客模块320可基于依赖于一些第三方python库的定制python脚本,所述一些第三方python库可用作未被安装在dbms300中的本机python模块和/或python封装。71.dbms300可提供捆绑工具(未示出),所述捆绑工具分析定制python脚本、脚本中所包含的导入语句和/或库加载路径以检测脚本依赖于哪些python库的哪些版本。例如,捆绑工具可诸如在开发者或其他客户的计算机上或多或少作为静态链接器而操作,它将脚本和它的库组装成捆绑包(未示出),所述捆绑包能够作为单元被上传和部署到dbms300中。捆绑工具的操作需要依赖关系(诸如,导入)的静态解析,以使得识别满足依赖关系的特定库的特定版本。72.捆绑工具可诸如通过url来识别和/或检索(一个或多个)本地文件系统中和/或全球互联网上的库。在操作期间,捆绑工具自然地积累产生或者以其它方式配置内省函数330、元数据341和调用规范360所需的多数或全部信息。在实施例中,仅定制python脚本是手写的,并且捆绑工具自动地产生捆绑包、内省函数330、调用规范360和诸如ddl脚本(未示出)中的所讨论的(一个或多个)ddl语句。以这种方式,用于访客模块320的捆绑包准备好或多或少按照交钥匙方式(turn-key)部署到dbms300中。用于dbms300的捆绑工具还可将由最佳品牌(bestofbreed)第三方捆绑工具产生的工件(artifact)用于特定访客编程语言,如这里稍后所讨论。73.如以上所解释,表函数390的调用可将分级数据对象(诸如,json文档370)转换成表格数据。在实施例中,表函数390是将json转换成关系数据的dbms300的内置函数,诸如sql/json标准2016的json_table函数。稍后在这里呈现json_table的示例性调用。74.在实施例中,调用规范360被反复地调用,针对每个访客模块被调用一次,以获得多个元数据(诸如,341-342)。在实施例中,元数据341-342中的每个元数据被从内省函数330返回作为内部json文档(诸如,370)。在实施例中,表函数390(诸如,json_table)被反复地调用,针对每个json文档被调用一次,以获得声明访客模块的依赖关系的多个表行。稍后在这里呈现这种行中的示例性字段。75.4.0示例性内省处理76.图4是描述用于按照语言中立格式从访客模块提取由支持数据库视图的数据库表函数聚合的依赖关系元数据的示例性处理的流程图,所述数据库视图可被探询以发现模块依赖关系,以便诸如用于识别(一个或多个)特定访客模块的依赖关系。参照图3讨论图4。77.步骤402是准备性的。如这里稍后所解释,诸如在部署捆绑包产生期间,客户端程序可自动地产生用于每个访客模块的各内省函数的数据库调用规范。在实施例中,dbms300接受缺少一些内省检测工具(诸如,内省函数或它的调用规范)的访客模块。在这种情况下,步骤402自动地产生那些缺失的部分,这可能在dbms300中定义(即,部署)访客模块时急切地发生。78.除了这种部署时行为之外,步骤402还在dbms300中的一个、一些或所有访客模块中的每个访客模块中调用数据库调用规范。(一个或多个)调用规范的调用可急切地发生在部署期间,或者稍后按需发生。从(一个或多个)访客模块提取依赖关系元数据是(所述一次或多次)调用的原因,这需要如下的步骤404a。79.步骤404a提取描述(一个或多个)访客模块的依赖关系的元数据。步骤404a可能需要执行特定元数据提取技术的步骤404b-h中的一些或全部步骤。一些实施例可结合一些步骤404b-h作为相同操作。例如,步骤404b调用(一种或多种)访客编程语言以提取依赖关系元数据。同样地,步骤404c调用每个访客模块中的各内省函数以提取依赖关系元数据。因为每个内省函数被实现在访客编程语言中,所以步骤404b-c将会被组合。实施例可具有相同或其它步骤404b-h的组合。80.步骤404d、f和g直接如下处理对依赖关系元数据进行编码的json或xml。步骤404d从每个访客模块提取json或xml。例如,每个访客模块可提供json或xml作为全局变量或函数返回值。稍后在这里呈现示例性json。步骤404f将json或xml转换成表格数据。例如,标准sqljson_table函数将json数据表格化,如这里稍后所例示。81.步骤404g-h诸如在dml中调用聚合数据的表函数。例如,步骤404h聚合从不同源获得的不同json或xml文档。步骤404g聚合来自每个访客模块的依赖关系元数据。82.一种依赖关系可依赖于另一种依赖关系,在这种情况下,依赖关系元数据可以是分级的。步骤404e整体地或分段地提取分级元数据以获得用于访客模块的相互依赖的依赖关系的传递闭包的元数据。分级元数据是被整体地提取还是被分段地提取取决于实施例。83.在稍后在这里呈现的示例性实施例中,元数据分级体系不直接反映相互依赖的依赖关系的树,而是替代地将那些依赖关系编码为展平到元数据分级体系内的同一层中,诸如json数组,并且依赖关系树能够在提取展平层之后被重构。例如,用于一种依赖关系的元数据可通过依赖关系名称来交叉引用用于另一种依赖关系的展平层中的别处的元数据,如这里稍后所展示。因此,如果被展平,则任意深度的依赖关系分级体系可被提取而没有递归,诸如没有递归dml查询并且没有递归函数调用。当第一和第二依赖关系都依赖于相同的第三依赖关系时,则元数据分级体系不是树,而是也很适合展平的有向非循环图(dag)。84.步骤406a使用基于依赖关系元数据的数据库视图,这可能发生在各种场景中。例如,步骤406b-c中的每个步骤可用于单独的场景或相同的场景。步骤406b从数据库视图产生依赖关系的报告。步骤406c使用诸如dml中的过滤来识别感兴趣的(一种或多种)特定依赖关系和/或(一个或多个)访客模块,如这里前面所讨论。85.5.0由客户端执行的模块捆绑86.图5是描述实施例中的示例性客户端-服务器系统500的方框图。客户端配置访客模块以用于由dbms570执行的依赖关系发现。dbms570可以是dbms100的实现。87.客户端-服务器系统500包含客户端(未示出)和dbms570。在实施例中,客户端是由与dbms570相同的计算机(未示出)托管的本地客户端。在实施例中,客户端是使用通信网络(未示出)来与dbms570互操作的远程客户端。在任一情况下,客户端可以是软件程序,它包含诸如利用开放数据库连接(odbc)来与dbms570互操作的数据库驱动程序。88.为了确保dbms570能够容易地发现访客模块510的依赖关系,客户端应该配置访客模块510以包括内省检测工具如下。访客模块510的代码库工件可包含一个或多个源文件,诸如520。例如,源文件520可以是按照dbms570的访客编程语言(诸如,python、javascript或ruby)编写的脚本。89.源文件520可通过引用而包括依赖关系,诸如541-543。例如,源文件520可包含用于导入依赖关系541的指令,该指令可解析为以下各项的实例或以下各项的实例中的部件:脚本文件、库(即,档案)文件或者文件系统中的目录或目录树。90.可存在依赖关系的分级体系。例如,依赖关系541可以是依赖于依赖关系543的用于数字签名的第三方库,依赖关系543可以是用于密码术的第三方库。在实施例中,源文件520仅明确地引用顶级依赖关系541-542,而不引用它们的传递覆盖(即,依赖关系的依赖关系,诸如543)。91.在实施例中,工具或人创建项目配置文件,项目配置文件对访客模块510的依赖关系541-543编制目录。例如,工具(诸如,javascript的webpack或节点封装管理器(npm)或python的pip)可产生依赖关系元数据文件,客户端可自动地将所述依赖关系元数据文件变换成元数据530。这种工具和/或客户端可将各种可交付的工件聚合成单个捆绑(即,档案)文件,诸如(一个或多个)源文件520、静态地解析的依赖关系541-543和内省检测工具,内省检测工具可包括项目配置文件、元数据530、内省函数550和/或数据库调用规范560。92.内省函数550和数据库调用规范560可以是图3的内省函数330和调用规范360的各自的实现,客户端可在产生元数据530之前或在产生元数据530之后自动地产生内省函数550和数据库调用规范560。例如,元数据530可以是内省检测工具的唯一的对于访客模块510而言独特的部分。例如,内省函数550和/或数据库调用规范560可被复制到与访客模块510相同的访客编程语言的不同访客模块中。93.在自动地将访客模块510配置成可交付的捆绑包之后,客户端可将捆绑包部署到dbms570中,作为初始部署或作为已经部署到dbms570中的访客模块510的较早版本的升级(即,替换)。在实施例中,部署可能需要客户端诸如通过用于网络通信的套接字或用于进程间通信(ipc)的套接字诸如利用传输协议(诸如,超文本传输协议(http))自动地向dbms570发送捆绑包。94.在实施例中,客户端向dbms570发送定位器,诸如文件系统路径或url,dbms570可使用所述定位器来自动地检索捆绑包。例如,客户端可发送用于定义dbms570中的访客模块510的ddl语句。该ddl语句可包含用于捆绑文件的定位器。在实施例中,客户端或它的用户在发送定位提供的捆绑文件的ddl语句之前将捆绑文件提供(例如,上传)到dbms570的文件系统中。95.dbms570可立即或稍后按需调用捆绑文件的内省检测工具以产生访客模块510的依赖关系541-543的报告。一些或全部依赖关系可能已在捆绑文件被产生时被静态地链接到捆绑文件中。在实施例中,所有依赖关系应该被静态地链接。96.在实施例中,其它依赖关系在元数据530中被编制目录,但未被捆绑,在这种情况下,诸如当dbms570已经具有缺失的依赖关系的实现时,dbms570可通过动态链接来急切地或懒惰地解决那些缺失的依赖关系。例如,与访客模块510相同的访客编程语言的不同的访客模块可能已经具有能够被与访客模块510共享的缺失的依赖关系的实现。同样地,dbms570可使用定位器(诸如,url)来从位于dbms570外部的代码库存储库检索缺失的依赖关系。元数据530可包含版本信息,版本信息指定为了实现缺失的依赖关系而可接受的版本号的最小值、最大值或范围。97.诸如当依赖关系541依赖于依赖关系543时,元数据530可包含嵌套数据结构以指示依赖关系分级体系。例如,元数据530可被编码为分级json或xml。例如,json词典可自然地被嵌套,诸如外部词典内的内部词典,这不需要展平。98.外部词典可描述依赖关系541,并且内部词典可描述依赖关系543。用于顶级依赖关系541-542的json词典可以是json数组的元素。例如,元数据530可被编码为该json数组。稍后在这里呈现示例性json编码。因此,元数据530可以是嵌套结构,并且dbms570可使用或可不使用递归(诸如,递归查询或递归函数)来遍历该嵌套结构。如这里前面所解释并且如这里稍后所例示,能够在没有递归的情况下提取展平的依赖关系分级体系。例如,展平的依赖关系分级体系可嵌套用于依赖关系541-543中的每种依赖关系的元数据作为json数组中的各元素。99.6.0示例性捆绑处理100.图6是描述用于配置用于由dbms执行的依赖关系发现的访客模块的示例性客户端处理的流程图。参照图5讨论图6。101.步骤602从访客模块的(一个或多个)源文件提取、推断或者以其它方式得到依赖关系元数据。如果源文件是如以上所讨论的项目配置文件,则依赖关系元数据或多或少被直接从项目配置文件提取。102.如果源文件是逻辑脚本,则可能需要诸如脚本中的一些或全部语句(诸如,文本行)的分析以检测依赖关系。例如,脚本内的导入指令可被分析以检测依赖关系。103.步骤604和606产生内省检测工具,根据实施例,所述内省检测工具可依赖于或者可不依赖于依赖关系元数据的内容。例如,用于步骤604和606的内省检测工具可以是能够被插入到任何访客模块中的(例如,精确的)副本。步骤604产生返回依赖关系元数据的内省函数。步骤606产生用于从数据库语句(诸如,dml)调用内省函数的数据库调用规范。104.在未示出的实施例中,捆绑步骤发生在步骤604和606之间。例如,客户端程序可直接或间接地通过第三方工具产生捆绑文件,所述捆绑文件包含随后在步骤606中发送的一些或全部单独的工件。105.步骤606自动地向dbms发送特定的可交付的工件,诸如作为访客模块的一部分的至少一个源文件、指定依赖关系的元数据、内省函数和/或用于内省函数的数据库调用规范。例如,诸如在诸如利用ddl定义dbms内的访客模块之前(即,预先提供)或在诸如利用ddl定义dbms内的访客模块时,那些可交付的工件可驻留在步骤606向dbms发送的捆绑文件中。在实施例中,除了odbc或其它数据库驱动程序之外,客户端程序还包含文件上传器。106.在推送文件的实施例中,dbms监听(例如,http)套接字,并且文件上传器诸如通过公共网关接口(cgi)post通过该套接字向dbms发送捆绑文件。在替代地拉取文件的实施例中,文件上传器监听http套接字,并且dbms请求套接字发送如url所识别的捆绑文件,dbms可能已从客户端在用于创建访客模块的ddl命令中接收到所述url。107.7.0示例性依赖关系解析处理108.下面是如下基于oracledbms和oracle的多语言引擎(mle)的示例性实施例。这个实施例使用在以下的上下文中定义并且在相关申请16/556,760中另外解释的技术和部件,诸如mle、truffle、graal、substrate、jit和futamuraprojection。如以下所使用,mle语言是访客语言;mle模块是访客模块;并且mle函数是访客函数。109.mle将多语言框架带到oracle数据库。mle的目的是使开发者能够按照除pl/sql、java或c之外的语言实现存储过程或用户定义函数(udf)。mle的强项是动态语言的执行,诸如javascript、ruby、python或r。mle绝不局限于动态语言的执行,并且也能够运行静态语言,诸如java。110.多语言框架包括几个层。顶层是访客语言的实现。在mle上运行的每种语言实现基于oracletruffle,oracletruffle是mle的第一软件实现层。truffle是用于建立在虚拟机(vm)上运行的高性能抽象语法树(ast)解释器的语言实现框架。truffleast中的每个节点具有执行方法,在该方法中,它执行它的子节点并且返回它自己的结果。truffleast解释器的主要优点在于:它通过使用动态简档信息来进行自优化。111.这种简档在访客语言程序的执行期间被收集。显著优化包括类型指定、重写间接函数调用、多态内联高速缓存、分支消除和推测函数内联。如果这些推测性假设证明是错误的,则专用树能够被恢复到为更一般的情况提供功能的更一般的版本。112.当truffle节点的执行计数达到预定义阈值时,truffle通过调用oraclegraal来触发部分评估。graal是构成第二mle层的动态编译器。graal是mle的即时编译器(jit),它执行ast的各部分的部分评估。特别地,这里应用第一futamuraprojection。graal的输出是具有去优化点的高度优化的机器代码。113.那些点被实现为检查点,其中在(一种或多种)推测性假设不再成立的情况下,去优化应该被触发。去优化意味着控制被从编译的代码转移回至ast解释器,其中专用节点随后被恢复到更一般的版本。114.第三层是vm。mle使用substratevm(svm),substratevm(svm)是可嵌入的vm,它提供诸如代码高速缓存或垃圾收集的服务。115.mle语言是由mle支持的任何编程语言。mle语言是truffle语言。mle的总体目标是以统一的方式为所有mle语言定义相同的概念、要求、特征和客户端接口。116.mle模块是部署在oracle关系dbms(rdbms)中的mle语言代码的单元。每个mle模块与单个mle语言关联,并且它的内容和结构专用于该mle语言。117.可从pl/sql通过调用规范来调用在mle模块中定义的函数。mle函数是由部署的mle模块导出的函数,它可用于从pl/sql作为用户定义函数或作为存储过程经pl/sql调用规范来调用。118.下面是用于根据用于mle函数的pl/sql调用规范来配置用于执行的mle语言代码的ddl示例。119.createorreplacefunction120.concat(str1invarchar2,str2invarchar2)asmlemodulejsmodule121.signature’concat(str1string,str2string)’;122.每个mle函数声明基于mle模块。对于以上函数,对应mle模块由下面的示例性ddl创建。[0123][0124]以上函数能够被调用作为如下的任何用户定义函数。[0125]selectconcat(’hello’,’world!’)fromdual[0126]编程语言生态系统如下。现代编程语言(比如,javascript和python)受益于具有封装或本机语言模块的形式的公开可用的库和添加件部件的丰富而巨大的生态系统。作为逻辑结果,数据库用户可部署包含这种封装或模块的mle模块,所述封装或模块已通过封装管理器(诸如,npm或pip)而变得可用。然而,由于积极的开发或安全补丁和更新,开源封装或模块经常经历频繁的版本变化。[0127]特权用户的代码部署如下。mle提供用于创建mle模块和调用规范的丰富特权模型:[0128]●createmlemodule特权:用户可在用户自己的模式中部署mle模块[0129]●createanymlemodule特权:用户可在另一用户的模式中部署mle模块[0130]●createprocedure特权:用户可在用户自己的模式中创建mle函数[0131]●createanyprocedure特权:用户可在另一用户的模式中创建mle函数[0132]特权模型使被准许createmlemodule或createanymlemodule特权的用户能够将访客语言代码部署到oraclerdbms中。这与仅数据库管理员(dba)能够部署代码的行业实践形成鲜明对比。然而,这提出新的挑战:数据库管理员可能对部署的代码具有有限的了解或者不了解部署的代码。因此,诸如对于这个示例性实施例,mle架构的重要要求是这样的能力:内省mle模块所包括的封装和模块。[0133]数据库管理员的责任之一是rdbms的安全性和完整性,对于rdbms的安全性和完整性,最大的安全关切之一是数据的未授权访问。由于在oraclerdbms的前台进程中执行mle,所以mle可被用作用于对由rdbms管理的数据进行利用的媒介。这是重大关切,因为被部署为mle模块的源代码的部分可能源自公共存储库,所述公共存储库或多或少不受控制。[0134]如以上所讨论,mle提供丰富特权模型,所述丰富特权模型使不是数据库管理员的用户能够部署代码,只要他们具有必要的特权即可。然而,这种技术进步是有代价的:在由其他用户部署的封装方面,对于数据库管理员而言,缺乏透明度。[0135]由于以上原因,模块和封装依赖关系内省可以是mle的重要架构关切。这个示例性实施例包括解决方案:两个目录视图,所述目录视图可以是数据库视图。第一目录视图是mle_module_introspection_view,它列出下面的属性:[0136]●mle模块模式[0137]●mle模块名称[0138]●模块/封装名称[0139]●模块/封装版本[0140]●作为安全散列算法(sha)散列的完整性信息[0141]●源url[0142]●devdependency:布尔值,指示这个模块/封装是否是devdependency[0143]mle_module_introspection_view列出mle模块的所有模块/封装依赖关系,但不给出关于模块/封装依赖关系分级体系的任何信息。例如,mle模块a包括npm模块b。同样地,npm模块b需要npm模块c。利用下面的包括分级依赖关系元数据的内省检测工具,模块a可被自动地扩充。例如,下面的检测工具逻辑可被:自动地附加到实现模块a的原始逻辑的手写javascript脚本(未示出),或在相同的访客语言解释/执行上下文中作为单独的脚本执行。[0144][0145][0146][0147]从mle_module_introspection_view,可确定mle模块a既包含npm模块b又包含npm模块c。利用下面的包括分级依赖关系元数据的内省检测工具,模块b可被自动地扩充。例如,下面的检测工具逻辑可被:自动地附加到实现模块b的原始逻辑的手写javascript脚本(未示出),或在相同的访客语言解释/执行中作为单独的脚本执行。执行在这样的意义上是粘性的,即全局对象(诸如,变量,诸如mlepackageintrosptexptcnt)持续可用于:在相同的脚本中稍后出现的其它脚本语句和为了相同的执行而随后调用的其它脚本,具有与将所述多个脚本顺序地连接(即,附加)到一个单一脚本或多或少相同的效果。例如,捆绑和/或检测工具可或多或少广泛地依赖于整个脚本和/或脚本语句(即,文本行)的连接。下面是javascript模块b的依赖关系检测工具。[0148][0149][0150]可能无法容易地从mle_module_introspection_view推断npm模块b对npm模块c的依赖。能够从第二目录视图mle_module_content_hierarchy_view获得这种传递相互依赖关系信息,所述第二目录视图具有下面的属性:[0151]●mle模块模式[0152]●mle模块名称[0153]●模块/封装名称[0154]●模块/封装版本[0155]●模块/封装依赖关系:这个模块/封装所依赖的模块/封装[0156]显示在目录视图中的信息能够被用于通知决定,诸如部署的mle模块是否应该被更新和重新部署。例如,利用可用软件补丁或版本升级的列表,模块/封装捆绑信息能够被交叉引用。[0157]内省信息的产生如下。mle被提供辅助助手部署工具。对于javascript,该工具被称为dbjs,并且对于python,它被称为dbpy。部署工具负责:[0158]●源代码捆绑[0182]||ltrim(rtrim(schema))[0183]||’.’[0184]||ltrim(rtrim(name))[0185]||’.mlepackageintrosptexptfunc()fromdual’;[0186]executeimmediatecmdintoresult;[0187]returnresult;[0188]end;[0189]mle_module_introspection_view具有视图定义,所述视图定义具有下面的pl/sql代码。该视图利用由js(with子句)表示的公共表表达式。在js内,对于每个部署的mle模块,调用mlepackageintrosptexptfuncinvoc。下面的代码调用json_table,如这里前面所讨论。[0190]稍后在这里在章节“用于json_table的sql/json路径表达式语法”中呈现用于json_table的sql/json路径表达式语法的细节。需要注意的是:绝对路径表达式开始于美元符号($);相对路径表达式是at符号(@);并且[*]选择数组的所有元素。下面是mle_module_introspection_view的定义。[0191][0192][0193]从目录视图所有对象搜集部署的mle模块的列表。js的结果是下面各项的列表:[0194]●部署mle模块的模式(所有者),[0195]●mle模块的名称(mle_module_name),和[0196]●具有json的形式的内省信息(info)。[0197]从from子句能够看出,用于sql的json_table查询扩展被大量使用。通过经顶级columns子句读取json的名称属性来获得部署的模块名称。由于访客模块的不同的依赖关系是作为如这里前面所示的全局变量mlepackageintrosptexptcnt的json对象的数组,所以使用nestedpath特征。[0198]图7显示用于模块a和模块b的示例性部署的mle_module_introspection_view的直接选择查询的结果。mle_module_introspection_view列出参与了mle模块的创建的所有捆绑的模块和封装。然而,对于模块/封装依赖关系分级体系,需要查询第二视图,第二视图是由下面的逻辑定义的mle_module_content_hierarchy_view。[0199][0200][0201]以上视图定义与mle_module_introspection_view具有许多相似性,但具有导入异常。对于mle_module_content_hierarchy_view,第二级nestedpath表达式使嵌套依赖关系jsonarray的内容规范化。图8显示用于模块a和模块b的示例性部署的mle_module_content_hierarchy_view的直接选择查询的结果。[0202]8.0用于json_table的sql/json路径表达式语法[0203]诸如用于json_table的sql/json路径表达式语法如下。sql/json路径表达式由sql/json函数和条件针对json数据进行匹配,以选择它的一部分。路径表达式能够使用通配符和数组范围。匹配是区分大小写的。使用需要将sql/json路径表达式和一些json数据传递给sql/json函数(诸如,json_table)或sql/json条件。路径表达式被与数据进行匹配,并且匹配的数据由特定sql/json函数或条件处理。匹配处理操作,以使得路径表达式将匹配的数据返回给函数或条件。[0204]基本sql/json路径表达式语法如下。提供sql/json路径表达式的基本语法。它包括上下文项目符号($),后面跟随有零个或多个对象、数组和后代步骤,每个后代步骤能够后面跟随有过滤器表达式,过滤器表达式可选地后面跟随有函数步骤。以下在这里提供示例。[0205]sql/json路径表达式语法放宽如下。基本sql/json路径表达式语法被放宽以允许隐式数组包装和展开。这意味着,如果数据演进以利用这种值的数组替换json值,则不需要改变原始访客模块代码中的路径表达式,反之亦然。稍后在这里提供示例。[0206]sql/json路径表达式的基本语法如下。它包括上下文项目符号($),后面跟随有零个或多个对象、数组和后代步骤,每个后代步骤能够后面跟随有过滤器表达式,过滤器表达式可选地后面跟随有函数步骤。提供示例。[0207]然而,通过分别放宽数组和非数组与非数组和数组模式的匹配,这种基本语法被扩展。数据与sql/json路径表达式的匹配是区分大小写的。sql/json基本路径表达式(这里也仅被称为路径表达式)是绝对路径表达式或相对路径表达式。[0208]绝对路径表达式开始于美元符号($),所述美元符号($)代表路径表达式上下文项目,也就是说,待匹配的json数据。该数据是对作为自变量传递给sql/json函数的sql表达式求值的结果。美元符号后面跟随有零个或多个非函数步骤,后面跟随有可选的函数步骤。[0209]相对路径表达式是at符号(@),后面跟随有零个或多个非函数步骤,后面跟随有可选的函数步骤。它具有与绝对路径表达式相同的语法,不同之处在于:它使用at符号而非美元符号($)。[0210]相对路径表达式被用在过滤器表达式(简称为过滤器)内部。at符号代表路径表达式当前过滤器项目,也就是说,与(周围)路径表达式的在包含相对路径表达式的过滤器之前的部分匹配的json数据。按照绝对路径表达式与上下文项目进行匹配的相同的方式,相对路径表达式与当前过滤器项目进行匹配。[0211]非函数步骤是对象步骤、数组步骤或后代步骤,后面跟随有可选的过滤器表达式。单个函数步骤在基本路径表达式(绝对或相对)中是可选的。如果存在,则它是路径表达式的最后一个步骤。它是句点(.),有时读作“点”,后面跟随有sql/json项目方法,后面跟随有左圆括号((),然后是右圆括号())。所述括号能够在它们之间具有空白(这种空白是无关紧要的)。[0212]项目方法被应用于由在函数步骤之前的相同的路径表达式的其余部分瞄准的数据。项目方法被用于变换该数据。被传递路径表达式作为自变量的sql函数或条件使用变换的数据而非目标数据。[0213]对象步骤是句点(.),后面跟随有对象字段名或星号(*)通配符,其代表所有字段(的值)。字段名能够是空的,在这种情况下,它必须被写为""(没有中间空白)。非空字段名必须开始于大写或小写字母a至z并且仅包含这种字母或十进制数字(0-9),否则它必须被括在双引号(")中。对象步骤返回指定的字段的值。如果通配符被用于字段,则该步骤在没有特殊次序的情况下返回所有字段的值。[0214]数组步骤是左方括号([),后面跟随有代表全部数组元素的星号(*)通配符或者由逗号()分隔的一个或多个特定数组索引或范围规范,后面跟随有右方括号(])。如果既使用星号又使用数组索引或范围规范,则产生错误。[0215]在路径表达式中,像用于数组的javascript约定中一样,数组索引是基于零的(0、1、2、…)。范围规范具有从n到m,其中n和m是数组索引并且n严格地小于m.foot1。如果n不小于m,则在查询编译时产生错误。[0216]当使用索引或范围规范时,它们共同指定的数组元素必须被按照升序指定而没有重复,否则产生编译时错误。例如,对于[3,1到4]、[4,2]、[2,3到3]和[2,3,3]中的每一个,产生错误。前两个产生错误,因为次序不是升序,最后两个产生错误,因为数组索引3(它因为基于零的索引而对第四个数组元素编索引)的重复。[0217]类似地,通过匹配而获得的数组值中的元素按照升序,而没有重复。如果星号被用在路径表达式中,则所有数组元素被按照数组次序返回。[0218]后代步骤是两个连续句点(..),有时读作“点点”,后面跟随有字段名(其具有与对象步骤相同的语法)。它递归地下降到与它的前一步骤匹配的对象或数组中(或者如果不存在前一步骤,则下降到上下文项目中)。[0219]在每个后代级别,对于每个对象并且对于作为对象的每个数组元素,它搜集具有指定名称的所有字段的值。它返回所有搜集的字段值。例如,考虑这个查询和数据:[0220][0221]该查询返回数组,诸如[1,2,3],其元素是1、2和3。它搜集作为字段a的点点(..)的前一步骤内的每个字段z的值。具有值4的最上面的字段z不匹配,因为它不在字段a的值内。[0222]字段a的值是对象,该对象下降。它具有字段z,字段z的值(3)被搜集。它还具有字段b,字段b的值是对象,该对象下降以搜集它的字段z的值,该字段z的值是1。它还具有字段c,字段c的值是数组,该数组具有作为具有字段z的对象的元素,字段z的值(2)被搜集。搜集的json值因此是3、1和2。它们被按照未定义的次序包装在数组中。可能的返回值之一是[1,2,3]。[0223]过滤器表达式(简称为过滤器)是问号(?),后面跟随有括在圆括号(())中的过滤器条件。如果满足过滤器的条件,也就是说,返回真,则满足过滤器。过滤器条件将谓词(布尔函数)应用于它的自变量并且是下面各项之一,其中cond、cond1和cond2中的每一个代表过滤器条件。[0224]●(cond):圆括号被用于分组,将过滤器条件cond作为单元与可能在它之前或在它之后的其它过滤器条件分开。[0225]●cond1&&cond2:cond1和cond2的合取(and),需要二者都满足。[0226]●cond1||cond2:cond1和cond2的包含性析取(or),要求cond1、cond2或二者满足。[0227]●!(cond):cond的否定,意味着cond一定不能满足。[0228]●exists(,后面跟随有相对路径表达式,后面跟随有):目标数据存在(存留)的条件。[0229]●比较,它是下面各项之一:[0230]○相对路径表达式,后面跟随有比较谓词,后面跟随有json标量值或sql/json变量。[0231]○json标量值或sql/json变量,后面跟随有比较谓词,后面跟随有相对路径表达式。[0232]○json标量值,后面跟随有比较谓词,后面跟随有另一json标量值。[0233]○相对路径表达式,后面跟随有hassubstring、startswith、like、like_regex或eq_regex,后面跟随有json字符串或绑定到sql字符串的sql/json变量(其被自动地从数据库字符集转换到utf8)。[0234]■hassubstring意味着:匹配的数据值具有指定的字符串作为子字符串。[0235]■startswith意味着:匹配的数据值具有指定的字符串作为前缀。[0236]■like意味着:json字符串数据值与指定的字符串匹配,这被解释为使用sqllike4字符集语义的sqllike模式。该模式中的百分比符号(%)与零个或多个字符匹配。下划线(_)与单个字符匹配。[0237]■需要注意的是:与sqllike的情况不同,对于路径表达式谓词like,不存在转义字符。建议避免在like模式中使用字符`,graveaccent(u 0060)—该字符(有时也称为反引号或反勾号)被保留用于未来使用。[0238]■like_regex意味着:json字符串数据值与指定的字符串匹配,这被解释为使用sqllike4字符集语义的sqlregexplike正则表达式模式。[0239]■like_regex在模式匹配比较之中是例外的,因为它的模式与空json字符串("")匹配。[0240]■eq_regex就像like_regex一样,除了这两种差别之外:[0241]●eq_regex将它的正则表达式模式与整个json字符串数据值进行匹配—完整字符串必须与该模式匹配以便满足所述比较。如果json字符串的任何部分与该模式匹配,则满足like_regex。[0242]●eq_regex模式不与空json字符串("")匹配。[0243]○对于所有这些谓词,作为空字符串("")的模式与作为空字符串的数据匹配。并且对于除了like_regex之外的所有模式,作为非空字符串的模式不与作为空字符串的数据匹配。对于like_regex,非空模式与空字符串数据匹配。[0244]○相对路径表达式,后面跟随有in,后面跟随有值列表,意味着该值是值列表中的那些值之一。[0245]比较谓词是==、《》、!=foot2、《、《=、》=或》,分别表示等于、不等于、小于、小于或等于、大于或等于和大于。[0246]sql/json变量是美元符号($),后面跟随有在json_exists的passing子句中绑定的sql标识符的名称。[0247]值列表是(,后面跟随有由逗号(,)分隔的一个或多个标量值和sql/json变量的列表,后面跟随有)。[0248]能够被用在过滤器条件中的谓词因此是&&、||、!、exists、==、《》、!=、《、《=、》=、》和in。[0249]作为示例,如果下面的两个准则都满足,则过滤器条件(a||b)&&(!(c)||d《42)满足:[0250]●过滤器条件a和b中的至少一个满足:(a||b)。[0251]●过滤器条件c不满足或者数量d小于或等于42或者二者都是真:(!(c)||d《42)。[0252]比较谓词!优先于&&,&&优先于||。总是可使用圆括号来控制分组。[0253]在没有用于分组的圆括号的情况下,前一示例将会是a||b&&!(c)||d《42,如果下面的至少一个准则满足,则该条件将会满足:[0254]●条件b&&!(c)满足,这意味着条件b和!(c)中的每一个满足(这又意味着条件c不满足)。[0255]●条件a满足。[0256]●条件d《42满足。[0257]比较的至少一侧一定不能是sql/json变量。比较的默认类型在编译时基于非变量侧的类型而被定义。可使用类型指定项目方法来利用不同类型取代这种默认。为了比较,匹配的数据的类型被自动地转换,以适合确定的类型(默认或由项目方法指定)。例如,$.a》5强制执行数字比较,因为5是数字,$.a》"5"强制执行字符串比较,因为“5”是字符串。[0258]需要注意的是:对于强大的全文搜索,使用oraclesql函数json_textcontains,这可能需要创建json搜索索引。作为不那么强大的替代方案,如果不创建json搜索索引并且希望过滤器条件中的简单的字符串模式匹配,则可使用任何模式匹配比较:hassubstring、startswith、like、like_regex或eq_regex。[0259]这里是路径表达式的一些示例,它们的含义被详细地说明。[0260]●$–上下文项目[0261]●$.friends–上下文项目对象的字段friends的值。紧挨在美元符号($)之后的点(.)指示:上下文项目是json对象。[0262]●$.friends[0]–作为上下文项目对象的字段friends的值的数组的第一个元素的对象。方括号符号指示:字段friends的值是数组。[0263]●$.friends[0].name–作为上下文项目对象的字段friends的值的数组的第一个元素的对象的字段名的值。第二个点(.)指示:数组friends的第一个元素是对象(具有name字段)。[0264]●$.friends[*].name–作为上下文项目对象的字段friends的值的数组中的每个对象的字段名的值。[0265]●$.*[*].name–上下文项目对象的字段的数组值中的每个对象的字段名值。[0266]●$.friends[3,8到10,12]–数组friends(上下文项目对象的字段)的第四、第九至第十一和第十三个元素。所述元素必须被按照升序指定,并且它们被按照该次序返回:第四、第九、第十、第十一、第十三。[0267]●$.friends[3].cars–作为数组friends的第四个元素的对象的字段cars的值。点(.)指示:第四个元素是对象(具有cars字段)。[0268]●$.friends[3].*–作为数组friends的第四个元素的对象的所有字段的值。[0269]●$.friends[3].cars[0].year–作为数组friends的第四个元素的对象的字段cars的值的数组的第一个元素的对象的字段year的值。[0270]●$.friends[3].cars[0]?(@.year》2016)–数组cars(作为数组friends的第四个元素的对象的字段)的第一个对象,前提是它的字段year的值是大于2016的数字,或者能够被转换成大于2016的数字。诸如“2017”的year值被转换成数字2017,其满足测试。诸如“最近”的year值未通过测试—不匹配。[0271]●$.friends[3].cars[0]?(@.year.number()》2016)–与前一表达式相同。项目方法number()仅允许数字或能够被转换成数字的字符串值,并且该行为已经由数字比较谓词》提供。[0272]●$.friends[3].cars[0]?(@.year.numberonly()》2016)–与前一表达式相同,但year值仅是数字。项目方法numberonly()排除year值是字符串数字(诸如,“2017”)的汽车。[0273]●$.friends[3]?(@.addresses.city=="sanfrancisco")–作为数组friends的第四个元素的对象,前提是它具有addresses字段,addresses字段的值是具有字段city的对象,字段city的值是字符串“sanfrancisco”。[0274]●$.friends[*].addresses?(@citystartswith"san").zip–friends的所有addresses的邮政编码,其中地址城市的名称开始于“san”。(在这种情况下,过滤器不是最后一个路径步骤。)[0275]●$..zip–在任何地方在任何级别的zip字段的所有值。[0276]●$.friends[3]?(@.addresses.city=="sanfrancisco"&&@.addresses.state=="nevada")–作为数组friends的第四个元素的对象,前提是存在与具有城市“sanfrancisco”的地址的匹配并且存在与具有州“nevada”的地址的匹配。[0277]●需要注意的是:合取中的过滤器条件未必应用于同一对象–过滤器测试具有城市sanfrancisco的对象的存在并且测试具有州nevada的对象的存在。它不测试既具有城市sanfrancisco又具有州nevada的对象的存在。参见使用具有json_exists的过滤器。[0278]●$.friends[3].addresses?(@.city=="sanfrancisco"&&@.state=="nevada")–作为数组friends的第四个元素的对象,前提是对象具有与城市“sanfrancisco”的匹配和与州“nevada”的匹配。[0279]与前一示例不同,在这种情况下,用于字段city和state的合取中的过滤器条件应用于同一addresses对象。过滤器应用于在它外部的给定addresses对象。[0280]9.0数据库概述[0281]在数据库管理系统(dbms)的上下文中使用本发明的实施例。因此,提供示例性dbms的描述。[0282]通常,服务器(诸如,数据库服务器)是集成软件部件和计算资源(诸如,存储器、节点和节点上用于执行集成软件部件的进程)的分配的组合,其中软件和计算资源的组合专用于代表服务器的客户端提供特定类型的功能。数据库服务器控制和促进对特定数据库的访问,处理客户端访问数据库的请求。[0283]通过向数据库服务器提交使数据库服务器对存储在数据库中的数据执行操作的命令,用户与dbms的数据库服务器交互。用户可以是在与数据库服务器交互的客户端计算机上运行的一个或多个应用。多个用户还可在这里被统称为用户。[0284]数据库包括数据和数据库词典,数据库词典被存储在永久存储机构(诸如,一组硬盘)上。数据库由它自己的单独的数据库词典定义。数据库词典包括定义数据库中所包含的数据库对象的元数据。实际上,数据库词典定义数据库的大部分。数据库对象包括表、表列和表空间。表空间是用于存储各种类型的数据库对象(诸如,表)的数据的一组的一个或多个文件。如果数据库对象的数据被存储在表空间中,则数据库词典将数据库对象映射到保存数据库对象的数据的一个或多个表空间。[0285]数据库词典由dbms参照以确定如何执行提交给dbms的数据库命令。数据库命令能够访问由词典定义的数据库对象。[0286]数据库命令可具有数据库语句的形式。为了数据库服务器处理数据库语句,数据库语句必须符合由数据库服务器支持的数据库语言。由许多数据库服务器支持的数据库语言的一个非限制性示例是sql,包括由诸如oracle(诸如,oracledatabase11g)的数据库服务器支持的sql的专有形式。sql数据定义语言(“ddl”)指令被发出给数据库服务器以创建或配置数据库对象,诸如表、视图或复杂类型。数据操纵语言(“dml”)指令被发出给dbms以管理存储在数据库结构内的数据。例如,select、insert、update和delete是在一些sql实现中发现的dml指令的常见示例。sql/xml是当在对象关系数据库中操纵xml数据时使用的sql的常见扩展。[0287]多节点数据库管理系统包括共享对同一数据库的访问的互连节点。通常,所述节点经网络而互连,并且在不同程度上共享对共享存储装置的访问,诸如具有对一组盘驱动器和存储在它们上面的数据块的共享访问。多节点数据库系统中的节点可具有经网络互连的一组计算机(诸如,工作站和/或个人计算机)的形式。替代地,所述节点可以是网格的节点,所述网格包括具有与机架上的其它服务器刀片互连的服务器刀片的形式的节点。[0288]多节点数据库系统中的每个节点托管数据库服务器。服务器(诸如,数据库服务器)是集成软件部件和计算资源(诸如,存储器、节点和节点上用于在处理器上执行集成软件部件的进程)的分配的组合,软件和计算资源的组合专用于代表一个或多个客户端执行特定功能。[0289]来自多节点数据库系统中的多个节点的资源能够被分配以运行特定数据库服务器的软件。软件和来自节点的资源的分配的每个组合是服务器,所述服务器在这里被称为“服务器实例”或“实例”。数据库服务器可包括多个数据库实例,一些或全部数据库实例在分开的计算机(包括分开的服务器刀片)上运行。[0290]9.1查询处理[0291]查询是表达式、命令或命令集,当所述表达式、命令或命令集被执行时,所述表达式、命令或命令集使服务器对数据集执行一个或多个操作。查询可指定(一个或多个)源数据对象,诸如(一个或多个)表、(一个或多个)列、(一个或多个)视图或(一个或多个)快照,从所述(一个或多个)源数据对象,将会确定(一个或多个)结果集。例如,(所述一个或多个)源数据对象可出现在结构化查询语言(“sql”)查询的from子句中。sql是用于查询数据库对象的公知示例性语言。如这里所使用,术语“查询”被用于表示代表查询的任何形式,包括具有数据库语句的形式的查询和用于内部查询表示的任何数据结构。术语“表”表示由查询引用或定义并且代表一组行的任何源对象,诸如数据库表、视图或内联查询块,诸如内联视图或子查询。[0292]查询可在(所述一个或多个)源数据对象被加载时逐行地对来自(所述一个或多个)对象的数据执行操作,或者在(所述一个或多个)对象已被加载之后对全部源数据对象执行操作。通过一些操作而产生的结果集可以可用于(一个或多个)其它操作,并且以这种方式,结果集可基于一些准则而被过滤或变窄,和/或与(一个或多个)其它结果集和/或(一个或多个)其它源数据对象结合或组合。[0293]子查询是查询的一部分或部件,它不同于查询的(一个或多个)其它部分或部件并且可被与查询的(所述一个或多个)其它部分或部件分开地(即,作为单独的查询)评估。查询的(所述一个或多个)其它部分或部件可形成外部查询,所述外部查询可包括或者可不包括其它子查询。在为外部查询计算结果时,嵌套在外部查询中的子查询可被单独地评估一次或多次。[0294]通常,查询解析器接收查询语句,并且产生查询语句的内部查询表示。通常,内部查询表示是一组相互链接的数据结构,所述一组相互链接的数据结构代表查询语句的各种部件和结构。[0295]内部查询表示可具有节点的曲线图的形式,每个相互链接的数据结构对应于节点并且对应于所代表的查询语句的部件。内部表示通常在存储器中被产生以用于评估、操纵和变换。[0296]硬件概述[0297]根据一个实施例,这里描述的技术由一个或多个专用计算装置实现。专用计算装置可被硬连线以执行该技术,或者可包括永久编程为执行该技术的数字电子装置(诸如,一个或多个专用集成电路(asic)或现场可编程门阵列(fpga)),或者可包括编程为根据固件、存储器、其它存储装置或组合中的程序指令执行该技术的一个或多个通用硬件处理器。这种专用计算装置还可组合自定义硬连线逻辑、asic或fpga与自定义编程以完成该技术。专用计算装置可以是桌上型计算机系统、便携式计算机系统、手持式装置、联网装置或包括用于实现该技术的硬连线和/或程序逻辑的任何其它装置。[0298]例如,图9是表示可实现本发明的实施例的计算机系统900的方框图。计算机系统900包括用于传送信息的总线902或其它通信机构和用于处理信息的与总线902耦合的硬件处理器904。硬件处理器904可以是例如通用微处理器。[0299]计算机系统900还包括主存储器906(诸如,随机存取存储器(ram)或其它动态存储装置),主存储器906耦合到总线902以存储信息和由处理器904执行的指令。主存储器906也可被用于在由处理器904执行的指令的执行期间存储临时变量或其它中间信息。当这种指令被存储在处理器904可访问的非暂态存储介质中时,这种指令使计算机系统900变为定制为执行该指令中指定的操作的专用机器。[0300]计算机系统900还包括只读存储器(rom)908或其它静态存储装置,所述只读存储器(rom)908或其它静态存储装置耦合到总线902以存储静态信息和用于处理器904的指令。提供存储装置910(诸如,磁盘、光盘或固态驱动器)并且存储装置910耦合到总线902以存储信息和指令。[0301]计算机系统900可经总线902耦合到显示器912(诸如,阴极射线管(crt))以将信息显示给计算机用户。输入装置914(包括字母数字和其它键)耦合到总线902以将信息和命令选择传送给处理器904。另一类型的用户输入装置是用于将方向信息和命令选择传送给处理器904并且用于控制显示器912上的光标移动的光标控制器916(诸如,鼠标、跟踪球或光标方向键)。这个输入装置通常具有沿两个轴(第一轴(例如,x)和第二轴(例如,y))的两个自由度,这允许该装置指定平面中的位置。[0302]计算机系统900可使用自定义硬连线逻辑、一个或多个asic或fpga、固件和/或程序逻辑实现这里描述的技术,所述自定义硬连线逻辑、一个或多个asic或fpga、固件和/或程序逻辑结合计算机系统使计算机系统900变为专用机器或对计算机系统900编程以使其变为专用机器。根据一个实施例,响应于处理器904执行主存储器906中所包含的一个或多个指令的一个或多个序列,该技术在这里由计算机系统900执行。这种指令可被从另一存储介质(诸如,存储装置910)读取到主存储器906中。主存储器906中所包含的指令的序列的执行使处理器904执行这里描述的处理步骤。在替代实施例中,可替代于软件指令使用硬连线电路或者结合软件指令使用硬连线电路。[0303]如这里所使用的术语“存储介质”表示存储使机器以特定方式操作的数据和/或指令的任何非暂态介质。这种存储介质可包括非易失性介质和/或易失性介质。非易失性介质包括例如光盘、磁盘或固态驱动器,诸如存储装置910。易失性介质包括动态存储器,诸如主存储器906。存储介质的常见形式包括例如软盘、柔性盘、硬盘、固态驱动器、磁带或任何其它磁数据存储介质、cd-rom、任何其它光学数据存储介质、具有孔的图案的任何物理介质、ram、prom和eprom、flash-eprom、nvram、任何其它存储芯片或盒。[0304]存储介质不同于传输介质,但可结合传输介质使用。传输介质参与在存储介质之间传送信息。例如,传输介质包括同轴线缆、铜线和光纤,所述同轴线缆、铜线和光纤包括包含总线902的导线。传输介质还能够采用声波或光波的形式,诸如在无线电波和红外数据通信期间产生的声波或光波。[0305]各种形式的介质可被用于将一个或多个指令的一个或多个序列传送给处理器904以便执行。例如,可最初在远程计算机的磁盘或固态驱动器上传送指令。远程计算机能够将指令加载到它的动态存储器中,并且使用调制解调器在电话线上发送指令。计算机系统900的本地的调制解调器能够接收电话线上的数据并且使用红外发射器将数据转换成红外信号。红外检测器能够接收红外信号中传送的数据,并且合适的电路能够将数据放置在总线902上。总线902将数据传送给主存储器906,处理器904从主存储器906获取指令并且执行指令。由主存储器906接收的指令可在由处理器904执行之前或之后可选地存储在存储装置910上。[0306]计算机系统900还包括耦合到总线902的通信接口918。通信接口918提供与连接到局部网络922的网络链路920的双向数据通信耦合。例如,通信接口918可以是综合业务数字网(isdn)卡、线缆调制解调器、卫星调制解调器或用于提供与对应类型的电话线的数据通信连接的调制解调器。作为另一示例,通信接口918可以是用于提供与兼容lan的数据通信连接的局域网(lan)卡。还可实现无线链路。在任何这种实现方式中,通信接口918发送和接收传送代表各种类型的信息的数字数据流的电、电磁或光学信号。[0307]网络链路920通常通过一个或多个网络提供与其它数据装置的数据通信。例如,网络链路920可通过局部网络922提供与主机计算机924或与由互联网服务提供商(isp)926操作的数据装备的连接。isp926又通过全球分组数据通信网络(现在通常被称为“互联网”928)提供数据通信服务。局部网络922和互联网928都使用传送数字数据流的电、电磁或光学信号。通过各种网络的信号以及在网络链路920上并且通过通信接口918的信号(该信号将数字数据传送给计算机系统900以及传送来自计算机系统900的数字数据)是传输介质的示例性形式。[0308]计算机系统900能够通过网络、网络链路920和通信接口918发送消息和接收数据(包括程序代码)。在互联网示例中,服务器930可通过互联网928、isp926、局部网络922和通信接口918发送请求的应用程序的代码。[0309]当接收到代码时接收的代码可由处理器904执行,和/或接收的代码可被存储在存储装置910或其它非易失性介质中以在以后执行。[0310]软件概述[0311]图10是可被用于控制计算系统900的操作的基本软件系统1000的方框图。软件系统1000和它的部件(包括它们的连接、关系和功能)仅应该是示例性的,而非意图限制(所述一个或多个)示例性实施例的实现。适合实现(所述一个或多个)示例性实施例的其它软件系统可具有不同部件,所述不同部件包括具有不同连接、关系和功能的部件。[0312]软件系统1000被提供用于指导计算系统900的操作。软件系统1000(软件系统1000可被存储在系统存储器(ram)906中并且存储在固定存储装置(例如,硬盘或闪存)910上)包括内核或操作系统(os)1010。[0313]os1010管理计算机操作的低级方面,包括管理进程的执行、存储器分配、文件输入和输出(i/o)以及装置i/o。表示为1002a、1002b、1002c…1002n的一个或多个应用程序可被“加载”(例如,从固定存储装置910传送到存储器906中)以便由系统1000执行。旨在在计算机系统900上使用的应用或其它软件还可被存储为例如一组可下载的计算机可执行指令,以便从互联网位置(例如,web服务器、app商店或其它在线服务)下载和安装。[0314]软件系统1000包括图形用户界面(gui)1015,用于以图形(例如,“点击”或“触摸手势”)方式接收用户命令和数据。然后,可由系统1000根据来自操作系统1010和/或(一个或多个)应用1002的指令来操作这些输入。gui1015还用于显示来自os1010和(一个或多个)应用1002的操作的结果,因此,用户可提供另外的输入或结束会话(例如,注销)。[0315]os1010能够直接在计算机系统900的裸硬件1020(例如,(一个或多个)处理器904)上执行。替代地,管理程序或虚拟机监视器(vmm)1030可被插入在裸硬件1020和os1010之间。在这种配置中,vmm1030用作计算机系统900的os1010和裸硬件1020之间的软件“缓冲”或虚拟化层。[0316]vmm1030实例化并且运行一个或多个虚拟机实例(“访客机器”)。每个访客机器包括“访客”操作系统(诸如,os1010)和被设计为在访客操作系统上执行的一个或多个应用(诸如,(一个或多个)应用1002)。vmm1030为访客操作系统提供虚拟操作平台,并且管理访客操作系统的执行。[0317]在一些实例中,vmm1030可允许访客操作系统运行,就好像它直接在计算机系统1000的裸硬件1020上运行。在这些实例中,被配置为直接在裸硬件1020上执行的相同版本的访客操作系统还可在vmm1030上执行,而没有修改或重新配置。换句话说,在一些实例中,vmm1030可向访客操作系统提供完全硬件和cpu虚拟化。[0318]在其它实例中,为了效率,访客操作系统可被专门设计或配置为在vmm1030上执行。在这些实例中,访客操作系统“知道”它在虚拟机监视器上执行。换句话说,在一些实例中,vmm1030可向访客操作系统提供准虚拟化。[0319]计算机系统进程包括硬件处理器时间的分配和存储器(物理和/或虚拟)的分配,所述存储器的分配用于存储由硬件处理器执行的指令、用于存储由执行所述指令的硬件处理器产生的数据和/或用于存储当计算机系统进程不运行时的硬件处理器时间的分配之间的硬件处理器状态(例如,寄存器的内容)。计算机系统进程在操作系统的控制下运行,并且可在在计算机系统上执行的其它程序的控制下运行。[0320]云计算[0321]术语“云计算”通常在这里被用于描述计算模型,所述计算模型能够实现对计算资源(诸如,计算机网络、服务器、软件应用和服务)的共享池的按需访问,并且允许具有最少的管理工作或服务提供商交互的资源的迅速供应和释放。[0322]云计算环境(有时被称为云环境或云)能够被按照各种不同方式实现以最好地适合不同的要求。例如,在公共云环境中,底层计算基础设施由组织拥有,所述组织使它的云服务可被其它组织或一般公众获得。相比之下,私有云环境通常仅意图由单个组织使用或在单个组织内使用。社区云旨在由社区内的几个组织共享;而混合云包括通过数据和应用可移植性而绑定在一起的两种或更多种类型的云(例如,私有、社区或公共)。[0323]通常,云计算模型使以前可能已由组织自己的信息技术部门提供的那些责任中的一些责任能够替代地作为云环境内的服务层而被交付以便由消费者(根据云的公共/私有性质,在组织内或在组织外部)使用。根据特定实现,由每个云服务层或在每个云服务层内提供的部件或特征的精确定义能够变化,但常见示例包括:软件即服务(saas),其中消费者使用在云基础设施上运行的软件应用,而saas提供商管理或控制底层云基础设施和应用。平台即服务(paas),其中消费者能够使用由paas提供商支持的软件编程语言和开发工具来开发、部署和以其它方式控制他们自己的应用,而paas提供商管理或控制云环境的其它方面(即,在运行时执行环境以下的所有方面)。基础设施即服务(iaas),其中消费者能够部署和运行任意软件应用和/或供应处理、存储装置、网络和其它基本计算资源,而iaas提供商管理或控制底层物理云基础设施(即,在操作系统层以下的所有方面)。数据库即服务(dbaas),其中消费者使用在云基础设施上运行的数据库服务器或数据库管理系统,而dbaas提供商管理或控制底层云基础设施和应用。[0324]为了表示可被用于实现(所述一个或多个)示例性实施例的基本底层计算机部件的目的,提供上述基本计算机硬件和软件和云计算环境。然而,(所述一个或多个)示例性实施例不必局限于任何特定计算环境或计算装置配置。替代地,(所述一个或多个)示例性实施例可被实现在任何类型的系统架构或处理环境中,考虑到本公开,本领域技术人员将会将所述任何类型的系统架构或处理环境理解为能够支持这里提供的(所述一个或多个)示例性实施例的特征和功能。[0325]在前面的说明书中,已参照可因实现方式而不同的许多特定细节描述本发明的实施例。因此,在说明性而非限制性意义上看待说明书和附图。本发明的范围和申请人希望成为本发明的范围的内容的唯一专门指示器是以这种权利要求发布的特定形式从本技术发布的所述一组权利要求的文字和等同范围,包括任何随后的校正。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献