package com.em;
import java.sql.SQLException;
import java.util.ArrayList;
import com.em.Util;
public class Query
{
private ArrayList m_tables;
private ArrayList m_columns;
private ArrayList m_values;
private ArrayList m_params;
private StringBuffer m_where;
private ArrayList m_group;
private ArrayList m_whereParams;
private ArrayList m_order;
private ArrayList m_unionAll;
private String m_query;
private boolean m_isSelectForUpdate;
public Query()
{
m_tables = new ArrayList();
m_columns = new ArrayList();
m_values = new ArrayList();
m_params = new ArrayList();
m_where = new StringBuffer();
m_whereParams = new ArrayList();
m_group = new ArrayList();
m_order = new ArrayList();
m_unionAll = new ArrayList();
}
public String getInsertQuery()
{
return "INSERT INTO " + Util.toString(m_tables) + " (" + Util.toString(m_columns) + ") VALUES (" + Util.toString(m_values) + ")";
}
public String getUpdateQuery()
throws SQLException
{
if(!existsWhereClause())
throw new SQLException("Security violation: UPDATE without WHERE condition");
else
return "UPDATE " + Util.toString(m_tables) + " SET " + Util.toString(m_columns, m_values) + getWhere();
}
public String getDeleteQuery()
throws SQLException
{
if(!existsWhereClause())
throw new SQLException("Security violation: DELETE without WHERE condition");
else
return "DELETE FROM " + Util.toString(m_tables) + getWhere();
}
public void setSelectForUpdate(boolean flag)
{
m_isSelectForUpdate = flag;
}
public String getSelectQuery()
throws SQLException
{
if(m_query != null)
return m_query;
StringBuffer stringbuffer = (new StringBuffer("SELECT ")).append(Util.toString(m_columns)).append(" FROM ").append(Util.toString(m_tables)).append(getWhere()).append(getGroupBy()).append(getOrder());
if(m_isSelectForUpdate)
if(existsWhereClause())
stringbuffer.append(" FOR UPDATE");
else
throw new SQLException("Security violation: SELECT FOR UPDATE without WHERE condition");
return stringbuffer.toString();
}
public String getPagedSelectQuery() throws SQLException {
StringBuffer stringbuffer = (new StringBuffer("SELECT * FROM ( "))
.append("SELECT ROWNUM rnum, m.* FROM ( ");
if (m_query != null) {
stringbuffer.append(m_query);
} else {
stringbuffer.append("SELECT ")
.append(Util.toString(m_columns))
.append(" FROM ")
.append(Util.toString(m_tables))
.append(getWhere())
.append(getGroupBy())
.append(getOrder());
}
stringbuffer.append(") m WHERE ROWNUM <= ? ")
.append(") WHERE rnum > ? ");
return stringbuffer.toString();
}
public void setSelectQuery(String s)
{
m_query = s;
}
public String getCountQuery()
{
if(m_query != null)
{
int i = m_query.indexOf("ORDER BY");
if(i < 0)
return "SELECT count(*) AS totalcount FROM (" + m_query + ")";
else
return "SELECT count(*) AS totalcount FROM (" + m_query.substring(0, i) + ")";
}
if(existsGroupByClause() || existsDistinctClause())
return "SELECT count(*) FROM (SELECT " + Util.toString(m_columns) + " FROM " + Util.toString(m_tables) + getWhere() + getGroupBy() + ")";
else
return "SELECT count(*) FROM " + Util.toString(m_tables) + getWhere();
}
public String getUnionAllQuery()
throws SQLException
{
int i = m_unionAll.size();
if(i == 0)
return getSelectQuery();
StringBuffer stringbuffer = new StringBuffer(((Query)m_unionAll.get(0)).getSelectQuery());
for(int j = 1; j < i; j++)
stringbuffer.append(" UNION ALL ").append(((Query)m_unionAll.get(j)).getSelectQuery());
return stringbuffer.toString();
}
private String getWhere()
{
if(existsWhereClause())
return " WHERE " + m_where.toString();
else
return "";
}
private String getGroupBy()
{
if(m_group.size() == 0)
return "";
else
return " GROUP BY " + Util.toString(m_group);
}
private String getOrder()
{
if(m_order.size() == 0)
return "";
else
return " ORDER BY " + Util.toString(m_order);
}
private boolean existsWhereClause()
{
return m_where.length() > 0;
}
private boolean existsGroupByClause()
{
return m_group.size() > 0;
}
private boolean existsDistinctClause()
{
if(m_columns.size() > 0)
{
String s = (String)m_columns.get(0);
return s != null && s.startsWith("DISTINCT ");
} else
{
return false;
}
}
public ArrayList getParameters()
{
ArrayList arraylist = new ArrayList(m_params);
arraylist.addAll(m_whereParams);
return arraylist;
}
public ArrayList getWhereParameters()
{
return m_whereParams;
}
public void addTable(String s)
{
if(!m_tables.contains(s))
m_tables.add(s);
}
public void addColumn(String s)
{
m_columns.add(s);
}
public void addValue(String s)
{
m_values.add(s);
}
public void addParam(String s)
{
m_params.add(s);
}
public void addWhereParam(String s)
{
m_whereParams.add(s);
}
public void addWhereParam(int i)
{
m_whereParams.add(new Integer(i));
}
public void addWhereAnd(String s)
{
if(m_where.length() == 0)
m_where.append(s);
else
m_where.append(" AND ").append(s);
}
public void addWhereOr(String s)
{
if(m_where.length() == 0)
m_where.append(s);
else
m_where.append(" OR ").append(s);
}
public void addWhereValue(String s) {
m_where.append(s);
}
public void addGroupBy(String s)
{
m_group.add(s);
}
public void addOrder(String s)
{
addOrder(s, false);
}
public void addOrder(String s, boolean flag)
{
if(flag)
m_order.add(0, s);
else
m_order.add(s);
}
public void addUnionAll(Query query)
{
m_unionAll.add(query);
}
}