索引:
围绕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)。
大家在使用或阅读Query源码的时候,可能会涉及到有的Condition会存在Adapter的。其实这就是利用了一个简单的Adapter模式代码,将需要匹配的EObject转换成当前Condition可以识别的值,用于计算。
对象树的裁减
前面讲过在执行检索过程中,要检索的对象源(EObject Source)转换成一棵对象树。其实是获取一个新的EMF所提供的TreeIterator对象,这是一个允许被裁减(Prune)的针对树的遍历指针。
TreeIterator的默认遍历方式是采用“树的深度遍历算法”,而裁减(Prune)则表示:当遍历到某个节点时,如果执行裁减行为,则此节点后的所有子节点将不再遍历——就像一棵树,被削了一个枝杈似的。
因为EMF的对象是支持包含关系的,而且很容易通过getContents()接口获取相关的内容对象。虽然如果不进行适当的裁减操作,完整的遍历一棵树,是比较缓慢的。
EMF Query在构造Condition的时候,提供了PruneHandler接口,用于判断当前的eObject对象是否需要进行裁减遍历行为。
分享到:
相关推荐
火龙果软件工程技术中心 围绕EMF探索(1)之存储 EMF(EclipseModelingFramework)的应用会越来越多,而围绕EMF的query,validate,transaction,persistency等等讲逐渐被大家使用,以及EMFeCore也有非常大的参考价值。...
This is the API specification of the FreeHEP VectorGraphics package for converting emf to svg.
`Emf2Png.zip`这个压缩包文件显然涉及到将EMF(Enhanced Metafile)格式的图像转换为PNG(Portable Network Graphics)格式的过程。EMF是一种矢量图形格式,通常在Windows系统中用于存储图形信息,而PNG是一种广泛...
emf2vec工具可在各种矢量文件格式间转换,如emf->pdf,svg-pdf,sgv-bmp等等。但emf2vec为收费软件,共享版在emf->pdf转换过程中会附加水印。此资源是emf->pdf转换的去水印版。(注:仅emf->pdf去除了水印)。要5分...
2. **多记录结构**:EMF文件由一系列记录组成,每个记录代表一个图形操作,如画线、填充区域或设置颜色。 3. **设备独立性**:EMF格式不依赖于特定的显示器或打印机,因此可以在不同设备间保持一致性。 4. **颜色和...
例如,EMF Compare用于模型的版本比较和合并,EMF Forms提供了用户界面组件来显示和编辑模型数据。在本教程中,你将学习如何安装和使用这些插件,提升你的EMF开发体验。 7. **实战演练** 通过实际操作,你会学习...
2. **编写转换代码**:使用`freehep`的`Graphics2D`和`Metafile`类,你可以读取EMF文件并将其渲染为PNG。以下是一个简单的示例代码片段: ```java import hep.graphics.hep.*; public class EMFToPNGConverter { ...
### 微软EMF文件格式详解 #### 一、引言 EMF(Enhanced MetaFile)是一种在Windows操作系统中广泛使用的高级元文件格式。它作为WMF(Windows Metafile)格式的32位增强版,旨在解决WMF在印刷行业中的一些限制。EMF...
2. 使用Batik的SVGGeneratorContext和SVGGraphics2D创建一个SVG到EMF的转换上下文。 3. 将SVG图形渲染到SVGGraphics2D对象中。 4. 使用转换上下文将SVGGraphics2D对象写入EMF输出流,通常是FileOutputStream。 5. ...
【标题】"emf-runtime-2.7.2" 是一个与Eclipse平台相关的软件组件,专注于模型化框架(EMF)的运行时环境。这个版本号2.7.2表明这是一个更新和优化过的版本,提供了对EMF框架在Eclipse开发环境中的支持。 【描述】...
3. "使用EMF Query查询EMF模型(2) - 编程入门网" 这部分可能深入介绍了EMF Query(EMF QL),这是一个用于查询和操作EMF模型的强大工具。通过EMF QL,开发者可以方便地检索、分析和修改模型数据。 总结来说,EMF ...
例如,在企业架构设计中,EMF可以用于定义业务流程模型、数据模型、组件模型等;在软件开发中,EMF可以用于定义领域模型、配置模型、测试模型等;在科学研究中,EMF可以用于定义实验模型、分析模型、仿真模型等。 ...
Java组件EMF(Eclipse Modeling Framework)和SDO(Service Data Objects)是Java开发中用于数据建模和数据访问的重要工具。EMF是基于模型的软件开发框架,它提供了生成Java代码、运行时库和XML序列化的能力,常用于...
【GIF2EMF转换器】是一款专门用于将GIF图像格式转换为增强型图元文件(EMF)的专业工具。在计算机图形处理领域,这种转换具有重要的实用价值,因为EMF格式通常更适合于Windows系统中的打印和矢量图形操作。 GIF...
1. 安装EMF插件:打开Eclipse Marketplace,搜索并安装EMF相关组件。 2. 创建Ecore模型:通过New -> Other -> EMF -> Ecore Model创建新的模型项目。 3. 设计模型:在图形化界面中定义模型元素,包括类、属性和关系...
解决方案文件"emf2wmf.sln"和项目文件"emf2wmf.vcproj"则表明这是一个使用Microsoft Visual Studio开发的C++项目,用于编译和运行转换代码。 在转换过程中,开发者需要考虑的关键点包括: 1. **记录解析**:EMF和...
标题中的"emf-runtime-2.6.1"指的是EMF框架的运行时组件,版本号为2.6.1。 EMF的核心功能包括: 1. **模型定义**:通过扩展XML Schema Definition (XSD) 或者ECORE(EMF的元数据模型)来定义模型结构。ECORE是一种...
EMF位于Eclipse平台的核心之上,提供了一个高层次的抽象层,用于处理模型定义和模型实例。它是面向对象的,并且可以与Java代码紧密结合。 **1.1.2 目标** - **简化模型定义**:EMF通过简单的API提供了强大的模型...