/test/SlowTests/MailingList/LazyCount.cs

https://github.com/fitzchak/ravendb · C# · 237 lines · 191 code · 38 blank · 8 comment · 4 complexity · a42097fc3697fc853c1b66292ffc9378 MD5 · raw file

  1. using System;
  2. using System.Linq;
  3. using FastTests;
  4. using Raven.Client;
  5. using Raven.Client.Documents;
  6. using Raven.Client.Documents.Indexes;
  7. using Raven.Client.Documents.Linq;
  8. using Raven.Client.Documents.Session;
  9. using Xunit;
  10. namespace SlowTests.MailingList
  11. {
  12. public class LazyCount : RavenTestBase
  13. {
  14. private class User
  15. {
  16. public string Id { get; set; }
  17. public string FirstName { get; set; }
  18. public string LastName { get; set; }
  19. }
  20. private class UserByFirstName : AbstractIndexCreationTask<User>
  21. {
  22. public UserByFirstName()
  23. {
  24. Map = users => from user in users
  25. select new { user.FirstName };
  26. }
  27. }
  28. [Fact]
  29. public void CanLazilyCountOnSearchAgainstDynamicIndex()
  30. {
  31. using (var store = GetDocumentStore())
  32. {
  33. new UserByFirstName().Execute(store);
  34. using (var session = store.OpenSession())
  35. {
  36. session.Store(new User
  37. {
  38. FirstName = "Ayende"
  39. });
  40. session.Store(new User
  41. {
  42. FirstName = "SomethingElse"
  43. });
  44. session.SaveChanges();
  45. }
  46. using (var session = store.OpenSession())
  47. {
  48. session.Query<User>()
  49. .Customize(x => x.WaitForNonStaleResults())
  50. .Take(15).ToList();
  51. Assert.Equal(1, session.Advanced.NumberOfRequests);
  52. QueryStatistics stats;
  53. var query = session.Query<User>().Statistics(out stats)
  54. .Customize(x => x.WaitForNonStaleResults())
  55. .Where(x => x.FirstName == "Ayende");
  56. var results = query.Take(8).Lazily();
  57. // Want to be able to support these 2 scenarios for LazyCount!!
  58. var lazyCount = query.CountLazily(); // filtered, only 1 match
  59. var baseLazyCount = session.Query<User>().CountLazily(); // no filter, will match all Users
  60. var enumerable = results.Value; //force evaluation
  61. Assert.Equal(1, enumerable.Count());
  62. Assert.Equal(DateTime.UtcNow.Year, stats.IndexTimestamp.Year);
  63. Assert.Equal(1, stats.TotalResults);
  64. Assert.Equal(1, lazyCount.Value);
  65. Assert.Equal(2, baseLazyCount.Value);
  66. // All the lazy queries only caused 1 request
  67. Assert.Equal(2, session.Advanced.NumberOfRequests);
  68. }
  69. }
  70. }
  71. [Fact]
  72. public void CanLazilyCountOnSearchAgainstDynamicIndex_Embedded()
  73. {
  74. using (var store = GetDocumentStore())
  75. {
  76. new UserByFirstName().Execute(store);
  77. using (var session = store.OpenSession())
  78. {
  79. session.Store(new User
  80. {
  81. FirstName = "Ayende"
  82. });
  83. session.Store(new User
  84. {
  85. FirstName = "SomethingElse"
  86. });
  87. session.SaveChanges();
  88. }
  89. using (var session = store.OpenSession())
  90. {
  91. session.Query<User>()
  92. .Customize(x => x.WaitForNonStaleResults())
  93. .Take(15).ToList();
  94. Assert.Equal(1, session.Advanced.NumberOfRequests);
  95. QueryStatistics stats;
  96. var query = session.Query<User>().Statistics(out stats)
  97. .Customize(x => x.WaitForNonStaleResults())
  98. .Where(x => x.FirstName == "Ayende");
  99. var results = query.Take(8).Lazily();
  100. // Want to be able to support these 2 scenarios for LazyCount!!
  101. var lazyCount = query.CountLazily(); // filtered, only 1 match
  102. var baseLazyCount = session.Query<User>().CountLazily(); // no filter, will match all Users
  103. var enumerable = results.Value; //force evaluation
  104. Assert.Equal(1, enumerable.Count());
  105. Assert.Equal(DateTime.UtcNow.Year, stats.IndexTimestamp.Year);
  106. Assert.Equal(1, stats.TotalResults);
  107. Assert.Equal(1, lazyCount.Value);
  108. Assert.Equal(2, baseLazyCount.Value);
  109. // All the lazy queries only caused 1 request
  110. Assert.Equal(2, session.Advanced.NumberOfRequests);
  111. }
  112. }
  113. }
  114. [Fact]
  115. public void CanLazilyCountOnSearchAgainstStaticIndex()
  116. {
  117. using (var store = GetDocumentStore())
  118. {
  119. new UserByFirstName().Execute(store);
  120. using (var session = store.OpenSession())
  121. {
  122. session.Store(new User
  123. {
  124. FirstName = "Ayende"
  125. });
  126. session.Store(new User
  127. {
  128. FirstName = "SomethingElse"
  129. });
  130. session.SaveChanges();
  131. }
  132. using (var session = store.OpenSession())
  133. {
  134. session.Query<User, UserByFirstName>()
  135. .Customize(x => x.WaitForNonStaleResults())
  136. .Take(15).ToList();
  137. QueryStatistics stats;
  138. var query = session.Query<User, UserByFirstName>().Statistics(out stats)
  139. .Customize(x => x.WaitForNonStaleResults())
  140. .Where(x => x.FirstName == "Ayende");
  141. var results = query.Take(8).Lazily();
  142. // Want to be able to support these 2 scenarios for LazyCount!!
  143. var lazyCount = query.CountLazily(); // filtered, only 1 match
  144. var baseLazyCount = session.Query<User>().CountLazily(); // no filter, will match all Users
  145. var enumerable = results.Value; //force evaluation
  146. Assert.Equal(1, enumerable.Count());
  147. Assert.Equal(DateTime.UtcNow.Year, stats.IndexTimestamp.Year);
  148. Assert.Equal(1, stats.TotalResults);
  149. Assert.Equal(1, lazyCount.Value);
  150. Assert.Equal(2, baseLazyCount.Value);
  151. // All the lazy queries only caused 1 request
  152. Assert.Equal(2, session.Advanced.NumberOfRequests);
  153. }
  154. }
  155. }
  156. [Fact]
  157. public void CanLazilyCountOnSearchAgainstStaticIndex_Embedded()
  158. {
  159. using (var store = GetDocumentStore())
  160. {
  161. new UserByFirstName().Execute(store);
  162. using (var session = store.OpenSession())
  163. {
  164. session.Store(new User
  165. {
  166. FirstName = "Ayende"
  167. });
  168. session.Store(new User
  169. {
  170. FirstName = "SomethingElse"
  171. });
  172. session.SaveChanges();
  173. }
  174. using (var session = store.OpenSession())
  175. {
  176. session.Query<User, UserByFirstName>()
  177. .Customize(x => x.WaitForNonStaleResults())
  178. .Take(15).ToList();
  179. QueryStatistics stats;
  180. var query = session.Query<User, UserByFirstName>().Statistics(out stats)
  181. .Customize(x => x.WaitForNonStaleResults())
  182. .Where(x => x.FirstName == "Ayende");
  183. var results = query.Take(8).Lazily();
  184. // Want to be able to support these 2 scenarios for LazyCount!!
  185. var lazyCount = query.CountLazily(); // filtered, only 1 match
  186. var baseLazyCount = session.Query<User>().CountLazily(); // no filter, will match all Users
  187. var enumerable = results.Value; //force evaluation
  188. Assert.Equal(1, enumerable.Count());
  189. Assert.Equal(DateTime.UtcNow.Year, stats.IndexTimestamp.Year);
  190. Assert.Equal(1, stats.TotalResults);
  191. Assert.Equal(1, lazyCount.Value);
  192. Assert.Equal(2, baseLazyCount.Value);
  193. // All the lazy queries only caused 1 request
  194. Assert.Equal(2, session.Advanced.NumberOfRequests);
  195. }
  196. }
  197. }
  198. }
  199. }