Example #1
0
        public async Task GetRevisionsBinEntries(bool useSession)
        {
            using (var store = GetDocumentStore())
            {
                await RevisionsHelper.SetupRevisions(Server.ServerStore, store.Database, modifyConfiguration : configuration => configuration.Collections["Users"].PurgeOnDelete = false);

                var deletedRevisions = await store.Commands().GetRevisionsBinEntriesAsync(long.MaxValue);

                Assert.Equal(0, deletedRevisions.Count());

                var id = "users/1";
                if (useSession)
                {
                    var user = new User {
                        Name = "Fitzchak"
                    };
                    for (var i = 0; i < 2; i++)
                    {
                        using (var session = store.OpenAsyncSession())
                        {
                            await session.StoreAsync(user);

                            await session.SaveChangesAsync();
                        }
                        using (var session = store.OpenAsyncSession())
                        {
                            session.Delete(user.Id);
                            await session.SaveChangesAsync();
                        }
                    }
                    id += "-A";
                }
                else
                {
                    await store.Commands().PutAsync(id, null, new User {
                        Name = "Fitzchak"
                    });

                    await store.Commands().DeleteAsync(id, null);

                    await store.Commands().PutAsync(id, null, new User {
                        Name = "Fitzchak"
                    });

                    await store.Commands().DeleteAsync(id, null);
                }

                var statistics = store.Maintenance.Send(new GetStatisticsOperation());
                Assert.Equal(useSession ? 1 : 0, statistics.CountOfDocuments);
                Assert.Equal(4, statistics.CountOfRevisionDocuments);

                deletedRevisions = await store.Commands().GetRevisionsBinEntriesAsync(long.MaxValue);

                Assert.Equal(1, deletedRevisions.Count());

                using (var session = store.OpenAsyncSession())
                {
                    var users = await session.Advanced.Revisions.GetForAsync <User>(id);

                    Assert.Equal(4, users.Count);
                    Assert.Equal(null, users[0].Name);
                    Assert.Equal("Fitzchak", users[1].Name);
                    Assert.Equal(null, users[2].Name);
                    Assert.Equal("Fitzchak", users[3].Name);

                    // Can get metadata only
                    var revisionsMetadata = await session.Advanced.Revisions.GetMetadataForAsync(id);

                    Assert.Equal(4, revisionsMetadata.Count);
                    Assert.Contains(DocumentFlags.DeleteRevision.ToString(), revisionsMetadata[0].GetString(Constants.Documents.Metadata.Flags));
                    Assert.Equal((DocumentFlags.HasRevisions | DocumentFlags.Revision).ToString(), revisionsMetadata[1].GetString(Constants.Documents.Metadata.Flags));
                    Assert.Contains(DocumentFlags.DeleteRevision.ToString(), revisionsMetadata[2].GetString(Constants.Documents.Metadata.Flags));
                    Assert.Equal((DocumentFlags.HasRevisions | DocumentFlags.Revision).ToString(), revisionsMetadata[3].GetString(Constants.Documents.Metadata.Flags));
                }

                await store.Maintenance.SendAsync(new DeleteRevisionsOperation(new AdminRevisionsHandler.Parameters
                {
                    DocumentIds = new[] { id, "users/not/exists" }
                }));

                statistics = store.Maintenance.Send(new GetStatisticsOperation());
                Assert.Equal(useSession ? 1 : 0, statistics.CountOfDocuments);
                Assert.Equal(0, statistics.CountOfRevisionDocuments);
            }
        }
