/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs

https://github.com/okb/nhibernate-core · C# · 306 lines · 255 code · 51 blank · 0 comment · 4 complexity · 471e9af582f621d6b0ec4c5cf5a7f400 MD5 · raw file

  1. using NHibernate.Driver;
  2. using NHibernate.Linq;
  3. using NUnit.Framework;
  4. using System.Linq;
  5. namespace NHibernate.Test.NHSpecificTest.Futures
  6. {
  7. [TestFixture]
  8. public class LinqFutureFixture : FutureFixture
  9. {
  10. [Test]
  11. public void CoalesceShouldWorkForFutures()
  12. {
  13. int personId;
  14. using (ISession s = OpenSession())
  15. using (ITransaction tx = s.BeginTransaction())
  16. {
  17. var p1 = new Person { Name = "inserted name" };
  18. var p2 = new Person { Name = null };
  19. s.Save(p1);
  20. s.Save(p2);
  21. personId = p2.Id;
  22. tx.Commit();
  23. }
  24. using (ISession s = OpenSession())
  25. using (s.BeginTransaction())
  26. {
  27. var person = s.Query<Person>().Where(p => (p.Name ?? "e") == "e").ToFutureValue();
  28. Assert.AreEqual(personId, person.Value.Id);
  29. }
  30. using (ISession s = OpenSession())
  31. using (ITransaction tx = s.BeginTransaction())
  32. {
  33. s.Delete("from Person");
  34. tx.Commit();
  35. }
  36. }
  37. [Test]
  38. [Ignore("Currently broken, see NH-2897")]
  39. public void CanUseToFutureWithContains()
  40. {
  41. using (var s = sessions.OpenSession())
  42. {
  43. var ids = new[] { 1, 2, 3 };
  44. var persons10 = s.Query<Person>()
  45. .Where(p => ids.Contains(p.Id))
  46. .FetchMany(p => p.Children)
  47. .Skip(5)
  48. .Take(10)
  49. .ToFuture().ToList();
  50. Assert.IsNotNull(persons10);
  51. Assert.Pass();
  52. }
  53. }
  54. [Test]
  55. public void CanUseSkipAndFetchManyWithToFuture()
  56. {
  57. using (var s = sessions.OpenSession())
  58. using (var tx = s.BeginTransaction())
  59. {
  60. var p1 = new Person { Name = "Parent" };
  61. var p2 = new Person { Parent = p1, Name = "Child" };
  62. p1.Children.Add(p2);
  63. s.Save(p1);
  64. s.Save(p2);
  65. tx.Commit();
  66. s.Clear(); // we don't want caching
  67. }
  68. using (var s = sessions.OpenSession())
  69. {
  70. IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();
  71. var persons10 = s.Query<Person>()
  72. .FetchMany(p => p.Children)
  73. .Skip(5)
  74. .Take(10)
  75. .ToFuture();
  76. var persons5 = s.Query<Person>()
  77. .ToFuture();
  78. using (var logSpy = new SqlLogSpy())
  79. {
  80. foreach (var person in persons5) { }
  81. foreach (var person in persons10) { }
  82. var events = logSpy.Appender.GetEvents();
  83. Assert.AreEqual(1, events.Length);
  84. }
  85. }
  86. using (ISession s = OpenSession())
  87. using (ITransaction tx = s.BeginTransaction())
  88. {
  89. s.Delete("from Person");
  90. tx.Commit();
  91. }
  92. }
  93. [Test]
  94. public void CanUseFutureQuery()
  95. {
  96. using (var s = sessions.OpenSession())
  97. {
  98. IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();
  99. var persons10 = s.Query<Person>()
  100. .Take(10)
  101. .ToFuture();
  102. var persons5 = s.Query<Person>()
  103. .Take(5)
  104. .ToFuture();
  105. using (var logSpy = new SqlLogSpy())
  106. {
  107. foreach (var person in persons5)
  108. {
  109. }
  110. foreach (var person in persons10)
  111. {
  112. }
  113. var events = logSpy.Appender.GetEvents();
  114. Assert.AreEqual(1, events.Length);
  115. }
  116. }
  117. }
  118. [Test]
  119. public void CanUseFutureQueryWithAnonymousType()
  120. {
  121. using (var s = sessions.OpenSession())
  122. {
  123. IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();
  124. var persons = s.Query<Person>()
  125. .Select(p => new { Id = p.Id, Name = p.Name })
  126. .ToFuture();
  127. var persons5 = s.Query<Person>()
  128. .Select(p => new { Id = p.Id, Name = p.Name })
  129. .Take(5)
  130. .ToFuture();
  131. using (var logSpy = new SqlLogSpy())
  132. {
  133. persons5.ToList(); // initialize the enumerable
  134. persons.ToList();
  135. var events = logSpy.Appender.GetEvents();
  136. Assert.AreEqual(1, events.Length);
  137. }
  138. }
  139. }
  140. [Test]
  141. public void CanUseFutureFetchQuery()
  142. {
  143. IDriver driver = sessions.ConnectionProvider.Driver;
  144. if (!driver.SupportsMultipleQueries)
  145. {
  146. Assert.Ignore("Driver {0} does not support multi-queries", driver.GetType().FullName);
  147. }
  148. using (var s = sessions.OpenSession())
  149. using (var tx = s.BeginTransaction())
  150. {
  151. var p1 = new Person { Name = "Parent" };
  152. var p2 = new Person { Parent = p1, Name = "Child" };
  153. p1.Children.Add(p2);
  154. s.Save(p1);
  155. s.Save(p2);
  156. tx.Commit();
  157. s.Clear(); // we don't want caching
  158. }
  159. using (var s = sessions.OpenSession())
  160. {
  161. IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();
  162. var persons = s.Query<Person>()
  163. .FetchMany(p => p.Children)
  164. .ToFuture();
  165. var persons10 = s.Query<Person>()
  166. .FetchMany(p => p.Children)
  167. .Take(10)
  168. .ToFuture();
  169. using (var logSpy = new SqlLogSpy())
  170. {
  171. Assert.That(persons.Any(x => x.Children.Any()), "No children found");
  172. Assert.That(persons10.Any(x => x.Children.Any()), "No children found");
  173. var events = logSpy.Appender.GetEvents();
  174. Assert.AreEqual(1, events.Length);
  175. }
  176. }
  177. using (ISession s = OpenSession())
  178. using (ITransaction tx = s.BeginTransaction())
  179. {
  180. s.Delete("from Person");
  181. tx.Commit();
  182. }
  183. }
  184. [Test]
  185. public void TwoFuturesRunInTwoRoundTrips()
  186. {
  187. using (var s = sessions.OpenSession())
  188. {
  189. IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();
  190. using (var logSpy = new SqlLogSpy())
  191. {
  192. var persons10 = s.Query<Person>()
  193. .Take(10)
  194. .ToFuture();
  195. foreach (var person in persons10) { } // fire first future round-trip
  196. var persons5 = s.Query<Person>()
  197. .Take(5)
  198. .ToFuture();
  199. foreach (var person in persons5) { } // fire second future round-trip
  200. var events = logSpy.Appender.GetEvents();
  201. Assert.AreEqual(2, events.Length);
  202. }
  203. }
  204. }
  205. [Test]
  206. public void CanCombineSingleFutureValueWithEnumerableFutures()
  207. {
  208. using (var s = sessions.OpenSession())
  209. {
  210. IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();
  211. var persons = s.Query<Person>()
  212. .Take(10)
  213. .ToFuture();
  214. var personCount = s.Query<Person>()
  215. .Select(x => x.Id)
  216. .ToFutureValue();
  217. using (var logSpy = new SqlLogSpy())
  218. {
  219. long count = personCount.Value;
  220. foreach (var person in persons)
  221. {
  222. }
  223. var events = logSpy.Appender.GetEvents();
  224. Assert.AreEqual(1, events.Length);
  225. }
  226. }
  227. }
  228. [Test]
  229. public void CanExecuteMultipleQueriesOnSameExpression()
  230. {
  231. using (var s = sessions.OpenSession())
  232. {
  233. IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();
  234. var meContainer = s.Query<Person>()
  235. .Where(x => x.Id == 1)
  236. .ToFutureValue();
  237. var possiblefriends = s.Query<Person>()
  238. .Where(x => x.Id != 2)
  239. .ToFuture();
  240. using (var logSpy = new SqlLogSpy())
  241. {
  242. var me = meContainer.Value;
  243. foreach (var person in possiblefriends)
  244. {
  245. }
  246. var events = logSpy.Appender.GetEvents();
  247. Assert.AreEqual(1, events.Length);
  248. var wholeLog = logSpy.GetWholeLog();
  249. string paramPrefix = ((DriverBase)Sfi.ConnectionProvider.Driver).NamedPrefix;
  250. Assert.True(wholeLog.Contains(paramPrefix + "p0 = 1 [Type: Int32 (0)], " + paramPrefix + "p1 = 2 [Type: Int32 (0)]"));
  251. }
  252. }
  253. }
  254. }
  255. }