package com.robotoworks.mechanoid.db.validation; import com.robotoworks.mechanoid.db.sqliteModel.AlterTableAddColumnStatement; import com.robotoworks.mechanoid.db.sqliteModel.AlterTableRenameStatement; import com.robotoworks.mechanoid.db.sqliteModel.CreateIndexStatement; import com.robotoworks.mechanoid.db.sqliteModel.CreateTableStatement; import com.robotoworks.mechanoid.db.sqliteModel.CreateTriggerStatement; import com.robotoworks.mechanoid.db.sqliteModel.CreateViewStatement; import com.robotoworks.mechanoid.db.sqliteModel.DDLStatement; import com.robotoworks.mechanoid.db.sqliteModel.DatabaseBlock; import com.robotoworks.mechanoid.db.sqliteModel.DropIndexStatement; import com.robotoworks.mechanoid.db.sqliteModel.DropTableStatement; import com.robotoworks.mechanoid.db.sqliteModel.DropTriggerStatement; import com.robotoworks.mechanoid.db.sqliteModel.DropViewStatement; import com.robotoworks.mechanoid.db.sqliteModel.MigrationBlock; import com.robotoworks.mechanoid.db.sqliteModel.SelectCoreExpression; import com.robotoworks.mechanoid.db.sqliteModel.SelectStatement; import com.robotoworks.mechanoid.db.sqliteModel.SingleSourceTable; import com.robotoworks.mechanoid.db.sqliteModel.SqliteModelPackage; import com.robotoworks.mechanoid.db.sqliteModel.TableDefinition; import com.robotoworks.mechanoid.db.util.ModelUtil; import com.robotoworks.mechanoid.db.validation.StatementSequenceValidatorResult; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; @SuppressWarnings("all") public class StatementSequenceValidator { private final HashSet<String> tables = new HashSet<String>(); private final HashSet<String> views = new HashSet<String>(); private final HashSet<String> triggers = new HashSet<String>(); private final HashSet<String> indexes = new HashSet<String>(); public StatementSequenceValidatorResult validate(final DatabaseBlock db) { this.tables.clear(); this.views.clear(); this.triggers.clear(); this.indexes.clear(); StatementSequenceValidatorResult result = new StatementSequenceValidatorResult(); result.valid = true; EList<MigrationBlock> _migrations = db.getMigrations(); for (final MigrationBlock migration : _migrations) { { EList<DDLStatement> statements = migration.getStatements(); for (final DDLStatement stmt : statements) { { result.source = stmt; this.validateStatement(result, stmt); if (result.valid) { this.sequence(stmt); } else { return result; } } } } } return result; } public boolean nameExists(final String name) { boolean _or = false; boolean _or_1 = false; boolean _or_2 = false; boolean _contains = this.tables.contains(name); if (_contains) { _or_2 = true; } else { boolean _contains_1 = this.views.contains(name); _or_2 = _contains_1; } if (_or_2) { _or_1 = true; } else { boolean _contains_2 = this.triggers.contains(name); _or_1 = _contains_2; } if (_or_1) { _or = true; } else { boolean _contains_3 = this.indexes.contains(name); _or = _contains_3; } return _or; } public boolean sourceExists(final String name) { boolean _or = false; boolean _contains = this.tables.contains(name); if (_contains) { _or = true; } else { boolean _contains_1 = this.views.contains(name); _or = _contains_1; } return _or; } protected void _validateStatement(final StatementSequenceValidatorResult result, final CreateTableStatement stmt) { String _name = stmt.getName(); boolean _nameExists = this.nameExists(_name); if (_nameExists) { result.valid = false; result.message = "Name conflict, use another name"; result.feature = SqliteModelPackage.Literals.TABLE_DEFINITION__NAME; } } protected void _validateStatement(final StatementSequenceValidatorResult result, final AlterTableRenameStatement stmt) { TableDefinition _table = stmt.getTable(); String _name = _table.getName(); boolean _contains = this.tables.contains(_name); boolean _not = (!_contains); if (_not) { result.valid = false; result.message = "No such table"; result.feature = SqliteModelPackage.Literals.ALTER_TABLE_RENAME_STATEMENT__TABLE; } else { String _name_1 = stmt.getName(); boolean _nameExists = this.nameExists(_name_1); if (_nameExists) { result.valid = false; result.message = "Name conflict, use another name"; result.feature = SqliteModelPackage.Literals.TABLE_DEFINITION__NAME; } } } protected void _validateStatement(final StatementSequenceValidatorResult result, final AlterTableAddColumnStatement stmt) { TableDefinition _table = stmt.getTable(); String _name = _table.getName(); boolean _contains = this.tables.contains(_name); boolean _not = (!_contains); if (_not) { result.valid = false; result.message = "No such table"; result.feature = SqliteModelPackage.Literals.ALTER_TABLE_ADD_COLUMN_STATEMENT__TABLE; } } protected void _validateStatement(final StatementSequenceValidatorResult result, final DropTableStatement stmt) { TableDefinition _table = stmt.getTable(); String _name = _table.getName(); boolean _contains = this.tables.contains(_name); boolean _not = (!_contains); if (_not) { result.valid = false; result.message = "No such table"; result.feature = SqliteModelPackage.Literals.DROP_TABLE_STATEMENT__TABLE; } } protected void _validateStatement(final StatementSequenceValidatorResult result, final CreateViewStatement stmt) { String _name = stmt.getName(); boolean _nameExists = this.nameExists(_name); if (_nameExists) { result.valid = false; result.message = "Name conflict, use another name"; result.feature = SqliteModelPackage.Literals.TABLE_DEFINITION__NAME; } else { SelectStatement _selectStatement = stmt.getSelectStatement(); SelectCoreExpression _core = _selectStatement.getCore(); this.validateTablesInExpression(result, _core); } } public void validateTablesInExpression(final StatementSequenceValidatorResult result, final SelectCoreExpression expr) { ArrayList<EObject> sources = ModelUtil.getAllReferenceableSingleSources(expr); for (final EObject source : sources) { if ((source instanceof SingleSourceTable)) { SingleSourceTable table = ((SingleSourceTable) source); TableDefinition _tableReference = table.getTableReference(); String _name = _tableReference.getName(); boolean _sourceExists = this.sourceExists(_name); boolean _not = (!_sourceExists); if (_not) { result.source = table; result.valid = false; result.message = "No such reference"; result.feature = SqliteModelPackage.Literals.SINGLE_SOURCE_TABLE__TABLE_REFERENCE; return; } } } } protected void _validateStatement(final StatementSequenceValidatorResult result, final DropViewStatement stmt) { CreateViewStatement _view = stmt.getView(); String _name = _view.getName(); boolean _contains = this.views.contains(_name); boolean _not = (!_contains); if (_not) { result.valid = false; result.message = "No such view"; result.feature = SqliteModelPackage.Literals.DROP_VIEW_STATEMENT__VIEW; } } protected void _validateStatement(final StatementSequenceValidatorResult result, final CreateTriggerStatement stmt) { String _name = stmt.getName(); boolean _nameExists = this.nameExists(_name); if (_nameExists) { result.valid = false; result.message = "Name conflict, use another name"; result.feature = SqliteModelPackage.Literals.CREATE_TRIGGER_STATEMENT__NAME; } else { TableDefinition _table = stmt.getTable(); String _name_1 = _table.getName(); boolean _contains = this.tables.contains(_name_1); boolean _not = (!_contains); if (_not) { result.valid = false; result.message = "No such table"; result.feature = SqliteModelPackage.Literals.CREATE_TRIGGER_STATEMENT__TABLE; } } } protected void _validateStatement(final StatementSequenceValidatorResult result, final DropTriggerStatement stmt) { CreateTriggerStatement _trigger = stmt.getTrigger(); String _name = _trigger.getName(); boolean _contains = this.triggers.contains(_name); boolean _not = (!_contains); if (_not) { result.valid = false; result.message = "No such trigger"; result.feature = SqliteModelPackage.Literals.DROP_TRIGGER_STATEMENT__TRIGGER; } } protected void _validateStatement(final StatementSequenceValidatorResult result, final CreateIndexStatement stmt) { String _name = stmt.getName(); boolean _nameExists = this.nameExists(_name); if (_nameExists) { result.valid = false; result.message = "Name conflict, use another name"; result.feature = SqliteModelPackage.Literals.CREATE_INDEX_STATEMENT__NAME; } else { TableDefinition _table = stmt.getTable(); String _name_1 = _table.getName(); boolean _contains = this.tables.contains(_name_1); boolean _not = (!_contains); if (_not) { result.valid = false; result.message = "No such table"; result.feature = SqliteModelPackage.Literals.CREATE_INDEX_STATEMENT__TABLE; } } } protected void _validateStatement(final StatementSequenceValidatorResult result, final DropIndexStatement stmt) { CreateIndexStatement _index = stmt.getIndex(); String _name = _index.getName(); boolean _contains = this.indexes.contains(_name); boolean _not = (!_contains); if (_not) { result.valid = false; result.message = "No such index"; result.feature = SqliteModelPackage.Literals.DROP_INDEX_STATEMENT__INDEX; } } protected void _sequence(final CreateTableStatement stmt) { String _name = stmt.getName(); this.tables.add(_name); } protected void _sequence(final AlterTableRenameStatement stmt) { TableDefinition _table = stmt.getTable(); String _name = _table.getName(); this.tables.remove(_name); String _name_1 = stmt.getName(); this.tables.add(_name_1); } protected void _sequence(final AlterTableAddColumnStatement stmt) { } protected void _sequence(final DropTableStatement stmt) { TableDefinition _table = stmt.getTable(); String _name = _table.getName(); this.tables.remove(_name); } protected void _sequence(final CreateViewStatement stmt) { String _name = stmt.getName(); this.views.add(_name); } protected void _sequence(final DropViewStatement stmt) { CreateViewStatement _view = stmt.getView(); String _name = _view.getName(); this.views.remove(_name); } protected void _sequence(final CreateTriggerStatement stmt) { String _name = stmt.getName(); this.triggers.add(_name); } protected void _sequence(final DropTriggerStatement stmt) { CreateTriggerStatement _trigger = stmt.getTrigger(); String _name = _trigger.getName(); this.triggers.remove(_name); } protected void _sequence(final CreateIndexStatement stmt) { String _name = stmt.getName(); this.indexes.add(_name); } protected void _sequence(final DropIndexStatement stmt) { CreateIndexStatement _index = stmt.getIndex(); String _name = _index.getName(); this.indexes.remove(_name); } public void validateStatement(final StatementSequenceValidatorResult result, final DDLStatement stmt) { if (stmt instanceof AlterTableRenameStatement) { _validateStatement(result, (AlterTableRenameStatement)stmt); return; } else if (stmt instanceof CreateTableStatement) { _validateStatement(result, (CreateTableStatement)stmt); return; } else if (stmt instanceof CreateViewStatement) { _validateStatement(result, (CreateViewStatement)stmt); return; } else if (stmt instanceof AlterTableAddColumnStatement) { _validateStatement(result, (AlterTableAddColumnStatement)stmt); return; } else if (stmt instanceof CreateIndexStatement) { _validateStatement(result, (CreateIndexStatement)stmt); return; } else if (stmt instanceof CreateTriggerStatement) { _validateStatement(result, (CreateTriggerStatement)stmt); return; } else if (stmt instanceof DropIndexStatement) { _validateStatement(result, (DropIndexStatement)stmt); return; } else if (stmt instanceof DropTableStatement) { _validateStatement(result, (DropTableStatement)stmt); return; } else if (stmt instanceof DropTriggerStatement) { _validateStatement(result, (DropTriggerStatement)stmt); return; } else if (stmt instanceof DropViewStatement) { _validateStatement(result, (DropViewStatement)stmt); return; } else { throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(result, stmt).toString()); } } public void sequence(final DDLStatement stmt) { if (stmt instanceof AlterTableRenameStatement) { _sequence((AlterTableRenameStatement)stmt); return; } else if (stmt instanceof CreateTableStatement) { _sequence((CreateTableStatement)stmt); return; } else if (stmt instanceof CreateViewStatement) { _sequence((CreateViewStatement)stmt); return; } else if (stmt instanceof AlterTableAddColumnStatement) { _sequence((AlterTableAddColumnStatement)stmt); return; } else if (stmt instanceof CreateIndexStatement) { _sequence((CreateIndexStatement)stmt); return; } else if (stmt instanceof CreateTriggerStatement) { _sequence((CreateTriggerStatement)stmt); return; } else if (stmt instanceof DropIndexStatement) { _sequence((DropIndexStatement)stmt); return; } else if (stmt instanceof DropTableStatement) { _sequence((DropTableStatement)stmt); return; } else if (stmt instanceof DropTriggerStatement) { _sequence((DropTriggerStatement)stmt); return; } else if (stmt instanceof DropViewStatement) { _sequence((DropViewStatement)stmt); return; } else { throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(stmt).toString()); } } }