本發(fā)明涉及一種代碼生成方法,主要利用模型轉(zhuǎn)換技術(shù)來實現(xiàn)由qvt-r語言自動化生成midcore腳本的任務,屬于計算機技術(shù)、模型轉(zhuǎn)換技術(shù)、領(lǐng)域特定語言和代碼生成技術(shù)的交叉技術(shù)應用領(lǐng)域。
背景技術(shù):
模型轉(zhuǎn)換技術(shù)是模型驅(qū)動軟件開發(fā)中的重要一環(huán),后者以模型為軟件開發(fā)的核心制品,并提升模型在開發(fā)過程中的作用,利用模型指導開發(fā)人員對于軟件系統(tǒng)的理解、設(shè)計、構(gòu)造、維護和演化,從而提高軟件的開發(fā)和維護效率,進而降低成本。模型轉(zhuǎn)換用于將開發(fā)過程中的一個模型自動或者半自動的轉(zhuǎn)換成另一個模型,從而推動整個開發(fā)過程的進行。它通常由模型、模型轉(zhuǎn)換程序和模型轉(zhuǎn)換引擎構(gòu)成。其中模型分為源模型、源元模型、目標模型、目標元模型。元模型是模型的抽象,將作為模型轉(zhuǎn)換程序的輸入輸出,而模型是元模型的實例,將作為模型轉(zhuǎn)換引擎的輸入輸出;模型轉(zhuǎn)換程序用于描述模型轉(zhuǎn)換過程中輸入輸出模型轉(zhuǎn)換規(guī)則,可以由多種模型轉(zhuǎn)換語言表達;模型轉(zhuǎn)換引擎是用來執(zhí)行模型轉(zhuǎn)換程序的程序,它將源模型按照模型轉(zhuǎn)換規(guī)則進行處理得到目標模型。
計算機領(lǐng)域存在大量的領(lǐng)域特定語言(domainspecificlanguage,簡稱dsl),它們通常用于處理各種領(lǐng)域特定問題,如本發(fā)明中涉及到的qvt-r(qurey/view/transformation-relation)語言是一種用于描述模型轉(zhuǎn)換規(guī)則的語言,它是一種聲明式模型轉(zhuǎn)換語言,由omg(objectmanagementgroup)標準化組織管理,具體可詳見《documentsassociatedwithmetaobjetfacility(mof)2.0query/view/transformation,v1.3》http://www.omg.org/spec/qvt/1.3/。本發(fā)明中涉及的midcore腳本則是另一種dsl,它是由南京大學軟件工程組設(shè)計的一種面向大數(shù)據(jù)轉(zhuǎn)換的領(lǐng)域特定語言,提供了數(shù)據(jù)模型描述、匹配、轉(zhuǎn)換等操作算子,可以向多個大數(shù)據(jù)處理平臺自動化映射,從而更加簡便的完成大數(shù)據(jù)處理任務。以上兩種語言可以分別看成模型轉(zhuǎn)換的輸入模型和輸出模型。
xtext是基于eclipse的開發(fā)領(lǐng)域特定語言的開源框架,是一種模型轉(zhuǎn)換領(lǐng)域中成熟的模型轉(zhuǎn)換引擎。該工具可以通過用戶定義一套dsl的語法,高度自動化地創(chuàng)建出該dsl的編輯器、解析器。利用xtend模塊,還可以完成代碼生成的任務。本發(fā)明利用xtext框架通過解析qvt-r語言生成midcore腳本。
技術(shù)實現(xiàn)要素:
技術(shù)問題:本發(fā)明提出一種基于模型轉(zhuǎn)換由qvt-r代碼生成midcore腳本的方法,利用模型驅(qū)動開發(fā)思想解決midcore特定領(lǐng)域知識造成使用困難的問題,使得開發(fā)人員可以通過編寫直觀的模型轉(zhuǎn)換代碼,自動生成面向大數(shù)據(jù)處理的midcore腳本,進而完成數(shù)據(jù)處理任務。
技術(shù)方案:本發(fā)明所述的基于模型轉(zhuǎn)換由qvt-r代碼生成midcore腳本的方法,流程如下:
步驟1、面向大數(shù)據(jù)轉(zhuǎn)換方向?qū)vt-r語言進行設(shè)計和裁剪。
本發(fā)明所述的qvt-r屬于原qvt-r語言的子集,這是由于該發(fā)明面向大數(shù)據(jù)轉(zhuǎn)換領(lǐng)域,原qvt-r的表達能力存在冗余,這里對其進行了部分限制,因此無法直接復用原來的語法,需要進一步設(shè)計。
步驟11、不支持extends、overrides、implementedby、where、query關(guān)鍵字及其相關(guān)語句;
步驟12、規(guī)定transformation語句的參數(shù)只允許使用sourcex、targety作為元模型的名稱,其中source表示源元模型,target表示目標元模型,x/y表示0、1、2、……序號;
步驟13、規(guī)定source域的限定描述符只能是checkonly,target域的限定描述符只能是enforce;
步驟14、規(guī)定必須使用中間變量來綁定源模型和目標模型的屬性值;
步驟15、除步驟11~14規(guī)定外,其它語法均與官方qvt-r相同,所有語義與官方qvt-r相同;
步驟2、獲取滿足步驟1定義的qvt-r代碼,作為代碼生成的輸入數(shù)據(jù)。
所述qvt-r代碼屬于領(lǐng)域特定語言程序,相關(guān)領(lǐng)域人員理解,如何獲取不在本發(fā)明的討論范圍內(nèi)。
步驟3、使用xtext對qvt-r語言建模,構(gòu)建qvt-r語言的代碼編輯器、解析器和語法分析樹。
步驟31、依據(jù)xtext語法要求,設(shè)計import語句結(jié)構(gòu),用于描述元模型文件的路徑和名稱;
步驟32、設(shè)計transformation語句結(jié)構(gòu),用于描述模型轉(zhuǎn)換名稱、輸入輸出模型。且其中應包含所有非import語句;
步驟33、設(shè)計key語句結(jié)構(gòu),用于描述模型的主鍵屬性;
步驟34、設(shè)計relation語句結(jié)構(gòu),用于描述兩個模型之間的模型轉(zhuǎn)換規(guī)則,其中應包含所有的屬性綁定和賦值語句;
步驟35、設(shè)計屬性綁定和賦值語句結(jié)構(gòu),用于描述目標模型和源模型的對應關(guān)系;
步驟36、設(shè)計when語句結(jié)構(gòu),用于描述多條relation相互間依賴關(guān)系;
步驟4、利用xtend根據(jù)步驟3匹配得到的語法分析樹,解析qvt-r代碼語義,并生成對應的midcore語句。
步驟41、讀取qvt-r的transformation語句,并構(gòu)建midcore腳本的模型描述和轉(zhuǎn)換模塊。
步驟42、讀取qvt-r的import語句,生成midcore數(shù)據(jù)模型描述模塊。
步驟421、根據(jù)import語句提供的路徑獲取元模型文件;
步驟422、用dom4j解析元模型文件,提取模型的名稱、類型和從屬關(guān)系,并生成midcore的模型描述語句;
所述dom4j是一個用于處理xml數(shù)據(jù)的解析工具,詳細信息查看http://dom4j.sourceforge.net/dom4j-1.6.1/index.html。
步驟43、讀取qvt-r的key語句,根據(jù)屬性生成midcore的deduplicate算子,寫入模型轉(zhuǎn)換模塊。
步驟44、依次讀取qvt-r的source域。
步驟441、若屬性與中間變量綁定,則使用哈希表記錄中間變量與源模型屬性的對應關(guān)系;
步驟442、若屬性由定值限制,則根據(jù)屬性、定值和限制符生成midcore的filter算子,并順序?qū)懭肽P娃D(zhuǎn)換模塊;
步驟45、若存在多個source域,使用列表記錄共同使用的中間變量,然后根據(jù)這些中間變量生成midcore的join算子。
步驟46、依次讀取qvt-r的target域,生成midcore模型轉(zhuǎn)換邏輯。
步驟461、構(gòu)建midcore的generate算子;
步驟462、根據(jù)中間變量和哈希表,獲取源模型屬性,并作為參數(shù)傳入;
步驟463、依次讀取屬性賦值語句,生成midcore的expression算子;
步驟5、運行xtext程序,將出現(xiàn)一個代碼編輯器,通過將步驟2獲得的qvt-r代碼填入和運行,將在src-gen文件夾中看到生成的midcore腳本。
有益效果:本發(fā)明所述的基于模型轉(zhuǎn)換由qvt-r代碼生成midcore腳本的方法具有以下技術(shù)效果:
1、本發(fā)明方法使用戶無需了解midcore代碼細節(jié),只需編寫直觀的模型轉(zhuǎn)換程序作為系統(tǒng)輸入,將自動生成可用的midcore腳本,進一步降低了大數(shù)據(jù)處理的門檻。
2、本發(fā)明利用模型轉(zhuǎn)換技術(shù),通過將qvt-r代碼和midcore代碼模型化,使系統(tǒng)直觀易理解,具有較高的可維護性。
3、本發(fā)明所述代碼生成方法高度自動化,生成的midcore代碼執(zhí)行可靠,可以有效減少midcore代碼缺陷。
附圖說明
圖1是本發(fā)明實施例的qvt-r代碼轉(zhuǎn)換為midcore腳本的流程示意圖。
圖2是本發(fā)明實施例的經(jīng)過設(shè)計裁剪后的qvt-r文法。
圖3是本發(fā)明實施例的利用xtext對qvt-r語言部分建模內(nèi)容。
圖4是本發(fā)明實施例的一段用于數(shù)據(jù)轉(zhuǎn)換的qvt-r代碼片段。
圖5是由圖4的代碼生成的midcore腳本片段。
具體實施方式
下面結(jié)合附圖對本發(fā)明作更詳細的描述。
本發(fā)明建立在模型轉(zhuǎn)換技術(shù)的基礎(chǔ)上,利用qvt-r代碼生成midcore腳本,從而降低了開發(fā)人員使用midcore完成大數(shù)據(jù)處理的學習成本,同時利用qvt-r的模型轉(zhuǎn)換思想專注于描述數(shù)據(jù)轉(zhuǎn)換的邏輯而非代碼細節(jié),從而更快更精確的完成數(shù)據(jù)轉(zhuǎn)換任務。圖1是本發(fā)明實施例的整體流程框架,本實施例的基于模型轉(zhuǎn)換由qvt-r代碼生成midcore腳本的方法,通過對qvt-r和midcore建模,使用xtext構(gòu)建模型轉(zhuǎn)換引擎,實現(xiàn)了midcore腳本的自動化生成。包括以下步驟:
步驟1、面向大數(shù)據(jù)轉(zhuǎn)換方向?qū)vt-r語言進行設(shè)計和裁剪。
步驟2、獲取滿足步驟1定義的qvt-r代碼,作為代碼生成的輸入數(shù)據(jù)。
步驟3、使用xtext對qvt-r語言建模,并生成相應的編輯器、解析器和語法分析樹。
步驟4、利用xtend根據(jù)步驟3匹配得到的語法分析樹,解析qvt-r代碼語義,并生成對應的midcore語句。xtend模塊描述了qvt-r與midcore語言的轉(zhuǎn)換關(guān)系,建立了qvt-r與midcore代碼的映射規(guī)則。
步驟5、運行xtext程序,將出現(xiàn)一個代碼編輯器,通過將步驟2獲得的qvt-r代碼填入和運行,將在src-gen文件夾中看到生成的midcore腳本。
其中在步驟1中所述對qvt-r語言進行設(shè)計和裁剪,指的是由于本發(fā)明是面向大數(shù)據(jù)轉(zhuǎn)換領(lǐng)域,原qvt-r的表達能力存在冗余,如果不加限制會增加工具的復雜性,部分表達能力會造成無法與大數(shù)據(jù)變換操作對應的問題,同時需要增加部分標識變量以便識別轉(zhuǎn)換方向,因此這里對其進行了設(shè)計裁剪,其步驟如下所示,其最終裁剪結(jié)果如圖2所示:
步驟11、不支持extends、overrides、implementedby、where、query關(guān)鍵字及其相關(guān)語句;
步驟12、規(guī)定transformation語句的參數(shù)只允許使用sourcex、targety作為元模型的名稱,其中source表示源元模型,target表示目標元模型,x/y表示0、1、2、……序號;
步驟13、規(guī)定source域的限定描述符只能是checkonly,target域的限定描述符只能是enforce;
步驟14、規(guī)定必須使用中間變量來綁定源模型和目標模型的屬性值;
步驟15、除步驟11~14規(guī)定外,其它語法均與官方qvt-r相同,所有語義與官方qvt-r相同。
其中步驟2所述qvt-r代碼屬于領(lǐng)域特定語言程序,相關(guān)領(lǐng)域人員理解,如何獲取不在本發(fā)明的討論范圍內(nèi),圖4是本例中獲取的一份qvt-r代碼片段,描述了兩張表的篩選、合并的過程。
其中步驟3所述的xtext建模,是利用xtext語法描述步驟1中所定義的qvt-r語法,其過程如下:
步驟31、依據(jù)xtext語法要求,設(shè)計import語句結(jié)構(gòu),用于描述元模型文件的路徑和名稱;
步驟32、設(shè)計transformation語句結(jié)構(gòu),用于描述模型轉(zhuǎn)換名稱、輸入輸出模型。且其中應包含所有非import語句,圖3展示了xtext語法的表達;
步驟33、設(shè)計key語句結(jié)構(gòu),用于描述模型的主鍵屬性;
步驟34、設(shè)計relation語句結(jié)構(gòu),用于描述兩個模型之間的模型轉(zhuǎn)換規(guī)則,其中應包含所有的屬性綁定和賦值語句;
步驟35、設(shè)計屬性綁定和賦值語句結(jié)構(gòu),用于描述目標模型和源模型的對應關(guān)系;
步驟36、設(shè)計when語句結(jié)構(gòu),用于描述多條relation相互間依賴關(guān)系;
其中步驟4中,使用xtend模塊描述了qvt-r和midcore的映射規(guī)則,其處理流程如下:
步驟41、讀取qvt-r的transformation語句,并構(gòu)建midcore腳本的模型描述和轉(zhuǎn)換模塊。
步驟42、讀取qvt-r的import語句,生成midcore數(shù)據(jù)模型描述模塊。
步驟421、根據(jù)import語句提供的路徑獲取元模型文件;
步驟422、用dom4j解析元模型文件,提取模型的名稱、類型和從屬關(guān)系,并生成midcore的模型描述語句;
所述dom4j是一個用于處理xml數(shù)據(jù)的解析工具,詳細信息查看http://dom4j.sourceforge.net/dom4j-1.6.1/index.html。
步驟43、讀取qvt-r的key語句,根據(jù)屬性生成midcore的deduplicate算子,寫入模型轉(zhuǎn)換模塊。
步驟44、依次讀取qvt-r的source域。
步驟441、若屬性與中間變量綁定,則使用哈希表記錄中間變量與源模型屬性的對應關(guān)系;
步驟442、若屬性由定值限制,則根據(jù)屬性、定值和限制符生成midcore的filter算子,并順序?qū)懭肽P娃D(zhuǎn)換模塊;
步驟45、若存在多個source域,使用列表記錄共同使用的中間變量,然后根據(jù)這些中間變量生成midcore的join算子。
步驟46、依次讀取qvt-r的target域,生成midcore模型轉(zhuǎn)換邏輯。
步驟461、構(gòu)建midcore的generate算子;
步驟462、根據(jù)中間變量和哈希表,獲取源模型屬性,并作為參數(shù)傳入;
步驟463、依次讀取屬性賦值語句,生成midcore的expression算子;
其中步驟5以步驟2所獲取的qvt-r作為輸入,以xtext框架生成的eclipse工具作為模型轉(zhuǎn)換引擎,最終生成了相應的midcore腳本,如圖5所示。
以上所述僅是本發(fā)明的優(yōu)選實施方式,應當指出:對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應視為本發(fā)明的保護范圍。