/test/SlowTests/Tests/Queries/Includes.cs

https://github.com/fitzchak/ravendb · C# · 552 lines · 455 code · 85 blank · 12 comment · 0 complexity · 9419658def8a8dbc0f0808caedf45720 MD5 · raw file

  1. using System;
  2. using System.Linq;
  3. using FastTests;
  4. using Raven.Client.Documents;
  5. using Xunit;
  6. namespace SlowTests.Tests.Queries
  7. {
  8. public class Includes : RavenTestBase
  9. {
  10. [Fact]
  11. public void Can_use_includes_within_multi_load()
  12. {
  13. using (var store = GetDocumentStore())
  14. {
  15. using (var session = store.OpenSession())
  16. {
  17. session.Store(new Customer { Id = "users/1", Name = "Daniel Lang" });
  18. session.Store(new Customer { Id = "users/2", Name = "Oren Eini" });
  19. session.Store(new Order { CustomerId = "users/1", Number = "1" });
  20. session.Store(new Order { CustomerId = "users/1", Number = "2" });
  21. session.Store(new Order { CustomerId = "users/2", Number = "3" });
  22. session.SaveChanges();
  23. }
  24. using (var session = store.OpenSession())
  25. {
  26. var orders =
  27. session.Query<Order>()
  28. .Customize(x => x.WaitForNonStaleResults())
  29. .Include(x => x.CustomerId)
  30. .ToList();
  31. Assert.Equal(3, orders.Count);
  32. Assert.Equal(1, session.Advanced.NumberOfRequests);
  33. var customers = session.Load<Customer>(orders.Select(x => x.CustomerId));
  34. Assert.Equal(2, customers.Count);
  35. Assert.Equal(2, customers.Distinct().Count());
  36. Assert.Equal(1, session.Advanced.NumberOfRequests);
  37. }
  38. }
  39. }
  40. [Fact]
  41. public void can_include_by_primary_string_property()
  42. {
  43. using (var store = GetDocumentStore())
  44. {
  45. using (var session = store.OpenSession())
  46. {
  47. session.Store(new Customer { Id = "customers/1" });
  48. session.Store(new Order { CustomerId = "customers/1" }, "orders/1234");
  49. session.SaveChanges();
  50. }
  51. using (var session = store.OpenSession())
  52. {
  53. var order = session.Include<Order>(x => x.CustomerId).Load("orders/1234");
  54. // this will not require querying the server!
  55. var cust = session.Load<Customer>(order.CustomerId);
  56. Assert.NotNull(cust);
  57. Assert.Equal(1, session.Advanced.NumberOfRequests);
  58. }
  59. }
  60. }
  61. [Fact]
  62. public void can_include_by_primary_valuetype_property()
  63. {
  64. using (var store = GetDocumentStore())
  65. {
  66. using (var session = store.OpenSession())
  67. {
  68. session.Store(new Customer2 { Id = "customers/1" });
  69. session.Store(new Order2 { Customer2Id = "customers/1" }, "orders/1234");
  70. session.SaveChanges();
  71. }
  72. using (var session = store.OpenSession())
  73. {
  74. var order = session.Include<Order2, Customer2>(x => x.Customer2Id).Load("orders/1234");
  75. // this will not require querying the server!
  76. var cust = session.Load<Customer2>(order.Customer2Id);
  77. Assert.NotNull(cust);
  78. Assert.Equal(1, session.Advanced.NumberOfRequests);
  79. }
  80. }
  81. }
  82. [Fact]
  83. public void can_include_by_primary_valuetype_string_property()
  84. {
  85. using (var store = GetDocumentStore())
  86. {
  87. using (var session = store.OpenSession())
  88. {
  89. session.Store(new Customer2 { Id = "customers/1" });
  90. session.Store(new Order2 { Customer2Id = "customers/1" }, "orders/1234");
  91. session.SaveChanges();
  92. }
  93. using (var session = store.OpenSession())
  94. {
  95. var order = session.Include<Order2, Customer2>(x => x.Customer2IdString).Load("orders/1234");
  96. // this will not require querying the server!
  97. var cust = session.Load<Customer2>(order.Customer2Id);
  98. Assert.NotNull(cust);
  99. Assert.Equal(1, session.Advanced.NumberOfRequests);
  100. }
  101. }
  102. }
  103. [Fact]
  104. public void can_query_with_include_by_primary_string_property()
  105. {
  106. using (var store = GetDocumentStore())
  107. {
  108. using (var session = store.OpenSession())
  109. {
  110. session.Store(new Customer { Id = "customers/1", Name = "1" });
  111. session.Store(new Customer { Id = "customers/2", Name = "2" });
  112. session.Store(new Customer { Id = "customers/3", Name = "3" });
  113. session.Store(new Order { CustomerId = "customers/1", TotalPrice = 200D }, "orders/1234");
  114. session.Store(new Order { CustomerId = "customers/2", TotalPrice = 50D }, "orders/1235");
  115. session.Store(new Order { CustomerId = "customers/3", TotalPrice = 300D }, "orders/1236");
  116. session.SaveChanges();
  117. }
  118. using (var session = store.OpenSession())
  119. {
  120. var orders =
  121. session.Query<Order>()
  122. .Include(x => x.CustomerId)
  123. .Where(x => x.TotalPrice > 100)
  124. .ToList();
  125. Assert.Equal(2, orders.Count);
  126. foreach (var order in orders)
  127. {
  128. // this will not require querying the server!
  129. var cust = session.Load<Customer>(order.CustomerId);
  130. Assert.NotNull(cust);
  131. }
  132. Assert.Equal(1, session.Advanced.NumberOfRequests);
  133. }
  134. }
  135. }
  136. [Fact]
  137. public void can_query_with_include_by_primary_valuetype_property()
  138. {
  139. using (var store = GetDocumentStore())
  140. {
  141. using (var session = store.OpenSession())
  142. {
  143. session.Store(new Customer2 { Id = "customers/1", Name = "1" });
  144. session.Store(new Customer2 { Id = "customers/2", Name = "2" });
  145. session.Store(new Customer2 { Id = "customers/3", Name = "3" });
  146. session.Store(new Order2 { Customer2Id = "customers/1", TotalPrice = 200D }, "orders/1234");
  147. session.Store(new Order2 { Customer2Id = "customers/2", TotalPrice = 50D }, "orders/1235");
  148. session.Store(new Order2 { Customer2Id = "customers/3", TotalPrice = 300D }, "orders/1236");
  149. session.SaveChanges();
  150. }
  151. using (var session = store.OpenSession())
  152. {
  153. var orders =
  154. session.Query<Order2>()
  155. .Include(x => x.Customer2Id)
  156. .Where(x => x.TotalPrice > 100)
  157. .ToList();
  158. Assert.Equal(2, orders.Count);
  159. foreach (var order in orders)
  160. {
  161. // this will not require querying the server!
  162. var cust = session.Load<Customer2>(order.Customer2Id);
  163. Assert.NotNull(cust);
  164. }
  165. Assert.Equal(1, session.Advanced.NumberOfRequests);
  166. }
  167. }
  168. }
  169. [Fact]
  170. public void can_include_by_primary_list_of_strings()
  171. {
  172. using (var store = GetDocumentStore())
  173. {
  174. using (var session = store.OpenSession())
  175. {
  176. session.Store(new Supplier { Name = "1" });
  177. session.Store(new Supplier { Name = "2" });
  178. session.Store(new Supplier { Name = "3" });
  179. session.Store(
  180. new Order { SupplierIds = new[] { "suppliers/1-A", "suppliers/2-A", "suppliers/3-A" } },
  181. "orders/1234");
  182. session.SaveChanges();
  183. }
  184. using (var session = store.OpenSession())
  185. {
  186. var order = session.Include<Order>(x => x.SupplierIds).Load("orders/1234");
  187. Assert.Equal(3, order.SupplierIds.Count());
  188. foreach (var supplierId in order.SupplierIds)
  189. {
  190. // this will not require querying the server!
  191. var supp = session.Load<Supplier>(supplierId);
  192. Assert.NotNull(supp);
  193. }
  194. Assert.Equal(1, session.Advanced.NumberOfRequests);
  195. }
  196. }
  197. }
  198. [Fact]
  199. public void can_include_by_primary_list_of_valuetypes()
  200. {
  201. using (var store = GetDocumentStore())
  202. {
  203. using (var session = store.OpenSession())
  204. {
  205. var guid1 = Guid.NewGuid().ToString();
  206. var guid2 = Guid.NewGuid().ToString();
  207. var guid3 = Guid.NewGuid().ToString();
  208. session.Store(new Supplier2 { Id = guid1, Name = "1" });
  209. session.Store(new Supplier2 { Id = guid2, Name = "2" });
  210. session.Store(new Supplier2 { Id = guid3, Name = "3" });
  211. session.Store(new Order2 { Supplier2Ids = new[] { guid1, guid2, guid3 } }, "orders/1234");
  212. session.SaveChanges();
  213. }
  214. using (var session = store.OpenSession())
  215. {
  216. var order = session.Include<Order2, Supplier2>(x => x.Supplier2Ids).Load("orders/1234");
  217. Assert.Equal(3, order.Supplier2Ids.Count());
  218. foreach (var supplier2Id in order.Supplier2Ids)
  219. {
  220. // this will not require querying the server!
  221. var supp2 = session.Load<Supplier2>(supplier2Id);
  222. Assert.NotNull(supp2);
  223. }
  224. Assert.Equal(1, session.Advanced.NumberOfRequests);
  225. }
  226. }
  227. }
  228. [Fact]
  229. public void can_include_by_secondary_string_property()
  230. {
  231. using (var store = GetDocumentStore())
  232. {
  233. using (var session = store.OpenSession())
  234. {
  235. session.Store(new Customer());
  236. session.Store(new Order { Refferal = new Referral { CustomerId = "customers/1-A" } }, "orders/1234");
  237. session.SaveChanges();
  238. }
  239. using (var session = store.OpenSession())
  240. {
  241. var order = session.Include<Order>(x => x.Refferal.CustomerId).Load("orders/1234");
  242. // this will not require querying the server!
  243. var referrer = session.Load<Customer>(order.Refferal.CustomerId);
  244. Assert.NotNull(referrer);
  245. Assert.Equal(1, session.Advanced.NumberOfRequests);
  246. }
  247. }
  248. }
  249. [Fact]
  250. public void can_include_by_secondary_valuetype_property()
  251. {
  252. using (var store = GetDocumentStore())
  253. {
  254. using (var session = store.OpenSession())
  255. {
  256. session.Store(new Customer2 { Id = "customers/1" });
  257. session.Store(new Order2 { Refferal2 = new Referral2 { Customer2Id = "customers/1" } }, "orders/1234");
  258. session.SaveChanges();
  259. }
  260. using (var session = store.OpenSession())
  261. {
  262. var order = session.Include<Order2, Customer2>(x => x.Refferal2.Customer2Id).Load("orders/1234");
  263. // this will not require querying the server!
  264. var referrer2 = session.Load<Customer2>(order.Refferal2.Customer2Id);
  265. Assert.NotNull(referrer2);
  266. Assert.Equal(1, session.Advanced.NumberOfRequests);
  267. }
  268. }
  269. }
  270. [Fact]
  271. public void can_include_by_list_of_secondary_string_property()
  272. {
  273. using (var store = GetDocumentStore())
  274. {
  275. using (var session = store.OpenSession())
  276. {
  277. session.Store(new Product { Name = "1" });
  278. session.Store(new Product { Name = "2" });
  279. session.Store(new Product { Name = "3" });
  280. session.Store(
  281. new Order
  282. {
  283. LineItems =
  284. new[]
  285. {
  286. new LineItem { ProductId = "products/1-A" },
  287. new LineItem { ProductId = "products/2-A" },
  288. new LineItem { ProductId = "products/3-A" }
  289. }
  290. },
  291. "orders/1234");
  292. session.SaveChanges();
  293. }
  294. using (var session = store.OpenSession())
  295. {
  296. var order = session.Include<Order>(x => x.LineItems.Select(li => li.ProductId)).Load("orders/1234");
  297. foreach (var lineItem in order.LineItems)
  298. {
  299. // this will not require querying the server!
  300. var product = session.Load<Product>(lineItem.ProductId);
  301. Assert.NotNull(product);
  302. }
  303. Assert.Equal(1, session.Advanced.NumberOfRequests);
  304. }
  305. }
  306. }
  307. [Fact]
  308. public void can_include_by_list_of_secondary_valuetype_property()
  309. {
  310. using (var store = GetDocumentStore())
  311. {
  312. using (var session = store.OpenSession())
  313. {
  314. var guid1 = Guid.NewGuid().ToString();
  315. var guid2 = Guid.NewGuid().ToString();
  316. var guid3 = Guid.NewGuid().ToString();
  317. session.Store(new Product2 { Id = guid1, Name = "1" });
  318. session.Store(new Product2 { Id = guid2, Name = "2" });
  319. session.Store(new Product2 { Id = guid3, Name = "3" });
  320. session.Store(
  321. new Order2
  322. {
  323. LineItem2s =
  324. new[]
  325. {
  326. new LineItem2 { Product2Id = guid1 },
  327. new LineItem2 { Product2Id = guid2 },
  328. new LineItem2 { Product2Id = guid3 }
  329. }
  330. },
  331. "orders/1234");
  332. session.SaveChanges();
  333. }
  334. using (var session = store.OpenSession())
  335. {
  336. var order =
  337. session.Include<Order2, Product2>(x => x.LineItem2s.Select(li => li.Product2Id))
  338. .Load("orders/1234");
  339. foreach (var lineItem2 in order.LineItem2s)
  340. {
  341. // this will not require querying the server!
  342. var product2 = session.Load<Product2>(lineItem2.Product2Id);
  343. Assert.NotNull(product2);
  344. }
  345. Assert.Equal(1, session.Advanced.NumberOfRequests);
  346. }
  347. }
  348. }
  349. [Fact]
  350. public void can_include_by_denormalized_property()
  351. {
  352. using (var store = GetDocumentStore())
  353. {
  354. using (var session = store.OpenSession())
  355. {
  356. session.Store(new Customer2 { Id = "customers/1" });
  357. session.Store(new Order3 { Customer = new DenormalizedCustomer { Id = "customers/1" } }, "orders/1234");
  358. session.SaveChanges();
  359. }
  360. using (var session = store.OpenSession())
  361. {
  362. var order = session.Include<Order3, Customer2>(x => x.Customer.Id).Load("orders/1234");
  363. // this will not require querying the server!
  364. var fullCustomer = session.Load<Customer2>(order.Customer.Id);
  365. Assert.NotNull(fullCustomer);
  366. Assert.Equal(1, session.Advanced.NumberOfRequests);
  367. }
  368. }
  369. }
  370. private class Order
  371. {
  372. public string Number { get; set; }
  373. public string CustomerId { get; set; }
  374. public string[] SupplierIds { get; set; }
  375. public Referral Refferal { get; set; }
  376. public LineItem[] LineItems { get; set; }
  377. public double TotalPrice { get; set; }
  378. }
  379. private class Order2
  380. {
  381. public string Customer2Id { get; set; }
  382. public string Customer2IdString => Customer2Id;
  383. public string[] Supplier2Ids { get; set; }
  384. public Referral2 Refferal2 { get; set; }
  385. public LineItem2[] LineItem2s { get; set; }
  386. public double TotalPrice { get; set; }
  387. }
  388. private class Order3
  389. {
  390. public DenormalizedCustomer Customer { get; set; }
  391. public string[] SupplierIds { get; set; }
  392. public Referral Refferal { get; set; }
  393. public LineItem[] LineItems { get; set; }
  394. public double TotalPrice { get; set; }
  395. }
  396. private class Customer
  397. {
  398. public string Id { get; set; }
  399. public string Name { get; set; }
  400. public string Address { get; set; }
  401. public short Age { get; set; }
  402. public string HashedPassword { get; set; }
  403. }
  404. private class Customer2
  405. {
  406. public string Id { get; set; }
  407. public string Name { get; set; }
  408. public string Address { get; set; }
  409. public short Age { get; set; }
  410. public string HashedPassword { get; set; }
  411. }
  412. private class DenormalizedCustomer
  413. {
  414. public string Id { get; set; }
  415. public string Name { get; set; }
  416. public string Address { get; set; }
  417. }
  418. private class Supplier
  419. {
  420. public string Name { get; set; }
  421. public string Address { get; set; }
  422. }
  423. private class Supplier2
  424. {
  425. public string Id { get; set; }
  426. public string Name { get; set; }
  427. public string Address { get; set; }
  428. }
  429. private class Referral
  430. {
  431. public string CustomerId { get; set; }
  432. public double CommissionPercentage { get; set; }
  433. }
  434. private class Referral2
  435. {
  436. public string Customer2Id { get; set; }
  437. public double CommissionPercentage { get; set; }
  438. }
  439. private class LineItem
  440. {
  441. public string ProductId { get; set; }
  442. public string Name { get; set; }
  443. public int Quantity { get; set; }
  444. public double Price { get; set; }
  445. }
  446. private class LineItem2
  447. {
  448. public string Product2Id { get; set; }
  449. public string Name { get; set; }
  450. public int Quantity { get; set; }
  451. public double Price { get; set; }
  452. }
  453. private class Product
  454. {
  455. public string Name { get; set; }
  456. public string[] Images { get; set; }
  457. public double Price { get; set; }
  458. }
  459. private class Product2
  460. {
  461. public string Id { get; set; }
  462. public string Name { get; set; }
  463. public string[] Images { get; set; }
  464. public double Price { get; set; }
  465. }
  466. }
  467. }