package liquibase.sqlgenerator.core;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import liquibase.database.Database;
import liquibase.database.core.HsqlDatabase;
import liquibase.database.typeconversion.TypeConverterFactory;
import liquibase.sqlgenerator.SqlGeneratorChain;
import liquibase.statement.core.InsertOrUpdateStatement;
/**
* @author Andrew Muraco
*/
public class InsertOrUpdateGeneratorHsql extends InsertOrUpdateGenerator {
@Override
public boolean supports(InsertOrUpdateStatement statement, Database database) {
return database instanceof HsqlDatabase;
}
@Override
protected String getRecordCheck(InsertOrUpdateStatement insertOrUpdateStatement, Database database,
String whereClause) {
StringBuilder sql = new StringBuilder();
sql.append("MERGE INTO ");
sql.append(insertOrUpdateStatement.getTableName());
sql.append(" USING (VALUES (1)) ON ");
sql.append(whereClause);
sql.append(" WHEN NOT MATCHED THEN ");
return sql.toString();
}
@Override
protected String getInsertStatement(InsertOrUpdateStatement insertOrUpdateStatement, Database database,
SqlGeneratorChain sqlGeneratorChain) {
StringBuilder columns = new StringBuilder();
StringBuilder values = new StringBuilder();
for (String columnKey : insertOrUpdateStatement.getColumnValues().keySet()) {
columns.append(",");
columns.append(columnKey);
values.append(",");
values.append(convertToString(insertOrUpdateStatement.getColumnValue(columnKey), database));
}
columns.deleteCharAt(0);
values.deleteCharAt(0);
return "INSERT (" + columns.toString() + ") VALUES (" + values.toString() + ")";
}
@Override
protected String getElse(Database database) {
return " WHEN MATCHED THEN ";
}
@Override
protected String getUpdateStatement(InsertOrUpdateStatement insertOrUpdateStatement, Database database,
String whereClause, SqlGeneratorChain sqlGeneratorChain) {
StringBuilder sql = new StringBuilder("UPDATE SET ");
String[] pkFields = insertOrUpdateStatement.getPrimaryKey().split(",");
HashSet<String> hashPkFields = new HashSet<String>(Arrays.asList(pkFields));
for (String columnKey : insertOrUpdateStatement.getColumnValues().keySet()) {
if (!hashPkFields.contains(columnKey)) {
sql.append(columnKey).append(" = ");
sql.append(convertToString(insertOrUpdateStatement.getColumnValue(columnKey), database));
sql.append(",");
}
}
sql.deleteCharAt(sql.lastIndexOf(","));
return sql.toString();
}
// Copied from liquibase.sqlgenerator.core.InsertOrUpdateGeneratorMySQL
private String convertToString(Object newValue, Database database) {
String sqlString;
if (newValue == null || newValue.toString().equals("") || newValue.toString().equalsIgnoreCase("NULL")) {
sqlString = "NULL";
} else if (newValue instanceof String && database.shouldQuoteValue(((String) newValue))) {
sqlString = "'" + database.escapeStringForDatabase(newValue.toString()) + "'";
} else if (newValue instanceof Date) {
sqlString = database.getDateLiteral(((Date) newValue));
} else if (newValue instanceof Boolean) {
if (((Boolean) newValue)) {
sqlString = TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType()
.getTrueBooleanValue();
} else {
sqlString = TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType()
.getFalseBooleanValue();
}
} else {
sqlString = newValue.toString();
}
return sqlString;
}
}