cayenne-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrus Adamchik <>
Subject Re: Type-safe qualifiers
Date Thu, 31 Dec 2009 09:44:05 GMT

On Dec 31, 2009, at 11:24 AM, Andrey Razumovsky wrote:

> 1. Instead of:
> Expression clause2 =  
> ExpressionFactory.matchExp(Artist.PAINTINGS_PROPERTY +
> "." + Painting.NAME_PROPERTY, "Y");
> I prefer using just
> Expression clause2 =  
> ExpressionFactory.matchExp("paintings.paintingName",
> "Y");
> Yes, I don't like using constants, to me bottom example seems more  
> readable,
> short and quicker to write (especially if there are a lot of items  
> in the
> path). As far as I understood, this will not be allowed in new API (?)

Looks like your schema doesn't change too often :-)

Anyways, we can still allow that in the new API. And even preserve  
"declarative" type-safety:

Expression clause2 = new Key<String>("paintings.paintingName").eq("Y");

> 2. I wrote a library which automatically builds Cayenne expressions  
> from
> values user specified in grid filter of Web (GWT) client - path is  
> coming
> from client. With new API, shall I have something like
> CayenneDataObject.getKey(String) method to obtain any key in uniform  
> way?
> (even with that, I will have more work to do to convert path to new  
> API,
> maybe we need some method like Key Cayenne.getNestedKey(Class clazz,  
> String
> path)?

See the example above (new Key<?>(...)). Capability-wise the new API  
will allow everything ExpressionFactory does.

> 3. I have examples of intentionally not following type-safing for
> expressions (these are real examples)
>  a. EF.matchExp("artist", "200") - quick comparison of relation  
> object's id
>  b. EF.lessExp("date", "2010-01-01 10:00:00.000") - replacement of  
> date (or
> int, double, whatever) with just string
> Will those be allowed somehow in new API?

I guess there are two ways about it.

1. new Key<Object>(..)
2. Provide methods that do String to object conversions for common  
cases of dates and numbers, using explicit or implicit formatters E.g.

    new Key<Date>("dob").after("2010-01-01 10:00:00.000", "YYYY-mm- 
    new Key<Integer>("age").eq("200");

Among other things this will make some drivers (like PostgreSQL)  
happy, as they don't allow fuzzy types in PreparedStatement bind  

> Happy New Year!!!

Happy New Year to everybody :-)


View raw message