Skip to content

Commit

Permalink
Added the ability to delete multiple columns at once.
Browse files Browse the repository at this point in the history
  • Loading branch information
Andorbal committed Mar 18, 2012
1 parent 0e28676 commit 98ef1aa
Show file tree
Hide file tree
Showing 24 changed files with 314 additions and 52 deletions.
12 changes: 9 additions & 3 deletions src/FluentMigrator.Runner/Generators/Generic/GenericGenerator.cs
@@ -1,11 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text; using System.Text;
using FluentMigrator.Expressions; using FluentMigrator.Expressions;
using FluentMigrator.Model; using FluentMigrator.Model;
using FluentMigrator.Runner.Generators.Base; using FluentMigrator.Runner.Generators.Base;
using System.Linq;
using System.Data;


namespace FluentMigrator.Runner.Generators.Generic namespace FluentMigrator.Runner.Generators.Generic
{ {
Expand Down Expand Up @@ -92,7 +92,13 @@ public override string Generate(AlterColumnExpression expression)


public override string Generate(DeleteColumnExpression expression) public override string Generate(DeleteColumnExpression expression)
{ {
return String.Format(DropColumn, Quoter.QuoteTableName(expression.TableName), Quoter.QuoteColumnName(expression.ColumnName)); StringBuilder builder = new StringBuilder();
foreach (string columnName in expression.ColumnNames)
{
if (expression.ColumnNames.First() != columnName) builder.AppendLine(";");
builder.AppendFormat(DropColumn, Quoter.QuoteTableName(expression.TableName), Quoter.QuoteColumnName(columnName));
}
return builder.ToString();
} }


public override string Generate(RenameColumnExpression expression) public override string Generate(RenameColumnExpression expression)
Expand Down
@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Text;
using FluentMigrator.Expressions; using FluentMigrator.Expressions;
using FluentMigrator.Model; using FluentMigrator.Model;
Expand Down Expand Up @@ -44,7 +45,15 @@ public override string Generate(DeleteTableExpression expression)


public override string Generate(DeleteColumnExpression expression) public override string Generate(DeleteColumnExpression expression)
{ {
return string.Format("ALTER TABLE {0}.{1} DROP COLUMN {2}", Quoter.QuoteSchemaName(expression.SchemaName), Quoter.QuoteTableName(expression.TableName), Quoter.QuoteColumnName(expression.ColumnName)); StringBuilder builder = new StringBuilder();
foreach (string columnName in expression.ColumnNames) {
if (expression.ColumnNames.First() != columnName) builder.AppendLine(";");
builder.AppendFormat("ALTER TABLE {0}.{1} DROP COLUMN {2}",
Quoter.QuoteSchemaName(expression.SchemaName),
Quoter.QuoteTableName(expression.TableName),
Quoter.QuoteColumnName(columnName));
}
return builder.ToString();
} }


public override string Generate(CreateForeignKeyExpression expression) public override string Generate(CreateForeignKeyExpression expression)
Expand Down
Expand Up @@ -17,6 +17,7 @@
#endregion #endregion


using System; using System;
using System.Linq;
using System.Text; using System.Text;
using FluentMigrator.Expressions; using FluentMigrator.Expressions;
using FluentMigrator.Runner.Extensions; using FluentMigrator.Runner.Extensions;
Expand Down Expand Up @@ -67,20 +68,28 @@ public override string Generate(DeleteColumnExpression expression)
// before we drop a column, we have to drop any default value constraints in SQL Server // before we drop a column, we have to drop any default value constraints in SQL Server
var builder = new StringBuilder(); var builder = new StringBuilder();


builder.AppendLine(Generate(new DeleteDefaultConstraintExpression foreach (string column in expression.ColumnNames)
{ {
ColumnName = expression.ColumnName, if (expression.ColumnNames.First() != column) builder.AppendLine("GO");
SchemaName = expression.SchemaName, BuildDelete(expression, column, builder);
TableName = expression.TableName }
}));
return builder.ToString();
}


builder.AppendLine(); protected virtual void BuildDelete(DeleteColumnExpression expression, string columnName, StringBuilder builder)
{
builder.AppendLine(Generate(new DeleteDefaultConstraintExpression {
ColumnName = columnName,
SchemaName = expression.SchemaName,
TableName = expression.TableName
}));


builder.Append(String.Format("-- now we can finally drop column\r\nALTER TABLE {0} DROP COLUMN {1};", builder.AppendLine();
Quoter.QuoteTableName(expression.TableName),
Quoter.QuoteColumnName(expression.ColumnName)));


return builder.ToString(); builder.AppendLine(String.Format("-- now we can finally drop column\r\nALTER TABLE {0} DROP COLUMN {1};",
Quoter.QuoteTableName(expression.TableName),
Quoter.QuoteColumnName(columnName)));
} }


