drools php,Drools简单项目

在本章中,我们将创建一个Drools项目下列问题说明:

根据不同的城市和各类产品(城和产品的组合),找出当地税务相关的城市。

我们将有两个DRL文件为我们的Drools项目。这两个文件的DRL将意味着两个城市在考虑(Pune和Nagpur)和四类产品(杂货,药品,手表和奢侈品)。

在这两个城市的药品税被认为是零。

杂货,我们假设了2卢比在Pune和1卢比在Nagpur的一种税。

我们已经使用了相同的售价以证明不同的输出。请注意,所有的规则都被触发了应用。

这里是模型用来保存每个项目类型:

packagecom.sample;importjava.math.BigDecimal;publicclassItemCity{publicenumCity{PUNE,NAGPUR}publicenumType{GROCERIES,MEDICINES,WATCHES,LUXURYGOODS}privateCitypurchaseCity;privateBigDecimalsellPrice;privateTypetypeofItem;privateBigDecimallocalTax;publicCitygetPurchaseCity(){returnpurchaseCity;}publicvoidsetPurchaseCity(CitypurchaseCity){this.purchaseCity=purchaseCity;}publicBigDecimalgetSellPrice(){returnsellPrice;}publicvoidsetSellPrice(BigDecimalsellPrice){this.sellPrice=sellPrice;}publicTypegetTypeofItem(){returntypeofItem;}publicvoidsetTypeofItem(TypetypeofItem){this.typeofItem=typeofItem;}publicBigDecimalgetLocalTax(){returnlocalTax;}publicvoidsetLocalTax(BigDecimallocalTax){this.localTax=localTax;}}

DRL文件

正如前面所说,我们已经用了两个DRL文件在这里:Pune.drl 和Nagpur.drl.

Pune.drl

这是对Pune执行规则的DRL文件。

// created on: Dec 24, 2014packagedroolsexample// list any import classes here.importcom.sample.ItemCity;importjava.math.BigDecimal;// declare any global variables heredialect"java"rule"Pune Medicine Item"whenitem:ItemCity(purchaseCity==ItemCity.City.PUNE,typeofItem==ItemCity.Type.MEDICINES)thenBigDecimaltax=newBigDecimal(0.0);item.setLocalTax(tax.multiply(item.getSellPrice()));endrule"Pune Groceries Item"whenitem:ItemCity(purchaseCity==ItemCity.City.PUNE,typeofItem==ItemCity.Type.GROCERIES)thenBigDecimaltax=newBigDecimal(2.0);item.setLocalTax(tax.multiply(item.getSellPrice()));end

Nagpur.drl

这是对Nagpur市执行规则的DRL文件。

// created on: Dec 26, 2014packagedroolsexample// list any import classes here.importcom.sample.ItemCity;importjava.math.BigDecimal;// declare any global variables heredialect"java"rule"Nagpur Medicine Item"whenitem:ItemCity(purchaseCity==ItemCity.City.NAGPUR,typeofItem==ItemCity.Type.MEDICINES)thenBigDecimaltax=newBigDecimal(0.0);item.setLocalTax(tax.multiply(item.getSellPrice()));endrule"Nagpur Groceries Item"whenitem:ItemCity(purchaseCity==ItemCity.City.NAGPUR,typeofItem==ItemCity.Type.GROCERIES)thenBigDecimaltax=newBigDecimal(1.0);item.setLocalTax(tax.multiply(item.getSellPrice()));end

我们已经写了基于城市的DRL文件,因为它为我们提供了可扩展性,以在以后添加任意数量的规则文件,如果被添加了新的城市。

为了证明所有的规则都可以从我们的规则文件触发,我们已经使用了两种类型的产品(药物和杂货); 药是免税和杂货征税按城市。

我们的测试类加载规则文件,插入事实到会话,并产生输出。

Droolstest.java

