Hi,
Here is a candidate fix:
public boolean getSelect(StringBuilder buf)
{
StringBuilder leftBuffer = new StringBuilder();
// the left part
left.clearOrderBy();
if (!left.getSelect(leftBuffer))
return error(left);
if(leftBuffer.indexOf(keyWord) == -1) {
buf.append( "(" );
buf.append(leftBuffer);
buf.append( ")" );
} else {
buf.append(leftBuffer);
}
[...]
I do not like the "indexOf(...)" because it is not really elegante, but this
has the advantage to work...
Regards,
exxos.
On Tue, Aug 10, 2010 at 10:53 PM, exxos <[email protected]> wrote:
> Sorry, I confused between StringBuffer and StringBuilder...
> But the use case is still valid.
>
> Please accept my appologize.
> Regards,
> exxos.
>
> On Tue, Aug 10, 2010 at 10:49 PM, exxos <[email protected]> wrote:
>
>> Hi,
>>
>> Thank you for your advise.
>>
>> The issue is considering multiple UNION.
>>
>> [sta1] UNON [sta2] UNION [sta3] UNION etc...
>>
>> DBCommandExpr cmd = cmd1.union(cmd2);
>> cmd = cmd.union(cmd3);
>>
>> When is invoked the method "getSelect()", the StringBuffer given in
>> parametre is used in cascading. The StringBuffer is shared by all sub
>> getSelect() of the commands. This makes the solution a little bit hard to
>> elaborate. I'm thinking about to stop to share the same StringBuffer. This
>> is because I base my logic on the length of the StringBuffer:
>>
>> getSelect(...) {
>> boolean isFirst = buf.length() < 1;
>> if(isFirst) {
>> buf.append( "(" );
>> }
>>
>> This comment is only to share my experience on that.
>>
>> Regards,
>> exxos.
>>
>>
>>
>>
>>
>>
>>
>> On Wed, Aug 4, 2010 at 10:11 AM, Rainer Döbele <[email protected]> wrote:
>>
>>> Hi exxos,
>>>
>>>
>>>
>>> I need a bit more time to investigate this.
>>>
>>> In the meantime I suggest to derive a class from DBCombinedCmd and to
>>> override the getSelect(StringBuilder buf) method.
>>>
>>> Then copy the code from the base-class and add the parenthesis.
>>>
>>>
>>>
>>> Afterwards in your client-code you write:
>>>
>>> DBCommandExpr myExpr = new DBMyCombinedCmd(cmdLeft, “UNION”, cmdRight);
>>>
>>>
>>>
>>> Regards
>>>
>>> Rainer
>>>
>>>
>>>
>>> *Von:* exxos [mailto:[email protected]]
>>> *Gesendet:* Dienstag, 3. August 2010 15:18
>>> *An:* [email protected]
>>> *Betreff:* UNION and the parentheses
>>>
>>>
>>>
>>>
>>> Hello,
>>>
>>> According to the MySQL's documentation (5.0), if the ORDER BY or the
>>> LIMIT clause, are used with UNION, the "( )" have to be added to each SELECT
>>> statements.
>>>
>>> http://dev.mysql.com/doc/refman/5.0/en/union.html
>>> "To use an ORDER BY or LIMIT clause to sort or limit the entire UNION
>>> result, parenthesize the individual SELECT statements and place the ORDER BY
>>> or LIMIT after the last one."
>>>
>>> But empire-db version 2.0.6 produces "<DBCommand> UNION (<DBCommand>)
>>> ORDER BY <DBColumn>" and there is no "( )" to the first SELECT.
>>>
>>> But by chance it continues to work with the ORDER BY, but with the
>>> keyword LIMIT it stops!
>>>
>>> The class in charge to build the UNION command seems to be DBCombinedCmd
>>> (line 102 - public boolean getSelect(StringBuilder buf) )
>>>
>>> Could you please advise about a workarround?
>>>
>>> /Cheers.
>>>
>>>
>>
>