/test/SlowTests/Core/Indexing/ReferencedDocuments.cs

https://github.com/fitzchak/ravendb · C# · 490 lines · 376 code · 105 blank · 9 comment · 18 complexity · a9fbe9c8b07ed6b8596d8d65c6696496 MD5 · raw file

  1. //----------------------------------------------------------------------
  2. // <copyright file="ReferencedDocuments.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. //----------------------------------------------------------------------
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using FastTests;
  9. using Raven.Client;
  10. using Raven.Client.Documents.Indexes;
  11. using Raven.Client.Documents.Operations.Indexes;
  12. using SlowTests.Core.Utils.Entities;
  13. using SlowTests.Core.Utils.Indexes;
  14. using Xunit;
  15. using Company = SlowTests.Core.Utils.Entities.Company;
  16. using Employee = SlowTests.Core.Utils.Entities.Employee;
  17. using Post = SlowTests.Core.Utils.Entities.Post;
  18. using PostContent = SlowTests.Core.Utils.Entities.PostContent;
  19. namespace SlowTests.Core.Indexing
  20. {
  21. public class ReferencedDocuments : RavenTestBase
  22. {
  23. [Fact]
  24. public void CanUseLoadDocumentToIndexReferencedDocs()
  25. {
  26. using (var store = GetDocumentStore())
  27. {
  28. var postsByContent = new Posts_ByContent();
  29. postsByContent.Execute(store);
  30. var companiesWithEmployees = new Companies_WithReferencedEmployees();
  31. companiesWithEmployees.Execute(store);
  32. using (var session = store.OpenSession())
  33. {
  34. for (int i = 0; i < 10; i++)
  35. {
  36. session.Store(new Post
  37. {
  38. Id = "posts/" + i
  39. });
  40. session.Store(new PostContent
  41. {
  42. Id = "posts/" + i + "/content",
  43. Text = i % 2 == 0 ? "HTML 5" : "Javascript"
  44. });
  45. session.Store(new Employee
  46. {
  47. Id = "employees/" + i,
  48. LastName = "Last Name " + i
  49. });
  50. }
  51. session.Store(new Company { EmployeesIds = new List<string>() { "employees/1", "employees/2", "employees/3" } });
  52. session.SaveChanges();
  53. WaitForIndexing(store);
  54. var html5PostsQuery = session.Advanced.DocumentQuery<Post>(postsByContent.IndexName).WhereEquals("Text", "HTML 5");
  55. var javascriptPostsQuery = session.Advanced.DocumentQuery<Post>(postsByContent.IndexName).WhereEquals("Text", "Javascript");
  56. Assert.Equal(5, html5PostsQuery.ToList().Count);
  57. Assert.Equal(5, javascriptPostsQuery.ToList().Count);
  58. var companies = session.Advanced.DocumentQuery<Company>(companiesWithEmployees.IndexName)
  59. .ToArray();
  60. Assert.Equal(1, companies.Length);
  61. }
  62. }
  63. }
  64. [Fact]
  65. public void BasicLoadDocumentsWithEnumerable()
  66. {
  67. using (var store = GetDocumentStore())
  68. {
  69. new Companies_ByEmployeeLastName().Execute(store);
  70. using (var session = store.OpenSession())
  71. {
  72. var employee1 = new Employee { LastName = "Doe" };
  73. var employee2 = new Employee { LastName = "Gates" };
  74. session.Store(employee1);
  75. session.Store(employee2);
  76. var company = new Company
  77. {
  78. Name = "HR",
  79. EmployeesIds = new List<string>
  80. {
  81. employee1.Id,
  82. employee2.Id
  83. }
  84. };
  85. session.Store(company);
  86. session.SaveChanges();
  87. }
  88. WaitForIndexing(store);
  89. using (var session = store.OpenSession())
  90. {
  91. var companies = session.Query<Companies_ByEmployeeLastName.Result, Companies_ByEmployeeLastName>()
  92. .Where(x => x.LastName == "Gates")
  93. .OfType<Company>()
  94. .ToList();
  95. Assert.Equal(1, companies.Count);
  96. Assert.Equal("HR", companies[0].Name);
  97. }
  98. }
  99. }
  100. [Fact]
  101. public void BasicLoadDocuments()
  102. {
  103. using (var store = GetDocumentStore())
  104. {
  105. new Users_ByCity().Execute(store);
  106. using (var session = store.OpenSession())
  107. {
  108. var address1 = new Address { City = "New York" };
  109. var address2 = new Address { City = "Warsaw" };
  110. session.Store(address1);
  111. session.Store(address2);
  112. var user1 = new User
  113. {
  114. LastName = "Doe",
  115. AddressId = address1.Id
  116. };
  117. var user2 = new User
  118. {
  119. LastName = "Nowak",
  120. AddressId = address2.Id
  121. };
  122. session.Store(user1);
  123. session.Store(user2);
  124. session.SaveChanges();
  125. }
  126. WaitForIndexing(store);
  127. using (var session = store.OpenSession())
  128. {
  129. var users = session.Query<Users_ByCity.Result, Users_ByCity>()
  130. .Where(x => x.City == "New York")
  131. .OfType<User>()
  132. .ToList();
  133. Assert.Equal(1, users.Count);
  134. Assert.Equal("Doe", users[0].LastName);
  135. var count = session.Query<Users_ByCity.Result, Users_ByCity>()
  136. .Count();
  137. Assert.Equal(2, count);
  138. }
  139. using (var session = store.OpenSession())
  140. {
  141. var address = session.Load<Address>("addresses/1-A");
  142. address.City = "Barcelona";
  143. session.SaveChanges();
  144. }
  145. WaitForIndexing(store);
  146. using (var session = store.OpenSession())
  147. {
  148. var users = session.Query<Users_ByCity.Result, Users_ByCity>()
  149. .Where(x => x.City == "New York")
  150. .OfType<User>()
  151. .ToList();
  152. var address = session.Load<Address>("addresses/1-A");
  153. WaitForUserToContinueTheTest(store);
  154. Assert.Equal(0, users.Count);
  155. users = session.Query<Users_ByCity.Result, Users_ByCity>()
  156. .Where(x => x.City == "Barcelona")
  157. .OfType<User>()
  158. .ToList();
  159. Assert.Equal(1, users.Count);
  160. Assert.Equal("Doe", users[0].LastName);
  161. }
  162. using (var session = store.OpenSession())
  163. {
  164. session.Delete("addresses/1-A");
  165. session.SaveChanges();
  166. }
  167. WaitForIndexing(store);
  168. using (var session = store.OpenSession())
  169. {
  170. // address from LoadDocument will be null so the City value will not get into index
  171. // we cannot expect to return any users here in that case
  172. var users = session.Query<Users_ByCity.Result, Users_ByCity>()
  173. .Where(x => x.City == null)
  174. .OfType<User>()
  175. .ToList();
  176. Assert.Equal(0, users.Count);
  177. }
  178. using (var session = store.OpenSession())
  179. {
  180. var user1 = session.Load<User>("users/1-A");
  181. user1.AddressId = "addresses/2-A";
  182. session.SaveChanges();
  183. }
  184. WaitForIndexing(store);
  185. using (var session = store.OpenSession())
  186. {
  187. var users = session.Query<Users_ByCity.Result, Users_ByCity>()
  188. .Where(x => x.City == "Warsaw")
  189. .OfType<User>()
  190. .ToList();
  191. Assert.Equal(2, users.Count);
  192. }
  193. using (var session = store.OpenSession())
  194. {
  195. session.Delete("users/1-A");
  196. session.SaveChanges();
  197. }
  198. WaitForIndexing(store);
  199. }
  200. }
  201. [Fact]
  202. public void BasicLoadDocuments_Casing()
  203. {
  204. using (var store = GetDocumentStore())
  205. {
  206. store.Maintenance.Send(new PutIndexesOperation(new[] {new IndexDefinition
  207. {
  208. Maps =
  209. {
  210. @"from user in docs.Users
  211. let address1 = LoadDocument(user.AddressId, ""addresses"")
  212. let address2 = LoadDocument(user.AddressId, ""Addresses"")
  213. select new
  214. {
  215. City = address1.City
  216. }"
  217. },
  218. Name = "Users/ByCity"
  219. }}));
  220. using (var session = store.OpenSession())
  221. {
  222. var address1 = new Address { City = "New York" };
  223. var address2 = new Address { City = "Warsaw" };
  224. session.Store(address1);
  225. session.Store(address2);
  226. session.Advanced.GetMetadataFor(address2)[Constants.Documents.Metadata.Collection] = "addresses";
  227. var user1 = new User
  228. {
  229. LastName = "Doe",
  230. AddressId = address1.Id
  231. };
  232. var user2 = new User
  233. {
  234. LastName = "Nowak",
  235. AddressId = address2.Id
  236. };
  237. session.Store(user1);
  238. session.Store(user2);
  239. session.SaveChanges();
  240. }
  241. WaitForIndexing(store);
  242. using (var session = store.OpenSession())
  243. {
  244. var users = session.Query<Users_ByCity.Result, Users_ByCity>()
  245. .Where(x => x.City == "New York")
  246. .OfType<User>()
  247. .ToList();
  248. Assert.Equal(1, users.Count);
  249. Assert.Equal("Doe", users[0].LastName);
  250. var count = session.Query<Users_ByCity.Result, Users_ByCity>()
  251. .Count();
  252. Assert.Equal(2, count);
  253. }
  254. using (var session = store.OpenSession())
  255. {
  256. var address = session.Load<Address>("addresses/1-A");
  257. address.City = "Barcelona";
  258. session.SaveChanges();
  259. }
  260. WaitForIndexing(store);
  261. using (var session = store.OpenSession())
  262. {
  263. var users = session.Query<Users_ByCity.Result, Users_ByCity>()
  264. .Where(x => x.City == "New York")
  265. .OfType<User>()
  266. .ToList();
  267. Assert.Equal(0, users.Count);
  268. users = session.Query<Users_ByCity.Result, Users_ByCity>()
  269. .Where(x => x.City == "Barcelona")
  270. .OfType<User>()
  271. .ToList();
  272. Assert.Equal(1, users.Count);
  273. Assert.Equal("Doe", users[0].LastName);
  274. }
  275. using (var session = store.OpenSession())
  276. {
  277. session.Delete("addresses/1-A");
  278. session.SaveChanges();
  279. }
  280. WaitForIndexing(store);
  281. using (var session = store.OpenSession())
  282. {
  283. // address from LoadDocument will be null so the City value will not get into index
  284. // we cannot expect to return any users here in that case
  285. var users = session.Query<Users_ByCity.Result, Users_ByCity>()
  286. .Where(x => x.City == null)
  287. .OfType<User>()
  288. .ToList();
  289. Assert.Equal(0, users.Count);
  290. }
  291. using (var session = store.OpenSession())
  292. {
  293. var user1 = session.Load<User>("users/1-A");
  294. user1.AddressId = "addresses/2-A";
  295. session.SaveChanges();
  296. }
  297. WaitForIndexing(store);
  298. using (var session = store.OpenSession())
  299. {
  300. var users = session.Query<Users_ByCity.Result, Users_ByCity>()
  301. .Where(x => x.City == "Warsaw")
  302. .OfType<User>()
  303. .ToList();
  304. Assert.Equal(2, users.Count);
  305. }
  306. using (var session = store.OpenSession())
  307. {
  308. session.Delete("users/1-A");
  309. session.SaveChanges();
  310. }
  311. WaitForIndexing(store);
  312. }
  313. }
  314. [Fact]
  315. public void ShouldReindexOnReferencedDocumentChange()
  316. {
  317. using (var store = GetDocumentStore())
  318. {
  319. var postsByContent = new Posts_ByContent();
  320. postsByContent.Execute(store);
  321. using (var session = store.OpenSession())
  322. {
  323. PostContent last = null;
  324. for (int i = 0; i < 3; i++)
  325. {
  326. session.Store(new Post
  327. {
  328. Id = "posts/" + i
  329. });
  330. session.Store(last = new PostContent
  331. {
  332. Id = "posts/" + i + "/content",
  333. Text = i % 2 == 0 ? "HTML 5" : "Javascript"
  334. });
  335. }
  336. session.SaveChanges();
  337. WaitForIndexing(store);
  338. Assert.Equal(2, session.Advanced.DocumentQuery<Post>(postsByContent.IndexName).WhereEquals("Text", "HTML 5").ToList().Count);
  339. Assert.Equal(1, session.Advanced.DocumentQuery<Post>(postsByContent.IndexName).WhereEquals("Text", "Javascript").ToList().Count);
  340. last.Text = "JSON"; // referenced document change
  341. session.Store(last);
  342. session.SaveChanges();
  343. WaitForIndexing(store);
  344. Assert.Equal(1, session.Advanced.DocumentQuery<Post>(postsByContent.IndexName).WhereEquals("Text", "HTML 5").ToList().Count);
  345. Assert.Equal(1, session.Advanced.DocumentQuery<Post>(postsByContent.IndexName).WhereEquals("Text", "Javascript").ToList().Count);
  346. Assert.Equal(1, session.Advanced.DocumentQuery<Post>(postsByContent.IndexName).WhereEquals("Text", "JSON").ToList().Count);
  347. session.Delete(last); // referenced document delete
  348. session.SaveChanges();
  349. WaitForIndexing(store);
  350. Assert.Equal(0, session.Advanced.DocumentQuery<Post>(postsByContent.IndexName).WhereEquals("Text", "JSON").ToList().Count);
  351. }
  352. }
  353. }
  354. [Fact]
  355. public void CanProceedWhenReferencedDocumentsAreMissing()
  356. {
  357. using (var store = GetDocumentStore())
  358. {
  359. var postsByContent = new Posts_ByContent();
  360. postsByContent.Execute(store);
  361. using (var session = store.OpenSession())
  362. {
  363. for (int i = 0; i < 10; i++)
  364. {
  365. session.Store(new Post
  366. {
  367. Id = "posts/" + i
  368. });
  369. if (i % 2 == 0)
  370. {
  371. session.Store(new PostContent
  372. {
  373. Id = "posts/" + i + "/content",
  374. Text = "HTML 5"
  375. });
  376. }
  377. }
  378. session.SaveChanges();
  379. WaitForIndexing(store);
  380. Assert.Equal(5, session.Advanced.DocumentQuery<Post>(postsByContent.IndexName).WhereEquals("Text", null).ToList().Count);
  381. }
  382. }
  383. }
  384. }
  385. }