From 7ba475e61ca002b815dbb69ac67d099f863f73de Mon Sep 17 00:00:00 2001 From: Charlie Groves Date: Fri, 24 Jun 2011 19:25:57 +0000 Subject: [PATCH] Use default values for the values section of an insert statement for hsqldb as well as postgres It blows up expecting a column name in the values parenthesis, but the default values string that postgres was working seems to work. It's not in http://hsqldb.org/doc/guide/ch09.html, but so it goes. --- .../samskivert/depot/impl/BuildVisitor.java | 18 +++++++++++ .../samskivert/depot/impl/MySQLBuilder.java | 5 +++ .../depot/impl/PostgreSQLBuilder.java | 18 ----------- .../samskivert/depot/AllGeneratedRecord.java | 31 +++++++++++++++++++ .../samskivert/depot/GeneratedValueTest.java | 25 ++++++++++++--- 5 files changed, 75 insertions(+), 22 deletions(-) create mode 100644 src/test/java/com/samskivert/depot/AllGeneratedRecord.java diff --git a/src/main/java/com/samskivert/depot/impl/BuildVisitor.java b/src/main/java/com/samskivert/depot/impl/BuildVisitor.java index bce08e3..8fe0fce 100644 --- a/src/main/java/com/samskivert/depot/impl/BuildVisitor.java +++ b/src/main/java/com/samskivert/depot/impl/BuildVisitor.java @@ -919,6 +919,12 @@ public abstract class BuildVisitor implements FragmentVisitor } } + // output the column name and value portion of an insert when all values are defaulted + protected void appendEmptyInsertValues () + { + _builder.append("default values"); + } + // output the column names and values for an insert protected void appendInsertColumns (InsertClause insertClause) { @@ -928,6 +934,18 @@ public abstract class BuildVisitor implements FragmentVisitor Set idFields = insertClause.getIdentityFields(); ColumnExp[] fields = marsh.getColumnFieldNames(); + boolean insertingSomething = false; + for (ColumnExp field : fields) { + if (!idFields.contains(field.name)) { + insertingSomething = true; + break; + } + } + if (!insertingSomething) { + appendEmptyInsertValues(); + return; + } + _builder.append("("); boolean comma = false; for (ColumnExp field : fields) { diff --git a/src/main/java/com/samskivert/depot/impl/MySQLBuilder.java b/src/main/java/com/samskivert/depot/impl/MySQLBuilder.java index fdb8c00..a138c4b 100644 --- a/src/main/java/com/samskivert/depot/impl/MySQLBuilder.java +++ b/src/main/java/com/samskivert/depot/impl/MySQLBuilder.java @@ -155,6 +155,11 @@ public class MySQLBuilder bindValue(fullText.getQuery()); _builder.append(" in boolean mode)"); } + + @Override protected void appendEmptyInsertValues () + { + _builder.append("() values ()"); + } } public MySQLBuilder (DepotTypes types) diff --git a/src/main/java/com/samskivert/depot/impl/PostgreSQLBuilder.java b/src/main/java/com/samskivert/depot/impl/PostgreSQLBuilder.java index 64a522e..d5dc95d 100644 --- a/src/main/java/com/samskivert/depot/impl/PostgreSQLBuilder.java +++ b/src/main/java/com/samskivert/depot/impl/PostgreSQLBuilder.java @@ -22,8 +22,6 @@ 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; @@ -121,22 +119,6 @@ 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, true); diff --git a/src/test/java/com/samskivert/depot/AllGeneratedRecord.java b/src/test/java/com/samskivert/depot/AllGeneratedRecord.java new file mode 100644 index 0000000..21f8efd --- /dev/null +++ b/src/test/java/com/samskivert/depot/AllGeneratedRecord.java @@ -0,0 +1,31 @@ +package com.samskivert.depot; + +import com.samskivert.depot.annotation.GeneratedValue; +import com.samskivert.depot.annotation.Id; +import com.samskivert.depot.expression.ColumnExp; + +public class AllGeneratedRecord extends PersistentRecord +{ + // AUTO-GENERATED: FIELDS START + public static final Class _R = AllGeneratedRecord.class; + public static final ColumnExp RECORD_ID = colexp(_R, "recordId"); + // AUTO-GENERATED: FIELDS END + + public static final int SCHEMA_VERSION = 1; + + @Id @GeneratedValue public int recordId; + + // AUTO-GENERATED: METHODS START + /** + * Create and return a primary {@link Key} to identify a {@link AllGeneratedRecord} + * with the supplied key values. + */ + public static Key getKey (int recordId) + { + return newKey(_R, recordId); + } + + /** Register the key fields in an order matching the getKey() factory. */ + static { registerKeyFields(RECORD_ID); } + // AUTO-GENERATED: METHODS END +} diff --git a/src/test/java/com/samskivert/depot/GeneratedValueTest.java b/src/test/java/com/samskivert/depot/GeneratedValueTest.java index 8bb4fa7..582372b 100644 --- a/src/test/java/com/samskivert/depot/GeneratedValueTest.java +++ b/src/test/java/com/samskivert/depot/GeneratedValueTest.java @@ -7,6 +7,7 @@ package com.samskivert.depot; import java.util.List; import java.util.Set; +import org.junit.Before; import org.junit.Test; import com.google.common.collect.Iterables; @@ -15,22 +16,38 @@ import static org.junit.Assert.assertEquals; public class GeneratedValueTest { - @Test public void insertAutoGeneratedValue () + @Before public void createRepository () { PersistenceContext pc = TestBase.createPersistenceContext(); - DepotRepository dr = new DepotRepository(pc) { + _dr = new DepotRepository(pc) { @Override protected void getManagedRecords (Set> classes) { classes.add(GeneratedValueRecord.class); + classes.add(AllGeneratedRecord.class); } }; + + } + + @Test public void insertAutoGeneratedValue () + { GeneratedValueRecord rec = new GeneratedValueRecord(); rec.value = 2; assertEquals(0, rec.recordId); - assertEquals(1, dr.insert(rec)); + assertEquals(1, _dr.insert(rec)); assertEquals(1, rec.recordId); - List recs = dr.from(GeneratedValueRecord.class). + List recs = _dr.from(GeneratedValueRecord.class). where(GeneratedValueRecord.VALUE.eq(2)).select(); assertEquals(1, Iterables.getOnlyElement(recs).recordId); } + + @Test public void insertAllGeneratedValue () + { + AllGeneratedRecord rec = new AllGeneratedRecord(); + assertEquals(0, rec.recordId); + assertEquals(1, _dr.insert(rec)); + assertEquals(1, rec.recordId); + } + + protected DepotRepository _dr; }