package squill.query.cud;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import squill.db.TypedSQLException;
import squill.query.QueryContext;
import squill.query.select.Column;
import squill.query.select.ReadableTable;
/**
* @author Michael Hunger
* @since 24.08.2008
*/
public abstract class AbstractCUDElement<OBJ> implements CUDElement {
protected final ReadableTable<OBJ> table;
protected final OBJ updateObj;
private String sql;
private List<Object> args;
public AbstractCUDElement(ReadableTable<OBJ> table, OBJ updateObj) {
this.table = table;
this.updateObj = updateObj;
}
public String getDefaultSql() {
if (sql == null) {
generateSqlAndArgs();
}
return sql;
}
public List<Object> getSqlArguments() {
if (args == null) {
generateSqlAndArgs();
}
return args;
}
private void generateSqlAndArgs() {
Map<Column, Object> columnValueMap = table.getColumnValueMap(updateObj, true);
if (columnValueMap.isEmpty()) {
throw new TypedSQLException("Model object to update has no fields/getters!"); // TODO
}
List<Object> argsList = new ArrayList<Object>();
this.sql = createSqlAndArgs(columnValueMap, argsList);
args = argsList;
}
public void setQueryContext(QueryContext ctx) {
table.setQueryContext(ctx);
}
protected abstract String createSqlAndArgs(Map<Column, Object> columnValueMap, List<Object> argsList);
}