Skip to content

Commit

Permalink
Integrate schema changes via JAX-SB bindings, re #86
Browse files Browse the repository at this point in the history
  • Loading branch information
safris committed Oct 1, 2023
1 parent 241f0a5 commit f382d35
Show file tree
Hide file tree
Showing 28 changed files with 805 additions and 596 deletions.
64 changes: 38 additions & 26 deletions ddlx/src/main/java/org/jaxdb/ddlx/Compiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$CheckReference;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Clob;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Column;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$ColumnIndex;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Columns;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Constraints;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Constraints.PrimaryKey;
Expand All @@ -53,20 +54,19 @@
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$ForeignKeyComposite;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$ForeignKeyUnary;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$IndexType;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Indexes;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Indexes.Index;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$IndexesIndex;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Int;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Integer;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Named;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Smallint;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Table;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Time;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Tinyint;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.Schema;
import org.jaxsb.runtime.BindingList;
import org.libj.lang.Numbers;
import org.openjax.xml.datatype.HexBinary;
import org.w3.www._2001.XMLSchema.yAA.$AnySimpleType;
import org.w3.www._2001.XMLSchema.yAA.$AnyType;
import org.w3.www._2001.XMLSchema.yAA.$String;

abstract class Compiler extends DbVendorCompiler {
Expand Down Expand Up @@ -110,7 +110,7 @@ CreateStatement createSchemaIfNotExists(final Schema schema) {
return null;
}

CreateStatement createTableIfNotExists(final LinkedHashSet<CreateStatement> alterStatements, final $Table table, final Map<String,String> enumTemplateToValues, final Map<String,ColumnRef> columnNameToColumn, final Map<String,Map<String,String>> tableNameToEnumToOwner) throws GeneratorExecutionException {
CreateStatement createTableIfNotExists(final LinkedHashSet<CreateStatement> alterStatements, final Schema.Table table, final Map<String,String> enumTemplateToValues, final Map<String,ColumnRef> columnNameToColumn, final Map<String,Map<String,String>> tableNameToEnumToOwner) throws GeneratorExecutionException {
final StringBuilder b = new StringBuilder();
final String tableName = table.getName$().text();
b.append("CREATE TABLE ");
Expand All @@ -126,7 +126,7 @@ CreateStatement createTableIfNotExists(final LinkedHashSet<CreateStatement> alte
return new CreateStatement(b.toString());
}

private String createColumns(final LinkedHashSet<CreateStatement> alterStatements, final $Table table, final Map<String,String> enumTemplateToValues, final Map<String,Map<String,String>> tableNameToEnumToOwner) {
private String createColumns(final LinkedHashSet<CreateStatement> alterStatements, final Schema.Table table, final Map<String,String> enumTemplateToValues, final Map<String,Map<String,String>> tableNameToEnumToOwner) {
final StringBuilder builder = new StringBuilder();
final BindingList<$Column> columns = table.getColumn();
$Column column = null;
Expand All @@ -146,7 +146,7 @@ private String createColumns(final LinkedHashSet<CreateStatement> alterStatement
return builder.toString();
}

private CreateStatement createColumn(final LinkedHashSet<CreateStatement> alterStatements, final $Table table, final $Column column, final Map<String,String> enumTemplateToValues, final Map<String,Map<String,String>> tableNameToEnumToOwner) {
private CreateStatement createColumn(final LinkedHashSet<CreateStatement> alterStatements, final Schema.Table table, final $Column column, final Map<String,String> enumTemplateToValues, final Map<String,Map<String,String>> tableNameToEnumToOwner) {
final StringBuilder b = new StringBuilder();
q(b, column.getName$().text()).append(' ');
// FIXME: Passing null to compile*() methods will throw a NPE
Expand Down Expand Up @@ -299,10 +299,10 @@ public byte ordinal() {
}
}

private CreateStatement createConstraints(final Map<String,ColumnRef> columnNameToColumn, final $Table table) throws GeneratorExecutionException {
private CreateStatement createConstraints(final Map<String,ColumnRef> columnNameToColumn, final Schema.Table table) throws GeneratorExecutionException {
final StringBuilder constraintsBuilder = new StringBuilder();
if (table.getConstraints() != null) {
final $Constraints constraints = table.getConstraints();
final Schema.Table.Constraints constraints = table.getConstraints();

// UNIQUE constraint
final List<$Columns> uniques = constraints.getUnique();
Expand Down Expand Up @@ -547,7 +547,7 @@ else if (condition != null) {
return constraintsBuilder.length() == 0 ? null : new CreateStatement(constraintsBuilder.toString());
}

StringBuilder blockPrimaryKey(final StringBuilder b, final $Table table, final $Constraints constraints, final Map<String,ColumnRef> columnNameToColumn) throws GeneratorExecutionException {
StringBuilder blockPrimaryKey(final StringBuilder b, final Schema.Table table, final $Constraints constraints, final Map<String,ColumnRef> columnNameToColumn) throws GeneratorExecutionException {
if (constraints.getPrimaryKey() == null)
return b;

Expand Down Expand Up @@ -584,7 +584,7 @@ StringBuilder blockPrimaryKey(final StringBuilder b, final $Table table, final $
* @param columns The indexes of the columns comprising the "FOREIGN KEY".
* @return The "FOREIGN KEY" keyword for the specified {@link $Table}.
*/
StringBuilder foreignKey(final $Table table, final xLygluGCXAA.$Name references, final int ... columns) {
StringBuilder foreignKey(final Schema.Table table, final xLygluGCXAA.$Name references, final int ... columns) {
return q(new StringBuilder("CONSTRAINT "), getConstraintName("fk", table, references, columns)).append(" FOREIGN KEY");
}

Expand All @@ -596,7 +596,7 @@ StringBuilder foreignKey(final $Table table, final xLygluGCXAA.$Name references,
* @param using The index type.
* @return The "PRIMARY KEY" keyword for the specified {@link $Table}.
*/
StringBuilder primaryKey(final StringBuilder b, final $Table table, final int[] columns, final PrimaryKey.Using$ using) {
StringBuilder primaryKey(final StringBuilder b, final Schema.Table table, final int[] columns, final PrimaryKey.Using$ using) {
b.append("CONSTRAINT ");
q(b, getConstraintName("pk", table, null, columns)).append(" PRIMARY KEY");
if (using != null)
Expand All @@ -616,7 +616,7 @@ StringBuilder primaryKey(final StringBuilder b, final $Table table, final int[]
* @param arg2 The second argument of the constraint.
* @return The "CHECK" keyword for the specified {@link $Table}.
*/
StringBuilder check(final StringBuilder b, final $Table table, final int column, final Operator operator1, final String arg1, final Operator operator2, final String arg2) {
StringBuilder check(final StringBuilder b, final Schema.Table table, final int column, final Operator operator1, final String arg1, final Operator operator2, final String arg2) {
final StringBuilder builder = getConstraintName(table, column);
builder.append('_').append(operator1.desc).append('_').append(arg1);
if (operator2 != null)
Expand Down Expand Up @@ -658,17 +658,17 @@ private StringBuilder recurseCheckRule(final $CheckReference check) {
* @param table The {@link $Table} for which to produce {@code TRIGGER} clauses.
* @return A list of {@link CreateStatement} objects of {@code TRIGGER} clauses for the specified {@link $Table table}.
*/
ArrayList<CreateStatement> triggers(final $Table table) {
ArrayList<CreateStatement> triggers(final Schema.Table table) {
return new ArrayList<>();
}

ArrayList<CreateStatement> indexes(final $Table table, final Map<String,ColumnRef> columnNameToColumn) {
ArrayList<CreateStatement> indexes(final Schema.Table table, final Map<String,ColumnRef> columnNameToColumn) {
final ArrayList<CreateStatement> statements = new ArrayList<>();
final $Indexes tableIndexes = table.getIndexes();
final Schema.Table.Indexes tableIndexes = table.getIndexes();
if (tableIndexes != null) {
final List<Index> indexes = tableIndexes.getIndex();
final List<$IndexesIndex> indexes = tableIndexes.getIndex();
for (int i = 0, i$ = indexes.size(); i < i$; ++i) { // [RA]
final $Table.Indexes.Index index = indexes.get(i);
final $IndexesIndex index = indexes.get(i);
final List<? extends $Named> columns = index.getColumn();
final int[] columnIndexes = new int[columns.size()];
for (int c = 0, c$ = columns.size(); c < c$; ++c) { // [RA]
Expand All @@ -686,8 +686,9 @@ ArrayList<CreateStatement> indexes(final $Table table, final Map<String,ColumnRe
final List<$Column> columns = table.getColumn();
for (int c = 0, i$ = columns.size(); c < i$; ++c) { // [RA]
final $Column column = columns.get(c);
if (column.getIndex() != null) {
final CreateStatement createIndex = createIndex(column.getIndex().getUnique$() != null && column.getIndex().getUnique$().text(), getIndexName(table, column.getIndex().getType$(), c), column.getIndex().getType$(), table.getName$().text(), column);
final $ColumnIndex index = getIndex(column);
if (index != null) {
final CreateStatement createIndex = createIndex(index.getUnique$() != null && index.getUnique$().text(), getIndexName(table, index.getType$(), c), index.getType$(), table.getName$().text(), column);
if (createIndex != null)
statements.add(createIndex);
}
Expand All @@ -697,19 +698,30 @@ ArrayList<CreateStatement> indexes(final $Table table, final Map<String,ColumnRe
return statements;
}

private static $ColumnIndex getIndex(final $Column column) {
final Iterator<$AnyType<?>> columnElements = column.elementIterator();
while (columnElements.hasNext()) {
final $AnyType<?> columnElement = columnElements.next();
if ("index".equals(columnElement.name().getLocalPart()))
return ($ColumnIndex)columnElement;
}

return null;
}

/**
* Returns a list of {@link CreateStatement} objects for the creation of types for the specified {@link $Table}.
*
* @param table The {@link $Table}.
* @return A list of {@link CreateStatement} objects for the creation of types for the specified {@link $Table}.
*/
ArrayList<CreateStatement> types(final $Table table, final HashMap<String,String> enumTemplateToValues, final Map<String,Map<String,String>> tableNameToEnumToOwner) {
ArrayList<CreateStatement> types(final Schema.Table table, final HashMap<String,String> enumTemplateToValues, final Map<String,Map<String,String>> tableNameToEnumToOwner) {
return new ArrayList<>();
}

abstract StringBuilder dropIndexOnClause($Table table);
abstract StringBuilder dropIndexOnClause(Schema.Table table);

final LinkedHashSet<DropStatement> dropTable(final $Table table) {
final LinkedHashSet<DropStatement> dropTable(final Schema.Table table) {
final LinkedHashSet<DropStatement> statements = new LinkedHashSet<>();
// FIXME: Explicitly dropping indexes on tables that may not exist will throw errors!
// if (table.getIndexes() != null)
Expand Down Expand Up @@ -741,11 +753,11 @@ final LinkedHashSet<DropStatement> dropTable(final $Table table) {
* @param table The {@link $Table}.
* @return A list of {@link DropStatement} objects for the dropping of types for the specified {@link $Table}.
*/
LinkedHashSet<DropStatement> dropTypes(final $Table table, final Map<String,Map<String,String>> tableNameToEnumToOwner) {
LinkedHashSet<DropStatement> dropTypes(final Schema.Table table, final Map<String,Map<String,String>> tableNameToEnumToOwner) {
return new LinkedHashSet<>();
}

DropStatement dropTableIfExists(final $Table table) {
DropStatement dropTableIfExists(final Schema.Table table) {
return new DropStatement(q(new StringBuilder("DROP TABLE IF EXISTS "), table.getName$().text()).toString());
}

Expand Down Expand Up @@ -938,8 +950,8 @@ StringBuilder truncate(final String tableName) {
return q(new StringBuilder("DELETE FROM "), tableName);
}

abstract StringBuilder $null(StringBuilder b, $Table table, $Column column);
abstract String $autoIncrement(LinkedHashSet<CreateStatement> alterStatements, $Table table, $Integer column);
abstract StringBuilder $null(StringBuilder b, Schema.Table table, $Column column);
abstract String $autoIncrement(LinkedHashSet<CreateStatement> alterStatements, Schema.Table table, $Integer column);

StringBuilder compileBinary(final StringBuilder b, final String value) {
return b.append("X'").append(value).append('\'');
Expand Down
10 changes: 5 additions & 5 deletions ddlx/src/main/java/org/jaxdb/ddlx/DB2Compiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$IndexType;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Integer;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Named;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Table;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.Schema;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -51,7 +51,7 @@ CreateStatement createIndex(final boolean unique, final String indexName, final
}

@Override
DropStatement dropTableIfExists(final $Table table) {
DropStatement dropTableIfExists(final Schema.Table table) {
return new DropStatement(q(new StringBuilder("CALL db2perf_quiet_drop('TABLE "), table.getName$().text()).append("')").toString());
}

Expand All @@ -67,20 +67,20 @@ void init(final Connection connection) throws SQLException {
}

@Override
StringBuilder dropIndexOnClause(final $Table table) {
StringBuilder dropIndexOnClause(final Schema.Table table) {
return new StringBuilder(0);
}

@Override
StringBuilder $null(final StringBuilder b, final $Table table, final $Column column) {
StringBuilder $null(final StringBuilder b, final Schema.Table table, final $Column column) {
if (column.getNull$() != null && !column.getNull$().text())
b.append(" NOT NULL");

return b;
}

@Override
String $autoIncrement(final LinkedHashSet<CreateStatement> alterStatements, final $Table table, final $Integer column) {
String $autoIncrement(final LinkedHashSet<CreateStatement> alterStatements, final Schema.Table table, final $Integer column) {
if (!Generator.isAuto(column))
return null;

Expand Down
38 changes: 19 additions & 19 deletions ddlx/src/main/java/org/jaxdb/ddlx/DDLx.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,11 @@

import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Column;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Columns;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Constraints;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$ForeignKeyComposite;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Indexes;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Indexes.Index;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$IndexesIndex;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Named;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Table;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$Table.Extends$;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$TableCommon;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.$TableCommon.Extends$;
import org.jaxdb.www.ddlx_0_6.xLygluGCXAA.Schema;
import org.jaxsb.runtime.BindingList;
import org.jaxsb.runtime.Bindings;
Expand All @@ -46,7 +44,7 @@

public class DDLx {
private static final Logger logger = LoggerFactory.getLogger(DDLx.class);
private static final Comparator<$Table> tableNameComparator = (o1, o2) -> o1 == null ? o2 == null ? 0 : 1 : o2 == null ? -1 : o1.getName$().text().compareTo(o2.getName$().text());
private static final Comparator<$TableCommon> tableNameComparator = (o1, o2) -> o1 == null ? o2 == null ? 0 : 1 : o2 == null ? -1 : o1.getName$().text().compareTo(o2.getName$().text());
private static final URL normalizeXsl;
private static final URL mergeXsl;

Expand All @@ -64,12 +62,12 @@ private static URL findResource(final String name) {
}

private static Schema topologicalSort(final Schema schema) {
final ArrayList<$Table> tables = new ArrayList<>(schema.getTable());
final ArrayList<$TableCommon> tables = new ArrayList<>(schema.getTable());
schema.getTable().clear();
tables.sort(tableNameComparator);
final RefDigraph<$Table,String> digraph = new RefDigraph<>(table -> table.getName$().text());
final RefDigraph<Schema.Table,String> digraph = new RefDigraph<>(table -> table.getName$().text());
for (int i = 0, i$ = tables.size(); i < i$; ++i) { // [RA]
final $Table table = tables.get(i);
final Schema.Table table = (Schema.Table)tables.get(i);
digraph.add(table);
final Extends$ extends$ = table.getExtends$();
if (extends$ != null)
Expand All @@ -84,7 +82,7 @@ private static Schema topologicalSort(final Schema schema) {
}
}

final $Constraints constraints = table.getConstraints();
final Schema.Table.Constraints constraints = table.getConstraints();
if (constraints != null) {
final BindingList<$ForeignKeyComposite> foreignKeys = constraints.getForeignKey();
if (foreignKeys != null) {
Expand All @@ -97,7 +95,7 @@ private static Schema topologicalSort(final Schema schema) {
if (digraph.hasCycle())
throw new IllegalStateException("Cycle exists in relational model: " + CollectionUtil.toString(digraph.getCycle(), " -> "));

final ArrayList<$Table> topologicalOrder = digraph.getTopologicalOrder();
final ArrayList<Schema.Table> topologicalOrder = digraph.getTopologicalOrder();
for (int i = topologicalOrder.size() - 1; i >= 0; --i) // [RA]
schema.getTable().add(topologicalOrder.get(i));

Expand All @@ -120,15 +118,17 @@ public DDLx(final URL url) throws IOException, SAXException, TransformerExceptio

this.mergedXml = Transformer.transform(mergeXsl, normalizeddXml, null);
this.mergedSchema = topologicalSort((Schema)Bindings.parse(mergedXml));
final BindingList<$Table> tables = mergedSchema.getTable();
for (int i = 0, i$ = tables.size(); i < i$; ++i) // [RA]
if (tables.get(i).getExtends$() != null)
final BindingList<Schema.Table> tables = mergedSchema.getTable();
for (int i = 0, i$ = tables.size(); i < i$; ++i) { // [RA]
final $TableCommon table = tables.get(i);
if (table.getExtends$() != null)
throw new IllegalStateException("Input schema is not merged");
}
}

// FIXME: Remove this.
public boolean isUnique(final $Table table, final $Named column) {
final $Constraints constraints = table.getConstraints();
public boolean isUnique(final Schema.Table table, final $Named column) {
final Schema.Table.Constraints constraints = table.getConstraints();
if (constraints != null) {
final BindingList<$Columns> uniques = constraints.getUnique();
if (uniques != null) {
Expand All @@ -140,12 +140,12 @@ public boolean isUnique(final $Table table, final $Named column) {
}
}

final $Indexes tableIndexes = table.getIndexes();
final Schema.Table.Indexes tableIndexes = table.getIndexes();
if (tableIndexes != null) {
final BindingList<Index> indexes = tableIndexes.getIndex();
final BindingList<$IndexesIndex> indexes = tableIndexes.getIndex();
if (indexes != null) {
for (int i = 0, i$ = indexes.size(); i < i$; ++i) { // [RA]
final $Indexes.Index index = indexes.get(i);
final $IndexesIndex index = indexes.get(i);
if (index.getUnique$() != null && index.getUnique$().text() && index.getColumn().size() == 1 && column.getName$().text().equals(index.getColumn(0).getName$().text()))
return true;
}
Expand Down
Loading

0 comments on commit f382d35

Please sign in to comment.