From 4fca0623dd07b6e47d2bb280d807d86b44c90092 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 3 Feb 2010 20:36:16 +0000 Subject: [PATCH] Ray's patch to fix empty table insertion. --- .../samskivert/depot/impl/BuildVisitor.java | 74 ++++++++++--------- .../depot/impl/PostgreSQLBuilder.java | 18 +++++ 2 files changed, 58 insertions(+), 34 deletions(-) diff --git a/src/java/com/samskivert/depot/impl/BuildVisitor.java b/src/java/com/samskivert/depot/impl/BuildVisitor.java index d8713f5..38a0368 100644 --- a/src/java/com/samskivert/depot/impl/BuildVisitor.java +++ b/src/java/com/samskivert/depot/impl/BuildVisitor.java @@ -493,46 +493,15 @@ public abstract class BuildVisitor implements FragmentVisitor public Void visit (InsertClause insertClause) { - Class pClass = insertClause.getPersistentClass(); - Object pojo = insertClause.getPojo(); - DepotMarshaller marsh = _types.getMarshaller(pClass); _innerClause = true; - - Set idFields = insertClause.getIdentityFields(); - ColumnExp[] fields = marsh.getColumnFieldNames(); - _builder.append("insert into "); appendTableName(insertClause.getPersistentClass()); - _builder.append(" ("); - - boolean comma = false; - for (ColumnExp field : fields) { - if (idFields.contains(field.name)) { - continue; - } - if (comma) { - _builder.append(", "); - } - comma = true; - appendLhsColumn(pClass, field); - } - _builder.append(") values ("); - - comma = false; - for (ColumnExp field : fields) { - if (idFields.contains(field.name)) { - continue; - } - if (comma) { - _builder.append(", "); - } - comma = true; - bindField(pClass, field, pojo); - } - _builder.append(")"); + _builder.append(" "); + appendInsertColumns(insertClause); return null; } + public Void visit (CreateIndexClause createIndexClause) { _builder.append("create "); @@ -912,6 +881,43 @@ public abstract class BuildVisitor implements FragmentVisitor _builder.append(")"); } + // output the column names and values for an insert + protected void appendInsertColumns (InsertClause insertClause) + { + Class pClass = insertClause.getPersistentClass(); + Object pojo = insertClause.getPojo(); + DepotMarshaller marsh = _types.getMarshaller(pClass); + Set idFields = insertClause.getIdentityFields(); + ColumnExp[] fields = marsh.getColumnFieldNames(); + + _builder.append("("); + boolean comma = false; + for (ColumnExp field : fields) { + if (idFields.contains(field.name)) { + continue; + } + if (comma) { + _builder.append(", "); + } + comma = true; + appendLhsColumn(pClass, field); + } + _builder.append(") values ("); + + comma = false; + for (ColumnExp field : fields) { + if (idFields.contains(field.name)) { + continue; + } + if (comma) { + _builder.append(", "); + } + comma = true; + bindField(pClass, field, pojo); + } + _builder.append(")"); + } + protected BuildVisitor (DepotTypes types) { _types = types; diff --git a/src/java/com/samskivert/depot/impl/PostgreSQLBuilder.java b/src/java/com/samskivert/depot/impl/PostgreSQLBuilder.java index a548acf..8642c50 100644 --- a/src/java/com/samskivert/depot/impl/PostgreSQLBuilder.java +++ b/src/java/com/samskivert/depot/impl/PostgreSQLBuilder.java @@ -39,6 +39,8 @@ import com.samskivert.depot.Exps; import com.samskivert.depot.PersistentRecord; import com.samskivert.depot.annotation.FullTextIndex.Configuration; import com.samskivert.depot.annotation.FullTextIndex; +import com.samskivert.depot.clause.InsertClause; +import com.samskivert.depot.expression.ColumnExp; import com.samskivert.depot.impl.expression.IntervalExp; import com.samskivert.depot.impl.expression.DateFun.DatePart; import com.samskivert.depot.impl.expression.DateFun.DateTruncate; @@ -136,6 +138,22 @@ public class PostgreSQLBuilder _builder.append("\"").append(field).append("\""); } + @Override protected void appendInsertColumns (InsertClause insertClause) + { + // see if we will be inserting any columns whatsoever + Class pClass = insertClause.getPersistentClass(); + Set idFields = insertClause.getIdentityFields(); + for (ColumnExp field : _types.getMarshaller(pClass).getColumnFieldNames()) { + if (!idFields.contains(field.name)) { + // we found a field we're inserting, so call super and finish + super.appendInsertColumns(insertClause); + return; + } + } + // we never found anything we'll actually be inserting + _builder.append("default values"); + } + protected PGBuildVisitor (DepotTypes types) { super(types);