Drools - Sample Drools Programı

Bu bölümde, aşağıdaki problem ifadesi için bir Drools projesi oluşturacağız -

Şehre ve ürün türüne bağlı olarak (Şehir ve Ürün Kombinasyonu), o şehirle ilgili yerel vergiyi öğrenin.

Drools projemiz için iki DRL dosyamız olacak. İki DRL dosyası, dikkate alınan iki şehri (Pune ve Nagpur) ve dört tür ürünü (bakkaliye, ilaçlar, saatler ve lüks mallar) belirtecektir.

  • Her iki şehirde de ilaç vergisi sıfır olarak kabul ediliyor.

  • Yiyecekler için, Pune'da Rs 2 ve Nagpur'da Rs 1 vergi aldık.

Farklı çıktıları göstermek için aynı satış fiyatını kullandık. Uygulamada tüm kuralların kovulduğunu unutmayın.

İşte her itemType'ı tutan model -

package com.sample;
import java.math.BigDecimal;
public class ItemCity {
   public enum City {
      PUNE, NAGPUR
   }
   public enum Type {
      GROCERIES, MEDICINES, WATCHES, LUXURYGOODS
   }
   private City purchaseCity;
   private BigDecimal sellPrice;
   private Type typeofItem;
   private BigDecimal localTax;
   
   public City getPurchaseCity() {
      return purchaseCity;
   }
   public void setPurchaseCity(City purchaseCity) {
      this.purchaseCity = purchaseCity;
   }
   public BigDecimal getSellPrice() {
      return sellPrice;
   }
   public void setSellPrice(BigDecimal sellPrice) {
      this.sellPrice = sellPrice;
   }
   public Type getTypeofItem() {
      return typeofItem;
   }
   public void setTypeofItem(Type typeofItem) {
      this.typeofItem = typeofItem;
   }
   public BigDecimal getLocalTax() {
      return localTax;
   }
   public void setLocalTax(BigDecimal localTax) {
      this.localTax = localTax;
   }
}

DRL Dosyaları

Daha önce önerildiği gibi, burada iki DRL dosyası kullandık: Pune.drl ve Nagpur.drl.

Pune.drl

Bu, Pune şehri için kuralları uygulayan DRL dosyasıdır.

// created on: Dec 24, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;

// declare any global variables here
dialect "java"
rule "Pune Medicine Item"
   when
      item : ItemCity (purchaseCity == ItemCity.City.PUNE,
         typeofItem == ItemCity.Type.MEDICINES)
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

rule "Pune Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE,
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(2.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

Nagpur.drl

Bu, Nagpur şehri için kuralları uygulayan DRL dosyasıdır.

// created on: Dec 26, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;

// declare any global variables here
dialect "java"
rule "Nagpur Medicine Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.NAGPUR, 
         typeofItem == ItemCity.Type.MEDICINES)
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

rule "Nagpur Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.NAGPUR, 
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(1.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

DRL dosyalarını şehre göre yazdık, çünkü daha sonra yeni şehirler ekleniyorsa herhangi bir sayıda kural dosyası eklemek için genişletilebilirlik sağlıyor.

Tüm kuralların kural dosyalarımızdan tetiklendiğini göstermek için iki öğe türü kullandık (ilaçlar ve yiyecekler); ve ilaçlar vergiden muaftır ve bakkallar şehre göre vergilendirilir.

Test sınıfımız kural dosyalarını yükler, gerçekleri oturuma ekler ve çıktıyı üretir.

Droolstest.java

package com.sample;

import java.math.BigDecimal;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import com.sample.ItemCity.City;
import com.sample.ItemCity.Type;

/* 
   *This is a sample class to launch a rule. 
*/

public class DroolsTest {
   public static final void main(String[] args) {
      try {
         // load up the knowledge base
         KnowledgeBase kbase = readKnowledgeBase();
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
         
         ItemCity item1 = new ItemCity();
         item1.setPurchaseCity(City.PUNE);
         item1.setTypeofItem(Type.MEDICINES);
         item1.setSellPrice(new BigDecimal(10));
         ksession.insert(item1);
         
         ItemCity item2 = new ItemCity();
         item2.setPurchaseCity(City.PUNE);
         item2.setTypeofItem(Type.GROCERIES);
         item2.setSellPrice(new BigDecimal(10));
         ksession.insert(item2);
         
         ItemCity item3 = new ItemCity();
         item3.setPurchaseCity(City.NAGPUR);
         item3.setTypeofItem(Type.MEDICINES);
         item3.setSellPrice(new BigDecimal(10));
         ksession.insert(item3);
         
         ItemCity item4 = new ItemCity();
         item4.setPurchaseCity(City.NAGPUR);
         item4.setTypeofItem(Type.GROCERIES);
         item4.setSellPrice(new BigDecimal(10));         
         ksession.insert(item4);
         
         ksession.fireAllRules();
         
         System.out.println(item1.getPurchaseCity().toString() + " " 
            + item1.getLocalTax().intValue());
         
         System.out.println(item2.getPurchaseCity().toString() + " "
            + item2.getLocalTax().intValue());
         
         System.out.println(item3.getPurchaseCity().toString() + " "
            + item3.getLocalTax().intValue());
         
         System.out.println(item4.getPurchaseCity().toString() + " "
            + item4.getLocalTax().intValue());
                            
      } catch (Throwable t) {
         t.printStackTrace();
      }
   }
   private static KnowledgeBase readKnowledgeBase() throws Exception {
      KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
      kbuilder.add(ResourceFactory.newClassPathResource("Pune.drl"), ResourceType.DRL);
      kbuilder.add(ResourceFactory.newClassPathResource("Nagpur.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;
   }
}

Bu programı çalıştırırsanız, çıktısı aşağıdaki gibi olacaktır -

PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10

Hem Pune hem de Nagpur için, madde bir ilaç olduğunda, yerel vergi sıfırdır; Oysa ürün bir bakkal ürünü olduğunda, vergi şehir başıdır. Diğer ürünler için DRL dosyalarına daha fazla kural eklenebilir. Bu sadece örnek bir programdır.

DRL Dosyasından Harici İşlevi çağırın

Burada, DRL dosyanızdaki bir Java dosyasından statik bir işlevi nasıl çağıracağınızı göstereceğiz.

Öncelikle bir sınıf oluşturun HelloCity.java aynı pakette com.sample.

package com.sample;

public class HelloCity {
   public static void writeHello(String name) {
      System.out.println("HELLO " + name + "!!!!!!");
   }
}

Daha sonra, DRL dosyasından writeHello yöntemini çağırmak için DRL dosyasına import deyimini ekleyin. Aşağıdaki kod bloğunda, Pune.drl DRL dosyasındaki değişiklikler sarı ile vurgulanmıştır.

// created on: Dec 24, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;
 
import com.sample.HelloCity;

//declare any global variables here
dialect "java"

rule "Pune Medicine Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE, 
         typeofItem == ItemCity.Type.MEDICINES)
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
      HelloCity.writeHello(item.getPurchaseCity().toString());
end

rule "Pune Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE, 
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(2.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

Programı tekrar çalıştırın ve çıktısı aşağıdaki gibi olacaktır -

HELLO PUNE!!!!!!
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10

Şimdi çıktıdaki fark, Java sınıfındaki statik yöntemin çıktısını gösteren sarı ile işaretlenmiştir.

Java yöntemini çağırmanın avantajı, herhangi bir yardımcı program / yardımcı işlevi Java'da yazabilmemiz ve bunu bir DRL dosyasından çağırabilmemizdir.