Search in sources :

Example 6 with Schema

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;
}
Also used : LinkedHashSet(java.util.LinkedHashSet) HashMap(java.util.HashMap) Schema(org.jaxdb.www.ddlx_0_5.xLygluGCXAA.Schema) org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Table(org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Table) org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Enum(org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Enum) HashMap(java.util.HashMap) Map(java.util.Map) org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Column(org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Column) HashSet(java.util.HashSet) LinkedHashSet(java.util.LinkedHashSet)

Aggregations

org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Table (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Table)6 org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Column (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Column)5 Schema (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.Schema)4 HashMap (java.util.HashMap)3 Map (java.util.Map)2 org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Enum (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Enum)2 URL (java.net.URL)1 DatabaseMetaData (java.sql.DatabaseMetaData)1 ResultSet (java.sql.ResultSet)1 ArrayList (java.util.ArrayList)1 HashSet (java.util.HashSet)1 LinkedHashSet (java.util.LinkedHashSet)1 List (java.util.List)1 TreeMap (java.util.TreeMap)1 DBVendor (org.jaxdb.vendor.DBVendor)1 Dialect (org.jaxdb.vendor.Dialect)1 org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Bigint (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Bigint)1 org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Boolean (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Boolean)1 org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$CheckColumn (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$CheckColumn)1 org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$CheckReference (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$CheckReference)1