drools - 如何迭代 drools 文件中的 List<HashMap> 并更新 Hash Map 对象并返回更新后的 List

标签 drools

面临 drl 文件中列表迭代的问题。我需要检索每个 HashMap 对象并检查“Issue”键。如果“issue”的值不为空,则需要为“alert”键添加一个值。

public class ReservationAlerts {

       public enum AlertType {
            RESERVATIONDETAILSRESPONSE
        }

        @SuppressWarnings("rawtypes")
        private List<HashMap> reservationMap;

        @SuppressWarnings("rawtypes")
        public List<HashMap> getReservationMap() {
            return reservationMap;
        }

        @SuppressWarnings("rawtypes")
        public void setReservationMap(List<HashMap> reservationMap) {
            this.reservationMap = reservationMap;
        }
        }

主要Java程序:

DroolsTest.java
public class DroolsTest {
   @SuppressWarnings("rawtypes")
public static final void main(String[] args) {
      try {

         // load up the knowledge base
         KnowledgeBase kbase = readKnowledgeBase();
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

         ReservationAlerts rAlerts = new ReservationAlerts();
         List<HashMap> hashMapList = new ArrayList<>();
         HashMap<String, String> hMap = new HashMap<>();
         hMap.put("rId", "101");
         hMap.put("fName", "ABC");
         hMap.put("lName", "DEF");
         hMap.put("issue", "1qaz");
         hMap.put("alert", "");
         hashMapList.add(hMap);

         HashMap<String, String> hMapI = new HashMap<>();
         hMapI.put("rId", "102");
         hMapI.put("fName", "GHI");
         hMapI.put("lName", "JKL");
         hMapI.put("issue", "");
         hMapI.put("alert", "");
         hashMapList.add(hMapI);
         rAlerts.setReservationMap(hashMapList);

         System.out.println("**********BEFORE************");
         System.out.println(hMap.keySet());
         System.out.println("****************************");
         System.out.println(hMapI.keySet());
         System.out.println("****************************");

         ksession.insert(rAlerts);
         ksession.fireAllRules();
.............

需要更新HashMap并从drl文件返回更新后的List。任何人都可以帮助我吗?

Drool File being triggered from Java File
    Reservations.drl

    import com.dwh.poc.ReservationAlerts;
    import java.util.List;
    import java.util.HashMap;
    import java.util.Iterator;

    // declare any global variables here
    dialect "java"
    rule "Reservation Alert"
       // Retrieve List from ReservationAlerts
       when
          $rAlerts : ReservationAlerts()
          $alertsMapList : List() from $rAlerts.reservationMap

       then
       // Iterate List and retrieve HashMap object
       for(Iterator it = $alertsMapList.iterator();it.hasNext();) {
          $alertMap : it.next();
       }

最佳答案

规则中的 from 将自动循环遍历 $rAlerts.reservationMap 返回的列表。这意味着您需要在 from 左侧使用的模式是 Map 而不是 List。 一旦有了 Map 模式,您就可以添加有关“issue”键的约束。

尝试这样的事情:

rule "Reservation Alert"
when
    $rAlerts : ReservationAlerts()
    $map : Map(this["issue"] != "") from $rAlerts.reservationMap
then
    $map.put("alert", "XXXX");
end

希望对你有帮助

关于drools - 如何迭代 drools 文件中的 List<HashMap> 并更新 Hash Map 对象并返回更新后的 List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34547067/

相关文章:

maven - 流口水 6.4 KieScanner : How create and add Jar with rules in Maven?

java - 如何将 Java 静态方法导入 Drools 文件?

java - 如何在不调用规则的情况下测试 drool 文件中存在的函数?

java - 如何根据逻辑动态生成前端验证

java - 如何在Drools 5.5中指定列表的类型?

java - 如何从 S-RAMP 检索文档?

java - KieScanner 不在运行时更新 KieSessions

java - OptaPlanner 了解规则

java - 电子表格决策可以被打破吗?

drools - 比较 Drool 5.5 中的字符串值字段