Drools - โปรแกรม Drools ตัวอย่าง
ในบทนี้เราจะสร้างโครงการ Drools สำหรับคำชี้แจงปัญหาต่อไปนี้ -
ขึ้นอยู่กับเมืองและประเภทของผลิตภัณฑ์ (การรวมกันของเมืองและผลิตภัณฑ์) ให้ค้นหาภาษีท้องถิ่นที่เกี่ยวข้องกับเมืองนั้น ๆ
เราจะมีไฟล์ DRL สองไฟล์สำหรับโครงการ Drools ของเรา ไฟล์ DRL สองไฟล์จะมีความหมายถึงสองเมืองที่พิจารณา (ปูนและนาคปุระ) และผลิตภัณฑ์สี่ประเภท (ของชำยานาฬิกาและสินค้าฟุ่มเฟือย)
ภาษียาในทั้งสองเมืองถือเป็นศูนย์
สำหรับร้านขายของชำเราได้เรียกเก็บภาษี Rs 2 ใน Pune และ Rs 1 ใน Nagpur
เราใช้ราคาขายเดียวกันเพื่อแสดงผลลัพธ์ที่แตกต่างกัน โปรดทราบว่ากฎทั้งหมดจะเริ่มทำงานในแอปพลิเคชัน
นี่คือโมเดลที่จะถือแต่ละ 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;
}
}
ไฟล์ DRL
ตามที่แนะนำไว้ก่อนหน้านี้เราได้ใช้ไฟล์ DRL สองไฟล์ที่นี่: Pune.drl และ Nagpur.drl
Pune.drl
นี่คือไฟล์ DRL ที่ดำเนินการตามกฎสำหรับเมืองปูเน่
// 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
นี่คือไฟล์ DRL ที่ดำเนินการตามกฎสำหรับเมืองนาคปุระ
// 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 ตามเมืองเนื่องจากช่วยให้เราสามารถขยายไฟล์กฎได้ในภายหลังหากมีการเพิ่มเมืองใหม่
เพื่อแสดงให้เห็นว่ากฎทั้งหมดถูกทริกเกอร์จากไฟล์กฎของเราเราได้ใช้รายการสองประเภท (ยาและของชำ) และยาปลอดภาษีและร้านขายของชำจะถูกเก็บภาษีตามเมือง
ชั้นทดสอบของเราโหลดไฟล์กฎแทรกข้อเท็จจริงลงในเซสชันและสร้างผลลัพธ์
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;
}
}
หากคุณรันโปรแกรมนี้ผลลัพธ์จะเป็นดังนี้ -
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10
สำหรับทั้งปูนและนาคปุระเมื่อสินค้าเป็นยาภาษีท้องถิ่นจะเป็นศูนย์ ในขณะที่สินค้านั้นเป็นสินค้าอุปโภคบริโภคภาษีจะเป็นไปตามเมือง คุณสามารถเพิ่มกฎเพิ่มเติมในไฟล์ DRL สำหรับผลิตภัณฑ์อื่น ๆ นี่เป็นเพียงตัวอย่างโปรแกรม
เรียกฟังก์ชันภายนอกในรูปแบบไฟล์ DRL
ที่นี่เราจะสาธิตวิธีการเรียกใช้ฟังก์ชันคงที่จากไฟล์ Java ภายในไฟล์ DRL ของคุณ
ก่อนอื่นสร้างคลาส HelloCity.java ในแพ็คเกจเดียวกัน com.sample.
package com.sample;
public class HelloCity {
public static void writeHello(String name) {
System.out.println("HELLO " + name + "!!!!!!");
}
}
หลังจากนั้นให้เพิ่มคำสั่งนำเข้าในไฟล์ DRL เพื่อเรียกใช้เมธอด writeHello จากไฟล์ DRL ในบล็อกโค้ดต่อไปนี้การเปลี่ยนแปลงในไฟล์ DRL Pune.drl จะถูกเน้นด้วยสีเหลือง
// 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
เรียกใช้โปรแกรมอีกครั้งและผลลัพธ์จะเป็นดังนี้ -
HELLO PUNE!!!!!!
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10
ตอนนี้ความแตกต่างในเอาต์พุตถูกทำเครื่องหมายด้วยสีเหลืองซึ่งแสดงเอาต์พุตของวิธีการแบบคงที่ในคลาส Java
ข้อดีในการเรียกเมธอด Java คือเราสามารถเขียนยูทิลิตี้ / ฟังก์ชันตัวช่วยใด ๆ ใน Java และเรียกสิ่งเดียวกันจากไฟล์ DRL