專利名稱:允許元素類型的類型流的查詢模式的制作方法
允許元素類型的類型流的査詢模式
背景技術(shù):
在計算機語言的領(lǐng)域中,傳統(tǒng)上有許多不同的語言類別。例如,許多編程 語言目的是為大多數(shù)最終用戶編程目標提供一般的解決方案,但另一方面,査 詢語言卻通常專用于基于對數(shù)據(jù)庫查詢的信息挖掘。多年來,已經(jīng)進行了許多 嘗試來將査詢能力添加到編程語言,但是存在很多困難。
一個這樣的困難是大多數(shù)現(xiàn)代編程語言是基于面向?qū)ο蟮哪P偷模撃P?允許分層、抽象、模塊性、封裝和旨在降低編程任務(wù)的復(fù)雜度的若干其它范例。 另一方面,現(xiàn)代數(shù)據(jù)庫很大一部分是關(guān)系型數(shù)據(jù)庫,因此査詢語言往往是基于 關(guān)系模型而非面向?qū)ο蟮哪P汀?br>
另 一困難是用于編程語言的開發(fā)環(huán)境(例如,集成開發(fā)環(huán)境(IDE))己 經(jīng)進化成向開發(fā)者提供非常精密的協(xié)助手段,導(dǎo)致沒有這種開發(fā)環(huán)境來編程變 得很費勁。 一個示例是諸如自動完成實用程序或機制等內(nèi)聯(lián)上下文信息。這些 自動完成機制在其中類、變量名和其它構(gòu)造事先定義的面向?qū)ο蟮念I(lǐng)域能起很 好的作用,但是通常不可用于查詢語言,因為對于自動完成所必需的元素類型 的類型檢查在編譯或轉(zhuǎn)換了查詢之前是不可用的。此外,查詢在完成該查詢之 前不能被轉(zhuǎn)換,這使得自動完成機制沒有實際意義。再者,如果查詢表達式是 不良地形成的,則編譯錯誤將是晦澀難解的且難以補救。
發(fā)明概述
以下提出了所要求保護的主題的簡化概述以提供對所要求保護的主題的 某些方面的基本理解。本概述并不是對所要求保護的主題的全面綜述。它既不 旨在標識所要求保護的主題的關(guān)鍵或重要的元素,也不描繪所要求保護的主題 的范圍。其唯一目的是以簡化的形式來介紹所要求保護的主題的一些概念,作 為稍后呈現(xiàn)的更為詳細的描述的前序部分。
此處所公開并要求保護的主題的一方面包括用于方便表達式中的運算符
5之間的元素類型的類型流的計算機實現(xiàn)的技術(shù)。運算符可以是,但不限于,査 詢運算符,并且由此,類型可以貫穿整個查詢表達式從一個查詢子句流到下一 査詢子句。
根據(jù)所要求保護的主題的一方面,運算符可被映射到相關(guān)聯(lián)的方法調(diào)用, 并且方法調(diào)用可以根據(jù)運算符模式來定義。由此,可期望表達式中的任何給定 運算符遵循形式化的運算符模式。相應(yīng)地,算符以及整個表達式的項可以按照 所期望的方法調(diào)用來表達??梢岳斫?,方法可以是實例方法、靜態(tài)方法、虛擬 方法或擴展方法。
據(jù)此,通過方便類型流并約束運算符以遵循運算符模式,此處所公開的體 系結(jié)構(gòu)可以對表達式的每一子句遞增地推斷元素類型。例如,元素類型可以通 過將源類型與運算符相組合來確定,并且這可以對表達式的每一連續(xù)的子句實 時地完成。由此,類型信息可以本地地解析而無需完全轉(zhuǎn)換整個表達式。因此, 可以用較不昂貴(在資源利用方面)的方式且更快速地執(zhí)行元素類型的類型檢 查,并且元素類型的類型檢查可以在表達式的構(gòu)造期間而非僅在表達式被最終 化之后才實現(xiàn),這可以產(chǎn)生附加的益處。
根據(jù)所要求保護的主題的一方面,一個這樣的附加益處是可以對于表達式 采用自動完成機制。例如,通過在進行中推斷元素類型,可提供基于可用類型 的上下文信息,這可以幫助表達式構(gòu)造。
以下描述和附圖詳細闡明了所要求保護的主題的某些說明性方面。然而, 這些方面僅指示了可采用所要求保護的主題的原理的各種方法中的幾種,且所 要求保護的主題旨在包括所有這些方面及其等效方面。當結(jié)合附圖考慮以下所 要求保護的主題的詳細描述時,所要求保護的主題的其它優(yōu)點和區(qū)別特征將變 得顯而易見。
附圖簡述
圖1是可采用查詢模式來方便元素類型的類型流的計算機實現(xiàn)的系統(tǒng)的 框圖。
圖2A示出了對于一示例性查詢表達式的非限制性代表性第一查詢子句和 各種非限制性代表性下一查詢子句。圖2B更詳細地示出了示例性查詢表達式的查詢子句以及元素類型的類型流。
圖3描繪了具有示例性輸入和輸出的査詢運算符模式的各種非限制性示例。
圖4是實時地推斷元素類型和/或基于所推斷的元素類型遞增地提供上下 文信息的計算機實現(xiàn)的系統(tǒng)的框圖。
圖5描繪了定義用于方便査詢表達式內(nèi)的元素類型的類型流的計算機實 現(xiàn)的方法的過程的示例性流程圖。
圖6是可方便可組成查詢綜合和/或可擴展查詢表達式的計算機實現(xiàn)的系 統(tǒng)的框圖。
圖7示出了與從示例性査詢表達式的示例性查詢子句得到的控制變量的 范圍有關(guān)的示例性描述的框圖。
圖8描繪了定義用于方便以組成方式構(gòu)造查詢綜合的計算機實現(xiàn)的方法 的過程的示例性流程圖。
圖9示出了可用于執(zhí)行所公開的體系結(jié)構(gòu)的計算機的框圖。
圖IO示出示例性計算環(huán)境的示意性框圖。
詳細描述
現(xiàn)在參考附圖來描述所要求保護的主題,所有附圖中使用相同的附圖標記 來指代相同的要素。在以下描述中,為解釋起見,闡明了眾多具體細節(jié)以提供 對所要求保護的主題的全面理解。然而,很明顯,所要求保護的主題可以在沒 有這些具體細節(jié)的情況下實施。在其它情況下,以框圖形式示出了公知的結(jié)構(gòu) 和設(shè)備以便于描述所要求保護的主題。
如在本申請中所使用的,術(shù)語"組件"、"模塊"、"系統(tǒng)"、"接口" 等一般旨在表示計算機相關(guān)的實體,其可以是硬件、硬件和軟件的組合、軟件、 或者執(zhí)行中的軟件。例如,組件可以是,但不限于是,在處理器上運行的進程、 處理器、對象、可執(zhí)行碼、執(zhí)行的線程、程序和/或計算機。作為說明,運行在 控制器上的應(yīng)用程序和控制器都可以是組件。 一個或多個組件可以駐留在進程 和/或執(zhí)行的線程中,并且組件可以位于一個計算機內(nèi)和/或分布在兩個或更多的計算機之間。作為另一示例,接口可包括I/0組件以及相關(guān)聯(lián)的處理器、應(yīng) 用程序、和/或API組件,并且可以像命令行那樣簡單,或者是更復(fù)雜的集成
開發(fā)環(huán)境(IDE)。
此外,所要求保護的主題可以使用產(chǎn)生控制計算機以實現(xiàn)所公開的主題的 軟件、固件、硬件或其任意組合的標準編程和/或工程技術(shù)而被實現(xiàn)為方法、裝 置或制品。在此使用的術(shù)語"制品"旨在涵蓋可以從任何計算機可讀設(shè)備、載 體或介質(zhì)訪問的計算機程序。例如,計算機可讀介質(zhì)可以包括但不限于磁存儲
設(shè)備(例如,硬盤、軟盤、磁帶……)、光盤(例如,緊致盤(CD)、數(shù)字 多功能盤(DVD)……)、智能卡和閃存設(shè)備(例如,卡、棒、鑰匙驅(qū)動器……)。 另外應(yīng)該明白,可以采用載波來承載計算機可讀電子數(shù)據(jù),例如那些用于發(fā)送 和接收電子郵件或用于訪問如因特網(wǎng)或局域網(wǎng)(LAN)等網(wǎng)絡(luò)的數(shù)據(jù)。當然, 本領(lǐng)域的技術(shù)人員將會認識到,在不背離所要求保護的主題的范圍或精祌的前 提下可以對這一配置進行許多修改。
此外,在此使用詞語"示例性"意指用作示例、實例或說明。在此被描述 為"示例性"的任何方面或設(shè)計并不一定要被解釋為相比其它方面或設(shè)計更優(yōu) 選或有利。相反,使用詞語示例性旨在以具體的方式呈現(xiàn)各個概念。如本申請 中所使用的,術(shù)語"或"意指包括性"或"而非互斥性"或"。即,除非另有 指定或從上下文可以清楚,否則"X使用A或B"意指任何自然的包括性排列。 即,如果X使用A; X使用B;或X使用A和B兩者,則在任何以上情況下, 都滿足"X使用A或B"。另外,本申請中和所附權(quán)利要求書中所使用的冠詞 "一"和"一個" 一般應(yīng)被解釋為是指"一個或多個",除非另有指定或從上
下文可以清楚指的是單數(shù)形式。
如在此所使用的,術(shù)語"推斷"或"推論"通常是指從經(jīng)由事件和/或數(shù) 據(jù)捕捉的一組觀察結(jié)果中推斷或推理系統(tǒng)、環(huán)境和/或用戶的狀態(tài)的過程。例如, 推斷可用于標識特定的上下文或動作,或可生成狀態(tài)的概率分布。推斷可以是 概率性的,S卩,基于對數(shù)據(jù)和事件的考慮計算所關(guān)注狀態(tài)的概率分布。推斷也 可以指用于從一組事件和/或數(shù)據(jù)組成更高級事件的技術(shù)。這類推斷導(dǎo)致從一組 觀察到的事件和/或存儲的事件數(shù)據(jù)中構(gòu)造新的事件或動作,而無論事件是否在 相鄰時間上相關(guān),也無論事件和數(shù)據(jù)是來自一個還是若干個事件和數(shù)據(jù)源?,F(xiàn)在參考附圖,最初參考圖l,描繪了能夠采用查詢模式來方便元素類型 的類型流的計算機實現(xiàn)的系統(tǒng)100。 一般而言,系統(tǒng)100可包括可操作地耦合 到公知的基于計算機的硬件(例如,控制器)、軟件(例如,應(yīng)用程序)、以
及此處所描述的其它組件的用戶接口 102。用戶接口 102可接收查詢表達式 104,該表達式可包括第一查詢子句和一個或多個下一査詢子句??梢岳斫猓?第一查詢子句可以包括可查詢源類型(例如,類集、流等)以及可由第一査詢 子句作為例如關(guān)于源類型的控制變量來引入的元素類型。通常,所有查詢子句 包括查詢運算符,然而,如所見的,査詢表達式104的下一査詢子句不必是完 整的,而是可以按部分(例如,增量式地)接收,諸如在子句由用戶輸入的時 候。查詢表達式104和相關(guān)的子分量在下文中結(jié)合圖2A和2B來更詳細地描 述。
系統(tǒng)100還可包括用于任何有效査詢運算符(例如,與第一査詢子句和后 續(xù)的下一查詢子句相關(guān)聯(lián)的查詢運算符)的查詢運算符模式106。因此,在例 如可操作地耦合到系統(tǒng)100的模式存儲108中可以存在任何數(shù)量的查詢運算符 模式106。特別地,來自查詢表達式104的查詢子句(例如,各自具有特定的 査詢運算符)可以符合相關(guān)聯(lián)的查詢運算符模式106,該模式可以定義例如可 訪問實例方法。通過符合查詢運算符模式106,可以實質(zhì)上確保在一個查詢子 句和下一查詢子句之間存在已知關(guān)系,并且因此存在從一個查詢運算符到下一 查詢運算符的關(guān)系。査詢運算符模式106結(jié)合圖3來更詳細描述。
應(yīng)該理解,通過對査詢表達式104施加約束以使查詢表達式104的運算符 符合查詢運算符模式106,系統(tǒng)100可以確保從查詢表達式104的一個查詢子 句/運算符到下一查詢子句/運算符的元素類型的類型流。此外,通過確保此處 所描述的元素類型流,可以在進行中實現(xiàn)某些有利的類型推斷和/或上下文判 定,而無需對完整查詢表達式104的常規(guī)轉(zhuǎn)換/編譯,如參考圖4更詳細討論的。 此外,上述推斷和/或判定可以在查詢表達式104完成之前,并甚至在查詢表達 式104的形式錯誤時提供。作為進一步的解釋而非限制,符合查詢運算符模式 106的示例查詢表達式104以及與該架構(gòu)化相關(guān)聯(lián)的某些優(yōu)點在下文中更詳細 描述。
仍參考圖l,但也轉(zhuǎn)向圖2A,示出了示例性查詢表達式104。 一般而言,查詢表達式104可以是向特定類集應(yīng)用一系列査詢運算符的表達式。查詢運算
符是可跨值的類集一次應(yīng)用于該整個類集的運算符(例如,F(xiàn)ROM、 WHERE、 SELECT......)。查詢表達式104可包括第一査詢子句202,以及任何數(shù)量的
下一查詢子句20A、 2042等,其每一個都包含查詢運算符中的一個。
盡管可存在許多其它査詢運算符,并且這被認為是在所要求保護的主題的 精神和范圍之內(nèi),但是在下文中提供了多個具體示例以及對每一示例的簡要描 述。
FROM (從)運算符可以引入一個或多個控制變量,并且或者指定要查 詢的類集,或者為控制變量計算值。
RETURN (返回)和SELECT (選擇)運算符可以指定輸出類集的形狀。 在某些情況下,SELECT運算符可以引入新的控制變量。
WHERE (其中)和DISTINCT (不同)運算符可以限制類集的值。
ORDERBY (按……排序)運算符可以對類集施加排序。
SKIP (跳過)、SKIP WHILE (跳過同時)、TAKE (獲取)和TAKE WHILE
(獲取同時)運算符可以基于次序或條件返回類集的子集。
UNION (并)、UNIONALL (并全部)、EXCEPT (除夕卜)和INTERSECT
(交)運算符可以接收兩個類集并產(chǎn)生單個類集。
GROUP (組)運算符可以聚集類集并可返回按照關(guān)鍵字來分組的類集。
GROUPBY (按……分組)運算符可以基于一個或多個關(guān)鍵字來對類集 分組。在某些情況下,GROUPBY運算符可以引入新的控制變量。
AVG (平均)、SUM (求和)、COUNT (計數(shù))、MIN (最小)和MAX
(最火)運算符可以聚集類集并產(chǎn)生值。
ANY (任何)禾卩ALL (全部)運算符可以聚集類集并基于條件返回布爾
(BOOLEAN)值。
JOIN (聯(lián)接)運算符可以接收兩個類集,并可以基于從元素中導(dǎo)出的匹 配關(guān)鍵字來產(chǎn)生單個類集。
GROUPJOIN (組聯(lián)接)運算符可以基于從元素中提取的匹配關(guān)鍵字來 對兩個類集執(zhí)行分組聯(lián)接。
查詢表達式104中的查詢運算符的轉(zhuǎn)換可以按照運算符出現(xiàn)在查詢表達
10式104中的次序從左到右來進行。通常,查詢表達式104的第一個査詢子句202 包括FROM運算符,因為FROM運算符引入要査詢的類集。另外,査詢表達 式104中的最后一個查詢子句一般包括指定從查詢所得的類集的最終形狀的 RETURN禾B SELECT運算符。然而,可以理解,最后的SELECT或RETURN 運算符可被省略。例如,如果查詢表達式104不是以RETURN或SELECT運 算符結(jié)束,則可以假定隱含的SELECT運算符,這可將范圍中的所有控制變量 提升為所返回的匿名類型的屬性。此外,應(yīng)當理解,查詢表達式104可以在應(yīng) 用了 SELECT運算符之后繼續(xù),在該情況下,后續(xù)運算符可訪問的控制變量僅 限于范圍中的那些控制變量。
根據(jù)所要求保護的主題的一方面,查詢表達式104可如下架構(gòu)化 產(chǎn)錄表這式:=產(chǎn)紛運,淨身表 査錄運,辦表:=
Fraw運 I
^ #"^1^查 ^跪纖:= F固運,存I
紐,運#"符I
運餅f I (7rawp5y運,界 I Jo/"運## I 0冊/ Jo/"運,祭
為了提供用于所要求保護的主題的附加上下文以及相關(guān)編程實現(xiàn)和/或語
言的高級概覽,考慮示例性査詢表達式104的整體
Dim names =From C In Customers — Where C.State = "WA,,— Select C.Name
該査詢表達式104可以取Customer (顧客)對象的類集,并返回具有華盛頓 (WA)中的每一顧客的單個Name (姓名)屬性的行的類集。
很容易明白,查詢表達式104句法可以相當接近于標準關(guān)系型結(jié)構(gòu)查詢語 言(SQL)句法,其意圖是熟悉SQL的任何人將能夠以極少的進一步指令來使 用查詢表達式104。然而,該句法不必受SQL約束,并且此外,查詢表達式 104不必是SQL到另一編程語言的轉(zhuǎn)換。由于SQL是圍繞純關(guān)系型模型來設(shè) 計的,因此其某些習(xí)慣用語在包含分層概念的類型系統(tǒng)中并不能起很好的作 用。另外,SQL通常采用的某些句法和語義元素會沖突或者不能與現(xiàn)有的編程 語言句法或語義很好地集成。由此,盡管查詢表達式104對于熟悉SQL的用 戶而言可以是直觀的,但是也可存在某些區(qū)別。
例如,在SQL以及諸如過程語言/結(jié)構(gòu)化查詢語言(PLSQL)等其它語言 中,查詢和查詢的結(jié)果通過對整個査詢求值來綁定。由此,不需要能夠解釋所 應(yīng)用的特定査詢運算符的元素類型。此外,這一判定在輸入了整個無錯誤的查 詢并且通過相對昂貴的轉(zhuǎn)換過程綁定之前是不能做出的。相反,所要求保護的 主題能夠?qū)⒉樵儽磉_式104輸入和查詢表達式104的結(jié)果按照特定源類型上的 個別査詢運算來綁定。這些和其它優(yōu)點可以參考圖2B來更深入地示出。
圖2B更詳細地示出了示例性査詢表達式104的查詢子句。在該示例中, 第一查詢子句202包括第一查詢運算符(例如,F(xiàn)ROM運算符206),其可用 語引入可査詢源類型(例如,Customers 208),并且可聲明用于該源類型的元 素類型的控制變量210 (例如,C)。如圖所示,第一査詢子句202的結(jié)果流 212到下一查詢子句204,(此處統(tǒng)稱為下一查詢子句204),使得在相鄰查詢 子句之間可存在已知關(guān)系。特別地,元素類型可流212到下一查詢運算符(例 如,WHERE運算符214)以用作下一查詢子句204,的源類型。同樣,下一查 詢子句204,的輸出流212到下一査詢子句2042,其中它與下一查詢運算符(例 如,SELECT運算符216)相關(guān)聯(lián),該運算符也可產(chǎn)生流212到后續(xù)的下一查 詢子句204的元素類型或描述查詢表達式104的輸出的最終形狀。
12特別地,用于下一查詢子句204的每一個的查詢運算可以基于一組方法
(例如,查詢運算符模式106),其中每一方法與一特定査詢運算符相關(guān)聯(lián),
并且被應(yīng)用于類集或序列(例如,源類型)。這些査詢運算符可以相關(guān)于類集
的元素類型(或行)來定義。然而,給定具有元素類型T并應(yīng)用了查詢運算符 的特定源類型,流212到下一査詢運算符204的結(jié)果可以是具有元素類型S的 類集。因此,流動212的元素類型可以根據(jù)與給定查詢運算符相關(guān)聯(lián)的査詢運 算符模式106來變換。例如,與諸如SELECT和RETURN等投影查詢運算符 相關(guān)聯(lián)的查詢運算符模式106 —般返回與從流212接收到的元素類型不同的元 素類型。
在本示例中,元素類型T (其可以是例如與Customer類型208相關(guān)聯(lián)的 所有控制變量210的聚集)流212到下一查詢子句的WHERE運算符214。 如將結(jié)合圖3描述的,與WHERE運算符214相關(guān)聯(lián)的查詢運算符模式106可 以過濾該類集的值,但是在其它方面通常不改變元素類型。此處,不在華盛頓 州的顧客從類集中過濾掉,但是流212到下一查詢運算符,即SELECT運算符 216的結(jié)果仍是具有元素類型Customer 208的類集。
另一方面,如果假定Name屬性是String (串)類型的,貝U SELECT運算 符216的結(jié)果是具有元素類型String的類集。對查詢結(jié)果同時支持SELECT和 RETURN運算符的組合可提供對運算符的輸入和輸出的可預(yù)測語義。另外,可 以促進更大的靈活性以在與關(guān)系型數(shù)據(jù)交互時精確地模仿期望的SQL語義。 此外,在產(chǎn)生非表結(jié)果時可以促進更大的簡單性,以及在迭代地形成查詢表達 式時可以促進對編譯器錯誤和所需改變的改進的定位。
另外,對于可查詢可擴展標記語言(XML)數(shù)據(jù)的類集的某些查詢語言 (例如,XQuery,其是包括某些編程語言特征的查詢語言);所要求保護的主 題也可結(jié)合XML文字來使用。例如,可以采用以下示例性查詢表達式104來 返回包括在華盛頓的所有顧客的姓名的XML元素類集,其類似于以上所討論 的示例性查詢表達式104的結(jié)果。 Dim names =—
From c In CustomersWhere c.State = "WA,, _
Hetum <Nams><%= c.Namc %></Name> 還可以理解,諸如,例如FROM、 SELECT和GROUPBY等某些查詢運 算符可以引入稱為控制變量(例如,控制變量C210)的一種特殊的局部變量。 默認地,控制變量的范圍可以定為從引入的運算符到可以隱藏該控制變量的運 算符,并且可以表示査詢所求值的類集中的個別行的屬性或列。例如,在以下
査詢中
Dim WACusts = 一
From C As Customer In Customers —
Where C.State = "WA" FROM運算符引入了類型為Customers的控制變量C。后面的WHERE査詢運 算符然后參考控制變量C在過濾表達式C.State^'WA"中表示每一個別顧客。
諸如DISTINCT等某些查詢運算符不必使用或改變控制變量。諸如 SELECT等其它查詢運算符可以在范圍中隱藏當前控制變量并且可引入新的控 制變量。例如,在以下查詢中 Dim YourUncles =—
From C In Customers —
Select LastName = C.Name 一
Where LastName.StartsWith("Bo,,) WHERE査詢運算符只能訪問由SELECT運算符引入的LastName (姓)控制 變量。如果WHERE運算符試圖引用C,則可能會導(dǎo)致編譯時錯誤。
現(xiàn)在參考圖3 (同時仍參考圖1),提供了查詢運算符模式的眾多非限制 示例。查詢運算符模式302-328是查詢運算符模式106的具體圖示,并且此處 由參考標號302-328來個別地引用,或者統(tǒng)稱為查詢運算符模式106。還可以 理解,若干査詢運算符模式106可適用于多個查詢運算符,即使多個查詢運算 符中涉及查詢運算符模式302-328中的單個模式的每一查詢運算符可具有將其 與多個査詢運算符中的其它運算符相區(qū)分的特性。此外,在某些情況下,特定 查詢運算符可以結(jié)合查詢運算符模式302-328中的一個以上模式來使用(例如, 重載函數(shù))。一般而言,査詢運算符模式106可以是類型C必須實現(xiàn)以便可被査詢的
方法簽名??梢曰叵耄樵儽磉_式104可以向特定類集應(yīng)用一系列査詢運算符。
每一查詢運算符的控制變量可以是用于應(yīng)用該特定査詢運算符的范圍中的全 部變量或全部變量的子集,而可從一個査詢運算符流到下一查詢運算符的元素
類型T可以是作為范圍中的全部控制變量的聚集的匿名類型。因此,查詢運算 符模式106可以特別地幫助確保類型C是可查詢類型。對于任何給定查詢表達 式104,如果以下條件的至少一個為真,則類型C是可査詢類型
(1) 類型C包括返回可查詢類型的具有簽名AsQuerable()的可訪問實例方法。
(2) 類型C包括返回正numerable(Of T)的具有簽名AsEnumerable()的可訪
問實例方法。
(3) 類型C實現(xiàn)符合査詢運算符模式302-328 (下文進一步詳述)的一個或 多個查詢運算符,并且對于在類型C上定義的所有查詢運算符,類型T必 須匹配并且不可以是開放類型參數(shù)。
參考查詢運算符模式302-328,査詢運算符模式302可包括FROM運算符。 在査詢表達式104中,F(xiàn)ROM運算符通常在第一查詢子句中使用。由此,F(xiàn)ROM 模式302可以引入查詢的源以及要使用的控制變量,并且可輸出具有元素類型 T的可查詢類型。應(yīng)當理解,在對査詢表達式求值之前,如果類型C不滿足設(shè) 計模式(例如,不符合查詢運算符模式106),則可對查詢表達式104調(diào)用 AsQueryable或AsEnumerable方法,并且該函數(shù)的返回值可被存儲在臨時位置 中。
如上所述,F(xiàn)ROM運算符可以引入可被査詢的類集以及可表示該類集中的 個別成員的控制變量。查詢表達式
From b As Book In Books ... 可被認為等價于
For Each b As Book In Books
Nextb
類集表達式運算數(shù)一般必須被分類為值并且必須是可查詢類型。FROM運算符所聲明的控制變量通常必須遵循用于相對于命名和定范圍來聲明局部變 量的常規(guī)規(guī)則(如以上句法轉(zhuǎn)換所暗示的)。由此,控制變量一般不能隱藏封 閉方法中的局部變量或參數(shù)的名稱。
應(yīng)當理解,F(xiàn)ROM運算符還可引入其值可由表達式而非類集來確定的控制 變量。這一特征可用于例如計算將在稍后的査詢運算符中使用多次的值(例如, 計算該值一次而非在隨后每次使用它時計算)。例如
Dim TaxedBookPrices =— From b in Books — From Tax = b.Price * 0.088 — Where Tax > 3.50 —
Select b.Price, Tax, Total = b.Price + Tax
可被認為等價于
For Each b In Books Dim Tax = b.Price * 0.088
Nextb
聲明表達式控制變量的FROM運算符的句法可以與FORLOOP中的控制 變量聲明相同,例外是該控制變量一般通過顯示初始化程序來初始化。不要求 表達式控制變量引用另一控制變量,因為這樣做可能是不確定值。表達式控制 變量通常不能是在查詢表達式104中聲明的第一控制變量。
出于簡短和/或方便的目的,F(xiàn)ROM運算符的運算數(shù)可以省略AS子句, 在這一情況下,控制變量的類型可以從該變量范圍所在的類集或表達式來推 斷。如果控制變量的類型不能從查詢運算符方法中導(dǎo)出,則將導(dǎo)致編譯時錯誤。 FROM運算符可以在架構(gòu)上如下定義 Fr簡運,/^f ::=
尸廠。m /吉鄉(xiāng),緣:= Fraw聲鄉(xiāng) I
尸r謹,剪,y表 , 尸r函,剪
16Fram聲敏=
,量標欽符[As類型名]In表這式I
變著蘆麵教
另外,盡管FROM運算符一般作為第一個查詢子句202的查詢運算符出 現(xiàn),但是查詢表達式104可以包括一個以上FROM運算符。因此,當FROM 運算符是下一査詢子句204的査詢運算符時,則可導(dǎo)致叉積(例如,簡單、隱 式聯(lián)接)。在這一情況下,F(xiàn)ROM運算符可以將新控制變量聯(lián)接(參見下文的 JOIN運算符模式324)到現(xiàn)有的控制變量集。結(jié)果可以是聯(lián)接的類集中的所有 元素的叉積。因此,例如,表達式
From b In Books 一
From p In Publishers —
可被認為等價于嵌套的For Each循環(huán) For Each b In Books For Each p In Publishers
Next p Next b
前一查詢運算符中引入的控制變量可以在范圍內(nèi),并且可在包括在下一查 詢運算符204中的FROM運算符內(nèi)使用。按照SQL,上述特征可被認為是支 持"相關(guān)子查詢"。例如,在以下查詢表達式中,第二個FROM運算符涉及第一 個控制變量的值
From c As Customer In Customers —
From o As Order In c.Orders —
Select c.Name, o
另外,在單個查詢子句中可以出現(xiàn)多個FROM運算符,在這一情況下, 運算數(shù)之間的逗號可以完全等價于下一查詢子句204中的另一FROM運算符。 由此,示例From b In Books, p In Publishers — Select b, p 可以等價于
From b In Books _ From p In Publishers _ Select b, p
查詢運算符模式304可以包括一查詢運算符,其是名為SELECT或 SELECTMANY的可訪問實例方法,該方法可以接收一函數(shù)作為自變量。函數(shù) 可以包括類型為T的自變量,并產(chǎn)生類型S。該方法可以返回具有元素類型S
的可查詢類型。
SELECT運算符可以描述查詢表達式104的結(jié)果。SELECT運算符可以取 聲明列表,并構(gòu)造所得類集的元素類型。例如,如果査詢表達式104為 Dim CustAndOrderNames = 一
From c In Customers, o In c,Orders — Select c.Name, o,Product 則所得類型可以是IEnumerable(Of {Name As String, Product As String}),因為 Name的類型是String,且Product (產(chǎn)品)的類型是String。
后面的這一査詢(例如,查詢表達式104)可以等價于顯示地返回匿名類
型
Dim CustAndOrders = _
From c In Customers, o In c.Orders — Return New With { c.Name, o.Product}
如果SELECT運算符只有一個聲明,則結(jié)果可以是具有一個屬性的匿名 類型。由此,結(jié)果類型可以是正numerable (Of {Name As String}),因為Name 的類型是String。例如,
Dim CustNames =— From c In Customers Select c.Name
SELECT運算符中使用的聲明內(nèi)的表達式在轉(zhuǎn)換成底層匿名類型之前被綁定。更具體而言,SELECT運算符中的聲明內(nèi)的表達式可以開始成員訪問,
其中點運算符不必綁定到査詢中的控制變量。相反,點運算符可改為綁定到封
閉的WITH塊,如果存在這樣的塊的話。
應(yīng)當理解,除了 SELECT運算符之外,查詢表達式104還可包括其它投 影運算符。例如,査詢表達式可以包括RETURN運算符,對于該運算符,可 以有相關(guān)聯(lián)的查詢運算符模式106。類似于SELECT運算符,RETURN運算符 可以描述査詢表達式104的結(jié)果。RETURN運算符可以取產(chǎn)生所得類集的元素 的表達式。例如,查詢
Dim ReducedBookPrices =— From b in Books — Return b.Price * .8 可產(chǎn)生被降低到其原始成本的80%的價格的類集。
以RETURN運算符結(jié)束的查詢表達式104的結(jié)果可以是其元素類型是所 返回的表達式的類型的類集。例如,在以下查詢表達式中,結(jié)果類型是 IEnumerable (OF String),因為c.Name的類型是String: Dim CustNames =—
From c In Customers — Return c.Name
如果查詢表達式104在沒有RETURN或SELECT運算符的情況下結(jié)束,
則所得的類集的元素類型可以是具有范圍中的所有控制變量的屬性的匿名類 型
'結(jié)果類型是IEnumerable(Of {Name As String, Product As String}) Dim CustNames =—
From c In Customers, O In C.Orders 即使SELECT運算符可以描述查詢表達式104的結(jié)果,但任何查詢表達 式104可在SELECT運算符之后繼續(xù)。在該情況下,由SELECT語句引入的 控制變量是范圍中的控制變量,但是所有先前的控制變量通常在范圍外 CustNames =—
From c In Customers, O In C.Orders —
19Select Name = C.Name, Price = O.Price Where Price 〉 500 Return Name
在SELECT運算符之后繼續(xù)的查詢表達式104可以等價于嵌套查詢 Dim CustNames =—
From X In (From c In Customers, O In C.Orders 一 Return New With { C.Name, O.Price ",— Name = X.Name, Price = X.Price Where Price > 500 Return Name
RETURN和SELECT運算符分別可基于以下示例來定義 運,祭 = Return 表這式 &/£"運#"符':=Select 5"e/",聲猶表 ^/e"聲剪^表:= M"聲剪I
5We",剪:=
變量聲麵教
查詢運算符模式306可以包括一査詢運算符,其是名為WHERE的可訪問 實例方法,該方法取一函數(shù)作為自變量。類型T可以是該函數(shù)的自變量,并且 結(jié)果可以是可被隱式地轉(zhuǎn)換成布爾類型的類型。例如,結(jié)果類型可以具有與可 在IF、 WHILE或DO語句中使用的表達式的類型相同的規(guī)則。因此,類型可 以具有到布爾類型的隱式轉(zhuǎn)換,或者需要己經(jīng)定義了 IsTme和IsFalse運算符。 WHERE運算符可以返回具有元素類型T的可查詢類型。
WHERE運算符可以將類集中的值限于滿足給定條件的那些值。WHERE 運算符可以接收對每一組控制變量值求值的布爾表達式。如果表達式的值為 真,則該值可出現(xiàn)在輸出類集中,否則該值可被跳過。查詢表達式From b In Books, p In Publishers _ Where b.PublisherID = p.PublisherID _
可被認為等價于嵌套循環(huán) For Each b In Books For Each p In Publishers
If b.PublisherID = p.PublisherID Then
End If
Nextp Nextb
WHERE運算符可被定義為 附we運#"# ::= Where 吝灰表這式
查詢運算符模式308可以包括一查詢運算符,其是名為ORDERBY或 ORDERBYDESCENDING (按降序排序)的可訪問實例方法,該方法可取一函 數(shù)作為自變量,該函數(shù)進而可取類型T的自變量,并產(chǎn)生類型S。與模式308 相關(guān)聯(lián)的方法可以返回具有元素類型T的己排序類集。
ORDERBY運算符可以基于一次序?qū)Τ霈F(xiàn)在控制變量中的值排序。 ORDERBY運算符可以取指定應(yīng)使用來對控制變量排序的值的表達式。例如, 以下查詢返回按照價格(Price)排序的書名(book.Title): From book In Books 一 Order By book.Price Select book.Title
排序可以是升序的,在這一情況下較小的值可以在較大的值之前出現(xiàn);或 者排序可以是降序的,在這一情況下較大的值在較小的值之前出現(xiàn)。排序的默 認值是升序。例如,以下查詢返回按照價格排序的書名,且最貴的書在最前面 (Descending):From book In Books —Order By book.Price DescendingSelect book.TitleORDERBY運算符還可指定用于排序的多個表達式,在這一情況下類集可 以用嵌套方式來排序。例如,以下查詢表達式按照州(State),然后按照每一 州內(nèi)的市(City),在按照每一市內(nèi)的郵政編碼(ZIP),來對作者(Author) 排序From author In Authors —Order By author,State, author.City, author.ZIP —Select author.Name, author.State, author.City, author.ZIP ORDERBY運算符可以基于以下示例來架構(gòu)化 (9W,運##::= Order By (9rafe廠表這式身表 CWe廠表這-tW表 :=O(ier表這式 ICVc/£T表這式身表 ,(9nier表這式 (9nsfer _|ll^"^C ::=表拔式[排序] 排序 =Ascending | Descending 另外,查詢運算符模式310可以包括一查詢運算符,其是名為DISTINCT 的為可訪問實例方法。通常,該方法返回具有與源類型C相同的元素類型的可 查詢類型。DISTINCT運算符可以將類集中的值僅限于具有不同值的那些(例 如,不返回重復(fù)值)。例如,查詢From c In Customers, o In c.Orders —Select c.Name, o.Price —Distinct將僅對每一對不同的顧客名和定單(Order)價格(Price)返回一行,即使該 顧客具有價格相同的多個定單。DISTINCT運算符可被架構(gòu)化為 Z)/幼Vz"運,界=Distinct現(xiàn)在參考查詢運算符模式312,模式312可以包括一查詢運算符,其是名為CONCAT、 UNION、 INTERSECT或EXCEPT的可訪問實例方法。該方法 可以接收具有與源C相同的元素類型T的類集作為自變量,并返回具有元素類 型T的可查詢類型。下一查詢運算符模式,即模式314可以包括一查詢運算符,其是名為TAKE 或SKIP的可訪問實例方法,該方法可以接收值作為自變量,并且可以返回具 有與源類型C相同的元素類型的可查詢類型。TAKE運算符可以產(chǎn)生來自類集的給定數(shù)量的元素。當隨WHILE修飾符 一起使用時(參見例如査詢運算符模式316) , TAKE運算符可以在條件保持 為真時產(chǎn)生一元素序列。SKIP運算符可以忽略來自類集的給定數(shù)量的元素,然后返回該類集的其 余元素。當結(jié)合WHILE修飾符一起使用時,SKIP運算符在條件保持為真時跳 過元素,然后返回類集的剩余元素。TAKE和SKIP的一個示例架構(gòu)如下提供。 尸flr加'ow運,存= 7"afe表這式 I Iz》表這式 表這式= Take [ While ] 表這式 i 1*表這式=Skip [ While ] 表達式 查詢運算符模式316可以包括一查詢運算符,其是名為TAKEWHILE或 SKIPWHILE的可訪問實例方法。該方法可取一函數(shù)作為自變量,其中該函數(shù) 可接收類型T的自變量,并產(chǎn)生布爾值。該方法可以返回具有元素類型T的可 查詢類型。查詢運算符模式318可以包括一查詢運算符,其是名為SUM、MIN、MAZ、 COUNT或AVERAGE的可訪問實例方法。該方法可取一函數(shù)作為自變量,其 中該函數(shù)進而接收類型T的自變量,并產(chǎn)生數(shù)值類型。該方法可返回數(shù)值類型。查詢運算符模式320可以包括一查詢運算符,其是名為MIN或MAX的 可訪問實例方法,該方法可取一函數(shù)作為自變量,該函數(shù)進而可取類型T的自 變量,并產(chǎn)生類型S。該方法可以返回具有元素類型S的可查詢類型。23査詢運算符模式322可以包括一査詢運算符,其是名為ANY或ALL的可 訪問實例方法,該方法可以接收一函數(shù)作為自變量。函數(shù)可以包括類型為T的 自變量,并產(chǎn)生可被隱式地轉(zhuǎn)換成布爾值的類型。該方法可返回可被隱式地轉(zhuǎn) 換成布爾值的類型。可以理解,與模式318-322相關(guān)聯(lián)的查詢運算符可以結(jié)合AGGREGATE (聚集)運算符來使用。在聚集查詢子句內(nèi),標準AGGREGATE運算符集可 被應(yīng)用于范圍中的分組的控制變量。AGGREGATE運算符可括但不限于 ANY、 ALL、 COUNT、 LONGCOUNT (長計數(shù))、SUM、 MIN、 MAX、 AVERAGE (平均)禾口/或GROUP 。ANY聚集運算符可以查明在組中是否有滿足給定條件的元素。ALL聚集 運算符可以確定是否組中的全部元素都滿足給定條件。例如,以下的示例查詢 表達式104可以檢查是否有低于18歲的任何顧客(cust.Age<18): From cust In Customers — Group By cust. State —Aggregate YoungerThan18 = Any(cust.Age < 18) 而以下示例査詢表達式104可以返回給定州中(cus.State)具有至少5個定單 的所有顧客(cust.Orders,Count()〉 5):From cust In Customers —Group By cust. State —Aggregate AtLeast5 = All(cust.Orders.CountO > 5) COUNT和LONGCOUNT聚集運算符可以取可任選布爾表達式,并對該 組中滿足給定條件的元素的數(shù)量計數(shù)。 From cust In Customers — Group By cust.State — Aggregate Seniors = Count(cust.Age > 50) SUM聚集運算符可以基于特定選擇器表達式來計算組中的元素之和。例 如,以下示例性查詢表達式104可以計算按照類別(Category)分組的所有定單的總值From order In OrdersGroup By order.Category Aggregate Total = Sum(order.Price)MIN和MAX聚集運算符可以基于某一選擇器表達式來計算組的元素的 最小值(或最大值)。例如,以下示例查詢表達式104可以計算每一州的最年 輕(Youngest)和最年長(Oldest)的顧客From cust In Customers —Group By cust. StateAggregate Oldest = Max(cust.Age), Youngest = Min(cust.Age) AVERAGE聚集運算符通?;谔囟ㄟx擇器表達式來計算組中的元素的 平均值。例如,以下示例查詢表達式104可以計算按照類別分組的所有產(chǎn)品 (Products)的平均價格From prod In Products — Group By prod.CategoryAggregate AveragePrice = Average(prod.Price) 特殊的GROUP聚集運算符可以基于可任選選擇器表達式將組的所有元 素累積成顯式類集。例如,以下示例性查詢表達式104可以將給定州中的所有 顧客姓名收集到單個類集中。From cust In Customers — Group By cust. State Aggregate Names = Group(cust.Name) 查詢運算符模式324可以包括一查詢運算符,其是名為JOIN的可訪問實 例方法。該方法可以取以下各項作為自變量具有類型T'的元素的可査詢類型 S;用作內(nèi)部選擇器的函數(shù),其可取類型T的自變量,并產(chǎn)生表示關(guān)鍵字的類 型K;用作外部選擇器的函數(shù),其可取類型T'作為自變量,并產(chǎn)生表示關(guān)鍵字 的類型K;和/或用作聯(lián)接條件的函數(shù),其可取類型分別為T和r的兩個自變 量,并產(chǎn)生類型V的散列值。該方法可以返回具有元素類型V的可查詢類型。 因此,JOIN運算符可以取兩個類集,并可以基于從元素中導(dǎo)出的匹配關(guān) 鍵字來產(chǎn)生單個類集。在指定要聯(lián)接的條件時可以應(yīng)用某些限制。例如,可以 要求對于條件表達式的運算數(shù)可被顯示地轉(zhuǎn)換為布爾值。JOIN架構(gòu)的一個示例如下。場運 ::=Join凝if資劍:^量[As類智名]In表達式Where Jo/"殺斧表^"式 Jo/"條,表這式. . =i e/a"o"a/運,界表這式|緣e運餅表這式 查詢運算符模式326可以包括一查詢運算符,其是名為GROUPJOIN的可 訪問實例方法,該方法可以接收以下各項作為自變量具有類型T'的元素的可 査詢類型S;用作外部關(guān)鍵字選擇器的函數(shù),其取類型T的自變量,并產(chǎn)生表 示關(guān)鍵字的類型K;用作內(nèi)部關(guān)鍵字選擇器的函數(shù),其取類型U的自變量,并 產(chǎn)生表示關(guān)鍵字的類型K;和/或可產(chǎn)生結(jié)果的函數(shù),其中該函數(shù)可以取類型T 的自變量,以及具有元素類型U的類集的自變量,并產(chǎn)生所選類型V。該方法 可以返回具有元素類型V的可查詢類型。GROUPJOIN運算符可以基于從元素中提取的匹配關(guān)鍵字來創(chuàng)建兩個類 集的分組聯(lián)接。運算符可以產(chǎn)生分層結(jié)果(例如,與匹配的內(nèi)部元素的類集配 對的外部元素),并且不需要關(guān)系型數(shù)據(jù)庫項中的直接等價物。以下示例查詢 表達式104可以執(zhí)行顧客與其定單的分組聯(lián)接,從而產(chǎn)生具有顧客姓名以及該 顧客的定單總額(order/Total)的匿名類型的類集 From cust In db.Customers —Group Join order In db.Orders On cust.ID = order.CustID — Aggregate TotalOrders = Sum(order.Total)— Select cust.Name, TotalOrders可以有對固定集合操作以計算單個值的任何數(shù)量的附加運算符。在查詢的 上下文中,可以認為這些運算符聚集所計算的值。為對集合進行聚集,該集合 一般必須首先被引入。在査詢內(nèi),可以有各種方式來指定用于聚集計算的類集。 在引入了一個組后,該組可被聚集以計算單個值。因此,除了分組運算符 GROUPJOIN (以及以下結(jié)合查詢運算符模式328討論的GROUPBY)之外, 可存在其它分組運算符。 一個這樣的示例是OVER運算符。OVER運算符可以指定一個組應(yīng)被累積以便進行聚集綜合。OVER運算符26可用作獨立表達式,或者其可用于指定應(yīng)對聚集計算采用預(yù)形成的類集。例如, 以下示例査詢表達式104可以聚集2006年1月1日以前所有定單總額之和Over order In Orders _Where order.Date <= #01/01/2006# —Aggregate Sum(order.Total) OVER運算符的每次應(yīng)用通常必須以相應(yīng)的AGGREGATE運算符關(guān)閉來 基于類集內(nèi)容計算單個值。查詢的結(jié)果可以是對應(yīng)于聚集計算的單個值,在這 一情況下其是表示2006年以前的所有定單的總金額的整數(shù)。在OVER和AGGREGATE運算符之間可以使用可能任何查詢運算符。在 AGGREGATE運算符內(nèi),僅可對前一 OVER運算符指定的控制變量使用 AGGREGATE運算符(例如,與模式318-322相關(guān)聯(lián)的運算符,如上所述)。 當己經(jīng)形成一個集合時,如通常是分層對象圖的情形,則可使用OVER 運算符來指定應(yīng)對聚集計算使用一個集合。例如,以下示例性查詢表達式104 可以聚集2006年以前華盛頓的所有顧客發(fā)出的所有定單的總金額From cust In db.Customers —Where cust.State = "WA"—Over order In Orders —Where order.Date <= #01/01/2006# —Aggregate Sum(order.Total)該査詢的結(jié)果可以是其元素類型是具有以下兩個屬性的匿名類型的可査詢類型1)稱為cust的顧客屬性,和稱為Sum的整數(shù)屬性。查詢運算符模式328可以包括一查詢運算符,其是名為GROUPBY的可 訪問實例方法,該方法可取以下各項作為自變量用作關(guān)鍵字選擇器的函數(shù), 其接收類型T的自變量,并產(chǎn)生表示關(guān)鍵字的類型K;和/或產(chǎn)生結(jié)果的函數(shù), 其取類型K的自變量以及作為具有元素類型T的類集的自變量,并產(chǎn)生所選 類型V。該方法可以返回產(chǎn)生具有元素類型V的可査詢類型。GROUPBY運算符可以基于一個或多個共同的關(guān)鍵字表達式來對類集的 元素分組(例如,邏輯上)。對于初始類集的這些分區(qū)的每一個,后續(xù)的 AGGREGATE語句可以指定這些組的每一個如何被聚集成單個值或行。例如,以下示例性查詢表達式104可以按照州來對所有顧客分組,然后計算每一組的計數(shù)(Count)和平均年齡(AverageAge): From cust In Customers — Group By cust. StateAggregate Total = Count(), AverageAge = Avg(cust.Age) 與SELECT運算符一樣,GROUPBY運算符可以將在關(guān)鍵字選擇器中聲 明的變量作為控制變量帶入范圍中,并且可隱藏先前在范圍中的所有控制變 量。相反,與SELECT運算符的某些方面不同,這些隱藏的控制變量可以由在 后續(xù)的AGGREGATE運算符內(nèi)使用的AGGREGATE運算符再次帶入范圍中。 此外,與OVER運算符的某些實現(xiàn)不同,在GROUPBY和AGGREGATE運算 符之間不能使用任何其它查詢運算符。From cust In Customers 一Group CustomersByState By cust.State 這一構(gòu)造可以等價于通過顯式聚集來構(gòu)造組,但是在GROUPBY運算符 子句之后立即終止查詢吋是有用的。由此,以上表達式可以等價于以下表達式From cust In Customers —Group By cust. State 一Aggregate CustomersByState = Group(cust)不必要求GROUPBY運算符的實際實現(xiàn)實際構(gòu)建每一個別的組的表示。 相反,該實現(xiàn)可使用將分組與后續(xù)的聚集成單個運算相組合的底層實現(xiàn)。可以理解,控制變量的類型和名稱可以從查詢表達式104的目標以及所應(yīng) 用的查詢運算符中推斷(將在下文中結(jié)合圖4來更詳細討論)。由此,元素類 型(其是范圍中的控制變量的聚集)可以用類似的方式來推斷。對于以上的每 一條規(guī)則,元素類型的所推斷的類型可以是T,并且當可查詢類型C是在例如 FOR EACH ... NEXT語句中使用的類集時,元素類型通常必須匹配元素類型T。還應(yīng)當理解,已排序類集可被定義為實現(xiàn)以下運算符的子集的類集名為 THENBY或THENBYDESCENDING的、取一函數(shù)作為自變量的可訪問實例方 法,該函數(shù)取類型T的自變量,并產(chǎn)生類型S。該方法可以返回具有元素類型 T的已排序類集。由于查詢運算符模式106可以方便將查詢句法綁定到實現(xiàn)特定査詢運算 的方法,因此不需要由所采用的底層語言來規(guī)定次序保留。相反,次序保留可 以由運算符本身的實現(xiàn)來確定。這在要重載的實現(xiàn)方面可以類似于用戶定義的 運算符,例如,用于用戶定義的數(shù)值類型的加法運算符不能執(zhí)行類似加法的任 何運算。然而,為保留所要求保護的主題內(nèi)在的可預(yù)測性,實現(xiàn)不匹配用戶期 望的運算符可能不是推薦的過程。為幫助更完整地理解所要求保護的主題,現(xiàn)在可進一步討論其它特征、方 面和/或?qū)崿F(xiàn)。例如,以下的某些節(jié)詳述了每一查詢運算符映射到對標準查詢運 算符方法的調(diào)用的示例性方式。其它節(jié)描述了如上引入的元素類型信息流的方 式,并且將在稍后的節(jié)中使用(例如,結(jié)合圖4和以下相關(guān)聯(lián)的描述)。查詢運算符轉(zhuǎn)換可以理解,各種查詢運算符的每一個可以直接映射到可根據(jù)標準查詢運算符模式(例如,查詢運算符模式106)來定義的方法調(diào)用。由此,查詢運算符 (或作為整體的查詢表達式)的含義可以按照要調(diào)用的査詢運算符方法來表 達。方法可以是所查詢的對象的實例方法,或?qū)ο笸獠康臄U展方法。例如,査詢Dim names = _ From c In Customers — Where c.State = "WA"— Return c,Nam6可以等價于Dim names = Customers.Where(c => c.State).Select(c => c.Name) 合成控制變量盡管控制變量可由所要求保護的主題為此處所描述的各種目的而采用,但 是可以理解,控制變量一般不是對最終用戶直接可訪問的。諸如WHERE或 SELECT等某些查詢運算符取可以引用查詢中在范圍中的控制變量的表達式。 這些表達式被表達為取控制變量并返回表達式結(jié)果的局部函數(shù)。例如,查詢 Dim WACusts =— From cust In Customers29Where cust.State = "WA"可以等價于Dim WACusts = Customers.Where(c =〉 c.State = "WA") _ .Select(c => New With (c.Name"其中控制變量cust用作用于拉姆達表達式(lambda expression)的參數(shù)。 類似地,在多個控制變量在范圍中的情況下,控制變量通常必須被一起分組成單個匿名類型,以使它們可被傳入局部函數(shù)。例如,查詢 Dim WACustsAndOrders = _ From cust In Customers — From order In cust.Orders —Where cust.State = "WA" AndAlso order.Price > 10.50可以等價于Function Filter 1 (it As {c As Customer, o As Order}) As BooleanReturn it.c.State = "WA" AndAlso it.o.Price > 10,50 End FunctionFunction Joinl(c As Customer) As —IEnumerable(Of {c As Customer, o As Order}) Function Select l(o As Order) As {c As Customer, o As Order}Return New {c, o} End FunctionReturn c.Orders.Select(AddressOf Selectl) End FunctionDim WACustsAndOrders = 一 Customers. SelectMany(AddressOf Joinl).Where(AddressOf Filter 1)其中控制變量c和o被一起組合成稱為IT的合成控制變量,其類型是匿名類 型(c As Customer, o As Order}。還可以理解,也可以提供對于拉姆達表達式的支持,并且其被認為是在所 要求保護的主題的精神和范圍之內(nèi)。還要注意,合成控制變量通常是不嵌套的。作為一個示例From b In Books _From ba In BookAuthors —From a In Authors —可以等價于Function Joinl(b As Book) As IEnumerable(OfAs Book, ba As BookAuthor})Function Selectl(ba As BookAuthor) As {b As Book, ba As BookAuthor}Return New { b, ba } End FunctionReturn BookAuthors.Select(AddressOf Selectl) End FunctionFunction Join2(it As {b As Book, ba As BookAuthor}) As —IEnumerable(Of {b As Book, ba As BookAuthor, a As Author" Function Select2(a As Author) As 一{b As Book, ba As BookAuthor, a As Author} Return New {b, ba, a} End FunctionReturn Authors.Select(AddressOf Join2) End FunctionBooks.SelectMany(AddressOf Joinl).SelectMany(AddresOf Join2) FROM運算符轉(zhuǎn)換標準FROM運算符一般僅引入査詢源以及要使用的控制變量。本質(zhì)上, 它不轉(zhuǎn)換成任何特定查詢運算符調(diào)用。在JOIN的情況下,F(xiàn)ROM運算符在與 常規(guī)控制變量聯(lián)接時可被轉(zhuǎn)換成對SELECTMANY査詢運算符方法的調(diào)用,而 在與表達式控制變量聯(lián)接時可被轉(zhuǎn)換成對SELECT查詢運算符方法的調(diào)用。因 此,查詢表達式31From b In Books, p In Publishers — Select b.Title, p.Name可以等價于Function Joinl(b As Book) As IEnumerable(Of {b As Book, p As Publisher})Function Select2(p As Publisher) As {b As Book, p As Publisher}Return New With {b, p} End FunctionReturn Publishers.Select(AddressOf Select2) End FunctionFunction Selectl(it As {b As Book, p As Publisher}) As — {Title As String, Name As String} Return New With {it.b.Title, it.p.Name} End FunctionBooks.SelectMany(AddressOf Joinl).Select(AddressOf Selectl) 并且査詢表達式From b In Books, Tax = b,Price * 0.088 — Select b.Title, Tax可以等價于Function Selectl(b As Book) As {b As Book, Tax As Double}Return New With {b, Tax = b.Price * 0.088} End FunctionFunction Select2(it As {b As Book, Tax As Double}) As {Title As String, Tax As Double} Return New With {it.b.Title, it.Tax} End FunctionBooks.Select(AddressOf Selectl).Select(AddressOf Select2)每一查詢運算符可被綁定到粘附到特定模式的源類型上的底層方法。該模 式規(guī)定了運算符的結(jié)果的元素類型,并且在某些情況下對可傳入底層方法的表達式施加了約束。顯式類型化的控制變量如果FROM運算符使用As子句為控制變量指定了目標類型Object (對 象),并且T的類型不能從源類型中推斷,則元素類型可以使用Case(Of Object) 運算符來轉(zhuǎn)換。查詢表達式 Dim nums =— From addrNum As Object In publisher.Address 一 Where addrNum < 5等價于-Function Filter 1 (addrNum As Integer) As BooleanReturn addrNum < 5 End FunctionDim names 二 publisher.Address.Cast(Of Object)O.Where(AddressOf Filterl)如果FROM運算符使用As子句為控制變量指定了目標類型T (不是 Object),并且T的類型不能從源類型中推斷或者如果目標類型不匹配源的元 素類型,則元素類型可以使用Cast (強制轉(zhuǎn)換)查詢運算符轉(zhuǎn)換成Object,并 且可利用后續(xù)的SELECT運算符來獲得目標類型。例如,查詢表達式 Dim nums =— From addrNum As Integer In publisher,Address — Where addrNum < 5等價于Function Filter 1 (addrNum As Integer) As BooleanReturn addrNum < 5 End FunctionFunction Select 1 (addrNum As Integer) As StringReturn addrNum End FunctionDim names = publisher.Address.Cast(Of Object)().Select(AddressOf33Select 1). Where(AddressOf Filter 1) 如果FROM運算符使用As子句為控制變量指定了目標類型T,并且T的 類型匹配源的元素類型,則不需要后續(xù)應(yīng)用Cast或SELECT運算符。 WHERE運算符轉(zhuǎn)換WHERE運算符可被轉(zhuǎn)換成對Where査詢運算符方法的調(diào)用。例如,查詢 表達式From book In Books _Where book.PublisherID = 10 _Return book.Title可以等價于Books,Where(b => b.PublisherID = 10).Select(b => b.Title) ORDERBY運算符轉(zhuǎn)換ORDERBY運算符對于第一次排序可被轉(zhuǎn)換成對ORDERBY或 ORDERBYDESCENDING查詢運算符方法的調(diào)用(取決于排序的類型),并 且然后對于以后的排序被轉(zhuǎn)換成對THENBY和THENBYDESCENDING査詢 運算符方法的調(diào)用。例如,查詢表達式From a In Authors —Order By a.State, a.City Descending —Return a.Name 可以等價于Authors.OrderBy(a =〉 a.State).ThenByDescending(a => a.City),— Select(a => a.Name) RETURN和SELECT運算符轉(zhuǎn)換RETURN運算符可被轉(zhuǎn)換成對SELECT查詢運算符方法的調(diào)用。例如From e In Employees 一Hetum e.Name 可以等價于Employees.Select(e => e.Name) SELECT運算符可被轉(zhuǎn)換成對SELECT查詢運算符方法的調(diào)用以及匿名類型的構(gòu)造。例如From e In Employees — Select e.Name, e.Salary可以等價于Employees.Select(e =〉 New With {e.Name, e.Salary}) DISTINCT運算符轉(zhuǎn)換DISTINCT運算符可被轉(zhuǎn)換成對DISTINCT查詢運算符方法的調(diào)用。例如: From e In Employees — Distinct可以等價于Employees.DistinctO TAKE或SKIP[WHILE]運算符轉(zhuǎn)換TAKE或SKIP運算符可以調(diào)用相應(yīng)的TAKE或SKIP查詢運算符方法。例如From e In Employees — Order By e.Salary Descending — Rstum s.Nams Take 5可以等價于-Employees.OrderByDescending(e => e.Salary).Select(e => e.Name).Take(5)并且查詢From e In Employees — Order By e.Salary Descending — Return e.Name Skip 5可以等價于Employees.OrderByDescending(e => e.Salary).Select(e => e.Name).Skip(5)當結(jié)合WHILE修飾符使用時,可以創(chuàng)建條件表達式來應(yīng)用于底層的TAKEWHILE或SKIPWHILE査詢運算符。例如,查詢 From e In Employees 一 Order By e.Salary Descending 一 Take While e.Salary > 50000 — Return e.Namc可以等價于Employees.OrderByDescending(e => e.Salary). 一 .TakeWhile(e => e.Salary > 50000).Select(e =〉 e.Name) GROUPBY和AGGREGATE運算符轉(zhuǎn)換后跟聚集SELECT或RETURN運算符的GROUPBY運算符可被轉(zhuǎn)換成對 后跟構(gòu)造的組上的聚集的GROUPBY查詢運算符方法的調(diào)用。例如,査詢 From C In Customers — Group By C.State —Aggregate Youngest = Min(c.Age), Oldest = Max(c.Age) Select State, Youngest, Oldest 可以等價于Customers.GroupBy(c => New With { .State = c.State },— (g, k) => New With { .State = k,— .Youngest = g,Min(c => c.Age), .Oldest = g.Max(c => c.Age) }) 示例對象此處包括的所有示例使用兩個單獨的對象集中的一個。Company (公司) 對象可以表示關(guān)于一公司的信息,并且可以分層地連接 Class Company Dim Name As String Dim Employees As List(Of Employees) Dim Customers As List(Of Customer)36End Class Class CustomerDim Name As StringDim Orders As List(Of Order) End Class Class OrderDim Product As StringDim Price As Integer End Class Class EmployeeDim Name As StringDim Birthday As DateDim Position As StringDim Salary As Decimal End ClassDim Employees As List(Of Employee) Dim Customers As List(Of Customer) Book (書)對象可以表示關(guān)于例如書店中庫存的書的信息,并且可通過 關(guān)系連接Class BookDim BookID As LongDim Title As StringDim PublisherlD As LongDim Price As Double End Class Class AuthorDim AuthorlD As LongDim Name As StringDim Address As StringDim City As StringDim State As StringDim ZIP As String End Class Class BookAuthorDim BookID As LongDim AuthorID As Long End Class Class PublisherDim PublisherID As LongDim Name As StringDim Address As StringDim State As String End ClassDim Books As List(Of Book)Dim Authors As List(Of Author)Dim BookAuthors As List(Of BookAuthor)Dim Publishers As List(Of Publisher)在記住了以上內(nèi)容之后,現(xiàn)在轉(zhuǎn)向圖4,描繪了可以實時地推斷元素類型 和/或基于所推斷的元素類型增量式地提供上下文信息的計算機實現(xiàn)的系統(tǒng) 400。 一般而言,系統(tǒng)400可以包括接收查詢表達式104的用戶接口 102,如基 本在上文結(jié)合圖l所描述的。另外,系統(tǒng)400可以包括可操作地耦合(未示出) 到用戶接口 102和/或上下文組件402的模式存儲108。上下文組件402可以檢 查查詢表達式104并實時地做出關(guān)于元素類型的推斷。例如,如上所述,由于 用于每一查詢子句的查詢運算符符合一特定模式(例如,圖1的查詢運算符模 式106),并且此外,由于元素類型可從一個查詢子句流到下一查詢子句,因 此這兩條信息可用于為任何給定下一查詢子句確定元素類型。當查詢運算符被描述為方法調(diào)用并且查詢運算作為純機制變換來應(yīng)用時, --般要求類型解析在重載解析期間進行。以此方式,假定查詢運算符可將類型從一個運算符流到另一個,則運算符一般必須被完全綁定以便能夠?qū)㈩愋吞峁?給要應(yīng)用的下一運算符。結(jié)果,如果重載解析由于句法錯誤或某一其它問題而 失敗,則沒有可用于向應(yīng)用的下一運算符提供類型信息的常規(guī)機制。沒有這一 類型流機制的合成查詢運算符(以下從圖6開始更詳細討論)導(dǎo)致多余的錯誤 消息、不同的表達式語義、缺少用于自動完成的上下文信息、以及總體上更慢 的編譯器吞吐量。如所描述的,所要求保護的主題可以采用查詢運算符的模式的形式化,這 可允許元素類型不依賴于完全方法綁定,而是依賴于所采用的特定運算符的模 式。作為進一步說明,考慮由用戶接口 102接收的當前示例性查詢表達式104 (例如,在類型化査詢表達式104時)Dim q = From cust In Customers —Where cust.Name = "XYZ" & errorUnresolvedVarName 一 Select cust.第一個查詢子句包括FROM運算符,其可引入可查詢源類型"Customers"作為 匿名元素類型"cust",這可以是源類型的元素。如所討論的,該元素類型可以 流到下一査詢子句,其中WHERE運算符可以過濾該類集,但是在其它方面不 更改元素類型。最后,該元素類型流到下一査詢子句,其中可找到SELECT運 算符以及SELECT運算符方法期望接收的函數(shù)的一部分,但是下一查詢子句的 其余部分尚未完成。流入SELECT子句的元素類型現(xiàn)在可用于該特定查詢子句的源類型。上 下文組件402因此可以基于源類型和查詢運算符來實時地推斷該查詢子句的元 素類型(例如,cust)。因此,推斷可以完全是局部的,并且不需要對査詢表 達式104的完全轉(zhuǎn)換。相反,上下文組件402可以用類似于后臺編譯器的方式 來執(zhí)行推斷。另外,上下文組件402的推斷可以用多種方式來促進更大的效率。例如, 推斷僅需在執(zhí)行轉(zhuǎn)換時被執(zhí)行一次。由此,如果在查詢表達式104中有兩個 WHERE運算符,則對第二個WHERE運算符的轉(zhuǎn)換不必是必需的。另夕卜,推 斷可以用于完全和通常更昂貴的編譯,以縮短一般必須執(zhí)行的類型發(fā)現(xiàn)的巡 回。由此,事先推斷元素類型可以用各種方式來使用以加快編譯時間。此外, 一旦上下文組件402推斷了元素類型(此處,是"Select cust."查詢 子句中的"cust"),則上下文組件402可以增量式地提供上下文信息404。例如, 當點的類型是"cust."時,則上下文信息404可以用方便且熟悉的彈出窗口的形 式來動態(tài)地提供,以允許如圖所示或另一形式的自動完成。可以理解,這一特 征常規(guī)上對查詢表達式不可用,因為查詢表達式(常規(guī)上)在可確定元素類型 之前必須首先被轉(zhuǎn)換。并且,由于提供完整且無錯誤的查詢表達式是常規(guī)轉(zhuǎn)換 /編譯的先決條件,因此迄今為止阻礙了任何類似的上下文和/或自動完成機制。盡管上下文信息404對于査詢表達式有很大的效用,并且大部分在于IDE 中提供上下文反饋的上下文中示出,但是沒有一種情況是必需的。例如,此處 所描述的可適用于不僅僅是査詢表達式的查詢運算符。特別地,類型從一個運 算符流到下一運算符并在兩者之間有關(guān)系的概念可應(yīng)用于其中類型流有用的 任何運算符或任何API。--個這樣的示例存在于將API調(diào)用鏈接在一起(例如, 包括在命令行中的流水線,其中目的是類型從一個命令流到下一個)。另一示 例可以是后綁定,其中沒有類型,但是可采用某種形式的流諸如用于后綁定的 優(yōu)化。還可以理解,上下文組件402所執(zhí)行的推斷可以完全基于所接收到的已知 信息來預(yù)定(例如,關(guān)于己知且定義的査詢運算符的源類型),或者根據(jù)其它 方面,推斷可以是概率性的。例如,當用于不同類型的運算符時,上下文組件 402可用于檢查可用數(shù)據(jù)的整體或其子集,并且能夠從經(jīng)由事件和/或數(shù)據(jù)捕捉 的一組觀察結(jié)果中推出或推斷系統(tǒng)、環(huán)境和/或用戶的狀態(tài)。例如,推斷可用于 標識特定的上下文或動作,或可生成狀態(tài)的概率分布。推斷可以是概率性的, 即,基于數(shù)據(jù)和事件的考慮計算感興趣的狀態(tài)的概率分布。推斷也可以指用于 從一組事件和/或數(shù)據(jù)組成更高級事件的技術(shù)。這類推斷可導(dǎo)致從一組觀察到的事件和/或儲存的事件數(shù)據(jù)中構(gòu)造新的事 件或動作,而無論事件是否在相鄰時間上相關(guān),也無論事件和數(shù)據(jù)是來自一個 還是若干個事件和數(shù)據(jù)源。可采用各種分類(顯式和/或隱式訓(xùn)練的)方案和/ 或系統(tǒng)(例如,支持向量機、神經(jīng)網(wǎng)絡(luò)、專家系統(tǒng)、貝葉斯信任網(wǎng)絡(luò)、模糊邏 輯、數(shù)據(jù)融合引擎......)來執(zhí)行關(guān)于所要求保護的主題的自動化和/或推斷的動作。分類器可以是將輸入屬性矢量x = (xl, x2, x3, x4, x")映射到該輸入屬于一個類的置信度的函數(shù),即/r力-COM/ ^WCe(c/fl^)。這一分類可采用基于概率和/或基于統(tǒng)計的分析(例如,分解成分析效用和成本)來預(yù)測或推斷用戶期望自動執(zhí)行的動作。支持向量機(SVM)是可采用的分類器的一個示例。SVM通 過找出可能輸入空間中的超曲面來操作,其中,超曲面試圖將觸發(fā)準則從非觸 發(fā)事件中分離出來。直觀上,這使得分類對于接近但不等同于訓(xùn)練數(shù)據(jù)的測試 數(shù)據(jù)正確。可采用其它定向和非定向模型分類方法,包括,例如,樸素貝葉斯、 貝葉斯網(wǎng)絡(luò)、決策樹、神經(jīng)網(wǎng)絡(luò)、模糊邏輯模型以及提供不同獨立性模式的概 率分類模型。此處所使用的分類也包括用于開發(fā)優(yōu)先級模型的統(tǒng)計回歸。圖5示出了根據(jù)所要求保護的主題的方法。盡管出于簡化解釋的目的,該 方法和其它方法被示出和描述為一系列動作,但應(yīng)該理解和明白,所要求保護 的主題不受動作的順序限制,因為某些動作能夠以與在此所示出和描述的不同 的順序發(fā)生和/或與其它動作同時發(fā)生。例如,本領(lǐng)域技術(shù)人員將會明白并理解, 方法可被替換地表示為 一系列相互關(guān)聯(lián)的狀態(tài)或事件,諸如以狀態(tài)圖的形式。 而且,并非所有示出的動作都是實現(xiàn)根據(jù)所要求保護的主題的方法所必需的。 另外還應(yīng)該理解,下文以及本說明書全文中所公開的方法能夠被存儲在制品 上,以便于把此類方法傳送和轉(zhuǎn)移到計算機。在此使用的術(shù)語"制品"意指包含 可以從任何計算機可讀設(shè)備、載體或介質(zhì)訪問的計算機程序?,F(xiàn)在參考圖5,示出了用于方便元素類型的類型流的計算機實現(xiàn)的方法。 概括地,在參考標號502處,可接收包括查詢運算符的查詢子句的一部分。查 詢運算符可被映射到相關(guān)聯(lián)的方法調(diào)用,該方法調(diào)用可接收自變量(例如,函 數(shù)、值、類集......)并可返回類型化的結(jié)果(例如,可查詢類型、數(shù)值類型、已排序類集......)。該方法調(diào)用可以根據(jù)查詢運算符模式來定義。在參考標號504處,可利用源類型和査詢運算符來確定元素類型。例如, 由于查詢運算符模式可被形式化,因此查詢運算符的模式可結(jié)合源類型使用來 推斷元素類型。在參考標號506處,可采用前一查詢的元素類型作為參考標號 504處所討論的利用動作的源類型。據(jù)此,元素類型可以按遞歸的方式從一個 查詢子句流到下一查詢子句。在記住了上述內(nèi)容之后,可以理解和明白,某些特征和/或方面可用于以其它方式來擴展編程語言的査詢能力。作為一個示例,此處所開發(fā)的方面可有 效地利用來提供基于計算機和/或基于語言的構(gòu)造,如與常規(guī)上與API調(diào)用相 關(guān)聯(lián)的合成能力的綜合。這些和其它相關(guān)概念的描述可參考圖6找到。現(xiàn)在轉(zhuǎn)向圖6,提供了方便可組成査詢綜合和/或可擴展查詢表達式的計算機實現(xiàn)的系統(tǒng)600的框圖。 一般而言,系統(tǒng)600可包括可接收初始化數(shù)據(jù)604 的變換組件602。如圖所示,初始化數(shù)據(jù)604可以是示例性查詢表達式606中 的第一個査詢子句,其中該第一個査詢子句通常限于是FROM子句(例如, 第一個查詢子句的查詢運算符是FROM運算符)。初始化數(shù)據(jù)604可以包括 類集(例如,如圖所示的Customers)或表達式(例如,如上文結(jié)合關(guān)于圖3 詳述的FROM運算符描述的Tax:b.Price5^ 0.088)。在任一情況下,初始化數(shù) 據(jù)還可包括控制變量,取決于應(yīng)用,該控制變量與類集(例如,C是控制變量) 或表達式(例如,Tax是控制變量)相關(guān)聯(lián)。變換組件602還可接收由查詢表達式606表征的序列中的一組查詢子句 608。可以理解,該組查詢子句608可以是空集,在這一情況下,查詢表達式 606由單個查詢子句構(gòu)成(例如,用作初始化數(shù)據(jù)604的FROM子句),如將 在下文中更詳細描述的。如可以對初始數(shù)據(jù)604所完成的那樣,變換組件602 還可對組608中的每一查詢子句解析(例如,填充或變換)范圍中的控制變量。 例如,變換組件602可以進而通過向可用類型應(yīng)用每一查詢子句的查詢運算符, 來以查詢表達式608所規(guī)定的次序處理組608中的每一查詢子句??梢岳斫?,根據(jù)所要求保護的主題,該組查詢子句608不需要由諸如,例 如XQuery語言的各種版本所定義的FLWOR/FLWR或SQL的實現(xiàn)中所期望的 Sdect-From-Where等普遍存在的語義模板來限制。相反,組608可以在本質(zhì)上 是合成的,使得個別査詢子句可被妥當?shù)靥峁?、以模塊化方式接合在一起、并 且即使在運算符的次序是任意的情況下也產(chǎn)生直觀結(jié)果。據(jù)此,系統(tǒng)600還可包括可管理查詢表達式606所引入的所有控制變量的 范圍的綜合組件610??刂谱兞康姆秶梢曰跂嗽冏泳涞倪\算符來確定,并 且范圍中的控制變量可被傳遞到下一査詢子句。例如,變換組件602可以確立 可被認為是流水線的事物,使得某些信息可通過流水線從一個查詢子句流到下 一査詢子句。由此,變換組件可以接收關(guān)于查詢子句的類集,基于與該查詢子句相關(guān)聯(lián)的運算符來變換(例如,過濾、投影......)該類集,并將所變換的類集輸出到流水線以使其可用于下一查詢子句。類似地,范圍中的控制變量也可被傳遞到下一查詢子句,并且精確而言什 么控制變量在范圍中可以由綜合組件610基于所接收到的查詢子句的類型來定 義。通常,下一査詢子句只能訪問在范圍中的變量。該特征以及其它特征可通 過除了圖6之外再參考圖7來進一步描述。圖7是涉及如可由綜合組件610所確定的示例查詢表達式606的控制變量 的范圍的示例性圖示。根據(jù)所要求保護的主題的一方面,綜合組件610可以基 于查詢子句/運算符的類型來聲明新的控制變量(并且可將該新的控制變量帶入 范圍)。例如,某些類型的查詢子句可以除了己經(jīng)在范圍中的控制變量之外還 引入新的控制變量,即,F(xiàn)ROM、 LET、 SELECT或GROUPBY查詢子句可產(chǎn) 生這 -結(jié)果。由FROM子句引入的控制變量通常被累積,直到下一 SELECT 或GROUPBY子句,在這之后它們可由綜合組件610帶出范圍。這一情況由 FROM子句702、 704 (映射到初始化數(shù)據(jù)604以及包括在査詢子句組608中 的初始查詢子句)示出,其控制變量停留在范圍中,直到應(yīng)用了 SELECT子句 710。子句702引入Customer類集和控制變量C。因此,該信息可以通過流水 線提供給下一查詢子句。因此,可以使(C AsCustomer)對子句704可用。子句 704也是FROM子句,這由于所要求保護的主題的合成本質(zhì)是可能的。子句 704采用了控制變量C來引入新的類集C.Orders (例如,所有顧客的所有定單) 以及新的控制變量O,綜合組件610可將該新的控制變量帶入范圍。由此,下 一査詢子句706能夠訪問范圍中的兩個控制變量C和O?;救缫陨纤枋龅?,盡管某些查詢子句類型可影響范圍中的變量,但是 其它査詢子句類型(例如,WHERE、 ORDERBY、 DISTINCT等)卻不必。由 此,盡管査詢子句706和708可影響類集,但范圍中的變量(例如C和O)可 以相同,并且因此可分別由查詢子句708和710在其各自由變換組件602接收 時訪問。根據(jù)所要求保護的主題的一方面,綜合組件610可以基于所接收到的查詢 子句的類型將現(xiàn)有控制變量帶出范圍。SELECT查詢子句710提供了該特征的表征圖示。査詢子句710被展示給控制變量C和0,但是SELECT子句的特 征之一可以是隱藏范圍中的當前控制變量并在范圍中引入新的控制變量(例 如,Name As String和Price As Int)??梢韵驏嗽冏泳?12提供這些新的控制 變量Name和Price,但是査詢子句712 —般不能訪問綜合組件610關(guān)于SELECT 子句710帶出范圍的先前的控制變量(例如,C和O)。為完整性起見,應(yīng)注 意幾個特征。首先,查詢子句710示出了逗號分割的復(fù)合運算數(shù)的又一示例。 要注意的第二個特征是WHERE子句712在SELECT子句710之后。常 規(guī)的查詢語言在應(yīng)用了具有諸如SELECT、 RETURN等投影運算符或類似的運 算符的查詢子句之后終止查詢。如果這一常規(guī)查詢語言的用戶希望在投影之后 繼續(xù)查詢運算,則必須實現(xiàn)可引用前一查詢的結(jié)果的新查詢。然而,由于例如 所要求保護的主題的合成本質(zhì),查詢表達式606可以包括多個SELECT子句, 并且查詢表達式606可以在出現(xiàn)SELECT子句之后繼續(xù)(例如,由子句712示 出)。類似地,盡管在前一節(jié)中提到,但應(yīng)指出,查詢表達式606也包括兩個 FROM子句(例如,子句702和704),這是常規(guī)查詢語言所無法提供的另一 方面。盡管未由解釋示例描繪,但査詢表達式606還可包括其它查詢子句類型, 并且特別地,這些其它查詢子句類型中的許多可影響控制變量的范圍。例如, 在接收到RETURN子句之后,綜合組件610可以將所有變量帶出范圍。作為 另一示例,基于查詢子句的類型,綜合組件610可以聲明新的控制變量并對其 定范圍(例如,帶入范圍),同時為特定一組后續(xù)查詢子句確定現(xiàn)存的控制變 量(例如,對于前一查詢子句在范圍中的控制變量)的范圍。GROUPBY、 AGGREGATE等可方便這一行為,由此現(xiàn)存控制變量的范圍可被定在跨每一 GROUP運算符的AGGREGATE查詢子句的范圍上。根據(jù)所要求保護的主題的另一方面,綜合組件610可以基于所接收到的查 詢子句的類型為范圍中的所有控制變量的元組生成別名。例如,INTO查詢子 句可以方便例如由綜合組件610來創(chuàng)建別名,即使該別名本身不需要是控制變?nèi)詤⒖紙D6和7,可強調(diào)所要求保護的主題的各種附加方面。盡管有與有 效查詢表達式606的可擴展性有關(guān)的多個優(yōu)點(例如,查詢表達式606可用實際上任何數(shù)量的實際上任何類型的査詢子句來擴展),但另一優(yōu)點可以是査詢
表達式606也可以在任何點終止。由此,盡管査詢表達式606有可能包括無限 數(shù)量的查詢子句,但整個査詢表達式606也可由僅單個在引入了單個控制變量 之后終止的查詢子句組成。因此,完整且有效的査詢表達式606的最簡單的示 例之一是僅包括初始化數(shù)據(jù)604的查詢表達式606:
From C In Customers 而不要求查詢表達式606包括顯式的SELECT、 RETURN或其它終止査詢運算 符。
作為解釋,變換組件602可被配置成向接收到的每一査詢子句追加隱式 SELECT或RETURN。由此,只要包括在流水線中的所得類集處于期望的形狀, 就不需要顯式語句來選擇或返回這些中間結(jié)果。相反,如果查詢表達式606在 給定子句,例如702-708中的任一個之后結(jié)束,則流水線中的類集可以輸出結(jié) 果,并且可以基于范圍中的控制變量的數(shù)目來推斷輸出的格式。
例如,如果查詢表達式606在子句704-708中的任一個之后終止(其中在 每一情況下范圍中有兩個控制變量C和0),則可以推斷所需輸出應(yīng)作為名-值對的類集存在。因此,輸出可以是對每一控制變量有一字段的元組。另 -方 面,在范圍中僅有一個控制變量的情況下,諸如在子句702之后,則查詢表達 式606的實現(xiàn)器通常將不期望得回具有字段c的元組。相反,實現(xiàn)器可能期望 顧客的類集。因此,在范圍中僅有一個控制變量的情況下,輸出可以僅僅是類 集的底層值。
根據(jù)所要求保護的主題的一方面,由FROM子句引入的控制變量可以與 表達式以及類集相關(guān)聯(lián)。作為一個代表性示例,考慮以下如上所述的查詢片段 From b in Books 一 From Tax = b.Price * 0.088 — 第一個FROM子句為類集Books引入控制變量b,該控制變量被帶入范 圍并可由下一査詢子句來訪問。下一 FROM子句引入與表達式(而非類集) b.Price * 0.088相關(guān)聯(lián)的控制變量Tax。對于兩個FROM子句中的后者,效果 可以是為表達式的結(jié)果提供了可訪問名稱。該名稱可由控制變量tax來引用, 該控制變量可保留在范圍中,直到例如后續(xù)的SELECT子句。該特征可被認為
45類似于查詢中的過程語句,這可允許表達式的值被計算一次,即使該值隨后可 被多次采用,也不需要重新計算該值。
根據(jù)所要求保護的主題的另一方面,可以在單個查詢表達式606的上下文 中采用集合運算。盡管常規(guī)查詢語言通常僅提供單個類集作為輸入,但是變換
組件602可以接收兩個類集作為輸入。例如,變換組件602可被配置成接收多 個類集,并可輸出具有與根據(jù)查詢子句的類型(例如,UNION子句、INTERSECT 子句......)合并的多個類集相關(guān)聯(lián)的控制變量的單個類集。合并的控制變量可
被帶入范圍、通過相關(guān)聯(lián)的集合運算符傳遞、并對下一查詢子句可訪問,因此 查詢表達式606可繼續(xù)??刂谱兞恳话惚仨毷窍嗤念愋停⑶乙话惚仨毦哂?相同的名稱,但是當然,它們可以與兩個不同的類集相關(guān)聯(lián)。
現(xiàn)在轉(zhuǎn)向圖8,示出了用于方便以合成方式構(gòu)造查詢綜合的計算機實現(xiàn)的 方法800。從參考標號802開始,可獲得類集(或表達式)以及與該類集(或 表達式)相關(guān)聯(lián)的控制變量。 一般而言,該獲得的數(shù)據(jù)是查詢表達式的第一個 査詢子句,通常是FROM子句的產(chǎn)物。在參考標號804處,可接收包括在查 詢表達式中的 -組查詢子句的當前査詢子句??梢岳斫?,與要求綜合是整體式 的常規(guī)語言不同,不需要對當前查詢子句,或在很大程度上對作為整體的查詢 表達式施加句法排序限制。
在參考標號806處,可根據(jù)當前查詢子句來修改類集。簡言之,作為輸入 接收的類集可以基于與當前查詢子句相關(guān)聯(lián)的査詢運算符的方針來變換??梢?理解,當前査詢子句可以根據(jù)與當前查詢子句相關(guān)聯(lián)的期望類型而非基于整體 式句法模板來求值。接著,在參考標號808處,可將經(jīng)修改的類集通過流水線 傳送到下一查詢子句。因此,當前查詢子句的輸出可用作下一查詢子句的輸入。
在參考標號810處,可基于當前查詢子句來確定控制變量的范圍。例如, 某些類型的查詢子句不便于對現(xiàn)存控制變量進行任何改變,而其它查詢子句則 可方便引入新的控制變量(在某些情況下僅對于特定的一系列下一查詢子句), 而還有一些則可方便在(可任選地)引入新控制變量的同時將現(xiàn)存控制變量帶 出范圍。在參考標號812處,可將對當前査詢子句的范圍中控制變量的訪問提 供給下一查詢子句。
現(xiàn)在參考圖9,所示是可用于執(zhí)行所公開的體系結(jié)構(gòu)的示例性計算機系統(tǒng)的框圖。為了為本發(fā)明各個方面提供附加上下文,圖9和下列討論旨在提供對 其中可實現(xiàn)本發(fā)明的各方面的合適的計算環(huán)境900的簡要概括的描述。另外,
盡管本發(fā)明以上是在可在一個或多個計算機上運行的計算機可執(zhí)行指令的一 般上下文中進行描述的,但是本領(lǐng)域的技術(shù)人員將認識到,本發(fā)明也可結(jié)合其 它程序模塊和/或作為硬件和軟件的組合來實現(xiàn)。
一般而言,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、 程序、組件、數(shù)據(jù)結(jié)構(gòu)等等。此外,本領(lǐng)域的技術(shù)人員可以理解,本發(fā)明的方 法可用其它計算機系統(tǒng)配置來實施,包括單處理器或多處理器計算機系統(tǒng)、小 型機、大型計算機、以及個人計算機、手持式計算設(shè)備、基于微處理器的或可 編程消費電子產(chǎn)品等,其每一個都可操作上耦合到一個或多個相關(guān)聯(lián)的設(shè)備。
本發(fā)明的所示方面也可以在其中特定任務(wù)由通過通信網(wǎng)絡(luò)鏈接的遠程處 理設(shè)備執(zhí)行的分布式計算環(huán)境中實踐。在分布式計算環(huán)境中,程序模塊可以位 于本地和遠程存儲器存儲設(shè)備中。
計算機通常包括各種計算機可讀介質(zhì)。計算機可讀介質(zhì)可以是可由計算機 訪問的任何可用介質(zhì),并包括易失性和非易失性介質(zhì)、可移動和不可移動介質(zhì)。 作為示例而非限制,計算機可讀介質(zhì)可以包括計算機存儲介質(zhì)和通信介質(zhì)。計 算機存儲介質(zhì)可包括以用于存儲諸如計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或 其它數(shù)據(jù)這樣的信息的任意方法或技術(shù)來實現(xiàn)的易失性和非易失性、可移動和
不可移動介質(zhì)。計算機存儲介質(zhì)包括但不限于,RAM、 ROM、 EEPROM、閃 存或其它存儲器技術(shù)、CD-ROM、數(shù)字多功能盤(DVD)或其它光盤存儲、磁 盒、磁帶、磁盤存儲或其它磁存儲設(shè)備、或可以用來儲存所期望的信息并可由 計算機訪問的任何其它介質(zhì)。
通信介質(zhì)通常以諸如載波或其它傳輸機制等已調(diào)制數(shù)據(jù)信號來體現(xiàn)計算 機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù),且包含任何信息傳遞介質(zhì)。術(shù) 語"已調(diào)制數(shù)據(jù)信號"指的是其一個或多個特征以在信號中編碼信息的方式被 設(shè)定或更改的信號。作為示例而非限制,通信介質(zhì)包括有線介質(zhì),諸如有線網(wǎng) 絡(luò)或直接線連接,以及無線介質(zhì),諸如聲學(xué)、RF、紅外線和其它無線介質(zhì)。上 述中的任意組合也應(yīng)包括在計算機可讀介質(zhì)的范圍之內(nèi)。
再次參見圖9,用于實現(xiàn)本發(fā)明的各方面的示例性環(huán)境900包括計算機902,計算機902包括處理單元904、系統(tǒng)存儲器906和系統(tǒng)總線908。系統(tǒng)總 線908將包括但不限于系統(tǒng)存儲器906的系統(tǒng)組件耦合到處理單元904。處理 單元904可以是市場上可購買到的各種處理器中的任意一種。雙微處理器和其 它多處理器體系結(jié)構(gòu)也可用作處理單元904。
系統(tǒng)總線908可以是若干種總線結(jié)構(gòu)中的任一種,這些總線結(jié)構(gòu)還可互連 到存儲器總線(帶有或沒有存儲器控制器)、外圍總線、以及使用各類市場上 可購買到的總線體系結(jié)構(gòu)中的任一種的局部總線。系統(tǒng)存儲器906包括只讀存 儲器(ROM) 910和隨機存取存儲器(RAM) 912?;据斎?輸出系統(tǒng)(BIOS) 儲存在諸如ROM、 EPROM、 EEPROM等非易失性存儲器910中,其中BIOS 包含幫助諸如在啟動期間在計算機902內(nèi)的元件之間傳輸信息的基本例程。 RAM 912還可包括諸如靜態(tài)RAM等高速RAM來用于高速緩存數(shù)據(jù)。
計算機卯2還包括內(nèi)部硬盤驅(qū)動器(HDD) 914 (例如,EIDE、 SATA), 該內(nèi)部硬盤驅(qū)動器914還可被配置成在合適的機殼(未示出)中外部使用;磁 軟盤驅(qū)動器(FDD) 916 (例如,從可移動磁盤918中讀取或向其寫入);以 及光盤驅(qū)動器920 (例如,從CD-ROM盤922中讀取,或從諸如DVD等高容 量光學(xué)介質(zhì)中讀取或向其寫入)。硬盤驅(qū)動器914、磁盤驅(qū)動器916和光盤驅(qū) 動器920可分別通過硬盤驅(qū)動器接口 924、磁盤驅(qū)動器接口 926和光盤驅(qū)動器 接口 928連接到系統(tǒng)總線908。用于外置驅(qū)動器實現(xiàn)的接口 924包括通用串行 總線(USB)和IEEE 1394接口技術(shù)中的至少一種或兩者。其它外置驅(qū)動器連 接技術(shù)也在本發(fā)明的預(yù)期中。
驅(qū)動器及其相關(guān)聯(lián)的計算機可讀介質(zhì)提供了對數(shù)據(jù)、數(shù)據(jù)結(jié)構(gòu)、計算機可 執(zhí)行指令等的非易失性存儲。對于計算機902,驅(qū)動器和介質(zhì)容納適當?shù)臄?shù)字 格式的任何數(shù)據(jù)的存儲。盡管上面對計算機可讀介質(zhì)的描述涉及HDD、可移 動磁盤和諸如CD或DVD等可移動光學(xué)介質(zhì),但本領(lǐng)域的技術(shù)人員應(yīng)該意識 到,在示例性操作環(huán)境中也可以使用可由計算機讀取的其他類型的介質(zhì),如 ZIP驅(qū)動器、磁帶盒、閃存卡、盒式磁帶等等,并且此外,任何這種介質(zhì)都可 以包含用于執(zhí)行本發(fā)明的方法的計算機可執(zhí)行指令。
多個程序模塊可存儲在驅(qū)動器和RAM 912中,包括操作系統(tǒng)930、 一個 或多個應(yīng)用程序932、其它程序模塊934和程序數(shù)據(jù)936。所有或部分操作系
48統(tǒng)、應(yīng)用程序、模塊和/或數(shù)據(jù)也可被高速緩存在RAM912中。應(yīng)該明白,本 發(fā)明可以用各種市場上可購買到的操作系統(tǒng)或操作系統(tǒng)的組合來實現(xiàn)。
用戶可以通過一個或多個有線/無線輸入設(shè)備,例如鍵盤938和諸如鼠標 940等定點設(shè)備將命令和信息輸入到計算機902中。其它輸入設(shè)備(未示出) 可包括話筒、IR遙控器、操縱桿、游戲手柄、指示筆、觸摸屏等等。這些和其 它輸入設(shè)備通常通過耦合到系統(tǒng)總線908的輸入設(shè)備接口 942連接到處理單元 904,但也可通過其它接口連接,如并行端口、 IEEE 1394串行端口、游戲端口、 USB端口、 IR接口等等。
監(jiān)視器944或其它類型的顯示設(shè)備也經(jīng)由諸如視頻適配器946等接口來連 接到系統(tǒng)總線908。除了監(jiān)視器944之外,計算機通常包括諸如揚聲器、打印 機等其它外圍輸出設(shè)備(未示出)。
計算機902可使用經(jīng)由有線和/或無線通信至一個或多個遠程計算機,諸
如遠程計算機948的邏輯連接在網(wǎng)絡(luò)化環(huán)境中操作。遠程計算機948可以是工
作站、服務(wù)器計算機、路由器、個人計算機、便攜式計算機、基于微處理器的
娛樂設(shè)備、對等設(shè)備或其它常見的網(wǎng)絡(luò)節(jié)點,并且通常包括以上相對于計算機
902描述的許多或所有元件,盡管為簡明起見僅示出了存儲器/存儲設(shè)備950。
所描繪的邏輯連接包括到局域網(wǎng)(LAN) 952和/或例如廣域網(wǎng)(WAN) 954
等更大的網(wǎng)絡(luò)的有線/無線連接。這一 LAN和WAN聯(lián)網(wǎng)環(huán)境常見于辦公室和
公司,并且便于諸如內(nèi)聯(lián)網(wǎng)等企業(yè)范圍計算機網(wǎng)絡(luò),所有這些都可連接到例如 因特網(wǎng)等全球通信網(wǎng)絡(luò)。
當在LAN網(wǎng)絡(luò)環(huán)境中使用時,計算機902通過有線和/或無線通信網(wǎng)絡(luò)接 口或適配器956連接到局域網(wǎng)952。適配器956可以便于到LAN 952的有線或 無線通信,并且還可包括其上設(shè)置的用于與無線適配器956通信的無線接入點。
當在WAN連網(wǎng)環(huán)境中使用時,計算機902可包括調(diào)制解調(diào)器958,或連 接到WAN 954上的通信服務(wù)器,或具有用于通過WAN 954,諸如通過因特網(wǎng) 建立通信的其它裝置?;驗閮?nèi)置或為外置的調(diào)制解調(diào)器958以及有線或無線設(shè) 備經(jīng)由串行端口接口 942連接到系統(tǒng)總線908。在網(wǎng)絡(luò)化環(huán)境中,相對于計算 機902所描述的程序模塊或其部分可以存儲在遠程存儲器/存儲設(shè)備950中。應(yīng) 該理解,所示網(wǎng)絡(luò)連接是示例性的,并且可以使用在計算機之間建立通信鏈路的其它手段。
計算機902可用于與操作上設(shè)置在無線通信中的任何無線設(shè)備或?qū)嶓w通 信,這些設(shè)備或?qū)嶓w例如有打印機、掃描儀、臺式和/或便攜式計算機、便攜式 數(shù)據(jù)助理、通信衛(wèi)星、與無線可檢測標簽相關(guān)聯(lián)的任何一個設(shè)備或位置(例如, 公用電話亭、報亭、休息室)以及電話。這至少包括Wi-Fi和藍牙TM無線技術(shù)。 由此,通信可以如對于常規(guī)網(wǎng)絡(luò)那樣是預(yù)定義結(jié)構(gòu),或者僅僅是至少兩個設(shè)備
之間的自組織(adhoc)通信。
Wi-Fi,即無線保真,允許從家里沙發(fā)、酒店房間的床上或工作的會議室 連接到因特網(wǎng)而不需要線纜。Wi-Fi是一種類似蜂窩電話中使用的無線技術(shù), 它使得諸如計算機等設(shè)備能夠在室內(nèi)和室外,在基站范圍內(nèi)的任何地方發(fā)送和 接收數(shù)據(jù)。Wi-Fi網(wǎng)絡(luò)使用稱為IEEE 802.11 (a、 b、 g等等)的無線電技術(shù)來 提供安全、可靠、快速的無線連接。Wi-Fi網(wǎng)絡(luò)可用于將計算機彼此連接、連 接到因特網(wǎng)以及連接到有線網(wǎng)絡(luò)(使用IEEE 802.3或以太網(wǎng))。Wi-Fi網(wǎng)絡(luò)在 未許可的2.4和5 GHz無線電波段內(nèi)工作,例如以11 Mbps(802.11a)或54 Mbps (802.11b)數(shù)據(jù)速率工作,或者具有包含兩個波段(雙波段)的產(chǎn)品,因此該 網(wǎng)絡(luò)可提供類似于許多辦公室中使用的基本10BaseT有線以太網(wǎng)的真實性能。
現(xiàn)在參考圖10,所示是可用于執(zhí)行所公開的體系結(jié)構(gòu)的示例性計算機編 譯系統(tǒng)的示意性框圖。系統(tǒng)1000包括一個或多個客戶機1002。客戶機1002 可以是硬件和/或軟件(例如,線程、進程、計算設(shè)備)。例如,客戶機1002 可以通過使用本發(fā)明來容納cookie和/或相關(guān)聯(lián)的上下文信息。
系統(tǒng)1000還包括一個或多個服務(wù)器1004。服務(wù)器1004也可以是硬件和/ 或軟件(例如,線程、進程、計算設(shè)備)。服務(wù)器1004可以例如通過使用本 發(fā)明來容納線程以執(zhí)行變換。在客戶機1002和服務(wù)器1004之間的一種可能的 通信能夠以適合在兩個或多個計算機進程之間傳輸?shù)臄?shù)據(jù)分組的形式進行。數(shù) 據(jù)分組可包括例如cookie和/或相關(guān)聯(lián)的上下文信息。系統(tǒng)1000包括可以用來 使客戶機1002和服務(wù)器1004之間通信更容易的通信框架1006 (例如,諸如因 特網(wǎng)等全球通信網(wǎng)絡(luò))。
通信可經(jīng)由有線(包括光纖)和/或無線技術(shù)來促進。客戶機1002操作上 被連接到可以用來存儲對客戶機1002本地的信息(例如,cookie和/或相關(guān)聯(lián)
5的上下文信息)的一個或多個客戶機數(shù)據(jù)存儲1008。同樣地,服務(wù)器1004可 在操作上連接到可以用來存儲對服務(wù)器1004本地的信息的一個或多個服務(wù)器 數(shù)據(jù)存儲1010。
以上所描述的包括各實施例的示例。當然,出于描繪各實施例的目的而描 述組件或方法的每一個可以想到的組合是不可能的,但本領(lǐng)域內(nèi)的普通技術(shù)人 員可以認識到,許多進一步的組合和排列都是可能的。因此,本詳細描述旨在 涵蓋所有這些落入所附權(quán)利要求書的精神和范圍內(nèi)的更改、修改和變化。
特別地,對于由上述組件、設(shè)備、電路、系統(tǒng)等執(zhí)行的各種功能,除非另 外指明,否則用于描述這些組件的術(shù)語(包括對"裝置"的引用)旨在對應(yīng)于 (除非另外指明)執(zhí)行所描述的執(zhí)行此處在各實施例的示例性方面中所示的功 能的組件的指定功能(例如,功能上等效)的任何組件,即使這些組件在結(jié)構(gòu) 上不等效于所公開的結(jié)構(gòu)。在這一點上,也可認識到各實施例包括用于執(zhí)行各 方法的動作和/或事件的系統(tǒng)以及具有用于執(zhí)行這些動作和/或事件的計算機可 執(zhí)行指令的計算機可讀介質(zhì)。
另外,盡管可相對于若干實現(xiàn)中的僅一個來公開一個特定特征,但是這一 特征可以如對任何給定或特定應(yīng)用所需且有利地與其它實現(xiàn)的一個或多個其 它特征相組合。此外,就在說明書或權(quán)利要求書中使用術(shù)語"包括"和"含有"及 其變體而言,這些術(shù)語旨在以與術(shù)語"包含"相似的方式為包含性的。
權(quán)利要求
1.一種采用查詢模式來方便表達式中的運算符之間的類型元素的類型流的計算機實現(xiàn)的系統(tǒng),包括接收包括第一查詢子句和至少一個下一查詢子句的查詢表達式的接口,所述第一查詢子句包括第一查詢運算符、元素類型T和源類型,所述源類型是可查詢類型;以及用于所述至少一個下一查詢子句的查詢運算符模式,所述查詢運算符模式確保到所述至少一個下一查詢子句的元素類型的類型流。
2. 如權(quán)利要求1所述的系統(tǒng),其特征在于,所述第一査詢運算符是笛卡 爾積形式,并且所述元素類型T是匿名類型,該匿名類型是關(guān)于所述源類型的 范圍中的全部控制變量的聚集。
3. 如權(quán)利要求1所述的系統(tǒng),其特征在于,所述查詢運算符模式包括被 配置成接收一函數(shù)作為自變量并返回具有元素類型S的可査詢類型的投影或 映射査詢運算符,該函數(shù)包括元素類型T的自變量。
4. 如權(quán)利要求1所述的系統(tǒng),其特征在于,所述查詢運算符模式包括被 配置成接收一函數(shù)作為自變量并返回具有元素類型T的可查詢類型的過濾或 限制查詢運算符,該函數(shù)包括元素類型T的自變量。
5. 如權(quán)利要求1所述的系統(tǒng),其特征在于,所述查詢運算符模式包括被 配置成接收一函數(shù)作為自變量并返回具有元素類型T的已排序類集的排序或 定序査詢運算符,該函數(shù)包括元素類型T的自變量。
6. 如權(quán)利要求1所述的系統(tǒng),其特征在于,所述查詢運算符模式包括被 配置成返回具有元素類型T的可查詢類型的重復(fù)移除查詢運算符。
7. 如權(quán)利要求1所述的系統(tǒng),其特征在于,所述查詢運算符模式包括被 配置成接收一元素類型T為源類型的類集作為自變量,并返回具有元素類型T 的可查詢類型的集合査詢運算符。
8. 如權(quán)利要求1所述的系統(tǒng),其特征在于,所述查詢運算符模式包括被 配置成接收值作為自變量并返回具有元素類型T作為源類型的可查詢類型的 選擇或過濾查詢運算符。
9. 如權(quán)利要求1所述的系統(tǒng),其特征在于,所述查詢運算符模式包括被 配置成接收一函數(shù)作為自變量并返回具有元素類型T的可查詢類型的條件選 擇或過濾査詢運算符,該函數(shù)包括元素類型T作為自變量。
10. 如權(quán)利要求l所述的系統(tǒng),其特征在于,所述查詢運算符模式包括被配置成接收一函數(shù)作為自變量并返回數(shù)值類型的聚集查詢運算符,該函數(shù)包括元素類型T的自變量。
11. 如權(quán)利要求l所述的系統(tǒng),其特征在于,所述査詢運算符模式包括被配置成接收一函數(shù)作為自變量并返回具有元素類型S的可查詢類型的聚集査 詢運算符,該函數(shù)包括元素類型T的自變量。
12. 如權(quán)利要求l所述的系統(tǒng),其特征在于,所述查詢運算符模式包括被 配置成接收一函數(shù)作為自變量并返回可被隱式地轉(zhuǎn)換成布爾值的類型的匹配 查詢運算符,該函數(shù)包括類型T的自變量。
13. 如權(quán)利要求l所述的系統(tǒng),其特征在于,所述查詢運算符模式包括被 配置成接收一函數(shù)作為自變量并返回具有元素類型V的可査詢類型的聯(lián)接?xùn)?詢運算符,該函數(shù)包括元素類型T的自變量以及元素類型T'的自變量,其中V 是散列值。
14. 如權(quán)利要求l所述的系統(tǒng),其特征在于,所述查詢運算符模式包括被 配置成接收一函數(shù)作為自變量并返回具有元素類型V的可查詢類型的嵌套聯(lián) 接查詢運算符,該函數(shù)包括元素類型T的自變量以及具有元素類型U的類集 的自變量。
15. 如權(quán)利要求l所述的系統(tǒng),其特征在于,所述查詢運算符模式包括要 接收一函數(shù)作為自變量并返回具有元素類型V的可查詢類型的分組査詢運算 符,該函數(shù)包括類型K的自變量以及具有類型T的類集的自變量,其中類型K 是關(guān)鍵字。
16. 如權(quán)利要求l所述的系統(tǒng),其特征在于,還包括基于所述源類型以及 與所述至少一個下一查詢子句相關(guān)聯(lián)的查詢運算符來實時地推斷元素類型的 —匕下文組件。
17. 如權(quán)利要求16所述的系統(tǒng),其特征在于,所述上下文組件基于所推 斷的類型元素來增量式地提供上下文信息。
18. —種用于方便元素類型的類型流的計算機實現(xiàn)的方法,包括 接收包括與査詢運算符模式相關(guān)聯(lián)的査詢運算符的査詢子句的一部分; 利用源類型和所述查詢運算符來確定元素類型;以及 采用前一查詢子句的元素類型作為用于所述利用動作的源類型。
19. 如權(quán)利要求18所述的方法,其特征在于,還包括使用所述查詢運算 符模式來增量式地提供與所述元素類型或源類型的控制變量相關(guān)聯(lián)的上下文 反饋。
20. —種用于方便元素類型的類型流的計算機實現(xiàn)的系統(tǒng),包括 用于接收與査詢運算符模式相關(guān)聯(lián)的查詢運算符的計算機實現(xiàn)的裝置; 用于采用所述查詢運算符模式來確定元素類型的計算機實現(xiàn)的裝置;以及 用于使用前一查詢子句的元素類型作為所述査詢運算符模式的源類型的計算機實現(xiàn)的裝置。
全文摘要
所要求保護的主題涉及運算符模式的形式化,其可方便表達式的第一子句中的運算符到表達式的下一子句中的運算符的元素類型的類型流。流到下一子句的類型以及其中現(xiàn)存的運算符可被組合以推斷下一子句的元素類型。由此,可增量式地實現(xiàn)類型檢查、自動完成和其它有利特征而無需在前對表達式的完全轉(zhuǎn)換。
文檔編號G06F17/30GK101606154SQ200880003975
公開日2009年12月16日 申請日期2008年2月5日 優(yōu)先權(quán)日2007年2月5日
發(fā)明者A·K·西爾弗, A·V·青高茲, E·扎伯克利特斯基, H·J·M·梅杰, P·A·維克 申請人:微軟公司