lucamilan
3/21/2012 - 12:39 PM

RavenDB Projection Sample

RavenDB Projection Sample

using System;
using System.Collections.Generic;
using System.Linq;
using Raven.Abstractions.Indexing;
using Raven.Client;
using Raven.Client.Document;
using Raven.Client.Indexes;
using Raven.Client.Linq;

namespace RavenDBProjectionTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var documentStore = (new DocumentStore
                                 {
                                     Url = "http://localhost:8080"
                                 }).Initialize();

            SetupData(documentStore);

            IndexCreation.CreateIndexes(typeof(GameServers_ConnectedUsers).Assembly, documentStore);

            using (var session = documentStore.OpenSession())
            {
                var results =
                    session.Query<GameServers_ConnectedUsers.IndexResult, GameServers_ConnectedUsers>()
                           .Where(x => x.UserName.StartsWith("b"))
                           .AsProjection<GameServers_ConnectedUsers.IndexResult>()
                           .ToList();

                foreach (var reduceResult in results)
                {
                    Console.WriteLine(reduceResult.ServerName + " - " + reduceResult.ServerName);
                }
            }

            Console.ReadKey();
        }

        private static void SetupData(IDocumentStore documentStore)
        {
            using (IDocumentSession documentSession = documentStore.OpenSession())
            {
                documentSession.Store(new GameServer
                {
                    ServerName = "3FL CS #4",
                    ConnectedUsers = new[]
                    {
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 14:23"),
                            Name = "toaster",
                            UserId = "users/1"
                        },
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 13:23"),
                            Name = "Bill",
                            UserId = "users/2"
                        },
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 14:08"),
                            Name = "THE PUNISHER",
                            UserId = "users/5"
                        },
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 13:18"),
                            Name = "Benny",
                            UserId = "users/8"
                        },
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 13:46"),
                            Name = "(2)Player",
                            UserId = "users/13"
                        }
                    }
                });
                documentSession.Store(new GameServer
                {
                    ServerName = "iPGN CS #01 Iceworld",
                    ConnectedUsers = new[]
                    {
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 14:03"),
                            Name = "EggM^tt",
                            UserId = "users/4"
                        },
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 13:59"),
                            Name = "legend | camper",
                            UserId = "users/12"
                        },
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 12:44"),
                            Name = "Bob",
                            UserId = "users/3"
                        },
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 14:12"),
                            Name = "DarkSide",
                            UserId = "users/7"
                        },
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 15:31"),
                            Name = "Kalamity",
                            UserId = "users/11"
                        }
                    }
                });
                documentSession.Store(new GameServer
                {
                    ServerName = "iPGN HLTV",
                    ConnectedUsers = new[]
                    {
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 14:02"),
                            Name = "Fresh dinner",
                            UserId = "users/6"
                        },
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 13:16"),
                            Name = "kobe",
                            UserId = "users/10"
                        },
                        new GameServer.User
                        {
                            DateConnected = DateTimeOffset.Parse("March 15, 2012 13:58"),
                            Name = "optiks",
                            UserId = "users/9"
                        }
                    }
                });

                documentSession.SaveChanges();
            }
        }

        public class GameServer
        {
            public string Id { get; set; }
            public string ServerName { get; set; }
            public IEnumerable<User> ConnectedUsers { get; set; }

            public class User
            {
                public string UserId { get; set; }
                public string Name { get; set; }
                public DateTimeOffset DateConnected { get; set; }
            }
        }

        public class GameServers_ConnectedUsers :
            AbstractIndexCreationTask<GameServer, GameServers_ConnectedUsers.IndexResult>
        {
            public GameServers_ConnectedUsers()
            {
                Map = servers => from s in servers
                                 from y in s.ConnectedUsers
                                 select new
                                 {
                                     ServerName = s.ServerName,
                                     UserName = y.Name,
                                     DateConnected = y.DateConnected,
                                     UserId = y.UserId
                                 };

                Store(x => x.ServerName, FieldStorage.Yes);
                Store(x => x.UserName, FieldStorage.Yes);
                Store(x => x.DateConnected, FieldStorage.Yes);
                Store(x => x.UserId, FieldStorage.Yes);
            }

            public class IndexResult
            {
                public string ServerName { get; set; }
                public string UserName { get; set; }
                public DateTimeOffset DateConnected { get; set; }
                public string UserId { get; set; }
            }
        }
    }
}