Created
May 15, 2012 10:47
-
-
Save carlosagsmendes/2700776 to your computer and use it in GitHub Desktop.
Testing Multimap Index in RavenDB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
using System.Linq; | |
using Raven.Client; | |
using Raven.Client.Embedded; | |
using Raven.Client.Indexes; | |
using Xunit; | |
namespace Raven.Tests.Bugs.Indexing | |
{ | |
public class DiscussionSecurityIndexTest : LocalClientTest | |
{ | |
private readonly EmbeddableDocumentStore _store; | |
public DiscussionSecurityIndexTest() | |
{ | |
_store = NewDocumentStore(); | |
} | |
[Fact] | |
public void Index_Should_Have_10_Discussions() | |
{ | |
var discussions = new List<Discussion>(); | |
//Add 5 private discussions | |
for (int i = 0; i < 5; i++) | |
{ | |
discussions.Add(new Discussion | |
{ | |
Groups = {1, 2, 3}, | |
Networks = {1, 2, 3}, | |
IsPrivate = true, | |
Status = "InDiscussion", | |
Title = "Discusssion Title" + i, | |
SecurityId = string.Format("securitydoc/{0}", i) | |
}); | |
} | |
//Add 5 public discussions | |
for (int i = 5; i < 10; i++) | |
{ | |
discussions.Add(new Discussion | |
{ | |
Groups = { 1, 2, 3 }, | |
Networks = { 1, 2, 3 }, | |
IsPrivate = false, | |
Status = "InDiscussion", | |
Title = "Discusssion Title" + i, | |
SecurityId = string.Format("securitydoc/{0}", i) | |
}); | |
} | |
using (IDocumentSession session = _store.OpenSession()) | |
{ | |
discussions.ForEach(session.Store); | |
session.SaveChanges(); | |
} | |
var securityDocs = new List<SecurityDoc>(); | |
for (int i = 0; i < 10; i++) | |
{ | |
securityDocs.Add(new SecurityDoc() | |
{ | |
Id = string.Format("securitydoc/{0}", i), | |
Users = Enumerable.Range(0, 10).ToList() | |
}); | |
} | |
using (var session = _store.OpenSession()) | |
{ | |
securityDocs.ForEach(session.Store); | |
session.SaveChanges(); | |
} | |
new DiscussionIndex().Execute(_store); | |
WaitForIndexing(_store); | |
WaitForUserToContinueTheTest(_store); | |
//using (var session = _store.OpenSession()) | |
//{ | |
// var query = session.Advanced.LuceneQuery<>() | |
//} | |
} | |
public class Discussion | |
{ | |
public string Id { get; set; } | |
public string SecurityId { get; set; } | |
public string Title { get; set; } | |
public bool IsPrivate { get; set; } | |
public List<int> Groups { get; set; } | |
public List<int> Networks { get; set; } | |
public string Status { get; set; } | |
public Discussion() | |
{ | |
Groups = new List<int>(); | |
Networks = new List<int>(); | |
} | |
} | |
public class DiscussionIndex : AbstractMultiMapIndexCreationTask<DiscussionIndex.DiscussionReduceResult> | |
{ | |
public DiscussionIndex() | |
{ | |
AddMap<Discussion>(discussions => from discussion in discussions | |
where discussion.IsPrivate | |
select new | |
{ | |
discussion.Id, | |
discussion.Networks, | |
discussion.Groups, | |
discussion.Title, | |
discussion.SecurityId, | |
discussion.Status, | |
Users = new int[0] | |
} | |
); | |
AddMap<SecurityDoc>(securitydocs => from securityDoc in securitydocs | |
select new | |
{ | |
Id = (string) null, | |
Title = (string) null, | |
Status = (string) null, | |
Networks = new int[0], | |
SecurityId = securityDoc.Id, | |
Groups = new int[0], | |
securityDoc.Users | |
} | |
); | |
Reduce = results => from r in results | |
group r by r.SecurityId | |
into g | |
from p in g | |
select | |
new | |
{ | |
p.Id, | |
SecurityId = g.Key, | |
Users = g.Select(x => x.Users).FirstOrDefault(x => x != null), | |
Groups = g.Select(x => x.Groups).FirstOrDefault(x => x != null), | |
Networks = g.Select(x => x.Networks).FirstOrDefault(x => x != null), | |
Status = g.Select(x => x.Status).FirstOrDefault(x => x != null), | |
Title = g.Select(x => x.Title).FirstOrDefault(x => x != null), | |
}; | |
} | |
public class DiscussionReduceResult | |
{ | |
public string Id { get; set; } | |
public string Title { get; set; } | |
public string Status { get; set; } | |
public string SecurityId { get; set; } | |
public IEnumerable<int> Networks { get; set; } | |
public IEnumerable<int> Groups { get; set; } | |
public IEnumerable<int> Users { get; set; } | |
} | |
} | |
public class SecurityDoc | |
{ | |
public string Id { get; set; } | |
public List<int> Users { get; set; } | |
public SecurityDoc() | |
{ | |
Users = new List<int>(); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment