`
ww2
  • 浏览: 418273 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

围绕EMF探索(1)之存储和查询

阅读更多

围绕EMF探索(1)之存储

       EMF(Eclipse Modeling Framework)的应用会越来越多,而围绕EMF的query, validate, transaction, persistency等等讲逐渐被大家使用,以及EMF eCore也有非常大的参考价值。今天先讲讲EMF的存储与查询方面的内容。

首先讲讲EMF对象的存储

       这两天抽空玩了玩EMF的对象存储,采用了Eclipse Teneo这个组件。这是一种桥梁式的组件,为EMF对象提供了一个持久化的解决方案。目前支持Hibernate和JDO的实现方式。Eclipse Teneo的前身是elver persistency组件,后并入Eclipse EMF Tools项目工程下。

 
       Teneo让EMF对象的存储变得非常简单。这样我们只需要关注EMF对象的关系,而不用过多的考虑每一个eObject该如何与数据库表对应。
       在使用Hibernate的情况下,Teneo会根据ePackage所描述的Model中的eObject对象之间的关系,自动的产生hiernate.hbm.xml映射文件。当然我们可以手工指定mapping文件来强制描述eObject与数据库表结构的关系。详细可以参看:
 
       简单的采用Teneo操作eObjects是非常容易的事情,在elver上也提供了那个经典的“Library Model”实例的实现例子,可参考:
 
final HbDataStore dataStore = HbHelper.INSTANCE.createRegisterDataStore(dataStoreName);
dataStore.setEPackages(
new EPackage[] { LibraryPackage.eINSTANCE });

final SessionFactory sessionFactory  = dataStore.getSessionFactory();
Session session 
= sessionFactory.openSession();
session.beginTransaction();

LibraryAdapterFactory adapterFactory 
= new LibraryAdapterFactory();

Library library  
= LibraryFactory.eINSTANCE.createLibrary();
library.eAdapters().add( adapterFactory.createAdapter(library) );
library.setName(
"My Library");

session.save(library);

Writer writer 
= LibraryFactory.eINSTANCE.createWriter();
writer.setName(
"Writer One");

Book book 
= LibraryFactory.eINSTANCE.createBook();
book.setPages(
305);
book.setTitle(
"The Hobbit");
book.setCategory(BookCategory.SCIENCE_FICTION_LITERAL);
book.getWriter().add(writer);

library.getWriters().add(writer);
library.getBooks().add(book);

session.getTransaction().commit();
session.close();
 
再说说EMF的查询吧。
      
Teneo
本身提供了一对查询的支持,比如针对Hibernate的实现,支持对HQL的检索。
Query query = session.createQuery("SELECT book FROM Book book, Writer writ WHERE "
    
+ " book.title='1984' AND book.author=writ AND writ.name='G. Orwell'");
books 
= query.list();

       但是,Teneo仅仅支持Hibernate的HQL,或JDO的JDOQL,略显得不够完善,或者说,让对象检索变得有些“污染”。
       我比较喜Eclipse EMF项目工程下有EMF Query组件,这个组件为“内存中的eObjects”的检索提供一套“查询条件”,但目前EMF Query仅支持内存中的对象关系,这就局限来其现实中的应用价值。
       当然,EMF Query和Teneo还是在某些不要求效率的情况下能够配合起来的。
public Collection queryLargeBook(EObject root) ...{
    SELECT select 
= new SELECT(new FROM(root), new WHERE(
            
new EObjectAttributeValueCondition(LibraryPackage.eINSTANCE
                    .getBook_Pages(), 
new NumberCondition.IntegerValue(
                    
new Integer(10), new Integer(Integer.MAX_VALUE)))));

    
return select.execute();
}
Query query = session.createQuery("FROM Library");            
List libraries 
= query.list();
Library library 
= (Library) libraries.get(0);    
Collection books 
= queryLargeBook(library);

       在内部实现上,EMF Query会把所有的源对象都装载进内存中,在内存中遍历,并依次判断是否符合所设定的查询条件。下表中代码截取自emf query的Select对象,演示了遍历寻找符合条件的对象的算法。
protected void doResume() ...{
    EObject eObject 
= null;
    setResultSet(
new QueryResultSet());
    
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;
            }

        }

    }

}

       EMF Query构造了条件(Condition)对象,这个Condition有点“(函数式编程)Function Programming”的影子了,确切的说,应该是“一元谓词(UnaryPredicate)”。有关java的FP,可参考我的另一篇blog:http://blog.csdn.net/james999/archive/2005/01/09/246404.aspx
       不过,EMF Query的Condition并没有基于任何开源FP的基础,既没有基于apache的Common Functor,也没有基于JGA(http://jga.sourceforge.net/)。
 
       EMF Query内部结构和实现,我目前还没有看完,姑且先不细说,留待后面补充。
分享到:
评论

相关推荐

    围绕EMF探索

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

    emf教程入门和插件

    1. **EMF基础** EMF基于MDE(Model Driven Engineering)理念,允许开发者创建、编辑和管理模型。模型是业务逻辑的一种抽象表示,可以用来生成代码、文档和其他工程制品。EMF提供了元数据模型(EMD,EMF Meta-Data...

    emf文件格式详解

    EMF(Enhanced Metafile Format)是Windows操作系统中用于存储图形图像的一种文件格式,它扩展了早期的WMF(Windows Metafile Format)格式,提供了更高级的功能和更高的图像质量。这个压缩包包含了深入理解EMF文件...

    emf文件和wmf的转换

    EMF(Enhanced Metafile)和WMF(Windows Metafile)是两种常见的矢量图形文件格式,主要用于存储图像数据,特别是在Windows操作系统环境下。这两种格式都允许无损缩放和复杂图形的绘制,但EMF是WMF的增强版本,提供...

    微软emf文件格式详解

    1. **记录头**:定义了EMF文件的基本属性,如文件类型、版本号等。 2. **记录体**:包含了实际的绘图指令,这些指令按照顺序执行,以重现图像。 3. **对象表**:记录了所有使用的绘图对象,如笔、刷子等,以及它们的...

    emf eclipse

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

    EMF文件提取文本,预览,打印

    1. **文本提取**:EMF文件可能包含文本信息,这些文本通常是以矢量形式存储的。文本提取过程是从EMF文件中识别并提取出可读的文本内容。这通常需要解析文件结构,找到包含文本的数据块,并将它们转化为人类可读的...

    EMF 自学笔记5

    这些生成的代码可以用于存储、加载和操作模型实例。 #### 三、EMF代码生成 EMF提供了强大的代码生成能力,能够根据EMF模型自动生产Java代码。这包括模型类、序列化和反序列化代码、编辑器、视图等。EMF的代码生成...

    EMF读取XML

    - XML是一种标记语言,用于存储和传输结构化数据,它与EMF模型之间的映射使得XML数据能够被EMF理解和处理。 2. **创建EMF模型** - 使用EMF,首先需要创建一个Ecore模型,这是EMF的数据模型定义,包含了类、属性和...

    Eclipse开发使用GEF和EMF(IBM 红皮书)中英文对照版

    1. GEF和EMF的基本概念:介绍这两个框架的核心原理和设计理念。 2. 模型和视图的关系:阐述如何使用EMF来定义数据模型,并通过GEF展示为图形界面。 3. 图形编辑器的构建:详细步骤指导如何使用GEF创建可交互的图形...

    emf-runtime-2.7.2

    1. **元模型(Metamodel)定义**:EMF允许开发者使用Ecore语言定义元模型,这是对数据模型的一种抽象描述。 2. **代码生成**:基于元模型,EMF可以自动生成Java类和其他相关代码,这些代码可以直接在应用程序中使用...

    eclipse emf&gef

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

    SVG转EMF的示例代码

    EMF,另一方面,是Microsoft Windows操作系统中的一个元文件格式,它可以存储矢量和光栅图形信息,适合在Windows应用程序之间交换图形数据。 这个"SVG转EMF"的示例代码提供了在Java环境下进行这种转换的方法。首先...

    java开发工具EMF插件

    3. **模型操作**:EMF提供了丰富的API,包括创建、修改、查询模型对象,以及保存和加载模型到XML文件。 4. **图形化编辑器**:EMF集成了GEF(Graphical Editor Framework),可以快速构建基于模型的图形化编辑器,...

    深入理解EMF&graphiti

    EMF(Eclipse Modeling Framework)和Graphiti是两个在Eclipse平台上用于建模和图形化表示的重要工具。本文将深入探讨这两个技术,并结合提供的压缩包文件"emf",为读者提供一个详尽的理解。 首先,EMF是Eclipse...

    将EMF图片格式转换成PNG

    EMF (Enhanced Metafile) 是Windows操作系统中用于存储矢量图形和光栅图像的文件格式,它在处理复杂的图形和图像是非常有效。而PNG(Portable Network Graphics)则是一种无损压缩的位图格式,广泛应用于网页设计、...

    eclipse插件开发EMF api 文档

    1. **基础概念**:EMF的基础概念包括模型、元模型、实例和资源。模型是对现实世界或业务逻辑的一种抽象,元模型定义了模型的结构和约束,实例是模型的具体实现,而资源则是模型的存储容器。 2. **核心API**:EMF的...

    emf-runtime-2.6.1

    1. **模型定义**:通过扩展XML Schema Definition (XSD) 或者ECORE(EMF的元数据模型)来定义模型结构。ECORE是一种元元模型,用于描述任何概念模型,它是EMF的基础。 2. **代码生成**:根据模型定义自动生成Java类...

Global site tag (gtag.js) - Google Analytics