2012-09-04 29 views
2

我有一個指標:索引不能與Raven DB一起工作,如何調試?

public class FreeSearchIndex : 
    AbstractIndexCreationTask<Post, FreeSearchIndex.Result> 
{ 
    public FreeSearchIndex() 
    { 
     Map = posts => from post in posts 
         select new 
          { 
           Query = post.Tags.Concat(new[] 
             { 
              post.Title, 
              post.Body 
             }), 
           DatePosted = post.Date 
          }; 

     Index(x => x.Query, FieldIndexing.Analyzed);    
    } 

    public class Result 
    { 
     public object[] Query { get; set; } 
     public DateTime DatePosted { get; set; } 
    } 
} 

,並有方法:

public List<Post> Filter(string freeSearch) 
{ 
    IQueryable<Post> posts; 
    var posts = documentSession 
      .Query<FreeSearchIndex.Result, FreeSearchIndex>() 
      .Where(x => x.Query == (object)freeSearch) 
      .OrderByDescending(x => x.DatePosted) 
      .As<Post>();         

    return posts.ToList(); 
} 

,並有單元測試:

[SetUp] 
public void Setup() 
{ 
    store = new EmbeddableDocumentStore 
       { 
        RunInMemory = true 
       }; 

    store.Initialize(); 

    session = store.OpenSession(); 

    IndexCreation.CreateIndexes(typeof(FreeSearchIndex).Assembly, store); 
} 

[Test] 
public void GivenFreeSearchPhrase_Filter_ShouldOutputFilteredPostsByGivenPhrase() 
{    
    session.Store(new Post { Body = "universal answer to everything is 42" }); 
    session.SaveChanges(); 

    var posts = Filter("everything"); 

    Assert.AreEqual(1, posts.Count);    
} 

而失敗,因爲查詢返回0帖子。我如何解決這個問題?我應該檢查生成的查詢,是否有可能檢查它是如何索引商店(這是在內存中)字段?

+0

嗯,但我不想WaitForStale在生產中,有沒有什麼辦法告訴會話,其中的所有查詢應該等待陳舊,我可以設置,只爲單元測試會議?我可以檢查調試器是否陳舊嗎? – Giedrius

+0

@oleksii - 偉大的,聽衆幫助,所以如果你願意,將你的評論轉換成答案。 – Giedrius

回答

4

我懷疑索引器沒有時間處理新數據。根據機器負載,CPU和內存性能的不同,您可能會不時傳遞此測試。據我所知,你需要在單元測試中使用某種WaitForStale解決方案。

我在GitHub上

public abstract class RavenDbFactBase : IDisposable 
{   
    public class NoStaleQueriesListener : IDocumentQueryListener 
    { 
     public void BeforeQueryExecuted(IDocumentQueryCustomization c) 
     { 
      c.WaitForNonStaleResults(); 
     }   
    }   
} 

在生產中得到這個從RavenOverflow應用程序,雖然,你不使用它,只是把陳舊的數據快。