0

Drools Fusion に同じクラスの 3 つのオブジェクトがあるかどうかを調べようとしています。以下のように Tick という名前の POJO があります。

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;
    }
}

そして、 crossovertype == CrossOverType.bear を持つ Tick の3つの連続したオブジェクトがあるかどうかを調べようとしています

以下はルールとメインクラスです

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

crossovertype==CrossOverType.bear を持つ 2 つの連続する Tick オブジェクトがあるかどうかを確認できますが、これは 3 つの連続するオブジェクトでは機能しません。私に何か提案してください.ThankYou

4

1 に答える 1

0

投稿した「3匹のクマをチェック」ルールを見ると、2番目の条件要素と3番目の条件要素の間に矛盾があることがわかります。

Not Tick(this after $ t ...)
$ t1:Tick(this after $ 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つの要素しかないときにルールがアクティブ化されないようにすることです。

それが役に立てば幸い、

于 2013-01-22T10:10:29.220 に答える