package joist.domain.orm.queries;
import java.util.ArrayList;
import java.util.List;
import joist.domain.DomainObject;
import joist.domain.uow.UoW;
import joist.jdbc.Jdbc;
import joist.util.StringBuilderr;
import joist.util.Wrap;
/** A class for issuing UPDATEs against a table with custom SETs and WHERE clauses. */
public class Update<T extends DomainObject> {
private final Alias<T> alias;
private final List<SetItem<T>> setItems = new ArrayList<SetItem<T>>();
private Where where = null;
public static <T extends DomainObject> Update<T> into(Alias<T> alias) {
return new Update<T>(alias);
}
private Update(Alias<T> alias) {
this.alias = alias;
}
public void set(SetItem<T> setItem) {
this.setItems.add(setItem);
}
public void where(Where where) {
this.where = where;
}
public int execute() {
return Jdbc.update(UoW.getConnection(), this.toSql(), this.getParameters());
}
public String toSql() {
StringBuilderr s = new StringBuilderr();
s.line("UPDATE {}", Wrap.quotes(this.alias.getTableName()));
s.append(" SET ");
for (SetItem<T> c : this.setItems) {
s.append(Wrap.quotes(c.getColumn().getName()));
s.append(" = ?, ");
}
s.stripLastCommaSpace();
s.line();
if (this.where != null) {
s.line(" WHERE {}", this.where.getSqlWithoutAliasPrefix(this.alias.getName()));
}
s.stripTrailingNewLine();
return s.toString();
}
public List<Object> getParameters() {
List<Object> parameters = new ArrayList<Object>();
for (SetItem<T> item : this.setItems) {
parameters.add(item.getValue());
}
parameters.addAll(this.where.getParameters());
return parameters;
}
}