当前位置: 首页 > 知识库问答 >
问题:

drools中的列表验证

颛孙钱青
2023-03-14

这里有一个drools新手,下面是java类结构。

public class Person {
 List<PersonAddress> personAddress;
}

public enum AddressType {
 CURRENT, PREVIOUS;
}
public class PersonAddress{    
  Address address;
  AddressType type
  Integer timeAtAddress;        
}

public class Address {
String city;
String country;
String street;
}

我必须编写一些代码来验证drools中的PersonalAddress。规则1。如果person有PersonalAddress实例列表,如果其中一个是AddressType==当前和timeAtAddress

规则2。如果上述条件为true,那么我想获取PersonalAddress实例,其中AddressType==PREVIOUS,

Drools版本5.5.0。最终的

Java 1.7

可以使用函数

这是我尝试过的,但它不起作用

  function boolean isPreviousAddressExist(java.util.List list) {
        if(list.isEmpty()) {
            return false;
        }
        boolean validRecordFound = false;
        for(int addressIndex = 0; addressIndex < list.size(); addressIndex++) {
            PersonAddress pa = (PersonAddress)list.get(addressIndex);
            if(AddressType.CURRENT.equals(pa.getAddressType()) && pa.getTimeAtAddress() != null && pa.getTimeAtAddress() < 3) {
                validRecordFound =  true;
                break;     
            }
        }
        boolean previousRecordFound = false;
        if(validRecordFound) {
           for(int addressIndex = 0; addressIndex < list.size(); addressIndex++) {
                PersonAddress pa = (PersonAddress)list.get(addressIndex);
                if(AddressType.PREVIOUS.equals(pa.getAddressType())) {
                    previousRecordFound =  true;
                    break;
                }
            }
        } else {
            previousRecordFound = true;
        }
        return previousRecordFound;
    }

rule "Previous-Physical-Home Address is required for Time at Current-Physical-Home"
when

    $quotation:Quotation()        
    eval(!isPreviousAddressExist($quotation.getApplicantList()))   
then   
    runningResults.addRunningResult(new BusinessRuleRunningResult(null,  " A Previous physical Home Address is required.", false));
end

共有1个答案

何睿范
2023-03-14

以下是两条规则,使用扩展来避免重复:

rule "brief CURRENT"
when
  Person( $name: name, $pa: personAddress )
  PersonAddress( type == AddressType.CURRENT, timeAtAddress < 3 ) from $pa
then
end
rule "no PREVIOUS"
extends "brief CURRENT"
when
  not PersonAddress( type == AddressType.PREVIOUS ) from $pa
then
  System.out.println( "invalid. " + $name );
end
rule "has PREVIOUS"
extends "brief CURRENT"
when
  $ppa: PersonAddress( type == AddressType.PREVIOUS ) from $pa
then
  System.out.println( "valid. " + $name +
                      " at " + $ppa.getAddress().getCity() );
end

这假设每个人只有一个电流;否则,规则可能会不止一次失效。使用“存在”来避免。

我没有试图在你的代码中找到bug,因为“不工作”太含糊了。无论如何,如果您使用的是规则,那么编写过程代码进行检查有什么意义?

 类似资料:
  • 我正在享受Optaplanner的旅程。Java不是我的“母语”,但令我惊讶的是(陡峭?)Optaplanner学习曲线 到目前为止,我得到了什么:我已经制作了一个带有必要类的项目。为了回答我的问题,我将简化为:一个类、一个类、一个类和类,我想在其中获得我完美的Opta计划时间表。 我的员工类有一个变量

  • 我是口水新手,我成功地创建了一个使用创建的规则的工作应用程序。我有一个简单的类,其中包含两个变量和。 我的规则实施为 如果用户为类型或语言插入一些奇怪的值,我有一个返回错误的特定规则。但最重要的是,我想知道是否可以返回插入规则中的所有可能变量的列表:例如和。

  • 我正在测试对象列表的长度。我正在遵循我在Drools的旧版本(7.44和更早版本)中使用的模式,但它似乎不再起作用了。 这是我的规则: 我传递到规则中的Person实例有3项: ... BookEvent类型为“借用”。我已经通过IDE中的调试会话确认了这两个问题。 但是,该规则不会触发。 我使用的是Drools 7.59.0。Final,特别是依赖项(因为我更喜欢mvel。)也Java17(op

  • 场景如下: 我有一个java pojo类,具有2个变量和以及适当的getter和setter。我正在使用决策表流,我想要: 条件:当类型设置为“1”时 操作:调用name类的setName setter,并从excel中设置适当的参数 现在,我想在java中访问name的这个集值。 这就是我所做的: Name.java- MainClass.java-这有口水实现!! 决策表e:: http://

  • 我在试着处理drools中的列表。我正在传递一个请求,其中包含一个购买列表。我想做几个规则,包括检查大小是否正确,然后如果所有元素都相同,如果所有购买都经过授权。。。我有以下代码,但在使用列表时遇到了问题。这是正确的方法吗?尤其是在检查尺寸时?

  • 使用: 它按照预期工作,所以Spring显然不喜欢验证事物列表(尝试使用数组,但也不起作用)。 有人知道缺了什么吗?