package de.unioninvestment.eai.portal.portlet.crud.scripting.domain.container.database; 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.List; import java.util.Map; import static com.google.common.base.Preconditions.checkArgument; /** * Created by cmj on 13.07.14. */ public class QueryUpdateStatementGenerator implements QueryStatementGenerator { private final Table table; private String tablename; private List<TableColumn> updateColumns; private List<String> idColumns; public QueryUpdateStatementGenerator(Table table) { this.table = table; } private void updateConfig() { if (tablename == null) { DatabaseQueryContainer container = (DatabaseQueryContainer) table.getContainer(); tablename = container.getTablename(); updateColumns = table.getColumns().getUpdateColumns(); idColumns = table.getColumns().getPrimaryKeyNames(); checkArgument(tablename != null, "Cannot generate UPDATE statements - Table name needed"); checkArgument(updateColumns.size() >= 1, "Cannot generate UPDATE statements - at least one column must be editable"); checkArgument(idColumns.size() >= 1, "Cannot generate UPDATE statements - at least one primary key column must exist"); } } public GString generateStatement(ScriptRow row) { updateConfig(); Map<String,Object> columnValues = row.getValues(); Object[] values = new Object[updateColumns.size() + idColumns.size()]; String[] strings = new String[values.length]; int valueIdx = 0; int stringIdx = 0; String head = "UPDATE " + QueryBuilder.quote(tablename) + " SET "; for (TableColumn column : updateColumns) { values[valueIdx++] = columnValues.get(column.getName()); strings[stringIdx++] = head + QueryBuilder.quote(column.getName()) + "="; head = ", "; } head = " WHERE "; Map<String,Object> idValues = row.getId(); for (String idName : idColumns) { values[valueIdx++] = idValues.get(idName); strings[stringIdx++] = head + QueryBuilder.quote(idName) + "="; head = " AND "; } return new GStringImpl(values, strings); } }