From: <ste...@us...> - 2009-10-25 20:48:12
|
Revision: 4800 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4800&view=rev Author: steverstrong Date: 2009-10-25 20:48:02 +0000 (Sun, 25 Oct 2009) Log Message: ----------- Added missing test file and support for Queryable.All() Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs trunk/nhibernate/src/NHibernate.Test/Linq/LinqQuerySamples.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/Linq/ParameterisedQueries.cs Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs 2009-10-23 12:36:50 UTC (rev 4799) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs 2009-10-25 20:48:02 UTC (rev 4800) @@ -378,6 +378,10 @@ { return new HqlGroupBy(_factory); } + + public HqlAll All() + { + return new HqlAll(_factory); + } } - } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs 2009-10-23 12:36:50 UTC (rev 4799) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs 2009-10-25 20:48:02 UTC (rev 4800) @@ -620,4 +620,11 @@ } } + public class HqlAll : HqlTreeNode + { + public HqlAll(IASTFactory factory) + : base(HqlSqlWalker.ALL, "all", factory) + { + } + } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2009-10-23 12:36:50 UTC (rev 4799) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2009-10-25 20:48:02 UTC (rev 4800) @@ -246,35 +246,76 @@ // Any has one or two arguments. Arg 1 is the source and arg 2 is the optional predicate using (_stack.PushNode(_hqlTreeBuilder.Exists())) { - using (_stack.PushNode(_hqlTreeBuilder.Query())) - { - using (_stack.PushNode(_hqlTreeBuilder.SelectFrom())) - { - using (_stack.PushNode(_hqlTreeBuilder.From())) - { - using (_stack.PushNode(_hqlTreeBuilder.Range())) - { - VisitExpression(expression.Arguments[0]); + using (_stack.PushNode(_hqlTreeBuilder.Query())) + { + using (_stack.PushNode(_hqlTreeBuilder.SelectFrom())) + { + using (_stack.PushNode(_hqlTreeBuilder.From())) + { + using (_stack.PushNode(_hqlTreeBuilder.Range())) + { + VisitExpression(expression.Arguments[0]); - if (expression.Arguments.Count > 1) - { - var expr = (LambdaExpression) expression.Arguments[1]; - _stack.PushLeaf(_hqlTreeBuilder.Alias(expr.Parameters[0].Name)); - } - } - } - } - if (expression.Arguments.Count > 1) - { - using (_stack.PushNode(_hqlTreeBuilder.Where())) - { - VisitExpression(expression.Arguments[1]); - } - } - } + if (expression.Arguments.Count > 1) + { + var expr = (LambdaExpression) expression.Arguments[1]; + _stack.PushLeaf(_hqlTreeBuilder.Alias(expr.Parameters[0].Name)); + } + } + } + } + if (expression.Arguments.Count > 1) + { + using (_stack.PushNode(_hqlTreeBuilder.Where())) + { + VisitExpression(expression.Arguments[1]); + } + } + } } break; - case "Min": + + case "All": + // All has one or two arguments. Arg 1 is the source and arg 2 is the optional predicate + using (_stack.PushNode(_hqlTreeBuilder.Not())) + { + using (_stack.PushNode(_hqlTreeBuilder.Exists())) + { + using (_stack.PushNode(_hqlTreeBuilder.Query())) + { + using (_stack.PushNode(_hqlTreeBuilder.SelectFrom())) + { + using (_stack.PushNode(_hqlTreeBuilder.From())) + { + using (_stack.PushNode(_hqlTreeBuilder.Range())) + { + VisitExpression(expression.Arguments[0]); + + if (expression.Arguments.Count > 1) + { + var expr = (LambdaExpression) expression.Arguments[1]; + + _stack.PushLeaf(_hqlTreeBuilder.Alias(expr.Parameters[0].Name)); + } + } + } + } + if (expression.Arguments.Count > 1) + { + using (_stack.PushNode(_hqlTreeBuilder.Where())) + { + using (_stack.PushNode(_hqlTreeBuilder.Not())) + { + VisitExpression(expression.Arguments[1]); + } + } + } + } + } + } + break; + + case "Min": using (_stack.PushNode(_hqlTreeBuilder.Min())) { VisitExpression(expression.Arguments[1]); Modified: trunk/nhibernate/src/NHibernate.Test/Linq/LinqQuerySamples.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Linq/LinqQuerySamples.cs 2009-10-23 12:36:50 UTC (rev 4799) +++ trunk/nhibernate/src/NHibernate.Test/Linq/LinqQuerySamples.cs 2009-10-25 20:48:02 UTC (rev 4800) @@ -219,11 +219,6 @@ "a shaped subset of the data about Customers.")] public void DLinq16() { - /* - * 1) bottom up search of select expression to identify nodes that can be done with hql and those that can't - * 2) top down walk; for the nodes that are hql, call the hql generator and create an objectArray[] expression - * 3) for the other nodes, ignore the hql and just return the linq expression - */ var q = from c in db.Customers select new @@ -1093,10 +1088,9 @@ [Category("EXISTS/IN/ANY/ALL")] [Test(Description = "This sample uses All to return Customers whom all of their orders " + "have been shipped to their own city or whom have no orders.")] - [Ignore("TODO")] public void DLinq54() { - IQueryable<Customer> q = + IQueryable<Customer> q = from c in db.Customers where c.Orders.All(o => o.ShippingAddress.City == c.Address.City) // where c.Orders.Cast<Order>().All(o => o.ShippingAddress.City == c.Address.City) Added: trunk/nhibernate/src/NHibernate.Test/Linq/ParameterisedQueries.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Linq/ParameterisedQueries.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Linq/ParameterisedQueries.cs 2009-10-25 20:48:02 UTC (rev 4800) @@ -0,0 +1,190 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using NHibernate.Linq; +using NHibernate.Test.Linq.Entities; +using NUnit.Framework; + +namespace NHibernate.Test.Linq +{ + [TestFixture] + public class ParameterisedQueries : ReadonlyTestCase + { + [Test] + public void Identical_Expressions_Return_The_Same_Key() + { + using (var s = OpenSession()) + { + var db = new Northwind(s); + + Expression<Func<IEnumerable<Customer>>> london1 = + () => from c in db.Customers where c.Address.City == "London" select c; + Expression<Func<IEnumerable<Customer>>> london2 = + () => from c in db.Customers where c.Address.City == "London" select c; + + var nhLondon1 = new NhLinqExpression(london1.Body); + var nhLondon2 = new NhLinqExpression(london2.Body); + + Assert.AreEqual(nhLondon1.Key, nhLondon2.Key); + } + } + + [Test] + public void Expressions_Differing_Only_By_Constants_Return_The_Same_Key() + { + using (var s = OpenSession()) + { + var db = new Northwind(s); + + Expression<Func<IEnumerable<Customer>>> london = + () => from c in db.Customers where c.Address.City == "London" select c; + + Expression<Func<IEnumerable<Customer>>> newYork = + () => from c in db.Customers where c.Address.City == "New York" select c; + + var nhLondon = new NhLinqExpression(london.Body); + var nhNewYork = new NhLinqExpression(newYork.Body); + + Assert.AreEqual(nhLondon.Key, nhNewYork.Key); + Assert.AreEqual(1, nhLondon.ParameterValues.Count); + Assert.AreEqual(1, nhNewYork.ParameterValues.Count); + Assert.AreEqual("London", nhLondon.ParameterValues.First().Value); + Assert.AreEqual("New York", nhNewYork.ParameterValues.First().Value); + } + } + + [Test] + public void Different_Where_Clauses_Return_Different_Keys() + { + using (var s = OpenSession()) + { + var db = new Northwind(s); + + Expression<Func<IEnumerable<Customer>>> london = + () => from c in db.Customers where c.Address.City == "London" select c; + Expression<Func<IEnumerable<Customer>>> company = + () => from c in db.Customers where c.CompanyName == "Acme" select c; + + var nhLondon = new NhLinqExpression(london.Body); + var nhNewYork = new NhLinqExpression(company.Body); + + Assert.AreNotEqual(nhLondon.Key, nhNewYork.Key); + } + } + + [Test] + public void Different_Select_Properties_Return_Different_Keys() + { + using (var s = OpenSession()) + { + var db = new Northwind(s); + + Expression<Func<IEnumerable<string>>> customerId = + () => from c in db.Customers select c.CustomerId; + Expression<Func<IEnumerable<string>>> title = + () => from c in db.Customers select c.ContactTitle; + + var nhLondon = new NhLinqExpression(customerId.Body); + var nhNewYork = new NhLinqExpression(title.Body); + + Assert.AreNotEqual(nhLondon.Key, nhNewYork.Key); + } + } + + [Test] + public void Different_Select_Types_Return_Different_Keys() + { + using (var s = OpenSession()) + { + var db = new Northwind(s); + + Expression<Func<IEnumerable>> newCustomerId = + () => from c in db.Customers select new {c.CustomerId}; + Expression<Func<IEnumerable>> customerId = + () => from c in db.Customers select c.CustomerId; + + var nhLondon = new NhLinqExpression(newCustomerId.Body); + var nhNewYork = new NhLinqExpression(customerId.Body); + + Assert.AreNotEqual(nhLondon.Key, nhNewYork.Key); + } + } + + [Test] + public void Different_Select_Member_Initialisation_Returns_Different_Keys() + { + using (var s = OpenSession()) + { + var db = new Northwind(s); + + Expression<Func<IEnumerable>> newCustomerId = + () => from c in db.Customers select new { Id = c.CustomerId, Title = c.ContactTitle }; + Expression<Func<IEnumerable>> customerId = + () => from c in db.Customers select new { Title = c.ContactTitle, Id = c.CustomerId }; + + var nhLondon = new NhLinqExpression(newCustomerId.Body); + var nhNewYork = new NhLinqExpression(customerId.Body); + + Assert.AreNotEqual(nhLondon.Key, nhNewYork.Key); + } + } + + [Test] + public void Different_Conditionals_Return_Different_Keys() + { + using (var s = OpenSession()) + { + var db = new Northwind(s); + + Expression<Func<IEnumerable>> newCustomerId = + () => from c in db.Customers select new { Desc = c.CustomerId == "1" ? "First" : "Not First" }; + Expression<Func<IEnumerable>> customerId = + () => from c in db.Customers select new { Desc = c.CustomerId != "1" ? "First" : "Not First" }; + + var nhLondon = new NhLinqExpression(newCustomerId.Body); + var nhNewYork = new NhLinqExpression(customerId.Body); + + Assert.AreNotEqual(nhLondon.Key, nhNewYork.Key); + } + } + + [Test] + public void Different_Unary_Operation_Returns_Different_Keys() + { + using (var s = OpenSession()) + { + var db = new Northwind(s); + + Expression<Func<IEnumerable>> newCustomerId = + () => from c in db.Customers where c.CustomerId == "1" select c; + Expression<Func<IEnumerable>> customerId = + () => from c in db.Customers where !(c.CustomerId == "1") select c; + + var nhLondon = new NhLinqExpression(newCustomerId.Body); + var nhNewYork = new NhLinqExpression(customerId.Body); + + Assert.AreNotEqual(nhLondon.Key, nhNewYork.Key); + } + } + + // TODO - different parameter names + + protected override IList Mappings + { + get { return new string[0]; } + } + + protected override bool PerformDbDataSetup + { + get { return false; } + } + + protected override bool PerformDbDataTeardown + { + get { return false; } + } + + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |