2014-09-08 3 views
0

A drools новичок здесь, Ниже приведена структура класса java.Подтверждение списка в drools

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; 
} 

Мне нужно написать код для проверки PersonAddress в drools. Правило 1. Если у человека есть список экземпляров PersonAddress, если один из них является AddressType == CURRENT и timeAtAddress < 3, то я хочу найти, содержит ли этот список адрес, где AddressType == PREVIOUS.

Правило 2. Если это условие истинно, то я хочу, чтобы получить экземпляр PersonAddress где AddressType == Назад,

Drools версия 5.5.0.Final,

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

Здесь оба правила, с помощью extends избежать repetirion:

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 

Это предполагает, что существует только один ТОК на человека; если нет, правила могут срабатывать более одного раза. Используйте exist, чтобы этого избежать.

Я не пытался найти ошибку в вашем коде, так как «не работает» слишком расплывчато. В любом случае, если вы используете правила, в чем смысл написания процедурного кода, выполняющего проверки?

+0

Большое спасибо, это то, что я точно хотел. Как я уже сказал, iam новичок, чтобы слюни, наше приложение является полным j2ee-приложением. Один из наших клиентов попросил нас сделать некоторую проверку с помощью слюни – bluelabel

+0

Дорогой @laune, у меня есть еще один вопрос, связанный с drools, было задано [здесь] (здесь) http://stackoverflow.com/questions/25735964/validation-in-drools), оцените, если вы можете помочь мне в этом – bluelabel

+0

@laune, см. этот вопрос - http://stackoverflow.com/questions/32201760/ ArrayList-размерного не-рабочего правильно-в-Drools-6-2 – Kumar

Смежные вопросы