[rules-users] Why is a flat object recommended?

Greg Barton greg_barton at yahoo.com
Fri Aug 14 02:36:12 EDT 2009


I would hesitate using "from" for accessing nested structures for performance reasons.  See the attached project:

$ java -jar target/DroolsNestedTest-1.0.jar from.drl
Time: 980ms
BAR Duplicates: 58
FOO Duplicates: 38

$ java -jar target/DroolsNestedTest-1.0.jar reference.drl
Time: 36ms
BAR Duplicates: 48
FOO Duplicates: 38

Note the 27x performance difference. :)

In this case it's because I used two "from" statements in a rule, but this is a pretty common occurrence.  Just try upping the COUNT parameter in DroolsTest.  Prepare to wait a while for the from.drl to finish.  The reference.drl does just fine.  

So, to help out your business users, you might dry a domain specific language.  You can generate the nested reference == just as easily as a "from" expression.

--- On Thu, 8/13/09, Libor Nenadál <libor.nenadal at gmail.com> wrote:

> From: Libor Nenadál <libor.nenadal at gmail.com>
> Subject: Re: [rules-users] Why is a flat  object recommended?
> To: rules-users at lists.jboss.org
> Date: Thursday, August 13, 2009, 9:56 AM
> 
> 
> Mark Proctor wrote:
> > 
> > We can exploit cartesian products and indexing for ==
> constraints. If 
> > its a nested model we have to iterate over all
> possible instances. The 
> > other problem is if the nested model changes the
> engine has no idea this 
> > has happened, which if you are not careful can lead to
> data integrity 
> > issues.
> > 
> I think that plain flat model is too limited for real life.
> In fact in most
> situations you just cannot avoid nesting.
> For example when I try to search for cars with 4 cylinder
> engine the best
> approach I found is:
> 
> rule "get 4 cylinder cars"
>   when
>     Car ( $e: engine != null ) // car without
> engine? where are we? :)
>     Engine ( cylinderCount == 4 ) from $e
>   then
>     System.out.println("Found 4 cylinder car.");
> end
> 
> This should be quite effective. I doubt that the following
> solution with
> cartesian product has the same complexity:
> 
> rule "get 4 cylinder cars"
>   when
>     $e: Engine ( cylinderCount == 4 )
>     Car ( engine == $e )
>   then
>     System.out.println("Found 4 cylinder car.");
> end
> 
> Using approach Car ( engine.cylinderCount == 4 ) tends to
> raise
> NullPointerException and I had problems with assigning the
> cylinderCount to
> variable so this was not a way to go for me.
> 
> But this is not much a problem for me as I am a programmer
> and I can
> understand the rule language and data structures. But when
> business users
> are to edit rules (using Guvnor as the tool of choice) we
> come to troubles.
> I think that guided editor for rules does not allow "from".
> More importantly
> - can you create such a structure for a test scenario? I
> failed. :(
> -- 
> View this message in context: http://www.nabble.com/Why-is-a-flat--object-recommended--tp15567690p24954944.html
> Sent from the drools - user mailing list archive at
> Nabble.com.
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>


      
-------------- next part --------------
A non-text attachment was scrubbed...
Name: DroolsNested.tar.gz
Type: application/x-gzip
Size: 5326 bytes
Desc: not available
Url : http://lists.jboss.org/pipermail/rules-users/attachments/20090813/6de5c71f/attachment.gz 


More information about the rules-users mailing list