随笔-35  评论-97  文章-0  trackbacks-0

基础条件

EMF Model Query Framework 提供了很多方便使用的条件,这些条件实现了用于简单的数据类型断言。包括strings, numbers, 和 booleans. 这些条件用于模型元素的EAttribute之间所进行的逻辑操作.。

看看这些条件结构:

从结构图上可以看出,Condition是最为条件的最顶层父类,它能作各种条件的逻辑操作,AND、OR等,说明条件是可以复合的。而且,Comdition类依赖ConditionPolicy的依赖使得条件能满足全匹配(ALL)或者任意匹配(ANY)的策略。

Condition三个子类CompoundCondition(复合条件),Not(非条件)和ObjectInstanceCondition(对象实例条件)

很容易也看出,CompoundCondition的子类都是一些有关复合的条件类。这些都是可以进行逻辑上的复合的。

注意到Implies(蕴含),在数学上蕴含是有这样的规则:当第一个表达式为真,且第二个表达式为假时,结果为假,否则为真。记住哦,否则很容易搞错的。特别是在条件进行复合时运用蕴含操作,要认真分析前后的表达式。

简单条件类型

看看下面的结构图就知道条件是如何与简单类型进行匹配:

可以很容易看出,这些其实都是一些值类型条件,只是有些条件作了一些扩展的匹配功能,比如字符串条件可以不但可以从字符串内容上(包括子串和正则表达式匹配),还可一从字符长度上匹配。

下面来举一些使用例子来看看条件是如果匹配的。

 

public static void queryExample1()
    
{
        Object subject 
= 100d; 
        Condition a 
= new NumberCondition.DoubleValue(10.0d,1000.0d);  //是否在100-1000的double内
        System.out.println("100 是否在10-1000范围? " + a.isSatisfied(subject));
        
        Condition b 
= new BooleanCondition(false);
        System.out.println(
"true 是否满足false条件? " + b.isSatisfied(true));
        
        Condition c 
= new StringValue("EMF-Query"truenew StringAdapter(){
            
public String getString(Object object)
            
{
                
return object.toString();
            }

        }
);
        System.out.println(
"“EMF-Query” 是否满足c条件?" + c.isSatisfied("emf-query"));
        
        Condition a1 
= new NumberCondition.DoubleValue(10.0d,15.0d);  //是否在100-1000的double内
        Condition a2 = new NumberCondition.DoubleValue(108d,1000.0d);  //是否在100-1000的double内
        
//蕴含:当第一个表达式为真,且第二个表达式为假时,结果为假,否则为真。
        Condition complex = a.IMPLIES(a1.OR(a2));//
        System.out.println("复合条件测试:" + complex.isSatisfied(subject));
        
        StringCondition cond 
= new StringRegularExpressionValue("A+");
        System.out.println(
"正则表达式测试:" + cond.isSatisfied("CATGGTGCCAC"));
        
        Collection subjects 
= new ArrayList(); //多个将要匹配的主题
        subjects.add(100d);
        subjects.add(200d);
        subjects.add(209d);
        subjects.add(2000d);
        Condition  interzone
= new NumberCondition.DoubleValue(100.0d,1000.0d);
        
//全匹配策略
        System.out.println("全匹配策略: " + ConditionPolicy.ALL.isSatisfied(interzone, subjects));
        
//任意匹配策略
        System.out.println("任意匹配策略: " + ConditionPolicy.ANY.isSatisfied(interzone, subjects));
    }

例子很简单,不需要再作太多的说明了吧。想提提的就是条件一般是用这个condition.isSatisfied(subject) 方法来匹配的。ObjectInstanceCondition留到后面的例子吧。看看输出的结果:

100 是否在10-1000范围? true
true 是否满足false条件? false
“EMF
-Query”是否满足c条件?false
复合条件测试:
false
正则表达式测试:
true
全匹配策略: 
false
任意匹配策略: 
true
posted on 2007-06-10 03:37 三告习习 阅读(1171) 评论(0)  编辑  收藏 所属分类: emf/gef/gmf

只有注册用户登录后才能发表评论。


网站导航: