PageRenderTime 39ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/Raven.Tests/Bugs/Translators.cs

http://github.com/ayende/ravendb
C# | 189 lines | 159 code | 25 blank | 5 comment | 2 complexity | b1d173796584772449d6ff96d712cc95 MD5 | raw file
Possible License(s): GPL-3.0, MPL-2.0-no-copyleft-exception, LGPL-2.1, Apache-2.0, BSD-3-Clause, CC-BY-SA-3.0
  1. //-----------------------------------------------------------------------
  2. // <copyright file="Translators.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. //-----------------------------------------------------------------------
  6. using System;
  7. using System.ComponentModel.Composition.Hosting;
  8. using Raven.Client;
  9. using Raven.Imports.Newtonsoft.Json;
  10. using Raven.Abstractions.Indexing;
  11. using Raven.Abstractions.Linq;
  12. using Raven.Json.Linq;
  13. using Raven.Client.Indexes;
  14. using Xunit;
  15. using System.Linq;
  16. using Raven.Client.Linq;
  17. namespace Raven.Tests.Bugs
  18. {
  19. public class Translators : RavenTest
  20. {
  21. public class Users : AbstractIndexCreationTask<User>
  22. {
  23. public Users()
  24. {
  25. Map =
  26. users => from user in users
  27. select new {user.Name};
  28. TransformResults =
  29. (database, users) => from user in users
  30. let partner = database.Load<User>(user.PartnerId)
  31. select new {User = user.Name, Partner = partner.Name};
  32. }
  33. }
  34. public class Users_CausingErrors : AbstractIndexCreationTask<User>
  35. {
  36. public Users_CausingErrors()
  37. {
  38. Map =
  39. users => from user in users
  40. select new { user.Name };
  41. TransformResults =
  42. (database, users) => from user in users
  43. let partner = database.Load<User>(user.PartnerId)
  44. let x = string.Empty[1] // cause errors
  45. select new { User = user.Name, Partner = partner.Name };
  46. }
  47. }
  48. [Fact]
  49. public void CanUseTranslatorToModifyQueryResults_UsingClientGeneratedIndex()
  50. {
  51. using (var ds = NewDocumentStore())
  52. {
  53. using (var s = ds.OpenSession())
  54. {
  55. var entity = new User { Name = "Ayende", Age = 1 };
  56. s.Store(entity);
  57. s.Store(new User { Name = "Oren", PartnerId = entity.Id, Age = 1 });
  58. s.SaveChanges();
  59. }
  60. IndexCreation.CreateIndexes(
  61. new CompositionContainer(new TypeCatalog(typeof (Users))),
  62. ds);
  63. using (var s = ds.OpenSession())
  64. {
  65. var first = s.Query<User,Users>()
  66. .Customize(x => x.WaitForNonStaleResults())
  67. .Where(x=>x.Name == "Oren")
  68. .As<UserWithPartner>()
  69. .First();
  70. Assert.Equal("Oren", first.User);
  71. Assert.Equal("Ayende", first.Partner);
  72. }
  73. }
  74. }
  75. [Fact]
  76. public void WhenTransformResultsHasAnError()
  77. {
  78. using (var ds = NewDocumentStore())
  79. {
  80. using (var s = ds.OpenSession())
  81. {
  82. var entity = new User { Name = "Ayende" };
  83. s.Store(entity);
  84. s.Store(new User { Name = "Oren", PartnerId = entity.Id });
  85. s.SaveChanges();
  86. }
  87. IndexCreation.CreateIndexes(
  88. new CompositionContainer(new TypeCatalog(typeof(Users_CausingErrors))),
  89. ds);
  90. using (var s = ds.OpenSession())
  91. {
  92. var exception = Assert.Throws<InvalidOperationException>(() => s.Query<User, Users_CausingErrors>()
  93. .Customize(x => x.WaitForNonStaleResults())
  94. .Where(x => x.Name == "Ayende")
  95. .As<UserWithPartner>()
  96. .First());
  97. var expectedError = Assert.Throws<IndexOutOfRangeException>(() => string.Empty[1]);
  98. Assert.Equal("The transform results function failed.\r\nDoc 'users/1', Error: " + expectedError.Message, exception.Message);
  99. }
  100. }
  101. }
  102. private class UserWithPartner
  103. {
  104. public string User { get; set; }
  105. public string Partner { get; set; }
  106. }
  107. [Fact]
  108. public void CanUseTranslatorToModifyQueryResults()
  109. {
  110. using(var ds = NewDocumentStore())
  111. {
  112. using(var s = ds.OpenSession())
  113. {
  114. s.Store(new User {Name = "Ayende"});
  115. s.SaveChanges();
  116. }
  117. ds.DatabaseCommands.PutIndex("Users",
  118. new IndexDefinition
  119. {
  120. Map = "from u in docs.Users select new { u.Name }",
  121. TransformResults = "from user in results select new { Name = user.Name.ToUpper() }"
  122. });
  123. using (var s = ds.OpenSession())
  124. {
  125. var first = s.Query<RavenJObject>("Users").Customize(x=>x.WaitForNonStaleResults())
  126. .First();
  127. Assert.Equal("AYENDE", first.Value<string>("Name"));
  128. }
  129. }
  130. }
  131. [Fact]
  132. public void CanUseTranslatorToLoadAnotherDocument()
  133. {
  134. using (var ds = NewDocumentStore())
  135. {
  136. using (var s = ds.OpenSession())
  137. {
  138. var entity = new User { Name = "Ayende" };
  139. s.Store(entity);
  140. s.Store(new User { Name = "Oren", PartnerId = entity.Id});
  141. s.SaveChanges();
  142. }
  143. ds.DatabaseCommands.PutIndex("Users",
  144. new IndexDefinition
  145. {
  146. Map = "from u in docs.Users select new { u.Name }",
  147. TransformResults =
  148. @"
  149. from user in results
  150. let partner = Database.Load(user.PartnerId)
  151. select new { Name = user.Name, Partner = partner.Name }"
  152. });
  153. using (var s = ds.OpenSession())
  154. {
  155. var first = s.Advanced.LuceneQuery<RavenJObject>("Users")
  156. .WaitForNonStaleResults()
  157. .WhereEquals("Name", "Oren", true)
  158. .First();
  159. Assert.Equal(@"{""Name"":""Oren"",""Partner"":""Ayende""}", first.ToString(Formatting.None));
  160. }
  161. }
  162. }
  163. }
  164. }