Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RavenDB how to flush?

I am using RavenDb embedded. As a part of my intergration tests I want to check objects are persisted. When I SaveChanges on an object, then retrieve it, it cannot be found unless I dispose my connection.

This does not work for me, as no files are returned

 using (var session = _dataDocumentStore.Instance.OpenSession())
 {
         session.Store(file);
         session.SaveChanges();
 }

....

using (var session = _dataDocumentStore.Instance.OpenSession() )
{
          return session.Query<File>().ToList();
}

I created a Flush method which disposes and recreates a EmbeddableDocumentStore which works, but as this is somthing that feels fundamental I may be going about things the wrong way:

  public static IDocumentStore Initialize()
        {
            instance = new EmbeddableDocumentStore
            {
                DataDirectory = "App_Data/Database",
                UseEmbeddedHttpServer = true,


            };

            instance.Initialize();
            return instance;
        }

        public void Flush()
        {
            instance.Dispose();
            Initialize();

        }

How do you persist in RavenDB and then check it has been persisted? Any advice on this would be great

like image 817
Dan Black Avatar asked Feb 07 '12 17:02

Dan Black


2 Answers

Basically, the EmbeddableDocumentStore takes longer to save and Index that new data, than saving and querying.

So when your tests say:-

  1. Store and SaveChanges.
  2. Load.
  3. Did this load?

The load completes much quicker than the indexing has had time to finish.

So, Like Daniel Lang said, you need to wait for stale results.

But, you'll have to do that for every query you wish to check, in your code. So, let's cheat (legally) :)

Here is how you can tell your document store to ALWAYS wait for stale results, if something queries the store:

// Initialise the Store.
var documentStore = new EmbeddableDocumentStore
                    {
                        RunInMemory = true
                    };
documentStore.Initialize();

// Force query's to wait for index's to catch up. Unit Testing only :P
documentStore.RegisterListener(new NoStaleQueriesListener());

....


#region Nested type: NoStaleQueriesListener

public class NoStaleQueriesListener : IDocumentQueryListener
{
    #region Implementation of IDocumentQueryListener

    public void BeforeQueryExecuted(IDocumentQueryCustomization queryCustomization)
    {
        queryCustomization.WaitForNonStaleResults();
    }

    #endregion
}

#endregion

Now to see this in action, check out RavenOverflow @ Github. And the Tests project in that solution has all the love you might want.

like image 61
Pure.Krome Avatar answered Oct 04 '22 18:10

Pure.Krome


The reason is, that ravens index is too stale to return something here. You need to do this:

session.Query<File>()
    .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
    .ToList();

For further reading, go here: http://ravendb.net/docs/client-api/querying/stale-indexes

like image 40
Daniel Lang Avatar answered Oct 04 '22 18:10

Daniel Lang