package com.salama.android.dataservice;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import MetoXML.Util.PropertyDescriptor;
import com.salama.android.datacore.DBDataUtil;
import com.salama.android.datacore.DataTableSetting;
import com.salama.android.datacore.PropertyInfoUtil;
import com.salama.android.datacore.SqliteUtil;
import com.salama.android.datacore.SqliteUtilException;
public class ExtraIndexManager {
/**
* 外部索引表名前缀
*/
public static final String PREFIX_SETTING_TABLE_NAME = "ExtraIndex";
/**
* 取得外部索引表名
* @param dataTableName 数据表名
* @return 外部索引表名
*/
public static String getExtraIndexTableNameByDataTableName(String dataTableName) {
return PREFIX_SETTING_TABLE_NAME + dataTableName;
}
/**
* 创建外部索引表
* @param dataTableName 数据表名
* @param dataPrimaryKeys 数据表主键(逗号分隔)
* @param extraIndexes 外部索引字段(逗号分隔)
* @param dataClass 数据类型
* @param dbDataUtil DBDataUtil实例
*/
public static void createExtraIndexTableWithDataTableName(String dataTableName, String dataPrimaryKeys,
String extraIndexes, Class<?> dataClass, DBDataUtil dbDataUtil) {
int i;
StringBuilder sql = new StringBuilder();
String indexTableName = getExtraIndexTableNameByDataTableName(dataTableName);
sql.append("create table " + indexTableName + " (");
String[] indexNameArray = extraIndexes.split(",");
for(i = 0; i < indexNameArray.length; i++) {
sql.append(indexNameArray[i] + " TEXT,");
}
//data pk column
String[] pkNameArray = dataPrimaryKeys.split(",");
List<PropertyDescriptor> propertyArray = PropertyInfoUtil.getPropertyInfoList(dataClass);
SqliteUtil.SqliteColType sqliteColumnType;
boolean isPK;
int k;
PropertyDescriptor propertyInfo;
for(i = 0; i < propertyArray.size(); i++) {
propertyInfo = propertyArray.get(i);
isPK = false;
for(k = 0; k < pkNameArray.length; k++) {
if(pkNameArray[k].equalsIgnoreCase(propertyInfo.getName())) {
isPK = true;
break;
}
}
if(!isPK) {
break;
}
sqliteColumnType = SqliteUtil.getSQLiteColumnTypeByPropertyType(propertyInfo.getClass());
if(sqliteColumnType == SqliteUtil.SqliteColType.SQLITE_TEXT) {
sql.append(propertyInfo.getName() + " TEXT,");
} else if (sqliteColumnType == SqliteUtil.SqliteColType.SQLITE_INTEGER) {
sql.append(propertyInfo.getName() + " INTEGER,");
} else if (sqliteColumnType == SqliteUtil.SqliteColType.SQLITE_FLOAT) {
sql.append(propertyInfo.getName() + " REAL,");
}
}
//primary key for this table
StringBuilder pkOfThisTable = new StringBuilder();
pkOfThisTable.append(extraIndexes);
if(!extraIndexes.endsWith(",") && !dataPrimaryKeys.startsWith(",")) {
pkOfThisTable.append(",");
}
pkOfThisTable.append(dataPrimaryKeys);
sql.append(" primary key(" + pkOfThisTable + ")");
//end of create table
sql.append(")");
//Execute the sql
dbDataUtil.getSqliteUtil().executeUpdate(sql.toString());
}
/**
* 删除外部索引表名
* @param dataTableName 数据表名
* @param dbDataUtil DBDataUtil实例
*/
public static void dropExtraIndexTableByDataTableName(String dataTableName, DBDataUtil dbDataUtil) {
dbDataUtil.dropTable(getExtraIndexTableNameByDataTableName(dataTableName));
}
/**
* 插入外部索引记录
* @param dataTableName 数据表名
* @param datas 数据列表
* @param extraIndexNames 外部索引字段名(逗号分隔)
* @param extraIndexValues 外部索引值(逗号分隔)
* @param dbDataUtil DBDataUtil实例
* @throws SqliteUtilException
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static void insertExtraIndexWithDataTableName(String dataTableName, List<?> datas,
List<String> extraIndexNames, List<String> extraIndexValues, DBDataUtil dbDataUtil)
throws SqliteUtilException, InvocationTargetException, IllegalAccessException {
if(datas == null || datas.size() == 0) {
return;
}
int i;
//create sql format -------------------------------------------------
StringBuilder sqlFormat = new StringBuilder();
//beginning of sql
sqlFormat.append("insert into " + getExtraIndexTableNameByDataTableName(dataTableName) + " (");
//columns of extra indexes
sqlFormat.append(" ," + extraIndexNames.get(0));
for(i = 1; i < extraIndexNames.size(); i++) {
sqlFormat.append(" ," + extraIndexNames.get(i));
}
//columns of data primary keys
DataTableSetting dataTableSetting = dbDataUtil.getDataTableSetting(dataTableName);
String[] dataPkArray = dataTableSetting.getPrimaryKeys().split(",");
for(i = 0; i < dataPkArray.length; i++) {
sqlFormat.append(" ," + dataPkArray[i]);
}
// end of setting columns ----
sqlFormat.append(") values (");
//value of extra indexes
sqlFormat.append(" '" + SqliteUtil.encodeQuoteChar(extraIndexValues.get(0)) + "' ");
for(i = 1; i < extraIndexValues.size(); i++) {
sqlFormat.append(",'" + SqliteUtil.encodeQuoteChar(extraIndexValues.get(i)) + "' ");
}
// set values of primary key ------------------------------------------------------------------
//data pk column
SqliteUtil.SqliteColType sqliteType;
PropertyDescriptor propertyInfo;
int k;
List<PropertyDescriptor> propertyInfoArrayOfDataClass =
PropertyInfoUtil.getPropertyInfoList(datas.get(0).getClass());
List<PropertyDescriptor> propertyInfoArrayOfPKs = new ArrayList<PropertyDescriptor>();
for(i = 0; i < dataPkArray.length; i++) {
for(k = 0; k < propertyInfoArrayOfDataClass.size(); k++) {
propertyInfo = propertyInfoArrayOfDataClass.get(k);
if(propertyInfo.getName().equalsIgnoreCase(dataPkArray[i])) {
//pk
propertyInfoArrayOfPKs.add(propertyInfo);
break;
}
}
}
//sql
int sqlPrefixLength = sqlFormat.length();
Object oneDataTmp = null;
Object propertyValue = null;
for(k = 0; k < datas.size(); k++) {
if(sqlFormat.length() > sqlPrefixLength) {
sqlFormat.delete(sqlPrefixLength, sqlFormat.length());
}
oneDataTmp = datas.get(k);
//handle one data row ----------------------
for(i = 0; i < propertyInfoArrayOfPKs.size(); i++) {
propertyInfo = propertyInfoArrayOfPKs.get(i);
propertyValue = propertyInfo.getReadMethod().invoke(oneDataTmp);
sqliteType = SqliteUtil.getSQLiteColumnTypeByPropertyType(propertyInfo.getPropertyType());
if(sqliteType == SqliteUtil.SqliteColType.SQLITE_TEXT) {
sqlFormat.append(",'" + SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(propertyValue)) + "' ");
} else if(sqliteType == SqliteUtil.SqliteColType.SQLITE_INTEGER) {
sqlFormat.append("," + SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(propertyValue)));
} else if(sqliteType == SqliteUtil.SqliteColType.SQLITE_FLOAT) {
sqlFormat.append("," + SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(propertyValue)));
}
}
//end of insert sql
sqlFormat.append(")");
//execute
dbDataUtil.getSqliteUtil().executeUpdate(sqlFormat.toString());
}
}
/**
* 删除外部索引记录
* @param dataTableName 数据表名
* @param datas 数据列表
* @param extraIndexNames 外部索引字段名(逗号分隔)
* @param extraIndexValues 外部索引值(逗号分隔)
* @param dbDataUtil DBDataUtil实例
* @throws SqliteUtilException
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static void deleteExtraIndexByDataTableName(String dataTableName, List<?> datas,
List<String> extraIndexNames, List<String> extraIndexValues, DBDataUtil dbDataUtil)
throws SqliteUtilException, InvocationTargetException, IllegalAccessException {
if(datas == null || datas.size() == 0) {
return;
}
int i;
StringBuilder sqlFormat = new StringBuilder();
String indexTableName = getExtraIndexTableNameByDataTableName(dataTableName);
sqlFormat.append("delete from " + indexTableName);
sqlFormat.append(" where ");
//conditions of extra index
sqlFormat.append(" " + extraIndexNames.get(0) + " = '"
+ SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(extraIndexValues.get(0))) + "' ");
for(i = 1; i < extraIndexNames.size(); i++) {
sqlFormat.append(" and " + extraIndexNames.get(i) + " = '"
+ SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(extraIndexValues.get(i)))
+ "' ");
}
// set values of primary key ------------------------------------------------------------------
//data pk column
SqliteUtil.SqliteColType sqliteType;
PropertyDescriptor propertyInfo;
int k;
DataTableSetting dataTableSetting = dbDataUtil.getDataTableSetting(dataTableName);
String[] dataPkArray = dataTableSetting.getPrimaryKeys().split(",");
List<PropertyDescriptor> propertyInfoArrayOfDataClass =
PropertyInfoUtil.getPropertyInfoList(datas.get(0).getClass());
List<PropertyDescriptor> propertyInfoArrayOfPKs = new ArrayList<PropertyDescriptor>();
for(i = 0; i < dataPkArray.length; i++) {
for(k = 0; k < propertyInfoArrayOfDataClass.size(); k++) {
propertyInfo = propertyInfoArrayOfDataClass.get(k);
if(propertyInfo.getName().equalsIgnoreCase(dataPkArray[i])) {
//pk
propertyInfoArrayOfPKs.add(propertyInfo);
break;
}
}
}
//sql
sqlFormat.append(" and (");
String pkNameTmp = null;
Object oneDataTmp = null;
Object propertyValue = null;
for(k = 0; k < datas.size(); k++) {
oneDataTmp = datas.get(k);
if(k == 0) {
sqlFormat.append(" (");
} else {
sqlFormat.append(" or (");
}
//handle one data row ----------------------
for(i = 0; i < propertyInfoArrayOfPKs.size(); i++) {
propertyInfo = propertyInfoArrayOfPKs.get(i);
pkNameTmp = dataPkArray[i];
propertyValue = propertyInfo.getReadMethod().invoke(oneDataTmp);
sqliteType = SqliteUtil.getSQLiteColumnTypeByPropertyType(propertyInfo.getPropertyType());
if(sqliteType == SqliteUtil.SqliteColType.SQLITE_TEXT) {
sqlFormat.append(" and " + pkNameTmp + " = '"
+ SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(propertyValue))
+ "' ");
} else if(sqliteType == SqliteUtil.SqliteColType.SQLITE_INTEGER) {
sqlFormat.append(" and " + pkNameTmp + " = "
+ SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(propertyValue)));
} else if(sqliteType == SqliteUtil.SqliteColType.SQLITE_FLOAT) {
sqlFormat.append(" and " + pkNameTmp + " = "
+ SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(propertyValue)));
}
}
sqlFormat.append(" ) ");
}
sqlFormat.append(")");
dbDataUtil.getSqliteUtil().executeUpdate(sqlFormat.toString());
}
/**
* 删除外部索引记录
* @param dataTableName 数据表名
* @param datas 数据列表
* @param dbDataUtil DBDataUtil实例
* @throws SqliteUtilException
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static void deleteExtraIndexByDataTableName(String dataTableName, List<?> datas,
DBDataUtil dbDataUtil) throws SqliteUtilException, InvocationTargetException, IllegalAccessException {
if(datas == null || datas.size() == 0) {
return;
}
int i;
StringBuilder sqlFormat = new StringBuilder();
String indexTableName = getExtraIndexTableNameByDataTableName(dataTableName);
sqlFormat.append("delete from " + indexTableName);
sqlFormat.append(" where ");
// set values of primary key ------------------------------------------------------------------
//data pk column
SqliteUtil.SqliteColType sqliteType;
PropertyDescriptor propertyInfo;
int k;
DataTableSetting dataTableSetting = dbDataUtil.getDataTableSetting(dataTableName);
String[] dataPkArray = dataTableSetting.getPrimaryKeys().split(",");
List<PropertyDescriptor> propertyInfoArrayOfDataClass =
PropertyInfoUtil.getPropertyInfoList(datas.get(0).getClass());
List<PropertyDescriptor> propertyInfoArrayOfPKs = new ArrayList<PropertyDescriptor>();
for(i = 0; i < dataPkArray.length; i++) {
for(k = 0; k < propertyInfoArrayOfDataClass.size(); k++) {
propertyInfo = propertyInfoArrayOfDataClass.get(k);
if(propertyInfo.getName().equalsIgnoreCase(dataPkArray[i])) {
//pk
propertyInfoArrayOfPKs.add(propertyInfo);
break;
}
}
}
//sql
String pkNameTmp = null;
Object oneDataTmp = null;
Object propertyValue = null;
for(k = 0; k < datas.size(); k++) {
oneDataTmp = datas.get(k);
if(k == 0) {
sqlFormat.append(" (");
} else {
sqlFormat.append(" or (");
}
//handle one data row ----------------------
for(i = 0; i < propertyInfoArrayOfPKs.size(); i++) {
propertyInfo = propertyInfoArrayOfPKs.get(i);
pkNameTmp = dataPkArray[i];
propertyValue = propertyInfo.getReadMethod().invoke(oneDataTmp);
sqliteType = SqliteUtil.getSQLiteColumnTypeByPropertyType(propertyInfo.getPropertyType());
if(sqliteType == SqliteUtil.SqliteColType.SQLITE_TEXT) {
sqlFormat.append(" and " + pkNameTmp + " = '"
+ SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(propertyValue))
+ "' ");
} else if(sqliteType == SqliteUtil.SqliteColType.SQLITE_INTEGER) {
sqlFormat.append(" and " + pkNameTmp + " = "
+ SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(propertyValue)));
} else if(sqliteType == SqliteUtil.SqliteColType.SQLITE_FLOAT) {
sqlFormat.append(" and " + pkNameTmp + " = "
+ SqliteUtil.encodeQuoteChar(SqliteUtil.convertObjectToString(propertyValue)));
}
}
sqlFormat.append(" ) ");
}
dbDataUtil.getSqliteUtil().executeUpdate(sqlFormat.toString());
}
}