2016-04-13 19 views
0

Bir Drools kuralı yazmak için yardıma ihtiyacım var. Context ve CreditReport adlı iki sınıfım var. Kurallar tetiklenmeden önce, bilgi oturumuna bir gerçeklik olarak bağlam eklenir.Bozukluklar: Nesneyi Nesne'den Nesne İçeren Kurallar

Ben doğrudan oturumuna CreditReport eklemek istiyorum, baskılar 'Mükemmel' konsolda Kredi Puan 800'den fazla

İdeal olan bir kural yazmak gerekir ama ne yazık ki ondan yok seçeneği.

ben iyi görünmüyor yazdık kural:

  1. sonra parçası olan bir eğer deyim ben
CreditReport için Nesne tür çarpıtması am
  • Yardımlarınız için teşekkürler!

    // Context.java

    public class Context { 
        private Map<String, Object> data = Maps.newHashMap(); 
    
        public <T> T getData(final String key, final Class<T> clazz) { 
         return clazz.cast(data.get(key)); 
        } 
    
        public void putData(final String key, final Object value) { 
         this.data.put(key, value); 
        } 
    } 
    

    // CreditReport.java

    public class CreditReport { 
        private final String name; 
        private final int creditScore; 
    
        public String getName() { 
         return this.name; 
        } 
    
        public int getCreditScore() { 
         return this.creditScore; 
        } 
    
    } 
    

    // Ana yöntem

    context.put("creditReport", new CreditReport("John", 810)); 
    session.insert(Arrays.asList(context)); 
    session.fireAllRules(); 
    

    // Kural

    rule "Excellent_Score" 
    when Context($creditReportObject : getData("creditReport")) 
    then 
        final CreditReport creditReport = (CreditReport) $creditReportObject; 
        if (creditReport.getCreditScore() >= 800) { 
         System.out.println("Excellent"); 
        } 
    end 
    
  • cevap

    1

    Tek bir Context nesnesi içeren bir List<Context> eklemenizi sağlar? Java kodu Elbette, almak ve Bağlam CreditReport eklemek olabilir

    rule "Excellent_Score" 
    when 
        Context($creditReportObject : getData("creditReport")) 
        CreditReport(creditScore > 800) from $creditReportObject 
    then 
        System.out.println("Excellent"); 
    end 
    

    olarak

    context.put("creditReport", new CreditReport("John", 810)); 
    session.insert(context); 
    session.fireAllRules(); 
    

    Kural artık yazılabilir yapmalıdır. - Şüphelendiğin şeyin daha fazla sarsıldığını sanıyorum, ama "bu seçeneğe sahip değilim" yine de bir kod kokusu.

    Düzenleme aşağıdaki gibi yazılmış olabilir "Mükemmel" baskı için birden fazla nedenden dolayı tek bir kural, bu iki kural, bir yöntem haline ÜSÖ sarın ya edebilir alması nedeniyle çok daha iyi olmasına rağmen DRL işlevi.

    rule "Excellent_Score_2" 
    when 
        Context($creditReport : getData("creditReport"), 
          $account: getData("account")) 
        (CreditReport(creditScore > 800) from $creditReport 
        or 
        Account(balance >= 5000) from $account) 
    then 
        System.out.println("Excellent"); 
    end 
    
    +0

    Teşekkür ederiz laune! Her konuda haklısın. Bir takip sorusu. İçerik, Hesap adı verilen başka bir nesne içeriyorsa. CreditReport.creditScore> = 800 VEYA Account.balance> = 5000 iken 'Mükemmel' yazan bir Kural yazmak isterim. Bir AND ilişkisini nasıl kuracağımı biliyoruz, ama OR ile değil, OR ile. Değerlendirmeyi de kullanmamaya çalışıyorum – user544192

    +0

    Tek bir kuralla elde edilemeyecek kadar değil - Düzenlememe bakın. – laune

    +0

    Anladım. Tekrar teşekkürler! :) – user544192