package de.unioninvestment.eai.portal.portlet.crud.scripting.domain.container.database;
import com.google.common.base.Strings;
import com.vaadin.data.util.sqlcontainer.query.generator.filter.QueryBuilder;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.DatabaseQueryContainer;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.Table;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.TableColumn;
import de.unioninvestment.eai.portal.portlet.crud.scripting.model.ScriptRow;
import groovy.lang.GString;
import org.codehaus.groovy.runtime.GStringImpl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import static com.google.common.base.Preconditions.checkArgument;
/**
* Created by cmj on 13.07.14.
*/
public class QueryInsertStatementGenerator implements QueryStatementGenerator {
private final Table table;
private String tablename;
private List<TableColumn> insertColumns;
public QueryInsertStatementGenerator(Table table) {
this.table = table;
}
private void updateConfig() {
if (tablename == null) {
DatabaseQueryContainer container = (DatabaseQueryContainer) table.getContainer();
tablename = container.getTablename();
checkArgument(tablename != null, "Cannot generate INSERT statements - Table name needed");
insertColumns = table.getColumns().getInsertColumns();
checkArgument(insertColumns.size() >= 1, "Cannot generate INSERT statements - at least one column must be editable");
}
}
public GString generateStatement(ScriptRow row) {
updateConfig();
Map<String,Object> columnValues = row.getValues();
Object[] values = new Object[insertColumns.size()];
String[] strings = new String[values.length + 1];
int stringIdx = 0;
int valueIdx = 0;
String head = "INSERT INTO " + QueryBuilder.quote(tablename) + " (";
for (TableColumn column : insertColumns) {
head += QueryBuilder.quote(column.getName()) + ",";
}
head = head.substring(0, head.length()-1) + ") VALUES (";
for (TableColumn column : insertColumns) {
if (!Strings.isNullOrEmpty(column.getSequence())) {
// Oracle specific
head += QueryBuilder.quote(column.getSequence()) + ".NEXTVAL,";
} else {
strings[stringIdx++] = head;
values[valueIdx++] = columnValues.get(column.getName());
head = ",";
}
}
strings[stringIdx++] = ")";
return new GStringImpl(
Arrays.copyOf(values, valueIdx),
Arrays.copyOf(strings, stringIdx));
}
}