[jboss-jira] [JBoss JIRA] (DROOLS-5019) Unexpected rule match with forall pattern

Matteo Casalino (Jira) issues at jboss.org
Thu Feb 6 10:19:00 EST 2020


    [ https://issues.redhat.com/browse/DROOLS-5019?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13965593#comment-13965593 ] 

Matteo Casalino commented on DROOLS-5019:
-----------------------------------------

Notice this is really the smallest example we managed to come up with: in particular we are not able to reproduce with less than 3 rules.

> Unexpected rule match with forall pattern
> -----------------------------------------
>
>                 Key: DROOLS-5019
>                 URL: https://issues.redhat.com/browse/DROOLS-5019
>             Project: Drools
>          Issue Type: Bug
>          Components: core engine
>    Affects Versions: 7.29.0.Final, 7.30.0.Final, 7.31.0.Final, 7.32.0.Final
>            Reporter: Matteo Casalino
>            Assignee: Mario Fusco
>            Priority: Major
>         Attachments: forall-unwanted-match.tgz
>
>
> As of Drools 7.29.0.Final, rules with a forall pattern sometimes won't match as expected.
> In particular we notice that adding an extra (apparently unrelated) rule causes the rule containing forall to fire when it is not expected to. No inference is involved.
> Example of DRL behaving as expected:
> {noformat}
> package org.drools.reproducer
> declare Request
>     skippne : boolean
>     pneeligid : String
>     applicableAirlines : java.util.List
>     officeid : String
> end
> declare Flight
>     id : int
>     marketingairlinecode : String
>     cabin : String
> end
> declare Offer
>     id : int
>     flightIds : java.util.List
>     boundIds : java.util.List
>     passengerId : int
>     notificationFlightId : int
>     stayDurationBeforeDeparture : int
> end
> declare Passenger
>     id : int
> end
> rule "53_54_55_NotificationTestInterlineAllFlight"
> when
>     Offer( $thisOfferId: id, $offerFlightIds : flightIds, $offerBoundIds : boundIds, $thisPassengerId: passengerId, $thisNotificationFlightId: notificationFlightId )
>     Flight( id == $thisNotificationFlightId, $offerFlightIds contains id )
>     Passenger( id == $thisPassengerId )
>     Request( $skippne: skippne, pneeligid == "100000053" || skippne, $applicableAirlines: applicableAirlines )
>     forall(
>     $fact : Flight( $applicableAirlines contains marketingairlinecode )
>     Flight( this == $fact, cabin == "Y" )   )
> then
> System.out.println("53_54_55_NotificationTestInterlineAllFlight");
> end
> rule "2_SmsNotificationCheckinTestFNDCall"
> when
>     Offer( $thisOfferId: id, $thisPassengerId: passengerId, $thisNotificationFlightId: notificationFlightId, $offerFlightIds : flightIds, $offerBoundIds : boundIds, $stayDurationBeforeDeparture: stayDurationBeforeDeparture )
>     Flight( id == $thisNotificationFlightId, $offerFlightIds contains id, $thisFlightId: id )
>     Passenger( id == $thisPassengerId )
>     Request( $skippne: skippne, pneeligid == "checkin" || skippne, $applicableAirlines: applicableAirlines )
>     Flight( id == $thisNotificationFlightId, $offerFlightIds contains id, $applicableAirlines contains marketingairlinecode, cabin == "L" )
> then
> System.out.println("2_SmsNotificationCheckinTestFNDCall");
> end
> {noformat}
> Example of DRL not behaving as expected (the 53_54_55_NotificationTestInterlineAllFlight rule will now fire when the forall clause is not satisfied):
> {noformat}
> package org.drools.reproducer
> declare Request
>     skippne : boolean
>     pneeligid : String
>     applicableAirlines : java.util.List
>     officeid : String
> end
> declare Flight
>     id : int
>     marketingairlinecode : String
>     cabin : String
> end
> declare Offer
>     id : int
>     flightIds : java.util.List
>     boundIds : java.util.List
>     passengerId : int
>     notificationFlightId : int
>     stayDurationBeforeDeparture : int
> end
> declare Passenger
>     id : int
> end
> rule "53_54_55_NotificationTestInterlineAllFlight"
> when
>     Offer( $thisOfferId: id, $offerFlightIds : flightIds, $offerBoundIds : boundIds, $thisPassengerId: passengerId, $thisNotificationFlightId: notificationFlightId )
>     Flight( id == $thisNotificationFlightId, $offerFlightIds contains id )
>     Passenger( id == $thisPassengerId )
>     Request( $skippne: skippne, pneeligid == "100000053" || skippne, $applicableAirlines: applicableAirlines )
>     forall(
>     $fact : Flight( $applicableAirlines contains marketingairlinecode )
>     Flight( this == $fact, cabin == "Y" )   )
> then
> System.out.println("53_54_55_NotificationTestInterlineAllFlight");
> end
> rule "2_SmsNotificationCheckinTestFNDCall"
> when
>     Offer( $thisOfferId: id, $thisPassengerId: passengerId, $thisNotificationFlightId: notificationFlightId, $offerFlightIds : flightIds, $offerBoundIds : boundIds, $stayDurationBeforeDeparture: stayDurationBeforeDeparture )
>     Flight( id == $thisNotificationFlightId, $offerFlightIds contains id, $thisFlightId: id )
>     Passenger( id == $thisPassengerId )
>     Request( $skippne: skippne, pneeligid == "checkin" || skippne, $applicableAirlines: applicableAirlines )
>     Flight( id == $thisNotificationFlightId, $offerFlightIds contains id, $applicableAirlines contains marketingairlinecode, cabin == "L" )
> then
> System.out.println("2_SmsNotificationCheckinTestFNDCall");
> end
> rule "3_XmlNotificationCheckinTestFNDCall"
> when
>     Offer( $thisOfferId: id, $thisPassengerId: passengerId, $thisNotificationFlightId: notificationFlightId, $offerFlightIds : flightIds, $offerBoundIds : boundIds, $stayDurationBeforeDeparture: stayDurationBeforeDeparture )
>     Flight( id == $thisNotificationFlightId, $offerFlightIds contains id, $thisFlightId: id )
>     Passenger( id == $thisPassengerId )
>     Request( $skippne: skippne, pneeligid == "checkin" || skippne, $applicableAirlines: applicableAirlines )
>     Flight( id == $thisNotificationFlightId, $offerFlightIds contains id, $applicableAirlines contains marketingairlinecode, cabin == "Q" )
> then
> System.out.println("3_XmlNotificationCheckinTestFNDCall");
> end
> {noformat}
> The issue does not occur when using Drools <= 7.28.0.Final.



--
This message was sent by Atlassian Jira
(v7.13.8#713008)


More information about the jboss-jira mailing list