public async Task SetUp() { var truncateTableCmd = "truncate \"unit_tests\".\"entity_with_composite_pk\";"; await using var connection = new NpgsqlConnection(_configuration.ConnectionString); await using var command = new NpgsqlCommand(truncateTableCmd, connection); await connection.OpenAsync(); await command.ExecuteNonQueryAsync(); var bulkServiceOptions = new BulkServiceOptions(); _entityProfile = new EntityWithCompositePkProfile(); bulkServiceOptions.AddEntityProfile <TestEntityWithCompositePk>(_entityProfile); var insertCommandBuilder = new InsertSqlCommandBuilder(NullLoggerFactory.Instance); var updateCommandBuilder = new Mock <IUpdateSqlCommandBuilder>().Object; var deleteCommandBuilder = new WhereOrDeleteSqlCommandBuilder(NullLogger <WhereOrDeleteSqlCommandBuilder> .Instance); var upsertCommandBuilder = new Mock <IUpsertSqlCommandBuilder>().Object; _testService = new NpgsqlCommandsBulkService( bulkServiceOptions, NullLoggerFactory.Instance, insertCommandBuilder, updateCommandBuilder, deleteCommandBuilder, upsertCommandBuilder); }
public async Task SetUp() { var truncateTableCmd = "truncate \"unit_tests\".\"bulk_test_entity\";"; var resetIdSequenceCmd = "ALTER SEQUENCE \"unit_tests\".\"bulk_test_entity_id_seq\" RESTART WITH 1;"; await using var connection = new NpgsqlConnection(_configuration.ConnectionString); await using var command = new NpgsqlCommand($"{truncateTableCmd}{resetIdSequenceCmd}", connection); await connection.OpenAsync(); await command.ExecuteNonQueryAsync(); _bulkServiceOptions = new BulkServiceOptions(); _bulkServiceOptions.AddEntityProfile <TestEntity>(new BulkEntityProfile()); var insertCommandBuilder = new InsertSqlCommandBuilder(NullLoggerFactory.Instance); var deleteCommandBuilder = new Mock <IDeleteSqlCommandBuilder>().Object; var updateCommandBuilder = new UpdateSqlCommandBuilder(NullLoggerFactory.Instance); var upsertCommandBuilder = new UpsertSqlCommandBuilder(NullLoggerFactory.Instance); _testService = new NpgsqlCommandsBulkService( _bulkServiceOptions, NullLoggerFactory.Instance, insertCommandBuilder, updateCommandBuilder, deleteCommandBuilder, upsertCommandBuilder); }
public async Task SetUp() { _entityProfile = new UpsertEntityProfile(1); var truncateTableCmd = $"truncate {_entityProfile.TableName};"; var resetIdSequenceCmd = "ALTER SEQUENCE \"unit_tests\".\"entity_with_unique_columns_id_seq\" RESTART WITH 1;"; using (var connection = new NpgsqlConnection(_configuration.ConnectionString)) using (var command = new NpgsqlCommand($"{truncateTableCmd}{resetIdSequenceCmd}", connection)) { await connection.OpenAsync(); await command.ExecuteNonQueryAsync(); } var bulkServiceOptions = new BulkServiceOptions { FailureStrategy = FailureStrategies.StopEverything }; bulkServiceOptions.AddEntityProfile <TestEntity>(_entityProfile); var insertCommandBuilder = new InsertSqlCommandBuilder(NullLoggerFactory.Instance); var deleteCommandBuilder = new SimpleDeleteSqlCommandBuilder(NullLoggerFactory.Instance); var updateCommandBuilder = new UpdateSqlCommandBuilder(NullLoggerFactory.Instance); var upsertCommandBuilder = new UpsertSqlCommandBuilder(NullLoggerFactory.Instance); _testService = new NpgsqlCommandsBulkService( bulkServiceOptions, NullLoggerFactory.Instance, insertCommandBuilder, updateCommandBuilder, deleteCommandBuilder, upsertCommandBuilder); }
public void Insert_should_execute_with_more_than_65K_params() { var bulkServiceOptions = new BulkServiceOptions(); bulkServiceOptions.AddEntityProfile <TestEntity>(new SimpleEntityProfile()); var insertCommandBuilder = new InsertSqlCommandBuilder(NullLoggerFactory.Instance); var deleteCommandBuilder = new Mock <IDeleteSqlCommandBuilder>().Object; var updateCommandBuilder = new Mock <IUpdateSqlCommandBuilder>().Object; var upsertCommandBuilder = new UpsertSqlCommandBuilder(NullLoggerFactory.Instance); var testService = new NpgsqlCommandsBulkService( bulkServiceOptions, NullLoggerFactory.Instance, insertCommandBuilder, updateCommandBuilder, deleteCommandBuilder, upsertCommandBuilder); var elements = new List <TestEntity>(70_000); for (var i = 0; i < 70_000; i++) { elements.Add(new TestEntity { RecordId = $"rec-{i}", SensorId = $"sens-{i}", Value = i }); } Assert.DoesNotThrowAsync(async() => { await using var connection = new NpgsqlConnection(_configuration.ConnectionString); await testService.InsertAsync(connection, elements, CancellationToken.None); }); }
public async Task SetUp() { var truncateTableCmd = "truncate \"unit_tests\".\"after_update_tests\";"; var resetIdSequenceCmd = "alter sequence \"unit_tests\".\"after_update_tests_id_seq\" restart with 1;"; await using var connection = new NpgsqlConnection(_configuration.ConnectionString); await using var command = new NpgsqlCommand($"{truncateTableCmd}{resetIdSequenceCmd}", connection); await connection.OpenAsync(); await command.ExecuteNonQueryAsync(); var bulkServiceOptions = new BulkServiceOptions(); bulkServiceOptions.AddEntityProfile <AfterUpdateEntity>(new AfterUpdateEntityProfile()); var insertCommandBuilder = new InsertSqlCommandBuilder(NullLoggerFactory.Instance); var updateCommandBuilder = new UpdateSqlCommandBuilder(NullLoggerFactory.Instance); var deleteCommandBuilder = new Mock <IDeleteSqlCommandBuilder>().Object; var upsertCommandBuilder = new Mock <IUpsertSqlCommandBuilder>().Object; _testService = new NpgsqlCommandsBulkService( bulkServiceOptions, NullLoggerFactory.Instance, insertCommandBuilder, updateCommandBuilder, deleteCommandBuilder, upsertCommandBuilder); }
public async Task Exception_should_have_only_problem_and_not_operated_elements() { var bulkServiceOptions = new BulkServiceOptions { FailureStrategy = FailureStrategies.StopEverything, IsProblemElementsEnabled = true, IsNotOperatedElementsEnabled = true }; bulkServiceOptions.AddEntityProfile <TestEntity>(_entityProfile); var insertCommandBuilder = new InsertSqlCommandBuilder(NullLoggerFactory.Instance); var deleteCommandBuilder = new SimpleDeleteSqlCommandBuilder(NullLoggerFactory.Instance); var updateCommandBuilder = new UpdateSqlCommandBuilder(NullLoggerFactory.Instance); var upsertCommandBuilder = new UpsertSqlCommandBuilder(NullLoggerFactory.Instance); _testService = new NpgsqlCommandsBulkService( bulkServiceOptions, NullLoggerFactory.Instance, insertCommandBuilder, updateCommandBuilder, deleteCommandBuilder, upsertCommandBuilder); var firstItem = new TestEntity { RecordId = "for conflict purpose", SensorId = "for conflict purpose", Value = 10 }; var elements = new List <TestEntity> { firstItem }; using (var connection = new NpgsqlConnection(_configuration.ConnectionString)) { var result = await _testService.InsertAsync(connection, elements, CancellationToken.None); Assert.Null(result); var secondItem = new TestEntity { RecordId = "rec-0", SensorId = "sens-01", Value = 100 }; elements.Add(secondItem); var ex = Assert.ThrowsAsync <SqlBulkExecutionException <TestEntity> >(() => _testService.InsertAsync(connection, elements, CancellationToken.None)); Assert.IsNull(ex.OperatedElements); Assert.NotNull(ex.NotOperatedElements); Assert.NotNull(ex.ProblemElements); Assert.IsNotEmpty(ex.ProblemElements); Assert.NotNull(ex.ProblemElements.First()); Assert.AreEqual("for conflict purpose", ex.ProblemElements.First().RecordId); Assert.IsNotEmpty(ex.NotOperatedElements); Assert.NotNull(ex.NotOperatedElements.First()); Assert.AreEqual("for conflict purpose", ex.NotOperatedElements.First().RecordId); Assert.NotNull(ex.NotOperatedElements.Skip(1).Take(1).First()); Assert.AreEqual("rec-0", ex.NotOperatedElements.Skip(1).Take(1).First().RecordId); } }
public async Task SimpleDelete_should_delete_elements_with_multiple_pk() { var bulkServiceOptions = new BulkServiceOptions(); var profile = new EntityProfile(typeof(TestEntity)); profile.HasProperty <TestEntity, int>(x => x.Id) .ThatIsPrivateKey() .ThatIsAutoGenerated(); profile.HasProperty <TestEntity, string>(x => x.RecordId) .ThatIsPrivateKey(); profile.HasProperty <TestEntity, int>(x => x.Value); profile.ToTable("simple_test_entity", "unit_tests"); bulkServiceOptions.AddEntityProfile <TestEntity>(profile); var insertCommandBuilder = new InsertSqlCommandBuilder(NullLoggerFactory.Instance); var updateCommandBuilder = new Mock <IUpdateSqlCommandBuilder>().Object; var deleteCommandBuilder = new SimpleDeleteSqlCommandBuilder(NullLoggerFactory.Instance); var upsertCommandBuilder = new Mock <IUpsertSqlCommandBuilder>().Object; _testService = new NpgsqlCommandsBulkService( bulkServiceOptions, NullLoggerFactory.Instance, insertCommandBuilder, updateCommandBuilder, deleteCommandBuilder, upsertCommandBuilder); var elements = new List <TestEntity> { new TestEntity { RecordId = "rec-01", SensorId = "sens-01", Value = 127 }, new TestEntity { RecordId = "rec-02", SensorId = "sens-01", Value = 128 }, new TestEntity { RecordId = "rec-01", SensorId = "sens-02", Value = 227 }, }; await using var connection = new NpgsqlConnection(_configuration.ConnectionString); await _testService.InsertAsync(connection, elements, CancellationToken.None); await _testService.DeleteAsync(connection, elements, CancellationToken.None); var countOfRows = await _testUtils.HowManyRowsWithIdsAsync(_entityProfile, new[] { elements[0].Id, elements[1].Id, elements[2].Id }); Assert.AreEqual(0, countOfRows); }
public async Task Insert_should_rollback_items_that_were_successfully_operated_in_one_portion() { var bulkServiceOptions = new BulkServiceOptions { FailureStrategy = FailureStrategies.IgnoreFailure }; var entityProfile = new UpsertEntityProfile(2); bulkServiceOptions.AddEntityProfile <TestEntity>(entityProfile); var insertCommandBuilder = new InsertSqlCommandBuilder(NullLoggerFactory.Instance); var deleteCommandBuilder = new SimpleDeleteSqlCommandBuilder(NullLoggerFactory.Instance); var updateCommandBuilder = new UpdateSqlCommandBuilder(NullLoggerFactory.Instance); var upsertCommandBuilder = new UpsertSqlCommandBuilder(NullLoggerFactory.Instance); _testService = new NpgsqlCommandsBulkService( bulkServiceOptions, NullLoggerFactory.Instance, insertCommandBuilder, updateCommandBuilder, deleteCommandBuilder, upsertCommandBuilder); var firstItem = new TestEntity { RecordId = "for conflict purpose", SensorId = "for conflict purpose", Value = 10 }; var secondItem = new TestEntity { RecordId = "for conflict purpose", SensorId = "for conflict purpose", Value = 100 }; var elements = new List <TestEntity> { firstItem, secondItem }; using (var connection = new NpgsqlConnection(_configuration.ConnectionString)) { var result = await _testService.InsertAsync(connection, elements, CancellationToken.None); Assert.NotNull(result); Assert.IsNotEmpty(result.NotOperated); Assert.AreEqual(2, result.NotOperated.Count); } var countOfRows = await _testUtils.HowManyRowsInTableAsync(entityProfile); Assert.AreEqual(0, countOfRows); }
public async Task Should_delete_elements_with_multiple_pk() { var bulkServiceOptions = new BulkServiceOptions(); var profile = new EntityProfile(typeof(TestEntity)); profile.HasProperty <TestEntity, int>(x => x.Id) .ThatIsPrivateKey() .ThatIsAutoGenerated(); profile.HasProperty <TestEntity, string>(x => x.RecordId) .ThatIsPrivateKey(); profile.HasProperty <TestEntity, int>(x => x.Value); profile.ToTable("simple_test_entity", "unit_tests"); bulkServiceOptions.AddEntityProfile <TestEntity>(profile); var insertCommandBuilder = new InsertSqlCommandBuilder(NullLoggerFactory.Instance); var updateCommandBuilder = new Mock <IUpdateSqlCommandBuilder>().Object; var deleteCommandBuilder = new WhereInDeleteSqlCommandBuilder(NullLogger <WhereInDeleteSqlCommandBuilder> .Instance); var upsertCommandBuilder = new Mock <IUpsertSqlCommandBuilder>().Object; _testService = new NpgsqlCommandsBulkService( bulkServiceOptions, NullLoggerFactory.Instance, insertCommandBuilder, updateCommandBuilder, deleteCommandBuilder, upsertCommandBuilder); var elements = new List <TestEntity> { new TestEntity { RecordId = "rec-01", SensorId = "sens-01", Value = 127 }, new TestEntity { RecordId = "rec-02", SensorId = "sens-01", Value = 128 }, new TestEntity { RecordId = "rec-01", SensorId = "sens-02", Value = 227 }, }; await using var connection = new NpgsqlConnection(_configuration.ConnectionString); var ex = Assert.ThrowsAsync <SqlBulkExecutionException <TestEntity> >(() => _testService.DeleteAsync(connection, elements, CancellationToken.None)); Assert.IsTrue(ex.InnerException is ArgumentException); }