From: <te...@us...> - 2008-09-03 21:03:19
|
Revision: 3744 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3744&view=rev Author: tehlike Date: 2008-09-03 21:03:23 +0000 (Wed, 03 Sep 2008) Log Message: ----------- Added QuerySpacesFinderVisitor to support AutoFlush Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Linq/NHibernate.Linq.csproj trunk/nhibernate/src/NHibernate.Linq/NHibernateQueryProvider.cs trunk/nhibernate/src/NHibernate.Linq.Test/App.config trunk/nhibernate/src/NHibernate.Linq.Test/ExpressionEqualityCheckerTests.cs trunk/nhibernate/src/NHibernate.Linq.Test/NHibernate.Linq.Test.csproj trunk/nhibernate/src/NHibernate.Linq.Test/SelectTest.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Linq/Query/ trunk/nhibernate/src/NHibernate.Linq/Query/LinqTranslator.cs trunk/nhibernate/src/NHibernate.Linq/Visitors/QuerySpacesFinderVisitor.cs trunk/nhibernate/src/NHibernate.Linq/Visitors/SqlExpressionTranslator.cs trunk/nhibernate/src/NHibernate.Linq.Test/VisitorTests/QuerySpacesFinderVisitorTests.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate.Linq/Loaders/ trunk/nhibernate/src/NHibernate.Linq/Visitors/SqlExpressionToSqlStringVisitor.cs Modified: trunk/nhibernate/src/NHibernate.Linq/NHibernate.Linq.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Linq/NHibernate.Linq.csproj 2008-09-03 20:57:21 UTC (rev 3743) +++ trunk/nhibernate/src/NHibernate.Linq/NHibernate.Linq.csproj 2008-09-03 21:03:23 UTC (rev 3744) @@ -52,6 +52,7 @@ <Compile Include="Expressions\NHExpression.cs" /> <Compile Include="Expressions\NHExpressionType.cs" /> <Compile Include="Expressions\QuerySourceExpression.cs" /> + <Compile Include="Query\LinqTranslator.cs" /> <Compile Include="Util\Guard.cs" /> <Compile Include="Util\LinqUtil.cs" /> <Compile Include="Visitors\AssociationRewriteVisitor.cs" /> @@ -65,12 +66,10 @@ <Compile Include="Visitors\LocalVariableExpressionReducer.cs" /> <Compile Include="Visitors\NHibernateExpressionVisitor.cs" /> <Compile Include="Visitors\NHExpressionToSqlQueryTranslator.cs" /> - <Compile Include="Visitors\SqlExpressionToSqlStringVisitor.cs" /> + <Compile Include="Visitors\QuerySpacesFinderVisitor.cs" /> + <Compile Include="Visitors\SqlExpressionTranslator.cs" /> <Compile Include="Visitors\NHExpressionToSqlExpressionTransformer.cs" /> </ItemGroup> - <ItemGroup> - <Folder Include="Loaders\" /> - </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. Modified: trunk/nhibernate/src/NHibernate.Linq/NHibernateQueryProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq/NHibernateQueryProvider.cs 2008-09-03 20:57:21 UTC (rev 3743) +++ trunk/nhibernate/src/NHibernate.Linq/NHibernateQueryProvider.cs 2008-09-03 21:03:23 UTC (rev 3744) @@ -1,5 +1,4 @@ using System; -using NHibernate.Criterion; using NHibernate.Linq.Util; using NHibernate.SqlCommand; using Expression=System.Linq.Expressions.Expression; @@ -12,22 +11,23 @@ public class NHibernateQueryProvider : QueryProvider { private readonly ISession session; - + private readonly ISessionFactoryImplementor sessionFactory; public NHibernateQueryProvider(ISession session) { Guard.AgainstNull(session,"session"); this.session = session; + this.sessionFactory = this.session.SessionFactory as ISessionFactoryImplementor; } public override object Execute(Expression expression) { IList<object> parameterList = new List<object>(); - ISessionFactoryImplementor sessionFactory = this.session.SessionFactory as ISessionFactoryImplementor; expression = LocalVariableExpressionReducer.Reduce(expression); expression = LogicalExpressionReducer.Reduce(expression); expression = AssociationRewriteVisitor.Rewrite(expression, sessionFactory); expression = NHExpressionToSqlExpressionTransformer.Transform(sessionFactory, expression); SqlString sql=SqlExpressionToSqlStringVisitor.Translate(expression, sessionFactory,parameterList); + Console.WriteLine(sql); throw new NotImplementedException(); //expression = AssociationVisitor.RewriteWithAssociations(session.SessionFactory, expression); //expression = CollectionAliasVisitor.AssignCollectionAccessAliases(expression); Property changes on: trunk/nhibernate/src/NHibernate.Linq/Query ___________________________________________________________________ Added: svn:mergeinfo + Added: trunk/nhibernate/src/NHibernate.Linq/Query/LinqTranslator.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq/Query/LinqTranslator.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Linq/Query/LinqTranslator.cs 2008-09-03 21:03:23 UTC (rev 3744) @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Linq.Expressions; +using NHibernate.Engine; +using NHibernate.Loader; + +namespace NHibernate.Linq.LinqQuery +{ + public class LinqTranslator:OuterJoinLoader + { + public LinqTranslator(Expression expression, + IDictionary<string, IFilter> enabledFilters, + ISessionFactoryImplementor sessionFactory):base(sessionFactory,enabledFilters) + { + this.expression = expression; + this.sessionFactory = sessionFactory; + } + + private readonly Expression expression; + private readonly ISessionFactoryImplementor sessionFactory; + + + + public void Translate() + { + + } + + protected void RenderSql() + { + + } + + } +} Added: trunk/nhibernate/src/NHibernate.Linq/Visitors/QuerySpacesFinderVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq/Visitors/QuerySpacesFinderVisitor.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Linq/Visitors/QuerySpacesFinderVisitor.cs 2008-09-03 21:03:23 UTC (rev 3744) @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Reflection; +using NHibernate.Engine; +using System.Collections; +using NHibernate.Persister.Collection; +using NHibernate.Linq.Util; +using NHibernate.Metadata; + +namespace NHibernate.Linq.Visitors +{ + /// <summary> + /// A queryspace is a term that is used with NHibernate AutoFlush feature. + /// When an entity(table) is evolved in a query, this entity(table) is added to queryspace. + /// Before nhibernate executes the SQL query, it checks if each item in queryspace has any dirty + /// entity. If there is any, session flush occurs so that query can act on fresh data. + /// This visitor visits nodes of the expression tree, and appends each node corresponding + /// to an entity/collection to the queryspace. + /// </summary> + public class QuerySpacesFinderVisitor:ExpressionVisitor + { + public QuerySpacesFinderVisitor(ISessionFactoryImplementor sessionFactory) + :this(sessionFactory,new List<string>()) + { + + } + public QuerySpacesFinderVisitor(ISessionFactoryImplementor sessionFactory,IList<string> querySpaces) + { + this.QuerySpaces = querySpaces; + this.sessionFactory = sessionFactory; + } + private readonly ISessionFactoryImplementor sessionFactory; + + /// <summary> + /// Query spaces evolved in the query. + /// </summary> + public IList<string> QuerySpaces { get; protected set; } + protected override System.Linq.Expressions.Expression VisitConstant(System.Linq.Expressions.ConstantExpression c) + { + if(c.Value is IQueryable) + { + QuerySpaces.Add(((IQueryable)c.Value).ElementType.ToString()); + } + return base.VisitConstant(c); + } + protected override System.Linq.Expressions.Expression VisitMemberAccess(System.Linq.Expressions.MemberExpression m) + { + if(m.Member.MemberType==MemberTypes.Property) + { + + //TODO: need to find better way to find if a property is a collection/list. + if (TypeSystem.GetElementType(m.Type) == null || TypeSystem.GetElementType(m.Type)==m.Type) + { + if(sessionFactory.GetImplementors(m.Type.ToString()).Length>0) + { + QuerySpaces.Add(m.Type.FullName); + } + } + else + { + ICollectionMetadata metadata = + sessionFactory.GetCollectionMetadata(string.Format("{0}.{1}", m.Member.DeclaringType.FullName, m.Member.Name)); + QuerySpaces.Add(metadata.ElementType.ReturnedClass.FullName); + } + } + return base.VisitMemberAccess(m); + } + } +} Deleted: trunk/nhibernate/src/NHibernate.Linq/Visitors/SqlExpressionToSqlStringVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq/Visitors/SqlExpressionToSqlStringVisitor.cs 2008-09-03 20:57:21 UTC (rev 3743) +++ trunk/nhibernate/src/NHibernate.Linq/Visitors/SqlExpressionToSqlStringVisitor.cs 2008-09-03 21:03:23 UTC (rev 3744) @@ -1,208 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Text; -using NHibernate.Engine; -using NHibernate.Linq.Expressions; -using NHibernate.SqlCommand; -using SelectFragment=NHibernate.SqlCommand.SelectFragment; -using NHibernate.Persister.Entity; -using NHibernate.Type; -using NHibernate.Metadata; - -namespace NHibernate.Linq.Visitors -{ - //TODO: Process the query source by converting into select expression - //TODO: Select expression should be changed so that it can handle columns or projections instead of expression. - public class SqlExpressionToSqlStringVisitor:NHibernateExpressionVisitor - { - public static SqlString Translate(Expression expr,ISessionFactoryImplementor sessionFactory,IList<object> parameterList) - { - - var visitor = new SqlExpressionToSqlStringVisitor(sessionFactory,parameterList); - visitor.Visit(expr); - return visitor.selectBuilder.ToSqlString(); - } - - public SqlExpressionToSqlStringVisitor(ISessionFactoryImplementor sessionFactory,IList<object> parameterList) - { - this.selectBuilder = new SqlStringBuilder(); - this.sessionFactory = sessionFactory; - this.parameterList = parameterList; - } - - private readonly IList<object> parameterList; - private ISessionFactoryImplementor sessionFactory; - private SqlStringBuilder selectBuilder; - protected override Expression VisitUnary(UnaryExpression u) - { - switch(u.NodeType) - { - case ExpressionType.Not: - { - selectBuilder.Add(" NOT ("); - Expression ret=base.VisitUnary(u); - selectBuilder.Add(")"); - return ret; - } - case ExpressionType.Negate: - { - selectBuilder.Add("(-1 * ("); - Expression ret = base.VisitUnary(u); - selectBuilder.Add("))"); - return ret; - } - } - return base.VisitUnary(u); - } - protected override Expression VisitBinary(BinaryExpression b) - { - string op = ""; - - #region operators - - switch (b.NodeType) - { - case ExpressionType.Add: - op = "+"; - break; - case ExpressionType.And: - case ExpressionType.AndAlso: - op = "AND"; - break; - case ExpressionType.Divide: - op = "/"; - break; - case ExpressionType.GreaterThan: - op = ">"; - break; - case ExpressionType.GreaterThanOrEqual: - op = ">="; - break; - case ExpressionType.LessThan: - op = "<"; - break; - case ExpressionType.LessThanOrEqual: - op = "<="; - break; - case ExpressionType.Modulo: - op = "MOD"; - break; - case ExpressionType.Multiply: - op = "*"; - break; - case ExpressionType.Or: - case ExpressionType.OrElse: - op = "OR"; - break; - case ExpressionType.Subtract: - op = "-"; - break; - case ExpressionType.Equal: - op = "="; - break; - case ExpressionType.NotEqual: - op = "!="; - break; - case ExpressionType.Power: - default: - throw new NotImplementedException(); - } - - #endregion - - selectBuilder.Add("("); - this.Visit(b.Left); - selectBuilder.Add(" "); - selectBuilder.Add(op); - selectBuilder.Add(" "); - this.Visit(b.Right); - selectBuilder.Add(")"); - return b; - } - protected override Expression VisitConditional(ConditionalExpression c) - { - return base.VisitConditional(c); - } - - protected override Expression VisitConstant(ConstantExpression c) - { - selectBuilder.AddParameter(); - parameterList.Add(c.Value); - return c; - } - - protected override Expression VisitProperty(PropertyExpression property) - { - ParameterExpression expr = property.Expression as ParameterExpression; - - selectBuilder.Add(string.Format("{0}.{1}", expr.Name, property.Name)); - return property; - } - - protected override Expression VisitSelect(SelectExpression select) - { - selectBuilder.Add("(SELECT "); - if(select.Projection!=null) - this.Visit(select.Projection); - else - selectBuilder.Add(select.FromAlias+".* "); - - if (select.From != null) - { - selectBuilder.Add(" FROM ("); - this.Visit(select.From); - selectBuilder.Add(") AS "); - selectBuilder.Add(select.FromAlias); - } - else - throw new NotImplementedException(); - if(select.Where!=null) - { - selectBuilder.Add(" WHERE "); - this.Visit(select.Where); - } - selectBuilder.Add(")"); - return select; - } - - protected override Expression VisitQuerySource(QuerySourceExpression expr) - { - selectBuilder.Add("SELECT "); - IClassMetadata metadata = sessionFactory.GetClassMetadata(expr.Query.ElementType); - IPropertyMapping mapping = (IPropertyMapping)sessionFactory.GetEntityPersister(metadata.EntityName); - string[] names = metadata.PropertyNames; - bool started = false; - for (int i = 0; i < names.Length;i++ ) - { - string name = names[i]; - IType propertyType = metadata.GetPropertyType(name); - if (!(propertyType.IsComponentType | - propertyType.IsCollectionType | - propertyType.IsAssociationType | - propertyType.IsAnyType)) - { - if(started) - selectBuilder.Add(", "); - started = true; - selectBuilder.Add(mapping.ToColumns(name)[0]); - selectBuilder.Add(" AS "); - selectBuilder.Add(name); - } - - } - selectBuilder.Add(" FROM "); - selectBuilder.Add(expr.Query.ElementType.Name); - return base.VisitQuerySource(expr); - } - protected override Expression VisitParameter(ParameterExpression p) - { - return base.VisitParameter(p); - } - public override string ToString() - { - return selectBuilder.ToString(); - } - } -} Copied: trunk/nhibernate/src/NHibernate.Linq/Visitors/SqlExpressionTranslator.cs (from rev 3737, trunk/nhibernate/src/NHibernate.Linq/Visitors/SqlExpressionToSqlStringVisitor.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Linq/Visitors/SqlExpressionTranslator.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Linq/Visitors/SqlExpressionTranslator.cs 2008-09-03 21:03:23 UTC (rev 3744) @@ -0,0 +1,199 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using NHibernate.Engine; +using NHibernate.Linq.Expressions; +using NHibernate.SqlCommand; +using NHibernate.Persister.Entity; +using NHibernate.Type; +using NHibernate.Metadata; + +namespace NHibernate.Linq.Visitors +{ + //TODO: Process the query source by converting into select expression + //TODO: Select expression should be changed so that it can handle columns or projections instead of expression. + public class SqlExpressionToSqlStringVisitor:NHibernateExpressionVisitor + { + public static SqlString Translate(Expression expr,ISessionFactoryImplementor sessionFactory,IList<object> parameterList) + { + + var visitor = new SqlExpressionToSqlStringVisitor(sessionFactory,parameterList); + visitor.Visit(expr); + return visitor.sqlStringBuilder.ToSqlString(); + } + + public SqlExpressionToSqlStringVisitor(ISessionFactoryImplementor sessionFactory,IList<object> parameterList) + { + this.sqlStringBuilder = new SqlStringBuilder(); + this.sessionFactory = sessionFactory; + this.parameterList = parameterList; + + } + + private readonly IList<object> parameterList; + private readonly ISessionFactoryImplementor sessionFactory; + private SqlStringBuilder sqlStringBuilder; + + protected override Expression VisitUnary(UnaryExpression u) + { + switch(u.NodeType) + { + case ExpressionType.Not: + { + sqlStringBuilder.Add(" NOT ("); + Expression ret=base.VisitUnary(u); + sqlStringBuilder.Add(")"); + return ret; + } + case ExpressionType.Negate: + { + sqlStringBuilder.Add("(-1 * ("); + Expression ret = base.VisitUnary(u); + sqlStringBuilder.Add("))"); + return ret; + } + } + return base.VisitUnary(u); + } + protected override Expression VisitBinary(BinaryExpression b) + { + string op = ""; + + #region operators + + switch (b.NodeType) + { + case ExpressionType.Add: + op = "+"; + break; + case ExpressionType.And: + case ExpressionType.AndAlso: + op = "AND"; + break; + case ExpressionType.Divide: + op = "/"; + break; + case ExpressionType.GreaterThan: + op = ">"; + break; + case ExpressionType.GreaterThanOrEqual: + op = ">="; + break; + case ExpressionType.LessThan: + op = "<"; + break; + case ExpressionType.LessThanOrEqual: + op = "<="; + break; + case ExpressionType.Modulo: + op = "MOD"; + break; + case ExpressionType.Multiply: + op = "*"; + break; + case ExpressionType.Or: + case ExpressionType.OrElse: + op = "OR"; + break; + case ExpressionType.Subtract: + op = "-"; + break; + case ExpressionType.Equal: + op = "="; + break; + case ExpressionType.NotEqual: + op = "!="; + break; + case ExpressionType.Power: + default: + throw new NotImplementedException(); + } + + #endregion + + sqlStringBuilder.Add("("); + this.Visit(b.Left); + sqlStringBuilder.Add(" "); + sqlStringBuilder.Add(op); + sqlStringBuilder.Add(" "); + this.Visit(b.Right); + sqlStringBuilder.Add(")"); + return b; + } + + protected override Expression VisitConstant(ConstantExpression c) + { + sqlStringBuilder.AddParameter(); + parameterList.Add(c.Value); + return c; + } + + protected override Expression VisitProperty(PropertyExpression property) + { + ParameterExpression expr = property.Expression as ParameterExpression; + + sqlStringBuilder.Add(string.Format("{0}.{1}", expr.Name, property.Name)); + return property; + } + + protected override Expression VisitSelect(SelectExpression select) + { + SqlSelectBuilder selectBuilder=new SqlSelectBuilder(this.sessionFactory); + SqlString selectString = new SqlString("*"); + SqlString fromString = SqlExpressionToSqlStringVisitor.Translate(select.From, sessionFactory, parameterList); + fromString=new SqlString("(",fromString,")"); + SqlString whereString = SqlExpressionToSqlStringVisitor.Translate(select.Where, sessionFactory, parameterList); + SqlString outerJoinsAfterFrom=new SqlString(); + SqlString outerJoinsAfterWhere=new SqlString(); + selectBuilder.SetFromClause(fromString); + selectBuilder.SetWhereClause(whereString); + selectBuilder.SetSelectClause(selectString); + selectBuilder.SetOuterJoins(outerJoinsAfterFrom, outerJoinsAfterWhere); + this.sqlStringBuilder.Add(selectBuilder.ToSqlString()); + return select; + } + + protected override Expression VisitQuerySource(QuerySourceExpression expr) + { + + sqlStringBuilder.Add("SELECT "); + IClassMetadata metadata = sessionFactory.GetClassMetadata(expr.Query.ElementType); + IPropertyMapping mapping = (IPropertyMapping)sessionFactory.GetEntityPersister(metadata.EntityName); + string[] names = metadata.PropertyNames; + + + + + + + bool started = false; + for (int i = 0; i < names.Length;i++ ) + { + string name = names[i]; + IType propertyType = metadata.GetPropertyType(name); + if (!(propertyType.IsComponentType | + propertyType.IsCollectionType | + propertyType.IsAssociationType | + propertyType.IsAnyType)) + { + if(started) + sqlStringBuilder.Add(", "); + started = true; + sqlStringBuilder.Add(mapping.ToColumns(name)[0]); + sqlStringBuilder.Add(" AS "); + sqlStringBuilder.Add(name); + } + + } + sqlStringBuilder.Add(" FROM "); + sqlStringBuilder.Add(expr.Query.ElementType.Name); + return base.VisitQuerySource(expr); + } + public override string ToString() + { + return sqlStringBuilder.ToString(); + } + } +} Property changes on: trunk/nhibernate/src/NHibernate.Linq/Visitors/SqlExpressionTranslator.cs ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/nhibernate/src/NHibernate.Linq.Test/App.config =================================================================== --- trunk/nhibernate/src/NHibernate.Linq.Test/App.config 2008-09-03 20:57:21 UTC (rev 3743) +++ trunk/nhibernate/src/NHibernate.Linq.Test/App.config 2008-09-03 21:03:23 UTC (rev 3744) @@ -8,10 +8,10 @@ <session-factory name="NHibernate.Linq.Test"> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> <property name="connection.connection_string"> - Server=.\SQLEXPRESS;initial catalog=linq2nhibernate;Integrated Security=true + Server=.;initial catalog=linq2nhibernate;Integrated Security=true </property> <property name="adonet.batch_size">10</property> - <property name="show_sql">false</property> + <property name="show_sql">true</property> <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property> <property name="use_outer_join">true</property> <property name="command_timeout">444</property> Modified: trunk/nhibernate/src/NHibernate.Linq.Test/ExpressionEqualityCheckerTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq.Test/ExpressionEqualityCheckerTests.cs 2008-09-03 20:57:21 UTC (rev 3743) +++ trunk/nhibernate/src/NHibernate.Linq.Test/ExpressionEqualityCheckerTests.cs 2008-09-03 21:03:23 UTC (rev 3744) @@ -8,7 +8,7 @@ namespace NHibernate.Linq.Test { [TestFixture] - public class ExpressionEqualityCheckerTests + public class ExpressionEqualityCheckerTests:BaseTest { [Test] public void SimpleExpressionsProducesCorrectResult() Modified: trunk/nhibernate/src/NHibernate.Linq.Test/NHibernate.Linq.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Linq.Test/NHibernate.Linq.Test.csproj 2008-09-03 20:57:21 UTC (rev 3743) +++ trunk/nhibernate/src/NHibernate.Linq.Test/NHibernate.Linq.Test.csproj 2008-09-03 21:03:23 UTC (rev 3744) @@ -79,6 +79,7 @@ <Compile Include="Model\Animal.cs" /> <Compile Include="SelectTest.cs" /> <Compile Include="VisitorTests\LogicalExpressionSimplifierTests.cs" /> + <Compile Include="VisitorTests\QuerySpacesFinderVisitorTests.cs" /> </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Modified: trunk/nhibernate/src/NHibernate.Linq.Test/SelectTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq.Test/SelectTest.cs 2008-09-03 20:57:21 UTC (rev 3743) +++ trunk/nhibernate/src/NHibernate.Linq.Test/SelectTest.cs 2008-09-03 21:03:23 UTC (rev 3744) @@ -13,7 +13,7 @@ [Ignore("this doesn't work yet")] public void CanSelectAnimals() { - var animals = session.Linq<Animal>(); + var animals = session.Linq<Animal>().ToList(); Assert.IsNotNull(animals); } } Added: trunk/nhibernate/src/NHibernate.Linq.Test/VisitorTests/QuerySpacesFinderVisitorTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq.Test/VisitorTests/QuerySpacesFinderVisitorTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Linq.Test/VisitorTests/QuerySpacesFinderVisitorTests.cs 2008-09-03 21:03:23 UTC (rev 3744) @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NHibernate.Linq.Test.Model; +using NHibernate.Linq.Visitors; +using NUnit.Framework; +using System.Collections; +using NHibernate.Engine; + +namespace NHibernate.Linq.Test.VisitorTests +{ + [TestFixture] + public class QuerySpacesFinderVisitorTests:BaseTest + { + + public override void Setup() + { + base.Setup(); + visitor = new QuerySpacesFinderVisitor(session.SessionFactory as ISessionFactoryImplementor); + } + private QuerySpacesFinderVisitor visitor; + + + [NUnit.Framework.Test] + public void CanFindRoot() + { + + var results = from x in session.Linq<Animal>() + select x; + + visitor.Visit(results.Expression); + Assert.Contains(typeof (Animal).FullName, (ICollection)visitor.QuerySpaces); + } + + + [NUnit.Framework.Test] + public void CanFindProperty() + { + + var results = from x in session.Linq<Animal>() + where x.Zoo.Name=="My Zoo" + select x; + + visitor.Visit(results.Expression); + Assert.Contains(typeof(Animal).FullName, (ICollection)visitor.QuerySpaces); + Assert.Contains(typeof(Zoo).FullName, (ICollection)visitor.QuerySpaces); + Assert.That(!visitor.QuerySpaces.Contains(typeof(string).FullName)); + } + + + [NUnit.Framework.Test] + public void CanFindNestedProperty() + { + + var results = from x in session.Linq<Human>() + where x.Name.First=="Osman" && x.Pets.Count>0 + select x; + visitor.Visit(results.Expression); + Assert.Contains(typeof(Human).FullName, (ICollection)visitor.QuerySpaces); + Assert.Contains(typeof(DomesticAnimal).FullName, (ICollection)visitor.QuerySpaces); + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |