/**
* '$RCSfile: Query.java,v $'
*
* '$Author: leinfelder $'
* '$Date: 2009-01-08 01:24:08 $'
* '$Revision: 1.5 $'
*
* For Details: http://kepler.ecoinformatics.org
*
* Copyright (c) 2003 The Regents of the University of California.
* All rights reserved.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
* FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
* PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY
* OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT,
* UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*/
package org.ecoinformatics.datamanager.database;
/**
* This class represents a sql query in java presentation.
* @author tao
*
*/
public class Query
{
//class fields
private SelectionItem[] selectionList = null;
private TableItem[] tableList = null;
private WhereClause whereClause = null;
private GroupBy groupBy = null;
private boolean distinct = false;
//constants
private static final String SELECT = "SELECT";
private static final String DISTINCT = "DISTINCT";
private static final String FROM = "FROM";
public static final String SEMICOLON = ";";
public static final String COMMA = ",";
/**
* Default constructor
*
*/
public Query()
{
}
/**
* Adds a SelectionItem into query
* @param selection selectionItem was added
*/
public void addSelectionItem(SelectionItem selection)
{
if (selectionList == null)
{
selectionList = new SelectionItem[1];
selectionList[0] = selection;
}
else
{
int size = selectionList.length;
SelectionItem[] copy = selectionList;
selectionList = new SelectionItem[size+1];
for(int i=0; i<size; i++)
{
selectionList[i]= copy[i];
}
selectionList[size] = selection;
}
}
/**
* Adds a TableItem into query
* @param table TableItem was added
*/
public void addTableItem(TableItem table)
{
if (containsTableItem(table)) {
return;
}
if (tableList == null)
{
tableList = new TableItem[1];
tableList[0] = table;
}
else
{
int size = tableList.length;
TableItem[] copy = tableList;
tableList = new TableItem[size+1];
for(int i=0; i<size; i++)
{
tableList[i]= copy[i];
}
tableList[size] = table;
}
}
public boolean containsTableItem(TableItem table)
{
if (tableList != null)
{
int size = tableList.length;
for(int i=0; i<size; i++)
{
if (tableList[i].equals(table)) {
return true;
}
}
}
return false;
}
public SelectionItem[] getSelectionList() {
return selectionList;
}
/**
* Set where clause to the query
* @param where where clause need be set
*/
public void setWhereClause(WhereClause where)
{
this.whereClause = where;
}
/**
* Set group by clause to the query
* @param groupBy clause for grouping
*/
public void setGroupBy(GroupBy groupBy)
{
this.groupBy = groupBy;
}
/**
*
* @return true when query should return only distinct records
*/
public boolean isDistinct() {
return distinct;
}
/**
*
* @param distinct set to true to return only distinct records
*/
public void setDistinct(boolean distinct) {
this.distinct = distinct;
}
/**
* Gets a sql string from query object
* @return sql string
* @throws UnWellFormedQueryException
*/
public String toSQLString() throws UnWellFormedQueryException
{
if (selectionList == null || tableList == null)
{
throw new UnWellFormedQueryException(UnWellFormedQueryException.QUERY_SELECTION_OR_TABLE_IS_NULL);
}
StringBuffer sql = new StringBuffer();
// select part
sql.append(SELECT);
sql.append(ConditionInterface.SPACE);
if (distinct) {
sql.append(DISTINCT);
sql.append(ConditionInterface.SPACE);
}
int selectionLength = selectionList.length;
boolean firstSelection = true;
for (int i=0; i<selectionLength; i++)
{
SelectionItem selection = selectionList[i];
if (firstSelection)
{
sql.append(selection.toSQLString());
firstSelection = false;
}
else
{
sql.append(COMMA);
sql.append(selection.toSQLString());
}
}
//from part
sql.append(ConditionInterface.SPACE);
sql.append(FROM);
sql.append(ConditionInterface.SPACE);
boolean firstFrom = true;
int fromLength = tableList.length;
for (int i=0; i<fromLength; i++)
{
TableItem tableItem = tableList[i];
if (firstFrom)
{
sql.append(tableItem.toSQLString());
firstFrom = false;
}
else
{
sql.append(COMMA);
sql.append(tableItem.toSQLString());
}
}
// where clause part
if (whereClause != null)
{
sql.append(ConditionInterface.SPACE);
sql.append(whereClause.toSQLString());
}
// group by part
if (groupBy != null)
{
sql.append(ConditionInterface.SPACE);
sql.append(groupBy.toSQLString());
}
sql.append(SEMICOLON);
return sql.toString();
}
}