From d9a550013f872cacf685cca69c03ebab126db8a0 Mon Sep 17 00:00:00 2001 From: Markus Kreth Date: Tue, 19 Dec 2017 11:14:37 +0000 Subject: [PATCH] (Unique) constraint for TableDefinition is generated --- .../java/de/kreth/dbmanager/DbManager.java | 5 ++ .../de/kreth/dbmanager/TableDefinition.java | 14 ++-- .../de/kreth/dbmanager/UniqueConstraint.java | 19 +++++ .../dbmanager/DbManagerCreateTablesTest.java | 71 +++++++++++++++---- 4 files changed, 90 insertions(+), 19 deletions(-) create mode 100644 src/main/java/de/kreth/dbmanager/UniqueConstraint.java diff --git a/src/main/java/de/kreth/dbmanager/DbManager.java b/src/main/java/de/kreth/dbmanager/DbManager.java index cbbebff..e11c6b5 100644 --- a/src/main/java/de/kreth/dbmanager/DbManager.java +++ b/src/main/java/de/kreth/dbmanager/DbManager.java @@ -129,7 +129,12 @@ public class DbManager { sql.append(" ").append(col.getColumnParameters()); } } + for(UniqueConstraint uni: def.getUnique()) { + sql.append(",\n\tCONSTRAINT UNIQUE ("); + sql.append(String.join(",", uni.getNames())); + sql.append(")"); + } sql.append("\n"); sql.append(")"); return sql.toString(); diff --git a/src/main/java/de/kreth/dbmanager/TableDefinition.java b/src/main/java/de/kreth/dbmanager/TableDefinition.java index e8c1634..7888dfd 100644 --- a/src/main/java/de/kreth/dbmanager/TableDefinition.java +++ b/src/main/java/de/kreth/dbmanager/TableDefinition.java @@ -1,6 +1,7 @@ package de.kreth.dbmanager; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -16,17 +17,18 @@ import java.util.stream.Collectors; */ public class TableDefinition { public static final String COLUMN_ID_NAME = "_id"; - private String tableName; - private Collection columns; + private final String tableName; + private final Collection columns; + private Collection unique; - public TableDefinition(String tableName, Collection columns) { - super(); + public TableDefinition(String tableName, List columns, UniqueConstraint... unique) { this.tableName = tableName; ColumnDefinition id = new ColumnDefinition(DataType.INTEGER, COLUMN_ID_NAME, "primary key AUTO_INCREMENT"); List def = new ArrayList(); def.add(id); def.addAll(columns); this.columns = Collections.unmodifiableCollection(def); + this.unique = Collections.unmodifiableCollection(Arrays.asList(unique)); } public String getTableName() { @@ -37,6 +39,10 @@ public class TableDefinition { return columns; } + public Collection getUnique() { + return unique; + } + @Override public String toString() { return tableName + "[" + String.join(",", columns.stream().map(m -> m.toString()).collect(Collectors.toList())) + "]"; diff --git a/src/main/java/de/kreth/dbmanager/UniqueConstraint.java b/src/main/java/de/kreth/dbmanager/UniqueConstraint.java new file mode 100644 index 0000000..8a9dff8 --- /dev/null +++ b/src/main/java/de/kreth/dbmanager/UniqueConstraint.java @@ -0,0 +1,19 @@ +package de.kreth.dbmanager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class UniqueConstraint { + private List names = new ArrayList<>(); + + public UniqueConstraint(ColumnDefinition... defs) { + for(ColumnDefinition c: defs) { + names.add(c.getColumnName()); + } + } + + public List getNames() { + return Collections.unmodifiableList(names); + } +} diff --git a/src/test/java/de/kreth/dbmanager/DbManagerCreateTablesTest.java b/src/test/java/de/kreth/dbmanager/DbManagerCreateTablesTest.java index aa2c083..1538207 100644 --- a/src/test/java/de/kreth/dbmanager/DbManagerCreateTablesTest.java +++ b/src/test/java/de/kreth/dbmanager/DbManagerCreateTablesTest.java @@ -1,28 +1,69 @@ package de.kreth.dbmanager; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + public class DbManagerCreateTablesTest { + @Test + public void testCreateSqlStatement() { + List columns = new ArrayList(); + TableDefinition def = new TableDefinition("testtable", columns); + String sql = DbManager.createSqlStatement(def); + + assertNotNull(sql); + assertEquals("CREATE TABLE testtable (\n" + " _id INTEGER primary key AUTO_INCREMENT\n" + ")", sql); + } + + @Test + public void testCreateTable2Columns() { + List columns = new ArrayList(); + + columns.add(new ColumnDefinition(DataType.VARCHAR100, "name", " NOT NULL")); + columns.add(new ColumnDefinition(DataType.DATETIME, "theDate")); - @Before - public void setUp() throws Exception { - } + TableDefinition def = new TableDefinition("testtable", columns); + String sql = DbManager.createSqlStatement(def); - @Test - public void testCreateSqlStatement() { - List columns = new ArrayList(); - TableDefinition def = new TableDefinition("testtable", columns); - String sql = DbManager.createSqlStatement(def); - assertNotNull(sql); - System.out.println(sql); - assertEquals("CREATE TABLE testtable (\n" + " _id INTEGER primary key AUTO_INCREMENT\n" + ")", sql); - } + assertNotNull(sql); + assertEquals("CREATE TABLE testtable (\n" + + " _id INTEGER primary key AUTO_INCREMENT,\n" + + " name VARCHAR(100) NOT NULL,\n" + + " theDate DATETIME\n" + ")", + sql); + } + @Test + public void testCreateTable2ColumnsUnique() { + List columns = new ArrayList(); + + columns.add(new ColumnDefinition(DataType.VARCHAR100, "name", " NOT NULL")); + columns.add(new ColumnDefinition(DataType.DATETIME, "theDate")); + + UniqueConstraint unique = new UniqueConstraint(columns.get(0), columns.get(1)); + TableDefinition def = new TableDefinition("testtable", columns, unique); + String sql = DbManager.createSqlStatement(def); + + assertNotNull(sql); + + String expected = "CREATE TABLE testtable (\n" + + " _id INTEGER primary key AUTO_INCREMENT,\n" + + " name VARCHAR(100) NOT NULL,\n" + + " theDate DATETIME,\n" + + " CONSTRAINT UNIQUE (name,theDate)\n" + + ")"; + + assertEquals(expected, sql); + } + + @Before + public void setUp() throws Exception {} } + + +//~ Formatted by Jindent --- http://www.jindent.com