public override string Generate(AlterDefaultConstraintExpression expression) public override string Generate(AlterDefaultConstraintExpression expression)
Expand Down
Expand Up @@ -238,26 +238,20 @@ public override string Generate(DeleteIndexExpression expression)
return String.Format(DropIndex, Quoter.QuoteIndexName(expression.Index.Name), Quoter.QuoteSchemaName(expression.Index.SchemaName), Quoter.QuoteTableName(expression.Index.TableName)); return String.Format(DropIndex, Quoter.QuoteIndexName(expression.Index.Name), Quoter.QuoteSchemaName(expression.Index.SchemaName), Quoter.QuoteTableName(expression.Index.TableName));
} }


public override string Generate(DeleteColumnExpression expression) protected override void BuildDelete(DeleteColumnExpression expression, string columnName, StringBuilder builder)
{ {
// before we drop a column, we have to drop any default value constraints in SQL Server builder.AppendLine(Generate(new DeleteDefaultConstraintExpression {
var builder = new StringBuilder(); ColumnName = columnName,

SchemaName = expression.SchemaName,
builder.AppendLine(Generate(new DeleteDefaultConstraintExpression TableName = expression.TableName
{ }));
ColumnName = expression.ColumnName,
SchemaName = expression.SchemaName,
TableName = expression.TableName
}));


builder.AppendLine(); builder.AppendLine();


builder.Append(String.Format("-- now we can finally drop column\r\nALTER TABLE {2}.{0} DROP COLUMN {1};", builder.AppendLine(String.Format("-- now we can finally drop column\r\nALTER TABLE {2}.{0} DROP COLUMN {1};",
Quoter.QuoteTableName(expression.TableName), Quoter.QuoteTableName(expression.TableName),
Quoter.QuoteColumnName(expression.ColumnName), Quoter.QuoteColumnName(columnName),
Quoter.QuoteSchemaName(expression.SchemaName))); Quoter.QuoteSchemaName(expression.SchemaName)));

return builder.ToString();
} }


public override string Generate(AlterDefaultConstraintExpression expression) public override string Generate(AlterDefaultConstraintExpression expression)
Expand Down
Expand Up @@ -18,6 +18,7 @@
#endregion #endregion


using System; using System;
using System.Linq;
using FluentMigrator.Expressions; using FluentMigrator.Expressions;


namespace FluentMigrator.Runner.Generators.SqlServer namespace FluentMigrator.Runner.Generators.SqlServer
Expand Down Expand Up @@ -56,7 +57,7 @@ public override string Generate(DeleteColumnExpression expression)
{ {
// Limited functionality in CE, for now will just drop the column.. no DECLARE support! // Limited functionality in CE, for now will just drop the column.. no DECLARE support!
const string sql = @"ALTER TABLE {0} DROP COLUMN {1};"; const string sql = @"ALTER TABLE {0} DROP COLUMN {1};";
return String.Format(sql, Quoter.QuoteTableName(expression.TableName), Quoter.QuoteColumnName(expression.ColumnName)); return String.Format(sql, Quoter.QuoteTableName(expression.TableName), Quoter.QuoteColumnName(expression.ColumnNames.ElementAt(0)));
} }


