`
izuoyan
  • 浏览: 9223944 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

围绕EMF探索(2)之再探查询组件

阅读更多
索引:围绕EMF探索(1)之存储和查询
围绕EMF探索(2)之再探查询组件
本篇专门讲讲EMF Query这个组件的设计原理、结构和算法。
在上一篇中,已经简单介绍了EMF Query,其是为“内存中的eObjects”的检索提供一套“查询条件”,可以依据eObject的结构关系进行查询,也可以依据eObject的对象进行查询。
EMQ Query的主结构关系如下图所示:
其中咖啡色表示最基本的设计思想的基类,把握住了这几个类(接口),则就把握了整个EMF Query的设计原理。
其中蓝色的图形表示主要所需要关注的实现类和构架。
从大的方面说,整个EMF Query是由围绕查询语句的构造和执行来展开的。
(1)查询语句的结构
查询语句的结构一般如下所示:
SELECT
FROM [source]
WHERE [condition]
整个查询语句(SELECT)是由两个查询子句(Query Clause)组成,分别是FROM和WHERE。其中FROM表示了所需要查询的对象源(EObject Source),WHERE则表示了所需要匹配的条件。
对于EObject Source,其表示的就是一组eObject对象的集合。
(2)查询语句的执行
整个查询语句的执行规则就是,将所需要检索的对象源(EObject Source)转换成一棵对象树,通过遍历这棵对象树,依次将树中的对象与所需要检索的条件进行匹配,选择匹配成功的。
EObject eObject = null;
boolean canPrune = getFromClause().canBePruned();
WHERE whereClause = getWhereClause();
while (it.hasNext() && (isCancelled() == false)) {
eObject = (EObject) it.next();
if (whereClause.matches(eObject)) {
addEObject(eObject);
if (getResultSet().size() == maximumResultSize) {
break;
}
}
if (canPrune && whereClause.shouldPrune(eObject)) {
it.prune();
}
}
有关上面那张类图的结构就不再多叙述,相信一看就明白。
接下来讲讲两个比较值得关注的地方,一个是看得见的条件(Condition),还有一个是看不见的Tree Prune。
条件(Condition
与条件相关的类几乎占据了整个Query组件的一半,但是这些Condition是非常简单的。如果想真正理解这个条件的构造机制和原理,那么建议大家花点时间了解一下Java Funtion Programming(Java的函数式编程)。整个Condition就是围绕一个“一元谓词”而构造的,而每个Condition实际上就代表一个算子(arithmetic operator)。
其实上一篇已经提到了我曾经写过一篇有关Java函数式编程的blog,参见http://blog.csdn.net/james999/archive/2005/01/09/246404.aspx
大家在使用或阅读Query源码的时候,可能会涉及到有的Condition会存在Adapter的。其实这就是利用了一个简单的Adapter模式代码,将需要匹配的EObject转换成当前Condition可以识别的值,用于计算。
对象树的裁减
前面讲过在执行检索过程中,要检索的对象源(EObject Source)转换成一棵对象树。其实是获取一个新的EMF所提供的TreeIterator对象,这是一个允许被裁减(Prune)的针对树的遍历指针。
TreeIterator的默认遍历方式是采用“树的深度遍历算法”,而裁减(Prune)则表示:当遍历到某个节点时,如果执行裁减行为,则此节点后的所有子节点将不再遍历——就像一棵树,被削了一个枝杈似的。
因为EMF的对象是支持包含关系的,而且很容易通过getContents()接口获取相关的内容对象。虽然如果不进行适当的裁减操作,完整的遍历一棵树,是比较缓慢的。
EMF Query在构造Condition的时候,提供了PruneHandler接口,用于判断当前的eObject对象是否需要进行裁减遍历行为。


分享到:
评论

相关推荐

    围绕EMF探索

    火龙果软件工程技术中心 围绕EMF探索(1)之存储 EMF(EclipseModelingFramework)的应用会越来越多,而围绕EMF的query,validate,transaction,persistency等等讲逐渐被大家使用,以及EMFeCore也有非常大的参考价值。...

    emf2svg-FreeHEP

    This is the API specification of the FreeHEP VectorGraphics package for converting emf to svg.

    Emf2Png.zip

    `Emf2Png.zip`这个压缩包文件显然涉及到将EMF(Enhanced Metafile)格式的图像转换为PNG(Portable Network Graphics)格式的过程。EMF是一种矢量图形格式,通常在Windows系统中用于存储图形信息,而PNG是一种广泛...

    emf2vec去水印破解版

    emf2vec工具可在各种矢量文件格式间转换,如emf->pdf,svg-pdf,sgv-bmp等等。但emf2vec为收费软件,共享版在emf->pdf转换过程中会附加水印。此资源是emf->pdf转换的去水印版。(注:仅emf->pdf去除了水印)。要5分...

    emf教程入门和插件

    例如,EMF Compare用于模型的版本比较和合并,EMF Forms提供了用户界面组件来显示和编辑模型数据。在本教程中,你将学习如何安装和使用这些插件,提升你的EMF开发体验。 7. **实战演练** 通过实际操作,你会学习...

    emf文件格式详解

    2. **多记录结构**:EMF文件由一系列记录组成,每个记录代表一个图形操作,如画线、填充区域或设置颜色。 3. **设备独立性**:EMF格式不依赖于特定的显示器或打印机,因此可以在不同设备间保持一致性。 4. **颜色和...

    将EMF图片格式转换成PNG

    2. **编写转换代码**:使用`freehep`的`Graphics2D`和`Metafile`类,你可以读取EMF文件并将其渲染为PNG。以下是一个简单的示例代码片段: ```java import hep.graphics.hep.*; public class EMFToPNGConverter { ...

    微软emf文件格式详解

    ### 微软EMF文件格式详解 #### 一、引言 EMF(Enhanced MetaFile)是一种在Windows操作系统中广泛使用的高级元文件格式。它作为WMF(Windows Metafile)格式的32位增强版,旨在解决WMF在印刷行业中的一些限制。EMF...

    SVG转EMF的示例代码

    2. 使用Batik的SVGGeneratorContext和SVGGraphics2D创建一个SVG到EMF的转换上下文。 3. 将SVG图形渲染到SVGGraphics2D对象中。 4. 使用转换上下文将SVGGraphics2D对象写入EMF输出流,通常是FileOutputStream。 5. ...

    emf-runtime-2.7.2

    【标题】"emf-runtime-2.7.2" 是一个与Eclipse平台相关的软件组件,专注于模型化框架(EMF)的运行时环境。这个版本号2.7.2表明这是一个更新和优化过的版本,提供了对EMF框架在Eclipse开发环境中的支持。 【描述】...

    emf eclipse

    3. "使用EMF Query查询EMF模型(2) - 编程入门网" 这部分可能深入介绍了EMF Query(EMF QL),这是一个用于查询和操作EMF模型的强大工具。通过EMF QL,开发者可以方便地检索、分析和修改模型数据。 总结来说,EMF ...

    EMF 自学笔记5

    例如,在企业架构设计中,EMF可以用于定义业务流程模型、数据模型、组件模型等;在软件开发中,EMF可以用于定义领域模型、配置模型、测试模型等;在科学研究中,EMF可以用于定义实验模型、分析模型、仿真模型等。 ...

    Java组件emf sdo runtime 2.2.0.rar

    Java组件EMF(Eclipse Modeling Framework)和SDO(Service Data Objects)是Java开发中用于数据建模和数据访问的重要工具。EMF是基于模型的软件开发框架,它提供了生成Java代码、运行时库和XML序列化的能力,常用于...

    GIF2EMF转换器

    【GIF2EMF转换器】是一款专门用于将GIF图像格式转换为增强型图元文件(EMF)的专业工具。在计算机图形处理领域,这种转换具有重要的实用价值,因为EMF格式通常更适合于Windows系统中的打印和矢量图形操作。 GIF...

    java开发工具EMF插件

    1. 安装EMF插件:打开Eclipse Marketplace,搜索并安装EMF相关组件。 2. 创建Ecore模型:通过New -> Other -> EMF -> Ecore Model创建新的模型项目。 3. 设计模型:在图形化界面中定义模型元素,包括类、属性和关系...

    emf文件和wmf的转换

    解决方案文件"emf2wmf.sln"和项目文件"emf2wmf.vcproj"则表明这是一个使用Microsoft Visual Studio开发的C++项目,用于编译和运行转换代码。 在转换过程中,开发者需要考虑的关键点包括: 1. **记录解析**:EMF和...

    emf-runtime-2.6.1

    标题中的"emf-runtime-2.6.1"指的是EMF框架的运行时组件,版本号为2.6.1。 EMF的核心功能包括: 1. **模型定义**:通过扩展XML Schema Definition (XSD) 或者ECORE(EMF的元数据模型)来定义模型结构。ECORE是一种...

    eclipse emf&gef

    EMF位于Eclipse平台的核心之上,提供了一个高层次的抽象层,用于处理模型定义和模型实例。它是面向对象的,并且可以与Java代码紧密结合。 **1.1.2 目标** - **简化模型定义**:EMF通过简单的API提供了强大的模型...

Global site tag (gtag.js) - Google Analytics