카테고리 없음2009. 10. 15. 10:57

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);
    }

}

Posted by penguindori