技术内容
背景
全球通信网络(例如,因特网)的出现现在使得大量数据可被访问。人们 每天都访问并查询非结构化和结构化数据。非结构化数据用于创建、储存和检 索报告、电子邮件、电子表格和其它类型的文档,并且由在原子级以非结构化 格式储存的任何数据构成。换言之,在非结构化内容中,没有概念性定义且没 有数据类型定义—在文本文档中,单词仅仅是单词。用于对非结构化数据的内 容搜索的现有技术需要诸如名称等加标签的实体或应用关键字和元标签。因 此,需要人类干预来帮助使得非结构化数据变得机器可读。结构化数据是具有 对原子数据类型的强制合成的任何数据。结构化数据通过允许针对预定数据类 型和理解的关系来进行查询和报告的技术来管理。
编程语言持续不断地演进以便于程序员指定并便于高效执行。在早期的计 算机语言中,低级机器码是盛行的。采用机器码,计算机程序或构成计算机程 序的指令用机器语言或汇编语言来编写并且由硬件(例如,微处理器)来执行。 这些语言提供了控制计算硬件的有效手段,但是对程序员而言非常难以理解和 开发复杂的逻辑。
随后,引入了提供各种抽象层的语言。因此,程序员可以用较高级源语言 在较高级编写程序,该程序然后可经由编译器或解释器转换成硬件理解的较低 级机器语言。程序设计的更大进步提供了附加的抽象层以允许比从前更迅速地 指定更先进的编程逻辑。然而,这些进步并不是没有任何处理成本地出现的。
主流编程语言中的数据库集成的状态还有许多有待改进之处。存在许多专 门的数据库编程语言,诸如xBase、T/SQL和PL/SQL,但是这些语言具有弱 且可扩展性差的类型系统,有极少或没有对面向对象的编程的支持,并且需要 专用的运行时环境。类似地,并不缺乏诸如C#、VB.NET、C++和Java等通用 编程语言,但是这些语言中的数据访问通常是通过缺少强类型化和编译时验证 的难以处理的API来发生的。另外,这些API缺少提供查询数据、数据集合等 的通用接口的能力。
概述
以下呈现了本发明的简化描述以便提供对在此描述的某些方面的基本理 解。本概述并不是对所要求保护的主题的全面综述。它既不旨在标识所要求保 护的主题的关键或重要要素,也不描绘本发明的范围。其唯一目的是以简化的 形式来介绍所要求保护的主题的一些概念,作为稍后呈现的更为详细的描述的 前序部分。
本发明涉及方便创建表达式树表示以允许实现数据操作的系统和/或方 法。一镜像组件可以创建允许利用通用接口IQueryable和IQueryable来实 现各种数据操作和/或查询的表达式树表示,其中IQueryable和IQueryable 对IEnumerable和IEnumerable制作镜像。IEnumerable组件可以提供特别地 对数据集合工作并且具有特定且刚性特性的通用集合类型。另外,IEnumerable 组件可以采用一组查询标准查询操作符扩展函数,使得每一这样的操作符可以 取委托作为其自变量(例如,如在任何合适的命名空间中定义的)。该镜像组 件可以复制IEnumerable和IEnumerable来提供允许查询通过利用 IQueryable和IQueryable所创建的表达式树的通用接口,其中标准查询操作 符扩展方法的IQueryable和IQueryable版本取所创建的表达式树而非委托 作为其自变量。
根据所要求保护的主题的一方面,该镜像组件可实现一查询处理器。该查 询处理器可利用与IEnumerable相关联的数据操作,诸如但不限于,Where、 Select、SelectMany、过滤器函数、分组函数、变换函数、与IEnumerable接口 和/或IEnumerable接口兼容的任何合适的函数等等。该镜像组件可以创建 数据集合的表达式树表示(例如,查询可产生数据集合,而该数据集合由一表 达式树来表示),其中该表示可以是用于任何合适的查询处理器的更通用且查 询友好类型的数据。
此外,该镜像组件可以为查询处理器提供允许本地地、远程地、通过线路 等查询数据,而不管编程语言和/或格式如何的可插入架构。例如,可以创建表 示数据集合的表达式树(例如,查询可产生数据集合,而该数据集合由表达式 树来表示),然后可在其上实现各种数据操作(例如,远程地、本地地等等)。 此外,这一数据可以在远程位置中与如查询本地计算机的存储器中的数据一样 查询。在所要求保护的主题的其它方面,提供了方便创建表达式树表示以允许 实现数据操作的方法。
以下描述和附图详细阐明了所要求保护的主题的某些说明性方面。然而, 这些方面仅指示了可采用本发明的原理的各种方法中的几种,且所要求保护的 主题旨在包括所有这些方面及其等效方面。当结合附图考虑以下本发明的详细 描述时,所要求保护的主题的其它优点和新颖特征将变得显而易见。
附图简述
图1示出了方便创建表达式树表示以允许实现数据操作的示例性系统的 框图。
图2示出了方便利用数据集合的表达式树表示以用查询处理器来采用数 据操作的示例性系统的框图。
图3示出了方便实现可插入查询处理器以查询数据集合的示例性系统的 框图,其中查询可由表达式树来表示。
图4示出了方便对IEnumerable接口和IEnumerable接口制作镜像以提 供查询数据的通用接口的示例性系统的框图。
图5示出了根据本发明的各种函数的示例性关系的框图。
图6示出了方便利用数据集合的表达式树表示以用查询处理器来采用数 据操作的示例性系统的框图。
图7示出了用于创建表达式树表示以允许实现数据操作的示例性方法。
图8示出了方便实现可插入查询处理器以查询可由表达式树表示的数据 集合的示例性方法。
图9示出了利用数据集合的表达式树表示以用查询处理器来采用数据操 作的示例性方法。
图10是示例编译器操作环境的示意性框图。
图11示出了其中可采用所要求保护的主题的新颖方面的示例性联网环 境。
图12示出了根据所要求保护的主题的可采用的示例性操作环境。
详细描述
所要求保护的主题参考附图来描述,所有附图中使用相同的参考标号来指 代相同的元素。在以下描述中,为解释起见,阐明了众多具体细节以提供对本 发明的全面理解。然而,很明显,所要求保护的主题可以在没有这些具体细节 的情况下实施。在其它情况下,以框图形式示出了公知的结构和设备以便于描 述本发明。
如在此使用的,术语“组件”、“系统”、“接口”、“处理器”、“查 询”、“操作”等指的是计算机相关的实体,它们可以是硬件、软件(例如, 执行中的)和/或固件。例如,组件可以是运行在处理器上的进程、处理器、对 象、可执行码、程序、和/或计算机。作为说明,运行在服务器上的应用程序和 服务器都可以是组件。一个或多个组件可驻留在一个进程内,且组件可位于一 台计算机上和/或分布在两台或更多计算机之间。
此外,所要求保护的主题可以使用产生控制计算机以实现所公开的主题的 软件、固件、硬件或其任意组合的标准编程和/或工程技术而被实现为方法、装 置或制品。在此使用的术语“制品”旨在涵盖可以从任何计算机可读设备、载 体或介质访问的计算机程序。例如,计算机可读介质可以包括但不限于磁存储 设备(例如,硬盘、软盘、磁带……)、光盘(例如,紧致盘(CD)、数字 多功能盘(DVD)……)、智能卡和闪存设备(例如,卡、棒、键驱动器……)。 另外应该明白,载波可以被用于承载计算机可读电子数据,例如那些用于发送 和接收电子邮件或用于访问如因特网或局域网(LAN)等网络的数据。当然, 本领域的技术人员将会认识到,在不背离所要求保护的主题的范围或精神的前 提下可以对这一配置进行许多修改。此外,在此使用词语“示例性”意指用作 示例、实例或说明。在此被描述为“示例性”的任何方面或设计并不一定要被 解释为相比其他方面或设计更优选或有利。
现在转向附图,图1示出了方便创建表达式树表示以允许实现数据操作的 系统100。系统100包括镜像组件102,该组件可通过实现IEnumerable组件 104来提供查询数据的通用接口,IEnumerable组件可接收要在这一数据上实现 的数据操作。IEnumerable组件104可以提供特别地对数据集合工作并且具有 特定且刚性特性的通用集合类型。例如,IEnumerable组件104可采用对利用 与通用集合类型兼容的特定编程语言的数据集合的各种标准查询扩展符 (extender),诸如但不限于,Where、Select、SelectMany、过滤器函数、分 组函数、变换函数等。另外,IEnumerable组件104可以采用一组查询标准查 询操作符扩展函数,使得每一这样的操作符可以取委托作为其自变量(例如, 如在任何合适的命名空间中定义的)。
镜像组件102可以复制与IEnumerable组件104,特别地,IEnumerable接 口和IEnumerable接口相关联的函数。对IEnumerable组件104的这一复制 允许镜像组件102提供标准接口IQueryable和非通用对应IQueryable,各类 型可实现这些接口来用信号表示支持经由表达式树对查询的深嵌入。镜像组件 102可以采用数据集合和查询的表达式树表示。通过将查询和数据集合表示为 表达式树,IQueryable和IQueryable接口可以是能用于实现数据操作的通用 接口,因为数据类型更有助于基于表达式树表示的查询处理器。因此,系统100 方便查询关系型数据、可扩展标记语言(XML)对象、面向对象的语言、编程 语言等等。
镜像组件102可以基于要查询的数据集合(未示出)和查询来创建表达式 树表示。例如,数据集合可以基于判定函数来过滤,其中常规上,IEnumerable 接口和IEnumerable接口被限于特定类型、操作、特性和/或格式。然而, 通过允许镜像组件102提供可对IEnumerable和IEnumerable函数进行复制 /制作镜像的通用接口,可从数据集合和查询中创建表达式树表示,以允许对其 实现查询、数据操作等。一般而言,可以理解,该表达式树表示允许任何合适 的查询处理器对其实现数据操作(Where、Select、SelectMany、过滤器函数、 分组函数、变换函数等)。换言之,系统100为查询处理器提供允许本地地、 远程地、通过线路等查询数据,而不管编程语言和/或格式如何的可插入架构。 例如,系统100允许创建查询表达式的表示,然后将其发送到数据并允许其远 程地实现。此外,这一数据可以在远程位置中与如查询本地计算机的存储器中 的数据一样查询。
图2示出了方便利用数据集合和查询的表达式树表示以用查询处理器来 采用数据操作的系统200。系统200可包括可接收要在数据集合202上实现的 数据操作的IEnumerable组件104,其中这一数据操作可以是,例如Where、 Select、SelectMany、过滤器函数、分组函数、变换函数、与IEnumerable接口 和/或IEnumerable接口兼容的任何合适的函数等等。镜像组件102可以创 建数据集合和查询的表达式树表示,该表示可以是用于任何合适的查询处理器 的更通用且查询友好类型的数据。一般而言,镜像组件102和所创建的表达式 树表示允许通过任何特定的编程语言,而不限于IEnumerable和 IEnumerable特性、格式、数据结构等,来实现与IEnumerable组件104相 关的数据操作符(例如,IEnumerable接口、IEnumerable标准查询操作符 等)。
镜像组件102用IQuerable和IQueryable接口以及标准查询操作符扩展 方法来复制IEnumerable和IEnumerable接口和标准查询操作符扩展方法。 例如,只要基于IEnumerable的操作具有委托自变量(例如,诸如元素变换、 元素分组操作等操作),基于IQueryable的操作符就具有表达式树表示作为其 自变量。该镜像制作允许系统200定义标准接口IQueryable及其非通用对 应IQueryable以用信号表示其支持经由表达式树的查询深嵌入。
此外,在创建了表达式树表示之后,可以实现查询处理器204来提供查询 结果206。可以理解,镜像组件102创建表达式树表示,使得任何合适的查询 处理器204可以基于通过IQueryable和IQueryable复制的任何IEnumerable 接口和/或IEnumerable接口来查询数据集合202。换言之,系统200可以用 任何合适的查询处理器插入来提供查询结果。
图3示出了方便实现可插入查询处理器以查询可由表达式树表示的数据 集合和查询的系统300。系统300可包括可创建代码的表达式树表示以允许利 用任何查询处理器来查询数据集合202而不管编程语言、类型、格式等如何的 镜像组件102。例如,查询处理器可以经由IQueryable和IQueryable来实现 与IEnumerable和IEnumerable相关的数据操作,而不遵循与IEnumerable 和/或IEnumerable相关联的特定数据类型、特性、格式等。
尽管IEnumerable组件104被描绘在镜像组件102内,但是可以理解, IEnumerable组件104可以是独立的组件、被合并到镜像组件102中、与 IQueryable组件302集成、和/或其任意组合。IQueryable组件302可以接收数 据操作,其中这一数据操作可以从IEnumerable组件104和相应函数制作镜像。 由此,与IEnumerable和IEnumerable相关联的数据操作可以基于表达式树 表示的实现而非与IEnumerable和IEnumerable相关联的数据格式以更通用 的方式经由IQueryable和IQueryable来实现。由此,镜像组件102可以通 过对IEnumerable和IEnumerable制作镜像来创建可被查询的表达式树表 示。可以理解和明白,如果创建了特定数据集合的表达式树,则不需要对完全 不同的数据操作和/或查询重新创建该表达式树。换言之,该表达式树表示可被 重复使用。
可以理解,该表达式树表示可以由任何合适的查询处理器304来使用以允 许查询数据。查询处理器304可以被“插入”以允许利用任何合适的查询操作 和/或数据操作。此外,可以有任意数量的查询处理器304,诸如查询处理器1 到查询处理器N,其中N是正整数。查询处理器304可以是插件以利用表达式 树表示来允许查询各种数据集合。
图4示出了方便对IEnumerable接口和IEnumerable接口制作镜像以提 供查询数据的通用接口的系统400。系统400可包括可提供通用接口的镜像组 件102,该通用接口允许各类型用信号表示它们支持利用表达式树表示的查询 深嵌入。正如IEnumerable一样,镜像组件102还可实现任何标准序列操作符, 但是可取表达式树作为输入来代替委托。该系统还可包括可实现IQueryable接 口的IQueryable组件402。例如,可实现以下伪代码:
public interface IQueryable:IEnumerable{
Expression Expression{get;}
Type ElementType{get;}
IQueryable CreateQuery(Expression表达式);
object Execute(Expression表达式);
}
public interface IQueryable:IEnumerable,IQueryable{
IQueryableCreateQuery(Expression表达式);
S Execute(Expression表达式);
}
只读特性Expression返回查询当前所表示的表达式树,而ElementType特性返 回由IQueryable表示的集合的元素类型。CreateQuery方法是给定表达式树创 建可查询对象(queryable)的“虚”构造函数。类似地,Execute是用于查询 的工厂方法,其返回本身不再是可查询的值。
镜像组件102还可包括可方便利用序列操作符的IOrderedQueryable组件 404。例如,可由IOrderedQueryable组件404来实现以下伪代码:
public interface IOrderedQueryable:IQueryable{}
public interface IOrderedQueryable:IQueryable,IOrderedQueryable
{}
IOrderedQueryable和IOrderedQueryable对由各种OrderBy序列操作符使用 的OrderedSequence类型制作镜像。
现有的IEnumerable和IEnumerable用全部都取委托作为其自变量(如 在任何合适的命名空间中定义的)的标准查询操作符(Where、Select、 SelectMany、……)来扩展。例如,扩展方法Where取源集合和委托,并产生 对其判定为真的所有值:
public static IEnumerableWhere(该IEnumerable的源,Func判定){
foreach(源中的T元素){
if(判定(元素))产生返回元素;
}
}
对于IQueryable和IQueryable,镜像组件102可以引入使用表达式树 而非委托来实现标准查询操作符的扩展。例如,此处是Where的一个可能实现, 注意,它对判定自变量取表达式树而非委托,但是对于其余自变量,特征与如 在IEnumerable上定义的Where扩展方法的特征同构:
public static IQueryableWhere(该IQueryable的源,
Expression>判定){
return源.CreateQuery(
Expression.Call(
((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(T)),
null,
new Expression[]{源.Expression,判定}
));
}
其它标准序列操作符的实现非常相似,并且实际上每一实现都创建一对应 于“在源上调用自身”的表达式树。结果,标准查询操作符的实现完全是通用 的,并且可由希望使用表达式树(例如,深嵌入)的任何应用程序可编程接口 (API)来使用。
除了镜像组件102提供标准查询操作符的实现之外,镜像组件102可提供 可将IEnumerable转变为Queryable的ToQueryable()操作符。例如,可利用以 下伪代码:
public static IQueryableToQueryable(该IEnumerable的源){}
public static IQueryable ToQueryable(该IEnumerable的源){} 如果源的动态类型已经是IQueryable,则该操作实际上是向下强制转换。否则, 创建包含该源作为常量表达式的新IQueryable实例。
镜像组件102还可包括方便将表达式树编译为委托的助手组件406。换言 之,该助手组件406可提供经由从给定表达式树动态地生成集成语言(LI)的 助手方法T Compile(该Expression的f)来将表达式树编译为委托的方 法,如下:
Expression>e=c=>c.City=="London";
Funcf=e.Compile();
此外,镜像组件102可包括可提供将串语法分析为表达式树的助手方法并 提供用于绑定串内的自由变量的解析器的语法分析串助手组件408。语法分析 串助手组件408可引入用于对委托的串表示进行语法分析的一组助手方法。在 一般的情况下,语法分析器取该表达式所表示的委托的参数的列表以及一名称 解析器,该名称解析器在给定表达式中的自由变量的名称时返回该名称所绑定 到的成员信息(member info):
public static ExpressionParse(string表达式)
public static ExpressionParse(Parameters参数,string表达式,
NameResolver解析器)
图5示出了根据本发明的各种函数的示例性关系500。示例性关系500示 出了IQuerable508对IEnumerable502制作镜像,而IQueryable504对 IEnumerable506制作镜像的事实。换言之,IQueryable:IEnumerable and IQueryable:IQueryable,IEnumerable。
图6示出了采用智能以方便利用数据集合的表达式树表示以用查询处理 器来采用数据操作的系统600。系统600可包括镜像组件602、IEnumerable组 件604以及IQueryable组件606,这些组件基本上类似于在先前各图中所描述 的相应组件。系统600还包括智能组件608。智能组件608可由镜像组件602 用于方便创建表达式树表示以允许实现数据操作。例如,智能组件608可以推 导表达式树表示、数据操作、查询、查询操作符、数据集合、与IEnumerable 和IQueryable相关的镜像制作能力等等。
可以理解,智能组件608能够从一组通过事件和/或数据捕捉到的观察结 果中推出或推断系统、环境和/或用户的状态。例如,推断可用于标识特定的上 下文或动作,或可生成状态的概率分布。推断可以是概率性的——即,基于数 据和事件的考虑计算感兴趣的状态的概率分布。推断也可以指用于从一组事件 和/或数据合成更高级事件的技术。这类推断导致从一组观察到的事件和/或储 存的事件数据中构造新的事件或动作,而无论事件是否在相邻时间上相关,也 无论事件和数据是来自一个还是若干个事件和数据源。可采用各种分类(显式 和/或隐式训练的)方案和/或系统(例如,支持矢量机、神经网络、专家系统、 贝叶斯信任网络、模糊逻辑、数据融合引擎……)来执行关于所要求保护的主 题的自动化和/或推断的动作。
分类器是将输入属性矢量x=(x1,x2,x3,x4,xn)映射到该输入属于一个类 的置信度的函数,即f(x)=confidence(class)。这一分类可采用基于概率和/或基 于统计的分析(例如,分解成分析效用和成本)来预测或推断用户期望自动执 行的动作。支持矢量机(SVM)是可采用的分类器的一个示例。SVM通过找 出可能输入空间中的超曲面来操作,其中,超曲面试图将触发准则从非触发事 件中分离出来。直观上,这使得分类对于接近但不等同于训练数据的测试数据 正确。可采用其它定向和非定向模型分类方法,包括,例如,朴素贝叶斯、贝 叶斯网络、决策树、神经网络、模糊逻辑模型以及提供不同独立性模式的概率 分类模型。此处所使用的分类也包括用于开发优先级模型的统计回归。
镜像组件602还可利用提供各种类型的用户界面来方便用户和耦合到镜 像组件602的任何组件之间的交互的呈现组件610。如所描绘的,呈现组件610 是可以与镜像组件602一起利用的单独实体。然而,可以理解,呈现组件610 和/或类似的查看组件可以被结合到镜像组件602中和/或是一独立单元。呈现 组件610可提供一个或多个图形用户界面(GUI)、命令行界面等等。例如, 可以呈现向用户提供对数据进行加载、导入、读取等的区域或手段的GUI,并 且所述GUI可包括呈现这些动作的结果的区域。这些区域可包括已知的文本和 /或图形区域,包括对话框、静态控件、下拉菜单、列表框、弹出菜单、编辑控 件、组合框、单选按钮、复选框、按钮以及图形框。另外,可采用便于呈现的 工具,诸如用于导航的垂直和/或水平滚动条以及确定一区域是否可被查看的工 具栏按钮。例如,用户可以与耦合到和/或结合到镜像组件602中的一个或多个 组件交互。
用户还可与这些区域交互,以便例如经由诸如鼠标、滚球、键区、键盘、 笔和/或语音激活等各种设备来选择和提供信息。通常,诸如键盘上的按钮或回 车键等机制可在输入了信息之后采用以启动搜索。然而,可以理解,所要求保 护的主题不限于此。例如,仅仅加亮显示一复选框可启动信息传送。在另一示 例中,可采用命令行界面。例如,命令行界面可以提示(例如,经由显示器上 的文本消息和音频声调)用户通过提供文本消息来输入信息。用户然后可提供 适当的信息,诸如对应于在该界面提示中提供的选项的字母数字输入或对提示 中所提出的问题的回答。可以理解,命令行界面可以与GUI和/或API结合使 用。另外,命令行界面可以结合具有有限图形支持和/或低带宽通信信道的硬件 (例如,视频卡)和/或显示器(例如,黑白和EGA)来使用。
图7-9示出了根据所要求保护的主题的方法。为解释简明起见,该方法被 描绘和描述为一系列动作。可以理解和明白,本发明不受所示的动作和/或动作 次序的限制,例如,动作可按各种次序和/或同时发生,并且可以与此处未呈现 和描述的其它动作一起发生。此外,并非所有示出的动作都是实现根据所要求 保护的主题的方法所必需的。另外,本领域的技术人员可以理解和明白,方法 可经由状态图或事件替代地被表示为一系列相关状态。另外还应该明白,下文 以及本说明书全文中所公开的方法可以被存储在制品上,以便于把此类方法传 送和转移到计算机。在此使用的术语“制品”意指包含可以从任何计算机可读 设备、载体或介质访问的计算机程序。
图7示出了方便创建表达式树表示以允许实现数据操作的方法700。在参 考标号702处,可接收数据操作。在一个示例中,可以在数据集合上实现数据 操作,其中这一数据操作可以是,例如Where、Select、SelectMany、过滤器函 数、分组函数、变换函数、与IEnumerable接口和/或IEnumerable接口兼容 的任何合适的函数等等。在另一实例中,该数据操作可以从用户、实体、机器、 本地机器、远程机器等接收。
在参考标号704处,可对IEnumerable和IEnumerable制作镜像以提供 查询数据的通用接口。基于与具有特定和刚性特性的IEnumerable相关联的数 据,一通用接口可以复制与IEnumerable,尤其是IEnumerable接口和 IEnumerable接口及其标准查询操作符扩展方法相关联的函数。对 IEnumerable的这一复制允许标准接口IQueryable和非通用相应IQueryable 向任何合适的类型用信号表示支持经由表达式树的查询深嵌入。通过将数据集 合表示为表达式树,IQueryable和IQueryable接口可以是能用于实现数据操 作的通用接口,因为数据类型更有助于基于表达式树表示的查询处理器,其因 此允许对IEnumerable和IEnumerable制作镜像。
图8示出了方便实现可插入查询处理器以查询可由表达式树表示的数据 集合的方法800。在参考标号802处,可接收要在数据集合上实现的数据操作。 在参考标号804处,可创建该数据集合的表达式树表示。该表达式树表示可以 与数据集合相关联。通过将数据集合或查询表示为表达式树,IQueryable接口 和IQueryable接口可以是实现至少一个数据操作的通用接口,因为数据类 型更有助于基于表达式树表示的查询处理器。
在参考标号806处,该数据操作可利用例如查询处理器在表达式树上实 现。该数据操作然后可利用采用对IEnumerable和IEnumerable函数制作镜 像的IQueryable和IQueryable接口的技术来通用地应用。通过对 IEnumerable和IEnumerable的函数制作镜像,可以在表达式树而非通常与 IEnumerable和IEnumerable相关联的严格且刚性的数据集合上采用数据操 作。因此,方法800方便查询关系型数据、可扩展标记语言(XML)对象、面 向对象的语言、编程语言等等。一般而言,可以理解,该表达式树表示允许任 何合适的查询处理器对其实现数据操作(Where、Select、SelectMany、过滤器 函数、分组函数、变换函数等)。
图9示出了利用数据集合的表达式树表示以用查询处理器来采用数据操 作的方法900。在参考标号902处,可接收要在数据集合上实现的数据操作。 该数据操作可以是,但不限于,Where、Select、SelectMany、过滤器函数、分 组函数、变换函数、与IEnumerable接口和/或IEnumerable接口兼容的任何 合适的函数等等。在参考标号904处,可通过利用对接口IEnumerable和 IEnumerable制作镜像的两个接口IQueryable和IQueryable来创建表示 该数据集合的表达式树。
在参考标号906处,可在该表达式树上实现数据操作。通过对IEnumerable 和IEnumerable的函数制作镜像,可以在表达式树而非通常与IEnumerable 和IEnumerable相关联的严格且刚性的数据集合上(例如,利用IQueryable 和IQueryable)采用数据操作。通过将数据集合表示为表达式树,IQueryable 和IQueryable接口可以是能用于实现数据操作的通用接口,因为数据类型 更有助于基于表达式树表示的查询处理器。
在参考标号908处,可以插入任何合适的查询处理并且查询表示该数据集 合的表达式树。一般而言,可以理解,该表达式树表示允许任何合适的查询处 理器对其实现数据操作(Where、Select、SelectMany、过滤器函数、分组函数、 变换函数等)。换言之,方法900为查询处理器提供允许本地地、远程地、通 过线路等查询数据,而不管编程语言和/或格式如何的可插入架构。例如,方法 900允许创建查询表达式的表示,然后将其发送到数据并允许其远程地实现。 此外,这一数据可以在远程位置中与如查询本地计算机的存储器中的数据一样 查询。
图10是描绘根据本发明的可用于产生实现代码(例如,可执行码、中间 语言……)的编译器环境1000的框图。编译器环境1000包括编译器1010,而 编译器1014包括前端组件1020、转换器组件1030、后端组件1040、差错校验 器组件1050、符号表1060、语法分析树1070和状态1080。编译器1010接受 源代码作为输入并且产生实现代码作为输出。输入可以包括但不限于在此描述 的定界的程序性表达式或限定标识符。编译器环境的各组件和模块间的关系示 出了主要的数据流。为了简明起见没有示出其他的组件和关系。取决于实现, 组件可以被添加、省略、拆分成多个模块、与其他模块和/或其他模块的配置相 组合。
编译器1020可以接受具有与处理元素序列相关联的源代码的文件作为输 入。源代码可以包括各种表达式和关联函数、方法和/或其他程序性构造。编译 器1020可以结合一个或多个组件来对源代码进行处理以分析构造并生成或注 入代码。
前端组件1020读取源代码并对其执行词法分析。实质上,前端组件1020 读取源代码写成的字符(例如,字母数字)序列并将其翻译成指示常量、标识 符、操作符号、关键字、和标点等的句法元素或标记。
转换器组件1030将标记语法分析成中间表示。例如,转换器组件1030 能够检查句法并将标记分组为表达式或其他的句法结构,后者进而接合成语句 树。概念上,这些树形成语法分析树1070。此外并且在适当情况下,转换器模 块1030可以将条目放入符号表1030中,符号表1030将在源代码中使用的符 号名和类型信息连同相关特性一起列出。
状态1080可用于跟踪编译器910在处理接收到或检索到的源代码并形成 语法分析树1070时的进度。例如,不同的状态值指示编译器1010是在类定义 或函数的开始、是刚声明了类成员、还是已经完成了表达式。随着编译器的进 展,它不断地更新状态1080。编译器1010可部分地或者完全地将状态1080 曝露给外界实体,外界实体随之可向编译器1010提供输入。
基于源代码内的构造或其他信号(或者如果以其他方式识别出此机会), 转换器组件1030或另一组件可注入对应于促进高效率及正确执行的代码。编 码在转换器组件1030或其他组件中的规则指示为能实现期望的功能并识别要 注入代码的位置或要实行其他操作的位置所必须完成的动作。注入的代码通常 包括在一个或多个位置处添加的语句、元数据、或其他元素,但是该术语也可 以包括改变、删除、或以其他方式修改现有的源代码。注入的代码可以作为一 个或多个模板或以某种其他形式来存储。此外,应该认识到可能发生符号表的 操纵以及语法分析树的转化。
基于符号表1060和语法分析树1070,后端组件1040可将中间表示翻译 成输出代码。后端组件1040将中间表示转换成可在目标处理器中执行的或由 其执行的指令,转换成对变量的存储器分配,等等。输出代码可以由真实的处 理器执行,但是也能提供可由虚拟处理器执行的输出代码。
此外,前端组件1020和后端组件1040能够执行另外的功能,诸如代码优 化,并且能够将所描述的操作作为单个阶段或分多个阶段执行。编译器1010 的诸组件的各个其他方面在本质上是常规的,并且可由执行等效功能的组件代 替。另外,在源代码处理过程中的各个阶段,差错校验器组件1050可以检验 差错,诸如词法结构中的差错、句法差错、甚至是语义差错。一旦检测到差错, 校验器组件1050就暂停编译并生成指示此差错的消息。
为了提供用于实现所要求保护的主题的各方面的附加上下文,图11-12及 以下讨论旨在提供对其中可实现本发明的各方面的合适的计算环境的简要概 括描述。例如,如在先前各图中所描述的提供用于利用表达式树表示来提供数 据集合上的数据操作的通用接口的镜像组件可以在这一合适的计算环境中实 现。尽管前面已经在运行在本地计算机和/或远程计算机上的计算机程序的计算 机可执行指令的一般上下文中描述了所要求保护的主题,然而本领域内的技术 人员将认识到,本发明也可以和与其他程序模块结合实现。一般地,程序模块 包括执行特定任务和/或实现特定抽象数据类型的例程、程序、组件、数据结构 等等。
此外,本领域的技术人员可以理解,本发明的方法可用其它计算机系统配 置来实施,包括单处理器或多处理器计算机系统、小型机、大型计算机、以及 个人计算机、手持式计算设备、基于微处理器的和/或可编程消费电子产品等, 其每一个都可操作上与一个或多个相关联的设备通信。所示的要求保护的主题 的各方面也可在其中某些任务由通过通信网络链接的远程处理设备来执行的 分布式计算环境中实施。然而,本发明的一些方面(如果不是全部方面)可以 在独立计算机上实施。在分布式计算环境中,程序模块可以位于本地和/或远程 存储器存储设备中。
图11是要求保护的主题可以与之交互的示例性计算环境1100的示意性框 图。系统1100包括一个或多个客户机1110。(诸)客户机1110可以是硬件和 /或软件(例如,线程、进程、计算设备)。系统1100也包括一个或多个服务 器1120。(诸)服务器1120可以是硬件和/或软件(例如,线程、进程、计算 设备)。服务器1120可以容纳各线程以通过例如利用本发明执行转换。
在客户机1110和服务器1120之间的一种可能的通信能够以适合在两个或 多个计算机进程之间传输的数据分组的形式进行。系统1100包括可以用来使 (诸)客户机1110和(诸)服务器1120之间通信更容易的通信框架1140。(诸) 客户机1110可在操作上连接到一个或多个可以用来存储对(诸)客户机1110 本地的信息的客户机数据存储1150。同样地,(诸)服务器1120可在操作上 连接到一个或多个可以用来存储对(诸)服务器1120本地的信息的服务器数 据存储1130。
参考图12,用来实现所要求保护的主题各个方面的示例性环境1200包括 计算机1212。计算机1212包括处理器单元1214、系统存储器1216和系统总 线1218。系统总线1218将包括但不限于系统存储器1216的系统组件耦合到处 理单元1214。处理单元1214可以是各种可用处理器中的任一种。双微处理器 和其它多处理器体系结构也可用作处理单元1214。
系统总线1218可以是几种类型的总线结构中的任意一种,包括存储器总 线或存储器控制器、外围总线或外部总线、和/或利用下述可用总线体系结构中 的任意一种的局部总线,其包括但不限于,工业标准体系结构(ISA)、微通 道体系结构(MSA)、扩展型ISA(EISA)、智能化驱动器电子接口(IDE)、 VESA局部总线(VLB)、外围部件互连(PCI)、卡总线、通用串行总线(USB)、 高级图形端口(AGP)、个人计算机存储卡国际联合会总线(PCMCIA)、火 线(IEEE1294)、以及小型计算机系统接口(SCSI)。
系统存储器1216包括易失性存储器1220和非易失性存储器1222。基本 输入/输出系统(BIOS)包含诸如在启动期间在计算机1212的元件之间传送信 息的基本例程,其存储在非易失性存储器1222中。作为说明而非局限,非易 失性存储器1222可以包括只读存储器(ROM)、可编程ROM(PROM)、电 可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)、或者闪存。 易失性存储器1220包括用作外部高速缓冲存储器的随机存取存储器(RAM)。 作为示例而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态 RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDR SDRAM)、 增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、 存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM (DRDRAM)、以及存储器总线动态RAM(RDRAM)。
计算机1212还包括可移动/不可移动、易失性/非易失性计算机存储介质。 例如,图12示出了盘存储1224。盘存储1224包括但不限于诸如磁盘驱动器、 软盘驱动器、磁带驱动器、Jaz驱动器、Zip驱动器、LS-100驱动器、闪存卡、 或者记忆棒之类的设备。此外,盘存储1224可以包括独立的或者与其它存储 介质结合的存储介质,包括但不限于诸如紧致盘ROM设备(CD-ROM)、可 记录CD驱动器(CD-R驱动器)、可重写CD驱动器(CD-RW驱动器)或者 数字多功能盘ROM驱动器(DVD-ROM)这样的光盘驱动器。为了便于将盘 存储设备1224连接到系统总线1218,通常使用诸如接口1226等可移动或不可 移动接口。
应该明白,图12描述了担当用户与在合适的操作环境1200中描述的基本 计算机资源之间的中介的软件。这样的软件包括操作系统1228。存储在盘存储 1224上的操作系统1228用于控制并分配计算机系统1212的资源。系统应用程 序1230通过存储在系统存储器1216或盘存储1224上的程序模块1232和程序 数据1234利用了操作系统1228对资源的管理。应该明白,所要求保护的主题 可以用各种操作系统或操作系统的组合来实现。
用户通过输入设备1236把命令或信息输入到计算机1212中。输入设备 1236包括但不限于诸如鼠标、跟踪球、指示笔、触摸垫等定点设备、键盘、话 筒、操纵杆、游戏手柄、圆盘式卫星天线、扫描仪、TV调谐卡、数码相机、 数码摄像机、网络摄像头等等。这些以及其它输入设备通过系统总线1218经 由接口端口1238连至处理单元1214。接口端口1238包括,例如串行端口、并 行端口、游戏端口、以及通用串行总线(USB)。输出设备1240利用和输入 设备1236相同类型的某些端口。因此,例如,USB端口可以用来向计算机1212 提供输入,以及把来自计算机1212的信息输出到输出设备1240。提供输出适 配器1242是为了说明除了输出设备1240之外还有一些像监视器、扬声器、以 及打印机这样的需要专用适配器的输出设备1240。输出适配器1242包括,作 为说明而非局限,提供输出设备1240和系统总线1218之间的连接手段的显卡 和声卡。应该注意到,其它设备和/或设备系统提供了输入和输出能力,诸如远 程计算机1244。
计算机1212可以使用至诸如远程计算机1244等一个或多个远程计算机的 逻辑连接在网络化环境中操作。远程计算机1244可以是个人计算机、服务器、 路由器、网络PC、工作站、基于微处理器的电器、对等设备或者其它常见的 网络节点等,且通常包括相对于计算机1212所描述的很多或者全部元件。为 了简明起见,对远程计算机1244仅示出了存储器存储设备1246。远程计算机 1244经由网络接口1248被逻辑地连接到计算机1212,然后经由通信连接1250 物理地连接。网络接口1248包括诸如局域网(LAN)和广域网(WAN)这样 的有线和/或无线通信网络。LAN技术包括光纤分布式数据接口(FDDI)、铜 分布式数据接口(CDDI)、以太网、令牌环等。WAN技术包括但不限于,点 对点链路、诸如综合业务数字网(ISDN)及其各种变体等电路交换网、分组 交换网、以及数字用户线(DSL)。
通信连接1250指的是用于把网络接口1248连接到总线1218的硬件/软件。 虽然为了清楚地举例说明,通信连接1250被示为在计算机1212的内部,但其 也可以在计算机1212的外部。连接到网络接口1248所需要的硬件/软件包括, 仅出于示例的目的,内部和外部技术,诸如包括常规电话级调制解调器、电缆 调制解调器以及DSL调制解调器的调制解调器、ISDN适配器和以太网卡。
在上面所描述的包括本发明的示例。当然,不可能为了描述所要求保护的 主题而描述组件或方法的每一个可以想到的组合,但本领域内的普通技术人员 应该认识到,本发明的许多进一步的组合和排列都是可能的。因此,所要求保 护的主题旨在涵盖所有这些落入所附权利要求书的精神和范围内的改变、修改 和变动。
特别地,对于由上述组件、设备、电路、系统等执行的各种功能,除非另 外指明,否则用于描述这些组件的术语(包括对“装置”的引用)旨在对应于 执行所描述的执行此处在所要求保护的主题的示例性方面中所示的功能的组 件的指定功能(例如,功能上等效)的任何组件,即使这些组件在结构上不等 效于所公开的结构。在这一点上,也可认识到本发明包括用于执行所要求保护 的主题的各种方法的动作和/或事件的系统以及具有用于执行这些动作和/或事 件的计算机可执行指令的计算机可读介质。
另外,尽管可相对于若干实现中的仅一个来公开本发明的一个特定特征, 但是这一特征可以如对任何给定或特定应用所需且有利地与其它实现的一个 或多个其它特征相组合。此外,就在说明书或权利要求书中使用术语“包括” 和“含有”及其变体而言,这些术语旨在以与术语“包含”相似的方式为包含 性的。