Drools-샘플 Drools 프로그램
이 장에서는 다음 문제 설명에 대한 Drools 프로젝트를 생성합니다.
도시와 상품의 종류 (도시와 상품의 조합)에 따라 해당 도시와 관련된 지방세를 찾으십시오.
Drools 프로젝트를위한 두 개의 DRL 파일이 있습니다. 두 개의 DRL 파일은 고려중인 두 도시 (Pune 및 Nagpur)와 네 가지 유형의 제품 (식료품, 의약품, 시계 및 명품)을 나타냅니다.
두 도시의 의약품에 대한 세금은 0으로 간주됩니다.
식료품의 경우 푸네에서는 Rs 2, Nagpur에서는 Rs 1의 세금을 부과했습니다.
우리는 동일한 판매 가격을 사용하여 다른 산출물을 보여주었습니다. 응용 프로그램에서 모든 규칙이 실행되고 있습니다.
다음은 각 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 파일
앞서 제안한대로 여기에서는 Pune.drl 및 Nagpur.drl의 두 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
Nagpur시의 규칙을 실행하는 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
Pune와 Nagpur 모두 품목이 의약품 인 경우 지방세는 0입니다. 품목이 식료품 제품인 경우 세금은 도시별로 부과됩니다. 다른 제품에 대한 DRL 파일에 더 많은 규칙을 추가 할 수 있습니다. 이것은 단지 샘플 프로그램입니다.
DRL 파일에서 외부 함수 호출
여기서는 DRL 파일 내의 Java 파일에서 정적 함수를 호출하는 방법을 보여줍니다.
우선 수업을 만드세요 HelloCity.java 같은 패키지에 com.sample.
package com.sample;
public class HelloCity {
public static void writeHello(String name) {
System.out.println("HELLO " + name + "!!!!!!");
}
}
그런 다음 DRL 파일에서 import 문을 추가하여 DRL 파일에서 writeHello 메서드를 호출합니다. 다음 코드 블록에서 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 파일에서 동일한 함수를 호출 할 수 있다는 것입니다.