PageRenderTime 51ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/src/NHibernate.Test/Linq/JoinTests.cs

https://github.com/okb/nhibernate-core
C# | 283 lines | 231 code | 36 blank | 16 comment | 12 complexity | ca1edadbf022ea9522fff4406d865166 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, LGPL-2.1, MPL-2.0-no-copyleft-exception, LGPL-3.0, Apache-2.0, CC-BY-SA-3.0
  1. using System;
  2. using System.Linq;
  3. using System.Linq.Expressions;
  4. using NHibernate.DomainModel.Northwind.Entities;
  5. using NUnit.Framework;
  6. namespace NHibernate.Test.Linq
  7. {
  8. [TestFixture]
  9. public class JoinTests : LinqTestCase
  10. {
  11. protected override void Configure(Cfg.Configuration configuration)
  12. {
  13. configuration.SetProperty(Cfg.Environment.ShowSql, "true");
  14. base.Configure(configuration);
  15. }
  16. [Test]
  17. public void OrderLinesWith2ImpliedJoinShouldProduce2JoinsInSql()
  18. {
  19. //NH-3003
  20. using (var spy = new SqlLogSpy())
  21. {
  22. var lines = (from l in db.OrderLines
  23. where l.Order.Customer.CompanyName == "Vins et alcools Chevalier"
  24. select l).ToList();
  25. Assert.AreEqual(10, lines.Count);
  26. var countJoins = CountJoins(spy);
  27. Assert.That(countJoins, Is.EqualTo(2));
  28. }
  29. }
  30. [Test]
  31. public void OrderLinesWith2ImpliedJoinByIdShouldNotContainImpliedJoin()
  32. {
  33. //NH-2946 + NH-3003 = NH-2451
  34. using (var spy = new SqlLogSpy())
  35. {
  36. var lines = (from l in db.OrderLines
  37. where l.Order.Customer.CustomerId == "VINET"
  38. where l.Order.Customer.CompanyName == "Vins et alcools Chevalier"
  39. select l).ToList();
  40. Assert.AreEqual(10, lines.Count);
  41. var countJoins = CountJoins(spy);
  42. Assert.That(countJoins, Is.EqualTo(2));
  43. Assert.That(Count(spy, "Orders"), Is.EqualTo(1));
  44. }
  45. }
  46. [Test]
  47. public void OrderLinesFilterByCustomerIdSelectLineShouldNotContainJoinWithCustomer()
  48. {
  49. //NH-2946
  50. using (var spy = new SqlLogSpy())
  51. {
  52. var lines = (from l in db.OrderLines
  53. where l.Order.Customer.CustomerId == "VINET"
  54. select l).ToList();
  55. Assert.AreEqual(10, lines.Count);
  56. var countJoins = CountJoins(spy);
  57. Assert.That(countJoins, Is.EqualTo(1));
  58. Assert.That(Count(spy, "Customers"), Is.EqualTo(0));
  59. }
  60. }
  61. [Test]
  62. public void OrderLinesFilterByCustomerIdSelectCustomerIdShouldNotContainJoinWithCustomer()
  63. {
  64. //NH-2946
  65. using (var spy = new SqlLogSpy())
  66. {
  67. var lines = (from l in db.OrderLines
  68. where l.Order.Customer.CustomerId == "VINET"
  69. select l.Order.Customer.CustomerId).ToList();
  70. Assert.AreEqual(10, lines.Count);
  71. var countJoins = CountJoins(spy);
  72. Assert.That(countJoins, Is.EqualTo(1));
  73. Assert.That(Count(spy, "Customers"), Is.EqualTo(0));
  74. }
  75. }
  76. [Test]
  77. public void OrderLinesFilterByCustomerIdSelectCustomerShouldContainJoinWithCustomer()
  78. {
  79. //NH-2946
  80. using (var spy = new SqlLogSpy())
  81. {
  82. var lines = (from l in db.OrderLines
  83. where l.Order.Customer.CustomerId == "VINET"
  84. select l.Order.Customer).ToList();
  85. Assert.AreEqual(10, lines.Count);
  86. var countJoins = CountJoins(spy);
  87. Assert.That(countJoins, Is.EqualTo(2));
  88. Assert.That(Count(spy, "Customers"), Is.EqualTo(1));
  89. }
  90. }
  91. [Test]
  92. public void OrderLinesFilterByCustomerCompanyNameAndSelectCustomerIdShouldJoinOrdersOnlyOnce()
  93. {
  94. //NH-2946 + NH-3003 = NH-2451
  95. using (var spy = new SqlLogSpy())
  96. {
  97. var lines = (from l in db.OrderLines
  98. where l.Order.Customer.CompanyName == "Vins et alcools Chevalier"
  99. select l.Order.Customer.CustomerId).ToList();
  100. Assert.AreEqual(10, lines.Count);
  101. var countJoins = CountJoins(spy);
  102. Assert.That(countJoins, Is.EqualTo(2));
  103. Assert.That(Count(spy, "Orders"), Is.EqualTo(1));
  104. }
  105. }
  106. [Test]
  107. public void OrderLinesFilterByOrderDateAndSelectOrderId()
  108. {
  109. //NH-2451
  110. using (var spy = new SqlLogSpy())
  111. {
  112. var lines = (from l in db.OrderLines
  113. where l.Order.OrderDate < DateTime.Now
  114. select l.Order.OrderId).ToList();
  115. Assert.AreEqual(2155, lines.Count);
  116. var countJoins = CountJoins(spy);
  117. Assert.That(countJoins, Is.EqualTo(1));
  118. }
  119. }
  120. [Test]
  121. public void OrderLinesFilterByOrderIdAndSelectOrderDate()
  122. {
  123. //NH-2451
  124. using (var spy = new SqlLogSpy())
  125. {
  126. var lines = (from l in db.OrderLines
  127. where l.Order.OrderId == 100
  128. select l.Order.OrderDate).ToList();
  129. var countJoins = CountJoins(spy);
  130. Assert.That(countJoins, Is.EqualTo(1));
  131. Assert.That(Count(spy, "Orders"), Is.EqualTo(1));
  132. }
  133. }
  134. [Test]
  135. public void OrderLinesFilterByOrderIdAndSelectOrder()
  136. {
  137. //NH-2946
  138. using (var spy = new SqlLogSpy())
  139. {
  140. var lines = (from l in db.OrderLines
  141. where l.Order.OrderId == 100
  142. select l.Order).ToList();
  143. var countJoins = CountJoins(spy);
  144. Assert.That(countJoins, Is.EqualTo(1));
  145. Assert.That(Count(spy, "Orders"), Is.EqualTo(1));
  146. }
  147. }
  148. [Test]
  149. public void OrderLinesWithFilterByOrderIdShouldNotProduceJoins()
  150. {
  151. //NH-2946
  152. using (var spy = new SqlLogSpy())
  153. {
  154. (from l in db.OrderLines
  155. where l.Order.OrderId == 1000
  156. select l).ToList();
  157. var countJoins = CountJoins(spy);
  158. Assert.That(countJoins, Is.EqualTo(0));
  159. }
  160. }
  161. [Test]
  162. public void OrderLinesWithFilterByOrderIdAndDateShouldProduceOneJoin()
  163. {
  164. //NH-2946
  165. using (var spy = new SqlLogSpy())
  166. {
  167. (from l in db.OrderLines
  168. where l.Order.OrderId == 1000 && l.Order.OrderDate < DateTime.Now
  169. select l).ToList();
  170. var countJoins = CountJoins(spy);
  171. Assert.That(countJoins, Is.EqualTo(1));
  172. }
  173. }
  174. [Test]
  175. public void OrderLinesWithOrderByOrderIdShouldNotProduceJoins()
  176. {
  177. //NH-2946
  178. using (var spy = new SqlLogSpy())
  179. {
  180. (from l in db.OrderLines
  181. orderby l.Order.OrderId
  182. select l).ToList();
  183. var countJoins = CountJoins(spy);
  184. Assert.That(countJoins, Is.EqualTo(0));
  185. }
  186. }
  187. [Test]
  188. public void OrderLinesWithOrderByOrderShouldNotProduceJoins()
  189. {
  190. //NH-2946
  191. using (var spy = new SqlLogSpy())
  192. {
  193. (from l in db.OrderLines
  194. orderby l.Order
  195. select l).ToList();
  196. var countJoins = CountJoins(spy);
  197. Assert.That(countJoins, Is.EqualTo(0));
  198. }
  199. }
  200. [Test]
  201. public void OrderLinesWithOrderByOrderIdAndDateShouldProduceOneJoin()
  202. {
  203. //NH-2946
  204. using (var spy = new SqlLogSpy())
  205. {
  206. (from l in db.OrderLines
  207. orderby l.Order.OrderId, l.Order.OrderDate
  208. select l).ToList();
  209. var countJoins = CountJoins(spy);
  210. Assert.That(countJoins, Is.EqualTo(1));
  211. }
  212. }
  213. [Test]
  214. public void OrderLinesWithSelectingOrderIdShouldNotProduceJoins()
  215. {
  216. //NH-2946
  217. using (var spy = new SqlLogSpy())
  218. {
  219. (from l in db.OrderLines
  220. select l.Order.OrderId).ToList();
  221. var countJoins = CountJoins(spy);
  222. Assert.That(countJoins, Is.EqualTo(0));
  223. }
  224. }
  225. [Test]
  226. public void OrderLinesWithSelectingOrderIdAndDateShouldProduceOneJoin()
  227. {
  228. //NH-2946
  229. using (var spy = new SqlLogSpy())
  230. {
  231. (from l in db.OrderLines
  232. select new {l.Order.OrderId, l.Order.OrderDate}).ToList();
  233. var countJoins = CountJoins(spy);
  234. Assert.That(countJoins, Is.EqualTo(1));
  235. }
  236. }
  237. private static int CountJoins(LogSpy sqlLog)
  238. {
  239. return Count(sqlLog, "join");
  240. }
  241. private static int Count(LogSpy sqlLog, string s)
  242. {
  243. var log = sqlLog.GetWholeLog();
  244. return log.Split(new[] {s}, StringSplitOptions.None).Length - 1;
  245. }
  246. }
  247. }