Hmm.
Alright, answering my own questions again, in case anybody/I looks at the mailing list archives in
future.
Without conditionals (like "fieldA = 'SOME LITERAL') in table joiners, I have to fall back on a
huge cross-product.
While a huge and indiscriminately-built cross-product does work for my query, the huge
cross-product is semantically wrong/incomplete. In other words, my query is needed to make the
cross-product's definition complete. Obviously, any errors in the query will completely change the
semantics for the cross-product.
Hopefully RDBMSs optimize correctly when joiner conditionals are put into the "WHERE" clause. I
would guess so, since such optimization is straightforward. If that isn't the case, I'll have to
fall back on generating full lists (rather than using EntityListIterator).
Jonathon
Jonathon -- Improov wrote:
David,
Yeah, I would've thought that too, definitions should model only static
structure.
Given my first example, I would like to do a query like "find a Group
that has all 3 kinds of members (LEADER, VICE, MEMBER)".
Or even more complex: "find a Group where a/the leader's name is like
Blah, a/the vice's name is like Bleh, and a/the member's name is like
Bluh".
I've having difficulty putting that into a view-entity and generating a
resultant ListIterator with GenericDelegator.
Help? Thanks!
Jonathon
David E Jones wrote:
In general entity and view entity definitions are meant to model
structure, not query constraints. Just add your desired constraints to
the EntityCondition passed into the findByCondition call (or Map for
findByAnd or whatever).
-David
Jonathon -- Improov wrote:
Hi Rodrigo,
Are you absolutely sure that works?
First, your suggestion throws an exception. Note that there is no
such field as Member.leaderId.
Second, do take a look at SqlJdbcUtil.java method makeFromClause().
That's where you'll see the joins being made. You'll also see that
this isn't possible:
"... <table1> JOIN <table2> ON (<table1>.partyId = <table2>.partyId
AND <table2>.roleId = 'LEADER') ..."
What is possible is only:
"... <table1> JOIN <table2> ON (<table1>.partyId = <table2>.partyId)
..."
So, to answer my own question, the OFBiz Entity framework doesn't
seem to handle what I requested for.
Perhaps I'm not understanding your suggestion? Would you mind
indicating whether you are sure the suggestion works or whether it's
a mere guess? Thanks.
If you are sure it works, I'll spend more time trying your
suggestion. But from first impressions, you may have missed something
because it throws an error.
Jonathon
Rodrigo Souza wrote:
Add to your code:
<key-map field-name="roleId" rel-field-name="leaderId"/>
i.e
<view-link entity-alias="GP" rel-entity-alias="LD"
rel-optional="true">
<!-- Where LD.roleId is "LEADER" -->
<key-map field-name=roleId" rel-field-name="leaderId"/>
</view-link>
2007/8/6, Jonathon -- Improov <[EMAIL PROTECTED]>:
In view-entity(s), is it possible to have conditionals in <relation>?
For eg, an entity Group can have 3 types of members: "LEADER",
"VICE" and "MEMBER".
I've included my thoughts in the crude example below (please ignore
syntax errors).
<entity entity-name="Group">
<field name="groupId"/>
</entity>
<entity entity-name="Member">
<field name="memberId"/>
<field name="groupId"/>
<field name="roleId"/>
<relation rel-entity-name="Group">
<key-map field-name="groupId"/>
</relation>
</entity>
<view-entity entity-name="GroupAndMember">
<member-entity entity-alias="GP" entity-name="Group"/>
<member-entity entity-alias="LD" entity-name="Member"/>
<member-entity entity-alias="VC" entity-name="Member"/>
<member-entity entity-alias="MB" entity-name="Member"/>
<alias-all entity-alias="GP"/>
<alias entity-alias="LD" name="leaderId" field-name="memberId"/>
<alias entity-alias="VC" name="viceId" field-name="memberId"/>
<alias entity-alias="MB" name="memberId" field-name="memberId"/>
<view-link entity-alias="GP" rel-entity-alias="LD"
rel-optional="true">
<!-- Where LD.roleId is "LEADER" -->
</view-link>
<view-link entity-alias="GP" rel-entity-alias="VC"
rel-optional="true">
<!-- Where VC.roleId is "VICE" -->
</view-link>
<view-link entity-alias="GP" rel-entity-alias="MB"
rel-optional="true">
<!-- Where MB.roleId is "MEMBER" -->
</view-link>
</entity>
I know that I can simply use different entities for leader, vice
and member (eg Leader, Vice and
Member). But that would be a little awkward, since all the 3
entities will have exactly the same
fields (just different roleIds).
Is the above possible in OFBiz's Entity framework?
Jonathon