-
Bug
-
Resolution: Done
-
Major
-
None
-
7.51.0.Final, 7.58.0.Final
-
None
-
2021 Week 34-36 (from Aug 23)
-
Undefined
-
NEW
-
NEW
Issue was introduced in 5.51.0.Final and stays with the latest version, 5.50.0.Final passes the test. Issue is reproducible only with mvel dialect.
Most likely this is related to the fix of RHDM-1552
ModifyTest.java
public class ModifyTest { @Test public void testModify() { ... session.insert(new Passport("CA-SARAH-1", LocalDate.of(2017, 1, 17))); session.insert(new VisaApplication(1, "CA-SARAH-1")); session.fireAllRules(); assertTrue(session.getObjects((Object object) -> { return object instanceof String; }).isEmpty()); } }
rules
dialect "mvel" import Passport; import Validation; import VisaApplication; rule "Expired passport" salience 3 when $passport: Passport( expired == true ) then System.out.println( $passport + " is INVALID because it is expired" ); modify($passport) { setValidation( Validation.FAILED ), setCause( "passport is expired" ) } end rule "Invalidate visa application with invalid passport" salience 2 when $passport: Passport( validation == Validation.FAILED ) $visaApplication: VisaApplication( passportNumber == $passport.passportNumber, validation != Validation.FAILED ) then System.out.println( "Set " + $visaApplication + " invalid as " + $passport + " hasn't passed validation"); modify($visaApplication) { setValidation( Validation.FAILED ) } end rule "Set application without validation info as passed" salience 1 when $visaApplication: VisaApplication( validation == Validation.UNKNOWN ) then System.out.println( $visaApplication + " is without validation info, consider OK for now" ); modify($visaApplication) { setValidation( Validation.PASSED ) } insert ("fail"); end
Passport.java
import static Validation.UNKNOWN; import static java.lang.String.format; import java.time.LocalDate; public class Passport { private String passportNumber; private LocalDate expiresOn; private Validation validation = UNKNOWN; private String cause = ""; public Passport(String passportNumber, LocalDate expiresOn) { this.passportNumber = passportNumber; this.expiresOn = expiresOn; } public boolean isExpired() { return expiresOn.isBefore(LocalDate.now()); } public String getPassportNumber() { return passportNumber; } public Validation getValidation() { return validation; } public void setValidation(Validation validation) { this.validation = validation; } public String getCause() { return cause; } public void setCause(String cause) { this.cause = cause; } @Override public String toString() { return format("Passport[no:%s]", passportNumber); } }
VisaApplication.java
import static Validation.UNKNOWN; public class VisaApplication { private int applicationId; private String passportNumber; private Validation validation = UNKNOWN; public VisaApplication(int applicationId, String passportNumber) { this.applicationId = applicationId; this.passportNumber = passportNumber; } public String getPassportNumber() { return passportNumber; } public Validation getValidation() { return validation; } public void setValidation(Validation validation) { this.validation = validation; } @Override public String toString() { return "VisaApplication(#" + applicationId + ", pass:" + passportNumber + ")"; } }
Validation.java
public enum Validation { PASSED, FAILED, UNKNOWN }