Skip to content

Commit ecc9ae5

Browse files
JaBistDuNarrischJaBistDuNarrisch
authored andcommitted
Added CopyDataFromTableToTable
1 parent 00fbba4 commit ecc9ae5

13 files changed

+380
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
using System.Collections.Generic;
2+
using System.Data;
3+
using DotNetProjects.Migrator.Framework;
4+
using Migrator.Tests.Providers.Base;
5+
using Migrator.Tests.Providers.Generic.Models;
6+
using NUnit.Framework;
7+
8+
namespace Migrator.Tests.Providers.Generic;
9+
10+
public abstract class Generic_CopyDataFromTableToTableBase : TransformationProviderBase
11+
{
12+
[Test]
13+
public void CopyDataFromTableToTable_Success()
14+
{
15+
// Arrange
16+
const string tableNameSource = "SourceTable";
17+
const string columnName1Source = "SourceColumn1";
18+
const string columnName2Source = "SourceColumn2";
19+
const string columnName3Source = "SourceColumn3";
20+
21+
const string tableNameTarget = "TargetTable";
22+
const string columnName1Target = "TargetColumn1";
23+
const string columnName2Target = "TargetColumn2";
24+
const string columnName3Target = "TargetColumn3";
25+
26+
Provider.AddTable(tableNameSource,
27+
new Column(columnName1Source, DbType.Int32),
28+
new Column(columnName2Source, DbType.String),
29+
new Column(columnName3Source, DbType.Int32)
30+
);
31+
32+
Provider.AddTable(tableNameTarget,
33+
new Column(columnName1Target, DbType.Int32),
34+
new Column(columnName2Target, DbType.String),
35+
new Column(columnName3Target, DbType.Int32)
36+
);
37+
38+
Provider.Insert(tableNameSource, [columnName1Source, columnName2Source, columnName3Source], [2, "Hello2", 22]);
39+
Provider.Insert(tableNameSource, [columnName1Source, columnName2Source, columnName3Source], [1, "Hello1", 11]);
40+
41+
// Act
42+
Provider.CopyDataFromTableToTable(
43+
tableNameSource,
44+
[columnName1Source, columnName2Source, columnName3Source],
45+
tableNameTarget,
46+
[columnName1Target, columnName2Target, columnName3Target],
47+
[columnName1Source]);
48+
49+
// Assert
50+
List<CopyDataFromTableToTableModel> targetRows = [];
51+
using (var cmd = Provider.CreateCommand())
52+
using (var reader = Provider.Select(cmd, tableNameTarget, [columnName1Target, columnName2Target, columnName3Target]))
53+
{
54+
while (reader.Read())
55+
{
56+
targetRows.Add(new CopyDataFromTableToTableModel
57+
{
58+
Column1 = reader.GetInt32(0),
59+
Column2 = reader.GetString(1),
60+
Column3 = reader.GetInt32(2),
61+
});
62+
}
63+
}
64+
65+
List<CopyDataFromTableToTableModel> expectedTargetRows = [
66+
new CopyDataFromTableToTableModel{ Column1 = 1, Column2 = "Hello1", Column3 = 11 },
67+
new CopyDataFromTableToTableModel{ Column1 = 2, Column2 = "Hello2", Column3 = 22 },
68+
];
69+
70+
Assert.That(targetRows, Is.EquivalentTo(expectedTargetRows).Using<CopyDataFromTableToTableModel>((x, y) =>
71+
x.Column1 == y.Column1 &&
72+
x.Column2 == y.Column2 &&
73+
x.Column3 == y.Column3));
74+
}
75+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Migrator.Tests.Providers.Generic.Models;
2+
3+
public class CopyDataFromTableToTableModel
4+
{
5+
public int Column1 { get; set; }
6+
public string Column2 { get; set; }
7+
public int Column3 { get; set; }
8+
}
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_CopyDataFromTableToTableTests : Generic_CopyDataFromTableToTableBase
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_CopyDataFromTableToTableTests : Generic_CopyDataFromTableToTableBase
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_CopyDataFromTableToTableTests : Generic_CopyDataFromTableToTableBase
10+
{
11+
[SetUp]
12+
public async Task SetUpAsync()
13+
{
14+
await BeginSQLServerTransactionAsync();
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.SQLite;
6+
7+
[TestFixture]
8+
[Category("SQLite")]
9+
public class SQLiteTransformationProvider_CopyDataFromTableToTableTests : Generic_CopyDataFromTableToTableBase
10+
{
11+
[SetUp]
12+
public async Task SetUpAsync()
13+
{
14+
await BeginSQLiteTransactionAsync();
15+
}
16+
}

src/Migrator/Framework/ITransformationProvider.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,16 @@ public interface ITransformationProvider : IDisposable
343343
/// <returns></returns>
344344
bool ConstraintExists(string table, string name);
345345

346+
/// <summary>
347+
/// Copies data from source table to target table using INSERT INTO...SELECT..FROM
348+
/// </summary>
349+
/// <param name="sourceTableName"></param>
350+
/// <param name="sourceColumnNames"></param>
351+
/// <param name="targetTableName"></param>
352+
/// <param name="targetColumnNames"></param>
353+
/// <param name="orderBySourceColumns">Sort source by these columns. <paramref name="sourceColumnNames"/> must contain the <paramref name="orderBySourceColumns"/>.
354+
void CopyDataFromTableToTable(string sourceTableName, List<string> sourceColumnNames, string targetTableName, List<string> targetColumnNames, List<string> orderBySourceColumns);
355+
346356
/// <summary>
347357
/// Check to see if a primary key constraint exists on the table
348358
/// </summary>

src/Migrator/Providers/Impl/Oracle/OracleTransformationProvider.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,59 @@ protected override void ConfigureParameterWithValue(IDbDataParameter parameter,
818818
}
819819
}
820820

821+
public override void CopyDataFromTableToTable(string sourceTableName, List<string> sourceColumnNames, string targetTableName, List<string> targetColumnNames, List<string> orderBySourceColumns)
822+
{
823+
orderBySourceColumns ??= [];
824+
825+
if (!TableExists(sourceTableName))
826+
{
827+
throw new Exception($"Source table '{QuoteTableNameIfRequired(sourceTableName)}' does not exist");
828+
}
829+
830+
if (!TableExists(targetTableName))
831+
{
832+
throw new Exception($"Target table '{QuoteTableNameIfRequired(targetTableName)}' does not exist");
833+
}
834+
835+
var sourceColumnsConcatenated = sourceColumnNames.Concat(orderBySourceColumns);
836+
837+
foreach (var column in sourceColumnsConcatenated)
838+
{
839+
if (!ColumnExists(sourceTableName, column))
840+
{
841+
throw new Exception($"Column {column} in source table does not exist.");
842+
}
843+
}
844+
845+
foreach (var column in targetColumnNames)
846+
{
847+
if (!ColumnExists(targetTableName, column))
848+
{
849+
throw new Exception($"Column {column} in target table does not exist.");
850+
}
851+
}
852+
853+
if (!orderBySourceColumns.All(x => sourceColumnNames.Contains(x)))
854+
{
855+
throw new Exception($"All columns in {nameof(orderBySourceColumns)} must be in {nameof(sourceColumnNames)}");
856+
}
857+
858+
var sourceTableNameQuoted = QuoteTableNameIfRequired(sourceTableName);
859+
var targetTableNameQuoted = QuoteTableNameIfRequired(targetTableName);
860+
861+
var sourceColumnNamesQuoted = sourceColumnNames.Select(QuoteColumnNameIfRequired).ToList();
862+
var targetColumnNamesQuoted = targetColumnNames.Select(QuoteColumnNameIfRequired).ToList();
863+
var orderBySourceColumnsQuoted = orderBySourceColumns.Select(QuoteColumnNameIfRequired).ToList();
864+
865+
var sourceColumnsJoined = string.Join(", ", sourceColumnNamesQuoted);
866+
var targetColumnsJoined = string.Join(", ", targetColumnNamesQuoted);
867+
var orderBySourceColumnsJoined = string.Join(", ", orderBySourceColumnsQuoted);
868+
869+
870+
var sql = $"INSERT INTO {targetTableNameQuoted} ({targetColumnsJoined}) SELECT {sourceColumnsJoined} FROM {sourceTableNameQuoted} ORDER BY {orderBySourceColumnsJoined}";
871+
ExecuteNonQuery(sql);
872+
}
873+
821874
public override void RemoveColumnDefaultValue(string table, string column)
822875
{
823876
var sql = string.Format("ALTER TABLE {0} MODIFY {1} DEFAULT NULL", table, column);

src/Migrator/Providers/Impl/PostgreSQL/PostgreSQLTransformationProvider.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,59 @@ public override void UpdateTargetFromSource(string tableSourceNotQuoted, string
862862
ExecuteNonQuery(sql);
863863
}
864864

865+
public override void CopyDataFromTableToTable(string sourceTableName, List<string> sourceColumnNames, string targetTableName, List<string> targetColumnNames, List<string> orderBySourceColumns)
866+
{
867+
orderBySourceColumns ??= [];
868+
869+
if (!TableExists(sourceTableName))
870+
{
871+
throw new Exception($"Source table '{QuoteTableNameIfRequired(sourceTableName)}' does not exist");
872+
}
873+
874+
if (!TableExists(targetTableName))
875+
{
876+
throw new Exception($"Target table '{QuoteTableNameIfRequired(targetTableName)}' does not exist");
877+
}
878+
879+
var sourceColumnsConcatenated = sourceColumnNames.Concat(orderBySourceColumns);
880+
881+
foreach (var column in sourceColumnsConcatenated)
882+
{
883+
if (!ColumnExists(sourceTableName, column))
884+
{
885+
throw new Exception($"Column {column} in source table does not exist.");
886+
}
887+
}
888+
889+
foreach (var column in targetColumnNames)
890+
{
891+
if (!ColumnExists(targetTableName, column))
892+
{
893+
throw new Exception($"Column {column} in target table does not exist.");
894+
}
895+
}
896+
897+
if (!orderBySourceColumns.All(x => sourceColumnNames.Contains(x)))
898+
{
899+
throw new Exception($"All columns in {nameof(orderBySourceColumns)} must be in {nameof(sourceColumnNames)}");
900+
}
901+
902+
var sourceTableNameQuoted = QuoteTableNameIfRequired(sourceTableName);
903+
var targetTableNameQuoted = QuoteTableNameIfRequired(targetTableName);
904+
905+
var sourceColumnNamesQuoted = sourceColumnNames.Select(QuoteColumnNameIfRequired).ToList();
906+
var targetColumnNamesQuoted = targetColumnNames.Select(QuoteColumnNameIfRequired).ToList();
907+
var orderBySourceColumnsQuoted = orderBySourceColumns.Select(QuoteColumnNameIfRequired).ToList();
908+
909+
var sourceColumnsJoined = string.Join(", ", sourceColumnNamesQuoted);
910+
var targetColumnsJoined = string.Join(", ", targetColumnNamesQuoted);
911+
var orderBySourceColumnsJoined = string.Join(", ", orderBySourceColumnsQuoted);
912+
913+
914+
var sql = $"INSERT INTO {targetTableNameQuoted} ({targetColumnsJoined}) SELECT {sourceColumnsJoined} FROM {sourceTableNameQuoted} ORDER BY {orderBySourceColumnsJoined}";
915+
ExecuteNonQuery(sql);
916+
}
917+
865918
protected override void ConfigureParameterWithValue(IDbDataParameter parameter, int index, object value)
866919
{
867920
if (value is ushort)
@@ -879,4 +932,5 @@ protected override void ConfigureParameterWithValue(IDbDataParameter parameter,
879932
base.ConfigureParameterWithValue(parameter, index, value);
880933
}
881934
}
935+
882936
}

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,6 +1777,59 @@ public override void AddCheckConstraint(string constraintName, string tableName,
17771777
RecreateTable(sqliteTableInfo);
17781778
}
17791779

1780+
public override void CopyDataFromTableToTable(string sourceTableName, List<string> sourceColumnNames, string targetTableName, List<string> targetColumnNames, List<string> orderBySourceColumns)
1781+
{
1782+
orderBySourceColumns ??= [];
1783+
1784+
if (!TableExists(sourceTableName))
1785+
{
1786+
throw new Exception($"Source table '{QuoteTableNameIfRequired(sourceTableName)}' does not exist");
1787+
}
1788+
1789+
if (!TableExists(targetTableName))
1790+
{
1791+
throw new Exception($"Target table '{QuoteTableNameIfRequired(targetTableName)}' does not exist");
1792+
}
1793+
1794+
var sourceColumnsConcatenated = sourceColumnNames.Concat(orderBySourceColumns);
1795+
1796+
foreach (var column in sourceColumnsConcatenated)
1797+
{
1798+
if (!ColumnExists(sourceTableName, column))
1799+
{
1800+
throw new Exception($"Column {column} in source table does not exist.");
1801+
}
1802+
}
1803+
1804+
foreach (var column in targetColumnNames)
1805+
{
1806+
if (!ColumnExists(targetTableName, column))
1807+
{
1808+
throw new Exception($"Column {column} in target table does not exist.");
1809+
}
1810+
}
1811+
1812+
if (!orderBySourceColumns.All(x => sourceColumnNames.Contains(x)))
1813+
{
1814+
throw new Exception($"All columns in {nameof(orderBySourceColumns)} must be in {nameof(sourceColumnNames)}");
1815+
}
1816+
1817+
var sourceTableNameQuoted = QuoteTableNameIfRequired(sourceTableName);
1818+
var targetTableNameQuoted = QuoteTableNameIfRequired(targetTableName);
1819+
1820+
var sourceColumnNamesQuoted = sourceColumnNames.Select(QuoteColumnNameIfRequired).ToList();
1821+
var targetColumnNamesQuoted = targetColumnNames.Select(QuoteColumnNameIfRequired).ToList();
1822+
var orderBySourceColumnsQuoted = orderBySourceColumns.Select(QuoteColumnNameIfRequired).ToList();
1823+
1824+
var sourceColumnsJoined = string.Join(", ", sourceColumnNamesQuoted);
1825+
var targetColumnsJoined = string.Join(", ", targetColumnNamesQuoted);
1826+
var orderBySourceColumnsJoined = string.Join(", ", orderBySourceColumnsQuoted);
1827+
1828+
1829+
var sql = $"INSERT INTO {targetTableNameQuoted} ({targetColumnsJoined}) SELECT {sourceColumnsJoined} FROM {sourceTableNameQuoted} ORDER BY {orderBySourceColumnsJoined}";
1830+
ExecuteNonQuery(sql);
1831+
}
1832+
17801833
public List<CheckConstraint> GetCheckConstraints(string tableName)
17811834
{
17821835
if (!TableExists(tableName))

0 commit comments

Comments
 (0)