Andrea Papotti wrote:

>>I just pass my criteria to doSelect().  It works, but I am a
>>little wary because of the JavaDoc comment at the top of
>>this method - "Old method for performing a SELECT."
>>
> 
> yes, it works (or better, you dont't get exceptions), but you get only the
> columns of the peer you use, you don't get columns from other tables.
> 
> 
>>It would be great if the either Village code or the torque generated
>>peer code would provide a nice way of mapping from the selected
>>columns to an object you defined yourself.
>>
> 
> I agree with you.
> 
> bye, Andrea Papotti
> 



I recently when through Torque/Turbine enlightenment so maybe I can help 
clear things up -- at least as far as my current understanding goes. I'm 
sure someone will correct any obvious errors.

For the following discussion, assume a table A (with fields A1 & A2) and table B 

(with fields B1 & B2). Table A has a foreign key into B.

The first piece of enlightenment is that Peers wraps a table with a java 
object. Although this is stated as clearly as can be in the HOW-TO it 
seems to lead to two consequences.

1. The wrapped object (A.java for example) expects to have a value for 
*every* field in table A when it creates the result object for a query. 
Failing to do so, by explicitly using "selectColumns", results in 
strange errors ("Error table has n columns" or something like that).

If you look at the generated xxxPeer code you'll see that *all* columns 
are added before operations are performed.

2. This is the most important. The generated object, A.java, *only* 
contains fields from table A so Peers doesn't really implement a 
relational model, it implements a network model on top of a (possibly) 
relational model.

In a relational model, you'd expect to issue a query and get a result. 
This result table may be unlike any existing table in the database. For 
example, using relational notation, "SELECT a1,a2,b2,b2 FROM A,B WHERE 
a1 = b1" would result in a table with columns "a1,a2,b1,b2". But there 
is no generated java object with these fields defined.

Since the selection method(s) generated (in APeer.java for example) 
return a Vector of objects, there is no existing object that can be used 
to wrap a result of "a1,a2,b1,b2".

In the network model that Peers creates, an accessor method "getXXXX" is 
generated for tables which have foreign keys. In the example I'm talking 
about, A.java will have a "getB" method declared (in reality it's in the 
BaseA.java class).

This method will fetch the table B row using the foreign key and return 
a B object.

Now, getting back to the question of "join" where this all started so 
long ago. There are examples of how to properly perform a "join" in the 
docs, and also in the mailing list archives (look for "join").

What all this almost incomprehensible (to me) code is doing is taking 
the result of a join which contains all fields from both tables. It 
creates a Vector of objects from the first table (the one whose xxxPeer 
method was used to do the select) and then creates a reference from each 
of these objects to objects it creates representing the second table.

So, as you found out, it is easy to access the first table directly, but 
to access the second you have to use A.getB().b1 notation. Because you 
performed a join, the B objects will already have been created and won't 
require another hit on the database.

If you've followed all this, you're probably left saying "but I just 
want to join two tables." Well if you've defined a foreign key between 
the two, as we did above with A has a foreign key to B, then there is a 
method which does the join already defined in A. It's actually in 
APeers.java and is named doSelectJoinB. It's protected so to use it 
you'll have to create a public method to access it.

So, to make life easy, you can create a method in APeersjava (since it 
won't be overwritten if you rebuild, another whole topic in itself) such as:
      public static Vector AwithB(Criteria critera) {
                return doSelectJoinB(criteria);
      }

The "criteria" you pass in will have all fields from both tables added 
and the join criteria to match the keys from the two tables, so you 
should just add whatever other selection expressions are needed.

This returns a vector of A objects and the B fields can be accessed 
using the "getB" method of each of the returned "A" objects.

To make my life easier, since I use these classes as pull tools, I've 
added accessor fields to make my life easier. For example in A.java 
(since it won't be overwritten, unlike BaseA.java):
      public String getb1() {
           return getB().getb1();
      }

to hide the network nature of the access.

I really should put together a complete example with code at some point 
since there's probably enough handwaving in the above to leave some 
people wondering about a particular point that seems clear to me.

This has probably gotten way too long and convoluted at this point but I 
hope it helps at least a little.

In conclusion Peers wraps objects around tables and creates a network 
access model.

There are limtations on what you can put in a Criteria object and expect 
the generated code to handle.

I apologize for any inaccuracies in my understanding or presentation and 
hope that someone more knowledgeable will correct them.

--

Sam Solon
[EMAIL PROTECTED]
        






---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to