[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