composeCreate function
Implementation
String composeCreate(final Create create) {
final ImmutableCreateStatement info = create.asImmutable;
final sb = new StringBuffer();
sb.write('CREATE TABLE');
if (info.ifNotExists) sb.write(' IF NOT EXISTS');
sb.write(' ${info.name} (');
sb.write(info.columns.values.map(composeCreateColumn).join(', '));
final List<CreateColumn> primaries = info.columns.values
.where((CreateColumn col) =>
col.isPrimary &&
(col is! CreateInt || !(col as CreateInt).autoIncrement))
.toList();
if (primaries.length != 0) {
sb.write(', PRIMARY KEY (');
sb.write(primaries.map((CreateColumn col) => col.name).join(','));
sb.write(')');
}
{
final uniques = <CreateColumn>[];
final compositeUniques = <String, List<CreateColumn>>{};
final foreigns = <String, Map<String, String>>{};
for (CreateColumn col in info.columns.values) {
if (col.foreignKey != null) {
if (!foreigns.containsKey(col.foreignKey!.table)) {
foreigns[col.foreignKey!.table] = <String, String>{};
}
foreigns[col.foreignKey!.table]![col.name] = col.foreignKey!.col;
}
if (col.uniqueGroup != null) {
if (col.uniqueGroup == null || col.uniqueGroup!.isEmpty) {
uniques.add(col);
} else {
compositeUniques[col.uniqueGroup!] =
(compositeUniques[col.uniqueGroup] ?? <CreateColumn>[])..add(col);
}
}
}
for (final String foreignTab in foreigns.keys) {
final Map<String, String> cols = foreigns[foreignTab]!;
sb.write(', FOREIGN KEY (');
sb.write(cols.keys.join(', '));
sb.write(') REFERENCES ');
sb.write(foreignTab + '(');
sb.write(cols.values.join(', '));
sb.write(')');
}
for (CreateColumn col in uniques) {
sb.write(', UNIQUE(${col.name})');
}
for (String group in compositeUniques.keys) {
final String str = compositeUniques[group]!
.map((CreateColumn col) => col.name)
.join(', ');
sb.write(', UNIQUE($str)');
}
}
sb.write(')');
return sb.toString();
}