use of org.jaxdb.www.ddlx_0_5.xLygluGCXAA.Schema in project jaxdb by jaxdb.
the class Generator method parse.
public LinkedHashSet<Statement> parse(final DBVendor vendor) throws GeneratorExecutionException {
final Map<String, LinkedHashSet<DropStatement>> dropTableStatements = new HashMap<>();
final Map<String, LinkedHashSet<DropStatement>> dropTypeStatements = new HashMap<>();
final Map<String, LinkedHashSet<CreateStatement>> createTableStatements = new HashMap<>();
final Schema normalized = ddlx.getNormalizedSchema();
// The following code resolves a problem with ENUM types. The DDLx is generated from merged schema, whereby the original owner
// of the ENUM type is lost. The jSQL, however, is generated from the normalized schema, where the owner of the ENUM type is
// present. The `tableNameToEnumToOwner` variable is a map for each table linking each table's ENUMs to their original owners.
final Map<String, $Table> tableNameToTable = new HashMap<>();
final Map<String, Map<String, String>> tableNameToEnumToOwner = new HashMap<String, Map<String, String>>() {
@Override
public Map<String, String> get(final Object key) {
final String tableName = (String) key;
Map<String, String> map = super.get(key);
if (map == null)
put(tableName, map = new HashMap<>());
return map;
}
};
for (final $Table table : normalized.getTable()) tableNameToTable.put(table.getName$().text(), table);
for ($Table table : normalized.getTable()) {
if (table.getAbstract$().text())
continue;
final Map<String, String> colNameToOwnerTable = tableNameToEnumToOwner.get(table.getName$().text());
do {
for (final $Column column : table.getColumn()) if (column instanceof $Enum)
colNameToOwnerTable.put(column.getName$().text(), table.getName$().text());
table = table.getExtends$() != null ? tableNameToTable.get(table.getExtends$().text()) : null;
} while (table != null);
}
final Set<String> skipTables = new HashSet<>();
final Schema merged = ddlx.getMergedSchema();
final List<$Table> tables = merged.getTable();
for (final $Table table : tables) {
if (table.getSkip$().text()) {
skipTables.add(table.getName$().text());
} else if (!table.getAbstract$().text()) {
dropTableStatements.put(table.getName$().text(), Compiler.getCompiler(vendor).dropTable(table));
dropTypeStatements.put(table.getName$().text(), Compiler.getCompiler(vendor).dropTypes(table, tableNameToEnumToOwner));
}
}
final Set<String> tableNames = new HashSet<>();
for (final $Table table : tables) if (!table.getAbstract$().text())
createTableStatements.put(table.getName$().text(), parseTable(vendor, table, tableNames, tableNameToEnumToOwner));
final LinkedHashSet<Statement> statements = new LinkedHashSet<>();
final CreateStatement createSchema = Compiler.getCompiler(vendor).createSchemaIfNotExists(merged);
if (createSchema != null)
statements.add(createSchema);
final ListIterator<$Table> listIterator = tables.listIterator(tables.size());
while (listIterator.hasPrevious()) {
final $Table table = listIterator.previous();
final String tableName = table.getName$().text();
if (!skipTables.contains(tableName) && !table.getAbstract$().text())
statements.addAll(dropTableStatements.get(tableName));
}
for (final $Table table : tables) {
final String tableName = table.getName$().text();
if (!skipTables.contains(tableName) && !table.getAbstract$().text())
statements.addAll(dropTypeStatements.get(tableName));
}
for (final $Table table : tables) {
final String tableName = table.getName$().text();
if (!skipTables.contains(tableName) && !table.getAbstract$().text())
statements.addAll(createTableStatements.get(tableName));
}
return statements;
}
Aggregations