package cn.com.iresearch.mvideotracker.db.sqlite;
import cn.com.iresearch.mvideotracker.db.exception.DbException;
import cn.com.iresearch.mvideotracker.db.table.Id;
import cn.com.iresearch.mvideotracker.db.table.KeyValue;
import cn.com.iresearch.mvideotracker.db.table.ManyToOne;
import cn.com.iresearch.mvideotracker.db.table.Property;
import cn.com.iresearch.mvideotracker.db.table.TableInfo;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class SqlBuilder
{
public static SqlInfo buildInsertSql(Object entity)
{
List<KeyValue> keyValueList = getSaveKeyValueListByEntity(entity);
StringBuffer strSQL = new StringBuffer();
SqlInfo sqlInfo = null;
if (keyValueList != null && keyValueList.size() > 0)
{
sqlInfo = new SqlInfo();
strSQL.append("INSERT INTO ");
strSQL.append(TableInfo.get(entity.getClass()).getTableName());
strSQL.append(" (");
for (KeyValue kv : keyValueList)
{
strSQL.append(kv.getKey()).append(",");
sqlInfo.addValue(kv.getValue());
}
strSQL.deleteCharAt(strSQL.length() - 1);
strSQL.append(") VALUES ( ");
int length = keyValueList.size();
for (int i = 0; i < length; i++)
{
strSQL.append("?,");
}
strSQL.deleteCharAt(strSQL.length() - 1);
strSQL.append(")");
sqlInfo.setSql(strSQL.toString());
}
return sqlInfo;
}
public static List<KeyValue> getSaveKeyValueListByEntity(Object entity)
{
// List<KeyValue> keyValueList = new ArrayList<KeyValue>();
List<KeyValue> keyValueList = new LinkedList<KeyValue>();
TableInfo table = TableInfo.get(entity.getClass());
Object idvalue = table.getId().getValue(entity);
if (!(idvalue instanceof Integer))
{
if (idvalue instanceof String && idvalue != null)
{
KeyValue kv = new KeyValue(table.getId().getColumn(), idvalue);
keyValueList.add(kv);
}
}
Collection<Property> propertys = table.propertyMap.values();
for (Property property : propertys)
{
KeyValue kv = property2KeyValue(property, entity);
if (kv != null)
keyValueList.add(kv);
}
Collection<ManyToOne> manyToOnes = table.manyToOneMap.values();
for (ManyToOne many : manyToOnes)
{
KeyValue kv = manyToOne2KeyValue(many, entity);
if (kv != null)
keyValueList.add(kv);
}
return keyValueList;
}
private static String getDeleteSqlBytableName(String tableName)
{
return "DELETE FROM " + tableName;
}
public static SqlInfo buildDeleteSql(Object entity)
{
TableInfo table = TableInfo.get(entity.getClass());
Id id = table.getId();
Object idvalue = id.getValue(entity);
if (idvalue == null)
{
throw new DbException("getDeleteSQL:" + entity.getClass() + " id value is null");
}
StringBuffer strSQL = new StringBuffer(getDeleteSqlBytableName(table.getTableName()));
strSQL.append(" WHERE ").append(id.getColumn()).append("=?");
SqlInfo sqlInfo = new SqlInfo();
sqlInfo.setSql(strSQL.toString());
sqlInfo.addValue(idvalue);
return sqlInfo;
}
public static SqlInfo buildDeleteSql(Class<?> clazz, Object idValue)
{
TableInfo table = TableInfo.get(clazz);
Id id = table.getId();
if (null == idValue)
{
throw new DbException("getDeleteSQL:idValue is null");
}
StringBuffer strSQL = new StringBuffer(getDeleteSqlBytableName(table.getTableName()));
strSQL.append(" WHERE ").append(id.getColumn()).append("=?");
SqlInfo sqlInfo = new SqlInfo();
sqlInfo.setSql(strSQL.toString());
sqlInfo.addValue(idValue);
return sqlInfo;
}
public static String buildDeleteSql(Class<?> clazz, String strWhere)
{
TableInfo table = TableInfo.get(clazz);
StringBuffer strSQL = new StringBuffer(getDeleteSqlBytableName(table.getTableName()));
if (!TextUtils.isEmpty(strWhere))
{
strSQL.append(" WHERE ");
strSQL.append(strWhere);
}
return strSQL.toString();
}
private static String getSelectSqlByTableName(String tableName)
{
return new StringBuffer("SELECT * FROM ").append(tableName).toString();
}
public static String getSelectSQL(Class<?> clazz, Object idValue)
{
TableInfo table = TableInfo.get(clazz);
StringBuffer strSQL = new StringBuffer(getSelectSqlByTableName(table.getTableName()));
strSQL.append(" WHERE ");
strSQL.append(getPropertyStrSql(table.getId().getColumn(), idValue));
return strSQL.toString();
}
public static SqlInfo getSelectSqlAsSqlInfo(Class<?> clazz, Object idValue)
{
TableInfo table = TableInfo.get(clazz);
StringBuffer strSQL = new StringBuffer(getSelectSqlByTableName(table.getTableName()));
strSQL.append(" WHERE ").append(table.getId().getColumn()).append("=?");
SqlInfo sqlInfo = new SqlInfo();
sqlInfo.setSql(strSQL.toString());
sqlInfo.addValue(idValue);
return sqlInfo;
}
public static String getSelectSQL(Class<?> clazz)
{
return getSelectSqlByTableName(TableInfo.get(clazz).getTableName());
}
public static String getSelectSQLByWhere(Class<?> clazz, String strWhere)
{
TableInfo table = TableInfo.get(clazz);
StringBuffer strSQL = new StringBuffer(getSelectSqlByTableName(table.getTableName()));
if (!TextUtils.isEmpty(strWhere))
{
strSQL.append(" WHERE ").append(strWhere);
}
return strSQL.toString();
}
// ////////////////////////////update sql
// start/////////////////////////////////////////////
public static SqlInfo getUpdateSqlAsSqlInfo(Object entity)
{
TableInfo table = TableInfo.get(entity.getClass());
Object idvalue = table.getId().getValue(entity);
if (null == idvalue)
{
throw new DbException("this entity[" + entity.getClass() + "]'s id value is null");
}
List<KeyValue> keyValueList = new ArrayList<KeyValue>();
Collection<Property> propertys = table.propertyMap.values();
for (Property property : propertys)
{
KeyValue kv = property2KeyValue(property, entity);
if (kv != null)
keyValueList.add(kv);
}
Collection<ManyToOne> manyToOnes = table.manyToOneMap.values();
for (ManyToOne many : manyToOnes)
{
KeyValue kv = manyToOne2KeyValue(many, entity);
if (kv != null)
keyValueList.add(kv);
}
if (keyValueList == null || keyValueList.size() == 0)
return null;
SqlInfo sqlInfo = new SqlInfo();
StringBuffer strSQL = new StringBuffer("UPDATE ");
strSQL.append(table.getTableName());
strSQL.append(" SET ");
for (KeyValue kv : keyValueList)
{
strSQL.append(kv.getKey()).append("=?,");
sqlInfo.addValue(kv.getValue());
}
strSQL.deleteCharAt(strSQL.length() - 1);
strSQL.append(" WHERE ").append(table.getId().getColumn()).append("=?");
sqlInfo.addValue(idvalue);
sqlInfo.setSql(strSQL.toString());
return sqlInfo;
}
public static SqlInfo getUpdateSqlAsSqlInfo(Object entity, String strWhere)
{
TableInfo table = TableInfo.get(entity.getClass());
List<KeyValue> keyValueList = new ArrayList<KeyValue>();
Collection<Property> propertys = table.propertyMap.values();
for (Property property : propertys)
{
KeyValue kv = property2KeyValue(property, entity);
if (kv != null)
keyValueList.add(kv);
}
Collection<ManyToOne> manyToOnes = table.manyToOneMap.values();
for (ManyToOne many : manyToOnes)
{
KeyValue kv = manyToOne2KeyValue(many, entity);
if (kv != null)
keyValueList.add(kv);
}
if (keyValueList == null || keyValueList.size() == 0)
{
throw new DbException("this entity[" + entity.getClass() + "] has no property");
}
SqlInfo sqlInfo = new SqlInfo();
StringBuffer strSQL = new StringBuffer("UPDATE ");
strSQL.append(table.getTableName());
strSQL.append(" SET ");
for (KeyValue kv : keyValueList)
{
strSQL.append(kv.getKey()).append("=?,");
sqlInfo.addValue(kv.getValue());
}
strSQL.deleteCharAt(strSQL.length() - 1);
if (!TextUtils.isEmpty(strWhere))
{
strSQL.append(" WHERE ").append(strWhere);
}
sqlInfo.setSql(strSQL.toString());
return sqlInfo;
}
/**
* 通过一个java对象,获取创建该对象的数据库表
*
* @param clazz
* @return
*/
public static String getCreatTableSQL(Class<?> clazz)
{
TableInfo table = TableInfo.get(clazz);
Id id = table.getId();
StringBuffer strSQL = new StringBuffer();
strSQL.append("CREATE TABLE IF NOT EXISTS ");
strSQL.append(table.getTableName());
strSQL.append(" ( ");
Class<?> primaryClazz = id.getDataType();
if (primaryClazz == int.class || primaryClazz == Integer.class)
strSQL.append("\"").append(id.getColumn()).append("\" ").append("INTEGER PRIMARY KEY AUTOINCREMENT,");
else
strSQL.append("\"").append(id.getColumn()).append("\" ").append("TEXT PRIMARY KEY,");
Collection<Property> propertys = table.propertyMap.values();
for (Property property : propertys)
{
strSQL.append("\"").append(property.getColumn());
strSQL.append("\",");
}
Collection<ManyToOne> manyToOnes = table.manyToOneMap.values();
for (ManyToOne manyToOne : manyToOnes)
{
strSQL.append("\"").append(manyToOne.getColumn()).append("\",");
}
strSQL.deleteCharAt(strSQL.length() - 1);
strSQL.append(" )");
return strSQL.toString();
}
/**
* @param key
* @param value
* @return eg1: name='afinal' eg2: id=100
*/
private static String getPropertyStrSql(String key, Object value)
{
StringBuffer sbSQL = new StringBuffer(key).append("=");
if (value instanceof String || value instanceof java.util.Date || value instanceof java.sql.Date)
{
sbSQL.append("'").append(value).append("'");
} else
{
sbSQL.append(value);
}
return sbSQL.toString();
}
private static KeyValue property2KeyValue(Property property, Object entity)
{
KeyValue kv = null;
String pcolumn = property.getColumn();
Object value = property.getValue(entity);
if (value != null)
{
kv = new KeyValue(pcolumn, value);
} else
{
if (property.getDefaultValue() != null && property.getDefaultValue().trim().length() != 0)
kv = new KeyValue(pcolumn, property.getDefaultValue());
}
return kv;
}
private static KeyValue manyToOne2KeyValue(ManyToOne many, Object entity)
{
KeyValue kv = null;
String manycolumn = many.getColumn();
Object manyobject = many.getValue(entity);
if (manyobject != null)
{
Object manyvalue = TableInfo.get(manyobject.getClass()).getId().getValue(manyobject);
if (manycolumn != null && manyvalue != null)
{
kv = new KeyValue(manycolumn, manyvalue);
}
}
return kv;
}
}