package net.sourceforge.mayfly.evaluation.command; import net.sourceforge.mayfly.datastore.Columns; import net.sourceforge.mayfly.datastore.DataStore; import net.sourceforge.mayfly.datastore.TableData; import net.sourceforge.mayfly.datastore.TableReference; import net.sourceforge.mayfly.datastore.constraint.Constraint; import net.sourceforge.mayfly.datastore.constraint.Constraints; import net.sourceforge.mayfly.datastore.constraint.ForeignKey; import net.sourceforge.mayfly.util.ImmutableList; import java.util.ArrayList; import java.util.List; public class ConstraintsBuilder { public static ConstraintsBuilder fromTable( DataStore store, TableReference table) { return new ConstraintsBuilder(store, table.schema(), table.tableName(), findNextForeignKeyNumber(store, table)); } static int findNextForeignKeyNumber( DataStore store, TableReference table) { String namePrefix = table.tableName() + "_ibfk_"; int prefixLength = namePrefix.length(); int nextForeignKeyNumber = 1; TableData tableData = store.table(table); for (Constraint constraint : tableData.constraints) { String name = constraint.constraintName; if (constraint instanceof ForeignKey && name.startsWith(namePrefix)) { String remaining = name.substring(prefixLength); int thisNumber; try { thisNumber = Integer.parseInt(remaining); } catch (NumberFormatException e) { continue; } if (nextForeignKeyNumber <= thisNumber) { nextForeignKeyNumber = thisNumber + 1; } } } return nextForeignKeyNumber; } private List<Constraint> resolved = new ArrayList<Constraint>(); private int nextForeignKeyNumber = 1; public final DataStore store; public final String schema; public final String table; public final Columns columns; public ConstraintsBuilder( DataStore store, String schema, String table, Columns columns) { this.store = store; this.schema = schema; this.table = table; this.columns = columns; } private ConstraintsBuilder(DataStore store, String schema, String table, int nextForeignKeyNumber) { this.store = store; this.schema = schema; this.table = table; this.nextForeignKeyNumber = nextForeignKeyNumber; this.columns = null; } public void add(Constraint constraint) { resolved.add(constraint); } public Constraints asConstraints() { return new Constraints(new ImmutableList(resolved)); } public void add(UnresolvedConstraint constraint) { add(constraint.resolve(this)); } public String assignForeignKeyName() { return table + "_ibfk_" + nextForeignKeyNumber++; } }