一种映射关系生成方法及装置与流程

文档序号:18475351发布日期:2019-08-20 20:57阅读:159来源:国知局
一种映射关系生成方法及装置与流程
本发明涉及计算机及数据库领域,尤其涉及一种映射关系生成方法及装置。
背景技术
:数据抽取、转换、装载(extract-transform-load,etl)技术作数据仓库(datawarehouse,dw)的核心和灵魂,负责数据从数据源向目标数据仓库转化的过程,即从数据源抽取出所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库中去,其中,dw用于对企业的联机事务处理(on-linetransactionprocessing,oltp)系统产生的数据进行整合,发掘其中的商业价值,为企业提供决策支持。在以结构化查询语言(structuredquerylanguage,sql)脚本为主的etl技术中,需要对sql程序进行解析以提取sql语法书中sql元素,根据提取到的sql元素生成表级映射关系以及字段级映射关系。现有技术中,通过对sql程序解析后得到的sql元素按照出现顺序编号,根据sql元素的编号以及相应规则生成表级映射关系以及字段级映射关系,sql元素编号的正确性直接影响映射关系的正确性。因此,根据sql基础元素对象的编号以及相应规则生成表级映射关系以及字段级映射关系,容易导致映射关系出错,尤其针对复杂的sql程序。以连接查询为例,假设表a由表b与表c连接生成,即[b,c]→a,在抽象语法树(abstractsyntaxtree,ast)中,表b与表c的顺序为先得到表b,然后得到表c,即b→c→a,使得表b与表c的编号不一样,进而导致根据表b与表c的编号生成的映射关系发生错误。技术实现要素:本发明实施例提供一种映射关系生成方法及装置,以解决现有技术中根据sql元素的编号生成映射关系准确性较低的问题。本发明实施例提供的具体技术方案如下:第一方面,本发明实施例提供了一种映射关系生成方法,包括:对结构化查询语言sql程序进行语法分析,构建所述sql程序的抽象语法树ast;递归遍历所述ast,获取每次递归得到的sql元素的信息,所述sql元素的信息至少包括表名和字段名;根据获取到的sql元素的信息建立并保存第一集合;其中,所述第一集合中的第i个键值对用于保存第j次递归得到的sql元素的信息,所述第i个键值对中的键至少包括所述第j次递归得到的表名,所述第i个键值对中的值至少包括所述第j次递归得到的字段名,i=1,2,…n,j=1,2,…n,n为递归次数,i、j、n为正整数;根据所述第一集合生成映射关系。可选地,若所述第j次递归得到的sql元素的信息还包括子查询名、表别名和/或字段别名,则所述第i个键值对中的键还包括所述第j次递归得到的子查询名和/或表别名,所述第i个键值对中的值还包括所述第j次递归得到的表别名和/或字段别名。可选地,当所述映射关系为表级映射关系时,根据所述第一集合生成映射关系,包括:解析所述第i个键值对中的键,若所述第i个键值对的键中包括子查询名或第一表名,则将所述第i个键值对的键中包括的子查询名或第一表名确定为第二集合的键,否则将所述第i个键值对的键中第二表名确定为第二集合的键;其中,所述第一表名为所述sql程序中创建的表的表名,所述第二表名为所述sql程序中包括的除所述第一表名外的表名,所述第二集合用于保存所述表级映射关系;解析所述第i个键值对中的值,当所述第i个键值对的值中包括表别名时,根据所述第i个键值对的值中包括的表别名查询第三集合,若查到所述第i个键值对的值中包括的表别名对应的表名,则将所述第i个键值对的值中包括的表别名对应的表名确定为所述第二集合的键对应的值,否则将所述第i个键值对的值中包括的表别名确定为所述第二集合的键对应的值,其中,所述第三集合用于保存所述sql程序中表名与表别名的对应关系;当所述第i个键值对中的值中不包括表别名时,将所述第i个键值对的键中包括的第二表名确定为所述第二集合的键对应的值。可选地,当所述映射关系为表级映射关系时,根据所述第一集合生成映射关系,包括:解析所述第i个键值对中的键,若所述第i个键值对的键中包括子查询名或第一表名,则将所述第i个键值对的键中包括的子查询名或第一表名确定为第二集合的键,否则将所述第i个键值对的键中包括的第二表名确定为第二集合的键,所述第一表名为所述sql程序中所创建的表的表名,所述第二表名为所述sql程序中除所述第一表名外的表名,所述第二集合用于保存所述表级映射关系;若所述第i个键值对的键中包括第一表名,则解析所述第i个键值对中的值,当所述第i个键值对的值中包括表别名时,根据所述第i个键值对的值中包括的表别名查询第三集合,若查到所述第i个键值对的值中包括的表别名对应的表名,则将所述第i个键值对的值中包括的表别名对应的表名确定为所述第二集合的键对应的值,否则将所述第i个键值对的值中包括的表别名确定为所述第二集合的键对应的值,其中,所述第三集合用于保存所述sql程序中表名与表别名的对应关系;当所述第i个键值对中的键中不包括第一表名时,将所述第i个键值对的键中包括的第二表名确定为所述第二集合的键对应的值。可选地,当所述映射关系为字段级映射关系时,根据所述第一集合生成映射关系,包括:解析所述第i个键值对,当所述第i个键值对的值中包括表/别名时,根据所述第i个键值对的值中包括的表别名查询第三集合,若查找到所述第i个键值对的值中包括的表别名对应的表名,将所述第i个键值对的值中包括的表别名对应的表名确定为源子查询名/表名,否则,将所述第i个键值对的值中包括的表别名确定为源查子询名/表名;当所述第i个键值对的值中不包括表别名时,将所述第i个键值对的键中包括的第二表名确定为源子查询名/表名,其中,所述第二表名为所述sql程序中除第一表名外的表名,所述第一表名为所述sql程序中所创建的表的表名;若所述第i个键值对中的键包括子查询名或第一表名,则将所述第i个键值对的键中包括的子查询名或第一表名确定为所述源子查询名/表名对应的目标子查询名/表名,否则,将所述第i个键值对的键中包括的第二表名确定为目标子查询名/表名,所述第一表名为所述sql程序中创建的表的表名;将所述第i个键值对的值中包括的字段名确定为源字段名;若所述第i个键值对的值中包括字段别名,则将所述第i个键值对的值中包括的字段别名确定为所述源字段名对应的目标字段名,否则,将所述第i个键值对的值中包括的字段名确定为所述源字段名对应的目标字段名;根据所述目标子查询名/表名、所述目标字段名、所述源子查询名/表名以及所述源字段名,生成字段级映射关系。可选地,根据所述第i个键值对的值中包括的表别名查询第三集合之前,还包括:解析所述第i个键值对的键,若所述第i个键值对的键包括表别名,则将所述第i个键值对的键中包括的表别名确定为所述第三集合中的键,否则将所述第i个键值对的键中包括的第二表名确定为所述第三集合中的键;将所述第i个键值对的键中包括的第二表名确定为所述第三集合中的键对应的值,得到所述第三集合。可选地,所述第i个键值对中的键包括第一字段、第二字段和第三字段,所述第一字段用于保存子查询名或第一表名,所述第二字段用于保存第二表名,所述第三字段用于保存表别名;所述第i个键值对的值中任意一个元素包括第四字段、第五字段和第六字段,所述第四字段用于保存表别名、所述第五字段用于保存字段名,所述第六字段用于保存字段别名;其中,若所述第j次递归未得到子查询名以及第一表名,则所述第i个键值对的第一字段用所述第j次递归得到的第二表名表示;若所述第j次递归未得到表别名,则所第i个键值对的第三字段以及第四字段用第一设定字符标识或者所述第j次递归得到的表名表示;若所述第j次递归未得到字段别名,则所述第i个键值对的第六字段用第二设定字符标识。第二方面,本发明实施例提供了一种用于生成映射关系的装置,包括:语法树建立模块,用于对结构化查询语言sql程序进行语法分析,构建所述sql程序的抽象语法树ast;信息获取模块,用于递归遍历所述ast,获取每次递归得到的sql元素的信息,所述sql元素的信息至少包括表名和字段名;处理模块,用于根据获取到的sql元素的信息建立并保存第一集合,以及根据所述第一集合生成映射关系;其中,所述第一集合中的第i个键值对用于保存第j次递归得到的sql元素的信息,所述第i个键值对中的键至少包括所述第j次递归得到的表名,所述第i个键值对中的值至少包括所述第j次递归得到的字段名,i=1,2,…n,j=1,2,…n,n为递归次数,i、j、n为正整数。可选地,若所述第j次递归得到的sql元素的信息还包括子查询名、表别名和/或字段别名,则所述第i个键值对中的键还包括所述第j次递归得到的子查询名和/或表别名,所述第i个键值对中的值还包括所述第j次递归得到的表别名和/或字段别名。可选地,所述处理模块具体用于:解析所述第i个键值对中的键,若所述第i个键值对的键中包括子查询名或第一表名,则将所述第i个键值对的键中包括的子查询名或第一表名确定为第二集合的键,否则将所述第i个键值对的键中包括的第二表名确定为第二集合的键;其中,所述第一表名为所述sql程序中创建的表的表名,所述第二表名为所述sql程序中包括的除所述第一表名外的表名,所述第二集合用于保存所述表级映射关系;解析所述第i个键值对中的值,当所述第i个键值对的值中包括表别名时,根据所述第i个键值对的值中包括的表别名查询第三集合,若查到所述第i个键值对的值中包括的表别名对应的表名,则将所述第i个键值对的值中包括的表别名对应的表名确定为所述第二集合的键对应的值,否则将所述第i个键值对的值中包括的表别名确定为所述第二集合的键对应的值,其中,所述第三集合用于保存所述sql程序中表名与表别名的对应关系;当所述第i个键值对中的值中不包括表别名时,将所述第i个键值对的键中包括的第二表名确定为所述第二集合的键对应的值。可选地,所述处理模块具体用于:解析所述第i个键值对中的键,若所述第i个键值对的键中包括子查询名或第一表名,则将所述第i个键值对的键中包括的子查询名或第一表名确定为第二集合的键,否则将所述第i个键值对的键中包括的第二表名确定为第二集合的键,所述第一表名为所述sql程序中所创建的表的表名,所述第二表名为所述sql程序中除所述第一表名外的表名,所述第二集合用于保存所述表级映射关系;若所述第i个键值对的键中包括第一表名,则解析所述第i个键值对中的值,当所述第i个键值对的值中包括表别名时,根据所述第i个键值对的值中包括的表别名查询第三集合,若查到所述第i个键值对的值中包括的表别名对应的表名,则将所述第i个键值对的值中包括的表别名对应的表名确定为所述第二集合的键对应的值,否则将所述第i个键值对的值中包括的表别名确定为所述第二集合的键对应的值,其中,所述第三集合用于保存所述sql程序中表名与表别名的对应关系;当所述第i个键值对中的键中不包括第一表名时,将所述第i个键值对的键中包括的第二表名确定为所述第二集合的键对应的值。可选地,所述处理模块具体用于:解析所述第i个键值对,当所述第i个键值对的值中包括表别名时,根据所述第i个键值对的值中包括的表别名查询第三集合,若查找到所述第i个键值对的值中包括的表别名对应的表名,将所述第i个键值对的值中包括的表别名对应的表名确定为源子查询名/表名,否则,将所述第i个键值对的值中包括的表别名确定为源查子询名/表名;当所述第i个键值对的值中不包括表别名时,将所述第i个键值对的键中包括的第二表名确定为源子查询名/表名,其中,所述第二表名为所述sql程序中除第一表名外的表名,所述第一表名为所述sql程序中所创建的表的表名;若所述第i个键值对中的键包括子查询名或第一表名,则将所述第i个键值对的键中包括的子查询名或第一表名确定为所述源子查询名/表名对应的目标子查询名/表名,否则,将所述第i个键值对的键中包括的第二表名确定为目标子查询名/表名,所述第一表名为所述sql程序中创建的表的表名;将所述第i个键值对的值中包括的字段名确定为源字段名;若所述第i个键值对的值中包括字段别名,则将所述第i个键值对的值中包括的字段别名确定为所述源字段名对应的目标字段名,否则,将所述第i个键值对的值中包括的字段名确定为所述源字段名对应的目标字段名;根据所述目标子查询名/表名、所述目标字段名、所述源子查询名/表名以及所述源字段名,生成字段级映射关系。可选地,所述处理模块还用于:根据所述第i个键值对的值中包括的表别名查询第三集合之前,解析所述第i个键值对的键,将所述第i个键值对的键中包括的第二表别名确定为所述第三集合中的键,将所述第i个键值对的键中包括的第二表名确定为所述第三集合中的键对应的值,得到所述第三集合。基于上述技术方案,本发明实施例中,对sql程序进行语法分析,构建该sql程序的ast;递归遍历该ast,获取每次递归得到的sql元素的信息;根据获取到的sql元素的信息建立并保存第一集合,根据第一集合生成映射关系,其中,该sql元素的信息至少包括表名和字段名,第一集合中的第i个键值对用于保存第j次递归得到的sql元素的信息,第i个键值对中的键至少包括第j次递归得到的表名,第i个键值对中的值至少包括第j次递归得到的字段名,i=1,2,…n,j=1,2,…n,n为递归次数,i、j、n为正整数。本发明实施例提供的映射关系方法不需要对sql元素进行编号,能够避免因sql元素编号错误导致的映射关系错乱的问题,进而达到提高所生成的映射关系的准确性的目的。附图说明图1为本发明实施例中一种映射关系生成方法的流程示意图;图2为本发明具体实施例中表级映射关系的示意图;图3为本发明具体实施例中字段级映射关系的示意图;图4为本发明实施例中一种用于生成映射关系的装置的结构示意图。具体实施方式为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。本发明实施例提供的映射关系生成方法由具有数据库访问功能的设备执行,如个人计算机、服务器等,适用于sql中的数据定义语言(datadefinitionlanguage,ddl)。本发明实施例中,第一表名为sql程序中所创建的表的表名,第二表名为sql程序中除第一表名之外的表名。第一集合用于保存每次递归sql程序的ast树得到的sql元素的信息,第二集合用于保存表级映射关系,第三集合用于保存sql程序中表名与表别名的对应关系。另外,需要说明的是,在本申请描述中,多个,是指两个或两个以上。和/或,描述关联对象的关联关系,表示可以存在三种关系。例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。“第一”、“第二”等词汇,仅用于区分描述,而不能理解为指示或暗示相对重要性,也不能理解为指示或暗示顺序。参阅图1所示,本发明实施例提供的映射关系生成方法具体包括以下步骤:s101:对sql程序进行语法分析,构建该sql程序的ast。其中,该sql程序用于创建新的表,该新的表是根据数据库中其它的表创建的。s102:递归遍历所构建的ast,获取每次递归得到的sql元素的信息。其中,该sql元素的信息至少包括表名和字段名,该sql元素包括子sql、表以及字段等。s103:根据获取到的sql元素的信息建立并保存第一集合。其中,该第一集合中的第i个键值对用于保存第j次递归得到的sql元素的信息,该第i个键值对中的键(key)至少包括第j次递归得到的表名,该第i个键值对中的值(value)至少包括第j次递归得到的字段名,i=1,2,…n,j=1,2,…n,n为递归总次数,i、j、n为正整数,也就是说,该第一集合中的每个键值对分别用于保存每次递归得到的sql元素信息。需要说明的是,该第一集合中的任意一个键对应一个值,该第一集合的任意一个键对应的值中可以包括一个或多个元素,该第一集合中键值对的存放顺序与递归的次序无关,即i和j可以相同,也可不同。实施中,若第j次递归得到的sql元素的信息还包括子查询名、表别名和/或字段别名,则该第i个键值对中的键还包括第j次递归得到的子查询名和/或表别名,该第i个键值对中的值还包括第j次递归得到的表别名和/或字段别名。具体地,当第j次递归得到的sql元素的信息还包括子查询名,则该第i个键值对中的键还包括第j次递归得到的子查询名;当第j次递归得到的sql元素的信息还包括表别名,则该第i个键值对中的键还包括第j次递归得到的表别名,该第i个键值对的值中的至少一个元素还包括第j次递归得到的表别名;当第j次递归得到的sql元素的信息还包括字段别名,则该第i个键值对的值中的至少一个元素还包括第j次递归得到的字段别名;当第j次递归得到的sql元素的信息还包括子查询名和表别名,则该第i个键值对中的键还包括第j次递归得到的子查询名和表别名,该第i个键值对的值中的至少一个元素还包括第j次递归得到的表别名;当第j次递归得到的sql元素的信息还包括子查询名和字段别名,则该第i个键值对中的键还包括第j次递归得到的子查询名,该第i个键值对的值中的至少一个元素还包括第j次递归得到的字段别名;当第j次递归得到的sql元素的信息还包括子查询名、表别名和字段别名,则该第i个键值对中的键还包括第j次递归得到的子查询名和表别名,该第i个键值对的值中的至少一个元素还包括第j次递归得到的表别名和字段别名。其中,子查询名也是一种表别名。一个具体的实施例中,该第i个键值对中的键包括第一字段、第二字段和第三字段,该第一字段用于保存子查询名或第一表名,该第二字段用于保存第二表名,该第三字段用于保存表别名;该第i个键值对的值中任意一个元素包括第四字段、第五字段和第六字段,该第四字段用于保存表别名、该第五字段用于保存字段名,该第六字段用于保存字段别名。其中,若第j次递归未得到子查询名以及第一表名,则该第i个键值对的第一字段用所述第j次递归得到的表名表示;若第j次递归未得到表别名,则该第i个键值对的第三字段以及第四字段用第一设定字符标识或者第j次递归得到的表名表示;若第j次递归未得到字段别名,则该第i个键值对的第六字段用第二设定字符表示。该第一设定字符和该第二设定字符可以相同,也可以不同,例如该第一设定字符和该第二设定字符可以为“none”。实施中,该第一集合的第i个键值对中的键包括的第一字段、第二字段和第三字段之间可以通过分隔标识符分隔开,该第一集合的第i个键值对中的值包括的第四字段、第五字段和第六字段可以通过分隔标识符分隔开,以便解析该第i个键值对时识别并提取不同字段中保存的内容,其中,该分隔标识符可以为“#”、“$”等。例如,第j次递归所构建的ast得到的sql元素的信息包括子查询名b,表名bill_mon,字段名subs_id、fee_notax以及inc_notax,没有获得表别名和字段别名,则第一集合中的第i个键值对的键为b$bill_mon$bill_mon,第i个键值对的值为none#subs_id#none,none#fee_notax#none和none#inc_notax#none。s104:根据该第一集合生成映射关系。具体地,通过解析该第一集合中的键值对生成映射关系,其中,生成表级映射关系的方法主要包括以下两种:方法一,解析该第一集合中的每个键值对,生成用于保存表级映射关系的第二集合,其中,解析该第一集合中的一个键值对可以得到该第二集合中的一个键值对。该方法主要包括以下步骤:步骤1a:解析该第一集合的第i个键值对中的键,若该第i个键值对的键中包括子查询名或第一表名,则将所述第i个键值对的键中包括的子查询名或第一表名确定为第二集合的键,否则将所述第i个键值对的键中包括的第二表名确定为第二集合的键。步骤2a:解析该第i个键值对中的值,当该第i个键值对的值中包括表别名时,根据该第i个键值对的值中包括的表别名查询第三集合,若查找到该第i个键值对的值中包括的表别名对应的表名,则将该第i个键值对的值中包括的表别名对应的表名确定为该第二集合的键对应的值,否则将该第i个键值对的值中包括的表别名确定为该第二集合的键对应的值;当该第i个键值对中的值中不包括表别名时,将该第i个键值对的键中包括的第二表名确定为该第二集合的键对应的值。例如,当该第一集合中的第i个键值对的键为b$bill_mon$bill_mon,第i个键值对的值为none#subs_id#none,none#fee_notax#none和none#inc_notax#none时,解析第i个键值对的键,确定该第i个键值对的键中包括子查询名,将该第i个键值对的键中子查询名b作为该第二集合中的键,解析第i个键值对的值,确定该第i个键值对的值中不包括表别名,将该第i个键值对的键中的表名bill_mon作为该第二集合中的键对应的值。实施中,若该第i个键值对的值中包括多个元素,则对该第i个键值对的值中的每个元素,执行上述步骤2a,将针对该第i个键值对的值中的所有元素执行上述步骤2a得到的结果,作为根据该第i个键值对中的键所确定的第二集合的键对应的值。方法二、解析该第一集合中的每个键以及包括第一表名的键对应的值,生成用于保存表级映射关系的第二集合。该方法主要包括以下步骤:步骤1b:解析该第一集合的第i个键值对中的键,若该第i个键值对的键中包括子查询名或第一表名,则将该第i个键值对的键中包括的子查询名或第一表名确定为第二集合的键,否则将该第i个键值对的键中包括的第二表名确定为第二集合的键。步骤2b:若该第i个键值对的键中包括第一表名,则解析所述第i个键值对中的值,当该第i个键值对的值中包括表别名时,根据该第i个键值对的值中包括的表别名查询第三集合,若查到该第i个键值对的值中包括的表别名对应的表名,则将该第i个键值对的值中包括的表别名对应的表名确定为该第二集合的键对应的值,否则将该第i个键值对的值中包括的表别名确定为该第二集合的键对应的值;当该第i个键值对中的键中不包括第一表名时,将该第i个键值对的键中包括的第二表名确定为该第二集合的键对应的值。实施中,若该第i个键值对的键中包括第一表名,且该第i个键值对的值中包括多个元素,则对该第i个键值对的值中每个元素,执行上述步骤2b,将针对该第i个键值对的值中的所有元素执行上述步骤2b得到的结果,作为根据该第i个键值对中的键所确定的第二集合的键对应的值。例如,当该第一集合中的第i个键值对的键为b$bill_mon$bill_mon,第i个键值对的值为none#subs_id#none,none#fee_notax#none和none#inc_notax#none时,解析第i个键值对的键,确定该第i个键值对的键中不包括第一表名,将该第i个键值对的键中子查询名b作为该第二集合中的键,将该第i个键值对的键中的表名bill_mon作为该第二集合中的键对应的值。又如,该第一集合中的第i个键值对的键为dm_sum$cust_to_mon$cust_to_mon,第i个键值对的值为a#subs_id#none,b#fee_notax#cnsm_mon_notax,其中dm_sum为第一表名,cust_to_mon为表名,a、b为表别名,subs_id、fee_notax为字段名,cnsm_mon_notax为字段别名,解析第i个键值对的键,确定该第i个键值对的键中包括第一表名,解析该第i个键值对的值,确定该第i个键值对的值中包括表别名,根据该第i个键值对的值中包括表别名a、b查询第三集合,未查询到表别名a、b对应的表名,则将该第i个键值对的值中的表别名a、b作为该第二集合中的键对应的值。需要说明的是,该第二集合中的任意一个键对应的一个值,该第二集合的任意一个键对应的值可以包括一个或多个元素。实施中,生成用于保存字段级映射关系的第二集合之后,可以第一表名为入口,根据该第二集合,逆向得到表级映射关系,以及在页面图像化渲染展示该表级映射关系。具体地,通过解析该第一集合中的每个键值对生成字段级映射关系,主要包括以下步骤:步骤1c:解析第i个键值对,当第i个键值对的值中包括表别名时,根据第i个键值对的值中包括的表别名查询第三集合,若查找到第i个键值对的值中包括的表别名对应的表名,将第i个键值对的值中包括的表别名对应的表名确定为源子查询名/表名,否则,将第i个键值对的值中包括的表别名确定为源查子询名/表名;当第i个键值对的值中不包括表别名时,将第i个键值对的键中包括的第二表名确定为源子查询名/表名。步骤2c:若第i个键值对中的键包括子查询名或第一表名,则将第i个键值对的键中包括的子查询名或第一表名确定为所确定的源子查询名/表名对应的目标子查询名/表名,否则,将第i个键值对的键中包括的第二表名确定为目标子查询名/表名。步骤3c:将第i个键值对的值中包括的字段名确定为源字段名。步骤4c:若第i个键值对的值中包括字段别名,则将第i个键值对的值中包括的字段别名确定为所述源字段名对应的目标字段名,否则,将第i个键值对的值中包括的字段名确定为所确定的源字段名对应的目标字段名。步骤5c:根据所确定的目标子查询名/表名、目标字段名、源子查询名/表名以及源字段名,生成字段级映射关系。实施中,若该第i个键值对的值中包括多个元素,则对该第i个键值对的值中每个元素,执行上述步骤1c-4c,该第i个键值对的值中的一个元素对应一个字段映射关系,生成的字段级映射关系由该第一集合的值中的所有元素对应的字段映射关系构成。需要说明的是,本发明实施例中可以分别解析第i个的键值对的键和值,也可以同时解析第i个的键值对的键和值。另外,本发明实施例并不对确定源子查询名/表名、目标子查询名/表名、源字段名以及目标字段名的先后顺序限定。实施中,在生成映射关系的过程中,根据该第i个键值对的值中包括的表别名查询第三集合之前,还通过以下步骤建立该第三集合:解析该第i个键值对的键,若该第i个键值对的键包括表别名,则将该第i个键值对的键中包括的表别名确定为所述第三集合中的键,否则将该第i个键值对的键中包括的第二表名确定为该第三集合中的键;将该第i个键值对的键中包括的第二表名确定为该第三集合中的键对应的值,得到该第三集合。综上所述,本发明实施例中,对sql程序进行语法分析,构建该sql程序的ast;递归遍历该ast,获取每次递归得到的sql元素的信息;根据获取到的sql元素的信息建立并保存第一集合,根据第一集合生成映射关系,其中,该sql元素的信息至少包括表名和字段名,第一集合中的第i个键值对用于保存第j次递归得到的sql元素的信息,第i个键值对中的键至少包括第j次递归得到的表名,第i个键值对中的值至少包括第j次递归得到的字段名,i=1,2,…n,j=1,2,…n,n为递归次数,i、j、n为正整数。本发明实施例提供的映射关系方法不需要对sql元素进行编号,能够避免因sql元素编号错误导致的映射关系错乱的问题,进而达到提高所生成的映射关系的准确性的目的。以下通过一个具体实施例,对本发明提出的映射关系生成方法进行详细说明。所要解析的sql程序如下所示:生成上述sql程序的映射关系,包括以下步骤:1、根据sql语法规则,对上述sql程序进行语法分析、词法分析,构建上述sql程序的ast。2、递归遍历所构建的ast语法树,获取每次递归得到的sql信息。其中,获取到的sql信息除表名和字段名外,还可以包括子查询名、表别名、字段别名以及连接(join)信息。3、根据获取到的sql信息,建立并保存第一集合,其中,第一集合如表1所示:表1第一集合其中,第一集合中的key是通过解析sql程序中的from语句或建表语句得到的,第一集合中的value是通过解析sql程序中的select语句得到的。第一集合中key的包括第一字段、第二字段和第三字段,第一字段用于保存子查询名或第一表名,第二字段用于保存第二表名,第三字段用于保存表别名,不同字段之间用分隔标识符隔开,即第一集合中key的格式为子查询名/第一表名$第二表名$表别名;第一集合中的value中任意一个元素包括第四字段、第五字段和第六字段,第四字段用于保存表别名,第五字段用于保存字段名,第六字段用于保存字段别名,不同字段之间用分隔标识符隔开,即第一集合的value中包括的元素的格式为表别名#字段名#字段别名。若某次递归未得到子查询名或第一表名,则用该次递归得到的第二表名表示第一字段中的子查询名/第一表名,若某次递归未得到表别名,则用该次递归得到的第二表名或设定字符表示第二字段以及第四字段中的表别名,若某次递归未得到字段别名,则用设定字符替换第六字段中的字段别名。4、解析第一集合中的每个key,将第一集合key中的第二表名确定为第三集合中的key,将第一集合key中的表别名确定为第三集合中的value,得到如表2所示的第三集合。表2第三集合其中,解析第一集合中dm_sum$cust_to_mon$cust_to_mon这一key时,得到第三集合中的键值对中key为cust_to_mon,value为cust_to_mon,而解析第一集合中a$cust_to_mon$tmp这一key时,得到第三集合中的键值对中key为cust_to_mon,value为tmp,即cust_to_mon有别名为tmp,因此,将解析第一集合中dm_sum$cust_to_mon$cust_to_mon这一key得到的第三集合的键值对中的value替换为tmp,得到如表2所示的结果。5、根据第一集合以及第三集合,生成表级映射关系以及字段级映射关系。(a)生成表级映射关系对于第一集合中的keydm_sum$cust_to_mon$cust_to_mon,由于该key中包括第一表名dm_sum,因此将第一表名dm_sum确定为第二集中的key,第一集合中的keydm_sum$cust_to_mon$cust_to_mon对应的value中包括表别名a、b,根据表别名a、b查询第三集合,未查找到表别名a、b对应的表名,因此将表别名a、b确定为第三集合中keydm_sum对应的值;对于第一集合中的keyb$bill_mon$bill_mon,将子查询名b确定为第二集合中的key,由于第一集合中的keyb$bill_mon$bill_mon对应的value中不包括表别名,因此将第一集合中的keyb$bill_mon$bill_mon中的表名bill_mon确定为第二集合中keyb对应的value;对于第一集合中的keya$cust_to_mon$tmp,将子查询名a确定为第二集合中的key,由于第一集合中的keya$cust_to_mon$tmp对应的value中包括表别名tmp,根据表别名tmp查询第三集合,得到表别名tmp对应的表名cust_to_mon,将表名cust_to_mon确定为第二集合中keya对应的value,得到的第二集合的结果如表3所示:表3第二集合根据第二集合,将第一表名dm_sum作为入口,可逆向地推出如图2所示的表级映射关系。(b)生成字段级映射关系对于第一集合中的第一个键值对,将keydm_sum$cust_to_mon$cust_to_mon中的第一表名dm_sum确定为目标子查询名/表名;对于keydm_sum$cust_to_mon$cust_to_mon对应的valuea#subs_id#none,由于a#subs_id#none中包括表别名a,因此根据表别名a查询第三集合,未查询到表别名a对应的表名,因此将表别名a确定为源子查询名/表名;由于valuea#subs_id#none中不包括字段别名,因此将valuea#subs_id#none中的字段名确定为源字段名和目标字段名,将所确定的目标子查询名/表名dm_sum、源子查询名/表名a、源字段名subs_id和目标字段名subs_id确定为一个字段映射关系。对于keydm_sum$cust_to_mon$cust_to_mon对应的valueb#fee_notax#cnsm_mon_notax,由于b#fee_notax#cnsm_mon_notax中包括表别名b,因此根据表别名b查询第三集合,未查询到表别名b对应的表名,因此将表别名b确定为源子查询名/表名,将b#fee_notax#cnsm_mon_notax中的字段名fee_notax确定为源字段名,由于b#fee_notax#cnsm_mon_notax中包括字段别名cnsm_mon_notax,将字段别名cnsm_mon_notax确定为目标字段名,将所确定的目标子查询名/表名dm_sum、源子查询名/表名b、源字段名fee_notax和目标字段名cnsm_mon_notax确定为一个字段映射关系。同理,对于keydm_sum$cust_to_mon$cust_to_mon对应的valueb#inc_notax#nb_cnsm_mon_notax,确定出的源子查询名/表名为b,源字段名为inc_notax,目标字段名为nb_cnsm_mon_notax,将所确定的目标子查询名/表名dm_sum、源子查询名/表名b、源字段名inc_notax和目标字段名nb_cnsm_mon_notax确定为一个字段映射关系。对于第一集合中的第二个键值对,将keyb$bill_mon$bill_mon中的子查询名b确定为目标子查询名/表名;对于keyb$bill_mon$bill_mon对应的valuenone#subs_id#none,由于valuenone#subs_id#none中不包括表别名,因此将keyb$bill_mon$bill_mon中的表名bill_mon确定为源子查询名/表名;由于valuenone#subs_id#none中不包括字段别名,因此将none#subs_id#none中的字段名subs_id确定为源字段名以及目标字段名;将所确定的目标子查询名/表名b,源子查询名/表名bill_mon,源字段名subs_id以及目标字段名subs_id确定为一个字段映射关系。同理,对于keyb$bill_mon$bill_mon对应的valuenone#fee_notax#none,确定出的目标子查询名/表名b,源子查询名/表名为bill_mon,源字段名为fee_notax,目标字段名为fee_notax,将所确定的目标子查询名/表名b,源子查询名/表名bill_mon,源字段名fee_notax以及目标字段名fee_notax确定为一个字段映射关系;对于keyb$bill_mon$bill_mon对应的valuenone#inc_notax#none,确定出的目标子查询名/表名b,源子查询名/表名为bill_mon,源字段名为fee_notax,目标字段名为fee_notax,将所确定的目标子查询名/表名b,源子查询名/表名bill_mon,源字段名inc_notax以及目标字段名inc_notax确定为一个字段映射关系。对于第一集合中的第三个键值对,将keya$cust_to_mon$tmp中的子查询名a确定为目标子查询名/表名;由于keya$cust_to_mon$tmp对应的valuetmp#subs_id#none中包括表别名tmp,因此根据表别名tmp查询第三集合,得到表别名tmp对应的表名cust_to_mon,将表名cust_to_mon确定为源子查询名/表名;由于valuetmp#subs_id#none中不包括字段别名,因此将valuetmp#subs_id#none中的字段名subs_id确定为源字段名以及目标字段名;将确定出的目标子查询名/表名a,源子查询名/表名cust_to_mon,源字段名subs_id以及目标字段名subs_id确定为一个字段映射关系。将根据第一集合中的每个键值对确定出的字段映射关系按照设定的格式保存在第四集合中,得到字段级映射关系。其中,每个字段映射关系的格式可以为目标子查询名/表名$目标字段名$源子查询名/表名$源字段名,此时第四集合的结果如表4所示:表4第四集合第四集合b$subs_id$bill_mon$subs_idb$fee_notax$bill_mon$fee_notaxb$inc_notax$bill_mon$inc_notaxdm_sum$subs_id$a$subs_iddm_sum$cnsm_mon_notax$b$fee_notaxdm_sum$nb_cnsm_mon_notax$b$inc_notaxa$subs_id$cust_to_mon$subs_id得到第四集合后,可以第一表名为入口,获取第四集合中保存的字段级映射关系,并在页面图像化渲染展示,如图3所示。基于以上实施例,本申请实施例还提供了一种用于生成映射关系的装置,以实现如图1所示的映射关系生成方法,参阅图4所示,该装置400中包括:语法树建立模块401、信息获取模块402和处理模块403。语法树建立模块401,用于对结构化查询语言sql程序进行语法分析,构建所述sql程序的抽象语法树ast;信息获取模块402,用于递归遍历所述ast,获取每次递归得到的sql元素的信息,所述sql元素的信息至少包括表名和字段名;处理模块403,用于根据获取到的sql元素的信息建立并保存第一集合,以及根据所述第一集合生成映射关系;其中,所述第一集合中的第i个键值对用于保存第j次递归得到的sql元素的信息,所述第i个键值对中的键至少包括所述第j次递归得到的表名,所述第i个键值对中的值至少包括所述第j次递归得到的字段名,i=1,2,…n,j=1,2,…n,n为递归次数,i、j、n为正整数。可选地,若所述第j次递归得到的sql元素的信息还包括子查询名、表别名和/或字段别名,则所述第i个键值对中的键还包括所述第j次递归得到的子查询名和/或表别名,所述第i个键值对中的值还包括所述第j次递归得到的表别名和/或字段别名。可选地,所述处理模块403具体用于:解析所述第i个键值对中的键,若所述第i个键值对的键中包括子查询名或第一表名,则将所述第i个键值对的键中包括的子查询名或第一表名确定为第二集合的键,否则将所述第i个键值对的键中包括的第二表名确定为第二集合的键;其中,所述第一表名为所述sql程序中创建的表的表名,所述第二表名为所述sql程序中包括的除所述第一表名外的表名,所述第二集合用于保存所述表级映射关系;解析所述第i个键值对中的值,当所述第i个键值对的值中包括表别名时,根据所述第i个键值对的值中包括的表别名查询第三集合,若查到所述第i个键值对的值中包括的表别名对应的表名,则将所述第i个键值对的值中包括的表别名对应的表名确定为所述第二集合的键对应的值,否则将所述第i个键值对的值中包括的表别名确定为所述第二集合的键对应的值,其中,所述第三集合用于保存所述sql程序中表名与表别名的对应关系;当所述第i个键值对中的值中不包括表别名时,将所述第i个键值对的键中包括的第二表名确定为所述第二集合的键对应的值。可选地,所述处理模块403具体用于:解析所述第i个键值对中的键,若所述第i个键值对的键中包括子查询名或第一表名,则将所述第i个键值对的键中包括的子查询名或第一表名确定为第二集合的键,否则将所述第i个键值对的键中包括的第二表名确定为第二集合的键,所述第一表名为所述sql程序中所创建的表的表名,所述第二表名为所述sql程序中除所述第一表名外的表名,所述第二集合用于保存所述表级映射关系;若所述第i个键值对的键中包括第一表名,则解析所述第i个键值对中的值,当所述第i个键值对的值中包括表别名时,根据所述第i个键值对的值中包括的表别名查询第三集合,若查到所述第i个键值对的值中包括的表别名对应的表名,则将所述第i个键值对的值中包括的表别名对应的表名确定为所述第二集合的键对应的值,否则将所述第i个键值对的值中包括的表别名确定为所述第二集合的键对应的值,其中,所述第三集合用于保存所述sql程序中表名与表别名的对应关系;当所述第i个键值对中的键中不包括第一表名时,将所述第i个键值对的键中包括的第二表名确定为所述第二集合的键对应的值。可选地,所述处理模块403具体用于:解析所述第i个键值对,当所述第i个键值对的值中包括表别名时,根据所述第i个键值对的值中包括的表别名查询第三集合,若查找到所述第i个键值对的值中包括的表别名对应的表名,将所述第i个键值对的值中包括的表别名对应的表名确定为源子查询名/表名,否则,将所述第i个键值对的值中包括的表别名确定为源查子询名/表名;当所述第i个键值对的值中不包括表别名时,将所述第i个键值对的键中包括的第二表名确定为源子查询名/表名,其中,所述第二表名为所述sql程序中除第一表名外的表名,所述第一表名为所述sql程序中所创建的表的表名;若所述第i个键值对中的键包括子查询名或第一表名,则将所述第i个键值对的键中包括的子查询名或第一表名确定为所述源子查询名/表名对应的目标子查询名/表名,否则,将所述第i个键值对的键中包括的第二表名确定为目标子查询名/表名,所述第一表名为所述sql程序中创建的表的表名;将所述第i个键值对的值中包括的字段名确定为源字段名;若所述第i个键值对的值中包括字段别名,则将所述第i个键值对的值中包括的字段别名确定为所述源字段名对应的目标字段名,否则,将所述第i个键值对的值中包括的字段名确定为所述源字段名对应的目标字段名;根据所述目标子查询名/表名、所述目标字段名、所述源子查询名/表名以及所述源字段名,生成字段级映射关系。可选地,所述处理模块403还用于:根据所述第i个键值对的值中包括的表别名查询第三集合之前,解析所述第i个键值对的键,将所述第i个键值对的键中包括的第二表别名确定为所述第三集合中的键,将所述第i个键值对的键中包括的第二表名确定为所述第三集合中的键对应的值,得到所述第三集合。本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1