diff --git a/src/providers/WorkflowCore.Persistence.EntityFramework/Services/LargeDataOptimizedEntityFrameworkPersistenceProvider.cs b/src/providers/WorkflowCore.Persistence.EntityFramework/Services/LargeDataOptimizedEntityFrameworkPersistenceProvider.cs new file mode 100644 index 000000000..cbb1658a8 --- /dev/null +++ b/src/providers/WorkflowCore.Persistence.EntityFramework/Services/LargeDataOptimizedEntityFrameworkPersistenceProvider.cs @@ -0,0 +1,135 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using WorkflowCore.Persistence.EntityFramework.Models; +using WorkflowCore.Models; +using WorkflowCore.Persistence.EntityFramework.Interfaces; +using System.Threading; +using WorkflowCore.Interface; + +namespace WorkflowCore.Persistence.EntityFramework.Services +{ + public sealed class LargeDataOptimizedEntityFrameworkPersistenceProvider : EntityFrameworkPersistenceProvider, IPersistenceProvider + { + private readonly IWorkflowDbContextFactory _contextFactory; + + public LargeDataOptimizedEntityFrameworkPersistenceProvider(IWorkflowDbContextFactory contextFactory, bool canCreateDb, bool canMigrateDb) + : base(contextFactory, canCreateDb, canMigrateDb) + { + _contextFactory = contextFactory; + } + + /// + public new async Task> GetWorkflowInstances(WorkflowStatus? status, string type, DateTime? createdFrom, DateTime? createdTo, int skip, int take) + { + using (var db = _contextFactory.Build()) + { + IQueryable query = db.Set() + .Include(wf => wf.ExecutionPointers) + .ThenInclude(ep => ep.ExtensionAttributes) + .Include(wf => wf.ExecutionPointers) + .AsSplitQuery() + .AsQueryable(); + + if (status.HasValue) + { + query = query.Where(x => x.Status == status.Value); + } + + if (!string.IsNullOrEmpty(type)) + { + query = query.Where(x => x.WorkflowDefinitionId == type); + } + + if (createdFrom.HasValue) + { + query = query.Where(x => x.CreateTime >= createdFrom.Value); + } + + if (createdTo.HasValue) + { + query = query.Where(x => x.CreateTime <= createdTo.Value); + } + + var rawResult = await query.OrderBy(x => x.PersistenceId).Skip(skip).Take(take).ToListAsync(); + + var result = new List(rawResult.Count); + + foreach (var item in rawResult) + { + result.Add(item.ToWorkflowInstance()); + } + + return result; + } + } + + /// + public new async Task GetWorkflowInstance(string id, CancellationToken cancellationToken = default) + { + using (var db = _contextFactory.Build()) + { + var uid = new Guid(id); + var raw = await db.Set() + .Include(wf => wf.ExecutionPointers) + .ThenInclude(ep => ep.ExtensionAttributes) + .Include(wf => wf.ExecutionPointers) + .AsSplitQuery() + .FirstAsync(x => x.InstanceId == uid, cancellationToken); + + return raw?.ToWorkflowInstance(); + } + } + + /// + public new async Task> GetWorkflowInstances(IEnumerable ids, CancellationToken cancellationToken = default) + { + if (ids == null) + { + return Array.Empty(); + } + + using (var db = _contextFactory.Build()) + { + var uids = ids.Select(i => new Guid(i)); + var raw = db.Set() + .Include(wf => wf.ExecutionPointers) + .ThenInclude(ep => ep.ExtensionAttributes) + .Include(wf => wf.ExecutionPointers) + .AsSplitQuery() + .Where(x => uids.Contains(x.InstanceId)); + + var persistedWorkflows = await raw.ToListAsync(cancellationToken); + + return persistedWorkflows.Select(i => i.ToWorkflowInstance()); + } + } + + /// + public new async Task PersistWorkflow(WorkflowInstance workflow, CancellationToken cancellationToken = default) + { + using (var db = _contextFactory.Build()) + using (var transaction = await db.Database.BeginTransactionAsync(IsolationLevel.RepeatableRead, cancellationToken)) + { + var uid = new Guid(workflow.Id); + var existingEntity = await db.Set() + .Where(x => x.InstanceId == uid) + .Include(wf => wf.ExecutionPointers) + .ThenInclude(ep => ep.ExtensionAttributes) + .Include(wf => wf.ExecutionPointers) + .AsSplitQuery() + .AsTracking() + .FirstAsync(cancellationToken); + + _ = workflow.ToPersistable(existingEntity); + + await db.SaveChangesAsync(cancellationToken); + + await transaction.CommitAsync(cancellationToken); + } + } + } +} \ No newline at end of file diff --git a/src/providers/WorkflowCore.Persistence.EntityFramework/WorkflowCore.Persistence.EntityFramework.csproj b/src/providers/WorkflowCore.Persistence.EntityFramework/WorkflowCore.Persistence.EntityFramework.csproj index f161d1299..4358d3b2b 100644 --- a/src/providers/WorkflowCore.Persistence.EntityFramework/WorkflowCore.Persistence.EntityFramework.csproj +++ b/src/providers/WorkflowCore.Persistence.EntityFramework/WorkflowCore.Persistence.EntityFramework.csproj @@ -30,8 +30,8 @@ - - + + diff --git a/src/providers/WorkflowCore.Persistence.PostgreSQL/ServiceCollectionExtensions.cs b/src/providers/WorkflowCore.Persistence.PostgreSQL/ServiceCollectionExtensions.cs index 9366c3936..821e541f1 100644 --- a/src/providers/WorkflowCore.Persistence.PostgreSQL/ServiceCollectionExtensions.cs +++ b/src/providers/WorkflowCore.Persistence.PostgreSQL/ServiceCollectionExtensions.cs @@ -9,10 +9,22 @@ namespace Microsoft.Extensions.DependencyInjection { public static class ServiceCollectionExtensions { - public static WorkflowOptions UsePostgreSQL(this WorkflowOptions options, - string connectionString, bool canCreateDB, bool canMigrateDB, string schemaName="wfc") + private static readonly Func DefaultProviderFactory = + (sqlContextFactory, canCreateDb, canMigrateDb) => + new EntityFrameworkPersistenceProvider(sqlContextFactory, canCreateDb, canMigrateDb); + + private static readonly Func OptimizedProviderFactory = + (sqlContextFactory, canCreateDb, canMigrateDb) => + new LargeDataOptimizedEntityFrameworkPersistenceProvider(sqlContextFactory, canCreateDb, canMigrateDb); + + public static WorkflowOptions UsePostgreSQL(this WorkflowOptions options, string connectionString, bool canCreateDB, bool canMigrateDB, string schemaName = "wfc") => + options.UsePostgreSQL(connectionString, canCreateDB, canMigrateDB, false, schemaName); + + public static WorkflowOptions UsePostgreSQL(this WorkflowOptions options, string connectionString, bool canCreateDB, bool canMigrateDB, bool largeDataOptimized, string schemaName="wfc") { - options.UsePersistence(sp => new EntityFrameworkPersistenceProvider(new PostgresContextFactory(connectionString, schemaName), canCreateDB, canMigrateDB)); + var providerFactory = largeDataOptimized ? OptimizedProviderFactory : DefaultProviderFactory; + + options.UsePersistence(_ => providerFactory(new PostgresContextFactory(connectionString, schemaName), canCreateDB, canMigrateDB)); options.Services.AddTransient(sp => new WorkflowPurger(new PostgresContextFactory(connectionString, schemaName))); return options; } diff --git a/src/providers/WorkflowCore.Persistence.SqlServer/ServiceCollectionExtensions.cs b/src/providers/WorkflowCore.Persistence.SqlServer/ServiceCollectionExtensions.cs index 0a54b1ea2..133fdb1e0 100644 --- a/src/providers/WorkflowCore.Persistence.SqlServer/ServiceCollectionExtensions.cs +++ b/src/providers/WorkflowCore.Persistence.SqlServer/ServiceCollectionExtensions.cs @@ -9,11 +9,24 @@ namespace Microsoft.Extensions.DependencyInjection { public static class ServiceCollectionExtensions { - public static WorkflowOptions UseSqlServer(this WorkflowOptions options, string connectionString, bool canCreateDB, bool canMigrateDB, Action initAction = null) + private static readonly Func DefaultProviderFactory = + (sqlContextFactory, canCreateDb, canMigrateDb) => + new EntityFrameworkPersistenceProvider(sqlContextFactory, canCreateDb, canMigrateDb); + + private static readonly Func OptimizedProviderFactory = + (sqlContextFactory, canCreateDb, canMigrateDb) => + new LargeDataOptimizedEntityFrameworkPersistenceProvider(sqlContextFactory, canCreateDb, canMigrateDb); + + public static WorkflowOptions UseSqlServer(this WorkflowOptions options, string connectionString, bool canCreateDB, bool canMigrateDB, Action initAction = null) => + options.UseSqlServer(connectionString, canCreateDB, canMigrateDB, false, initAction); + + public static WorkflowOptions UseSqlServer(this WorkflowOptions options, string connectionString, bool canCreateDB, bool canMigrateDB, bool largeDataOptimized, Action initAction = null) { - options.UsePersistence(sp => new EntityFrameworkPersistenceProvider(new SqlContextFactory(connectionString, initAction), canCreateDB, canMigrateDB)); + var providerFactory = largeDataOptimized ? OptimizedProviderFactory : DefaultProviderFactory; + + options.UsePersistence(_ => providerFactory(new SqlContextFactory(connectionString, initAction), canCreateDB, canMigrateDB)); options.Services.AddTransient(sp => new WorkflowPurger(new SqlContextFactory(connectionString, initAction))); return options; } } -} +} \ No newline at end of file diff --git a/test/WorkflowCore.IntegrationTests/Scenarios/ForkScenario.cs b/test/WorkflowCore.IntegrationTests/Scenarios/ForkScenario.cs index 89a9b46e0..a75cbe8b9 100644 --- a/test/WorkflowCore.IntegrationTests/Scenarios/ForkScenario.cs +++ b/test/WorkflowCore.IntegrationTests/Scenarios/ForkScenario.cs @@ -6,7 +6,7 @@ namespace WorkflowCore.IntegrationTests.Scenarios { - public class ForkScenario : BaseScenario + public class ForkScenario : BaseScenario.OutcomeFork, Object> { static int TaskATicker = 0; static int TaskBTicker = 0; diff --git a/test/WorkflowCore.IntegrationTests/Scenarios/IfScenario.cs b/test/WorkflowCore.IntegrationTests/Scenarios/IfScenario.cs index 8b716715f..37e247466 100644 --- a/test/WorkflowCore.IntegrationTests/Scenarios/IfScenario.cs +++ b/test/WorkflowCore.IntegrationTests/Scenarios/IfScenario.cs @@ -8,7 +8,7 @@ namespace WorkflowCore.IntegrationTests.Scenarios { - public class IfScenario : WorkflowTest + public class IfScenario : WorkflowTest.IfWorkflow, IfScenario.MyDataClass> { internal static int Step1Ticker = 0; internal static int Step2Ticker = 0; diff --git a/test/WorkflowCore.IntegrationTests/Scenarios/UserScenario.cs b/test/WorkflowCore.IntegrationTests/Scenarios/UserScenario.cs index 66d442018..1b5e23155 100644 --- a/test/WorkflowCore.IntegrationTests/Scenarios/UserScenario.cs +++ b/test/WorkflowCore.IntegrationTests/Scenarios/UserScenario.cs @@ -8,7 +8,7 @@ namespace WorkflowCore.IntegrationTests.Scenarios { - public class UserScenario : WorkflowTest + public class UserScenario : WorkflowTest.HumanWorkflow, Object> { internal static int ApproveStepTicker = 0; internal static int DisapproveStepTicker = 0; diff --git a/test/WorkflowCore.IntegrationTests/Scenarios/WhenScenario.cs b/test/WorkflowCore.IntegrationTests/Scenarios/WhenScenario.cs index b56d4c81d..58b39376f 100644 --- a/test/WorkflowCore.IntegrationTests/Scenarios/WhenScenario.cs +++ b/test/WorkflowCore.IntegrationTests/Scenarios/WhenScenario.cs @@ -8,7 +8,7 @@ namespace WorkflowCore.IntegrationTests.Scenarios { - public class WhenScenario : WorkflowTest + public class WhenScenario : WorkflowTest.WhenWorkflow, WhenScenario.MyDataClass> { internal static int Case1Ticker = 0; internal static int Case2Ticker = 0; diff --git a/test/WorkflowCore.IntegrationTests/Scenarios/WhileScenario.cs b/test/WorkflowCore.IntegrationTests/Scenarios/WhileScenario.cs index f91209d44..d42b526a6 100644 --- a/test/WorkflowCore.IntegrationTests/Scenarios/WhileScenario.cs +++ b/test/WorkflowCore.IntegrationTests/Scenarios/WhileScenario.cs @@ -8,7 +8,7 @@ namespace WorkflowCore.IntegrationTests.Scenarios { - public class WhileScenario : WorkflowTest + public class WhileScenario : WorkflowTest.WhileWorkflow, WhileScenario.MyDataClass> { internal static int Step1Ticker = 0; internal static int Step2Ticker = 0; diff --git a/test/WorkflowCore.Tests.DynamoDB/Scenarios/DynamoIfScenario.cs b/test/WorkflowCore.Tests.DynamoDB/Scenarios/DynamoIfScenario.cs index efc3738d8..20630f8ae 100644 --- a/test/WorkflowCore.Tests.DynamoDB/Scenarios/DynamoIfScenario.cs +++ b/test/WorkflowCore.Tests.DynamoDB/Scenarios/DynamoIfScenario.cs @@ -7,8 +7,8 @@ namespace WorkflowCore.Tests.DynamoDB.Scenarios { [Collection("DynamoDb collection")] - public class DynamoIfScenario : IfScenario - { + public class DynamoIfScenario : IfScenario + { protected override void ConfigureServices(IServiceCollection services) { var cfg = new AmazonDynamoDBConfig {ServiceURL = DynamoDbDockerSetup.ConnectionString}; diff --git a/test/WorkflowCore.Tests.DynamoDB/Scenarios/DynamoWhileScenario.cs b/test/WorkflowCore.Tests.DynamoDB/Scenarios/DynamoWhileScenario.cs index 7912b3f53..bed96303d 100644 --- a/test/WorkflowCore.Tests.DynamoDB/Scenarios/DynamoWhileScenario.cs +++ b/test/WorkflowCore.Tests.DynamoDB/Scenarios/DynamoWhileScenario.cs @@ -7,8 +7,8 @@ namespace WorkflowCore.Tests.DynamoDB.Scenarios { [Collection("DynamoDb collection")] - public class DynamoWhileScenario : WhileScenario - { + public class DynamoWhileScenario : WhileScenario + { protected override void ConfigureServices(IServiceCollection services) { var cfg = new AmazonDynamoDBConfig {ServiceURL = DynamoDbDockerSetup.ConnectionString}; diff --git a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoForkScenario.cs b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoForkScenario.cs index f582f0e7b..09739b11f 100644 --- a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoForkScenario.cs +++ b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoForkScenario.cs @@ -6,8 +6,8 @@ namespace WorkflowCore.Tests.MongoDB.Scenarios { [Collection("Mongo collection")] - public class MongoForkScenario : ForkScenario - { + public class MongoForkScenario : ForkScenario + { protected override void Configure(IServiceCollection services) { services.AddWorkflow(x => x.UseMongoDB(MongoDockerSetup.ConnectionString, nameof(MongoForkScenario))); diff --git a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoIfScenario.cs b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoIfScenario.cs index 5c78d3ddc..c9bd2c1d5 100644 --- a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoIfScenario.cs +++ b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoIfScenario.cs @@ -6,8 +6,8 @@ namespace WorkflowCore.Tests.MongoDB.Scenarios { [Collection("Mongo collection")] - public class MongoIfScenario : IfScenario - { + public class MongoIfScenario : IfScenario + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseMongoDB(MongoDockerSetup.ConnectionString, nameof(MongoIfScenario))); diff --git a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoUserScenario.cs b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoUserScenario.cs index fbaa0f223..9264107fb 100644 --- a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoUserScenario.cs +++ b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoUserScenario.cs @@ -6,7 +6,7 @@ namespace WorkflowCore.Tests.MongoDB.Scenarios { [Collection("Mongo collection")] - public class MongoUserScenario : UserScenario + public class MongoUserScenario : UserScenario { protected override void ConfigureServices(IServiceCollection services) { diff --git a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoWhenScenario.cs b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoWhenScenario.cs index b966f35b8..3da52ec3e 100644 --- a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoWhenScenario.cs +++ b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoWhenScenario.cs @@ -6,7 +6,7 @@ namespace WorkflowCore.Tests.MongoDB.Scenarios { [Collection("Mongo collection")] - public class MongoWhenScenario : WhenScenario + public class MongoWhenScenario : WhenScenario { protected override void ConfigureServices(IServiceCollection services) { diff --git a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoWhileScenario.cs b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoWhileScenario.cs index 78e5277f6..5f9eb6201 100644 --- a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoWhileScenario.cs +++ b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoWhileScenario.cs @@ -6,7 +6,7 @@ namespace WorkflowCore.Tests.MongoDB.Scenarios { [Collection("Mongo collection")] - public class MongoWhileScenario : WhileScenario + public class MongoWhileScenario : WhileScenario { protected override void ConfigureServices(IServiceCollection services) { diff --git a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlForkScenario.cs b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlForkScenario.cs index 8a57e465b..c0b2e84c3 100644 --- a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlForkScenario.cs +++ b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlForkScenario.cs @@ -6,8 +6,8 @@ namespace WorkflowCore.Tests.MySQL.Scenarios { [Collection("Mysql collection")] - public class MysqlForkScenario : ForkScenario - { + public class MysqlForkScenario : ForkScenario + { protected override void Configure(IServiceCollection services) { services.AddWorkflow(x => x.UseMySQL(MysqlDockerSetup.ScenarioConnectionString, true, true)); diff --git a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlIfScenario.cs b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlIfScenario.cs index 7cf6721fc..74c849847 100644 --- a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlIfScenario.cs +++ b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlIfScenario.cs @@ -6,8 +6,8 @@ namespace WorkflowCore.Tests.MySQL.Scenarios { [Collection("Mysql collection")] - public class MysqlIfScenario : IfScenario - { + public class MysqlIfScenario : IfScenario + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseMySQL(MysqlDockerSetup.ScenarioConnectionString, true, true)); diff --git a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlUserScenario.cs b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlUserScenario.cs index 909b98b4f..64ed38c9e 100644 --- a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlUserScenario.cs +++ b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlUserScenario.cs @@ -6,7 +6,7 @@ namespace WorkflowCore.Tests.MySQL.Scenarios { [Collection("Mysql collection")] - public class MysqlUserScenario : UserScenario + public class MysqlUserScenario : UserScenario { protected override void ConfigureServices(IServiceCollection services) { diff --git a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlWhenScenario.cs b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlWhenScenario.cs index e7721e382..aa3a74238 100644 --- a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlWhenScenario.cs +++ b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlWhenScenario.cs @@ -6,7 +6,7 @@ namespace WorkflowCore.Tests.MySQL.Scenarios { [Collection("Mysql collection")] - public class MysqlWhenScenario : WhenScenario + public class MysqlWhenScenario : WhenScenario { protected override void ConfigureServices(IServiceCollection services) { diff --git a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlWhileScenario.cs b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlWhileScenario.cs index 8e6c5f6ee..b34e4760a 100644 --- a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlWhileScenario.cs +++ b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlWhileScenario.cs @@ -6,7 +6,7 @@ namespace WorkflowCore.Tests.MySQL.Scenarios { [Collection("Mysql collection")] - public class MysqlWhileScenario : WhileScenario + public class MysqlWhileScenario : WhileScenario { protected override void ConfigureServices(IServiceCollection services) { diff --git a/test/WorkflowCore.Tests.Oracle/Scenarios/OracleForkScenario.cs b/test/WorkflowCore.Tests.Oracle/Scenarios/OracleForkScenario.cs index d525de700..8f7716894 100644 --- a/test/WorkflowCore.Tests.Oracle/Scenarios/OracleForkScenario.cs +++ b/test/WorkflowCore.Tests.Oracle/Scenarios/OracleForkScenario.cs @@ -2,15 +2,14 @@ using Microsoft.Extensions.DependencyInjection; using WorkflowCore.IntegrationTests.Scenarios; using WorkflowCore.Persistence.Oracle; -using WorkflowCore.Tests.Oracle; using Xunit; namespace WorkflowCore.Tests.Oracle.Scenarios { [Collection("Oracle collection")] - public class OracleForkScenario : ForkScenario - { + public class OracleForkScenario : ForkScenario + { protected override void Configure(IServiceCollection services) { services.AddWorkflow(x => x.UseOracle(OracleDockerSetup.ConnectionString, true, true)); diff --git a/test/WorkflowCore.Tests.Oracle/Scenarios/OracleIfScenario.cs b/test/WorkflowCore.Tests.Oracle/Scenarios/OracleIfScenario.cs index c090f89d1..6c24d0d95 100644 --- a/test/WorkflowCore.Tests.Oracle/Scenarios/OracleIfScenario.cs +++ b/test/WorkflowCore.Tests.Oracle/Scenarios/OracleIfScenario.cs @@ -2,15 +2,14 @@ using Microsoft.Extensions.DependencyInjection; using WorkflowCore.IntegrationTests.Scenarios; using WorkflowCore.Persistence.Oracle; -using WorkflowCore.Tests.Oracle; using Xunit; namespace WorkflowCore.Tests.Oracle.Scenarios { [Collection("Oracle collection")] - public class OracleIfScenario : IfScenario - { + public class OracleIfScenario : IfScenario + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseOracle(OracleDockerSetup.ConnectionString, true, true)); diff --git a/test/WorkflowCore.Tests.Oracle/Scenarios/OracleUserScenario.cs b/test/WorkflowCore.Tests.Oracle/Scenarios/OracleUserScenario.cs index 0e5861f6d..ed928ba08 100644 --- a/test/WorkflowCore.Tests.Oracle/Scenarios/OracleUserScenario.cs +++ b/test/WorkflowCore.Tests.Oracle/Scenarios/OracleUserScenario.cs @@ -2,14 +2,13 @@ using Microsoft.Extensions.DependencyInjection; using WorkflowCore.IntegrationTests.Scenarios; using WorkflowCore.Persistence.Oracle; -using WorkflowCore.Tests.Oracle; using Xunit; namespace WorkflowCore.Tests.Oracle.Scenarios { [Collection("Oracle collection")] - public class OracleUserScenario : UserScenario + public class OracleUserScenario : UserScenario { protected override void ConfigureServices(IServiceCollection services) { diff --git a/test/WorkflowCore.Tests.Oracle/Scenarios/OracleWhenScenario.cs b/test/WorkflowCore.Tests.Oracle/Scenarios/OracleWhenScenario.cs index b8671695e..305967290 100644 --- a/test/WorkflowCore.Tests.Oracle/Scenarios/OracleWhenScenario.cs +++ b/test/WorkflowCore.Tests.Oracle/Scenarios/OracleWhenScenario.cs @@ -2,14 +2,13 @@ using Microsoft.Extensions.DependencyInjection; using WorkflowCore.IntegrationTests.Scenarios; using WorkflowCore.Persistence.Oracle; -using WorkflowCore.Tests.Oracle; using Xunit; namespace WorkflowCore.Tests.Oracle.Scenarios { [Collection("Oracle collection")] - public class OracleWhenScenario : WhenScenario + public class OracleWhenScenario : WhenScenario { protected override void ConfigureServices(IServiceCollection services) { diff --git a/test/WorkflowCore.Tests.Oracle/Scenarios/OracleWhileScenario.cs b/test/WorkflowCore.Tests.Oracle/Scenarios/OracleWhileScenario.cs index 0b4b01467..4ad3e7d76 100644 --- a/test/WorkflowCore.Tests.Oracle/Scenarios/OracleWhileScenario.cs +++ b/test/WorkflowCore.Tests.Oracle/Scenarios/OracleWhileScenario.cs @@ -2,14 +2,13 @@ using Microsoft.Extensions.DependencyInjection; using WorkflowCore.IntegrationTests.Scenarios; using WorkflowCore.Persistence.Oracle; -using WorkflowCore.Tests.Oracle; using Xunit; namespace WorkflowCore.Tests.Oracle.Scenarios { [Collection("Oracle collection")] - public class OracleWhileScenario : WhileScenario + public class OracleWhileScenario : WhileScenario { protected override void ConfigureServices(IServiceCollection services) { diff --git a/test/WorkflowCore.Tests.PostgreSQL/DockerSetup.cs b/test/WorkflowCore.Tests.PostgreSQL/DockerSetup.cs index 8548bf85d..fd20d28c1 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/DockerSetup.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/DockerSetup.cs @@ -30,8 +30,9 @@ public Task DisposeAsync() } } - [CollectionDefinition("Postgres collection")] + [CollectionDefinition(Name)] public class PostgresCollection : ICollectionFixture { + public const string Name = "Postgres collection"; } } \ No newline at end of file diff --git a/test/WorkflowCore.Tests.PostgreSQL/PostgresOptimizedPersistenceProviderFixture.cs b/test/WorkflowCore.Tests.PostgreSQL/PostgresOptimizedPersistenceProviderFixture.cs new file mode 100644 index 000000000..ec03c6b63 --- /dev/null +++ b/test/WorkflowCore.Tests.PostgreSQL/PostgresOptimizedPersistenceProviderFixture.cs @@ -0,0 +1,24 @@ +using System; +using WorkflowCore.Interface; +using WorkflowCore.Persistence.EntityFramework.Services; +using WorkflowCore.Persistence.PostgreSQL; +using WorkflowCore.UnitTests; +using Xunit; +using Xunit.Abstractions; + +namespace WorkflowCore.Tests.PostgreSQL +{ + [Collection(PostgresCollection.Name)] + public class PostgresOptimizedPersistenceProviderFixture : BasePersistenceFixture + { + private readonly IPersistenceProvider _subject; + protected override IPersistenceProvider Subject => _subject; + + public PostgresOptimizedPersistenceProviderFixture(PostgresDockerSetup dockerSetup, ITestOutputHelper output) + { + output.WriteLine($"Connecting on {PostgresDockerSetup.ConnectionString}"); + _subject = new LargeDataOptimizedEntityFrameworkPersistenceProvider(new PostgresContextFactory(PostgresDockerSetup.ConnectionString,"wfc"), true, true); + _subject.EnsureStoreExists(); + } + } +} diff --git a/test/WorkflowCore.Tests.PostgreSQL/PostgresPersistenceProviderFixture.cs b/test/WorkflowCore.Tests.PostgreSQL/PostgresPersistenceProviderFixture.cs index 9322b033a..dc27bffa4 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/PostgresPersistenceProviderFixture.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/PostgresPersistenceProviderFixture.cs @@ -8,7 +8,7 @@ namespace WorkflowCore.Tests.PostgreSQL { - [Collection("Postgres collection")] + [Collection(PostgresCollection.Name)] public class PostgresPersistenceProviderFixture : BasePersistenceFixture { private readonly IPersistenceProvider _subject; diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresActivityScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresActivityScenario.cs index 2f31eca31..7bdf64142 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresActivityScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresActivityScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] + [Collection(PostgresCollection.Name)] public class PostgresActivityScenario : ActivityScenario - { + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresActivityScenario : ActivityScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresBasicScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresBasicScenario.cs index 2b1a8e62d..1652eed9b 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresBasicScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresBasicScenario.cs @@ -5,7 +5,7 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] + [Collection(PostgresCollection.Name)] public class PostgresBasicScenario : BasicScenario { protected override void ConfigureServices(IServiceCollection services) @@ -13,4 +13,13 @@ protected override void ConfigureServices(IServiceCollection services) services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresBasicScenario : BasicScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresDataScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresDataScenario.cs index 3c0742b0b..718b99239 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresDataScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresDataScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] + [Collection(PostgresCollection.Name)] public class PostgresDataScenario : DataIOScenario - { + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresDataScenario : DataIOScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresDelayScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresDelayScenario.cs index 649632ac5..3b8a5814b 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresDelayScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresDelayScenario.cs @@ -5,9 +5,9 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] + [Collection(PostgresCollection.Name)] public class PostgresDelayScenario : DelayScenario - { + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(cfg => @@ -17,4 +17,17 @@ protected override void ConfigureServices(IServiceCollection services) }); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresDelayScenario : DelayScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(cfg => + { + cfg.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true); + cfg.UsePollInterval(TimeSpan.FromSeconds(2)); + }); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresDynamicDataScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresDynamicDataScenario.cs index f654ca16b..d513e3b41 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresDynamicDataScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresDynamicDataScenario.cs @@ -5,7 +5,7 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] + [Collection(PostgresCollection.Name)] public class PostgresDynamicDataScenario : DynamicDataIOScenario { protected override void ConfigureServices(IServiceCollection services) @@ -13,4 +13,13 @@ protected override void ConfigureServices(IServiceCollection services) services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresDynamicDataScenario : DynamicDataIOScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresEventScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresEventScenario.cs index ec9d520cb..aad6e3385 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresEventScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresEventScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] + [Collection(PostgresCollection.Name)] public class PostgresEventScenario : EventScenario - { + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresEventScenario : EventScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresForeachScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresForeachScenario.cs index a0c5e03f4..cd92168a0 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresForeachScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresForeachScenario.cs @@ -5,7 +5,7 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] + [Collection(PostgresCollection.Name)] public class PostgresForeachScenario : ForeachScenario { protected override void ConfigureServices(IServiceCollection services) @@ -13,4 +13,13 @@ protected override void ConfigureServices(IServiceCollection services) services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresForeachScenario : ForeachScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresForkScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresForkScenario.cs index 4ad8fe86a..49e096349 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresForkScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresForkScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] - public class PostgresForkScenario : ForkScenario - { + [Collection(PostgresCollection.Name)] + public class PostgresForkScenario : ForkScenario + { protected override void Configure(IServiceCollection services) { services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresForkScenario : ForkScenario + { + protected override void Configure(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresIfScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresIfScenario.cs index f962dd70d..d381dadfc 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresIfScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresIfScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] - public class PostgresIfScenario : IfScenario - { + [Collection(PostgresCollection.Name)] + public class PostgresIfScenario : IfScenario + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresIfScenario : IfScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresRetrySagaScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresRetrySagaScenario.cs index 0c63d54ff..74f221e25 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresRetrySagaScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresRetrySagaScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] + [Collection(PostgresCollection.Name)] public class PostgresRetrySagaScenario : RetrySagaScenario - { + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresRetrySagaScenario : RetrySagaScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresSagaScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresSagaScenario.cs index 2d42dcd10..ad1f7de75 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresSagaScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresSagaScenario.cs @@ -5,7 +5,7 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] + [Collection(PostgresCollection.Name)] public class PostgresSagaScenario : SagaScenario { protected override void ConfigureServices(IServiceCollection services) @@ -13,4 +13,13 @@ protected override void ConfigureServices(IServiceCollection services) services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresSagaScenario : SagaScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresUserScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresUserScenario.cs index 5c371bb93..ba2b077bb 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresUserScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresUserScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] - public class PostgresUserScenario : UserScenario - { + [Collection(PostgresCollection.Name)] + public class PostgresUserScenario : UserScenario + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresUserScenario : UserScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresWhenScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresWhenScenario.cs index 52445096a..56a0e211f 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresWhenScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresWhenScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] - public class PostgresWhenScenario : WhenScenario - { + [Collection(PostgresCollection.Name)] + public class PostgresWhenScenario : WhenScenario + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresWhenScenario : WhenScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresWhileScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresWhileScenario.cs index 9aaa2583c..d4d4bca45 100644 --- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresWhileScenario.cs +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresWhileScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.PostgreSQL.Scenarios { - [Collection("Postgres collection")] - public class PostgresWhileScenario : WhileScenario - { + [Collection(PostgresCollection.Name)] + public class PostgresWhileScenario : WhileScenario + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(PostgresCollection.Name)] + public class OptimizedPostgresWhileScenario : WhileScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.Redis/Scenarios/RedisIfScenario.cs b/test/WorkflowCore.Tests.Redis/Scenarios/RedisIfScenario.cs index 744e2307f..99aa970d7 100644 --- a/test/WorkflowCore.Tests.Redis/Scenarios/RedisIfScenario.cs +++ b/test/WorkflowCore.Tests.Redis/Scenarios/RedisIfScenario.cs @@ -6,7 +6,7 @@ namespace WorkflowCore.Tests.Redis.Scenarios { [Collection("Redis collection")] - public class RedisIfScenario : IfScenario + public class RedisIfScenario : IfScenario { protected override void ConfigureServices(IServiceCollection services) { diff --git a/test/WorkflowCore.Tests.Redis/Scenarios/RedisWhileScenario.cs b/test/WorkflowCore.Tests.Redis/Scenarios/RedisWhileScenario.cs index 06d422ac8..24e939ea3 100644 --- a/test/WorkflowCore.Tests.Redis/Scenarios/RedisWhileScenario.cs +++ b/test/WorkflowCore.Tests.Redis/Scenarios/RedisWhileScenario.cs @@ -6,8 +6,8 @@ namespace WorkflowCore.Tests.Redis.Scenarios { [Collection("Redis collection")] - public class RedisWhileScenario : WhileScenario - { + public class RedisWhileScenario : WhileScenario + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseRedisPersistence(RedisDockerSetup.ConnectionString, "scenario-")); diff --git a/test/WorkflowCore.Tests.SqlServer/DockerSetup.cs b/test/WorkflowCore.Tests.SqlServer/DockerSetup.cs index cf50f854d..34244447f 100644 --- a/test/WorkflowCore.Tests.SqlServer/DockerSetup.cs +++ b/test/WorkflowCore.Tests.SqlServer/DockerSetup.cs @@ -29,8 +29,9 @@ public Task DisposeAsync() } } - [CollectionDefinition("SqlServer collection")] - public class SqlServerCollection : ICollectionFixture + [CollectionDefinition(Name)] + public sealed class SqlServerCollection : ICollectionFixture { + public const string Name = "SqlServer collection"; } } \ No newline at end of file diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerActivityScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerActivityScenario.cs index 2094cdf66..d742d5f54 100644 --- a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerActivityScenario.cs +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerActivityScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.SqlServer.Scenarios { - [Collection("SqlServer collection")] + [Collection(SqlServerCollection.Name)] public class SqlServerActivityScenario : ActivityScenario - { + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerActivityScenario : ActivityScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerBasicScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerBasicScenario.cs index 56c951884..61d33f4be 100644 --- a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerBasicScenario.cs +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerBasicScenario.cs @@ -5,7 +5,7 @@ namespace WorkflowCore.Tests.SqlServer.Scenarios { - [Collection("SqlServer collection")] + [Collection(SqlServerCollection.Name)] public class SqlServerBasicScenario : BasicScenario { protected override void ConfigureServices(IServiceCollection services) @@ -13,4 +13,13 @@ protected override void ConfigureServices(IServiceCollection services) services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerBasicScenario : BasicScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerCompensationScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerCompensationScenario.cs new file mode 100644 index 000000000..025fa57c2 --- /dev/null +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerCompensationScenario.cs @@ -0,0 +1,25 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using WorkflowCore.IntegrationTests.Scenarios; +using Xunit; + +namespace WorkflowCore.Tests.SqlServer.Scenarios +{ + [Collection(SqlServerCollection.Name)] + public class SqlServerCompensationScenario : CompensationScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); + } + } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerCompensationScenario : CompensationScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true)); + } + } +} diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerDataScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerDataScenario.cs index 0ecabc61f..5c20cc013 100644 --- a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerDataScenario.cs +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerDataScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.SqlServer.Scenarios { - [Collection("SqlServer collection")] + [Collection(SqlServerCollection.Name)] public class SqlServerDataScenario : DataIOScenario - { + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerDataScenario : DataIOScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerDelayScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerDelayScenario.cs index 5e623c1db..454c6edd5 100644 --- a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerDelayScenario.cs +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerDelayScenario.cs @@ -5,9 +5,9 @@ namespace WorkflowCore.Tests.SqlServer.Scenarios { - [Collection("SqlServer collection")] + [Collection(SqlServerCollection.Name)] public class SqlServerDelayScenario : DelayScenario - { + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(cfg => @@ -17,4 +17,17 @@ protected override void ConfigureServices(IServiceCollection services) }); } } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerDelayScenario : DelayScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(cfg => + { + cfg.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true); + cfg.UsePollInterval(TimeSpan.FromSeconds(2)); + }); + } + } } diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerDynamicDataScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerDynamicDataScenario.cs index 34cb86215..fbcb74772 100644 --- a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerDynamicDataScenario.cs +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerDynamicDataScenario.cs @@ -5,7 +5,7 @@ namespace WorkflowCore.Tests.SqlServer.Scenarios { - [Collection("SqlServer collection")] + [Collection(SqlServerCollection.Name)] public class SqlServerDynamicDataScenario : DynamicDataIOScenario { protected override void ConfigureServices(IServiceCollection services) @@ -13,4 +13,13 @@ protected override void ConfigureServices(IServiceCollection services) services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerDynamicDataScenario : DynamicDataIOScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerEventScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerEventScenario.cs index fce8a9bae..030effadf 100644 --- a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerEventScenario.cs +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerEventScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.SqlServer.Scenarios { - [Collection("SqlServer collection")] + [Collection(SqlServerCollection.Name)] public class SqlServerEventScenario : EventScenario - { + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerEventScenario : EventScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerForEachScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerForEachScenario.cs index b4df418d2..4d14e5c18 100644 --- a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerForEachScenario.cs +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerForEachScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.SqlServer.Scenarios { - [Collection("SqlServer collection")] + [Collection(SqlServerCollection.Name)] public class SqlServerForEachScenario : ForeachScenario - { + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerForEachScenario : ForeachScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerIfScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerIfScenario.cs index 798863285..7c97d74f3 100644 --- a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerIfScenario.cs +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerIfScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.SqlServer.Scenarios { - [Collection("SqlServer collection")] - public class SqlServerIfScenario : IfScenario - { + [Collection(SqlServerCollection.Name)] + public class SqlServerIfScenario : IfScenario + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerIfScenario : IfScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerRetrySagaScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerRetrySagaScenario.cs index fd00b2d20..faf9969da 100644 --- a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerRetrySagaScenario.cs +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerRetrySagaScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.SqlServer.Scenarios { - [Collection("SqlServer collection")] + [Collection(SqlServerCollection.Name)] public class SqlServerRetrySagaScenario : RetrySagaScenario - { + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerRetrySagaScenario : RetrySagaScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerSagaScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerSagaScenario.cs index b8e13f0c4..cdfb6c4e2 100644 --- a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerSagaScenario.cs +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerSagaScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.SqlServer.Scenarios { - [Collection("SqlServer collection")] + [Collection(SqlServerCollection.Name)] public class SqlServerSagaScenario : SagaScenario - { + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerSagaScenario : SagaScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerWhenScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerWhenScenario.cs index 77da4ee10..ae8f11677 100644 --- a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerWhenScenario.cs +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerWhenScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.SqlServer.Scenarios { - [Collection("SqlServer collection")] - public class SqlServerWhenScenario : WhenScenario - { + [Collection(SqlServerCollection.Name)] + public class SqlServerWhenScenario : WhenScenario + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerWhenScenario : WhenScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerWhileScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerWhileScenario.cs index 832579484..b93761326 100644 --- a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerWhileScenario.cs +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerWhileScenario.cs @@ -5,12 +5,21 @@ namespace WorkflowCore.Tests.SqlServer.Scenarios { - [Collection("SqlServer collection")] - public class SqlServerWhileScenario : WhileScenario - { + [Collection(SqlServerCollection.Name)] + public class SqlServerWhileScenario : WhileScenario + { protected override void ConfigureServices(IServiceCollection services) { services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); } } + + [Collection(SqlServerCollection.Name)] + public class OptimizedSqlServerWhileScenario : WhileScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true, true)); + } + } } diff --git a/test/WorkflowCore.Tests.SqlServer/SqlServerOptimizedPersistenceProviderFixture.cs b/test/WorkflowCore.Tests.SqlServer/SqlServerOptimizedPersistenceProviderFixture.cs new file mode 100644 index 000000000..12558eff4 --- /dev/null +++ b/test/WorkflowCore.Tests.SqlServer/SqlServerOptimizedPersistenceProviderFixture.cs @@ -0,0 +1,31 @@ +using System; +using System.Linq; +using WorkflowCore.Interface; +using WorkflowCore.Persistence.EntityFramework.Services; +using WorkflowCore.Persistence.SqlServer; +using WorkflowCore.UnitTests; +using Xunit; + +namespace WorkflowCore.Tests.SqlServer +{ + [Collection(SqlServerCollection.Name)] + public class SqlServerOptimizedPersistenceProviderFixture : BasePersistenceFixture + { + private readonly string _connectionString; + + public SqlServerOptimizedPersistenceProviderFixture(SqlDockerSetup setup) + { + _connectionString = SqlDockerSetup.ConnectionString; + } + + protected override IPersistenceProvider Subject + { + get + { + var db = new LargeDataOptimizedEntityFrameworkPersistenceProvider(new SqlContextFactory(_connectionString), true, true); + db.EnsureStoreExists(); + return db; + } + } + } +} \ No newline at end of file diff --git a/test/WorkflowCore.Tests.SqlServer/SqlServerPersistenceProviderFixture.cs b/test/WorkflowCore.Tests.SqlServer/SqlServerPersistenceProviderFixture.cs index cbd019bb9..838b01cc7 100644 --- a/test/WorkflowCore.Tests.SqlServer/SqlServerPersistenceProviderFixture.cs +++ b/test/WorkflowCore.Tests.SqlServer/SqlServerPersistenceProviderFixture.cs @@ -6,7 +6,7 @@ namespace WorkflowCore.Tests.SqlServer { - [Collection("SqlServer collection")] + [Collection(SqlServerCollection.Name)] public class SqlServerPersistenceProviderFixture : BasePersistenceFixture { private readonly string _connectionString; diff --git a/test/WorkflowCore.UnitTests/BasePersistenceFixture.cs b/test/WorkflowCore.UnitTests/BasePersistenceFixture.cs index 9114da7b9..5f6414245 100644 --- a/test/WorkflowCore.UnitTests/BasePersistenceFixture.cs +++ b/test/WorkflowCore.UnitTests/BasePersistenceFixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using FluentAssertions; using WorkflowCore.Interface; @@ -185,8 +186,8 @@ public void PersistWorkflow() var current = Subject.GetWorkflowInstance(workflowId).Result; current.ShouldBeEquivalentTo(newWorkflow); } - - [Fact] + + [Fact] public void PersistWorkflow_with_subscriptions() { var workflow = new WorkflowInstance @@ -293,6 +294,43 @@ public void ConcurrentPersistWorkflow() action.ShouldNotThrow(); }); } + + [RunnableInDebugOnly] + public void CreateNewWorkflow_should_get_workflow_with_large_data() + { + var pointerCount = 2_500; + var data = Enumerable.Range(0, 20_000).Select(value => new TestData { Value1 = value }).ToArray(); + var maxDuration = TimeSpan.FromMinutes(1); + + var workflow = new WorkflowInstance + { + Data = data, + Description = "My Description", + Status = WorkflowStatus.Runnable, + NextExecution = 0, + Version = 1, + WorkflowDefinitionId = "My Workflow" + }; + + for (var i = 0; i < pointerCount; i++) + { + workflow.ExecutionPointers.Add(new ExecutionPointer + { + Id = Guid.NewGuid().ToString(), + Active = true, + StepId = i + }); + } + + var workflowId = Subject.CreateNewWorkflow(workflow).Result; + + var cts = new CancellationTokenSource(); + cts.CancelAfter(maxDuration); + var exception = Record.Exception(() => _ = Subject.GetWorkflowInstance(workflowId, cts.Token).Result); + + workflowId.Should().NotBeNull(); + exception.Should().BeNull(); + } } public class TestData diff --git a/test/WorkflowCore.UnitTests/RunnableInDebugOnlyAttribute.cs b/test/WorkflowCore.UnitTests/RunnableInDebugOnlyAttribute.cs new file mode 100644 index 000000000..ad1b6b04a --- /dev/null +++ b/test/WorkflowCore.UnitTests/RunnableInDebugOnlyAttribute.cs @@ -0,0 +1,16 @@ +using System.Diagnostics; +using Xunit; + +namespace WorkflowCore.UnitTests +{ + public sealed class RunnableInDebugOnlyAttribute : FactAttribute + { + public RunnableInDebugOnlyAttribute() + { + if (!Debugger.IsAttached) + { + Skip = "Only running in interactive mode."; + } + } + } +} \ No newline at end of file