2013-09-30 72 views
1

我是begginer,我正在使用Liferay和Drools進行一個項目。我用速度創建Drools的規則,然後執行它。它的工作除了地址,我認爲這應該是因爲我有一些插入問題。 這是我的代碼:插入Drools

dialect "java" 

rule "Initialize Rules" 
    salience 1000 
    when 
     user : User(); 
    then 
     Serializable value; 
     List<Address> params_0 = AddressLocalServiceUtil.getAddresses(user.getCompanyId(), Contact.class.getName(), user.getContactId()); 
     for(Address param_0 : params_0) { 
      insertLogical(param_0); 
     } 
     List<Address> params_1 = AddressLocalServiceUtil.getAddresses(user.getCompanyId(), Contact.class.getName(), user.getContactId()); 
     for(Address param_1 : params_1) { 
      insertLogical(param_1); 
     } 
     List<Address> params_2 = AddressLocalServiceUtil.getAddresses(user.getCompanyId(), Contact.class.getName(), user.getContactId()); 
     for(Address param_2 : params_2) { 
      insertLogical(param_2); 
     } 
     List<Address> params_3 = AddressLocalServiceUtil.getAddresses(user.getCompanyId(), Contact.class.getName(), user.getContactId()); 
     for(Address param_3 : params_3) { 
      insertLogical(param_3); 
     } 
end 

rule "Rule_0" 
    when 
     user: User(); 
     param_0: Address(country.name == "Andorra") 
    then 
     System.out.println("lalalalalala!"); 
     classification(user,"Andorra", 7501); 
     retract(param_0); 
end 

rule "Rule_1" 
    when 
     user: User(); 
     param_1: Address(zip == "00000") 
    then 
     System.out.println("lalalalalala!"); 
     classification(user,"ZIP0", 7502); 
     retract(param_1); 
end 

rule "Rule_2" 
    when 
     user: User(); 
     param_2: Address(city == "Andorra") 
    then 
     System.out.println("lalalalalala!"); 
     classification(user,"Andorra", 7503); 
     retract(param_2); 
end 

rule "Rule_3" 
    when 
     user: User(); 
     param_3: Address(region.name == "Catalonia") 
    then 
     System.out.println("lalalalalala!"); 
     classification(user,"Catalonia", 7504); 
     retract(param_3); 
end 

這是我用它來執行它的代碼:

String domainName = "User segmentation"; 
facts.add(new Fact<User> ("user", user)); 
RulesResourceRetriever rulesResourceRetriever = new RulesResourceRetriever(new StringResourceRetriever(rule), String.valueOf(RulesLanguage.DROOLS_RULE_LANGUAGE)); 
RulesEngineUtil.update(domainName, rulesResourceRetriever, PortalClassLoaderUtil.getClassLoader()); 
RulesEngineUtil.execute(domainName, facts, Query.createStandardQuery(), PortalClassLoaderUtil.getClassLoader()); 

而且我通過用戶有一個地址,它是: - 國家:安道爾 - zip:00000 - city:安道爾

輸出必須是: lalalalalala! lalalalalala! lalalalalala!

但是隻有一個「lalalalalala!」因爲唯一被驗證爲真的規則是第一條。

我不知道我在做什麼錯。任何想法? 'insert'和'insertLogical'之間的區別是什麼? 存在任何方式來顯示我插入了什麼元素? 我做insertLogical,因爲用戶可以有多個地址,但這是正確的方式或最好的。

謝謝。

回答

2

使用insertLogical插入的事實將保留在會話中,直到它的規則的LHS變爲false(或者您使用retract()顯式撤回它們)。 A better explanation can be found here.

這就是發生在你的情況:

當您插入安道爾/ 00000的地址,規則Rule_0,Rule_1和Rule_2得到激活。當其中一個激活被觸發(根據您的意見,Rule_0被首先觸發),Rule_0的RHS撤銷該地址。這將導致取消Rule_1和Rule_2的激活,因爲不再有與其模式匹配的地址。 More information can be found here.

希望它有幫助,

+0

好的,謝謝!然後,即使我執行相同數量的insertLogical而不是規則,我只有一個對象。有什麼方法可以多次插入同一個對象? – sandra

+0

有沒有乾淨的方式來做你所要求的。通常的做法是在執行結束時執行清理規則:http://pastebin.com/RbkQfVsf並避免收回每個規則中的地址。 –

+0

謝謝!有用。 – sandra