On Jun 13, 2008, at 10:52 AM, Rick McGuire wrote:
While looking at some the executeSelectQuery() method in
JpaCmpEngine, I noticed a couple of todo items that I think I'd be
willing to tackle. I do have a couple of questions about how things
work just to make sure I'm understanding things properly.
The first todo is to wrap the result list in a wrapper List can can
do a lazy activation of EntityBean result objects. Am I correct in
assuming that all of the objects in the list will be of the same
type? In other words, if the first result in the list is an
EntityBean, then all of the results are EntityBeans and the list
should be wrappered. Conversely, if the first item is NOT an
EntityBean, then can I assume that the result list can be
immediately returned?
With pure spec defined CMP, yes the collections are always the same
type, but since we allow access to full JPA semantics that is not
guaranteed. In JPA you can have inheritance structures, so for
example, you could query for all vehicles and get back a mixed
collection of Cars and Motorcycles. To make matters worse, we do want
to support the mixing of CMP beans with pure JPA beans in the same
model, which means Car could be a CMP bean and while Motorcycle just a
JPA bean.
The second todo item states "don't activate beans already
activated". How would one detect that situation to bypass the
second activation?
I never figured out a way to do that. One way I can think of is to
maintain a list of all beans activated in the system and which PK they
were assigned during activation. Unfortunately, that would mean we
would once again be double cache CMP engine. The lac of cache in the
JPA CMP engine makes it very simple and efficient, since the entire
cache can be managed by the JPA implementation.
The only other possible implementation I can think of is to add an
additional field to the generated subclass that contains the PK
assigned during activation. Then the engine could check if the new PK
is different and reactivate. This would make the generated class and
the activation logic a bit more complex, but the real pain for me is
it would make supporting direct CMPs where we don't generate a
subclass at all. This is not something we support right now, but
something I'd like to support in the future.
I suggest you attack the streaming result sets first, ignoring the
activation issue, since streaming should have the biggest performance
improvement.
Oh ya, you may want to take a look at CmrSet as it contains logic to
proxy and unproxy CMP beans. Queries are bit more difficult as you
have to support Remote interfaces in addition to Local interfaces, but
I think the same basic logic applies.
-dain