package nl.elastique.poetry.utils;
import java.security.InvalidParameterException;
import java.util.Date;
import java.util.List;
public class QueryUtils
{
/**
* Convert an Object to a String so that it can be used as a query parameter.
* This method supports objects instantiated or derived from:
* Integer, Long, Float, Double, Boolean, Short, Byte, CharSequence and Date
*
* @param object the object to convert
* @return the String representing the input object
* @throws InvalidParameterException when the input object is not supported
*/
public static String parseAttribute(Object object) throws InvalidParameterException
{
if (Integer.class.isAssignableFrom(object.getClass()))
{
return Integer.toString((Integer)object);
}
else if (Long.class.isAssignableFrom(object.getClass()))
{
return Long.toString((Long)object);
}
else if (Float.class.isAssignableFrom(object.getClass()))
{
return Float.toString((Float)object);
}
else if (Double.class.isAssignableFrom(object.getClass()))
{
return Double.toString((Double)object);
}
else if (Boolean.class.isAssignableFrom(object.getClass()))
{
return Boolean.toString((Boolean)object);
}
else if (Short.class.isAssignableFrom(object.getClass()))
{
return Short.toString((Short)object);
}
else if (Byte.class.isAssignableFrom(object.getClass()))
{
return Byte.toString((Byte)object);
}
else if (CharSequence.class.isAssignableFrom(object.getClass()) || Date.class.isAssignableFrom(object.getClass()))
{
return object.toString();
}
else
{
throw new InvalidParameterException("parameter type not supported: " + object.getClass().getName());
}
}
/**
* Creates an "IN (?, ...)" query and outputs target ids.
*
* @param targetIds a list of IDs for the query
* @param outputQueryArgs the array that will hold the output values for the query
* @return the query part
*/
public static String createInClause(List<Object> targetIds, String[] outputQueryArgs)
{
if (outputQueryArgs.length != targetIds.size())
{
throw new RuntimeException("targetIds and targetIdArgs must be the same size");
}
StringBuilder in_clause_builder = new StringBuilder(5 + (targetIds.size()));
in_clause_builder.append("IN (");
for (int i = 0; i < targetIds.size(); ++i)
{
outputQueryArgs[i] = parseAttribute(targetIds.get(i));
in_clause_builder.append('?');
if (i != (targetIds.size() - 1))
{
in_clause_builder.append(',');
}
}
in_clause_builder.append(')');
return in_clause_builder.toString();
}
}