public async System.Threading.Tasks.Task WithJoinedTableInheritance_BiggerAsync()
        {
            using (ISession session = OpenSession())
                using (var trx = session.BeginTransaction())
                {
                    for (int i = 0; i < 12; i++)
                    {
                        var person = new PersonJI();
                        person.AddAddress(new AddressJI());
                        await(session.SaveAsync(person));

                        // Derived Object with dependent object (address)
                        var specialPerson = new SpecialPersonJI();
                        specialPerson.AddAddress(new AddressJI());
                        await(session.SaveAsync(specialPerson));
                    }

                    Assert.DoesNotThrowAsync(() => { return(trx.CommitAsync()); });
                }

            // 12 Person inserts (2 batches), 12 SpecialPerson inserts (SpecialPerson inserts fragment batches
            // (additional inserts for joined table currently not taken into account by inserts sorting), but first
            // may get collapsed with Person: 11 to 12 batches), 24 Address inserts (may get intervened between
            // Person and SpecialPerson, case not currently optimized: 3 to 4 batches)
            Assert.That(StatsBatcher.BatchSizes.Count, Is.InRange(16, 18), "Unexpected batches count");
            Assert.AreEqual(48, StatsBatcher.BatchSizes.Sum(), "Unexpected batched queries count");
        }
        public async System.Threading.Tasks.Task WithJoinedTableInheritanceAsync()
        {
            using (ISession session = OpenSession())
                using (var trx = session.BeginTransaction())
                {
                    var person = new PersonJI();
                    person.AddAddress(new AddressJI());
                    await(session.SaveAsync(person));

                    // Derived Object with dependent object (address)
                    var specialPerson = new SpecialPersonJI();
                    specialPerson.AddAddress(new AddressJI());
                    await(session.SaveAsync(specialPerson));

                    Assert.DoesNotThrowAsync(() => { return(trx.CommitAsync()); });
                }

            // 1 Person inserts, 1 SpecialPerson insert (may get collapsed with Person: 0 to 1 batches),
            // 2 Address inserts (may get intervened between Person and SpecialPerson, case not currently
            // optimized: 1 to 2 batches for adresses)
            Assert.That(StatsBatcher.BatchSizes.Count, Is.InRange(2, 4), "Unexpected batches count");
            Assert.AreEqual(4, StatsBatcher.BatchSizes.Sum(), "Unexpected batched queries count");
        }