package com.spun.util.database;
import com.spun.util.DatabaseUtils;
import com.spun.util.database.SQLQuery.FromPart;
import com.spun.util.database.SQLQuery.OrderByPart;
class SimpleQueryWriter implements SQLQueryWriter
{
private int databaseType;
/**************************************************************************/
public SimpleQueryWriter(int databaseType)
{
this.databaseType = databaseType;
}
/**************************************************************************/
public String toString(SQLQuery query)
{
StringBuffer sql = new StringBuffer("SELECT ");
if (query.isDistinct())
{
sql.append("DISTINCT ");
}
// limit
if (DatabaseUtils.isSqlServer(databaseType) && query.getLimitPart() != null)
{
if (query.getLimitPart().getStartingZeroBasedIndex() != 0)
{
throw new Error("Wrong Sql writer for lower bound of " + query.getLimitPart().getStartingZeroBasedIndex());
}
sql.append("TOP " + query.getLimitPart().numberOfRowsDesired + " ");
}
addSelectPart(sql, query.getSelectParts());
addFromPart(sql, query.getFromParts());
addWherePart(sql, query.getWherePart());
addGroupBy(sql, query.getGroupByParts());
addHaving(sql, query.getHavingParts());
addOrderByPart(sql, query.getOrderByParts());
//limit
if ((databaseType == DatabaseUtils.POSTGRESQL || databaseType == DatabaseUtils.MY_SQL) && query.getLimitPart() != null)
{
sql.append(" LIMIT ");
if (databaseType == DatabaseUtils.MY_SQL && query.getLimitPart().getStartingZeroBasedIndex() != 0)
{
sql.append(query.getLimitPart().getStartingZeroBasedIndex() + ", ");
}
sql.append(query.getLimitPart().numberOfRowsDesired);
}
return sql.toString();
}
/***********************************************************************/
private void addOrderByPart(StringBuffer sql, OrderByPart[] orderBys)
{
//order by
if (orderBys.length > 0)
{
sql.append(SQLQuery.BREAK + "ORDER BY ");
for (int i = 0; i < orderBys.length; i++)
{
sql.append(orderBys[i].toString(i == 0));
}
sql.append(" ");
}
}
/***********************************************************************/
private void addWherePart(StringBuffer sql, SQLWhere wherePart)
{
if (wherePart != null )
{
sql.append(SQLQuery.BREAK + "WHERE ");
sql.append(wherePart.toString());
}
}
/***********************************************************************/
private void addFromPart(StringBuffer sql, FromPart[] froms)
{
if (froms.length > 0)
{
sql.append(SQLQuery.BREAK + "FROM ");
for (int i = 0; i < froms.length; i++)
{
sql.append(froms[i].toString(i == 0));
}
sql.append(" ");
}
}
/***********************************************************************/
private void addGroupBy(StringBuffer sql, String[] groupBys)
{
if (groupBys.length > 0)
{
sql.append(SQLQuery.BREAK + "GROUP BY ");
for (int i = 0; i < groupBys.length; i++)
{
sql.append(groupBys[i]);
sql.append(", ");
}
sql.setLength(sql.length() - 2);
sql.append(" ");
}
}
/***********************************************************************/
private void addHaving(StringBuffer sql, String[] havings)
{
if (havings.length > 0)
{
sql.append(SQLQuery.BREAK + "HAVING ");
for (int i = 0; i < havings.length; i++)
{
sql.append(havings[i]);
sql.append(", ");
}
sql.setLength(sql.length() - 2);
sql.append(" ");
}
}
/***********************************************************************/
private void addSelectPart(StringBuffer sql, String[] selectParts)
{
for (int i = 0; i < selectParts.length; i++)
{
sql.append(selectParts[i]);
sql.append(", ");
}
sql.setLength(sql.length() - 2);
sql.append(" ");
}
/**************************************************************************/
/**************************************************************************/
}