|
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.
|