Hey Mike,
I am not surprised that translator code is so hard to refactor - it
was one of the first pieces we wrote in Cayenne and some rework was
long overdue.
I guess I can check the details once you have a patch in place. Now I
just wanted to make sure I understand proposed null handling. So you
are planning to convert all "NOT SOMETHING" expressions to the form
like this "t0.X IS NULL OR t0.X <> ?" (if the bound parameter is not
null itself I guess). Probably the right way to handle it. Do you
think it is worth having a separate patch just for this feature?
Andrus
On Aug 23, 2006, at 2:18 AM, Mike Kienenberger wrote:
Finished handling null inequalities -- redesigned
ObjectMatchTranslator sql generation. Passes all unit tests.
Still generating the search clauses using the wrong aliases for outer
joins and there's some odd classCast exception under some
circumstances. The code is a lot cleaner, now, though. Need to
write some more unit tests to pick up the failures.
On 8/22/06, Mike Kienenberger <[EMAIL PROTECTED]> wrote:
Just as an update, I think I have all of this working, almost. I
wouldn't have guessed it would involve rewriting so much of
QualifierTranslator when I started.
The only thing currently failing unit testing is
DataContextPrefetchTst.testPrefetch9, which is generating sql with a
missing column name.
SELECT t0.ESTIMATED_PRICE, t0.PAINTING_DESCRIPTION,
t0.PAINTING_TITLE,
t0.ARTIST_ID, t0.GALLERY_ID, t0.PAINTING_ID FROM PAINTING t0 WHERE ((
IS NULL) OR t0.ARTIST_ID <> ?)
On 8/22/06, Mike Kienenberger <[EMAIL PROTECTED]> wrote:
> I'm trying to build the ((exp is null) or (exp <> 'Y')) sql for
an inequality.
>
> My thought was to stick the following code at the top of startNode,
> essentially calling the part of Expression.traverse(Expression,
> TraversalHandler) that generates the left-hand-side twice. Calling
> the code twice turns out to have bad side effects, like creating
> multiple joins.
>
> if (handleNullInequalityComparison)
> {
> qualBuf.append("((");
>
> Object child = node.getOperand(0);
> if (child instanceof Expression) {
> Expression childExp = (Expression) child;
> childExp.traverse(node, this);
> }
> else {
> this.objectNode(child, node);
> }
>
> qualBuf.append(" IS NULL) OR ");
> }
>
> So I guess what I need to do is call it once and then cache the
value.
> I'm trying to figure out the best way to do this as well as
how to
> share the cached value since I can't store it in the Expression
or the
> TraversalHandler instance.
>