Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save carlosagsmendes/2700776 to your computer and use it in GitHub Desktop.
Save carlosagsmendes/2700776 to your computer and use it in GitHub Desktop.
Testing Multimap Index in RavenDB
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