public override string Generate(DeleteIndexExpression expression) public override string Generate(DeleteIndexExpression expression)
Expand Down
Expand Up @@ -16,6 +16,8 @@
// //
#endregion #endregion


using System.Collections.Generic;
using System.Linq;
using FluentMigrator.Builders.Delete.Column; using FluentMigrator.Builders.Delete.Column;
using FluentMigrator.Expressions; using FluentMigrator.Expressions;
using Moq; using Moq;
Expand All @@ -36,5 +38,28 @@ public void CallingFromTableSetsTableName()


expressionMock.VerifySet(x => x.TableName = "Bacon"); expressionMock.VerifySet(x => x.TableName = "Bacon");
} }

[Test]
public void CallingColumnAddsColumnNameToList()
{
var expressionMock = new Mock<DeleteColumnExpression>();
expressionMock.Object.ColumnNames = new List<string> {"Cheese"};

var builder = new DeleteColumnExpressionBuilder(expressionMock.Object);
builder.Column("Bacon");

Assert.That(expressionMock.Object.ColumnNames.ElementAt(1), Is.EqualTo("Bacon"));
}

[Test]
public void CallingInSchemaSetsSchemaOnExpression()
{
var expressionMock = new Mock<DeleteColumnExpression>();

var builder = new DeleteColumnExpressionBuilder(expressionMock.Object);
builder.InSchema("Bacon");

expressionMock.VerifySet(x => x.SchemaName = "Bacon");
}
} }
} }
Expand Up @@ -17,6 +17,7 @@
#endregion #endregion


using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using FluentMigrator.Builders.Delete; using FluentMigrator.Builders.Delete;
using FluentMigrator.Builders.Delete.Column; using FluentMigrator.Builders.Delete.Column;
using FluentMigrator.Builders.Delete.ForeignKey; using FluentMigrator.Builders.Delete.ForeignKey;
Expand Down Expand Up @@ -57,7 +58,7 @@ public void CallingColumnAddsDeleteColumnExpressionToContextWithSpecifiedName()
var root = new DeleteExpressionRoot(contextMock.Object); var root = new DeleteExpressionRoot(contextMock.Object);
root.Column("Bacon"); root.Column("Bacon");


collectionMock.Verify(x => x.Add(It.Is<DeleteColumnExpression>(e => e.ColumnName.Equals("Bacon")))); collectionMock.Verify(x => x.Add(It.Is<DeleteColumnExpression>(e => e.ColumnNames.ElementAt(0).Equals("Bacon"))));
contextMock.VerifyGet(x => x.Expressions); contextMock.VerifyGet(x => x.Expressions);
} }


Expand Down
Expand Up @@ -18,6 +18,7 @@


using System; using System;
using System.Data; using System.Data;
using System.Linq;
using FluentMigrator.Expressions; using FluentMigrator.Expressions;
using FluentMigrator.Infrastructure; using FluentMigrator.Infrastructure;
using FluentMigrator.Model; using FluentMigrator.Model;
Expand Down Expand Up @@ -75,7 +76,7 @@ public void ReverseSetsTableNameAndColumnNameOnGeneratedExpression()
var expression = new CreateColumnExpression { TableName = "Bacon", Column = { Name = "BaconId" } }; var expression = new CreateColumnExpression { TableName = "Bacon", Column = { Name = "BaconId" } };
var reverse = expression.Reverse() as DeleteColumnExpression; var reverse = expression.Reverse() as DeleteColumnExpression;
reverse.TableName.ShouldBe("Bacon"); reverse.TableName.ShouldBe("Bacon");
reverse.ColumnName.ShouldBe("BaconId"); reverse.ColumnNames.ElementAt(0).ShouldBe("BaconId");
} }


