/Xtensive.Storage/Xtensive.Storage.Tests/Storage/Prefetch/PrefetchTestHelper.cs

https://code.google.com/p/dataobjectsdotnet/ · C# · 145 lines · 129 code · 11 blank · 5 comment · 9 complexity · f92e7951c4eb8b00fd9e07c477ad8fe6 MD5 · raw file

  1. // Copyright (C) 2003-2010 Xtensive LLC.
  2. // All rights reserved.
  3. // For conditions of distribution and use, see license.
  4. // Created by: Alexander Nikolaev
  5. // Created: 2009.10.10
  6. using System;
  7. using System.Linq;
  8. using Xtensive.Core.Tuples;
  9. using Xtensive.Storage.Internals;
  10. using Xtensive.Storage.Internals.Prefetch;
  11. using Xtensive.Storage.Model;
  12. using NUnit.Framework;
  13. using Xtensive.Storage.Providers;
  14. using Xtensive.Storage.Tests.Storage.Prefetch.Model;
  15. namespace Xtensive.Storage.Tests.Storage.Prefetch
  16. {
  17. public static class PrefetchTestHelper
  18. {
  19. public static void AssertOnlyDefaultColumnsAreLoaded(Key key, TypeInfo type, Session session)
  20. {
  21. AssertOnlySpecifiedColumnsAreLoaded(key, type, session, IsFieldToBeLoadedByDefault);
  22. }
  23. public static void AssertOnlySpecifiedColumnsAreLoaded(Key key, TypeInfo type, Session session,
  24. Func<FieldInfo, bool> fieldSelector)
  25. {
  26. var state = session.EntityStateCache[key, true];
  27. var realType = state.Key.Type;
  28. Assert.IsTrue(realType.Equals(type)
  29. || realType.GetAncestors().Contains(type)
  30. || (type.IsInterface && realType.GetInterfaces(true).Contains(type)));
  31. var tuple = state.Tuple;
  32. Assert.IsNotNull(tuple);
  33. foreach (var field in type.Fields) {
  34. var isFieldSelected = false;
  35. if (!field.IsStructure)
  36. isFieldSelected = fieldSelector.Invoke(field);
  37. foreach (var column in field.Columns) {
  38. if (field.IsStructure)
  39. isFieldSelected = fieldSelector.Invoke(column.Field);
  40. var isAvailable = tuple.GetFieldState(type.Columns.IndexOf(column)).IsAvailable();
  41. if (isFieldSelected)
  42. Assert.IsTrue(isAvailable);
  43. else
  44. Assert.IsFalse(isAvailable);
  45. }
  46. }
  47. }
  48. public static bool IsFieldToBeLoadedByDefault(FieldInfo field)
  49. {
  50. return field.IsPrimaryKey || field.IsSystem || !field.IsLazyLoad && !field.IsEntitySet;
  51. }
  52. public static void AssertReferencedEntityIsLoaded(Key key, Session session, FieldInfo referencingField)
  53. {
  54. var state = session.EntityStateCache[key, true];
  55. var foreignKeyValue = referencingField.Association.ExtractForeignKey(state.Type, state.Tuple);
  56. var foreignKey = Key.Create(session.Domain, referencingField.Association.TargetType,
  57. TypeReferenceAccuracy.BaseType, foreignKeyValue);
  58. AssertOnlySpecifiedColumnsAreLoaded(foreignKey, referencingField.Association.TargetType,
  59. session, IsFieldToBeLoadedByDefault);
  60. }
  61. public static void AssertEntitySetIsFullyLoaded(Key ownerKey, FieldInfo referencingField,
  62. int expectedCount, Session session)
  63. {
  64. EntitySetState setState;
  65. session.Handler.TryGetEntitySetState(ownerKey, referencingField, out setState);
  66. Assert.IsTrue(setState.IsFullyLoaded);
  67. Assert.AreEqual(expectedCount, setState.TotalItemCount);
  68. }
  69. public static void FillDataBase(Domain domain)
  70. {
  71. using (var session = Session.Open(domain))
  72. using (var transactionScope = Transaction.Open()) {
  73. FillDataBase(session);
  74. transactionScope.Complete();
  75. }
  76. }
  77. internal static void InvokePrefetch(this PrefetchManager prefetchManager, Key key, TypeInfo type,
  78. params PrefetchFieldDescriptor[] descriptors)
  79. {
  80. prefetchManager.Prefetch(key, type, new FieldDescriptorCollection(descriptors));
  81. }
  82. public static void InvokePrefetch(this SessionHandler sessionHandler, Key key, TypeInfo type,
  83. params PrefetchFieldDescriptor[] descriptors)
  84. {
  85. sessionHandler.Prefetch(key, type, new FieldDescriptorCollection(descriptors));
  86. }
  87. public static void FillDataBase(Session session)
  88. {
  89. var customer1 = new Customer {Name = "Customer1", Age = 25, City = "A"};
  90. var customer2 = new Customer {Name = "Customer2", Age = 30, City = "B"};
  91. var supplier1 = new Supplier {Name = "Supplier1", Age = 27};
  92. var supplier2 = new Supplier {Name = "Supplier2", Age = 35};
  93. var employee1 = new Employee {Name = "Employee1"};
  94. var employee2 = new Employee {Name = "Employee2"};
  95. var product1 = new Product {Name = "Product1", Supplier = supplier1};
  96. var product2 = new Product {Name = "Product2", Supplier = supplier1};
  97. var product3 = new Product {Name = "Product3", Supplier = supplier2};
  98. var product4 = new Product {Name = "Product4", Supplier = supplier2};
  99. var order1 = new Order {Number = 1, Customer = customer1, Employee = employee1};
  100. var order1Detail1 = new OrderDetail {Order = order1, Product = product1, Count = 100};
  101. var order1Detail2 = new OrderDetail {Order = order1, Product = product2, Count = 200};
  102. var order1Detail3 = new OrderDetail {Order = order1, Product = product3, Count = 300};
  103. var order1Detail4 = new OrderDetail {Order = order1, Product = product4, Count = 400};
  104. var order2 = new Order {Number = 2, Customer = customer2, Employee = employee2};
  105. var order2Detail1 = new OrderDetail {Order = order2, Product = product3, Count = 300};
  106. var order2Detail2 = new OrderDetail {Order = order2, Product = product4, Count = 400};
  107. var order3 = new Order {Number = 3, Customer = customer1, Employee = employee1};
  108. var order3Detail1 = new OrderDetail {Order = order3, Product = product1, Count = 50};
  109. var order3Detail2 = new OrderDetail {Order = order3, Product = product4, Count = 200};
  110. }
  111. public static void CreateOfferContainer(Domain domain, out Key contaierKey, out Key book0Key,
  112. out Key bookShop0Key, out Key book1Key, out Key bookShop1Key)
  113. {
  114. using (Session.Open(domain))
  115. using (var tx = Transaction.Open()) {
  116. var book0 = new Book {Category = "abc", Title = new Title {Text = "title"}};
  117. book0Key = book0.Key;
  118. var bookShop0 = new BookShop {Name = "a"};
  119. bookShop0Key = bookShop0.Key;
  120. var offer0 = new Offer {Book = book0, BookShop = bookShop0, Number = 3};
  121. var book1 = new Book {Category = "abc", Title = new Title {Text = "title"}};
  122. book1Key = book1.Key;
  123. var bookShop1 = new BookShop {Name = "a"};
  124. bookShop1Key = bookShop1.Key;
  125. var offer1 = new Offer {Book = book1, BookShop = bookShop1, Number = 5};
  126. var intermediateOffer = new IntermediateOffer {RealOffer = offer1, Number = 15};
  127. contaierKey = new OfferContainer {
  128. RealOffer = offer0, IntermediateOffer = intermediateOffer, AuxField = "test"
  129. }.Key;
  130. tx.Complete();
  131. }
  132. }
  133. }
  134. }