/ToMigrate/Raven.Tests/Sorting/CustomSorting.cs

https://github.com/fitzchak/ravendb · C# · 272 lines · 237 code · 30 blank · 5 comment · 0 complexity · eba6596c435433bb9eadadcdb50cc82e MD5 · raw file

  1. // -----------------------------------------------------------------------
  2. // <copyright file="CustomSorting.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. // -----------------------------------------------------------------------
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using Jint.Parser;
  10. using Raven.Abstractions.Data;
  11. using Raven.Abstractions.Indexing;
  12. using Raven.Client.Indexes;
  13. using Raven.Json.Linq;
  14. using Raven.Tests.Common;
  15. using Rhino.Mocks.Constraints;
  16. using Xunit;
  17. namespace Raven.Tests.Sorting
  18. {
  19. public class CustomSorting : RavenTest
  20. {
  21. public class User
  22. {
  23. public string Name;
  24. }
  25. public class User_Search : AbstractIndexCreationTask<User>
  26. {
  27. public User_Search()
  28. {
  29. Map = users =>
  30. from user in users
  31. select new { user.Name };
  32. Store(x => x.Name, FieldStorage.Yes);
  33. }
  34. }
  35. public class Customer
  36. {
  37. public class Tag
  38. {
  39. public int Id { get; set; }
  40. public string Descrtiption { get; set; }
  41. }
  42. public string Name { get; set; }
  43. public List<Tag> PayingTags { get; set; }
  44. public int TagId { get; set; }
  45. public int Points { get; set; }
  46. }
  47. public class Customer_Search : AbstractIndexCreationTask<Customer>
  48. {
  49. public Customer_Search()
  50. {
  51. Map = customers =>
  52. from customer in customers
  53. select new
  54. {
  55. customer.TagId,
  56. customer.Points,
  57. _ = from pTag in customer.PayingTags
  58. select new[]
  59. {
  60. CreateField("PayingTag_" + pTag.Id , true)
  61. }
  62. };
  63. Store(Constants.AllFields, FieldStorage.Yes);
  64. }
  65. }
  66. [Fact]
  67. public void AscendingPrefix()
  68. {
  69. using (var store = NewDocumentStore())
  70. {
  71. using (var session = store.OpenSession())
  72. {
  73. session.Store(new User { Name = "Maxim" });
  74. session.Store(new User { Name = "Oren" });
  75. session.Store(new User { Name = "Grisha" });
  76. session.Store(new User { Name = "Michael" });
  77. session.SaveChanges();
  78. }
  79. new User_Search().Execute(store);
  80. WaitForIndexing(store);
  81. using (var session = store.OpenSession())
  82. {
  83. var users = session.Query<User, User_Search>()
  84. .Customize(x => x.CustomSortUsing(typeof(SortByNumberOfCharactersFromEnd).AssemblyQualifiedName))
  85. .AddTransformerParameter("len", 1)
  86. .ToList();
  87. Assert.Equal(users[0].Name, "Grisha");
  88. Assert.Equal(users[1].Name, "Michael");
  89. Assert.Equal(users[2].Name, "Maxim");
  90. Assert.Equal(users[3].Name, "Oren");
  91. }
  92. }
  93. }
  94. [Fact]
  95. public void DescendingPrefix()
  96. {
  97. using (var store = NewDocumentStore())
  98. {
  99. using (var session = store.OpenSession())
  100. {
  101. session.Store(new User { Name = "Maxim" });
  102. session.Store(new User { Name = "Oren" });
  103. session.Store(new User { Name = "Grisha" });
  104. session.Store(new User { Name = "Michael" });
  105. session.SaveChanges();
  106. }
  107. new User_Search().Execute(store);
  108. WaitForIndexing(store);
  109. using (var session = store.OpenSession())
  110. {
  111. var users = session.Query<User, User_Search>()
  112. .Customize(x => x.CustomSortUsing(typeof(SortByNumberOfCharactersFromEnd).AssemblyQualifiedName,true))
  113. .AddTransformerParameter("len", 3)
  114. .ToList();
  115. Assert.Equal(users[0].Name, "Maxim");
  116. Assert.Equal(users[1].Name, "Grisha");
  117. Assert.Equal(users[2].Name, "Oren");
  118. Assert.Equal(users[3].Name, "Michael");
  119. }
  120. using (var session = store.OpenSession())
  121. {
  122. var users = session.Query<User, User_Search>()
  123. .Customize(x => x.CustomSortUsing(typeof(SortByNumberOfCharactersFromEnd).AssemblyQualifiedName,true))
  124. .AddTransformerParameter("len", 1)
  125. .ToList();
  126. Assert.Equal(users[0].Name, "Oren");
  127. Assert.Equal(users[1].Name, "Maxim");
  128. Assert.Equal(users[2].Name, "Michael");
  129. Assert.Equal(users[3].Name, "Grisha");
  130. }
  131. }
  132. }
  133. [Fact]
  134. public void CustomSortByDynamicFields()
  135. {
  136. using (var store = NewDocumentStore())
  137. {
  138. using (var session = store.OpenSession())
  139. {
  140. session.Store(new Customer
  141. {
  142. Name = "Johnny",
  143. PayingTags = new List<Customer.Tag>()
  144. {
  145. new Customer.Tag()
  146. {
  147. Id = 1,
  148. Descrtiption = "Loud Book Reading"
  149. },
  150. },
  151. Points = 5,
  152. TagId = 2
  153. }, "Customers/Johnny");
  154. session.Store(new Customer
  155. {
  156. Name = "Abraham",
  157. PayingTags = new List<Customer.Tag>()
  158. {
  159. new Customer.Tag()
  160. {
  161. Id = 1,
  162. Descrtiption = "Loud Book Reading"
  163. },
  164. new Customer.Tag()
  165. {
  166. Id = 2,
  167. Descrtiption = "Menicure"
  168. }
  169. },
  170. Points = 3,
  171. TagId = 1
  172. }, "Customers/Abraham");
  173. session.Store(new Customer
  174. {
  175. Name = "Richard",
  176. PayingTags = new List<Customer.Tag>()
  177. {
  178. new Customer.Tag()
  179. {
  180. Id = 1,
  181. Descrtiption = "Loud Book Reading"
  182. },
  183. },
  184. Points = 3,
  185. TagId = 1
  186. }, "Customers/Richard");
  187. session.Store(new Customer
  188. {
  189. Name = "Vasily",
  190. PayingTags = new List<Customer.Tag>()
  191. {
  192. new Customer.Tag()
  193. {
  194. Id = 1,
  195. Descrtiption = "Loud Book Reading"
  196. },
  197. },
  198. Points = 4,
  199. TagId = 1
  200. }, "Customers/Vasily");
  201. session.Store(new Customer
  202. {
  203. Name = "Josef",
  204. PayingTags = new List<Customer.Tag>()
  205. {
  206. new Customer.Tag()
  207. {
  208. Id = 1,
  209. Descrtiption = "Loud Book Reading"
  210. },
  211. new Customer.Tag()
  212. {
  213. Id = 2,
  214. Descrtiption = "Menicure"
  215. }
  216. },
  217. Points = 7,
  218. TagId = 2
  219. }, "Customers/Josef");
  220. session.SaveChanges();
  221. }
  222. new Customer_Search().Execute(store);
  223. WaitForIndexing(store);
  224. using (var session = store.OpenSession())
  225. {
  226. var results = session.Advanced.DocumentQuery<Customer, Customer_Search>()
  227. .CustomSortUsing(typeof(SortByDynamicFields).AssemblyQualifiedName, true)
  228. .Where("PayingTag_1:true OR TagId:2")
  229. .SetTransformerParameters(new Dictionary<string, RavenJToken>()
  230. {
  231. {"customTagId", 2}
  232. }).ToList();
  233. Assert.Equal(results[0].Name, "Josef");
  234. Assert.Equal(results[1].Name, "Abraham");
  235. Assert.Equal(results[2].Name, "Johnny");
  236. Assert.Equal(results[3].Name, "Vasily");
  237. Assert.Equal(results[4].Name, "Richard");
  238. }
  239. }
  240. }
  241. }
  242. }