package com.spun.util.database;
import java.sql.Timestamp;
import java.util.Date;
import com.spun.util.DatabaseUtils;
import com.spun.util.date.DateRange;
/*
* This class is immutable
*/
public class SQLWhere
{
private String part;
/**************************************************************************/
public SQLWhere(String part)
{
this.part = part.trim();
}
/**************************************************************************/
public SQLWhere(ColumnMetadata metadata, String alias, String comparator, Object part2)
{
this(SQLUtils.compareBy(metadata, alias, comparator, part2));
}
/**************************************************************************/
public SQLWhere(ColumnMetadata metadata, String alias, Object value)
{
this(SQLUtils.compareByEquals(metadata, alias, value));
}
/**************************************************************************/
public SQLWhere(String part1, String comparator, ColumnMetadata metadata, String alias)
{
this(part1 + " " + comparator + " " + metadata.getNameWithPrefix(alias));
}
/**************************************************************************/
public SQLWhere(ColumnMetadata metadata1, String alias1, String comparator, ColumnMetadata metadata2,
String alias2)
{
this(metadata1.getNameWithPrefix(alias1) + " " + comparator + " " + metadata2.getNameWithPrefix(alias2));
}
/**************************************************************************/
public SQLWhere(String part1, String comparator, String part2)
{
this(part1 + " " + comparator + " " + part2);
}
/***********************************************************************/
public SQLWhere(ColumnMetadata metadata, String alias, boolean value)
{
this(SQLUtils.compareBy(metadata, alias, "=", value));
}
public SQLWhere(SQLQuery query, String comparator, String value)
{
this("(" + query.toString() + ")", comparator, value);
}
/**************************************************************************/
public static SQLWhere joinByOr(SQLWhere a, SQLWhere b)
{
if (a == null)
{
return b;
}
else if (b == null) { return a; }
return new SQLWhere(join(a, "OR", b));
}
/**************************************************************************/
public static SQLWhere joinByOr(SQLWhere a, SQLWhere b, SQLWhere c)
{
return new SQLWhere(a.toString() + " OR " + b.toString() + " OR " + c.toString());
}
/**************************************************************************/
private static String join(SQLWhere a, String join, SQLWhere b)
{
return a.toString() + " " + join + " " + b.toString();
}
/**************************************************************************/
public SQLWhere joinByAnd(SQLWhere a)
{
return joinByAnd(this, a);
}
/**************************************************************************/
public static SQLWhere joinByAnd(SQLWhere a, SQLWhere b)
{
if (a == null)
{
return b;
}
else if (b == null) { return a; }
return new SQLWhere(join(a, "AND", b));
}
/**************************************************************************/
@Override
public String toString()
{
return isPartWrapped(part) ? part : "(" + part + ")";
}
/**************************************************************************/
public static boolean isPartWrapped(String part)
{
if (part.charAt(0) != '(' || part.charAt(part.length() - 1) != ')') { return false; }
int count = 1;
for (int i = 1; i < part.length() - 1; i++)
{
switch (part.charAt(i))
{
case '(' :
count++;
break;
case ')' :
count--;
if (count == 0) { return false; }
break;
}
}
return true;
}
/***********************************************************************/
public static SQLWhere createBetween(ColumnMetadata column, String prefix, DateRange range)
{
return createBetween(range.getStart(), column, prefix, range.getEnd());
}
public static SQLWhere createBetween(Date startTime, ColumnMetadata column, String prefix, Date endTime)
{
return new SQLWhere(SQLUtils.createSQLBetween(new Timestamp(startTime.getTime()).toString(), column
.getNameWithPrefix(prefix), new Timestamp(endTime.getTime()).toString()));
}
/***********************************************************************/
public static SQLWhere createInSQLStatement(ColumnMetadata metadata, String alias, Object... values)
{
return new SQLWhere(SQLUtils.createInSQLStatement(metadata, alias, false, values));
}
/***********************************************************************/
public static SQLWhere createNotInSQLStatement(ColumnMetadata metadata, String alias, Object[] values)
{
return new SQLWhere(SQLUtils.createInSQLStatement(metadata, alias, true, values));
}
/***********************************************************************/
public static SQLWhere createInSQLStatement(ColumnMetadata metadata, String alias, boolean not, Object[] values)
{
return new SQLWhere(SQLUtils.createInSQLStatement(metadata, alias, not, values));
}
/**************************************************************************/
public static SQLWhere createLike(ColumnMetadata metaData, String alias, String search, int databaseType)
{
SQLWhere sql = new SQLWhere(metaData, alias, DatabaseUtils.getLike(databaseType), search);
return sql;
}
/**************************************************************************/
public static SQLWhere createNotNull(ColumnMetadata metadata, String alias)
{
return new SQLWhere(SQLUtils.compareBy(metadata, alias, "!=", null));
}
/**************************************************************************/
/**************************************************************************/
public static SQLWhere createNotLike(ColumnMetadata metaData, String alias, String search, int databaseType)
{
SQLWhere sql = new SQLWhere(metaData, alias, "NOT " + DatabaseUtils.getLike(databaseType), search);
return sql;
}
}