/** * */ package squill.builder; import static squill.util.StringUtil.join; import java.util.Arrays; import java.util.List; import squill.db.Database; import squill.query.QueryContext; import squill.query.cud.InsertCruElement; import squill.query.cud.InsertFieldElement; import squill.query.select.WritableTable; import squill.query.select.Column; import squill.util.ToString; import squill.tuple.Tuple; /** * @param <TABLE> * Table type */ public class InsertBuilder<TABLE> extends BaseBuilder { private static final ToString<InsertFieldElement<?>> GET_SQL = new ToString<InsertFieldElement<?>>() { public String toString(InsertFieldElement<?> insertFieldElement) { return insertFieldElement.getField().getColumnName(); // getSql(); } }; private static final ToString<InsertFieldElement<?>> GET_FIELD_SQL = new ToString<InsertFieldElement<?>>() { public String toString(InsertFieldElement<?> insertFieldElement) { return insertFieldElement.getValueSql(); } }; // list of fields to select from private List<InsertFieldElement<TABLE>> fieldValueList; private InsertCruElement<TABLE> cruElement; /** * @param table Table to insert data into */ public InsertBuilder(QueryContext ctx, Database dataSource, WritableTable<TABLE> table) { super(ctx, dataSource); addTable(table); } // TODO when is this called in the lifecycle ? // should not execute the stuff //thesis:label=valuesMeetod public long values(InsertFieldElement<TABLE>... insertFieldElements) { for (InsertFieldElement<TABLE> insertElement : insertFieldElements) { insertElement.setQueryContext(ctx); addArgs(insertElement.getSqlArguments()); } fieldValueList = Arrays.asList(insertFieldElements); return executeCUD(); } public long values(InsertCruElement<TABLE> cruElement) { cruElement.setQueryContext(ctx); addArgs(cruElement.getSqlArguments()); this.cruElement = cruElement; return executeCUD(); } public String getSql() { StringBuilder sb = new StringBuilder(); sb.append("INSERT INTO "); sb.append(fromPart.getTablesSql()); sb.append(getTablesAndFieldsSql()); return sb.toString(); } private String getTablesAndFieldsSql() { // single CRU object if (cruElement != null) { return cruElement.getDefaultSql(); } if (fieldValueList == null) { return ""; } return " (" + join(fieldValueList, GET_SQL, ", ") + ") " + " VALUES ( " + join(fieldValueList, GET_FIELD_SQL, ", ") + ")"; } public <T extends Tuple> InsertBuilder<TABLE> returnId() { this.ctx.setReturnId(); return this; } }