Ok I got it now.
That's how Velocity works. This code is not Cayenne specific. I would
suggest defining extra variables for conditions, or writing a Velocity
expression to match your expectations. E.g. "#chunk($id || $id == 0).
Not sure if you can redefine thsi behavior on the Velocity end.
I am not entirely happy with Velocity as a SQLTemplate engine myself,
but unless and until we write a substitution, we are stuck with that I
guess.
Andrus
On May 21, 2010, at 12:11 PM, Рябицкий Евгений wrote:
I took example from http://cayenne.apache.org/doc20/scripting-sqltemplate.html
and extend it so it use Boolean fields to show my problem.
For me problematic that when I am going to filter ARTISTS with id ==
1 or id == 10 it is all ok I will got query:
SELECT * from ARTIST t0 WHERE id = ? [bind: 1 ]
But if I am filtering with id == 0 (that is absolute valid column
value) I got:
SELECT * from ARTIST t0
But I was expecting:
SELECT * from ARTIST t0 WHERE id = ? [bind: 0 ]
That is my problem.... Same for Boolean values, I just want simple
filtering by only passed column values.
Evgeny.
-----Original Message-----
From: Andrus Adamchik [mailto:[email protected]]
Sent: Friday, May 21, 2010 12:12 PM
To: [email protected]
Subject: Re: Cayenne chain-chank problem
Hi Evgeny,
Where did you find this example?
I am checking #chunk directive example here:
http://cayenne.apache.org/doc20/scripting-sqltemplate.html
and everything seems correct to me. IIRC "0 == null" is how Velocity
evaluates expressions (C-style), so this has to be taken into account
when building SQLtemplates.
So I don't understand which parts you find problematic?
Cheers,
Andrus
On May 21, 2010, at 10:36 AM, Рябицкий Евгений wrote:
Hello, here is example from tutorial for 2.0:
String sql = "SELECT DISTINCT"
+ " #result('ARTIST_ID' 'int'),"
+ " #result('ARTIST_NAME' 'String'),"
+ " #result('DATE_OF_BIRTH' 'java.util.Date')"
+ " #result('IS_DEAD' 'java.util.Boolean')"
+ " FROM ARTIST t0"
+ " #chain('OR' 'WHERE') // start
chain prefixed by WHERE,
// and joined
by OR
+ " #chunk($name) ARTIST_NAME LIKE #bind($name) #end" //
ARTIST_NAMEchunk"
+ " #chunk($id) ARTIST_ID > #bind($id) #end" // ARTIST_ID
chunk"
+ " #chunk($isDead) IS_DEAD = #bind($isDead) #end" // IS_DEAD
chunk"
+ " #end"; // end of chain
SQLTemplate select = new SQLTemplate(Artist.class, sql, true);
If I put in isDead true - everything is ok, but if I put false I got
chat this condition is skipper because #chunk is actually checking
condition of $isDead.
Same thing if I put 0 in $id it will be false.
So this example of tutorial is bad for Dead Artists or Artists with
id == 0.
Maybe it's a bug of #chunk directive and it should do only null
check??
Evgeny.