/test/SlowTests/Server/Documents/Indexing/IndexMerging.cs

https://github.com/fitzchak/ravendb · C# · 340 lines · 286 code · 54 blank · 0 comment · 0 complexity · 95197b34d04d07d8e27dcae0c3053c62 MD5 · raw file

  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using FastTests;
  4. using Raven.Client.Documents.Indexes;
  5. using Raven.Client.Documents.Operations.Indexes;
  6. using Raven.Server.Documents.Indexes.IndexMerging;
  7. using Xunit;
  8. namespace SlowTests.Server.Documents.Indexing
  9. {
  10. public class IndexMerging : RavenTestBase
  11. {
  12. private class Person
  13. {
  14. public string Id { get; set; }
  15. public string Name { get; set; }
  16. public string AddressId { get; set; }
  17. }
  18. private class PersonWithAddress
  19. {
  20. public string Id { get; set; }
  21. public string Name { get; set; }
  22. public Address Address { get; set; }
  23. }
  24. private class Address
  25. {
  26. public string Id { get; set; }
  27. public string Street { get; set; }
  28. public int ZipCode { get; set; }
  29. }
  30. private class User
  31. {
  32. public string Name { get; set; }
  33. public string Email { get; set; }
  34. public int Age { get; set; }
  35. }
  36. private class UsersByName : AbstractIndexCreationTask<User>
  37. {
  38. public UsersByName()
  39. {
  40. Map = usersCollection => from user in usersCollection
  41. select new { user.Name };
  42. Index(x => x.Name, FieldIndexing.Search);
  43. }
  44. }
  45. private class UsersByAge : AbstractIndexCreationTask<User>
  46. {
  47. public UsersByAge()
  48. {
  49. Map = users => from u in users
  50. select new { u.Age };
  51. }
  52. }
  53. private class UsersByEmail : AbstractIndexCreationTask<User>
  54. {
  55. public UsersByEmail()
  56. {
  57. Map = users => from user in users
  58. select new { user.Email };
  59. }
  60. }
  61. private class Person_ByName_1 : AbstractIndexCreationTask<Person>
  62. {
  63. public Person_ByName_1()
  64. {
  65. Map = persons => from p in persons
  66. select new
  67. {
  68. Name = p.Name
  69. };
  70. }
  71. }
  72. private class Person_ByName_2 : AbstractIndexCreationTask<Person>
  73. {
  74. public Person_ByName_2()
  75. {
  76. Map = persons => from p in persons
  77. select new
  78. {
  79. Name = p.Name
  80. };
  81. }
  82. }
  83. private class Person_ByName_3 : AbstractIndexCreationTask<Person>
  84. {
  85. public Person_ByName_3()
  86. {
  87. Map = persons => from person in persons
  88. select new
  89. {
  90. Name = person.Name
  91. };
  92. }
  93. }
  94. private class Complex_Person_ByName_1 : AbstractIndexCreationTask<PersonWithAddress>
  95. {
  96. public Complex_Person_ByName_1()
  97. {
  98. Map = persons => from p in persons
  99. select new
  100. {
  101. Street = p.Address.Street
  102. };
  103. }
  104. }
  105. private class Complex_Person_ByName_2 : AbstractIndexCreationTask<PersonWithAddress>
  106. {
  107. public Complex_Person_ByName_2()
  108. {
  109. Map = persons => from p in persons
  110. select new
  111. {
  112. Street = p.Address.Street
  113. };
  114. }
  115. }
  116. private class Complex_Person_ByName_3 : AbstractIndexCreationTask<PersonWithAddress>
  117. {
  118. public Complex_Person_ByName_3()
  119. {
  120. Map = persons => from person in persons
  121. select new
  122. {
  123. Street = person.Address.Street
  124. };
  125. }
  126. }
  127. [Fact]
  128. public void IndexMergeWithField()
  129. {
  130. using (var store = GetDocumentStore())
  131. {
  132. new UsersByName().Execute(store);
  133. new UsersByEmail().Execute(store);
  134. new UsersByAge().Execute(store);
  135. var index1 = store.Maintenance.Send(new GetIndexOperation("UsersByName"));
  136. var index2 = store.Maintenance.Send(new GetIndexOperation("UsersByEmail"));
  137. var index3 = store.Maintenance.Send(new GetIndexOperation("UsersByAge"));
  138. var dictionary = new Dictionary<string, IndexDefinition>
  139. {
  140. {index1.Name, index1},
  141. {index2.Name, index2},
  142. {index3.Name, index3}
  143. };
  144. var merger = new IndexMerger(dictionary);
  145. var results = merger.ProposeIndexMergeSuggestions();
  146. Assert.Equal(1, results.Suggestions.Count);
  147. var suggestion = results.Suggestions[0];
  148. var index = suggestion.MergedIndex;
  149. Assert.Equal(3, suggestion.CanMerge.Count);
  150. Assert.Equal(FieldIndexing.Search, index.Fields["Name"].Indexing);
  151. Assert.Equal(@"docs.Users.Select(doc=>new{Age=doc.Age
  152. ,Email=doc.Email
  153. ,Name=doc.Name
  154. })", index.Maps.First());
  155. }
  156. }
  157. [Fact]
  158. public void IndexMergerShouldNotTakeIntoAccountExpressionVariableName()
  159. {
  160. var index1 = new Person_ByName_1();
  161. var index2 = new Person_ByName_2();
  162. var index3 = new Person_ByName_3();
  163. var indexDefinition1 = index1.CreateIndexDefinition();
  164. var indexDefinition2 = index2.CreateIndexDefinition();
  165. var indexDefinition3 = index3.CreateIndexDefinition();
  166. var merger = new IndexMerger(
  167. new Dictionary<string, IndexDefinition>
  168. {
  169. { indexDefinition1.Name, indexDefinition1 },
  170. { indexDefinition2.Name, indexDefinition2 }
  171. });
  172. var results = merger.ProposeIndexMergeSuggestions();
  173. Assert.Equal(1, results.Suggestions.Count);
  174. Assert.Equal(1, results.Suggestions[0].CanDelete.Count);
  175. merger = new IndexMerger(
  176. new Dictionary<string, IndexDefinition>
  177. {
  178. { indexDefinition1.Name, indexDefinition1 },
  179. { indexDefinition3.Name, indexDefinition3 }
  180. });
  181. results = merger.ProposeIndexMergeSuggestions();
  182. Assert.Equal(1, results.Suggestions.Count);
  183. Assert.Equal(1, results.Suggestions[0].CanDelete.Count);
  184. }
  185. [Fact]
  186. public void IndexMergerShouldNotTakeIntoAccountExpressionVariableNameForComplexTypes()
  187. {
  188. var index1 = new Complex_Person_ByName_1();
  189. var index2 = new Complex_Person_ByName_2();
  190. var index3 = new Complex_Person_ByName_3();
  191. var indexDefinition1 = index1.CreateIndexDefinition();
  192. var indexDefinition2 = index2.CreateIndexDefinition();
  193. var indexDefinition3 = index3.CreateIndexDefinition();
  194. var merger = new IndexMerger(
  195. new Dictionary<string, IndexDefinition>
  196. {
  197. { indexDefinition1.Name, indexDefinition1 },
  198. { indexDefinition2.Name, indexDefinition2 }
  199. });
  200. var results = merger.ProposeIndexMergeSuggestions();
  201. Assert.Equal(1, results.Suggestions.Count);
  202. Assert.Equal(1, results.Suggestions[0].CanDelete.Count);
  203. merger = new IndexMerger(
  204. new Dictionary<string, IndexDefinition>
  205. {
  206. { indexDefinition1.Name, indexDefinition1 },
  207. { indexDefinition3.Name, indexDefinition3 }
  208. });
  209. results = merger.ProposeIndexMergeSuggestions();
  210. Assert.Equal(1, results.Suggestions.Count);
  211. Assert.Equal(1, results.Suggestions[0].CanDelete.Count);
  212. }
  213. [Fact]
  214. public void IndexMergeWithQueryExpressionSyntax()
  215. {
  216. using (var store = GetDocumentStore())
  217. {
  218. var byName = new IndexDefinition
  219. {
  220. Name = "Users_ByName",
  221. Maps = { "from user in docs.Users select new { user.Name }" },
  222. Type = IndexType.Map
  223. };
  224. var byAge = new IndexDefinition
  225. {
  226. Name = "Users_ByAge",
  227. Maps = { "from u in docs.Users select new { u.Age }" },
  228. Type = IndexType.Map
  229. };
  230. var byEmail = new IndexDefinition
  231. {
  232. Name = "Users_ByEmail",
  233. Maps = { "from user in docs.Users select new { user.Email }" },
  234. Type = IndexType.Map
  235. };
  236. store.Maintenance.Send(new PutIndexesOperation(byName, byEmail, byAge));
  237. var dictionary = new Dictionary<string, IndexDefinition>
  238. {
  239. {byName.Name, byName},
  240. {byAge.Name, byAge},
  241. {byEmail.Name, byEmail}
  242. };
  243. var merger = new IndexMerger(dictionary);
  244. var results = merger.ProposeIndexMergeSuggestions();
  245. Assert.Equal(1, results.Suggestions.Count);
  246. var suggestion = results.Suggestions[0];
  247. var index = suggestion.MergedIndex;
  248. Assert.Equal(3, suggestion.CanMerge.Count);
  249. Assert.Equal(@"fromdocindocs.Users
  250. selectnew{Age=doc.Age
  251. ,Email=doc.Email
  252. ,Name=doc.Name
  253. }", index.Maps.First());
  254. }
  255. }
  256. [Fact]
  257. public void IndexMergerWithQueryExpressionSyntaxShouldNotTakeIntoAccountExpressionVariableName()
  258. {
  259. using (var store = GetDocumentStore())
  260. {
  261. var index1 = new IndexDefinition
  262. {
  263. Name = "Users_ByName_1",
  264. Maps = { "from user in docs.Users select new { user.Name }" },
  265. Type = IndexType.Map
  266. };
  267. var index2 = new IndexDefinition
  268. {
  269. Name = "Users_ByName_2",
  270. Maps = { "from u in docs.Users select new { u.Name }" },
  271. Type = IndexType.Map
  272. };
  273. store.Maintenance.Send(new PutIndexesOperation(index1, index2));
  274. var dictionary = new Dictionary<string, IndexDefinition>
  275. {
  276. {index1.Name, index1},
  277. {index2.Name, index2}
  278. };
  279. var merger = new IndexMerger(dictionary);
  280. var results = merger.ProposeIndexMergeSuggestions();
  281. Assert.Equal(1, results.Suggestions.Count);
  282. Assert.Equal(1, results.Suggestions[0].CanDelete.Count);
  283. }
  284. }
  285. }
  286. }