Example #2
0
        public async Task CanGetCountersSnapshotInRevisions()
        {
            using (var store = GetDocumentStore())
            {
                await RevisionsHelper.SetupRevisions(Server.ServerStore, store.Database);

                using (var session = store.OpenAsyncSession())
                {
                    // revision 1
                    await session.StoreAsync(new Company(), "companies/1-A");

                    await session.SaveChangesAsync();
                }

                using (var session = store.OpenAsyncSession())
                {
                    var company = await session.LoadAsync <Company>("companies/1-A");

                    // revision 2
                    company.Name = "HR";
                    await session.SaveChangesAsync();

                    // revision 3
                    session.CountersFor(company).Increment("Likes", 100);
                    await session.SaveChangesAsync();

                    // no revision for this one
                    session.CountersFor(company).Increment("Likes", 50);
                    await session.SaveChangesAsync();
                }

                using (var session = store.OpenAsyncSession())
                {
                    var companiesRevisions = await session.Advanced.Revisions.GetForAsync <Company>("companies/1-A");

                    Assert.Equal(3, companiesRevisions.Count);
                    var metadatas = companiesRevisions.Select(c => session.Advanced.GetMetadataFor(c)).ToList();

                    Assert.Equal("HR", companiesRevisions[0].Name);

                    var revisionCounters = (IMetadataDictionary)metadatas[0][Constants.Documents.Metadata.RevisionCounters];
                    Assert.Equal(1, revisionCounters.Count);
                    Assert.Equal(100L, revisionCounters["Likes"]);

                    Assert.Equal("HR", companiesRevisions[1].Name);
                    Assert.False(metadatas[1].TryGetValue(Constants.Documents.Metadata.RevisionCounters, out _));

                    Assert.Null(companiesRevisions[2].Name);
                    Assert.False(metadatas[1].TryGetValue(Constants.Documents.Metadata.RevisionCounters, out _));
                }

                using (var session = store.OpenAsyncSession())
                {
                    var company = await session.LoadAsync <Company>("companies/1-A");

                    // revision 4
                    company.Name = "Hibernating Rhinos";
                    await session.SaveChangesAsync();

                    // revision 5
                    session.CountersFor(company).Increment("Dislikes", 20);
                    await session.SaveChangesAsync();
                }

                using (var session = store.OpenAsyncSession())
                {
                    var companiesRevisions = await session.Advanced.Revisions.GetForAsync <Company>("companies/1-A");

                    Assert.Equal(5, companiesRevisions.Count);
                    var metadatas = companiesRevisions.Select(c => session.Advanced.GetMetadataFor(c)).ToList();

                    Assert.Equal("Hibernating Rhinos", companiesRevisions[0].Name);
                    var revisionCounters = (IMetadataDictionary)metadatas[0][Constants.Documents.Metadata.RevisionCounters];
                    Assert.Equal(2, revisionCounters.Count);
                    Assert.Equal(150L, revisionCounters["Likes"]);
                    Assert.Equal(20L, revisionCounters["Dislikes"]);

                    Assert.Equal("Hibernating Rhinos", companiesRevisions[1].Name);
                    revisionCounters = (IMetadataDictionary)metadatas[1][Constants.Documents.Metadata.RevisionCounters];
                    Assert.Equal(1, revisionCounters.Count);
                    Assert.Equal(150L, revisionCounters["Likes"]);

                    Assert.Equal("HR", companiesRevisions[2].Name);
                    revisionCounters = (IMetadataDictionary)metadatas[2][Constants.Documents.Metadata.RevisionCounters];
                    Assert.Equal(1, revisionCounters.Count);
                    Assert.Equal(100L, revisionCounters["Likes"]);

                    Assert.Equal("HR", companiesRevisions[3].Name);
                    Assert.False(metadatas[3].TryGetValue(Constants.Documents.Metadata.RevisionCounters, out _));

                    Assert.Null(companiesRevisions[4].Name);
                    Assert.False(metadatas[4].TryGetValue(Constants.Documents.Metadata.RevisionCounters, out _));
                }
            }
        }
