1 package liquibase.statement.core;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.HashMap;
6 import java.util.HashSet;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.Set;
10
11 import liquibase.database.structure.type.DataType;
12 import liquibase.statement.AbstractSqlStatement;
13 import liquibase.statement.AutoIncrementConstraint;
14 import liquibase.statement.ColumnConstraint;
15 import liquibase.statement.ForeignKeyConstraint;
16 import liquibase.statement.NotNullConstraint;
17 import liquibase.statement.PrimaryKeyConstraint;
18 import liquibase.statement.UniqueConstraint;
19
20 public class CreateTableStatement extends AbstractSqlStatement {
21 private String schemaName;
22 private String tableName;
23 private String tablespace;
24 private List<String> columns = new ArrayList<String>();
25 private Set<String> autoIncrementColumns = new HashSet<String>();
26 private Map<String, DataType> columnTypes = new HashMap<String, DataType>();
27 private Map<String, Object> defaultValues = new HashMap<String, Object>();
28
29 private PrimaryKeyConstraint primaryKeyConstraint;
30 private Set<String> notNullColumns = new HashSet<String>();
31 private Set<ForeignKeyConstraint> foreignKeyConstraints = new HashSet<ForeignKeyConstraint>();
32 private Set<UniqueConstraint> uniqueConstraints = new HashSet<UniqueConstraint>();
33
34 public CreateTableStatement(String schemaName, String tableName) {
35 this.schemaName = schemaName;
36 this.tableName = tableName;
37 }
38
39 public String getSchemaName() {
40 return schemaName;
41 }
42
43 public String getTableName() {
44 return tableName;
45 }
46
47 public List<String> getColumns() {
48 return columns;
49 }
50
51 public String getTablespace() {
52 return tablespace;
53 }
54
55 public CreateTableStatement setTablespace(String tablespace) {
56 this.tablespace = tablespace;
57 return this;
58 }
59
60 public PrimaryKeyConstraint getPrimaryKeyConstraint() {
61 return primaryKeyConstraint;
62 }
63
64 public Set<ForeignKeyConstraint> getForeignKeyConstraints() {
65 return foreignKeyConstraints;
66 }
67
68 public Set<UniqueConstraint> getUniqueConstraints() {
69 return uniqueConstraints;
70 }
71
72 public Set<String> getNotNullColumns() {
73 return notNullColumns;
74 }
75
76 public CreateTableStatement addPrimaryKeyColumn(String columnName, DataType columnType, Object defaultValue,
77 String keyName, String tablespace, ColumnConstraint... constraints) {
78
79
80
81
82 PrimaryKeyConstraint pkConstraint = new PrimaryKeyConstraint(keyName);
83 pkConstraint.addColumns(columnName);
84 pkConstraint.setTablespace(tablespace);
85
86 List<ColumnConstraint> allConstraints = new ArrayList<ColumnConstraint>();
87 allConstraints.addAll(Arrays.asList(constraints));
88 allConstraints.add(new NotNullConstraint(columnName));
89 allConstraints.add(pkConstraint);
90
91 addColumn(columnName, columnType, defaultValue,
92 allConstraints.toArray(new ColumnConstraint[allConstraints.size()]));
93
94 return this;
95 }
96
97 public CreateTableStatement addColumn(String columnName, DataType columnType) {
98 return addColumn(columnName, columnType, null, new ColumnConstraint[0]);
99 }
100
101 public CreateTableStatement addColumn(String columnName, DataType columnType, Object defaultValue) {
102 if (defaultValue instanceof ColumnConstraint) {
103 return addColumn(columnName, columnType, null, (ColumnConstraint) defaultValue);
104 }
105 return addColumn(columnName, columnType, defaultValue, new ColumnConstraint[0]);
106 }
107
108 public CreateTableStatement addColumn(String columnName, DataType columnType, ColumnConstraint... constraints) {
109 return addColumn(columnName, columnType, null, constraints);
110 }
111
112 public CreateTableStatement addColumn(String columnName, DataType columnType, Object defaultValue,
113 ColumnConstraint... constraints) {
114 this.getColumns().add(columnName);
115 this.columnTypes.put(columnName, columnType);
116 if (defaultValue != null) {
117 defaultValues.put(columnName, defaultValue);
118 }
119 if (constraints != null) {
120 for (ColumnConstraint constraint : constraints) {
121 if (constraint == null) {
122 continue;
123 }
124
125 if (constraint instanceof PrimaryKeyConstraint) {
126 if (this.getPrimaryKeyConstraint() == null) {
127 this.primaryKeyConstraint = (PrimaryKeyConstraint) constraint;
128 } else {
129 for (String column : ((PrimaryKeyConstraint) constraint).getColumns()) {
130 this.getPrimaryKeyConstraint().addColumns(column);
131 }
132 }
133 } else if (constraint instanceof NotNullConstraint) {
134 ((NotNullConstraint) constraint).setColumnName(columnName);
135 getNotNullColumns().add(columnName);
136 } else if (constraint instanceof ForeignKeyConstraint) {
137 ((ForeignKeyConstraint) constraint).setColumn(columnName);
138 getForeignKeyConstraints().add(((ForeignKeyConstraint) constraint));
139 } else if (constraint instanceof UniqueConstraint) {
140 ((UniqueConstraint) constraint).addColumns(columnName);
141 getUniqueConstraints().add(((UniqueConstraint) constraint));
142 } else if (constraint instanceof AutoIncrementConstraint) {
143 autoIncrementColumns.add(columnName);
144 } else {
145 throw new RuntimeException("Unknown constraint type: " + constraint.getClass().getName());
146 }
147 }
148 }
149
150 return this;
151 }
152
153 public Object getDefaultValue(String column) {
154 return defaultValues.get(column);
155 }
156
157 public CreateTableStatement addColumnConstraint(NotNullConstraint notNullConstraint) {
158 getNotNullColumns().add(notNullConstraint.getColumnName());
159 return this;
160 }
161
162 public CreateTableStatement addColumnConstraint(ForeignKeyConstraint fkConstraint) {
163 getForeignKeyConstraints().add(fkConstraint);
164 return this;
165 }
166
167 public CreateTableStatement addColumnConstraint(UniqueConstraint uniqueConstraint) {
168 getUniqueConstraints().add(uniqueConstraint);
169 return this;
170 }
171
172 public CreateTableStatement addColumnConstraint(AutoIncrementConstraint autoIncrementConstraint) {
173 autoIncrementColumns.add(autoIncrementConstraint.getColumnName());
174 return this;
175 }
176
177 public Set<String> getAutoIncrementColumns() {
178 return autoIncrementColumns;
179 }
180
181 public Map<String, DataType> getColumnTypes() {
182 return columnTypes;
183 }
184
185 public Map<String, Object> getDefaultValues() {
186 return defaultValues;
187 }
188
189 public void setSchemaName(String schemaName) {
190 this.schemaName = schemaName;
191 }
192 }