查询的结果中。在EMF Query框架中,已经提供了大量我们立刻可用的Condition子类。
图 5 使用Hierachy视图查看Condition类型
通常情况下,我们既可以使用已有的Condition类也可以创建新的Condition类。对于在EMF模型中进行查询而言,我们最常用到的是EObjectCondition类及其子类。
表 1 用于EMF的一些Condition类
类名 |
用途 |
EObjectCondition |
所有用于检查EMF模型的条件类都应该继承EObjectCondition类。这个条件类接收一个PruneHandler类的对象。PruneHandler用于判断是否需要处理当前正在比较的EMF对象的子对象。 |
EObjectAttributeValueCondition |
这个条件类用于判断当前正在处理的EMF对象的属性是否满足特定的条件。这个条件类接收一个PruneHandler对象和另一个Condition对象。传入的Condition对象将被用于对属性的值进行判断。 |
EObjectReferencerCondition |
这个条件类用于判断当前正在处理的EMF对象是否引用了一个特定的EMF对象。 |
使用EMF Query查询EMF模型(3)
时间:2011-02-12 IBM 郝萍
当我们了解了一些常用的Condition之后,我们就可以开始编写代码来对我们的EMF模型进行查询了。下面的代码演示了如何利用EObjectAttributeValueCondition和EObjectReferencerCondition来进行模型的查询。
代码 1 查询超过500页的书籍
public Collection queryLargeBook(EObject root) {
SELECT select = new SELECT(new FROM(root), new WHERE(
new EObjectAttributeValueCondition(LibraryPackage.eINSTANCE
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
.getBook_Pages(), new NumberCondition.IntegerValue(
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
new Integer(500), new Integer(Integer.MAX_VALUE)))));
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
return select.execute();
}
在上面的代码中,我们检查每个Book对象的Pages属性。对于Pages属性的检查是通过一个NumberCondition对象进行的。
代码 2 查询某个作者创作的所有书籍
public Collection queryBookByWriter(EObject root, Writer writer) {
SELECT select = new SELECT(new FROM(root), new WHERE(
new EObjectReferencerCondition(writer)));
return select.execute();
}
在上面的代码中,我们查询了一个作者所写的所有书籍。除了使用已有的条件类之外,我们也可以创建新的条件类,例如,如果希望查询所有具有三个作者的书籍,那么我们可以编写如下的条件类:
代码 3 查询拥有三个作者的所有书籍
private class ThreeWriterCondition extends EObjectCondition {
public ThreeWriterCondition() {
super(PruneHandler.NEVER);
}
@Override
public boolean isSatisfied(EObject eObject) {
if (eObject instanceof Book) {
Book book = (Book)
|