/**
* Copyright (c) 2004-2011 Wang Jinbao(Julian Wong), http://www.ralasafe.com
* Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
*/
package org.ralasafe.db;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.ralasafe.util.DBUtil;
import org.ralasafe.util.StringUtil;
/**
* WARNING!!!!
* We will deprecate it later.
*/
public class WhereElementUtil {
public static String toSql( SelectCondition cdtn ) {
if( cdtn==null )
return "";
StringBuffer buff=new StringBuffer();
// translate where part
WhereElement whereElement=cdtn.getWhereElement();
if( whereElement!=null )
buff.append( " WHERE " );
append( buff, whereElement );
// translate order part
append( buff, cdtn.getOrderPart() );
// translate group part
append( buff, cdtn.getGroupPart() );
return buff.toString();
}
public static String toSql( WhereElement emt ) {
if( emt==null )
return "";
StringBuffer buff=new StringBuffer();
buff.append( " WHERE " );
append( buff, emt );
return buff.toString();
}
private static void append( StringBuffer buff, OrderPart orderPart ) {
if( orderPart==null||orderPart.getColumnNames().length==0 )
return;
String[] columnNames=orderPart.getColumnNames();
String[] orderTypes=orderPart.getOrderTypes();
buff.append( " ORDER BY " );
for( int i=0; i<columnNames.length; i++ ) {
if( i!=0 ) {
buff.append( "," );
}
buff.append( columnNames[i] );
if( orderTypes!=null && "DESC".equalsIgnoreCase( orderTypes[i] ) ) {
buff.append( " DESC" );
}
}
}
private static void append( StringBuffer buff, GroupPart groupPart ) {
if( groupPart==null||groupPart.getColumnNames().length==0 )
return;
String[] columnNames=groupPart.getColumnNames();
buff.append( " group by " );
for( int i = 0; i < columnNames.length; i++ ) {
if( i!=0 ) {
buff.append( "," );
}
buff.append( columnNames[i] );
}
}
private static void append( StringBuffer buff, WhereElement whereEmt ) {
if( whereEmt==null )
return;
if( whereEmt instanceof FieldWhereElement ) {
FieldWhereElement fEmt=(FieldWhereElement) whereEmt;
buff.append( fEmt.getColumn().getName() );
Comparator cptr=fEmt.getCompartor();
if( cptr.equals( SingleValueComparator.EQUAL ) ) {
buff.append( "=" );
} else if( cptr.equals( SingleValueComparator.GREATER ) ) {
buff.append( ">" );
} else if( cptr.equals( SingleValueComparator.LESS ) ) {
buff.append( "<" );
} else if( cptr.equals( SingleValueComparator.NOT_EQUAL ) ) {
buff.append( "<>" );
} else if( cptr.equals( SingleValueComparator.NOT_GREATER ) ) {
buff.append( "<=" );
} else if( cptr.equals( SingleValueComparator.NOT_LESS ) ) {
buff.append( ">=" );
} else if( cptr.equals( SingleValueComparator.LIKE ) ) {
if( fEmt.isContextValue() ) {
buff.append( " like " );
} else {
buff.append( " like " );
}
} else if( cptr.equals( SingleValueComparator.RIGHT_LIKE ) ) {
if( fEmt.isContextValue() ) {
buff.append( " like " );
} else {
buff.append( " like " );
}
} else if( cptr.equals( SingleValueComparator.LEFT_LIKE ) ) {
if( fEmt.isContextValue() ) {
buff.append( " like " );
} else {
buff.append( " like " );
}
}
if( fEmt.isContextValue() ) {
buff.append( "?" );
} else {
// formated value
//buff.append( "'" );
buff.append( fEmt.getValue() );
//buff.append( "'" );
}
// if( cptr.equals( SingleValueComparator.LEFT_LIKE ) ) {
// if( fEmt.isContextValue() ) {
// buff.append( "%'" );
// }
// } else if( cptr.equals( SingleValueComparator.LIKE ) ) {
// if( fEmt.isContextValue() ) {
// buff.append( "%'" );
// }
// } else if( cptr.equals( SingleValueComparator.RIGHT_LIKE ) ) {
// if( fEmt.isContextValue() ) {
// buff.append( "'" );
// }
// }
} else if( whereEmt instanceof ComplexWhereElement ) {
ComplexWhereElement cEmt=(ComplexWhereElement) whereEmt;
append( buff, cEmt.getFirstPart() );
LWhereElement[] lEmts=cEmt.getLinkedParts();
if( lEmts!=null ) {
for( int i=0; i<lEmts.length; i++ ) {
LWhereElement lEmt=lEmts[i];
String linkerType=lEmt.getLinkType();
if( LWhereElement.OR_LINK_TYPE
.equalsIgnoreCase( linkerType ) ) {
buff.append( " OR (" );
append( buff, lEmt.getWhereElement() );
buff.append( ") " );
} else {
buff.append( " AND (" );
append( buff, lEmt.getWhereElement() );
buff.append( ") " );
}
}
}
} else if( whereEmt instanceof InnerWhereElement ) {
InnerWhereElement emt=(InnerWhereElement) whereEmt;
String tableName=emt.getTableName();
Column[] columns=emt.getColumns();
String[] innerTableColumnNames=emt.getInnerTableColumnNames();
Collection values=emt.getValues();
buff.append( " (" );
for( int i=0; i<columns.length; i++ ) {
if( i>0 ) {
buff.append( "," );
}
buff.append( columns[i].getName() );
}
buff.append( ") in (" );
if( tableName==null ) {
if( columns.length>1 ) {
boolean notFirstOne=false;
for(Iterator iter=values.iterator(); iter.hasNext(); ) {
if( notFirstOne ) {
buff.append( "," );
} else {
notFirstOne=true;
}
buff.append( "(" );
Object[] rowValues=(Object[]) iter.next();
for( int i=0; i<rowValues.length; i++ ) {
if( i>0 ) {
buff.append( "," );
}
buff.append( rowValues[i] );
}
buff.append( ")" );
}
} else {
boolean notFirstOne=false;
for(Iterator iter=values.iterator(); iter.hasNext(); ) {
if( notFirstOne ) {
buff.append( "," );
} else {
notFirstOne=true;
}
buff.append( iter.next() );
}
}
} else {
buff.append( DBUtil.selectSql( tableName, innerTableColumnNames ) );
}
buff.append( ")" );
} else if( whereEmt instanceof PstmtInWhereElement ) {
PstmtInWhereElement pstmtIn=(PstmtInWhereElement) whereEmt;
String[] columnNames=pstmtIn.getColumnNames();
StringUtil.append( buff, columnNames );
buff.append( " in (");
String inSql=pstmtIn.getInSql();
buff.append( inSql );
buff.append( ") ");
}
}
public static void extractColumns( WhereElement emt, List selectByColumns,
Object mainHint, List hints ) {
if( emt==null )
return;
if( emt instanceof FieldWhereElement ) {
FieldWhereElement fEmt=(FieldWhereElement) emt;
if( fEmt.isContextValue() ) {
selectByColumns.add( fEmt.getColumn() );
hints.add( mainHint );
}
} else if( emt instanceof ComplexWhereElement ) {
ComplexWhereElement cEmt=(ComplexWhereElement) emt;
extractColumns( cEmt.getFirstPart(), selectByColumns, mainHint, hints );
LWhereElement[] linkedParts=cEmt.getLinkedParts();
if( linkedParts!=null ) {
for( int i=0; i<linkedParts.length; i++ ) {
extractColumns( linkedParts[i].getWhereElement(), selectByColumns, mainHint, hints );
}
}
} else if( emt instanceof InnerWhereElement ) {
} else if( emt instanceof PstmtInWhereElement ) {
PstmtInWhereElement pstmtIn=(PstmtInWhereElement) emt;
Column[] pstmtColumns=pstmtIn.getPstmtColumns();
for( int i=0; i<pstmtColumns.length; i++ ) {
Column column=pstmtColumns[i];
selectByColumns.add( column );
hints.add( pstmtIn.getHint() );
}
}
}
}