欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

查詢中間語言的方法和系統(tǒng)的制作方法

文檔序號:6424956閱讀:135來源:國知局
專利名稱:查詢中間語言的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域
本發(fā)明總體上涉及遍及數(shù)據(jù)源進行查詢的軟件的領(lǐng)域,更具體而言,涉及利用中間語言來遍及一個或多個XML或虛擬XML數(shù)據(jù)源進行查詢的軟件的領(lǐng)域。
背景技術(shù)
可擴展標(biāo)記語言(XML)是簽署文件格式化標(biāo)準(zhǔn)的萬維網(wǎng)協(xié)會(W3C),所述文件格式化標(biāo)準(zhǔn)提供了具有人類可讀標(biāo)記的用于標(biāo)記數(shù)據(jù)的遺傳語法。XML不具有固定的標(biāo)記集和元素集,因此只要這類標(biāo)記符合XML標(biāo)準(zhǔn)就允許用戶定義它們??梢詫?shù)據(jù)作為由文本標(biāo)記圍繞的文本串存儲在XML文檔中。W3C已經(jīng)以一種稱為XML信息集(XML Infoset)的技術(shù)規(guī)范編纂了XML的抽象數(shù)據(jù)模型。目前的Infoset根據(jù)包含屬性的節(jié)點描述了XML文檔的邏輯結(jié)構(gòu)。盡管XML可能易于以定義明確的格式來描述文檔內(nèi)容,但是仍存在不易描述的其它數(shù)據(jù)源,這是因為它們的結(jié)構(gòu)與標(biāo)準(zhǔn)文本文檔的結(jié)構(gòu)不一致或者是由于其它的非XML可兼容特性的原因。這類數(shù)據(jù)源的一個例子可能是電子表格或關(guān)系數(shù)據(jù)庫。
虛擬XML是這樣一種概念,即其跨越多種不同形式的數(shù)據(jù)訪問程序設(shè)計模型而建立一致性,并允許用戶按照他們考慮數(shù)據(jù)的方式而不是實際存儲格式來利用他們的所述數(shù)據(jù)進行工作。遍及虛擬XML數(shù)據(jù)進行查詢的概念涉及把數(shù)據(jù)當(dāng)成仿佛它就是XML一樣來對待,而無需實際上曾經(jīng)把它轉(zhuǎn)換成XML。這一概念中的一個優(yōu)點就是將XML編碼的開銷保持到最少。如果虛擬XML情形有這樣的優(yōu)點,即它能夠使用詢問語言來遍及非XML數(shù)據(jù)源進行查詢,就仿佛該數(shù)據(jù)源是XML一樣,那么是人們所希望的。同樣,在實際數(shù)據(jù)與虛擬XML表示之間的映射具有高保真度也是人們所希望的。
實現(xiàn)虛擬XML存在許多的內(nèi)在挑戰(zhàn)。一個問題就是效率。人們僅僅能夠利用虛擬XML接口來陳列數(shù)據(jù)源,比如像XMLReaderTM,然后利用現(xiàn)有的XML查詢實施方案(比如XPathNavigatorTM)經(jīng)該接口進行查詢。然而,所有的工作都發(fā)生在XML查詢引擎中,而不是由數(shù)據(jù)源本身執(zhí)行的。
舉例來說,考慮下列經(jīng)嵌入在SQL服務(wù)器中的結(jié)構(gòu)化查詢語言(SQL)來進行的虛擬XML查詢sqldatabase(″Northwind″)/Customer[@ID=′ALKFI′]/Order在這次查詢中,sqldatabase(″Northwind″)把SQL服務(wù)器的Northwind數(shù)據(jù)庫陳列為虛擬XML,然后XPath/Customer[@ID=′ALKFT]/Order選擇來自于消費者元素之一的所有指令元素(Order elements)。實施方案可以類似下列這樣進行嘗試SQLServerMapping map=new SQLServerMapping(″Northwind″);SQDServerXmlReader Data=new SQLServerXmlReader(map);XPathNavigator nav=new XpathNavigator(data,″/Customer[@ID=′ALKFI′]/Order;在這個方法中存在至少兩個缺陷。第一,全部映射都是通過XmlReader來執(zhí)行的,即便只有其一部分是用于查詢的。第二個缺陷就是SQL服務(wù)器能夠比XpathNavigator可以的更加有效地通過ID來選擇消費者。注意上面的例子已經(jīng)XPathNavigator執(zhí)行所有的工作。對于這一挑戰(zhàn)的最佳解決方案可能就是盡可能把更多的查詢下載轉(zhuǎn)移到數(shù)據(jù)源(這里,是SQL服務(wù)器數(shù)據(jù)庫)中。然而,這可能會包含顯著的查詢分析及重寫。
實現(xiàn)虛擬XML過程中的另一個問題就是XML數(shù)據(jù)模型未必總是能與下層數(shù)據(jù)模型及其類型系統(tǒng)很好地保持諧調(diào)。一個人能夠?qū)⑺蓄愋偷南聦訑?shù)據(jù)源映射到XML類型中,但是這一過程失掉了保真度而且也很低效。此外,一個系統(tǒng)中的類型可能不會明顯等同于另一個系統(tǒng)的類型。例如,以XML表示二進制數(shù)據(jù)(比如圖像)需要代價很高地將其轉(zhuǎn)換成XML字符集(例如,base64-編碼)。
早先試圖遍及虛擬XMI進行查詢,通過構(gòu)建兩種不同的數(shù)據(jù)結(jié)構(gòu)來解決上述問題;所述兩種數(shù)據(jù)結(jié)構(gòu)一個用于查詢一個用于映射,然后,一前一后地遍歷它們以便直接遍及原始數(shù)據(jù)源產(chǎn)生高效查詢,而無需曾經(jīng)使虛擬XML視圖(view)具體化。盡管這個方法最初運行良好,但是由于查詢和映像語言復(fù)雜度增加而使得開發(fā)變得極其困難。查詢或映射中的概念往往未直接轉(zhuǎn)換成目標(biāo)數(shù)據(jù)模型,并且利用復(fù)雜視圖構(gòu)成的復(fù)雜查詢需要許多語義分析及重寫。
因此,存在統(tǒng)一表示的需要,以經(jīng)XML和非XML數(shù)據(jù)源為XML查詢和視圖實現(xiàn)虛擬XML。人們期望這樣一種方法和系統(tǒng),其通過將復(fù)雜映射變成構(gòu)成查詢的較少復(fù)雜問題并經(jīng)較少復(fù)雜映射執(zhí)行所述問題來實現(xiàn)查詢。本發(fā)明針對上述需要和缺陷,并且利用這里所表述的附加優(yōu)點來解決它們。
發(fā)明概述本發(fā)明涉及一種被稱為查詢中間語言(QIL)的XML中間語言定義,,它表示XML語言查詢或視圖的含義。QIL是對XML中查詢或視圖的含義的抽象,并且可以用來執(zhí)行查詢或者可以用作到語言翻譯器或編譯器的輸入,以便執(zhí)行目標(biāo)語言中的查詢。QIL可以用來遍及相關(guān)和非相關(guān)數(shù)據(jù)源進行查詢。
根據(jù)本發(fā)明的一些方面,QIL是通過接收XML語言詢問、為XML語言詢問內(nèi)的每個操作定義至少一個節(jié)點對象、利用特定QIL運算符來變換每個定義好的節(jié)點對象、然后從節(jié)點圖形中的運算符生成初始詢問的查詢中間語言表示來構(gòu)建的。
通常,將QIL語言用作為計算機系統(tǒng)的的一部分,所述計算機系統(tǒng)包括用于XML語言的前端編譯器,在其中生成XML查詢和視圖;QIL發(fā)生器和后端引擎,所述后端引擎可以使用XML查詢或視圖的QIL語義表示來遍及一個或多個數(shù)據(jù)源進行搜索。所查詢的數(shù)據(jù)源可以是相關(guān)數(shù)據(jù)或非相關(guān)數(shù)據(jù)。
前端XML語言的例子是XPath、XSLT、XQuery、DML、OPath和注釋概要。后端引擎類型的例子可以是用于查詢語言轉(zhuǎn)換器的QIL,在該查詢語言轉(zhuǎn)換器中查詢語言可以是任何大量的數(shù)據(jù)搜索語言,僅舉幾個例子來講,比如是SQL、MSIL和XQuery。
示例性的QIL定義包括一組基于XMLInfoset的明確定義的運算符,所述XMLInfoset可以用作為提供明確的且顯式的指令的節(jié)點定義運算符,以用來表示XML查詢和視圖表達式的含義。舉例來說,期望的運算符包括元組、文字、布爾運算符、序列運算符、算術(shù)運算符、串運算符、值比較運算符、節(jié)點比較運算符、函數(shù)定義與調(diào)用、XML導(dǎo)航、XML組成、XML屬性存取器、類型運算符、特定語言的運算符、數(shù)據(jù)操作、特定運算符和數(shù)據(jù)源運算符。
通過參照附圖閱讀下列說明性實施例的詳述,本發(fā)明的附加特征和優(yōu)點將變得明顯。
附圖簡要說明當(dāng)結(jié)合附圖閱讀前述概述及下列優(yōu)選實施例的詳細說明時,將會更好地理解本發(fā)明。為了舉例說明本發(fā)明,在附圖中示出了本發(fā)明的示例性組成結(jié)構(gòu);然而,本發(fā)明不限于所公開的特定方法和手段。在附圖中

