The hierarchical data model is rather unwieldy.

A relational model would have the following entities:
   Person( personId,... )
   Vehicle( vehicleId, make,... )
   Ownership( personId, vehicleId, year )
and it would be quite easy to handle such questions:

   Person( $pid: persondId)
   Ownership( personId == $pid, $vid1: vehicleId )
   Vechicle( vehicleId == $vid1. $make1: make )
   not ( Ownership( personId == $pid, $vid2: vehicleId != $vid1 )
            and
            Vehicle( vehicleId == $vid2, make != $make1 ) )


That said, here's some code to do it in Drools:

$result: PersonData( $id: identifierCode )
Set( count == 1 )
   from accumulate( $vd: VehicleData( ownerIdentifierCode ==

$result.identifierCode )
             init( Set ms = new HashSet() ),
             action( forall( VehicleYearData vyd: $vd.getData() ){
                             forall( VehicleEntity ve: vyd.getVehicleEntity() ){
                                ms.add( ve.getMake() );
                             }
                          } ),
            result( ms ) )

The rule should fire if that person owns cars of just one make; use >1
for the opposite condition.

Untested!

-W




On 14/05/2014, braveheart85 <andrea.pacifico...@gmail.com> wrote:
> Hello,
>
> I'm pretty new to Drools hence i apologize if my question is newbie but i'm
> getting crazy.
> I'm trying to write a functioning query since yesterday without fortune.
> I have data about vehicles owned by person organized for year. My structure
> is:
>
>      VechicleData
>      |___VehicleYearData
>            |____Vehicle
>
> I have inserted in Drools only the root of the hierarchy (VehicleData)
> because insert all objects has been problematic for me. Now i need to check
> if a person has all vehicle of the same make.
> I have tried this:
>
> $result: PersonData( $id: identifierCode )
>       forall
>               (
>                       ($o: VehicleData( ownerIdentifierCode == 
> $result.identifierCode )) &&
>                       ($y: VehicleYearData( ) from $o.data) &&
>                       ($v: VehicleEntity( ) from $y.vehicleEntity)
>               )
>               VehicleEntity( this == $v, make == "BMW" )
>       )
>
> and this:
>
>       PersonData( $id: identifierCode )
>       $list: List( ) from accumulate (
>               (and
>                       $o: VehicleData( ownerIdentifierCode == $id )
>                       $y: VehicleYearData( ) from $o.data
>                       $e: VehicleEntity( ) from $y.vehicleEntity
>               ),
>               collectList( $e )
>       )
>       forall (
>               $v: VehicleEntity( ) from $list
>               VehicleEntity( this == $v, make == "BMW" )
>       )
>
> and many other...
> Someone can help me??
>
> Thank you.
> Andrea
>
>
>
> --
> View this message in context:
> http://drools.46999.n3.nabble.com/forall-with-nested-collections-tp4029572.html
> Sent from the Drools: User forum mailing list archive at Nabble.com.
> _______________________________________________
> rules-users mailing list
> rules-users@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to