public void write_then_read_answer_with_votes()
        {
            using (EmbeddableDocumentStore documentStore = NewDocumentStore())
            {
                documentStore.Conventions.FindFullDocumentKeyFromNonStringIdentifier = (id, type, allowNull) => id.ToString();

                new Answers_ByAnswerEntity2().Execute(documentStore);
                Guid questionId = Guid.NewGuid();
                Guid answerId   = Guid.NewGuid();

                using (IDocumentSession session = documentStore.OpenSession())
                {
                    var user = new User {
                        Id = @"user/222", DisplayName = "John Doe"
                    };
                    session.Store(user);

                    var question = new Question2
                    {
                        Id      = questionId,
                        Title   = "How to do this in RavenDb?",
                        Content = "I'm trying to find how to model documents for better DDD support.",
                        UserId  = @"user/222"
                    };
                    session.Store(question);


                    var answer = new AnswerEntity2
                    {
                        Id       = answerId,
                        Question = question,
                        Content  = "This is doable",
                        UserId   = user.Id
                    };
                    answer.Votes = new[]
                    {
                        new AnswerVoteEntity2
                        {
                            Id         = Guid.NewGuid(),
                            QuestionId = questionId,
                            Answer     = answer,
                            Delta      = 2
                        }
                    };


                    session.Store(new Answer2
                    {
                        Id         = answerId,
                        UserId     = user.Id,
                        QuestionId = question.Id,
                        Content    = "This is doable",
                        Votes      = new[]
                        {
                            new AnswerVote2
                            {
                                Id         = Guid.NewGuid(),
                                QuestionId = questionId,
                                AnswerId   = answerId,
                                Delta      = 2
                            }
                        }
                    });

                    session.SaveChanges();
                }
                using (IDocumentSession session = documentStore.OpenSession())
                {
                    AnswerEntity2 answerInfo = session.Query <Answer2, Answers_ByAnswerEntity2>()
                                               .Customize(x => x.WaitForNonStaleResultsAsOfNow())
                                               .Where(x => x.Id == answerId)
                                               .As <AnswerEntity2>()
                                               .SingleOrDefault();
                    Assert.NotNull(answerInfo);
                    Assert.NotNull(answerInfo.Votes);
                    Assert.True(answerInfo.Votes.Length == 1);
                    Assert.True(answerInfo.Votes[0].QuestionId == questionId);
                    Assert.NotNull(answerInfo.Votes[0].Answer);
                    Assert.True(answerInfo.Votes[0].Answer.Id == answerId);
                }
            }
        }
        public void CanExecuteTheTransformResultFunction()
        {
            var answersIndex = new Answers_ByAnswerEntity2 {
                Conventions = new DocumentConvention()
            };
            IndexDefinition       indexDefinition       = answersIndex.CreateIndexDefinition();
            var                   dynamicViewCompiler   = new DynamicViewCompiler("test", indexDefinition, ".");
            AbstractViewGenerator abstractViewGenerator = dynamicViewCompiler.GenerateInstance();

            using (var documentStore = NewDocumentStore())
            {
                Guid questionId = Guid.NewGuid();
                Guid answerId   = Guid.NewGuid();

                using (IDocumentSession session = documentStore.OpenSession())
                {
                    var user = new User {
                        Id = @"user/222", DisplayName = "John Doe"
                    };
                    session.Store(user);

                    var question = new Question2
                    {
                        Id      = questionId,
                        Title   = "How to do this in RavenDb?",
                        Content = "I'm trying to find how to model documents for better DDD support.",
                        UserId  = @"user/222"
                    };
                    session.Store(question);


                    var answer = new AnswerEntity2
                    {
                        Id       = answerId,
                        Question = question,
                        Content  = "This is doable",
                        UserId   = user.Id
                    };
                    answer.Votes = new[]
                    {
                        new AnswerVoteEntity2
                        {
                            Id         = Guid.NewGuid(),
                            QuestionId = questionId,
                            Answer     = answer,
                            Delta      = 2
                        }
                    };


                    session.Store(new Answer2
                    {
                        Id         = answerId,
                        UserId     = user.Id,
                        QuestionId = question.Id,
                        Content    = "This is doable",
                        Votes      = new[]
                        {
                            new AnswerVote2
                            {
                                Id         = Guid.NewGuid(),
                                QuestionId = questionId,
                                AnswerId   = answerId,
                                Delta      = 2
                            }
                        }
                    });

                    session.SaveChanges();
                }

                documentStore.DocumentDatabase.TransactionalStorage.Batch(accessor =>
                {
                    var documentRetriever = new DocumentRetriever(accessor, new OrderedPartCollection <AbstractReadTrigger>(),
                                                                  documentStore.DocumentDatabase.TransactionalStorage
                                                                  .GetInFlightTransactionalState(
                                                                      documentStore.DocumentDatabase.Documents.Put,
                                                                      documentStore.DocumentDatabase.Documents.Delete));
                    var dynamicJsonObjects         = new[] { new DynamicJsonObject(accessor.Documents.DocumentByKey("answer2s/" + answerId.ToString(), null).ToJson()), };
                    var transformResultsDefinition = abstractViewGenerator.TransformResultsDefinition(documentRetriever,
                                                                                                      dynamicJsonObjects
                                                                                                      );

                    transformResultsDefinition.ToArray();
                });
            }
        }
        public void write_then_read_from_complex_entity_types_with_Guids_as_keys()
        {
            using (EmbeddableDocumentStore documentStore = NewDocumentStore())
            {
                documentStore.Conventions.FindFullDocumentKeyFromNonStringIdentifier = (id, type, allowNull) => id.ToString();

                new Answers_ByAnswerEntity2().Execute(documentStore);
                Guid questionId = Guid.NewGuid();
                Guid answerId   = Guid.NewGuid();

                using (IDocumentSession session = documentStore.OpenSession())
                {
                    var user = new User {
                        Id = @"user\222", DisplayName = "John Doe"
                    };
                    session.Store(user);

                    var question = new Question2
                    {
                        Id      = questionId,
                        Title   = "How to do this in RavenDb?",
                        Content = "I'm trying to find how to model documents for better DDD support.",
                        UserId  = @"user\222"
                    };
                    session.Store(question);


                    var answer = new AnswerEntity2
                    {
                        Id       = answerId,
                        Question = question,
                        Content  = "This is doable",
                        UserId   = user.Id
                    };

                    //session.Store(new Answer2
                    //{
                    //    Id = answer.Id,
                    //    UserId = answer.UserId,
                    //    QuestionId = answer.Question.Id,
                    //    Content = answer.Content
                    //}
                    session.Store(new Answer2
                    {
                        Id         = answerId,
                        UserId     = user.Id,
                        QuestionId = question.Id,
                        Content    = "This is doable"
                    });

                    session.SaveChanges();
                }
                using (IDocumentSession session = documentStore.OpenSession())
                {
                    AnswerEntity2 answerInfo = session.Query <Answer2, Answers_ByAnswerEntity2>()
                                               .Customize(x => x.WaitForNonStaleResultsAsOfNow())
                                               .Where(x => x.Id == answerId)
                                               .As <AnswerEntity2>()
                                               .SingleOrDefault();
                    Assert.NotNull(answerInfo);
                    Assert.NotNull(answerInfo.Question);
                }
            }
        }
		public void write_then_read_answer_with_votes()
		{
			using (EmbeddableDocumentStore documentStore = NewDocumentStore())
			{
				documentStore.Conventions.FindFullDocumentKeyFromNonStringIdentifier = (id, type, allowNull) => id.ToString();

				new Answers_ByAnswerEntity2().Execute(documentStore);
				Guid questionId = Guid.NewGuid();
				Guid answerId = Guid.NewGuid();

				using (IDocumentSession session = documentStore.OpenSession())
				{
					var user = new User { Id = @"user\222", DisplayName = "John Doe" };
					session.Store(user);

					var question = new Question2
					{
						Id = questionId,
						Title = "How to do this in RavenDb?",
						Content = "I'm trying to find how to model documents for better DDD support.",
						UserId = @"user\222"
					};
					session.Store(question);


					var answer = new AnswerEntity2
					{
						Id = answerId,
						Question = question,
						Content = "This is doable",
						UserId = user.Id
					};
					answer.Votes = new[]
					{
						new AnswerVoteEntity2
						{
							Id = Guid.NewGuid(),
							QuestionId = questionId,
							Answer = answer,
							Delta = 2
						}
					};


					session.Store(new Answer2
					{
						Id = answerId,
						UserId = user.Id,
						QuestionId = question.Id,
						Content = "This is doable",
						Votes = new[]
						{
							new AnswerVote2
							{
								Id = Guid.NewGuid(),
								QuestionId = questionId,
								AnswerId = answerId,
								Delta = 2
							}
						}
					});

					session.SaveChanges();
				}
				using (IDocumentSession session = documentStore.OpenSession())
				{
					AnswerEntity2 answerInfo = session.Query<Answer2, Answers_ByAnswerEntity2>()
						.Customize(x => x.WaitForNonStaleResultsAsOfNow())
						.Where(x => x.Id == answerId)
						.As<AnswerEntity2>()
						.SingleOrDefault();
					Assert.NotNull(answerInfo);
					Assert.NotNull(answerInfo.Votes);
					Assert.True(answerInfo.Votes.Length == 1);
					Assert.True(answerInfo.Votes[0].QuestionId == questionId);
					Assert.NotNull(answerInfo.Votes[0].Answer);
					Assert.True(answerInfo.Votes[0].Answer.Id == answerId);
				}
			}
		}
		public void CanExecuteTheTransformResultFunction()
		{
			var answersIndex = new Answers_ByAnswerEntity2 { Conventions = new DocumentConvention() };
			IndexDefinition indexDefinition = answersIndex.CreateIndexDefinition();
			var dynamicViewCompiler = new DynamicViewCompiler("test", indexDefinition, ".");
			AbstractViewGenerator abstractViewGenerator = dynamicViewCompiler.GenerateInstance();
			using (var documentStore = NewDocumentStore())
			{

				Guid questionId = Guid.NewGuid();
				Guid answerId = Guid.NewGuid();

				using (IDocumentSession session = documentStore.OpenSession())
				{
					var user = new User { Id = @"user\222", DisplayName = "John Doe" };
					session.Store(user);

					var question = new Question2
					{
						Id = questionId,
						Title = "How to do this in RavenDb?",
						Content = "I'm trying to find how to model documents for better DDD support.",
						UserId = @"user\222"
					};
					session.Store(question);


					var answer = new AnswerEntity2
					{
						Id = answerId,
						Question = question,
						Content = "This is doable",
						UserId = user.Id
					};
					answer.Votes = new[]
					{
						new AnswerVoteEntity2
						{
							Id = Guid.NewGuid(),
							QuestionId = questionId,
							Answer = answer,
							Delta = 2
						}
					};


					session.Store(new Answer2
					{
						Id = answerId,
						UserId = user.Id,
						QuestionId = question.Id,
						Content = "This is doable",
						Votes = new[]
						{
							new AnswerVote2
							{
								Id = Guid.NewGuid(),
								QuestionId = questionId,
								AnswerId = answerId,
								Delta = 2
							}
						}
					});

					session.SaveChanges();
				}

				documentStore.DocumentDatabase.TransactionalStorage.Batch(accessor =>
				{
					var documentRetriever = new DocumentRetriever(accessor, new OrderedPartCollection<AbstractReadTrigger>());
					var dynamicJsonObjects = new[] { new DynamicJsonObject(accessor.Documents.DocumentByKey("answer2s/" + answerId.ToString(), null).ToJson()), };
					var transformResultsDefinition = abstractViewGenerator.TransformResultsDefinition(documentRetriever,
																									  dynamicJsonObjects
						);

					transformResultsDefinition.ToArray();
				});



			}
		}
		public void write_then_read_from_complex_entity_types_with_Guids_as_keys()
		{
			using (EmbeddableDocumentStore documentStore = NewDocumentStore())
			{
				documentStore.Conventions.FindFullDocumentKeyFromNonStringIdentifier = (id, type, allowNull) => id.ToString();

				IndexCreation.CreateIndexes(typeof(QuestionWithVoteTotalIndex).Assembly, documentStore);
				Guid questionId = Guid.NewGuid();
				Guid answerId = Guid.NewGuid();

				using (IDocumentSession session = documentStore.OpenSession())
				{
					var user = new User { Id = @"user\222", DisplayName = "John Doe" };
					session.Store(user);

					var question = new Question2
					{
						Id = questionId,
						Title = "How to do this in RavenDb?",
						Content = "I'm trying to find how to model documents for better DDD support.",
						UserId = @"user\222"
					};
					session.Store(question);


					var answer = new AnswerEntity2
					{
						Id = answerId,
						Question = question,
						Content = "This is doable",
						UserId = user.Id
					};

					//session.Store(new Answer2
					//{
					//    Id = answer.Id,
					//    UserId = answer.UserId,
					//    QuestionId = answer.Question.Id,
					//    Content = answer.Content
					//}
					session.Store(new Answer2
					{
						Id = answerId,
						UserId = user.Id,
						QuestionId = question.Id,
						Content = "This is doable"
					});

					session.SaveChanges();
				}
				using (IDocumentSession session = documentStore.OpenSession())
				{
					AnswerEntity2 answerInfo = session.Query<Answer2, Answers_ByAnswerEntity2>()
						.Customize(x => x.WaitForNonStaleResultsAsOfNow())
						.Where(x => x.Id == answerId)
						.As<AnswerEntity2>()
						.SingleOrDefault();
					Assert.NotNull(answerInfo);
					Assert.NotNull(answerInfo.Question);
				}
			}
		}