[Test] [Test]
Expand Down
Expand Up @@ -55,23 +55,31 @@ public void ErrorIsNotReturnedWhenTableNameIsNotNullEmptyString()
[Test] [Test]
public void ErrorIsReturnedWhenColumnNameIsNull() public void ErrorIsReturnedWhenColumnNameIsNull()
{ {
var expression = new DeleteColumnExpression { ColumnName = null }; var expression = new DeleteColumnExpression { ColumnNames = {null} };
var errors = ValidationHelper.CollectErrors(expression); var errors = ValidationHelper.CollectErrors(expression);
errors.ShouldContain(ErrorMessages.ColumnNameCannotBeNullOrEmpty); errors.ShouldContain(ErrorMessages.ColumnNameCannotBeNullOrEmpty);
} }


[Test] [Test]
public void ErrorIsReturnedWhenColumnNameIsEmptyString() public void ErrorIsReturnedWhenColumnNameIsEmptyString()
{ {
var expression = new DeleteColumnExpression { ColumnName = String.Empty }; var expression = new DeleteColumnExpression { ColumnNames = {String.Empty} };
var errors = ValidationHelper.CollectErrors(expression); var errors = ValidationHelper.CollectErrors(expression);
errors.ShouldContain(ErrorMessages.ColumnNameCannotBeNullOrEmpty); errors.ShouldContain(ErrorMessages.ColumnNameCannotBeNullOrEmpty);
} }


[Test]
public void ErrorIsReturnedWhenColumnIsSpecifiedMultipleTimes()
{
var expression = new DeleteColumnExpression { ColumnNames = { "Bacon", "Bacon" } };
var errors = ValidationHelper.CollectErrors(expression);
errors.ShouldContain(ErrorMessages.ColumnNamesMustBeUnique);
}

[Test] [Test]
public void ErrorIsNotReturnedWhenColumnNameIsNotNullEmptyString() public void ErrorIsNotReturnedWhenColumnNameIsNotNullEmptyString()
{ {
var expression = new DeleteColumnExpression { ColumnName = "Bacon" }; var expression = new DeleteColumnExpression { ColumnNames = {"Bacon"} };
var errors = ValidationHelper.CollectErrors(expression); var errors = ValidationHelper.CollectErrors(expression);
errors.ShouldNotContain(ErrorMessages.ColumnNameCannotBeNullOrEmpty); errors.ShouldNotContain(ErrorMessages.ColumnNameCannotBeNullOrEmpty);
} }
Expand All @@ -86,7 +94,7 @@ public void ReverseThrowsException()
[Test] [Test]
public void ToStringIsDescriptive() public void ToStringIsDescriptive()
{ {
var expression = new DeleteColumnExpression { TableName = "Test", ColumnName = "Bacon" }; var expression = new DeleteColumnExpression { TableName = "Test", ColumnNames = {"Bacon"} };
expression.ToString().ShouldBe("DeleteColumn Test Bacon"); expression.ToString().ShouldBe("DeleteColumn Test Bacon");
} }
} }
Expand Down
Expand Up @@ -292,7 +292,12 @@ public static DeleteTableExpression GetDeleteTableExpression()


public static DeleteColumnExpression GetDeleteColumnExpression() public static DeleteColumnExpression GetDeleteColumnExpression()
{ {
return new DeleteColumnExpression { TableName = TestTableName1, ColumnName = TestColumnName1 }; return GetDeleteColumnExpression(new [] {TestColumnName1});
}

public static DeleteColumnExpression GetDeleteColumnExpression(string[] columns)
{
return new DeleteColumnExpression { TableName = TestTableName1, ColumnNames = columns };
} }


public static DeleteIndexExpression GetDeleteIndexExpression() public static DeleteIndexExpression GetDeleteIndexExpression()
Expand Down
Expand Up @@ -25,6 +25,15 @@ public override void CanDropColumn()
sql.ShouldBe("ALTER TABLE [TestTable1] DROP COLUMN [TestColumn1]"); sql.ShouldBe("ALTER TABLE [TestTable1] DROP COLUMN [TestColumn1]");
} }