packagecom.sample;importjava.math.BigDecimal;importorg.drools.KnowledgeBase;importorg.drools.KnowledgeBaseFactory;importorg.drools.builder.KnowledgeBuilder;importorg.drools.builder.KnowledgeBuilderError;importorg.drools.builder.KnowledgeBuilderErrors;importorg.drools.builder.KnowledgeBuilderFactory;importorg.drools.builder.ResourceType;importorg.drools.io.ResourceFactory;importorg.drools.runtime.StatefulKnowledgeSession;importcom.sample.ItemCity.City;importcom.sample.ItemCity.Type;/* This is a sample class to launch a rule. */publicclassDroolsTest{publicstaticfinalvoidmain(String[]args){try{// load up the knowledge baseKnowledgeBasekbase=readKnowledgeBase();StatefulKnowledgeSessionksession=kbase.newStatefulKnowledgeSession();ItemCityitem1=newItemCity();item1.setPurchaseCity(City.PUNE);item1.setTypeofItem(Type.MEDICINES);item1.setSellPrice(newBigDecimal(10));ksession.insert(item1);ItemCityitem2=newItemCity();item2.setPurchaseCity(City.PUNE);item2.setTypeofItem(Type.GROCERIES);item2.setSellPrice(newBigDecimal(10));ksession.insert(item2);ItemCityitem3=newItemCity();item3.setPurchaseCity(City.NAGPUR);item3.setTypeofItem(Type.MEDICINES);item3.setSellPrice(newBigDecimal(10));ksession.insert(item3);ItemCityitem4=newItemCity();item4.setPurchaseCity(City.NAGPUR);item4.setTypeofItem(Type.GROCERIES);item4.setSellPrice(newBigDecimal(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(Throwablet){t.printStackTrace();}}privatestaticKnowledgeBasereadKnowledgeBase()throwsException{KnowledgeBuilderkbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();kbuilder.add(ResourceFactory.newClassPathResource("Pune.drl"),ResourceType.DRL);kbuilder.add(ResourceFactory.newClassPathResource("Nagpur.drl"),ResourceType.DRL);KnowledgeBuilderErrorserrors=kbuilder.getErrors();if(errors.size()>0){for(KnowledgeBuilderErrorerror:errors){System.err.println(error);}thrownewIllegalArgumentException("Could not parse knowledge.");}KnowledgeBasekbase=KnowledgeBaseFactory.newKnowledgeBase();kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());returnkbase;}}

如果你运行这个程序,它的输出将如下所示:

PUNE 0

PUNE 20

NAGPUR 0

NAGPUR 10

对于这两种Pune的和Nagpur,当时该项目是一个医药,当地税务为零;而当该项目是一个杂货店的产品,该税是按城市的。更多的规则可以在DRL文件的其他产品中添加。这仅仅是一个示例程序。

调用外部函数形成DRL文件

在这里,我们将演示如何从DRL文件的Java文件调用静态函数。

首先,创建一个类HelloCity.java在同一个包com.sample中。

packagecom.sample;publicclassHelloCity{publicstaticvoidwriteHello(Stringname){System.out.println("HELLO "+name+"!!!!!!");}}

此后,添加import语句在DRL文件来调用从DRL文件writeHello方法。在下面的代码块中,修改DRL文件Pune.drl以黄色突出显示。

// created on: Dec 24, 2014packagedroolsexample// list any import classes here.importcom.sample.ItemCity;importjava.math.BigDecimal;importcom.sample.HelloCity;//declare any global variables heredialect"java"rule"Pune Medicine Item"whenitem:ItemCity(purchaseCity==ItemCity.City.PUNE,typeofItem==ItemCity.Type.MEDICINES)thenBigDecimaltax=newBigDecimal(0.0);item.setLocalTax(tax.multiply(item.getSellPrice()));HelloCity.writeHello(item.getPurchaseCity().toString());endrule"Pune Groceries Item"whenitem:ItemCity(purchaseCity==ItemCity.City.PUNE,typeofItem==ItemCity.Type.GROCERIES)thenBigDecimaltax=newBigDecimal(2.0);item.setLocalTax(tax.multiply(item.getSellPrice()));end

再次运行程序,其输出将如下所示:

HELLO PUNE!!!!!!

PUNE 0

PUNE 20

NAGPUR 0

NAGPUR 10

现在,在输出的差被标记为黄色,显示在Java类的静态方法的输出。

其优点调用Java方法是,我们可以用Java编写的任何效用/辅助函数,并从DRL文件调用相同。

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值