PageRenderTime 41ms CodeModel.GetById 10ms RepoModel.GetById 1ms app.codeStats 0ms

/Tests/Aggregates/BetterNHibernateImplementationsForSqlCriterionAndSqlProjectionsTests.cs

http://tgh.codeplex.com
C# | 631 lines | 502 code | 119 blank | 10 comment | 9 complexity | 33fcb69b2e55654124cf1c4a8d2c0040 MD5 | raw file
  1. using System;
  2. using System.Linq.Expressions;
  3. using FluentAssertions;
  4. using NHibernate;
  5. using NHibernate.Cfg;
  6. using NHibernate.Criterion;
  7. using NHibernate.Dialect;
  8. using NHibernate.Driver;
  9. using NHibernate.Engine;
  10. using NHibernate.Impl;
  11. using NHibernate.Loader.Criteria;
  12. using NHibernate.Mapping.ByCode;
  13. using NHibernate.Mapping.ByCode.Conformist;
  14. using NSubstitute;
  15. using NUnit.Framework;
  16. using TelerikMvcGridCustomBindingHelper.NHibernate;
  17. using TelerikMvcGridCustomBindingHelper.NHibernate.Aggregates;
  18. using TelerikMvcGridCustomBindingHelper.NHibernate.Projections;
  19. using Tests.Stubs;
  20. namespace Tests.Aggregates
  21. {
  22. public class BetterNHibernateImplementationsForSqlCriterionAndSqlProjectionsTests
  23. {
  24. #region Test models
  25. // ReSharper disable ClassNeverInstantiated.Local
  26. // ReSharper disable UnusedAutoPropertyAccessor.Global
  27. private class Foo
  28. {
  29. public virtual string Name { get; set; }
  30. public virtual short UnitPrice { get; set; }
  31. public virtual short UnitsInStock { get; set; }
  32. public virtual short UnitsOnOrder { get; set; }
  33. public virtual Bar Bar { get; set; }
  34. }
  35. private class Bar
  36. {
  37. public virtual short UnitPrice { get; set; }
  38. public virtual Foo Foo { get; set; }
  39. }
  40. // ReSharper restore ClassNeverInstantiated.Local
  41. // ReSharper restore UnusedAutoPropertyAccessor.Global
  42. private class FooMap : ClassMapping<Foo>
  43. {
  44. public FooMap()
  45. {
  46. Table("FooTable");
  47. Property(x => x.Name, map => map.Column("FooName"));
  48. Property(x => x.UnitPrice, map => map.Column("FooUnitPrice"));
  49. Property(x => x.UnitsInStock, map => map.Column("FooUnitsInStock"));
  50. Property(x => x.UnitsOnOrder, map => map.Column("FooUnitsOnOrder"));
  51. OneToOne(x => x.Bar, map => map.ForeignKey("FooBarKey"));
  52. }
  53. }
  54. private class BarMap : ClassMapping<Bar>
  55. {
  56. public BarMap()
  57. {
  58. Table("BarTable");
  59. Property(x => x.UnitPrice, map => map.Column("BarUnitPrice"));
  60. OneToOne(x => x.Foo, map => map.ForeignKey("BarFooKey"));
  61. }
  62. }
  63. #endregion
  64. private ISessionFactory _factory;
  65. [SetUp]
  66. public void SetUp()
  67. {
  68. var nhCfg = new Configuration();
  69. nhCfg.DataBaseIntegration(db =>
  70. {
  71. db.ConnectionString = "Data Source=:memory:;Version=3;New=True;Pooling=True;Max Pool Size=1;";
  72. db.ConnectionReleaseMode = ConnectionReleaseMode.OnClose;
  73. db.Driver<SQLite20Driver>();
  74. db.Dialect<SQLiteDialect>();
  75. // Debuging
  76. //db.LogSqlInConsole = true;
  77. //db.LogFormattedSql = true;
  78. //db.AutoCommentSql = true;
  79. });//.SessionFactory().GenerateStatistics();
  80. var mapper = new ModelMapper();
  81. mapper.AddMapping(new FooMap());
  82. mapper.AddMapping(new BarMap());
  83. nhCfg.AddMapping(mapper.CompileMappingForAllExplicitlyAddedEntities());
  84. _factory = nhCfg.BuildSessionFactory();
  85. }
  86. public class BetterCountAndAvgProjectionsTests : BetterNHibernateImplementationsForSqlCriterionAndSqlProjectionsTests
  87. {
  88. [Test]
  89. public void betterCountProjection_should_return_a_int64()
  90. {
  91. using (var session = _factory.OpenSession())
  92. {
  93. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  94. var criteriaQuery = new CriteriaQueryTranslator(
  95. (ISessionFactoryImplementor)_factory,
  96. criteria, criteria.EntityOrClassName, "sql_alias");
  97. var crit = new BetterCountProjection("UnitsOnOrder");
  98. var where = crit.ToSqlString(criteria, 0, criteriaQuery, null).ToString();
  99. where.Should().Be("count(sql_alias.FooUnitsOnOrder) as y0_");
  100. crit.GetTypes(null, null)[0].Should().Be(NHibernateUtil.Int64);
  101. }
  102. }
  103. [Test]
  104. public void betterAvgProjection_should_return_a_decimal()
  105. {
  106. using (var session = _factory.OpenSession())
  107. {
  108. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  109. var criteriaQuery = new CriteriaQueryTranslator(
  110. (ISessionFactoryImplementor)_factory,
  111. criteria, criteria.EntityOrClassName, "sql_alias");
  112. var crit = new BetterAvgProjection("UnitsOnOrder");
  113. var where = crit.ToSqlString(criteria, 0, criteriaQuery, null).ToString();
  114. where.Should().Be("avg(cast(sql_alias.FooUnitsOnOrder as DOUBLE)) as y0_");
  115. crit.GetTypes(null, null)[0].Should().Be(NHibernateUtil.Decimal);
  116. }
  117. }
  118. }
  119. public class BetterSqlCriterionTests : BetterNHibernateImplementationsForSqlCriterionAndSqlProjectionsTests
  120. {
  121. [Test]
  122. public void replaces_propertynames_with_columnnames()
  123. {
  124. using (ISession session = _factory.OpenSession())
  125. {
  126. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  127. var criteriaQuery = new CriteriaQueryTranslator(
  128. (ISessionFactoryImplementor)_factory,
  129. criteria, criteria.EntityOrClassName, "sql_alias");
  130. var crit = new BetterSqlCriterion("({UnitsOnOrder} + 3) > {UnitsInStock}");
  131. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  132. Assert.That(where, Is.EqualTo("(sql_alias.FooUnitsOnOrder + 3) > sql_alias.FooUnitsInStock"));
  133. }
  134. }
  135. [Test]
  136. public void replaces_aliased_propertynames_with_columnnames()
  137. {
  138. using (ISession session = _factory.OpenSession())
  139. {
  140. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  141. criteria.CreateAlias("Bar", "b");
  142. var criteriaQuery = new CriteriaQueryTranslator(
  143. (ISessionFactoryImplementor)_factory,
  144. criteria, criteria.EntityOrClassName, "sql_alias");
  145. var crit = new BetterSqlCriterion("{UnitPrice} > ({b.UnitPrice} + 1)");
  146. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  147. Assert.That(where, Is.EqualTo("sql_alias.FooUnitPrice > (b1_.BarUnitPrice + 1)"));
  148. }
  149. }
  150. [Test]
  151. public void non_existing_property_throws_exception()
  152. {
  153. using (ISession session = _factory.OpenSession())
  154. {
  155. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  156. var criteriaQuery = new CriteriaQueryTranslator(
  157. (ISessionFactoryImplementor)_factory,
  158. criteria, criteria.EntityOrClassName, "sql_alias");
  159. var crit = new BetterSqlCriterion("{NonExisting} > 1");
  160. Assert.Throws<QueryException>(() => crit.ToSqlString(criteria, criteriaQuery, null));
  161. }
  162. }
  163. }
  164. public class BetterSqlCriterionAndLinqExpressionsToSqlStringsConverterIntegrationTests : BetterNHibernateImplementationsForSqlCriterionAndSqlProjectionsTests
  165. {
  166. [Test]
  167. public void equality_with_a_string()
  168. {
  169. Expression<Func<Foo, object>> exp = p => p.Name == "Caneta";
  170. var sqlString = exp.ToSqlString();
  171. using (ISession session = _factory.OpenSession())
  172. {
  173. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  174. var criteriaQuery = new CriteriaQueryTranslator(
  175. (ISessionFactoryImplementor)_factory,
  176. criteria, criteria.EntityOrClassName, "sql_alias");
  177. var crit = new BetterSqlCriterion(sqlString);
  178. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  179. sqlString.Should().Be("{Name} = 'Caneta'");
  180. where.Should().Be("sql_alias.FooName = 'Caneta'");
  181. }
  182. }
  183. [Test]
  184. public void equality_with_a_number()
  185. {
  186. Expression<Func<Foo, object>> exp = p => p.UnitPrice == 5;
  187. var sqlString = exp.ToSqlString();
  188. using (ISession session = _factory.OpenSession())
  189. {
  190. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  191. var criteriaQuery = new CriteriaQueryTranslator(
  192. (ISessionFactoryImplementor)_factory,
  193. criteria, criteria.EntityOrClassName, "sql_alias");
  194. var crit = new BetterSqlCriterion(sqlString);
  195. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  196. sqlString.Should().Be("{UnitPrice} = 5");
  197. where.Should().Be("sql_alias.FooUnitPrice = 5");
  198. }
  199. }
  200. [Test]
  201. public void equality_with_another_property()
  202. {
  203. Expression<Func<Foo, object>> exp = p => p.UnitsOnOrder == p.UnitsInStock;
  204. var sqlString = exp.ToSqlString();
  205. using (ISession session = _factory.OpenSession())
  206. {
  207. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  208. var criteriaQuery = new CriteriaQueryTranslator(
  209. (ISessionFactoryImplementor)_factory,
  210. criteria, criteria.EntityOrClassName, "sql_alias");
  211. var crit = new BetterSqlCriterion(sqlString);
  212. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  213. sqlString.Should().Be("{UnitsOnOrder} = {UnitsInStock}");
  214. where.Should().Be("sql_alias.FooUnitsOnOrder = sql_alias.FooUnitsInStock");
  215. }
  216. }
  217. [Test]
  218. public void equality_with_a_string_and_a_number_at_same_time()
  219. {
  220. Expression<Func<Foo, object>> exp = p => p.Name == "Caneta" && p.UnitPrice == 3;
  221. var sqlString = exp.ToSqlString();
  222. using (ISession session = _factory.OpenSession())
  223. {
  224. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  225. var criteriaQuery = new CriteriaQueryTranslator(
  226. (ISessionFactoryImplementor)_factory,
  227. criteria, criteria.EntityOrClassName, "sql_alias");
  228. var crit = new BetterSqlCriterion(sqlString);
  229. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  230. sqlString.Should().Be("{Name} = 'Caneta' and {UnitPrice} = 3");
  231. where.Should().Be("sql_alias.FooName = 'Caneta' and sql_alias.FooUnitPrice = 3");
  232. }
  233. }
  234. [Test]
  235. public void greater_than()
  236. {
  237. Expression<Func<Foo, object>> exp = p => p.UnitPrice > 5;
  238. var sqlString = exp.ToSqlString();
  239. using (ISession session = _factory.OpenSession())
  240. {
  241. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  242. var criteriaQuery = new CriteriaQueryTranslator(
  243. (ISessionFactoryImplementor)_factory,
  244. criteria, criteria.EntityOrClassName, "sql_alias");
  245. var crit = new BetterSqlCriterion(sqlString);
  246. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  247. sqlString.Should().Be("{UnitPrice} > 5");
  248. where.Should().Be("sql_alias.FooUnitPrice > 5");
  249. }
  250. }
  251. [Test]
  252. public void greater_than_a_property()
  253. {
  254. Expression<Func<Foo, object>> exp = p => p.UnitPrice > p.UnitsInStock;
  255. var sqlString = exp.ToSqlString();
  256. using (ISession session = _factory.OpenSession())
  257. {
  258. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  259. var criteriaQuery = new CriteriaQueryTranslator(
  260. (ISessionFactoryImplementor)_factory,
  261. criteria, criteria.EntityOrClassName, "sql_alias");
  262. var crit = new BetterSqlCriterion(sqlString);
  263. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  264. sqlString.Should().Be("{UnitPrice} > {UnitsInStock}");
  265. where.Should().Be("sql_alias.FooUnitPrice > sql_alias.FooUnitsInStock");
  266. }
  267. }
  268. [Test]
  269. public void greater_than_or_equal()
  270. {
  271. Expression<Func<Foo, object>> exp = p => p.UnitPrice >= 5;
  272. var sqlString = exp.ToSqlString();
  273. using (ISession session = _factory.OpenSession())
  274. {
  275. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  276. var criteriaQuery = new CriteriaQueryTranslator(
  277. (ISessionFactoryImplementor)_factory,
  278. criteria, criteria.EntityOrClassName, "sql_alias");
  279. var crit = new BetterSqlCriterion(sqlString);
  280. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  281. sqlString.Should().Be("{UnitPrice} >= 5");
  282. where.Should().Be("sql_alias.FooUnitPrice >= 5");
  283. }
  284. }
  285. [Test]
  286. public void greater_than_or_equal_a_property()
  287. {
  288. Expression<Func<Foo, object>> exp = p => p.UnitPrice >= p.UnitsInStock;
  289. var sqlString = exp.ToSqlString();
  290. using (ISession session = _factory.OpenSession())
  291. {
  292. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  293. var criteriaQuery = new CriteriaQueryTranslator(
  294. (ISessionFactoryImplementor)_factory,
  295. criteria, criteria.EntityOrClassName, "sql_alias");
  296. var crit = new BetterSqlCriterion(sqlString);
  297. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  298. sqlString.Should().Be("{UnitPrice} >= {UnitsInStock}");
  299. where.Should().Be("sql_alias.FooUnitPrice >= sql_alias.FooUnitsInStock");
  300. }
  301. }
  302. [Test]
  303. public void less_than()
  304. {
  305. Expression<Func<Foo, object>> exp = p => p.UnitPrice < 5;
  306. var sqlString = exp.ToSqlString();
  307. using (ISession session = _factory.OpenSession())
  308. {
  309. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  310. var criteriaQuery = new CriteriaQueryTranslator(
  311. (ISessionFactoryImplementor)_factory,
  312. criteria, criteria.EntityOrClassName, "sql_alias");
  313. var crit = new BetterSqlCriterion(sqlString);
  314. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  315. sqlString.Should().Be("{UnitPrice} < 5");
  316. where.Should().Be("sql_alias.FooUnitPrice < 5");
  317. }
  318. }
  319. [Test]
  320. public void less_than_a_property()
  321. {
  322. Expression<Func<Foo, object>> exp = p => p.UnitPrice < p.UnitsInStock;
  323. var sqlString = exp.ToSqlString();
  324. using (ISession session = _factory.OpenSession())
  325. {
  326. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  327. var criteriaQuery = new CriteriaQueryTranslator(
  328. (ISessionFactoryImplementor)_factory,
  329. criteria, criteria.EntityOrClassName, "sql_alias");
  330. var crit = new BetterSqlCriterion(sqlString);
  331. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  332. sqlString.Should().Be("{UnitPrice} < {UnitsInStock}");
  333. where.Should().Be("sql_alias.FooUnitPrice < sql_alias.FooUnitsInStock");
  334. }
  335. }
  336. [Test]
  337. public void less_than_or_equal()
  338. {
  339. Expression<Func<Foo, object>> exp = p => p.UnitPrice <= 5;
  340. var sqlString = exp.ToSqlString();
  341. using (ISession session = _factory.OpenSession())
  342. {
  343. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  344. var criteriaQuery = new CriteriaQueryTranslator(
  345. (ISessionFactoryImplementor)_factory,
  346. criteria, criteria.EntityOrClassName, "sql_alias");
  347. var crit = new BetterSqlCriterion(sqlString);
  348. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  349. sqlString.Should().Be("{UnitPrice} <= 5");
  350. where.Should().Be("sql_alias.FooUnitPrice <= 5");
  351. }
  352. }
  353. [Test]
  354. public void less_than_or_equal_a_property()
  355. {
  356. Expression<Func<Foo, object>> exp = p => p.UnitPrice <= p.UnitsInStock;
  357. var sqlString = exp.ToSqlString();
  358. using (ISession session = _factory.OpenSession())
  359. {
  360. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  361. var criteriaQuery = new CriteriaQueryTranslator(
  362. (ISessionFactoryImplementor)_factory,
  363. criteria, criteria.EntityOrClassName, "sql_alias");
  364. var crit = new BetterSqlCriterion(sqlString);
  365. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  366. sqlString.Should().Be("{UnitPrice} <= {UnitsInStock}");
  367. where.Should().Be("sql_alias.FooUnitPrice <= sql_alias.FooUnitsInStock");
  368. }
  369. }
  370. [Test]
  371. public void replaces_aliased_propertynames_with_columnnames_from_expression()
  372. {
  373. Expression<Func<Foo, object>> exp = p => p.UnitPrice > p.Bar.UnitPrice;
  374. var sqlString = exp.ToSqlString();
  375. using (ISession session = _factory.OpenSession())
  376. {
  377. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  378. criteria.CreateAlias("Bar", "Bar");
  379. var criteriaQuery = new CriteriaQueryTranslator(
  380. (ISessionFactoryImplementor)_factory,
  381. criteria, criteria.EntityOrClassName, "sql_alias");
  382. var crit = new BetterSqlCriterion(sqlString);
  383. var where = crit.ToSqlString(criteria, criteriaQuery, null).ToString();
  384. sqlString.Should().Be("{UnitPrice} > {Bar.UnitPrice}");
  385. where.Should().Be("sql_alias.FooUnitPrice > bar1_.BarUnitPrice");
  386. }
  387. }
  388. }
  389. public class BetterSqlProjectionTests : BetterNHibernateImplementationsForSqlCriterionAndSqlProjectionsTests
  390. {
  391. [Test]
  392. public void replaces_propertynames_with_columnnames()
  393. {
  394. using (var session = _factory.OpenSession())
  395. {
  396. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  397. var criteriaQuery = new CriteriaQueryTranslator(
  398. (ISessionFactoryImplementor)_factory,
  399. criteria, criteria.EntityOrClassName, "sql_alias");
  400. var crit = new BetterSqlProjection("({UnitsOnOrder} + 3) > {UnitsInStock}");
  401. var where = crit.ToSqlString(criteria, 0, criteriaQuery, null).ToString();
  402. where.Should().Be(("cast((cast(sql_alias.FooUnitsOnOrder as NUMERIC) + 3) > cast(sql_alias.FooUnitsInStock as NUMERIC) as NUMERIC) as betterSqlProjectionResult"));
  403. }
  404. }
  405. [Test]
  406. public void replaces_propertynames_with_columnnames_ignoring_cast()
  407. {
  408. using (var session = _factory.OpenSession())
  409. {
  410. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  411. var criteriaQuery = new CriteriaQueryTranslator(
  412. (ISessionFactoryImplementor)_factory,
  413. criteria, criteria.EntityOrClassName, "sql_alias");
  414. var crit = new BetterSqlProjection("({UnitsOnOrder} + 3) > {UnitsInStock}", ignoreCast: true);
  415. var where = crit.ToSqlString(criteria, 0, criteriaQuery, null).ToString();
  416. where.Should().Be(("((sql_alias.FooUnitsOnOrder + 3) > sql_alias.FooUnitsInStock) as betterSqlProjectionResult"));
  417. }
  418. }
  419. [Test]
  420. public void replaces_aliased_propertynames_with_columnnames()
  421. {
  422. using (ISession session = _factory.OpenSession())
  423. {
  424. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  425. criteria.CreateAlias("Bar", "Bar");
  426. var criteriaQuery = new CriteriaQueryTranslator(
  427. (ISessionFactoryImplementor)_factory,
  428. criteria, criteria.EntityOrClassName, "sql_alias");
  429. var crit = new BetterSqlProjection("{UnitPrice} > ({Bar.UnitPrice} + 1)");
  430. var where = crit.ToSqlString(criteria, 0, criteriaQuery, null).ToString();
  431. where.Should().Be(("cast(cast(sql_alias.FooUnitPrice as NUMERIC) > (cast(bar1_.BarUnitPrice as NUMERIC) + 1) as NUMERIC) as betterSqlProjectionResult"));
  432. }
  433. }
  434. [Test]
  435. public void replaces_aliased_propertynames_with_columnnames_ignoring_cast()
  436. {
  437. using (var session = _factory.OpenSession())
  438. {
  439. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  440. criteria.CreateAlias("Bar", "Bar");
  441. //criteria.CreateCriteria("Bar", "Bar");
  442. var criteriaQuery = new CriteriaQueryTranslator(
  443. (ISessionFactoryImplementor)_factory,
  444. criteria, criteria.EntityOrClassName, "sql_alias");
  445. var crit = new BetterSqlProjection("{UnitPrice} > ({Bar.UnitPrice} + 1)", ignoreCast: true);
  446. var where = crit.ToSqlString(criteria, 0, criteriaQuery, null).ToString();
  447. where.Should().Be(("(sql_alias.FooUnitPrice > (bar1_.BarUnitPrice + 1)) as betterSqlProjectionResult"));
  448. }
  449. }
  450. [Test]
  451. public void replaces_aliased_propertynames_with_columnnames_ignoring_cast_2()
  452. {
  453. using (var session = _factory.OpenSession())
  454. {
  455. var queryOver = session.QueryOver<Foo>();
  456. var criteria = (CriteriaImpl)queryOver.RootCriteria;
  457. criteria.CreateAlias("Bar.Foo", "BarFoo");
  458. //criteria.CreateCriteria("Bar.Foo", "BarFoo");
  459. var criteriaQuery = new CriteriaQueryTranslator(
  460. (ISessionFactoryImplementor)_factory,
  461. criteria, criteria.EntityOrClassName, "sql_alias");
  462. var crit = new BetterSqlProjection("{UnitPrice} + ({BarFoo.Name} + 1)", ignoreCast: true);
  463. var where = crit.ToSqlString(criteria, 0, criteriaQuery, null).ToString();
  464. where.Should().Be(("(sql_alias.FooUnitPrice + (barfoo1_.FooName + 1)) as betterSqlProjectionResult"));
  465. }
  466. }
  467. [Test]
  468. public void non_existing_property_throws_exception()
  469. {
  470. using (var session = _factory.OpenSession())
  471. {
  472. var criteria = (CriteriaImpl)session.CreateCriteria<Foo>();
  473. var criteriaQuery = new CriteriaQueryTranslator(
  474. (ISessionFactoryImplementor)_factory,
  475. criteria, criteria.EntityOrClassName, "sql_alias");
  476. var crit = new BetterSqlProjection("{NonExisting} > 1");
  477. Assert.Throws<QueryException>(() => crit.ToSqlString(criteria, 0, criteriaQuery, null));
  478. }
  479. }
  480. }
  481. public class ExpressionProjectionHelperTests : BetterNHibernateImplementationsForSqlCriterionAndSqlProjectionsTests
  482. {
  483. [Test]
  484. public void count_expression()
  485. {
  486. var queryOver = new QueryOverStub<Foo, Foo>(Substitute.For<ICriteria>());
  487. Expression<Func<Foo, bool?>> expression = foo => foo.UnitPrice + 3 > foo.UnitsOnOrder;
  488. var expressionProjectionHelper = new ExpressionProjectionHelper(queryOver, expression, NHibernateUtil.Decimal);
  489. expressionProjectionHelper.Count();
  490. queryOver.RootCriteria.Received(1).SetProjection(Arg.Any<IProjection>());
  491. const string sqlString = "count(*) as expressionProjectionHelperResult";
  492. queryOver.RootCriteria.Received(1).SetProjection(Arg.Is<IProjection>(projections => projections.ToString() == sqlString));
  493. queryOver.RootCriteria.Received(1).Add(Arg.Any<ICriterion>());
  494. const string criterion = "{UnitPrice} + 3 > {UnitsOnOrder}";
  495. queryOver.RootCriteria.Received(1).Add(Arg.Is<ICriterion>(projections => projections.ToString() == criterion));
  496. queryOver.RootCriteria.Received(1).FutureValue<object>();
  497. }
  498. [Test]
  499. public void sum_expression()
  500. {
  501. var queryOver = new QueryOverStub<Foo, Foo>(Substitute.For<ICriteria>());
  502. Expression<Func<Foo, decimal?>> expression = foo => foo.UnitPrice * foo.UnitsOnOrder;
  503. var expressionProjectionHelper = new ExpressionProjectionHelper(queryOver, expression, NHibernateUtil.Decimal);
  504. expressionProjectionHelper.Sum();
  505. queryOver.RootCriteria.Received(1).SetProjection(Arg.Any<IProjection>());
  506. const string sqlString = "sum({UnitPrice} * {UnitsOnOrder})";
  507. queryOver.RootCriteria.Received(1).SetProjection(Arg.Is<IProjection>(projections => projections.ToString() == sqlString));
  508. queryOver.RootCriteria.Received(1).FutureValue<object>();
  509. }
  510. }
  511. }
  512. }