Skip to content

Commit c595fda

Browse files
JaBistDuNarrischJaBistDuNarrisch
authored andcommitted
Reorder columns on AddPrimaryKey
1 parent 55bf070 commit c595fda

File tree

9 files changed

+209
-95
lines changed

9 files changed

+209
-95
lines changed
Lines changed: 89 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,90 @@
1-
using NUnit.Framework;
2-
using DotNetProjects.Migrator.Framework;
3-
using System;
4-
using System.Linq;
5-
6-
namespace Migrator.Tests.Framework.ColumnProperties;
7-
8-
public class ColumnPropertyExtensionsTests
9-
{
10-
[Test]
11-
public void Clear()
12-
{
13-
// Arrange
14-
var columnProperty = ColumnProperty.PrimaryKey | ColumnProperty.NotNull;
15-
16-
// Act
17-
columnProperty = columnProperty.Clear(ColumnProperty.PrimaryKey);
18-
19-
// Assert
20-
Assert.That(columnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.False);
21-
}
22-
23-
[Test]
24-
public void IsSet()
25-
{
26-
// Arrange
27-
var columnProperty = ColumnProperty.PrimaryKeyWithIdentity | ColumnProperty.NotNull;
28-
29-
// Act
30-
var actualData = GetAllSingleColumnProperties().Select(x => new
31-
{
32-
ColumnPropertyString = x.ToString(),
33-
IsSet = columnProperty.IsSet(x),
34-
IsNotSet = columnProperty.IsNotSet(x)
35-
})
36-
.ToList();
37-
38-
// Assert
39-
string[] expectedSet = [nameof(ColumnProperty.PrimaryKey), nameof(ColumnProperty.NotNull), nameof(ColumnProperty.Identity)];
40-
var actualDataShouldBeTrue = actualData.Where(x => expectedSet.Any(y => y == x.ColumnPropertyString)).ToList();
41-
var actualDataShouldBeFalse = actualData.Where(x => !expectedSet.Any(y => y == x.ColumnPropertyString)).ToList();
42-
43-
Assert.That(actualDataShouldBeTrue.Select(x => x.IsSet), Has.All.True);
44-
Assert.That(actualDataShouldBeFalse.Select(x => x.IsSet), Has.All.False);
45-
}
46-
47-
[Test]
48-
public void IsNotSet()
49-
{
50-
// Arrange
51-
var columnProperty = ColumnProperty.PrimaryKeyWithIdentity | ColumnProperty.NotNull;
52-
53-
// Act
54-
var actualData = GetAllSingleColumnProperties().Select(x => new
55-
{
56-
ColumnPropertyString = x.ToString(),
57-
IsSet = columnProperty.IsNotSet(x),
58-
IsNotSet = columnProperty.IsNotSet(x)
59-
})
60-
.ToList();
61-
62-
// Assert
63-
string[] expectedSet = [nameof(ColumnProperty.PrimaryKey), nameof(ColumnProperty.NotNull), nameof(ColumnProperty.Identity)];
64-
var actualDataShouldBeFalse = actualData.Where(x => expectedSet.Any(y => y == x.ColumnPropertyString)).ToList();
65-
var actualDataShouldBeTrue = actualData.Where(x => !expectedSet.Any(y => y == x.ColumnPropertyString)).ToList();
66-
67-
Assert.That(actualDataShouldBeTrue.Select(x => x.IsNotSet), Has.All.True);
68-
Assert.That(actualDataShouldBeFalse.Select(x => x.IsNotSet), Has.All.False);
69-
}
70-
71-
[Test]
72-
public void Set_Success()
73-
{
74-
// Arrange
75-
var columnProperty = ColumnProperty.NotNull;
76-
77-
// Act
78-
var result = columnProperty.Set(ColumnProperty.PrimaryKeyWithIdentity);
79-
80-
// Assert
81-
var expected = ColumnProperty.NotNull | ColumnProperty.PrimaryKeyWithIdentity;
82-
83-
Assert.That(result, Is.EqualTo(expected));
84-
}
85-
86-
private ColumnProperty[] GetAllSingleColumnProperties()
87-
{
88-
return [.. Enum.GetValues<ColumnProperty>().Where(x => x == 0 || (x & (x - 1)) == 0)];
89-
}
1+
using NUnit.Framework;
2+
using DotNetProjects.Migrator.Framework;
3+
using System;
4+
using System.Linq;
5+
6+
namespace Migrator.Tests.Framework.ColumnProperties;
7+
8+
public class ColumnPropertyExtensionsTests
9+
{
10+
[Test]
11+
public void Clear()
12+
{
13+
// Arrange
14+
var columnProperty = ColumnProperty.PrimaryKey | ColumnProperty.NotNull;
15+
16+
// Act
17+
columnProperty = columnProperty.Clear(ColumnProperty.PrimaryKey);
18+
19+
// Assert
20+
Assert.That(columnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.False);
21+
}
22+
23+
[Test]
24+
public void IsSet()
25+
{
26+
// Arrange
27+
var columnProperty = ColumnProperty.PrimaryKeyWithIdentity | ColumnProperty.NotNull;
28+
29+
// Act
30+
var actualData = GetAllSingleColumnProperties().Select(x => new
31+
{
32+
ColumnPropertyString = x.ToString(),
33+
IsSet = columnProperty.IsSet(x),
34+
IsNotSet = columnProperty.IsNotSet(x)
35+
})
36+
.ToList();
37+
38+
// Assert
39+
string[] expectedSet = [nameof(ColumnProperty.PrimaryKey), nameof(ColumnProperty.NotNull), nameof(ColumnProperty.Identity)];
40+
var actualDataShouldBeTrue = actualData.Where(x => expectedSet.Any(y => y == x.ColumnPropertyString)).ToList();
41+
var actualDataShouldBeFalse = actualData.Where(x => !expectedSet.Any(y => y == x.ColumnPropertyString)).ToList();
42+
43+
Assert.That(actualDataShouldBeTrue.Select(x => x.IsSet), Has.All.True);
44+
Assert.That(actualDataShouldBeFalse.Select(x => x.IsSet), Has.All.False);
45+
}
46+
47+
[Test]
48+
public void IsNotSet()
49+
{
50+
// Arrange
51+
var columnProperty = ColumnProperty.PrimaryKeyWithIdentity | ColumnProperty.NotNull;
52+
53+
// Act
54+
var actualData = GetAllSingleColumnProperties().Select(x => new
55+
{
56+
ColumnPropertyString = x.ToString(),
57+
IsSet = columnProperty.IsNotSet(x),
58+
IsNotSet = columnProperty.IsNotSet(x)
59+
})
60+
.ToList();
61+
62+
// Assert
63+
string[] expectedSet = [nameof(ColumnProperty.PrimaryKey), nameof(ColumnProperty.NotNull), nameof(ColumnProperty.Identity)];
64+
var actualDataShouldBeFalse = actualData.Where(x => expectedSet.Any(y => y == x.ColumnPropertyString)).ToList();
65+
var actualDataShouldBeTrue = actualData.Where(x => !expectedSet.Any(y => y == x.ColumnPropertyString)).ToList();
66+
67+
Assert.That(actualDataShouldBeTrue.Select(x => x.IsNotSet), Has.All.True);
68+
Assert.That(actualDataShouldBeFalse.Select(x => x.IsNotSet), Has.All.False);
69+
}
70+
71+
[Test]
72+
public void Set_Success()
73+
{
74+
// Arrange
75+
var columnProperty = ColumnProperty.NotNull;
76+
77+
// Act
78+
var result = columnProperty.Set(ColumnProperty.PrimaryKeyWithIdentity);
79+
80+
// Assert
81+
var expected = ColumnProperty.NotNull | ColumnProperty.PrimaryKeyWithIdentity;
82+
83+
Assert.That(result, Is.EqualTo(expected));
84+
}
85+
86+
private ColumnProperty[] GetAllSingleColumnProperties()
87+
{
88+
return [.. Enum.GetValues<ColumnProperty>().Where(x => x == 0 || (x & (x - 1)) == 0)];
89+
}
9090
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Migrator.Tests.Providers.Base;
2+
using NUnit.Framework;
3+
4+
namespace Migrator.Tests.Providers.Generic;
5+
6+
[TestFixture]
7+
[Category("SQLite")]
8+
public class Generic_AddPrimaryTestsBase : TransformationProviderBase
9+
{ }

src/Migrator.Tests/Providers/Generic/Generic_UpdateFromTableToTableTestsBase.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,15 @@ public void UpdateFromTableToTable_Success()
5656

5757
// Act
5858
Provider.UpdateTargetFromSource(
59-
tableNameSource,
60-
tableNameTarget,
59+
tableNameSource: tableNameSource,
60+
tableNameTarget: tableNameTarget,
61+
copyColumnPairs:
6162
[
6263
new () { ColumnNameSource = columnName3Source, ColumnNameTarget = columnName3Target },
6364
new () { ColumnNameSource = columnName4Source, ColumnNameTarget = columnName4Target },
6465
new () { ColumnNameSource = columnName5Source, ColumnNameTarget = columnName5Target }
6566
],
67+
matchColumnPairs:
6668
[
6769
new () { ColumnNameSource = columnName1Source, ColumnNameTarget = columnName1Target },
6870
new () { ColumnNameSource = columnName2Source, ColumnNameTarget = columnName2Target }
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System.Threading.Tasks;
2+
using Migrator.Tests.Providers.Generic;
3+
using NUnit.Framework;
4+
5+
namespace Migrator.Tests.Providers.OracleProvider;
6+
7+
[TestFixture]
8+
[Category("Oracle")]
9+
public class OracleTransformationProvider_AddPrimaryKeyTests : Generic_AddPrimaryTestsBase
10+
{
11+
[SetUp]
12+
public async Task SetUpAsync()
13+
{
14+
await BeginOracleTransactionAsync();
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System.Threading.Tasks;
2+
using Migrator.Tests.Providers.Generic;
3+
using NUnit.Framework;
4+
5+
namespace Migrator.Tests.Providers.PostgreSQL;
6+
7+
[TestFixture]
8+
[Category("Postgre")]
9+
public class PostgreSQLTransformationProvider_AddPrimaryKeyTests : Generic_AddPrimaryTestsBase
10+
{
11+
[SetUp]
12+
public async Task SetUpAsync()
13+
{
14+
await BeginPostgreSQLTransactionAsync();
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System.Threading.Tasks;
2+
using Migrator.Tests.Providers.Generic;
3+
using NUnit.Framework;
4+
5+
namespace Migrator.Tests.Providers.SQLServer;
6+
7+
[TestFixture]
8+
[Category("SqlServer")]
9+
public class SQLServerTransformationProvider_AddPrimaryKeyTests : Generic_AddPrimaryTestsBase
10+
{
11+
[SetUp]
12+
public async Task SetUpAsync()
13+
{
14+
await BeginSQLServerTransactionAsync();
15+
}
16+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System.Data;
2+
using System.Threading.Tasks;
3+
using DotNetProjects.Migrator.Framework;
4+
using DotNetProjects.Migrator.Providers.Impl.SQLite;
5+
using Migrator.Tests.Providers.Generic;
6+
using NUnit.Framework;
7+
8+
namespace Migrator.Tests.Providers.SQLite;
9+
10+
[TestFixture]
11+
[Category("SQLite")]
12+
public class SQLiteTransformationProvider_AddPrimaryTests : Generic_AddPrimaryTestsBase
13+
{
14+
[SetUp]
15+
public async Task SetUpAsync()
16+
{
17+
await BeginSQLiteTransactionAsync();
18+
}
19+
20+
[Test]
21+
public void AddPrimaryKey_ColumnsInOtherOrderThanInColumnsList_Success()
22+
{
23+
// Arrange
24+
const string columnName1 = "TestColumn";
25+
const string columnName2 = "TestColumn2";
26+
const string columnName3 = "TestColumn3";
27+
const string tableName = "TestTable";
28+
const string primaryKeyName = $"PK_{tableName}";
29+
30+
Provider.AddTable(tableName, new Column(columnName1, DbType.String), new Column(columnName2, DbType.Int32), new Column(columnName3, DbType.Int32));
31+
32+
// Act
33+
Provider.AddPrimaryKey(name: primaryKeyName, table: tableName, columns: [columnName3, columnName2]);
34+
35+
// Assert
36+
var createTableScript = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableName);
37+
38+
Assert.That(createTableScript, Does.Contain("PRIMARY KEY (TestColumn3, TestColumn2))"));
39+
}
40+
}

src/Migrator/Framework/ColumnProperty.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ public enum ColumnProperty
5454
// ForeignKey = 1 << 7,
5555

5656
/// <summary>
57-
/// Primary Key.
57+
/// Primary Key. For compound PKs use AddPrimaryKey instead.
5858
/// </summary>
59+
[Obsolete("Use AddPrimaryKey instead.")]
5960
PrimaryKey = 1 << 8,
6061

6162
/// <summary>

src/Migrator/Providers/Impl/SQLite/SQLiteTransformationProvider.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public override void AddForeignKey(
5757
{
5858
if (string.IsNullOrWhiteSpace(name))
5959
{
60-
throw new Exception("A FK name is mandatory");
60+
throw new Exception("The foreign key name is mandatory");
6161
}
6262

6363
var sqliteTableInfo = GetSQLiteTableInfo(childTable);
@@ -692,12 +692,26 @@ public override void AddPrimaryKey(string name, string tableName, params string[
692692

693693
foreach (var column in sqliteTableInfo.Columns)
694694
{
695-
if (columnNames.Contains(column.Name))
695+
if (columnNames.Any(x => x.Equals(column.Name, StringComparison.OrdinalIgnoreCase)))
696696
{
697-
column.ColumnProperty |= ColumnProperty.PrimaryKey;
697+
column.ColumnProperty = column.ColumnProperty.Set(ColumnProperty.PrimaryKey);
698+
}
699+
else
700+
{
701+
column.ColumnProperty = column.ColumnProperty.Clear(ColumnProperty.PrimaryKey);
698702
}
699703
}
700704

705+
var columnNamesList = columnNames.ToList();
706+
707+
var columnsReordered = sqliteTableInfo.Columns.OrderBy(x =>
708+
{
709+
var index = columnNamesList.IndexOf(x.Name);
710+
return index >= 0 ? index : int.MaxValue;
711+
}).ToList();
712+
713+
sqliteTableInfo.Columns = columnsReordered;
714+
701715
RecreateTable(sqliteTableInfo);
702716
}
703717

0 commit comments

Comments
 (0)