基于ANTLR的数据字段血缘分析方法及装置与流程

文档序号:26193621发布日期:2021-08-06 18:47阅读:572来源:国知局
本申请涉及一种数据分析技术。
背景技术
::关系型数据库(relationaldatabase)包含有一张或多张数据表(table)。数据表由行(row)和列(column)组成,每个列都是一个数据字段(field)。在数据加工的过程中,某一张数据表中的数据可能是由一张或多张其他数据表中的数据处理得到的。当某一张数据表a中的数据有问题,就会影响到以数据表a处理得到的其他数据表。数据表血缘分析就是分析数据表之间的关联性,通过数据表血缘分析就可以定位有问题的数据表a到底影响到了后面的哪些数据表,从而进行应对处理。随着业务的发展,数据表血缘分析已经不能满足业务的基本需求,数据字段血缘分析成为了新的研究课题。数据字段血缘分析就是分析数据表的数据字段之间的关联性。例如,数据表b的数据字段b1是由数据表c的数据字段c2和数据表d的数据字段d3相加得到的,在这三个数据字段b1、c2和d3之间就存在血缘关系。antlr(anothertoolforlanguagerecognition,语言识别的另一个工具)是一种语法解析生成器(parsergenerator),目前最新版本为antlrv4,简称为antlr4。antlr用于读取、处理、执行和翻译结构化的文本或二进制文件,会根据一套指定的语法(grammar)规则自动解析文本,生成一个计算机可以理解且能执行的语法树(syntaxtree)。antlr提供了访问器(visitor)和监听器(listener)。访问器用来访问语法树的特定节点。监控器用来监听语法树的节点的行为。以数据分析所用到的结构化查询语言(structuredquerylanguage,sql)为例,当sql代码放入antlr中,antlr会从头开始根据sql语法规则对该sql代码进行探查,当sql代码符合sql语法规则,就生成节点(node),通过节点与节点之间的关联生成语法分析树(parsetree)。antlr的作用是将sql代码变成一个可以访问节点的语法树,每个节点对应的是sql代码中的一个查询步骤。例如1+2=3这个算式,“1”和“2”便可理解为语法树中的两个节点,这两个节点进行了“+”的操作,生成了“3”这个节点。技术实现要素:本申请所要解决的技术问题是提供一种数据字段的血缘分析方法,用于发现数据字段之间的关联性,形成每张数据表中数据字段之间的关系地图,也就是数据字段的血缘关系。本申请能够自动化地监控最终结果数据表的数据字段来源关系,即这张结果数据表中的数据字段分别是由哪些数据表的数据字段加工而成。为解决上述技术问题,本申请提出了一种基于antlr的数据字段血缘分析方法,包括如下步骤。步骤s1:采用sql查询构造器将程序代码中与查询有关的非sql代码自动转换为sql的形式,然后执行每一段与查询有关的sql代码以生成一个对应的数据集,为每一个数据集创建对应的数据集对象。步骤s2:为每一个数据集对象打上表征其存储地址的水印,当结果数据集是在源数据集中执行查询得到的结果,则在结果数据集对象中记录原始数据集对象的水印;根据执行查询过程的源数据集、结果数据集关系,在对应的数据集对象之间形成链表,链表中的后一数据集对象记载前一数据集对象的水印;将写入操作的sql代码对应的数据集对象作为一个链表的最后一个数据集对象,将每个链表中所有数据集对象对应的“与查询有关的sql代码”进行拼接。步骤s3:将每一段“拼接好的与查询有关的sql代码”送入antlr以生成具体语法树,生成时明确antlr的sql匹配规则;将具体语法树的所有节点分为字段信息类型、表格信息类型、关联信息类型三类;其中关联信息类型的节点或者关联到字段信息类型的节点,或者关联到表格信息类型的节点;所述关联信息类型的节点或者能够体现字段信息操作,或者不能体现字段信息操作。步骤s4:在具体语法树中进行裁枝式访问,完成裁枝式访问后生成第一中缀表达式;第一中缀表达式中记录了所访问的具体语法树的每一节点属于哪一层、以及所访问的具体语法树的每一层中数据字段与数据表之间的对应关系。所述裁枝式访问是指:从树根节点开始按照深度遍历方式访问,当访问到某个节点a时,如果节点a的下一层节点包含关联信息类型的节点且所述关联信息类型的节点无法体现字段信息操作时,不再访问节点a的下一层节点;否则继续按照深度遍历方式访问节点a的下一层节点。步骤s5:从所访问的具体语法树的每个节点中提取出操作符和所需的文字变量,将能够体现字段信息操作的关联信息类型的节点中提取出的操作符和所需的文字变量按顺序增加到第一中缀表达式中,将第一中缀表达式扩充为第二中缀表达式。步骤s6:将第二中缀表达式转换为后缀表达式;后缀表达式的运算结果是一个或多个数据字段,就是步骤s2中每一段写入操作的sql代码所对应的数据集对象中的全部数据字段,称为目标数据字段;后缀表达式的运算结果完整记录了所述每个目标数据字段的来源及变化过程,即实现了目标数据字段的血缘分析。上述方法实现了数据字段的血缘分析。进一步地,所述步骤s1中,如在执行与查询有关的sql代码的过程中生成临时数据表,则在每次生成临时数据表时记录临时数据表的生成顺序。所述步骤s2中,如在拼接“与查询有关的sql代码”的过程中出现了临时数据表的名称,则逐步倒序替换临时数据表的名称,将临时数据表的名称替换为生成该临时数据表的“与查询有关的sql代码”,直至拼接好的与查询有关的sql代码中不再有任何临时数据表的名称。这是针对临时数据表的解决方案。进一步地,所述步骤s2中,每个链表中的第一个数据集对象一定对应着读取操作的sql代码。进一步地,所述步骤s2中,从每个链表中的最后一个数据集对象对应的写入操作的sql代码朝着该链表中的第一个数据集对象对应的读取操作的sql代码的方向进行倒序的拼接;未在该链表中出现的数据集对象对应的“与查询有关的sql代码”不参与拼接。进一步地,所述步骤s2执行完毕后,每一段拼接好的与查询有关的sql代码都是从读取操作开始,到写入操作结束,中间包含一项或多项中间转换操作;所述中间转换操作包括选择操作、去重操作、别名操作、自定义函数的任一项或多项。进一步地,所述步骤s3中,在antlr生成具体语法树时选择一种包含有选择操作的sql匹配规则。进一步地,所述步骤s3中,所述字段信息操作是指窗口操作、函数操作、并列操作、选择操作的任一种。进一步地,所述步骤s4中,第一中缀表达式中,每个数据字段、每个数据表都作为文字变量,每个数据字段与数据表之间的对应关系作为操作符;union、from、join操作符既表征所访问的具体语法树的每一节点属于哪一层,也表征具体语法树的每一层中每个数据字段与数据表之间的对应关系;union操作符表示合并关系,from操作符表示来源关系,join操作符表示扩展关系。这里说明了第一中缀表达式的格式含义。进一步地,所述步骤s4中,在访问到具体语法树的每一层的fromcluase节点时,读取到该层的namedexpressionseq节点与该层的fromcluase节点的子节点tablerelation节点的关联关系;一旦访问到具体语法树的某一层中的join节点时,将该层的所有join节点与该层的namedexpressionseq节点中记录的信息合并为该层的完整的数据字段信息,将该层的所有join节点的子节点tablerelation节点与该层的fromcluase节点的子节点tablerelation节点中记录的信息合并为该层的完整的数据表信息。这里说明了第一中缀表达式如何反映所访问的具体语法树的每一节点属于哪一层、所访问的具体语法树的每一层中数据字段与数据表之间的对应关系。进一步地,所述步骤s5中,所访问的具体语法树的每个节点记录的信息中或者没有操作符,或者有一个或多个操作符;通过antlr的监听器将所访问的具体语法树的每个节点中所记录的全部操作符作为该节点提取出来的操作符。进一步地,所述步骤s5中,通过antlr的监听器从所访问的具体语法树的每个节点中提取出文字变量;对“*”这个文字变量替换为该“*”在具体语法树的所在层的所有数据字段的总和。进一步地,所述步骤s5中,识别关联信息类型的节点所体现的字段信息操作来确定所访问的具体语法树的每个节点中提取出来的所需的文字变量。当关联信息类型的节点所体现的字段信息操作是窗口操作时,将该节点所记录的第一个文字变量作为该节点提取出来的所需的文字变量。当关联信息类型的节点所体现的字段信息操作是函数操作时,将最里层的操作符所对应的文字变量作为该节点提取出来的所需的文字变量。当关联信息类型的节点所体现的字段信息操作是并列操作时,将该节点所记录的所有文字变量作为该节点提取出来的所需的文字变量。当关联信息类型的节点所体现的字段信息操作是选择操作时,将该节点所记录的唯一文字变量作为该节点提取出来的所需的文字变量。进一步地,所述步骤s6中,将后缀表达式中所有的文字变量在运算过程中逐一替换为文字对象;文字对象是指一个存储空间,其中保存了文字变量的内容及一个链表;文字对象中的链表一开始为空,随着后缀表达式的运算逐一添加内容;当执行from操作符的运算时,在from操作符前面的文字对象的链表中增加from操作符后面的文字对象的地址;当执行union操作符的运算时,在union操作符前面的文字对象的链表中增加union操作符后面的文字对象的地址;当执行join操作符的运算时,将join操作符前面和后面的两个文字对象合并为一个新的文字对象集合,后续对该文字对象集合的运算等同于对文字对象的运算。进一步地,所述步骤s6中,后缀表达式的运算结果是一个文字对象或文字对象集合,文字对象中的链表、或文字对象集合中的每个文字对象中的链表记录了后缀表达式的运算过程中所涉及的全部文字对象的地址,由此可以按照从后往前的顺序追溯每个目标数据字段的来源及变化过程,即实现了目标数据字段的血缘分析。与所述基于antlr的数据字段血缘分析方法相对应地,本申请还提出了一种基于antlr的数据字段血缘分析装置,包括sql转换单元、拼接单元、语法树生成单元、访问单元、扩充单元和后缀转换单元。所述sql转换单元用来采用sql查询构造器将程序代码中与查询有关的非sql代码自动转换为sql的形式,然后执行每一段与查询有关的sql代码以生成一个对应的数据集,为每一个数据集创建对应的数据集对象。所述拼接单元用来为每一个数据集对象打上表征其存储地址的水印,当结果数据集是在源数据集中执行查询得到的结果,则在结果数据集对象中记录原始数据集对象的水印;根据执行查询过程的源数据集、结果数据集关系,在对应的数据集对象之间形成链表,链表中的后一数据集对象记载前一数据集对象的水印;将写入操作的sql代码对应的数据集对象作为一个链表的最后一个数据集对象,将每个链表中所有数据集对象对应的“与查询有关的sql代码”进行拼接。所述语法树生成单元用来将每一段“拼接好的与查询有关的sql代码”送入antlr以生成具体语法树,生成时明确antlr的sql匹配规则;将具体语法树的所有节点分为字段信息类型、表格信息类型、关联信息类型三类;其中关联信息类型的节点或者关联到字段信息类型的节点,或者关联到表格信息类型的节点;所述关联信息类型的节点或者能够体现字段信息操作,或者不能体现字段信息操作。所述访问单元用来在具体语法树中进行裁枝式访问,完成裁枝式访问后生成第一中缀表达式;第一中缀表达式中记录了所访问的具体语法树的每一节点属于哪一层、以及所访问的具体语法树的每一层中数据字段与数据表之间的对应关系;所述裁枝式访问是指:从树根节点开始按照深度遍历方式访问,当访问到某个节点a时,如果节点a的下一层节点包含关联信息类型的节点且所述关联信息类型的节点无法体现字段信息操作时,不再访问节点a的下一层节点;否则继续按照深度遍历方式访问节点a的下一层节点。所述扩充单元用来从所访问的具体语法树的每个节点中提取出操作符和所需的文字变量,将能够体现字段信息操作的关联信息类型的节点中提取出的操作符和所需的文字变量按顺序增加到第一中缀表达式中,将第一中缀表达式扩充为第二中缀表达式。所述后缀转换单元用来将第二中缀表达式转换为后缀表达式;后缀表达式的运算结果是一个或多个数据字段,就是所述拼接单元处理的每一段写入操作的sql代码所对应的数据集对象中的全部数据字段,称为目标数据字段;后缀表达式的运算结果完整记录了所述每个目标数据字段的来源及变化过程,即实现了目标数据字段的血缘分析。本申请取得的技术效果除了实现了数据字段级别的血缘分析以外,还包括如下方面。第一,本申请将据与查询有关的程序代码全部转换为sql,对每段与查询有关的sql代码对应的数据集对象都标记水印,在拼接sql时不会出现识别错位、乱序或识别错误。第二,本申请在后缀表达式运算时为每个文字变量赋予了文字对象,文字对象中的链表记录了将该文字变量所用到的处理函数、所属数据表名,在sql中的别名以及它的父级数据字段信息。第三,本申请可用于定位分析。当程序运行出错或者某个指标(即有业务价值的数据字段)出现较大的波动时,可以清楚地知道是数据表中哪个数据字段的异常变化导致的问题发生,可以精确定位到数据字段级别排错。第四,本申请可用于差异分析。数据字段的血缘记录了一个数据字段的具体生成逻辑,相同性质的业务对应的结果产出数据字段地过程往往有着较为相似的逻辑。通过差异分析,业务人员可以更为敏锐地感知捕捉局部差异对后续业务评价指标带来的影响。第五,本申请可用于数据评估。通过数据字段血缘分析和元数据,可以从数据的集中度、分布、冗余度、数据热度、重要性等多角度进行评估分析,从而初步判断数据的价值。附图说明图1是本申请提出的基于antlr的数据字段血缘分析方法的流程示意图。图2是本申请提出的基于antlr的数据字段血缘分析装置的结构示意图。图中附图标记说明:sql转换单元1、拼接单元2、语法树生成单元3、访问单元4、扩充单元5、后缀转换单元6。具体实施方式请参阅图1,本申请提出的基于antlr的数据字段血缘分析方法包括如下步骤。步骤s1:采用sql查询构造器(sqlquerybuilder,也称sql查询编译器)将程序代码中与查询有关的非sql代码自动转换为sql的形式,然后执行每一段与查询有关的sql代码以生成一个与“该段与查询有关的sql代码”相对应的数据集,为每一个数据集创建对应的数据集对象。优选地,通过sql查询构造器内置的compile(编译)函数将程序代码中与查询有关的非sql代码自动转换为sql的形式。人工将非sql代码转换为sql代码容易因为主观因素造成查询语言的误拼接,由计算机自动执行在很大程度上改善了这个问题。程序代码分为“与查询有关的代码”和“与查询无关的代码”两部分。其中“与查询有关的代码”例如包括读取操作的代码、写入操作的代码、选择操作的代码、去重操作的代码、别名操作的代码、某些自定义函数的代码等。所述“与查询有关的代码”又分为两小部分:第一小部分已经是sql代码,第二小部分不是sql代码。这一步将“与查询有关的代码”中的非sql代码通过sql查询构造器自动转换为sql代码,执行完毕后“与查询有关的代码”全部成为了sql代码。后续步骤的“sql代码”全部表示“与查询有关的sql代码”的含义。该项操作的优势在于:通过记录“与查询有关的sql代码”的查询过程就可以获得查询过程执行的所有操作,不会丢失中间信息。数据集是指在数据库中按照“与查询有关的sql代码”查询数据表的列得出的符合查询条件的结果。数据集与“与查询有关的sql代码”之间为一一对应的关系。数据集对象是数据集的存储空间,数据集对象与数据集之间也为一一对应的关系。因此,数据集对象与“与查询有关的sql代码”之间也为一一对应的关系。这一步在执行“与查询有关的sql代码”的过程中可能会生成临时数据表,临时数据表相当于是已有的数据集的别名。临时数据表与数据集的区别在于:临时数据表可被引用,而数据集不能被引用。在每次生成临时数据表时,记录临时数据表的生成顺序。步骤s2:为每一个数据集对象打上水印,水印是指该数据集对象的存储地址。当一个数据集(称为结果数据集)是在另一个数据集(称为源数据集)中执行查询过程而得到的结果,则在结果数据集对象中记录原始数据集对象的水印。根据执行查询过程的源数据集、结果数据集关系,在对应的数据集对象之间形成链表,链表中的后一数据集对象记载前一数据集对象的水印。将写入操作的sql代码对应的数据集对象作为一个链表的最后一个数据集对象,将每个链表中所有数据集对象对应的“与查询有关的sql代码”进行拼接。因为每个数据集对象存储在不同位置,因此每个数据集对象的水印都是不同的。对任意数据集对象进行操作时都会读取其水印(即读取其存储地址)。当第二数据集是在第一数据集中执行查询过程而得到的结果,就在第二数据集对象中记录第一数据集对象的水印。当第三数据集是在第二数据集中执行查询过程而得到的,就在第三数据集对象中记录第二数据集对象的水印。以此类推,这样就在第一数据集对象、第二数据集对象、第三数据集对象之间形成了链表数据结构,链表中的元素均为数据集对象。链表中的第一个元素是第一数据集对象。链表中的第二个元素是第二数据集对象,所述第二数据集对象中记录第一数据集对象的水印。链表中的第三个元素是第三数据集对象,所述第三数据集对象中记录第二数据集对象的水印。因此,链表中前一个数据集对象的水印传导到下一个数据集对象中。当发现某个数据集对象对应着写入操作的sql代码,就将该数据集对象作为一个链表中的最后一个数据集对象,而每个链表中的第一个数据集对象一定对应着读取操作的sql代码。在写入操作的sql代码后方的sql代码所对应的数据集对象用于构成新的一个链表,或者不在任何链表中。将每个链表中所有数据集对象对应的“与查询有关的sql代码”进行拼接,优选地是从每个链表中的最后一个数据集对象对应的写入操作的sql代码朝着该链表中的第一个数据集对象对应的读取操作的sql代码的方向进行倒序的拼接。未在该链表中出现的数据集对象对应的“与查询有关的sql代码”不参与拼接。拼接之前是多段执行单项操作的sql代码,例如执行读取操作、写入操作、中间的转换操作(例如选择操作、去重操作、别名操作、某些自定义函数)等。拼接之后是一段完整的“与查询有关的sql代码”,从执行读取操作开始,到执行写入操作结束,中间可能包含一项或多项读取操作、中间转换操作等。一个链表对应着一段拼接好的“与查询有关的sql代码”。最简单的链表仅包含三个元素,分别对应着读取操作的sql代码、一项中间转换操作的sql代码、写入操作的sql代码。复杂的链表大于三个元素,其中写入操作的sql代码生成的数据集对应的数据集对象仅有一个且在最后,读取操作和中间转换操作生成的数据集对应的数据集对象可能有一个或多个。如果在拼接“与查询有关的sql代码”的过程中出现了临时数据表的名称,则逐步倒序替换临时数据表的名称,将临时数据表的名称替换为生成该临时数据表的“与查询有关的sql代码”,直至拼接好的与查询有关的sql代码中不再有任何临时数据表的名称。所述倒序是指从每个链表中的最后一个数据集对象对应的写入操作的sql代码朝着该链表中的第一个数据集对象对应的读取操作的sql代码的方向进行倒序的拼接。步骤s3:将每一段“拼接好的与查询有关的sql代码”送入antlr以生成具体语法树,生成时明确antlr的sql匹配规则。antlr生成具体语法树可以匹配多种sql匹配规则,包括声明式sql匹配规则、查询式sql匹配规则等几十种。部分sql匹配规则中包含有选择(select)操作。为避免干扰,这一步在antlr生成具体语法树时选择一种包含有选择操作的sql匹配规则。antlr基于所选定的sql匹配规则以及输入的每一段拼接好的“拼接好的与查询有关的sql代码”生成对应的一颗具体语法树,也就是把符合sql匹配规则的一段“拼接好的与查询有关的sql代码”解析成树状结构。树状结构由树根节点开始(树根节点不属于任何一层)、依次有第一层节点、第二层节点、……、直至树叶节点。每一层节点都包含namedexpressionseq节点和fromclause节点。namedexpressionseq节点记载的是该层的所有数据字段。fromclause节点一定具有子节点tablerelation节点。fromclause节点的子节点tablerelation节点记载的是该fromclause节点所在层的一张数据表。fromclause节点记载的是该层的namedexpressionseq节点中的数据字段是来自于该fromclause节点的子节点tablerelation节点所记录的该层的一张数据表。每一层节点中还可能包含一个或多个join节点,join节点用于扩展记录的未在namedexpressionseq节点记录的该层的数据字段。每个join节点一定具有子节点tablerelation节点。每个join节点所记录的数据字段信息来源于其子节点tablerelation节点所记录的该层的一张数据表。每个join节点的子节点tablerelation节点所记录的该层的一张数据表与该层的fromclause节点的子节点tablerelation节点所记录的该层的一张数据表可能为同一张数据表,或不同数据表。多个join节点的子节点tablerelation节点所记录的该层的一张数据表也可能为同一张数据表,或不同数据表。生成具体语法树后,本申请将所有节点分为字段信息类型、表格信息类型、关联信息类型共三类。其中关联信息类型的节点或者关联到字段信息类型的节点,或者关联到表格信息类型的节点。所述关联信息类型的节点或者能够体现字段信息操作,或者不能体现字段信息操作。所述字段信息操作是指窗口操作、函数操作、并列操作、选择操作的任一种。步骤s4:在具体语法树中进行裁枝式访问,完成裁枝式访问后生成第一中缀表达式。第一中缀表达式中记录了所访问的具体语法树的每一节点属于哪一层、以及所访问的具体语法树的每一层中数据字段与数据表之间的对应关系。第一中缀表达式所记录的最小单元是具体语法树中的节点。第一中缀表达式中,每个数据字段、每个数据表都作为文字变量,每个数据字段与数据表之间的对应关系作为操作符。所述所访问的具体语法树的每一节点属于哪一层由第一中缀表达式中的union、from、join操作符表征,所述所访问的具体语法树的每一层中每个数据字段与数据表之间的对应关系也由第一中缀表达式中的union、from、join操作符表征。union操作符表示合并关系,from操作符表示来源关系,join操作符表示扩展关系。现有技术中,antlr的访问器对具体语法树的访问顺序是深度遍历,从树根节点到树叶节点遍历完毕后无法了解所经过的中间节点的具体执行过程及中间节点之间的关联关系。本申请从树根节点开始按照深度遍历方式访问,当访问到某个节点a时,如果节点a的下一层节点包含关联信息类型的节点且所述关联信息类型的节点无法体现字段信息操作时,不再访问节点a的下一层节点;如果节点a的下一层节点未包含关联信息类型的节点,或者节点a的下一层节点包含关联信息类型的节点且所述关联信息类型的节点能够体现字段信息操作时,继续按照深度遍历方式访问节点a的下一层节点。这就是本申请提出的在具体语法树中进行裁枝式访问的含义,该操作用来记录所访问的具体语法树的每一节点属于哪一层,用来了解中间节点的具体执行过程。省略掉的不访问的节点对数据字段血缘分析没有帮助,故而省略。本申请在访问到每一层的fromcluase节点时,读取到该层的namedexpressionseq节点与该层的fromcluase节点的子节点tablerelation节点的关联关系。一旦访问到某一层中的join节点时,将该层的所有join节点与该层的namedexpressionseq节点中记录的信息合并为该层的完整的数据字段信息,将该层的所有join节点的子节点tablerelation节点与该层的fromcluase节点的子节点tablerelation节点中记录的信息合并为该层的完整的数据表信息。该操作用于记录所访问的具体语法树的每一层包含有哪些数据字段和哪些数据表、以及记录所访问的具体语法树的每一层中数据字段与数据表之间的对应关系,用来了解中间节点之间的关联关系。步骤s5:从所访问的具体语法树的每个节点中提取出操作符和所需的文字变量,将第一中缀表达式扩充为第二中缀表达式。扩充方式是将能够体现字段信息操作的关联信息类型的节点中提取出的操作符和所需的文字变量按顺序增加到第一中缀表达式中,形成第二中缀表达式。对于字段信息类型的节点、表格信息类型的节点、不能体现字段信息操作的关联信息类型的节点,无需在第一中缀表达式中进行扩充。第二中缀表达式所记录的最小单元是具体语法树中的节点内部的操作。通过antlr的监听器可以从所访问的具体语法树的每个节点中提取出操作符和文字变量。每个节点记录的信息中可能没有操作符,也可能有一个或多个操作符;通过antlr的监听器将所访问的具体语法树的每个节点中所记录的全部操作符作为该节点提取出来的操作符。本申请仅对“*”这个文字变量进行特殊处理。现有技术直接将“*”这个文字变量识别为star(星号)。本申请是将“*”这个文字变量替换为该“*”在具体语法树的所在层的所有数据字段的总和。现有技术无法确定从所访问的具体语法树的每个节点中提取出的文字变量中哪些是所需的文字变量。本申请通过识别关联信息类型的节点所体现的字段信息操作来确定所需的文字变量。对于字段信息类型的节点、表格信息类型的节点,无需提取操作符和所需的文字变量。对于不体现字段信息操作的关联信息类型的节点,在步骤s4中已经省略访问,也无需提取操作符和所需的文字变量。这一步用来了解每一个中间节点内部的多个执行环节之间的内在联系。当关联信息类型的节点所体现的字段信息操作是窗口操作时,该节点记录的信息中仅有一个操作符,该操作符之前仅有一个文字变量,即该节点所记录的第一个文字变量;该操作符之后的所有文字变量均用来为第一个文字变量提供辅助信息。该节点所记录的第一个文字变量作为该节点提取出来的所需的文字变量。当关联信息类型的节点所体现的字段信息操作是函数操作时,该节点记录的信息中或者仅有一个操作符,或者具有多个操作符且这些操作符之间具有嵌套关系;现有技术能够识别操作符之间的嵌套关系,本申请将最里层的操作符所对应的文字变量作为该节点提取出来的所需的文字变量。当关联信息类型的节点所体现的字段信息操作是并列操作时,该节点记录的信息中或者仅有一个操作符,或者具有多个操作符且这些操作符之间为并列关系;本申请将该节点所记录的所有文字变量作为该节点提取出来的所需的文字变量。当关联信息类型的节点所体现的字段信息操作是选择操作时,该节点记录的信息中没有操作符,该节点记录的信息仅有一个文字变量。本申请将该节点所记录的唯一文字变量作为该节点提取出来的所需的文字变量。步骤s6:将第二中缀表达式转换为后缀表达式。每一段“拼接好的与查询有关的sql代码”生成一颗具体语法树,每颗具体语法树对应一个第一中缀表达式,每个第一中缀表达式对应一个第二中缀表达式,每个第二中缀表达式对应一个后缀表达式。因此,每颗具体语法树对应一个后缀表达式。后缀表达式的运算结果是一个或多个数据字段,这一个或多个数据字段就是步骤s2中每一段“拼接好的与查询有关的sql代码”中写入操作的sql代码所对应的数据集对象中的全部数据字段,可能是一个或多个数据字段,称为目标数据字段。后缀表达式的运算结果完整记录了所述每个目标数据字段的来源及变化过程,即实现了目标数据字段的血缘分析。转换后的后缀表达式中的操作符均为二元操作符,也就是对两个文字变量进行操作。二元操作符输入是两个文字变量,其中一个在二元操作符之前,另一个在二元操作符之后;输出是一个文字变量。将后缀表达式中所有的文字变量在运算过程中逐一替换为文字对象。文字对象是指一个存储空间,其中保存了文字变量的内容及一个链表。文字对象中的链表一开始为空,随着后缀表达式的运算逐一添加内容。当执行from操作符的运算时,在from操作符前面的文字对象的链表中增加from操作符后面的文字对象的地址。当执行union操作符的运算时,在union操作符前面的文字对象的链表中增加union操作符后面的文字对象的地址。当执行join操作符的运算时,将join操作符前面和后面的两个文字对象合并为一个新的文字对象集合,后续对该文字对象集合的运算等同于对文字对象的运算。后缀表达式的运算结果是一个文字对象或文字对象集合,文字对象中的链表、或文字对象集合中的每个文字对象中的链表记录了后缀表达式的运算过程中所涉及的全部文字对象的地址,由此可以按照从后往前的顺序追溯每个目标数据字段的来源及变化过程,即实现了目标数据字段的血缘分析。如果后缀表达式的运算结果是一个文字对象,该文字对象就对应于每一段“拼接好的与查询有关的sql代码”中写入操作的sql代码所对应的数据集对象中的唯一数据字段。如果后缀表达式的运算结果是一个文字对象集合,该文字对象集合就对应于每一段“拼接好的与查询有关的sql代码”中写入操作的sql代码所对应的数据集对象中的多个数据字段。请参阅图2,本申请提出的基于antlr的数据字段血缘分析装置包括sql转换单元1、拼接单元2、语法树生成单元3、访问单元4、扩充单元5和后缀转换单元6。图2所示装置与图1所示方法相对应。所述sql转换单元1用来采用sql查询构造器将程序代码中与查询有关的非sql代码自动转换为sql的形式,然后执行每一段与查询有关的sql代码以生成一个对应的数据集,为每一个数据集创建对应的数据集对象。所述拼接单元2用来为每一个数据集对象打上表征其存储地址的水印,当结果数据集是在源数据集中执行查询得到的结果,则在结果数据集对象中记录原始数据集对象的水印;根据执行查询过程的源数据集、结果数据集关系,在对应的数据集对象之间形成链表,链表中的后一数据集对象记载前一数据集对象的水印;将写入操作的sql代码对应的数据集对象作为一个链表的最后一个数据集对象,将每个链表中所有数据集对象对应的“与查询有关的sql代码”进行拼接。所述语法树生成单元3用来将每一段“拼接好的与查询有关的sql代码”送入antlr以生成具体语法树,生成时明确antlr的sql匹配规则;将具体语法树的所有节点分为字段信息类型、表格信息类型、关联信息类型三类;其中关联信息类型的节点或者关联到字段信息类型的节点,或者关联到表格信息类型的节点;所述关联信息类型的节点或者能够体现字段信息操作,或者不能体现字段信息操作。所述访问单元4用来在具体语法树中进行裁枝式访问,完成裁枝式访问后生成第一中缀表达式;第一中缀表达式中记录了所访问的具体语法树的每一节点属于哪一层、以及所访问的具体语法树的每一层中数据字段与数据表之间的对应关系。所述裁枝式访问是指:从树根节点开始按照深度遍历方式访问,当访问到某个节点a时,如果节点a的下一层节点包含关联信息类型的节点且所述关联信息类型的节点无法体现字段信息操作时,不再访问节点a的下一层节点;否则继续按照深度遍历方式访问节点a的下一层节点。所述扩充单元5用来从所访问的具体语法树的每个节点中提取出操作符和所需的文字变量,将能够体现字段信息操作的关联信息类型的节点中提取出的操作符和所需的文字变量按顺序增加到第一中缀表达式中,将第一中缀表达式扩充为第二中缀表达式。所述后缀转换单元6用来将第二中缀表达式转换为后缀表达式;后缀表达式的运算结果是一个或多个数据字段,就是所述拼接单元2处理的每一段写入操作的sql代码所对应的数据集对象中的全部数据字段,称为目标数据字段;后缀表达式的运算结果完整记录了所述每个目标数据字段的来源及变化过程,即实现了目标数据字段的血缘分析。与现有技术相比,本申请提出的基于antlr的数据字段血缘分析方法及装置具有如下有益效果。第一,现有技术直接根据查询需求在数据库中执行查询,中间的查询过程是不可知的,如用于数据字段血缘分析就会存在断层,无法实现数据字段血缘分析。本申请是将查询需求全部转换为sql,通过记录sql的查询过程避免了断层,从而实现数据字段血缘分析。第二,antlr提供了一个生成语法树的平台,现有技术无法处理每个节点的执行逻辑,无法了解节点之间的关联性,因此从树根节点到树叶节点遍历完毕后无法了解所经过的中间节点的具体执行过程及中间节点之间的关联关系。本申请的步骤s4在语法树中自动处理访问到每个节点的执行逻辑,从而使节点之间建立关联性,因此从树根节点到树叶节点遍历完毕后能够记录所经过的中间节点的具体执行过程及中间节点之间的关联关系。第三,现有的antlr监听器能够记录每一个中间节点内部的具体执行过程(由多个执行环节组成),但不能记录每一个中间节点内部的多个执行环节之间的内在联系。本申请的步骤s5不仅能够记录每一个中间节点内部的具体执行过程,而且能够记录每一个中间节点内部的多个执行环节之间的内在联系。第四,语法树从树根节点到树叶节点遍历完毕后所记录的信息不采用中缀表达式(infixnotation),因为其无法满足复杂信息的处理,计算机处理速度慢,计算机的判断容易出错。本申请的步骤s6采用后缀表达式(postfixnotation)处理。后缀表达式避免了复杂的深层递归,更适合由计算机处理,计算机处理速度更快,计算机的判断更为精准。以上仅为本申请的优选实施例,并不用于限定本申请。对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1