package org.insightech.er.db.impl.sqlite;
import java.util.LinkedHashSet;
import org.insightech.er.editor.model.ERDiagram;
import org.insightech.er.editor.model.dbexport.ddl.DDLCreator;
import org.insightech.er.editor.model.diagram_contents.element.connection.Relation;
import org.insightech.er.editor.model.diagram_contents.element.node.NodeElement;
import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable;
import org.insightech.er.editor.model.diagram_contents.element.node.table.column.NormalColumn;
import org.insightech.er.editor.model.diagram_contents.not_element.tablespace.Tablespace;
public class SQLiteDDLCreator extends DDLCreator {
public SQLiteDDLCreator(ERDiagram diagram, boolean semicolon) {
super(diagram, semicolon);
}
@Override
protected String getDDL(Tablespace tablespace) {
return null;
}
@Override
protected String getColulmnDDL(NormalColumn normalColumn) {
StringBuilder ddl = new StringBuilder();
ddl.append(super.getColulmnDDL(normalColumn));
if (normalColumn.isAutoIncrement()) {
ddl.append(" PRIMARY KEY AUTOINCREMENT");
}
return ddl.toString();
}
@Override
protected String getPrimaryKeyDDL(ERTable table) {
StringBuilder ddl = new StringBuilder();
for (Relation relation : table.getIncomingRelations()) {
ddl.append(",\r\n\tFOREIGN KEY (");
boolean first = true;
for (NormalColumn column : relation.getForeignKeyColumns()) {
if (!first) {
ddl.append(", ");
}
ddl.append(filter(column.getPhysicalName()));
first = false;
}
ddl.append(")\r\n");
ddl.append("\tREFERENCES ");
ddl.append(filter(relation.getSourceTableView().getNameWithSchema(
this.getDiagram().getDatabase())));
ddl.append(" (");
first = true;
for (NormalColumn foreignKeyColumn : relation
.getForeignKeyColumns()) {
if (!first) {
ddl.append(", ");
}
ddl.append(filter(foreignKeyColumn
.getReferencedColumn(relation).getPhysicalName()));
first = false;
}
ddl.append(")");
}
return ddl.toString();
}
@Override
protected Iterable<ERTable> getTablesForCreateDDL() {
LinkedHashSet<ERTable> results = new LinkedHashSet<ERTable>();
for (ERTable table : this.getDiagram().getDiagramContents()
.getContents().getTableSet()) {
if (!results.contains(table)) {
this.getReferedTables(results, table);
results.add(table);
}
}
return results;
}
private void getReferedTables(LinkedHashSet<ERTable> referedTables,
ERTable table) {
for (NodeElement nodeElement : table.getReferedElementList()) {
if (nodeElement instanceof ERTable) {
if (nodeElement != table) {
ERTable referedTable = (ERTable) nodeElement;
if (!referedTables.contains(referedTable)) {
this.getReferedTables(referedTables, referedTable);
referedTables.add(referedTable);
}
}
}
}
}
@Override
protected String getCreateForeignKeys(ERDiagram diagram) {
return "";
}
}