Drools - Chương trình Drools mẫu
Trong chương này, chúng ta sẽ tạo một dự án Drools cho câu lệnh vấn đề sau:
Tùy thuộc vào thành phố và loại sản phẩm (Kết hợp giữa Thành phố và Sản phẩm), hãy tìm hiểu thuế địa phương liên quan đến thành phố đó.
Chúng tôi sẽ có hai tệp DRL cho dự án Drools của chúng tôi. Hai tệp DRL sẽ biểu thị hai thành phố được xem xét (Pune và Nagpur) và bốn loại sản phẩm (hàng tạp hóa, thuốc, đồng hồ và hàng xa xỉ).
Thuế thuốc ở cả hai thành phố được coi là bằng không.
Đối với hàng tạp hóa, chúng tôi đã giả định mức thuế là 2 Rs ở Pune và 1 Rs ở Nagpur.
Chúng tôi đã sử dụng cùng một mức giá bán để chứng minh các đầu ra khác nhau. Lưu ý rằng tất cả các quy tắc đang được kích hoạt trong ứng dụng.
Đây là mô hình để chứa từng itemType -
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;
}
}
Tệp DRL
Như đã đề xuất trước đó, chúng tôi đã sử dụng hai tệp DRL ở đây: Pune.drl và Nagpur.drl.
Pune.drl
Đây là tệp DRL thực thi các quy tắc cho thành phố Pune.
// 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
Đây là tệp DRL thực thi các quy tắc cho thành phố Nagpur.
// 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
Chúng tôi đã viết các tệp DRL dựa trên thành phố, vì nó cung cấp cho chúng tôi khả năng mở rộng để thêm bất kỳ số lượng tệp quy tắc nào sau này nếu các thành phố mới đang được thêm vào.
Để chứng minh rằng tất cả các quy tắc đang được kích hoạt từ các tệp quy tắc của chúng tôi, chúng tôi đã sử dụng hai loại mặt hàng (thuốc và hàng tạp hóa); và thuốc được miễn thuế và hàng tạp hóa bị đánh thuế theo thành phố.
Lớp thử nghiệm của chúng tôi tải các tệp quy tắc, chèn dữ liệu vào phiên và tạo ra kết quả.
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;
}
}
Nếu bạn chạy chương trình này, đầu ra của nó sẽ như sau:
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10
Đối với cả Pune và Nagpur, khi mặt hàng là thuốc, thuế địa phương bằng 0; trong khi khi mặt hàng là hàng tạp hóa, thuế sẽ tính theo thành phố. Các quy tắc khác có thể được thêm vào tệp DRL cho các sản phẩm khác. Đây chỉ là một chương trình mẫu.
Gọi một hàm bên ngoài biểu mẫu một tệp DRL
Ở đây chúng tôi sẽ trình bày cách gọi một hàm tĩnh từ tệp Java trong tệp DRL của bạn.
Trước hết, hãy tạo một lớp HelloCity.java trong cùng một gói com.sample.
package com.sample;
public class HelloCity {
public static void writeHello(String name) {
System.out.println("HELLO " + name + "!!!!!!");
}
}
Sau đó, thêm câu lệnh nhập trong tệp DRL để gọi phương thức writeHello từ tệp DRL. Trong khối mã sau, các thay đổi trong tệp DRL Pune.drl được đánh dấu bằng màu vàng.
// 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
Chạy lại chương trình và kết quả của nó sẽ như sau:
HELLO PUNE!!!!!!
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10
Sự khác biệt bây giờ trong đầu ra được đánh dấu bằng màu vàng, hiển thị đầu ra của phương thức tĩnh trong lớp Java.
Ưu điểm khi gọi một phương thức Java là chúng ta có thể viết bất kỳ tiện ích / hàm trợ giúp nào trong Java và gọi phương thức tương tự từ tệp DRL.