package dbmigrate.executor;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import dbmigrate.model.db.ITable;
import dbmigrate.model.db.Table;
import dbmigrate.model.operation.DropColumnOperationDescriptor;
import dbmigrate.model.operation.SplitColumnOperationDescriptor;
public class SplitColumnExecutor extends
GeneralExecutor<SplitColumnOperationDescriptor> {
public SplitColumnExecutor(Connection connection) {
this.setConnection(connection);
}
public void execute(SplitColumnOperationDescriptor operation)
throws SQLException {
AddColumnExecutor ace = new AddColumnExecutor(this.getConnection());
ace.execute(operation.getNewColumnDescriptor1());
ace.execute(operation.getNewColumnDescriptor2());
String sql = this.createSql(operation);
Statement stmt = this.getConnection().createStatement();
stmt.executeUpdate(sql);
DropColumnExecutor dcx = new DropColumnExecutor(this.getConnection());
ITable table = new Table();
table.setName(operation.getTableName());
DropColumnOperationDescriptor dcod = new DropColumnOperationDescriptor(
table, operation.getColumn());
dcx.execute(dcod);
}
public String createSql(SplitColumnOperationDescriptor operation) {
StringBuffer buf = new StringBuffer();
buf.append("UPDATE \"");
buf.append(operation.getTableName());
buf.append("\" SET ");
buf.append(operation.getNewColumnDescriptor1().getColumn()
.getName());
buf.append(" = regexp_split_to_array(");
buf.append(operation.getColumn().getName());
buf.append(", E'");
buf.append(operation.getRegexp());
buf.append("')[1], ");
buf.append(operation.getNewColumnDescriptor2().getColumn()
.getName()).append(" = regexp_split_to_array(");
buf.append(operation.getColumn().getName()).append(", E'");
buf.append(operation.getRegexp()).append("')[2]");
return buf.toString();
}
}