2013-01-21 34 views
0

我一直在试图寻找是否有在Drools中Fusion.I同一类的三个对象有一个名为蜱如下连续三个对象

public class Tick 
{ 
    CrossOverPrice crossoverprice; 
    CrossOverType crossovertype; 
    public Tick(CrossOverPrice crossoverprice, CrossOverType crossovertype) { 
     super(); 
     this.crossoverprice = crossoverprice; 
     this.crossovertype = crossovertype; 
    } 
    public CrossOverPrice getCrossoverprice() { 
     return crossoverprice; 
    } 
    public void setCrossoverprice(CrossOverPrice crossoverprice) { 
     this.crossoverprice = crossoverprice; 
    } 
    public CrossOverType getCrossovertype() { 
     return crossovertype; 
    } 
    public void setCrossovertype(CrossOverType crossovertype) { 
     this.crossovertype = crossovertype; 
    } 
} 

POJO,我想,如果找出有是其具有crossovertype == CrossOverType.bear

下面蜱的三个连续的对象是

public class DroolsTest { 

    public static final void main(String[] args) { 
     try { 
      // load up the knowledge base 
      KnowledgeBase kbase = readKnowledgeBase(); 
      StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 
      KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test"); 
      // go ! 
      Tick t1=new Tick(CrossOverPrice.p12,CrossOverType.bear); 
      Tick t2=new Tick(CrossOverPrice.p23,CrossOverType.bear); 
      Tick t5=new Tick(CrossOverPrice.p34,CrossOverType.bear); 

      ksession.insert(t1); 
      ksession.fireAllRules(); 
      /*ksession.insert(t3); 
      ksession.fireAllRules();*/ 
      ksession.insert(t2); 
      ksession.fireAllRules(); 
      ksession.insert(t5); 
      ksession.fireAllRules(); 

      logger.close(); 
     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
    } 

    private static KnowledgeBase readKnowledgeBase() throws Exception { 
     KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
     kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL); 
     KnowledgeBuilderErrors errors = kbuilder.getErrors(); 
     if (errors.size() > 0) { 
      for (KnowledgeBuilderError error: errors) { 
       System.err.println(error); 
      } 
      throw new IllegalArgumentException("Could not parse knowledge."); 
     } 
     KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); 
     kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 
     return kbase; 
    } 
} 

规则是

的规则和主类
declare Tick 
@role(event) 
end 

rule "Check three bear" 
    when 
     $t:Tick(crossovertype:CrossOverType.bear ,crossoverprice : CrossOverPrice.p12) 
     not Tick(this after $t,crossovertype == CrossOverType.bull) 
     $t1 : Tick(this after $t ,crossovertype == CrossOverType.bear ,crossoverprice ==CrossOverPrice.p23) 
     not Tick(this after $t1,crossovertype == CrossOverType.bull) 
     $t3 : Tick(this after $t1 ,crossovertype == CrossOverType.bear ,crossoverprice ==CrossOverPrice.p34) 

    then 
    System.out.println("great"); 

end 

我能够找到是否有两个连续的Tick对象,其中有crossovertype == CrossOverType.bear但这不适用于三个连续的对象。 请建议我something.ThankYou

回答

0

如果你看看在“托运三只熊”统治你已经发布,你会看到有第二个条件元素和第三之间的矛盾:

蜱(此之后$ T ...)
$ T1:蜱(此之后$ T ...)

这是我已经在过去用来从流中获取最新的3个事件:

$t1:Tick() //the newest 
not Tick(this after $t1) 
$t2:Tick(this before $t1) 
not Tick(this before $t1, this after $t2) //no events between $t1 and $t2 
$t3:Tick(this before $t2) 
not Tick(this before $t2, this after $t3) //no events between $t2 and $t3 

另一种解决办法是使用滑动窗口:

List(size == 3) from collect(Tick(...) over window:length(3)) 

在这种情况下,size == 3条件是为了防止在窗口中只有1或2个元素时激活规则。

希望它有帮助,

+0

谢谢你的答案。当我运行它,有时它并没有写的作品的规则。 – maddy