圖1是示出示例性計算環(huán)境的框圖,在該計算環(huán)境中可以實現(xiàn)本發(fā)明的多個方面;圖2是描繪具體化本發(fā)明示例性方面的示例性功能結(jié)構(gòu)的框圖;圖3是描繪依照本發(fā)明實施例的中間語言生成的一些示例性元素的框圖;和圖4是描繪依照本發(fā)明實施例的中間語言生成的示例性過程的流程圖。
說明性實施例詳述概觀本發(fā)明的XML中間語言顯式地表示查詢的含義或語義。將XML中間語言稱為查詢中間語言(QIL)。
XML中間語言QIL提供了(1)XML查詢和XML視圖的統(tǒng)一表示,由此大大地簡化了查詢/視圖組成問題,并且(2)把所有的視圖都當(dāng)作“虛擬XML”對待,大大地簡化了系統(tǒng)接口。不是具有一個API接口為每種可能的語言和數(shù)據(jù)模型服務(wù),而是所有API都能夠共享一個公用數(shù)據(jù)模型;XML中間語言QIL的運算符。
QIL也針對解決眾所周知的編譯程序問題。通常,就語言來講,編譯器需要在N個后端目標(biāo)機上實現(xiàn)M種前端語言。如果實現(xiàn)每個成對組合,那么就需要M次N編譯器實施方案來覆蓋所需的組合。然而,如果通過引入公用的中間表示來使上述兩者脫開關(guān)系,那么編譯器的復(fù)雜度縮減為僅僅M加N。
查詢中間語言提供了XML查詢/視圖語言與目標(biāo)數(shù)據(jù)模型(.NET中的真實XML數(shù)據(jù),在SQL數(shù)據(jù)或文件系統(tǒng)上的虛擬XML視圖)之間的抽象,來適應(yīng)這種編譯器復(fù)雜度縮減。
查詢中間語言可能比任何XML詢問語言本身更加有表達力的。這允許新類型的分析和最佳化,如果原始語言僅僅用于查詢和視圖的話,則所述新類型的分析和最佳化是不可能的。
示例性的計算裝置圖1及以下論述是用來提供對適合的計算環(huán)境的簡要概述,在該計算環(huán)境中可以實現(xiàn)本發(fā)明。然而,應(yīng)該理解的是,如上所述,打算結(jié)合本發(fā)明來使用各類手提式、便攜式及其它計算裝置和計算對象。因此,盡管在下面描述了通用計算機,但是這只是一個例子,可以利用其它計算裝置來實現(xiàn)本發(fā)明,比如具有網(wǎng)絡(luò)/總線互用性和交互作用的客戶端。因此,本發(fā)明可以在網(wǎng)絡(luò)化寄宿服務(wù)的環(huán)境中加以實現(xiàn),在所述服務(wù)中,牽涉微乎其微的或極少的客戶端資源,例如,網(wǎng)絡(luò)環(huán)境,在該網(wǎng)絡(luò)環(huán)境中客戶端裝置僅僅作為對網(wǎng)絡(luò)/總線接口進行服務(wù),比如像置于設(shè)備中的對象,或者其它計算裝置和對象也可以。實質(zhì)上,可以存儲數(shù)據(jù)的任何地方或者可以從中檢索數(shù)據(jù)的任何地方,都是根據(jù)本發(fā)明的操作而期望的或適合的環(huán)境。
雖然是不需要的,但是本發(fā)明可以通過操作系統(tǒng)來實現(xiàn)以供為裝置或?qū)ο蠓?wù)的開發(fā)人員使用,和/或包括在根據(jù)本發(fā)明操作的應(yīng)用軟件之內(nèi)??梢栽谄胀ǖ挠嬎銠C可執(zhí)行指令上下文中描述軟件,比如由一個或多個計算機執(zhí)行的程序模塊,比如客戶端工作站、服務(wù)器或者其它裝置。一般來講,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例行程序、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。典型地,可以將程序模塊的功能組合起來或者根據(jù)各種實施例中的需要將其發(fā)布。此外,本技術(shù)領(lǐng)域的技術(shù)人員將會認識到本發(fā)明可以利用其它的計算機配置來實施??赡苓m用于同本發(fā)明一起使用的其它眾所周知的計算系統(tǒng)、環(huán)境和/或結(jié)構(gòu)包括但不限于個人電腦(PC)、自動出納機、服務(wù)器計算機、手提式的或膝上型的裝置、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、可編程用戶電子設(shè)備、網(wǎng)絡(luò)PC、設(shè)備、照明器、環(huán)境控制元件、小型計算機、大型計算機等等。本發(fā)明還可以在分布計算環(huán)境中實施,在所述分布計算環(huán)境中,任務(wù)是由經(jīng)通信網(wǎng)絡(luò)/總線或其它數(shù)據(jù)傳輸介質(zhì)鏈接的遠程處理裝置執(zhí)行的。在分布計算環(huán)境中,程序模塊可以位于包含記憶體存儲器裝置的本地計算機存儲介質(zhì)和遠程計算機存儲介質(zhì)兩者當(dāng)中,并且客戶端節(jié)點又可以充當(dāng)服務(wù)器節(jié)點。
因此,圖1舉例說明了適合的計算系統(tǒng)環(huán)境100的例子,在該計算系統(tǒng)環(huán)境中可以實現(xiàn)本發(fā)明,盡管正如上面闡明的那樣,所述計算系統(tǒng)環(huán)境100僅僅是適合的計算環(huán)境的一個例子,并不意在暗示對本發(fā)明使用或功能的范圍的任何限制。也不應(yīng)該將該計算環(huán)境100解釋成具有與示例性操作環(huán)境100中舉例說明的任意一個元件或任意元件組合有關(guān)的任意相關(guān)性或需求。
參照圖1,用于實現(xiàn)本發(fā)明的示例性系統(tǒng)包括以計算機系統(tǒng)110形式出現(xiàn)的通用計算裝置。計算機系統(tǒng)110的組件可以包括但不限于處理單元120、系統(tǒng)存儲器130以及將包含系統(tǒng)存儲器的各種系統(tǒng)組件耦合到處理單元120的系統(tǒng)總線121。系統(tǒng)總線121可以是任何幾種類型的總線結(jié)構(gòu),包括使用各種總線體系結(jié)構(gòu)中任意一種的存儲器總線或存儲器控制器、外圍總線和局部總線。作為舉例而非限制,這類體系結(jié)構(gòu)包括工業(yè)標(biāo)準(zhǔn)結(jié)構(gòu)(ISA)總線、微通道結(jié)構(gòu)(MCA)總線、增強型ISA(EISA)總線、視頻電子標(biāo)準(zhǔn)協(xié)會(VESA)局部總線、以及外設(shè)部件互連(PCI)總線(亦稱附加板總線)。
計算機可讀介質(zhì)可以是計算機系統(tǒng)110能訪問的任何可用介質(zhì),并且既包括易失性介質(zhì)又包括非易失性介質(zhì),還包括可拆卸的和不可拆卸的介質(zhì)。作為舉例而非限制來講,計算機可讀介質(zhì)可以包括計算機存儲器介質(zhì)和通信介質(zhì)。計算機存儲器介質(zhì)包括以用于信息存儲的任何方法或技術(shù)來實現(xiàn)的易失性和非易失性、可拆卸的和不可拆卸的介質(zhì),所述信息比如像計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)。計算機存儲器介質(zhì)包括但不限于隨機存取存儲器(RAM)、只讀存儲器(ROM)、電可擦可編程只讀存儲器(EEPROM)、閃速存儲器或其它存儲技術(shù)、只讀光盤(CDROM)、可重寫光盤(CDRW)、數(shù)字通用盤(DVD)或其他光盤存儲器、磁盒、磁帶、磁盤存儲器或其他磁存儲器裝置、或可用于存儲所需信息和可以由計算機系統(tǒng)110訪問的任何其他介質(zhì)。通信介質(zhì)典型地包含計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或已調(diào)制數(shù)據(jù)信號(例如載波)中的其他數(shù)據(jù)、或其他傳送機構(gòu)并且包括任何信息傳遞介質(zhì)。術(shù)語″已調(diào)制數(shù)據(jù)信號″指具有一個或多個其特征集或在信號中以編碼信息方式變化的信號。作為舉例但不限定,通信介質(zhì)包括有線介質(zhì)例如有線網(wǎng)絡(luò)或直接有線連接和無線介質(zhì)例如聲、RF、紅外及其他無線介質(zhì)。任何上述的組合也包括在計算機可讀介質(zhì)范圍內(nèi)。
系統(tǒng)存儲器130包括計算機存儲介質(zhì),其為易失性和/或非易性失存儲器形式,例如只讀存儲器(ROM)131和隨機存取存儲器(RAM)132。包含例如在啟動期間,有助于在計算機系統(tǒng)110內(nèi)部元件之間傳遞信息的基本例程基本輸入/輸出系統(tǒng)133(BIOS)典型地保存在ROM 131中。RAM 132典型地包含可由處理單元120立即訪問和/或立刻操作的數(shù)據(jù)和/或程序模塊。舉例來說,而不限定,圖1示出了操作系統(tǒng)134、應(yīng)用程序135、其它程序模塊136和程序數(shù)據(jù)137。
該計算機系統(tǒng)110也可以包括其他可拆卸/不可拆卸、易失/非易失計算機存儲介質(zhì)。僅僅舉例來說,圖1示出了讀寫到不可拆卸、非易失性磁介質(zhì)的硬盤驅(qū)動器141、讀寫到可拆卸、非易失性磁盤152的磁盤驅(qū)動器151和讀寫到可拆卸、非易失性光盤156的光盤驅(qū)動器155,例如CDROM、CDRW、DVD或其他光介質(zhì)??捎糜谠撌痉缎圆僮鳝h(huán)境的其他可拆卸/不可拆卸、易失/非易失計算機存儲介質(zhì)包括,但不局限于,磁帶盒、閃存卡、數(shù)字通用盤、數(shù)字視頻磁帶、固態(tài)RAM、固態(tài)ROM等等。該硬盤驅(qū)動器141典型地經(jīng)由不可拆卸存儲器接口例如接口140連接到系統(tǒng)總線121,并且磁盤驅(qū)動器151和光盤驅(qū)動器155典型地經(jīng)由可拆卸存儲器接口例如接口150連接到系統(tǒng)總線121。
上述所描述的和在圖1中示出的驅(qū)動器和他們相聯(lián)系的計算機存儲介質(zhì)為計算機系統(tǒng)110提供計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊、及其他數(shù)據(jù)的存儲。在圖1中,例如,將硬盤驅(qū)動器141舉例說明成存儲操作系統(tǒng)144、應(yīng)用程序145、其它程序模塊146和程序數(shù)據(jù)147。注意這些組件要么與操作系統(tǒng)134、應(yīng)用程序135、其它程序模塊136和程序數(shù)據(jù)137相同,要么與它們不同。在這里,給操作系統(tǒng)144、應(yīng)用程序145、其它程序模塊146和程序數(shù)據(jù)147指定了不同的數(shù)字標(biāo)記,以便至少說明它們是不同的副本。用戶可以通過諸如鍵盤162和指點器161之類的輸入裝置將命令和信息輸入到計算機系統(tǒng)110中,所述指點器通常稱為鼠標(biāo)器、軌跡球或觸摸板。其它的輸入裝置(未示出)可能包括麥克風(fēng)、操縱桿、游戲板、圓盤式衛(wèi)星電視天線、掃描儀等等。這些及其它輸入裝置往往通過耦合于系統(tǒng)總線121的用戶輸入接口160連接于處理單元120,但是可以通過其它接口和總線結(jié)構(gòu)來連接,比如并行端口、游戲端口或通用串行總線(USB)。監(jiān)控器191或其它類型的顯示裝置也通過諸如視頻接口190之類的接口連接于系統(tǒng)總線121,所述視頻接口可能又與視頻存儲器(未示出)相通信。除了監(jiān)控器191之外,計算機系統(tǒng)還可以包括其它的外圍輸出裝置,比如像揚聲器197和打印機196,可以通過輸出外圍接口195加以連接。
計算機系統(tǒng)110可以使用到一個或多個遠程計算機(比如,遠程計算機180)的邏輯連接來在網(wǎng)絡(luò)或分布式環(huán)境中工作。遠程計算機180可以是個人電腦、服務(wù)器、路由器、網(wǎng)絡(luò)化PC、對等裝置或其它公用網(wǎng)絡(luò)節(jié)點,并且典型地包括上面針對計算機系統(tǒng)110所描述的許多或所有元件,不過在圖1中僅僅已經(jīng)舉例說明了記憶體存儲器裝置181。圖1中描繪的邏輯連接包括局域網(wǎng)(LAN)171和廣域網(wǎng)(WAN)173,但是還可以包括其它的網(wǎng)絡(luò)/總線。在家庭、辦公室、企業(yè)用計算機網(wǎng)絡(luò)、內(nèi)聯(lián)網(wǎng)和因特網(wǎng)中這類網(wǎng)絡(luò)環(huán)境是很常見的。
當(dāng)用在LAN網(wǎng)絡(luò)環(huán)境中時,計算機系統(tǒng)110通過網(wǎng)絡(luò)接口或適配器170連接于LAN 171。當(dāng)用在WAN網(wǎng)絡(luò)環(huán)境中時,計算機系統(tǒng)110典型地包括調(diào)制解調(diào)器172或用于通過諸如因特網(wǎng)之類的WAN 173建立通信的其它裝置。調(diào)制解調(diào)器172可以是內(nèi)部的或外部的,它可以通過用戶輸入接口160或其它適當(dāng)?shù)臋C構(gòu)連接于系統(tǒng)總線121。在網(wǎng)絡(luò)環(huán)境中,針對計算機系統(tǒng)110所描述的程序模塊或其部分可以存儲在遠程記憶體存儲裝置中。作為舉例而非限制,圖1把遠程應(yīng)用程序185舉例說明成駐留在存儲裝置181上。將會認識到的是,所示出的網(wǎng)絡(luò)連接是示例性的,也可以使用用于在計算機之間建立通信鏈路的其它裝置。
根據(jù)個人計算與因特網(wǎng)的交匯,各種分布式計算框架已經(jīng)開發(fā)出來并正在繼續(xù)進行開發(fā)。為像個人用戶和商業(yè)用戶這樣的用戶提供了一種用于應(yīng)用和計算裝置可無縫互操作且啟用Web的接口,使得面向Web瀏覽器或網(wǎng)絡(luò)的計算活動增加。
例如,微軟公司的.NET平臺包括服務(wù)器、構(gòu)件塊服務(wù),比如基于Web的數(shù)據(jù)儲存軟件和可下載裝置軟件。盡管在這里結(jié)合駐留在計算裝置上的軟件描述了示例性的實施例,但是本發(fā)明的一個或多個部分同樣也可以通過操作系統(tǒng)、應(yīng)用編程接口(API)或任何協(xié)處理器之間的“中間商”對象、顯示裝置和請求對象來實現(xiàn),以便可以通過在所有.NET語言和服務(wù)中得到支持或者經(jīng)由所有.NET的語言和服務(wù)被訪問,來執(zhí)行根據(jù)本發(fā)明的操作,也可以在其它的分布式計算框架中執(zhí)行本發(fā)明。
示例性的實施例圖2描繪了使本發(fā)明具體化的系統(tǒng)體系結(jié)構(gòu)的框圖。該體系結(jié)構(gòu)描繪了用于為基于多個數(shù)據(jù)源的有效XML查詢進行接收、編譯、解釋、正規(guī)化和存取數(shù)據(jù)所需的基本塊??梢詫崿F(xiàn)與XML或XML相關(guān)標(biāo)準(zhǔn)一致的多個前端語言編譯器210。這些前端編譯器210產(chǎn)生XML查詢、XML視圖、或其它有關(guān)的XML語言詢問,以便產(chǎn)生編譯后的XML代碼215。
中間語言發(fā)生器220產(chǎn)生所輸入的編譯后的XML代碼的中間語言表示225。體系結(jié)構(gòu)200中的功能230可以對中間語言表示進行正規(guī)化,以便跨越多個數(shù)據(jù)源提供實用性(utility)。正規(guī)化器230還可以用來優(yōu)化中間語言以便產(chǎn)生高效的中間語言表示235。應(yīng)當(dāng)注意的是對于圖2的體系結(jié)構(gòu)200而言,并非絕對需要中間語言正規(guī)化器。
可以有多個后端查詢引擎240來支持數(shù)據(jù)源260的多樣性,所述數(shù)據(jù)源可以經(jīng)由中間代碼表示加以訪問??梢詫γ總€后端引擎進行構(gòu)建,以便它有效地處理與每個支持數(shù)據(jù)源內(nèi)的數(shù)據(jù)模型相一致的數(shù)據(jù)源。后端引擎240生成對應(yīng)于中間語言中的XML表示的目標(biāo)數(shù)據(jù)源查詢。后端查詢引擎240將適當(dāng)?shù)臋C器代碼245傳遞給查詢執(zhí)行引擎250,所述查詢執(zhí)行引擎能夠執(zhí)行指定的查詢。查詢執(zhí)行引擎250通常訪問(步驟265)一個或多個數(shù)據(jù)源260,以便該引擎可以輸出(步驟255)查詢結(jié)果。
可以在一個或多個不同類型的不同數(shù)據(jù)源上使用一個或多個初始的查詢,來產(chǎn)生期望的查詢結(jié)果。
圖3是依照本發(fā)明的示例性的中間語言發(fā)生器(例如,圖2中的元件)的功能框圖。圖3描繪了可能存在饋送中間語言(IL)發(fā)生器220的多個(達到M個)XML語言編譯器源210a-d。這些XML語言編譯器總體上涉及掃描、解析、語義分析和轉(zhuǎn)換成某種類型的XML語言。這種語言的典型例子就是XPath、XMLStylesheet語言(XSL)、XSLT、XML查詢語言(XQuery)以及微軟公司查詢語言(比如像XQuery DMLTM、OPathTM和WPathTM)的W3C標(biāo)準(zhǔn)。還可以存在XML視圖編譯器,并且它包括XQueryTM的W3C XML標(biāo)準(zhǔn)視圖以及微軟公司注釋模式,比如SQLXMLTM。本發(fā)明的中間語言表示技術(shù)也可兼容于用于查詢和視圖的其它XML語言。一般來講,所有XML可兼容的查詢和視圖都可以稱作為XML語言詢問。
圖3中描繪的中間語言發(fā)生器220分成了兩個主要部分一個是操作標(biāo)識符310,而另一個是節(jié)點運算符處理器320。它們共同描繪了XML中間語言產(chǎn)生器220的語義解釋器功能。操作標(biāo)識符310執(zhí)行標(biāo)識來自于編譯器210a-d的初始XML查詢或視圖內(nèi)的操作的任務(wù)。將標(biāo)識后的操作映射到由操作標(biāo)識符310構(gòu)建的圖形結(jié)構(gòu)中的節(jié)點上。節(jié)點運算符處理器320把XML IL特定的操作者映射到已構(gòu)建的圖形節(jié)點中,以便結(jié)束查詢的圖形表示。然后,節(jié)點運算符處理器320將運算符解碼成初始查詢或視圖的XML中間語言表示。將這一輸出傳遞到一個或多個后端引擎240a-d上。
可以將達到N個之多的后端引擎240a-d添加到體系結(jié)構(gòu)中,以便利用中間語言表示來跨越多個數(shù)據(jù)源實施查詢。查詢語言和視圖語言與多個目標(biāo)模型之間的中間語言抽象,允許在關(guān)系(例如,SQL)數(shù)據(jù)和非關(guān)系(例如,平面文件)數(shù)據(jù)上使用真實的XML數(shù)據(jù)(比如來自于微軟公司.NETTM)和虛擬的XML數(shù)據(jù)。
圖4表示本發(fā)明實施例的流程圖,其表示示例性的中間語言產(chǎn)生器的語義解釋器功能。在步驟410,由中間語言發(fā)生器來接收XML查詢或視圖。在步驟420,將接收到的查詢傳遞(步驟415)給標(biāo)識函數(shù),所述標(biāo)識函數(shù)首先標(biāo)識并生成對應(yīng)于接收到的XML查詢或視圖當(dāng)中的每個XML操作的圖形節(jié)點對象。在步驟430,一旦標(biāo)識了節(jié)點對象,就將它們傳遞給變換函數(shù)(translation function)。翻譯函數(shù)將已標(biāo)識的對象分配到中間語言運算符中。典型地,每個節(jié)點都有一個中間語言運算符。現(xiàn)在,在步驟440,將變換后的節(jié)點對象(現(xiàn)在是中間語言運算符)傳遞(步驟435)于中間語言形成引擎。這將中間語言運算符映射到顯式的XML部分中,所述XML部分形成了構(gòu)建后的中間語言225。繼而,例如,如圖2中編號230所示,可以將構(gòu)建后的中間語言輸出到中間語言正規(guī)化器中,或者例如,如圖3中編號240a-d所示,可以將其輸出到一個或多個后端引擎中。
查詢中間語言屬性和性能XML中間語言是XML查詢或視圖的表示。照此,可以將查詢中間語言(QIL)術(shù)語化,這是因為它是XML查詢的含義的顯式表示。可以把QIL看作跨越XML查詢和視圖語言編譯器的公用語義表示。QIL類似于普通的抽象語法樹(AST),不過區(qū)別之處在于QIL不具有query的語法而是具有查詢的語義或含義。另一個區(qū)別就是QIL是圖形結(jié)構(gòu)而不是像AST這樣的樹型結(jié)構(gòu)。
QIL在各種不同的目標(biāo)數(shù)據(jù)源(比如像,關(guān)系和非相關(guān)數(shù)據(jù))上啟用了多個不同的XML查詢語言和視圖定義語言(例如,諸如像XPath、XSLT、XQuery、DML和注釋模式)的抽象。照此,QIL啟用了公用組成來支持所有兼容的XML語言。每個操作都既是顯式的又是明確的,這造成QIL冗長,不過將參與生成QIL的前端編譯器從使用QIL的后端引擎上斷開了聯(lián)系。
查詢中間語言還提供了一種將任意數(shù)據(jù)源作為虛擬XML建模的方法??梢灾苯油ㄟ^XML數(shù)據(jù)模型數(shù)據(jù)源來陳列數(shù)據(jù)源,或者QIL用戶可以首先分析查詢所生成的中間語言并確定怎樣最好地發(fā)布該查詢。例如,一些查詢結(jié)果可以表明可以容易地把一些運算符牽引到適合于那個數(shù)據(jù)源的查詢引擎中,并由此以邏輯方式來劃分查詢。QIL允許將查詢?nèi)蝿?wù)牽引到能最有效執(zhí)行該查詢?nèi)蝿?wù)的引擎中。
查詢中間語言利用表示初始查詢的圖形結(jié)構(gòu)的節(jié)點來使用其自己的運算符。這些運算符允許新種類的查詢優(yōu)化、查詢重寫以及早前不能用相應(yīng)的數(shù)據(jù)源實現(xiàn)的其它分析。大部分的QIL運算符跨越多種語言都是公用的,并且其中一些是專門對應(yīng)特殊XML查詢語言的。盡管每種XML語言都具有其自己隱含的任務(wù)和專門的情況,但是查詢中間語言對這些含義進行顯式且明確地編碼。
查詢中間語言是節(jié)點對象的圖形。這種中間語言包含最多一個有根圖形,該有根圖形是主要的查詢,還包含零個或多個定義XML中間語言函數(shù)的附加圖形。存在許多不同的方式來表示存儲器中的圖形;使用節(jié)點對象的網(wǎng)絡(luò)就是一個實施例。QIL使用了跨越許多不同節(jié)點類型共享的類,而不是為每個節(jié)點類型定義一個類。
即使初始查詢語言不是強類型的,QIL也是強類型的。QIL可以支持遍及XML數(shù)據(jù)的XML查詢、遍及相關(guān)數(shù)據(jù)的XML視圖的XML查詢、遍及相關(guān)數(shù)據(jù)的XSLT以及遍及非相關(guān)數(shù)據(jù)的XML查詢,所述非相關(guān)數(shù)據(jù)比如像文本文件、電子表格和非關(guān)系數(shù)據(jù)庫。QIL也可以用來跨越多個數(shù)據(jù)源執(zhí)行不同種類的、已發(fā)布的查詢,并且還可以將XML和虛擬XML數(shù)據(jù)源融合起來。
QIL表示查詢的含義,且因而是一種邏輯查詢設(shè)計而非物理查詢設(shè)計。QIL存在多種執(zhí)行策略??梢灾苯拥匾宰髠?cè)深度優(yōu)先的方式、在全部QIL圖形上反復(fù)執(zhí)行語言?;蛘撸梢詫⒉樵冎虚g語言變換成另一種語言來執(zhí)行,比如像SQL。另一個可選方案就是忽略QIL來作出分析,提取由一個引擎執(zhí)行的某些部分,根據(jù)需要修改圖形,并且通過另一個現(xiàn)有引擎來保持執(zhí)行的平衡性。
QIL是強類型的。QIL具有詳細的類型系統(tǒng),并且這個類型系統(tǒng)反映在如下表當(dāng)中,所述表指的是示例性的QIL運算符,其中一些QIL運算符在這里作了描述。除非另作說明,否則該說明表示了表達式的固定類型,而不表示它要評估的值的自動類型。
除了像DocumentOrder和DML這樣的少數(shù)幾個已選定的“運算符”之外,每個QilNode表達式都是一些基數(shù)的序列。除非另有陳述,否則這個基數(shù)總是以下基數(shù)的其中之一None(未知)、Zero(空)、One(單元素集合)、More(2+)或這些的組合。
所述序列由一些項組成,由于允許不同種類的序列,因此這些項要么可以是原子值或節(jié)點要么兩者都是。進一步把原子值分為一組類型,比如像Iht32、String和DateTime。對于大部分,QIL原子類型是XQuery原子類型的子集,并且反映了實際的實施方案選擇。當(dāng)表達式其不是原子的(即,節(jié)點或選定的運算符類型,像DML),那么就具有原子類型None。
示例性的QIL運算符優(yōu)選地,QIL的每個運算符具有唯一相應(yīng)的NodeType和表示它的類。實質(zhì)上,運算符存在于QIL圖形結(jié)構(gòu)的節(jié)點中。因此,分配給節(jié)點的運算符具有節(jié)點類型,并且該運算符變?yōu)楣?jié)點類型的函數(shù)。每個類都有許多節(jié)點類型,不過每個節(jié)點類型僅僅有一個類。期望每個運算符都具有單一的、顯式的、明確的含義??傮w上講,這種含義與其操作數(shù)的類型或使用它的環(huán)境無關(guān)。根據(jù)這里所述的QIL類型系統(tǒng),每個運算符都是強類型的。
這里所提供的是對應(yīng)每個運算符節(jié)點類型的一些示例性屬性的表。除非另有說明,否則沒有操作數(shù)可以是null。QIL運算符可以分類成下列示例性的組特殊算符(錯誤、無操作、未知)、數(shù)據(jù)源、文字(標(biāo)量常數(shù))、布爾運算符、序列算符、算術(shù)運算符、串算符、值比較算符、節(jié)點比較算符、元組空間(包括排序)、函數(shù)定義與調(diào)用、XML導(dǎo)航、XML組成、XML屬性存取器、類型運算符、用于XPath、XSLT、XQuery和數(shù)據(jù)操作語言(DML)的特定語言運算符。
元組空間算符QIL中的示例性算符是元組(tuple)。可以頻繁地在QIL中使用元組算符,并且可以以嵌套方式來使用它。該算符是由元組節(jié)點類型(類QIL元組)來表示的,并且期望該算符總是具有剛好三個子節(jié)點一列構(gòu)建元組空間的迭代器,過濾元組空間的where子句,以及產(chǎn)生元組空間結(jié)果的returen子句。
顯現(xiàn)嵌套元組的一個方式是假想一張行列表,在該表中,每個表元(cell)本身都可以包含表。一對六邊骰子就是一個例子。正如在下列表1中局部描繪的那樣,存在36種可能的組合。
表12個六邊骰子的元組空間
這個元組空間具有三列。開頭兩個分別對應(yīng)于第一個和第二個骰子。第三列用來保存結(jié)果;在這種情況下,所述結(jié)果是一對值。這個元組空間具有36行,它們對應(yīng)于通過翻滾兩個骰子而產(chǎn)生的不同組合的數(shù)目。以下是通過將集合(1,2,3,4,5,6)與其自身結(jié)合而產(chǎn)生的元組空間,例如,XQueryfor $die1 in(1,2,3,4,5,6),$die2 in(1,2,3,4,5,6)return($die1,$die2)這個XQuery計算兩個集合的叉積,并為此叉積中的每個成員返回結(jié)果序列;即一對die值。該結(jié)果是列表的有序表((1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(2,1),(2,2)....)然而,XQuery將一列列表處理為所有它們的級聯(lián),所以這些實際上僅僅是平伸列表(1,1,1,2,1,3,1,4,1,5,1,6,2,1,2,2....)注意該查詢還可以寫成for $die1 in(1,2,3,4,5,6)for $die2 in(1,2,3,4,5,6)let $result=($die1,$die2)return $result在這種形式下,每個XQuery變量都剛好對應(yīng)于元組空間中的一列。這同樣也是QIL的概念。QIL元組節(jié)點或算符中的每個迭代器都對應(yīng)于元組空間中的一列。returen子句影響上面作為變量賦值而使用LET寫入的附加列。
執(zhí)行元組節(jié)點的結(jié)果是結(jié)果的有序表,并且當(dāng)該結(jié)果本身是一列表時,將它們像以前那樣級聯(lián)在一起(平伸)。像XQuery一樣,QIL不區(qū)分列表和列表的列表。
where子句提供了通過消除元組空間中的一些行來過濾該元組空間的時機。期望該where子句不會對元組空間有其它的影響。在所有上面的例子當(dāng)中,where子句由單個真實節(jié)點組成,這意味著接收每一行(不會發(fā)生過濾)。然而,所述結(jié)果可能限于共計7次的六個die翻滾,如下for $die1 in(1,2,3,4,5,6)for $die2 in(1,2,3,4,5,6)let $result=($die1,$die2)where $die1+$die2=7return $result這創(chuàng)建了過濾后的表2中所描繪的元組空間。
表2共計7次的骰子翻滾的元組空間
這個XQuery例子可以利用下列查詢中間語言表示來代表注意這只不過是QIL數(shù)據(jù)結(jié)構(gòu)的一種XML表示。
<Tuple>
<!--First the iterator list-->
<Forid=″$a″>
<List>
<Literallnteger>1</LiteralInteger>
<LiteralInteger>2</Literallnteger>
<LiteralInteger>3</Literalinteger>
<IiteralInteger>4</LiteralInteger>
<LiteralInteger>5</LiteralInteger>
<LiteralInteger>6</LiteralInteger>
</List>
</For>
<For id=″$b″>
<List>
<LiteralInteger>1</LiteralInteger>
<LiteralInteger>2</LiteralInteger>
<LiteralInteger>3</LiteralInteger>
<LiteralInteger>4</LiteralInteger>
<LiteralInteger>5</LiteralInteger>
<LiteralInteger>6</LiteralInteger>
</List>
</For>
<Let id=″$c″>
<List>
<For id=″$a″/>
<For id=″$b″/>
</List>
</Let>
<!-Then the where clause-->
<Eq>
<Plus>
<For id=″$a″/>
<For id=′$b″/>
</Plus>
<LiteralInteger>7</LiteralInteger>
</Eq>
<!-Then the return clause-->
<Let id=″Sc″/>
</Tuple>
將迭代器節(jié)點(為Let)引入迭代器列表中,然后稍后在查詢中再次參考該迭代器節(jié)點。為了象征性地參考它們,可以給它們指定唯一的id屬性,然后稍后按這些名稱來參考它們。注意這些id串實際上在圖形中是不存在的,而且也與初始查詢無關(guān);只有當(dāng)將圖形打印成XML時才生成它們。優(yōu)選地,這些參考是指向初始節(jié)點實例的存儲器指針。
因此,這個QIL圖形包含二十二個唯一的節(jié)點以及以粗體突出顯示的五種參考(兩個在$c的定義中,兩個在元組的where子句中,而一個在元組的return子句中)。
作為另一個例子,考慮該XQueryfor $i in document(′foo.xml′)/x/yreturn<z/>
其相當(dāng)于XQueryfor $a in document(′foo.xml′)returnfor $b in $i/xreturnfor $c in $i/xreturn<z/>
并且兩者均可以表示為如下QIL表達式<Tuple>
<For id=″$a″>
<DataSource>
<String>foo.xml</String>
<DataSource>
</For>
<True/><!--no where clause-->
<Tuple>
<For id=″$b″/>
</Content>
<For id=″$b″/>
</Content>
</For>
</Eq>
<NameOf>
<For id=″$b″/>
</NameOf>
<QName local-name=″x″/>
</Eq>
<Tuple>
<For id=″$c″>
<Content>
<For id=″$b″>
</Content>
</For>
<Eq>
<Nameof>
<For id=″$c″/>
</NameOf>
<QName local-name+″y″/>
</Eq>
<ElementCtor>
<QName local-name=″z″/>
<List/>
</ElementCtor>
</Tuple>
</Tuple>
如果原始文檔foo.xml由下列XML組成
<x id=″x1″>
<y id=″y1″/>
<y id=″y2″/>
</x>
<x id=″x2″>
<y id=″y3″/>
<y id=″y4″/>
<y id=″y5″/>
</x>
那么該QIL和XQuery例子就生成表3中所描繪的嵌套元組空間。
表3簡易Xquery的元組空間
因為示例性的數(shù)據(jù)模型不包括列表的列表,所以包含具有N列的表的列可以用那些N列來替換;依照要求對行進行擴展和拷貝。因此,這個元組空間通過一系列無嵌套操作而等同于表4的“平伸”元組空間。
表4簡易Xquery的平伸元組空間
以期望的文檔次序來在x/y上迭代,執(zhí)行QIL會產(chǎn)生五種<z/>元素。
相對于表5,在下面描述了一組分組為元組空間運算符的運算符。元組引入變量約束(賦值或迭代),利用where子句來對其進行過濾,并返回結(jié)果表達式。當(dāng)返回的結(jié)果本身是元組時,那么就進行叉積或加入結(jié)果。
存在兩種類型的迭代器節(jié)點;FOR和LET,LET僅僅是變量賦值,并且具有基數(shù)1。FOR在序列上迭代,依次約束于每個成員。因此,F(xiàn)OR的基數(shù)為其約束的長度。元組空間的基數(shù)最多是其迭代器的基數(shù),所述迭代器記錄了其returen子句的迭代次數(shù)。對于元組空間中的每一項,評估where子句,如果為真則評估并返回returen子句。元組的結(jié)果是所有這些返回值的序列級聯(lián)(可能是空序列)。當(dāng)引入到元組中時,每個迭代器都處于所有的where子句和return字句的范圍內(nèi)。LET迭代器保持其自變量的節(jié)點特性。除了這種復(fù)雜行為之外,QIL是明晰參考的(意味著LET可以用其約束來替換,反之亦然)。
可以將POSITIONOF運算符應(yīng)用于迭代器。它確定其約束內(nèi)迭代器的當(dāng)前位置。這個位置是基于1的索引。應(yīng)用于LET迭代器的POSITIONOF總是1。應(yīng)用于FOR迭代器的POSITIONOF在1與其長度之間。
表5元組空間運算符
文字運算符在下面的表6中描述了一組分組為文字運算符的運算符。文字表示常數(shù)。單個類,QILLiteral,表示所有的文字類型(除布爾型之外,該布爾型是利用QILNode本身來表示的,而Name是利用QILName來表示的)。文字值是作為對象來存儲的。
表6文字運算符
表6文字運算符(續(xù)表)
布爾運算符在下面的表7中描述了一組分組為布爾運算符的運算符。期望QIL支持常規(guī)的雙值邏輯運算符,AND、OR和NOT,以及CONDITIONAL(隱式)。優(yōu)選地,通用的和存在的量化是通過IsEmpty和Tuple的組合來實現(xiàn)的。
QIL支持合取范式、析取范式和一類轉(zhuǎn)換(switch)的便利運算符。對于AND和OR,這兩種操作數(shù)都是理想的布爾型單元素。NOT運算符的操作數(shù)是理想的布爾型單元素集合。
對于運算符CONDITIONAL,期望條件表達式(QIL Ternary節(jié)點的左側(cè)屬性)是布爾型單元素集合,而真/假分支(分別是中心和右側(cè)屬性)可以為任何類型。else分支不是任意的。然而,任何人通常都可以使用空表來達到“dummy(假的)”分支的效果。整個表達式的類型是真/假分支類型的聯(lián)合。
為了將操作數(shù)強制為布爾型,依據(jù)應(yīng)用的需要,人們可以使用運算符,比如XQUERYEBV或CONVERT。
表7布爾運算符
序列運算符在下面的表8中描述了一組分組為序列運算符的運算符。優(yōu)選地,每個QIL表達式都是一些基數(shù)的有序序列。為了與序列一同工作,XQuery定義了許多運算符和集合器(aggregator)。LIST運算符對其成員執(zhí)行序列級聯(lián)??毡碛写蟛糠值念愋投荚O(shè)置為None;否則,列表的類型是所有其成員類型的聯(lián)合。LIST未按照特性或重復(fù)值來刪除重復(fù)節(jié)點。為了從序列中刪除重復(fù)的節(jié)點,人們可以顯式地應(yīng)用有差別的運算符(DISTINCT、DISTINCTBYVALUE)中的一個,否則人們可以使用SBT運算符。
與XQuery TO運算符相似,RANGE在左側(cè)約束和右側(cè)約束之間構(gòu)建整數(shù)的連續(xù)序列。如果右側(cè)約束小于左側(cè)約束的話,那么序列遞減。如果它們相等,那么序列具有單成員(那個值)。
NTIMES是二進制算符,它的左側(cè)操作數(shù)可以是任何類型,而期望右側(cè)操作數(shù)是非負整數(shù)單元素集合。它產(chǎn)生包含左側(cè)操作數(shù)N次的序列,其中N是右側(cè)操作數(shù)的值。注意它不拷貝原始值。(NTIMES left right)相當(dāng)于表達式(Tuple(For(Range l Right))(True)(Left)).
DISTINCT從列表中刪除重復(fù)節(jié)點(按照特性)。刪除節(jié)點的次序最好是定義好的實施方案。
將DISTINCTBY的值作為其在序列上應(yīng)用于FOR迭代器的第一自變量,繼而該值處于第二自變量的范圍內(nèi)以供參考。第二自變量規(guī)定了如何計算這樣的值,通過該值將會刪除重復(fù)的節(jié)點。
UNION、INTERSECTION和DIFFERENCE運算符利用節(jié)點特性來執(zhí)行相應(yīng)的集合運算符,從而刪除重復(fù)的節(jié)點。它們的操作數(shù)可以是節(jié)點序列。集合的差是不對稱的;對于兩個序列A和B的對稱差而言,人們可以獲得它們成對差的UNION;(Union(Difference A B))(Difference B A),也可以等效的,利用它們的INTERSECTION獲得它們UNION的DIFFERENCE;(Difference(Union A B))(Intersection A B)。
用數(shù)字表示的集合函數(shù)(AVERAGE、SUM、MINIMUM、MAXIMUM)都具有這樣的操作數(shù),期望這些操作數(shù)是數(shù)值的序列。它們將該序列中的所有成員都提升為公用類型,然后計算適當(dāng)?shù)暮瘮?shù)。例如,(Average(Decimal 1.0)(Int32 3))是(Decimal 2.0).應(yīng)用于空序列的所有這四個運算符將導(dǎo)致空序列。
對于這些運算符中的大多數(shù)來講,整個表達式的類型要取決于其自變量。例如,具有屬性序列的元素序列的聯(lián)合作為其NodeKind兩類的聯(lián)合。所有的組序列運算符都接收任何基數(shù)的操作數(shù)。
表8序列運算符
表8序列運算符(續(xù)表)
算術(shù)運算符在下面的表9中描述了一組分組為算術(shù)運算符的運算符。算術(shù)運算符具有這樣的特性,即依其操作數(shù)的類型而變化。所有算術(shù)運算符都要求它們的操作數(shù)具有相同的(數(shù)值)類型和基數(shù)1,然后在該類型中執(zhí)行運算。除法是這些規(guī)則的一個例外。DIVIDE總是將整數(shù)操作數(shù)提升為雙整型。INTEGERDIVIDE執(zhí)行整數(shù)除法,因此其操作數(shù)是整數(shù)。
算術(shù)例外(比如,溢出和回流)都是定義好的實施方案。對于浮點類型而言,NaN是無信號的,并且允許無窮大和負零。
不為非數(shù)值類型或非單元素集合定義算術(shù)運算符。為了在串上進行運算,人們可以使用串運算符(比如像STRCONCAT)或者把它們轉(zhuǎn)換成數(shù)值類型。
為了在數(shù)列上執(zhí)行運算,人們可以使用TUPLE來貫穿序列進行迭代,并且執(zhí)行成員法則操作,否則考慮使用一些序列集合器(比如SUM)。
表9算術(shù)運算符。
串運算符在下面的表10中描述了一組分組為串運算符的運算符。串運算符提供了公用的串功能,比如級聯(lián)和子串匹配。
STRLENGTH計算串的長度。期望其自變量是單元素集合串。STRCONCAT是像LIST一樣的變量-自變量運算符。它將其自變量級聯(lián)到單個串中。每個自變量都可以是一列串或空表。它將空表處理成空串。STRCONCAT接收任意的串屬性、分隔符,這對于空串而言是缺省的。它在每一對串成員之間插入分隔符值。注意盡管STRCONCAT(″″,″″)產(chǎn)生了分隔符,但STRCONCAT((),())仍舊還是空串。
STRSUBSTRING節(jié)點操作符計算串的子串。第一自變量必須是單元素集合串,而期望第二和第三自變量是單元素集合整數(shù)。它獲得0或第二自變量(稱為i0)的最大值,和0或第三自變量的最大值(稱為i1),并且計算由i0和i0+i1之間的字符組成的子串。
STRCONTAINS把兩個單元素集合串作為自變量,并且如果第一個方案包含第二自變量的話則就返回真;否則返回假。每個串都包含空串。STRENDSWITH和STRBEGINSW1TH都具有相同的功能,不過強制匹配以便分別出現(xiàn)在串的末端或起始處。
表10串運算符
值比較運算符在下面的表11中描述了一組分組為值比較運算符的運算符。QIL為比較值定義了幾種運算符。這些相當(dāng)于同名的XQuery(EQ、NE、LT、LE、GT和GE)的值比較運算符。在下文描述節(jié)點比較運算符。
期望每個操作數(shù)都是單元素集合,與期望這些操作數(shù)都具有相同的類型。根據(jù)需要,人們可以使用TREAT、CONVERT或其它類型的運算符來提升或轉(zhuǎn)換操作數(shù)。
字符串比較通常將考慮到對照(collations)。能夠以許多不同方式(存在的、通用的、最重要的、成員法則等等)來比較序列。
表11值比較運算符
節(jié)點比較運算符在下面的表12中描述了一組分組為節(jié)點比較運算符的運算符。QIL按特性或文檔次序為比較節(jié)點定義了幾種運算符。這些相當(dāng)于XQuery的節(jié)點比較運算符(IS、ISNOT、BEFORE(<<),和AFIER(>>))。
如果按照文檔次序、左側(cè)操作數(shù)出現(xiàn)在右側(cè)操作數(shù)的前面(后面),則BEFORE(AFTER)就返回真。對于來自于不同文檔的節(jié)點(或根本不是文檔中的節(jié)點),定義次序,并且該次序在執(zhí)行查詢過程內(nèi)是穩(wěn)定的,或者也可以使用定義好的實施方案。
期望每個操作數(shù)都是單元素集合節(jié)點。如果兩個操作數(shù)是相同節(jié)點(按照特性),則節(jié)點類型IS就返回真;否則為假。ISNOT返回相反的結(jié)果。從BEFORE/AFTER的定義來看,其遵循這樣的規(guī)律,即如果且只有當(dāng)BEFORE和AFTER兩者都為其返回假時,則兩個節(jié)點都具有相同的特性。因此,(Is Not $x $y)等于(Or(Before $x $y)(After $x $y)).可以以許多不同的方式來比較序列,比如存在的、通用的、最重要的、成員法則等等。
表12節(jié)點比較運算符
排序與對照運算符在下面的表13中描述了一組分組為排序與對照運算符的運算符。QIL定義了單個SORT節(jié)點或運算符,它們獲得兩個自變量。第一自變量在將要排序的集合(collection)上引入了FOR迭代器。這個迭代器處于第二自變量的范圍內(nèi),該第二自變量表示排序鍵(sort key)。
每個排序鍵都是ASCENDING或者是DESCENDING。像DOCUMENTORDER一樣鍵表達式可以是常量或更復(fù)雜的表達式。
DOCORDERDISTINCT是按照文檔次序來對序列進行排序并且按照特性來刪除重復(fù)節(jié)點的便利運算符。(DocOrderDistinct $x)等于(Distinct(Sort X(Ascending DocOrder)))。它的操作數(shù)必須是可能為空的節(jié)點序列。
表13排序與對照運算符
函數(shù)定義與調(diào)用運算符在下面的表14中描述了一組分組為函數(shù)定義與調(diào)用運算符的運算符。QIL既能夠表示函數(shù)定義也能夠表示函數(shù)調(diào)用。調(diào)用出現(xiàn)了幾種類型;利用QIL來定義本身的函數(shù)調(diào)用,內(nèi)嵌于運行時函數(shù)的調(diào)用,以及任意方法的早先約束和最近約束的調(diào)用(例如,XSLT擴展對象)。
自變量最好是定位的。如果人們需要通過QIL將換名調(diào)用語義進行管道傳輸,那么人們可能會需要將所有名稱映射到位置(正如XSLT編譯器做的那樣),或者需要構(gòu)建這樣一種結(jié)構(gòu),即利用值來給名稱配對(比如,對于過程所存儲的SQLXML,msvariables()可能會處理得好),并且在QIL中對名稱匹配算法進行編碼。
調(diào)用利用一系列LET迭代器來傳遞自變量。在FUNCTION定義中,這些迭代器約束于充當(dāng)符號參考的空行(null),在運行時從外部提供所述符號參考的值。
表14函數(shù)定義與調(diào)用運算符
XML導(dǎo)航運算符在下面的表15中描述了一組分組為XML導(dǎo)航運算符的運算符。在QIL中,在句法上保持了路徑風(fēng)格(Path-style)的導(dǎo)航;它拆分為元組空間和導(dǎo)航運算符。
一般而言,QIL中的導(dǎo)航是利用CONTENT節(jié)點操作符來進行的。期望這個運算符選擇節(jié)點內(nèi)的所有內(nèi)容(例如,所有屬性、域名空間、文本、處理指令、注釋、以及元素內(nèi)部的元素節(jié)點)。接著,可以(例如,利用TUPLE與ISTYPE)將內(nèi)容序列過濾,以便有選擇地僅僅保持某些節(jié)點種類。
為了模式識別中的便利性,提供了ATTRIBUTE運算符;它按名稱來選擇匹配0或1屬性節(jié)點的屬性節(jié)點(右側(cè)操作數(shù))。為圖形中的公用方向提供了其它導(dǎo)航節(jié)點;這些節(jié)點大都取自于XPath而且具有相同的含義。一個節(jié)點一次應(yīng)用每個運算符;以便施加節(jié)點的整個序列,人們可以使用TUPLE在節(jié)點序列上進行迭代。一個例外是DEREF,它的自變量必須是單個ID值。它計算id()查表的結(jié)果。
表15XML導(dǎo)航運算符
XML組成運算符在下面的表16中描述了一組分組為排序和核對運算符的運算符。QIL定義運算符來構(gòu)建每個XML節(jié)點類型。這些構(gòu)建器全部都遵循普通的XML數(shù)據(jù)模型約束。例如,沒有節(jié)點能夠包含文檔節(jié)點,并且合并連續(xù)文本節(jié)點。
優(yōu)選的是,每個已構(gòu)建的節(jié)點獲得一個唯一的特性。就像為XQuery定義特性那樣,為QIL定義這個特性跨越像LET這樣的操作保持它,并且應(yīng)當(dāng)由運算符來考慮側(cè)面影響,特別是DML。
每個已構(gòu)建的節(jié)點獲得相對于每隔一個節(jié)點的次序。即使它應(yīng)用到文檔以外的節(jié)點上以及應(yīng)用于來自于不同文檔的節(jié)點上,也被稱為為“文檔次序”。完全像為XQuery定義詞序那樣,為QIL定義此次序。
ELEMENTCTOR運算符ELEMENTCTOR是利用類QilBinary來實現(xiàn)的。左側(cè)操作數(shù)是名稱,右側(cè)操作數(shù)是內(nèi)容。如果內(nèi)容中的節(jié)點有文檔節(jié)點的話,那么可能會是錯誤。該內(nèi)容中的所有節(jié)點都被隱式地拷貝。
可以不把ATTRIBUTE和NAMESPACE節(jié)點構(gòu)建在元素中的其它非屬性/域名空間內(nèi)容后面。這種情況下的行為是定義好的實施方案。如果元素名稱處于域名空間中且該域名空間不在范圍內(nèi),那么一個實施方案就可以發(fā)出人工合成的域名空間聲明和/或前綴。對于承兌(honor)名稱的前綴值而言,是不需要實施方案的。它僅僅是系列化提示。
ATTRIBUTECTOR運算符ATTRIBUTECTOR是利用QilBinary類來實現(xiàn)的。左側(cè)操作數(shù)是名稱,右側(cè)操作數(shù)是內(nèi)容??梢岳弥T如XQUERYATTRIBUTECONTENT之類的運算符來將右側(cè)操作數(shù)強制為期望的表達式。如果屬性名稱處于域名空間中且域名空間不在范圍內(nèi),那么一個實施方案可以發(fā)出人工合成的域名空間聲明和/或前綴。對于承兌名稱的前綴值而言,不需要實施方案;它僅僅是系列化提示。為了構(gòu)建類型化屬性,人們可以利用XML模式類型信息來構(gòu)建它,或者可以應(yīng)用諸如XQUERYVALIDATE之類的類型運算符。
TEXTCTOR和CDATACTOR運算符TEXTCTOR是利用QilUnary類來實現(xiàn)的。子操作數(shù)是文本內(nèi)容,并且必須是串類型的單元素集合。CDATACTOR是表明任意系列化提示的TEXTCTOR(即,使用CDATA部分)。實施方案可以忽略這個提示。
COMMENTCTOR運算符COMMENTCTOR是利用QilUnary類來實現(xiàn)的。CLASS操作數(shù)是文本內(nèi)容,并且必須是串類型的單元素集合。
PICTOR運算符PICTOR是利用QilBinary類來實現(xiàn)的。左側(cè)操作數(shù)是目標(biāo)NCNAME,并且可以為空。否則,它必須是QName類型的單元素集合。右側(cè)操作數(shù)是保持的內(nèi)容,并且必須是串類型的單元素集合。
NAMESPACEDECL運算符NamespaceDecl是利用QilBinary類實現(xiàn)的。它構(gòu)建了域名空間聲明。左側(cè)操作數(shù)是前綴,并且期望它是QName類型的單元素集合。右側(cè)操作數(shù)是域名空間,并且期望它是串類型的單元素集合。如果左側(cè)操作數(shù)是空串的話,那么NAMESPACECTOR相當(dāng)于缺省的域名空間聲明。
如果出現(xiàn)矛盾的域名空間聲明(例如,在元素的內(nèi)容中對于同一個前綴有兩個NAMESPACECTORS,或者與已經(jīng)發(fā)出的加前綴的名稱相沖突的NAMESPACECTOR),那么該行為就是定義好的實施方案。
RTFCTOR運算符RTFCTOR是利用QilUnary類來實現(xiàn)的,并且期望它的孩子都是節(jié)點序列或空序列。它構(gòu)建結(jié)果—樹—碎片(來自于XSLT)。事實上,RTFCTOR是到導(dǎo)航的一個阻礙,它阻止了組合的發(fā)生。在許多方面,比起節(jié)點,它工作起來更像是一個原子值。
表16XML組成運算符
節(jié)點屬性運算符在下面的表17中描述了一組分組為節(jié)點屬性運算符的運算符。QIL支持用于訪問某些節(jié)點屬性(比如像,名稱)的運算符。
NAMEOF運算符計算節(jié)點的QName。如果該節(jié)點沒有名稱,則它就返回空序列。LOCALNAMEOF、NAMESPACEOF和PREFIXOF運算符計算節(jié)點名稱的對應(yīng)部分。如果所述節(jié)點沒有名稱或遺漏了這些部分的一些,那么它們就返回空串。所有這些運算符都需要它們的操作數(shù)是單元素集合節(jié)點。
表17節(jié)點屬性運算符
拷貝與投影運算符在下面的表18中描述了一組分組為拷貝與投影運算符的運算符。QIL支持幾類拷貝與投影運算符。拷貝是期望其對原子值沒有影響的操作。對節(jié)點的影響實質(zhì)上產(chǎn)生了初始節(jié)點的準(zhǔn)確副本,不過具有新的節(jié)點特性。投影“保持”了節(jié)點特性,但是有選擇地刪節(jié)節(jié)點來保持其僅僅一些內(nèi)容。
DEEPCOPY以節(jié)點為首構(gòu)建整個子圖的拷貝。除了元素和文檔節(jié)點之外,對于所有的節(jié)點種類而言,SHALLOWCOPY與DEEPCOPY是相同的,對于文檔而言,它拷貝文檔節(jié)點但是不拷貝任何其內(nèi)容,對于元素而言,它拷貝元素節(jié)點(即,它的名稱)但是不拷貝任何其內(nèi)容(即,無屬性)。
PROJECTINCLUDE和PROJECTEXCLUDE兩者都是二進制算符。左側(cè)操作數(shù)必須是遍及一序列節(jié)點的FOR迭代器。右側(cè)操作數(shù)必須是可能參考那個迭代器的布爾型單元素集合。這些運算符都在由左側(cè)操作數(shù)描述的樹形結(jié)構(gòu)(forest)上進行遞歸迭代、并且分別包含或排除所有節(jié)點以及所有它們的祖先來執(zhí)行投影,其中對于所述祖先將右側(cè)操作數(shù)評估成真。
表18拷貝與投影運算符
類型運算符在下面的表19中描述了一組分組為類型運算符的運算符。QIL定義了許多用于動態(tài)地與QIL類型系統(tǒng)一起工作的運算符。
表19類型運算符
ATOMIZE運算符ATOMIZE通過執(zhí)行XQuery標(biāo)準(zhǔn)中所描述的XQuery原子化規(guī)則,來有效地檢索XML節(jié)點的類型化值。具體地說,ATOMIZE獲得任何基數(shù)的序列,并且返回由原始序列成員的原子值組成的新序列,對于原子值來說,該原始序列是無操作;對于節(jié)點來說,該原始序列就像是到類型化值存取器的調(diào)用。例如,(XQueryAtomize(List(1″b″3))導(dǎo)致列表無變化,而(XQueryAtomize(List $x $y)),其中$x是具有類型化值(1,2)的節(jié)點而$y是具有類型化值(″3″,4)的節(jié)點,將會導(dǎo)致組合的序列(1,2,″3″,4)。
TREATAS運算符因為QIL是強類型且是靜態(tài)類型的,所以可能會出現(xiàn)這樣的情況,即比起表達式具有靜態(tài)類型來,期望的是更強類型或更弱類型。例如,可能會想要雙整型,其中表達式是整數(shù)。對于這種情況(例如,上拋或下落)來講,可以使用TREATAS來把表達式強制成期望的類型或基數(shù)。
TREATAS獲得一自變量和一類型。它試圖把自變量當(dāng)作為具有那一類型的自變量。動態(tài)影響是無動作(即,該值保持無變化),否則錯誤。靜態(tài)影響是改變表達式的靜態(tài)類型。不同于Convert或XQueryValidate,跨過類型分級結(jié)構(gòu)進行移動并且不執(zhí)行解析是不可能的。例如,試圖把串當(dāng)作為整數(shù)或者把十進制數(shù)當(dāng)作雙整型數(shù)都是錯誤的。
使用目標(biāo)類型的所有屬性。當(dāng)目標(biāo)類型的屬性等同于變元類型的屬性時,那么什么都不做。當(dāng)屬性不同時,則有以下影響如果自變量基數(shù)與目標(biāo)基數(shù)相一致的話,那么無變化地返回值。否則,可能會出現(xiàn)錯誤。表20描述基數(shù)兼容性。自變量的(準(zhǔn)確的、動態(tài)的)基數(shù)在左側(cè),而(靜態(tài)的)目標(biāo)基數(shù)在頂部?!癘K”意味著TREAT-AS成功,而“err”意味著它失敗。
表20基數(shù)兼容性
如果自變量條目種類與目標(biāo)條目種類相一致的話,那么就無變化地返回該值。否則,發(fā)射錯誤。表21描述了項類型兼容性
表21項類型兼容性
如果自變量原子類型與目標(biāo)原子類型相一致的話,那么無變化地返回該值。否則,可能會出現(xiàn)錯誤。這種兼容性是由子類型可替代性規(guī)則來確定的,在該子類型可替代性規(guī)則中,當(dāng)且僅當(dāng)來自另一節(jié)點的一個繼承節(jié)點受到限制而不得到排列/聯(lián)合,兩種類型才是可兼容的。如果目標(biāo)類型不是嚴謹?shù)模敲慈藗兛梢圆榭碭ML類型信息來確定自變量類型是否是靜態(tài)類型的子類型。否則,這可以根據(jù)QIL原子類型來確定。如果具有目標(biāo)節(jié)點類型的自變量節(jié)點類型位法則ORed為零,那么可能會出現(xiàn)錯誤。否則,節(jié)點類型是可兼容的。
最后,如果目標(biāo)類型不是嚴謹?shù)模敲床粰z查嚴謹性。如果目標(biāo)類型是嚴謹?shù)亩宰兞款愋筒皇菄乐數(shù)模敲丛撟宰兞繎?yīng)當(dāng)動態(tài)地具有嚴謹?shù)哪繕?biāo)類型,否則可能會出現(xiàn)錯誤。
CANTREATAS運算符如果TREATAS成功的話,則CANTREATAS就返回真,否則返回假(如果TREATAS將發(fā)生錯誤)。這個運算符主要是為具有CONVERT/ISCONVERTIBLE的對稱性而存在的。
CONVERT運算符CONVERT從一種類型的值到另一種類型的值運用數(shù)據(jù)類型轉(zhuǎn)換。例如,(Convert(String″1″)Iht32)得到整數(shù)1。CONVERT不同于TREATAS,它只能投遞成所述值已經(jīng)具有或者將要具有的類型。
所運用的專門的類型轉(zhuǎn)換將匹配XQuery所使用的那些。
ISCONVERTIBLE運算符如果CONVERT將成功的話,則ISCONVERTIBLE就返回真,否則返回假(如果CONVERT將錯誤)。一般來講,它與執(zhí)行CONVERT一樣費用浩大,不過慮及到條件轉(zhuǎn)移而不是帶有錯誤的終止計算。存在這個運算符主要是為了支持XQuery CASTABLE運算符。
ISTYPE運算符如果一個值具有已指明的類型,則ISTYPE就返回真。它對于實現(xiàn)類型轉(zhuǎn)換和等效來講是有用的。對于QilType的每一個方面,都存在一個總是匹配每個值的通配符值(例如,QilCardinality.Any、QilAtomicType.Any等等)。所以,舉例來說,為了測試目的,表達式是任意類型的元素,那么人們可以使用QilType,該QilType的XmlNodeKind是QilXmlNodeKind。元素和所有其它的值都是通配符。為了測試出表達式是否具有指定的基數(shù),人們可以使用QilType,該QilType的基數(shù)是那個值,并且該類型的所有其它方面都是通配符。
ISEMPTY運算符與ISTYPE相似(使用QilCardinality.Zero),如果序列為空的話,則這個運算符就返回真,否則返回假。
XQuery運算符在下面的表22中描述了一組分組為XQuery運算符的運算符。某些語言具有附加運算符,這些附加運算符不能利用其它的QIL運算符來表示,否則它們太過常見以致于它們應(yīng)當(dāng)有它們自己的節(jié)點類型。
表22XQuery運算符
XQUERYEBV運算符這個一元運算符具有一個值序列,并根據(jù)XQuery技術(shù)規(guī)范中所描述的規(guī)則將其轉(zhuǎn)換成布爾值。
具體地說,如果操作數(shù)是空序列、布爾值假、空串、零(任何數(shù)值類型)或NaN(雙整型或浮點型)的話,則它就返回假。否則,它就返回真。
XQUERYELEMENTCONTENT運算符XQUERYELEMENTCONTENT把一個序列作為它的自變量,并返回節(jié)點的序列。保持原始序列中的每個節(jié)點;將相鄰原子值的每個序列轉(zhuǎn)換成包含所述原子值的文本節(jié)點,所述原子值與獨立的空間級聯(lián)在一起。
XQUERYATTRIBLrrECONTENT運算符XQUERYELEMENTCONTENT把一個序列作為它的自變量,并返回一個串值。原始序列中的每個節(jié)點都用它的串值來替換;每個原子值也都被轉(zhuǎn)換成串。然后,原子值的結(jié)果序列將它們自己與獨立的空間級聯(lián)在一起。
XQUERYVALIDATE運算符XQUERYVALIDATE運算符驗證節(jié)點的序列,這要么會造成合法性錯誤,要么會產(chǎn)生類型注釋后的節(jié)點的新序列。它與XQuery VALIDATE運算符具有相同的含義。
XPath運算符在下面的表X23中描述了一組分組為XPath運算符的運算符。XPath具有表示附加導(dǎo)航坐標(biāo)(axe)和一些類型轉(zhuǎn)換所需的少量運算符。這些當(dāng)中的一些可以利用現(xiàn)有的QIL運算符來表示,但是十分的常見,從而應(yīng)當(dāng)有它們自己的表示。
XPATHNODEVALUE、XPATHNUMBERTOSTRING和XPATHSTRINGTONUMBER實現(xiàn)XPath類型轉(zhuǎn)換規(guī)則。這三個運算符都是一元運算符。對于XPATHNODEVALUE這個操作數(shù)必須是單元素集合節(jié)點。操作數(shù)XPATHNUMBERTOSTRING必須是單元素集合數(shù)值類型。對于XPATHSTRINGTOMBER這個操作數(shù)必須是單元素集合串。
其它的運算符執(zhí)行導(dǎo)航。全部都是一元運算符,這些一元運算符的操作數(shù)必須是單元素集合節(jié)點,并且通過該導(dǎo)航操作,它們產(chǎn)生了期望的節(jié)點序列。
表23XPath運算符
DML運算符在下面的表24中描述了一組分組為DML運算符的運算符。QIL能夠表示數(shù)據(jù)變化的操作,比如像插入、刪除和更新。
XQuery DML語法改變Xquery語法的條件產(chǎn)生式,以便允許DML語句作為每一個分支。對于條件的QIL表示來說,這要求無變化;編譯器將把DML表達式配置成條件節(jié)點的真/假分支。XQuery DML語法也改變FLWR表達式,來允許DML語句出現(xiàn)在普通的return子句的位置上。FLWR表達式的QIL表示(元組)是TUPLE節(jié)點的返回成員。XQuery DML語法添加了四個新的運算符INSERT、UPDATE、DELETE和REPLACE。列在表24上的QIL運算符表示這些與XqueryDML技術(shù)規(guī)范所定義的語義具有相同語義的運算符。
因為DML操作沒有返回值,所以它們沒有相應(yīng)的QILDataType。值QilItemKind.Dml表示DML表達式類型,以便于在編譯器和最佳化器中檢查的靜態(tài)類型。為了測試QIL表達式是否可以執(zhí)行DML,人們需要查看最上節(jié)點的MemberKind。
表24DML運算符
特定運算符在下面的表25中描述了一組分組為特殊算符的運算符。存在NOP節(jié)點類型主要是為了支持構(gòu)建QIL立即響應(yīng)或支持便于QIL的自頂向下組成。舉例來說,開發(fā)人員可以將NOP節(jié)點置于圖形中,并且稍后隨著組成發(fā)展來安排其內(nèi)容。注意仍然必須適當(dāng)?shù)卦O(shè)置節(jié)點類型。
存在UNKNOWN節(jié)點類型主要是為了支持在編譯時期間局部構(gòu)建QIL,并且允許應(yīng)用為它們自己的目的而“再使用”QIL?;旧?,UNKNOWN是不透明的節(jié)點類型,它沒有定義好的語義,并且完全可以利用任何類來表示它。
ERROR節(jié)點類型具有兩個自變量。第一個必須是串序列,并且向用戶描述消息。第二個必須是布爾型單元素集合,并且當(dāng)它為真時,表明錯誤是致命的(re終止執(zhí)行)。當(dāng)其為假時,除消息以外執(zhí)行可以繼續(xù)。
在操作數(shù)的類型或基數(shù)方面沒有限制。
表25特定運算符
外部數(shù)據(jù)源運算符在下面的表26中描述了一個被稱為外部數(shù)據(jù)源的運算符。外部數(shù)據(jù)的主源是DATASOURCE節(jié)點類型,它是利用QILDATASOURCE類來實現(xiàn)的。這個運算符具有串標(biāo)記值,該串標(biāo)記值描述了數(shù)據(jù)源的種類(例如,像域名空間)以及任意的User Data對象,該User Data對象不是由QIL來解釋的,但是這個運算符可以具有一些后端處理器的含義。
數(shù)據(jù)源可以是到目錄的路徑名或標(biāo)題,或者可以是通用的資源定位地址。對于這個數(shù)據(jù)源類型來說,User Data對象是賦值給一個串的QIL節(jié)點表達式。串值標(biāo)識了傳遞給函數(shù)的位置,以供加載XIVIL文檔(例如,完全類似于對document()函數(shù)的調(diào)用)。XML文檔不必是實際的XML;所述文檔可以是XML的抽象,比如一種類型的虛擬XML。
表26外部數(shù)據(jù)源運算符
結(jié)論如上所述,盡管已經(jīng)結(jié)合各種計算裝置和網(wǎng)絡(luò)體系結(jié)構(gòu)描述了本發(fā)明的示例性實施例,但是可以將下位概念應(yīng)用于任何期望在其中實現(xiàn)XML的中間語言表示的計算裝置或系統(tǒng)。因此,本發(fā)明的方法和系統(tǒng)可以應(yīng)用于各種應(yīng)用程序和裝置。盡管在這里選擇了代表各種不同選擇特征的示例性程序設(shè)計語言、名稱和例子,但是這些語言、名稱和例子都不意在限制本發(fā)明。本領(lǐng)域的普通技術(shù)人員將會認識到存在提供能實現(xiàn)由本發(fā)明所實現(xiàn)的相同、類似或等效的系統(tǒng)和方法的目標(biāo)代碼的許多種方式。
這里所描述的各種技術(shù)都可以結(jié)合硬件或軟件來實現(xiàn),或者在適當(dāng)?shù)那闆r下,結(jié)合上述兩者的組合來實現(xiàn)。因此,本發(fā)明的方法和設(shè)備或者其某些方面或部分都可以采取嵌入在有形介質(zhì)中的程序代碼(即,指令)的形式,所述有形介質(zhì)比如是軟磁盤、CD-ROM、硬盤或任何其它的機器可讀存儲介質(zhì),其中當(dāng)程序代碼被載入并由機器(比如,計算機)執(zhí)行時,所述機器就變?yōu)榱擞糜趯嵤┍景l(fā)明的設(shè)備。在程序代碼執(zhí)行在可編程計算機上的情況下,計算裝置通常將包括處理器、由處理器可讀的存儲介質(zhì)(包括,易失性和非易失性存儲器和/或存儲元件)、至少一個輸入裝置以及至少一個輸出裝置??梢詰?yīng)用本發(fā)明的信號處理服務(wù)的一個或多個程序,例如,通過使用數(shù)據(jù)處理API等等,最好是用高級程序或面向?qū)ο缶幊陶Z言來實現(xiàn),以便與計算機進行通信。然而,如有需要,可以用匯編或機器語言來實現(xiàn)所述程序。在任何情況下,所述語言都可以是編譯語言或解釋語言,并且同硬件實施方案相結(jié)合。
本發(fā)明的方法和設(shè)備還可以經(jīng)由以程序代碼形式嵌入的通信來實現(xiàn),在一些傳輸介質(zhì)上發(fā)送所述程序代碼,比如在電線或電纜上、通過光纖,或通過任何其它形式進行發(fā)送,其中當(dāng)接收程序代碼并將其載入并且由機器執(zhí)行時,該機器比如是EPROM、門陣列、可編程邏輯器件(PLD)、客戶端計算機、錄像機等等、或具有如上面示例性實施例所描述的信號處理能力的接收機,所述機器就變?yōu)榱擞糜趯嵤┍景l(fā)明的設(shè)備。當(dāng)在通用處理器上實現(xiàn)時,所述程序代碼與處理器結(jié)合,從而提供操作以調(diào)用本發(fā)明函數(shù)的唯一設(shè)備。另外,結(jié)合本發(fā)明所使用的任何存儲技術(shù)常常都是硬件和軟件的組合。
盡管已經(jīng)結(jié)合各個圖的優(yōu)選實施例描述了本發(fā)明,但是需要理解,在不脫離本發(fā)明的情況下,也可以使用或修改其它類似的實施例,并且可以對用于執(zhí)行本發(fā)明的相同功能的所述實施例進行添加。此外,應(yīng)當(dāng)強調(diào)的是,特別是隨著無線聯(lián)網(wǎng)裝置的數(shù)量繼續(xù)增加,可以考慮各種不同的計算機平臺,包括手提式裝置操作系統(tǒng)及其它應(yīng)用程序特定的操作系統(tǒng)。因此,本發(fā)明不應(yīng)該限于任何單個實施例,而是應(yīng)該在依照所附權(quán)利要求的廣度和范圍上考慮。
權(quán)利要求
1.一種跨越關(guān)系和非相關(guān)數(shù)據(jù)源的一種或多種XML語言詢問的語義表示方法,包括接收至少一個詢問;為至少一個接收到的詢問中的每個操作定義至少一個節(jié)點對象;利用運算符來變換至少一個節(jié)點對象中的每一個;以及從運算符生成語義表示;其中所述語義表示顯式地描述一個或多個XML語言詢問的含義。
2.如權(quán)利要求1所述的方法,其中所述語義表示是為目標(biāo)查詢引擎進行解譯和執(zhí)行而形成的中間語言表示。
3.如權(quán)利要求2所述的方法,其中所述非相關(guān)數(shù)據(jù)源包括文本文檔、電子表格和非關(guān)系數(shù)據(jù)庫中的一個或多個。
4.如權(quán)利要求1所述的方法,其中所述生成步驟還包括將接收到的詢問的高級操作分解成顯式部分。
5.如權(quán)利要求4所述的方法,其中所述顯式部分是跨越多種XML語言公用的。
6.如權(quán)利要求1所述的方法,其中所述運算符包括以下運算符中的一個或多個特定運算符、數(shù)據(jù)源、文字、布爾運算符、序列運算符、算術(shù)運算符、串運算符、值比較運算符、節(jié)點比較運算符、元組空間、函數(shù)定義與調(diào)用、XML導(dǎo)航、XML組成、XML屬性存取器、類型運算符、特定語言的運算符以及數(shù)據(jù)操作運算符。
7.如權(quán)利要求1所述的方法,進一步包括形成至少一個節(jié)點對象的圖形數(shù)據(jù)結(jié)構(gòu)。
8.如權(quán)利要求1所述的方法,其中所述至少一個接收到的詢問包括XML查詢語言和XML視圖定義語言中的一種或多種。
9.如權(quán)利要求1所述的方法,其中所述至少一個接收到的詢問包括XPath、XSLT、XQuery、DML、OPath和注釋模式詢問中的一個或多個。
10.如權(quán)利要求1所述的方法,其中所述語義語言表示允許XML遍及相關(guān)數(shù)據(jù)的XML視圖來進行查詢。
11.一種用于表示跨越多個數(shù)據(jù)源的XML查詢和XML視圖中一個或多個的語義解釋器,包括輸入端,用于接收形成詢問的XML查詢和XML視圖中的一個或多個;圖形結(jié)構(gòu)發(fā)生器,用于為詢問內(nèi)的每個操作定義節(jié)點對象;翻譯器,用于為每個節(jié)點對象賦值運算符,其中所述運算符將詢問的操作分解成顯式部分;和輸出端,用于提供顯式部分以作為用于表示XML查詢和XML視圖中一個或多個的中間語言表示。
12.如權(quán)利要求11所述的語義解釋器,其中所述多個數(shù)據(jù)源包括關(guān)系和非相關(guān)數(shù)據(jù)源。
13.如權(quán)利要求12所述的語義解釋器,其中所述非相關(guān)數(shù)據(jù)源包括文本文檔、電子表格和非關(guān)系數(shù)據(jù)庫中的一個或多個。
14.如權(quán)利要求11所述的語義解釋器,其中所述運算符包括以下運算符中的一個或多個特定運算符、數(shù)據(jù)源、文字、布爾運算符、序列運算符、算術(shù)運算符、串運算符、值比較運算符、節(jié)點比較運算符、元組空間、函數(shù)定義與調(diào)用、XML導(dǎo)航、XML組成、XML屬性存取器、類型運算符、特定語言的運算符以及數(shù)據(jù)操作運算符。
15.如權(quán)利要求11所述的語義解釋器,其中所述顯式部分是跨越多種XML語言公用的。
16.如權(quán)利要求11所述的語義解釋器,其中所述中間語言表示是為目標(biāo)查詢引擎進行解譯和執(zhí)行而形成的。
17.一種計算機可讀介質(zhì),其具有用于執(zhí)行接收到的詢問的中間語言表示方法的計算機可執(zhí)行指令,包括接收形成接收到的詢問的XML查詢和XML視圖中的一個或多個;為接收到的詢問內(nèi)的每個操作定義節(jié)點對象;利用運算符來變換每個節(jié)點,其中該運算符將接收到的詢問的操作分解成顯式部分;以及生成對應(yīng)于形成中間語言表示的顯式部分的指令,以供遍及關(guān)系數(shù)據(jù)源和非相關(guān)數(shù)據(jù)源中的一個或多個進行后續(xù)查詢。
18.如權(quán)利要求17所述的計算機可讀介質(zhì),其中所述運算符包括以下運算符中的一個或多個特定運算符、數(shù)據(jù)源、文字、布爾運算符、序列運算符、算術(shù)運算符、串運算符、值比較運算符、節(jié)點比較運算符、元組空間、函數(shù)定義與調(diào)用、XML導(dǎo)航、XML組成、XML屬性存取器、類型運算符、特定語言的運算符以及數(shù)據(jù)操作運算符。
19.如權(quán)利要求17所述的計算機可讀介質(zhì),其中所述顯式部分是跨越多種XML語言公用的。
20.如權(quán)利要求17所述的計算機可讀介質(zhì),其中所述接收到的詢問包括XML查詢語言和XML視圖定義語言中的一種或多種。
21.一種用于生成詢問的語義表示的計算機系統(tǒng),包括處理器,用于執(zhí)行計算機指令,和至少一個模塊,包括輸入函數(shù),用于接收形成詢問的XML查詢和XML視圖中的一個或多個;圖形結(jié)構(gòu)發(fā)生器用于為詢問內(nèi)的每個操作定義節(jié)點對象;翻譯器函數(shù),用于為每個節(jié)點對象賦值運算符,其中所述運算符將詢問的操作分解成顯式部分;和輸出端,用于提供顯式部分以作為用于表示XML查詢和XML視圖的含義的中間語言表示;其中所述至少一個模塊包括一個或多個軟件模塊和一個或多個硬件模塊中的一個或多個。
22. 如權(quán)利要求21所述的計算機系統(tǒng),其中所述運算符包括以下運算符中的一個或多個特定運算符、數(shù)據(jù)源、文字、布爾運算符、序列運算符、算術(shù)運算符、串運算符、值比較運算符、節(jié)點比較運算符、元組空間、函數(shù)定義與調(diào)用、XML導(dǎo)航、XML組成、XML屬性存取器、類型運算符、特定語言的運算符以及數(shù)據(jù)操作運算符。
23.如權(quán)利要求21所述的計算機系統(tǒng),其中所述顯式部分是跨越多種XML語言公用的。
全文摘要
一種計算機系統(tǒng)和方法,其生成了跨越關(guān)系和非相關(guān)數(shù)據(jù)源的一個或多個XML語言詢問的語義表示。語義中間語言表示明確地描述了一種或多種XML語言詢問的含義。語義中間語言可以是具有節(jié)點的圖形結(jié)構(gòu),所述節(jié)點描述了初始查詢的操作。語義圖形中賦值給節(jié)點的運算符允許初始XML查詢的明確定義。語義中間語言可以用來遍及單個或多個數(shù)據(jù)源執(zhí)行XML查詢。一種方法,包括接收至少一個詢問,為接收到的詢問內(nèi)的每個操作定義至少一個節(jié)點對象,利用運算符來變換每個節(jié)點對象,以及從運算符生成語義表示。
文檔編號G06F9/45GK1609856SQ20041007141
公開日2005年4月27日 申請日期2004年6月23日 優(yōu)先權(quán)日2003年6月23日
發(fā)明者M·L·布魯恩答基, C·A·蘇弗爾 申請人:微軟公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
渝中区| 巴中市| 高碑店市| 湖南省| 曲靖市| 双辽市| 宁南县| 常山县| 白沙| 景谷| 双辽市| 柳林县| 蓬莱市| 闸北区| 乌鲁木齐县| 靖安县| 密山市| 车致| 民丰县| 中西区| 秦皇岛市| 郧西县| 岳阳县| 佛冈县| 嘉峪关市| 峡江县| 三门峡市| 当雄县| 郑州市| 南通市| 金湖县| 肥西县| 邮箱| 海伦市| 永新县| 江北区| 修水县| 潼南县| 宁波市| 昔阳县| 徐水县|