[Test]
public void CanDropMultipleColumns()
{
var expression = GeneratorTestHelper.GetDeleteColumnExpression(new string[] { "TestColumn1", "TestColumn2" });

string sql = _generator.Generate(expression);
sql.ShouldBe("ALTER TABLE [TestTable1] DROP COLUMN [TestColumn1];\r\nALTER TABLE [TestTable1] DROP COLUMN [TestColumn2]");
}

[Test] [Test]
public override void CanDropForeignKey() public override void CanDropForeignKey()
{ {
Expand Down
Expand Up @@ -24,6 +24,14 @@ public override void CanDropColumn()
sql.ShouldBe("ALTER TABLE `TestTable1` DROP COLUMN `TestColumn1`"); sql.ShouldBe("ALTER TABLE `TestTable1` DROP COLUMN `TestColumn1`");
} }


[Test]
public void CanDropMultipleColumns()
{
var expression = GeneratorTestHelper.GetDeleteColumnExpression(new string[] {"TestColumn1", "TestColumn2"});
var sql = _generator.Generate(expression);
sql.ShouldBe("ALTER TABLE `TestTable1` DROP COLUMN `TestColumn1`;\r\nALTER TABLE `TestTable1` DROP COLUMN `TestColumn2`");
}

[Test] [Test]
public override void CanDropForeignKey() public override void CanDropForeignKey()
{ {
Expand Down
Expand Up @@ -24,6 +24,14 @@ public override void CanDropColumn()
sql.ShouldBe("ALTER TABLE TestTable1 DROP COLUMN TestColumn1"); sql.ShouldBe("ALTER TABLE TestTable1 DROP COLUMN TestColumn1");
} }


[Test]
public void CanDropMultipleColumns()
{
var expression = GeneratorTestHelper.GetDeleteColumnExpression(new string[] {"TestColumn1", "TestColumn2"});
string sql = _generator.Generate(expression);
sql.ShouldBe("ALTER TABLE TestTable1 DROP COLUMN TestColumn1;\r\nALTER TABLE TestTable1 DROP COLUMN TestColumn2");
}

[Test] [Test]
public override void CanDropForeignKey() public override void CanDropForeignKey()
{ {
Expand Down
Expand Up @@ -157,12 +157,25 @@ public void CanDropColumn()


var expression = new DeleteColumnExpression(); var expression = new DeleteColumnExpression();
expression.TableName = tableName; expression.TableName = tableName;
expression.ColumnName = columnName; expression.ColumnNames.Add(columnName);


string sql = generator.Generate(expression); string sql = generator.Generate(expression);
sql.ShouldBe("ALTER TABLE \"public\".\"NewTable\" DROP COLUMN \"NewColumn\""); sql.ShouldBe("ALTER TABLE \"public\".\"NewTable\" DROP COLUMN \"NewColumn\"");
} }


[Test]
public void CanDropMultipleColumns()
{
var expression = new DeleteColumnExpression();
expression.TableName = "NewTable";
expression.ColumnNames.Add("NewColumn");
expression.ColumnNames.Add("OtherColumn");

string sql = generator.Generate(expression);
sql.ShouldBe("ALTER TABLE \"public\".\"NewTable\" DROP COLUMN \"NewColumn\";\r\n" +
"ALTER TABLE \"public\".\"NewTable\" DROP COLUMN \"OtherColumn\"");
}

[Test] [Test]
public void CanAddColumn() public void CanAddColumn()
{ {
Expand Down
Expand Up @@ -25,6 +25,14 @@ public override void CanDropColumn()
sql.ShouldBe(String.Empty); //because sqlite doesnt support removing columns sql.ShouldBe(String.Empty); //because sqlite doesnt support removing columns
} }


[Test]
public void CanDropMultipleColumns()
{
var expression = GeneratorTestHelper.GetDeleteColumnExpression(new string[] {"TestColumn1", "TestColumn2"});
string sql = _generator.Generate(expression);
sql.ShouldBe(String.Empty); //because sqlite doesnt support removing columns
}

[Test] [Test]
public override void CanDropForeignKey() public override void CanDropForeignKey()
{ {
Expand Down

0 comments on commit 98ef1aa

Please sign in to comment.