Example #3
0
        public async Task CanLimitNumberOfRevisionsByAge()
        {
            var revisionsAgeLimit = TimeSpan.FromSeconds(10);

            using (var store = GetDocumentStore())
            {
                var configuration = new RevisionsConfiguration
                {
                    Collections = new Dictionary <string, RevisionsCollectionConfiguration>
                    {
                        ["Users"] = new RevisionsCollectionConfiguration
                        {
                            Disabled = false,
                            MinimumRevisionAgeToKeep = revisionsAgeLimit
                        }
                    }
                };
                var index = await RevisionsHelper.SetupRevisions(Server.ServerStore, store.Database, configuration);

                var documentDatabase = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.Database);

                await documentDatabase.RachisLogIndexNotifications.WaitForIndexNotification(index, Server.ServerStore.Engine.OperationTimeout);

                using (var session = store.OpenAsyncSession())
                {
                    // revision 1
                    await session.StoreAsync(new User
                    {
                        Name = "Aviv"
                    }, "users/1-A");

                    await session.SaveChangesAsync();
                }

                using (var session = store.OpenAsyncSession())
                {
                    var user = await session.LoadAsync <User>("users/1-A");

                    // revision 2
                    user.Name = "Aviv2";

                    await session.SaveChangesAsync();
                }

                using (var session = store.OpenAsyncSession())
                {
                    var userRevisions = await session.Advanced.Revisions.GetForAsync <User>("users/1-A");

                    Assert.Equal(2, userRevisions.Count);
                    Assert.Equal("Aviv2", userRevisions[0].Name);
                    Assert.Equal("Aviv", userRevisions[1].Name);
                }

                await Task.Delay(revisionsAgeLimit);

                using (var session = store.OpenAsyncSession())
                {
                    var user = await session.LoadAsync <User>("users/1-A");

                    // revision 3
                    user.Name = "Aviv3";

                    // revisions age limit has passed
                    // should delete the old revisions now
                    // and keep just this one

                    await session.SaveChangesAsync();
                }

                using (var session = store.OpenAsyncSession())
                {
                    var userRevisions = await session.Advanced.Revisions.GetForAsync <User>("users/1-A");

                    Assert.Equal(1, userRevisions.Count);
                    Assert.Equal("Aviv3", userRevisions[0].Name);
                }
            }
        }
Example #4
0
        public async Task WillDeleteRevisionsIfDeleted_OnlyIfPurgeOnDeleteIsTrue()
        {
            using (var store = GetDocumentStore())
            {
                await RevisionsHelper.SetupRevisions(Server.ServerStore, store.Database);

                using (var session = store.OpenAsyncSession())
                {
                    var company = new Company {
                        Name = "Hibernating Rhinos "
                    };
                    var user = new User {
                        Name = "Fitzchak "
                    };
                    await session.StoreAsync(company, "companies/1");

                    await session.StoreAsync(user, "users/1");

                    await session.SaveChangesAsync();
                }
                for (int i = 0; i < 10; i++)
                {
                    using (var session = store.OpenAsyncSession())
                    {
                        var company = await session.LoadAsync <Company>("companies/1");

                        var user = await session.LoadAsync <User>("users/1");

                        company.Name += i;
                        user.Name    += i;
                        await session.StoreAsync(company);

                        await session.StoreAsync(user);

                        await session.SaveChangesAsync();
                    }
                }

                using (var session = store.OpenAsyncSession())
                {
                    var company = await session.LoadAsync <Company>("companies/1");

                    var user = await session.LoadAsync <User>("users/1");

                    Assert.NotNull(company);
                    Assert.NotNull(user);
                    session.Delete(company);
                    session.Delete(user);
                    await session.SaveChangesAsync();
                }
                using (var session = store.OpenAsyncSession())
                {
                    var companies = await session.Advanced.Revisions.GetForAsync <Company>("companies/1");

                    var users = await session.Advanced.Revisions.GetForAsync <User>("users/1");

                    Assert.Equal(5, companies.Count);
                    Assert.Empty(users);
                }

                using (var session = store.OpenAsyncSession())
                {
                    await session.StoreAsync(new Company { Name = "New Company" }, "companies/1");

                    await session.StoreAsync(new User { Name = "New User" }, "users/1");

                    await session.SaveChangesAsync();
                }
                using (var session = store.OpenAsyncSession())
                {
                    var companies = await session.Advanced.Revisions.GetForAsync <Company>("companies/1");

                    var users = await session.Advanced.Revisions.GetForAsync <User>("users/1");

                    Assert.Equal(5, companies.Count);
                    Assert.Equal("New Company", companies.First().Name);
                    Assert.Equal(1, users.Count);
                }
            }
        }