2013-01-21 36 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