From: <cha...@us...> - 2008-08-12 19:50:31
|
Revision: 3700 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3700&view=rev Author: chadly69 Date: 2008-08-12 19:50:39 +0000 (Tue, 12 Aug 2008) Log Message: ----------- Copied Query and QueryProvider base classes from previous linq implementation and created beginnings of NHibernateQueryProvider. Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Linq/NHibernate.Linq.csproj trunk/nhibernate/src/NHibernate.Linq/NHibernateExtensions.cs trunk/nhibernate/src/NHibernate.Linq.Test/Model/Animal.hbm.xml trunk/nhibernate/src/NHibernate.Linq.Test/NHibernate.Linq.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Linq/NHibernateQueryProvider.cs trunk/nhibernate/src/NHibernate.Linq/Query.cs trunk/nhibernate/src/NHibernate.Linq/QueryProvider.cs trunk/nhibernate/src/NHibernate.Linq/Util/ trunk/nhibernate/src/NHibernate.Linq/Util/TypeSystem.cs trunk/nhibernate/src/NHibernate.Linq.Test/SelectTest.cs Modified: trunk/nhibernate/src/NHibernate.Linq/NHibernate.Linq.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Linq/NHibernate.Linq.csproj 2008-08-12 18:47:36 UTC (rev 3699) +++ trunk/nhibernate/src/NHibernate.Linq/NHibernate.Linq.csproj 2008-08-12 19:50:39 UTC (rev 3700) @@ -48,6 +48,10 @@ <ItemGroup> <Compile Include="ExpressionVisitor.cs" /> <Compile Include="NHibernateExtensions.cs" /> + <Compile Include="NHibernateQueryProvider.cs" /> + <Compile Include="Query.cs" /> + <Compile Include="QueryProvider.cs" /> + <Compile Include="Util\TypeSystem.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/NHibernateExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq/NHibernateExtensions.cs 2008-08-12 18:47:36 UTC (rev 3699) +++ trunk/nhibernate/src/NHibernate.Linq/NHibernateExtensions.cs 2008-08-12 19:50:39 UTC (rev 3700) @@ -16,7 +16,7 @@ /// <returns>An <see cref="T:NHibernate.Linq.NHibernateQueryProvider"/> used to evaluate an expression tree.</returns> public static IQueryable<T> Linq<T>(this ISession session) { - throw new NotImplementedException(); + return new Query<T>(new NHibernateQueryProvider(session)); } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Linq/NHibernateQueryProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq/NHibernateQueryProvider.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Linq/NHibernateQueryProvider.cs 2008-08-12 19:50:39 UTC (rev 3700) @@ -0,0 +1,37 @@ +using System; +using System.Linq.Expressions; +using NHibernate.Linq.Util; + +namespace NHibernate.Linq +{ + public class NHibernateQueryProvider : QueryProvider + { + private readonly ISession _session; + + public NHibernateQueryProvider(ISession session) + { + if (session == null) throw new ArgumentNullException("session"); + _session = session; + } + + public override object Execute(Expression expression) + { + throw new NotImplementedException(); + + /* iteratively process expression tree here converting to NH tree */ + + //expression = Evaluator.PartialEval(expression); + //expression = new BinaryBooleanReducer().Visit(expression); + //expression = AssociationVisitor.RewriteWithAssociations(_session.SessionFactory, expression); + //expression = CollectionAliasVisitor.AssignCollectionAccessAliases(expression); + //expression = new PropertyToMethodVisitor().Visit(expression); + //expression = new BinaryExpressionOrderer().Visit(expression); + + //once tree is converted to NH tree, pass it to NHibernateQueryTranslator + //which will convert the tree to an NHibernate.SqlCommand.SqlString + + //NHibernateQueryTranslator translator = new NHibernateQueryTranslator(_session); + //return translator.Translate(expression,this.queryOptions); + } + } +} Added: trunk/nhibernate/src/NHibernate.Linq/Query.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq/Query.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Linq/Query.cs 2008-08-12 19:50:39 UTC (rev 3700) @@ -0,0 +1,62 @@ +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Collections; +using System.Collections.Generic; + +namespace NHibernate.Linq +{ + ///<summary> + /// Generic IQueryable base class. + /// </summary> + public class Query<T> : IQueryable<T> + { + private readonly QueryProvider provider; + private readonly Expression expression; + + public Query(QueryProvider provider) + { + if (provider == null) throw new ArgumentNullException("provider"); + + this.provider = provider; + this.expression = Expression.Constant(this); + } + + public Query(QueryProvider provider, Expression expression) + { + if (provider == null) throw new ArgumentNullException("provider"); + if (expression == null) throw new ArgumentNullException("expression"); + + if (!typeof(IQueryable<T>).IsAssignableFrom(expression.Type)) + throw new ArgumentOutOfRangeException("expression"); + + this.provider = provider; + this.expression = expression; + } + + Expression IQueryable.Expression + { + get { return this.expression; } + } + + System.Type IQueryable.ElementType + { + get { return typeof(T); } + } + + IQueryProvider IQueryable.Provider + { + get { return this.provider; } + } + + public IEnumerator<T> GetEnumerator() + { + return ((IEnumerable<T>)this.provider.Execute(this.expression)).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return ((IEnumerable)this.provider.Execute(this.expression)).GetEnumerator(); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Linq/QueryProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq/QueryProvider.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Linq/QueryProvider.cs 2008-08-12 19:50:39 UTC (rev 3700) @@ -0,0 +1,37 @@ +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Collections.Generic; +using NHibernate.Linq.Util; + +namespace NHibernate.Linq +{ + /// <summary> + /// Generic IQueryProvider base class. + /// </summary> + public abstract class QueryProvider : IQueryProvider + { + IQueryable<T> IQueryProvider.CreateQuery<T>(Expression expression) + { + return new Query<T>(this, expression); + } + + IQueryable IQueryProvider.CreateQuery(Expression expression) + { + System.Type elementType = TypeSystem.GetElementType(expression.Type); + return (IQueryable)Activator.CreateInstance(typeof(Query<>).MakeGenericType(elementType), new object[] { this, expression }); + } + + T IQueryProvider.Execute<T>(Expression expression) + { + return (T)this.Execute(expression); + } + + object IQueryProvider.Execute(Expression expression) + { + return this.Execute(expression); + } + + public abstract object Execute(Expression expression); + } +} Added: trunk/nhibernate/src/NHibernate.Linq/Util/TypeSystem.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq/Util/TypeSystem.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Linq/Util/TypeSystem.cs 2008-08-12 19:50:39 UTC (rev 3700) @@ -0,0 +1,58 @@ +using System; +using System.Diagnostics; +using System.Collections.Generic; +using System.Linq; + +namespace NHibernate.Linq.Util +{ + /// <remarks> + /// Copied from internal class of same name in System.Core assembly. + /// </remarks> + [DebuggerStepThrough, DebuggerNonUserCode] + public static class TypeSystem + { + public static System.Type GetElementType(System.Type seqType) + { + System.Type ienum = FindIEnumerable(seqType); + if (ienum == null) return seqType; + return ienum.GetGenericArguments()[0]; + } + + private static System.Type FindIEnumerable(System.Type seqType) + { + if (seqType == null || seqType == typeof(string)) + return null; + + if (seqType.IsArray) + return typeof(IEnumerable<>).MakeGenericType(seqType.GetElementType()); + + if (seqType.IsGenericType) + { + foreach (System.Type arg in seqType.GetGenericArguments()) + { + System.Type ienum = typeof(IEnumerable<>).MakeGenericType(arg); + if (ienum.IsAssignableFrom(seqType)) + { + return ienum; + } + } + } + + System.Type[] ifaces = seqType.GetInterfaces(); + if (ifaces != null && ifaces.Length > 0) + { + foreach (System.Type iface in ifaces) + { + System.Type ienum = FindIEnumerable(iface); + if (ienum != null) return ienum; + } + } + + if (seqType.BaseType != null && seqType.BaseType != typeof(object)) + { + return FindIEnumerable(seqType.BaseType); + } + return null; + } + } +} Modified: trunk/nhibernate/src/NHibernate.Linq.Test/Model/Animal.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Linq.Test/Model/Animal.hbm.xml 2008-08-12 18:47:36 UTC (rev 3699) +++ trunk/nhibernate/src/NHibernate.Linq.Test/Model/Animal.hbm.xml 2008-08-12 19:50:39 UTC (rev 3700) @@ -12,7 +12,7 @@ <many-to-one name="Zoo" column="zoo_id"/> <property name="SerialNumber"/> - <set name="Offspring" order-by="father_id"> + <set name="Offspring"> <key column="mother_id"/> <one-to-many class="Animal"/> </set> @@ -66,11 +66,11 @@ <many-to-many column="Human2" class="Human"/> </bag> - <map name="Family"> + <!--<map name="Family"> <key column="Human1"/> <map-key column="Relationship" type="AnsiString"/> <many-to-many column="Human2" class="Human"/> - </map> + </map>--> <bag name="Pets" inverse="true"> <key column="Owner"/> @@ -82,7 +82,7 @@ <element column="nick_name" type="string" not-null="true" /> </set> - <map name="Addresses" table="addresses"> + <!--<map name="Addresses" table="addresses"> <key column="Human"/> <map-key type="string" column="type" /> @@ -93,12 +93,12 @@ <property name="Country"/> <many-to-one name="StateProvince" column="state_prov_id" class="StateProvince" /> </composite-element> - </map> + </map>--> </joined-subclass> </joined-subclass> </class> - <class name="User" table="User"> + <class name="User" table="`User`"> <id name="Id"> <generator class="foreign"> <param name="property">Human</param> @@ -124,7 +124,7 @@ <property name="Name" type="String"/> <property name="Classification" /> - <map name="Mammals"> + <!--<map name="Mammals"> <key column="MammalZoo_id"/> <index type="string" column="Name"/> <one-to-many class="Mammal"/> @@ -134,7 +134,7 @@ <key column="zoo_id"/> <index type="string" column="SerialNumber"/> <one-to-many class="Animal"/> - </map> + </map>--> <component name="Address" class="Address"> <property name="Street"/> Modified: trunk/nhibernate/src/NHibernate.Linq.Test/NHibernate.Linq.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Linq.Test/NHibernate.Linq.Test.csproj 2008-08-12 18:47:36 UTC (rev 3699) +++ trunk/nhibernate/src/NHibernate.Linq.Test/NHibernate.Linq.Test.csproj 2008-08-12 19:50:39 UTC (rev 3700) @@ -75,6 +75,7 @@ <Compile Include="BaseTest.cs" /> <Compile Include="GlobalSetup.cs" /> <Compile Include="Model\Animal.cs" /> + <Compile Include="SelectTest.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. Added: trunk/nhibernate/src/NHibernate.Linq.Test/SelectTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Linq.Test/SelectTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Linq.Test/SelectTest.cs 2008-08-12 19:50:39 UTC (rev 3700) @@ -0,0 +1,19 @@ +using System; +using System.Linq; +using NUnit.Framework; +using NHibernate.Linq.Test.Model; + +namespace NHibernate.Linq.Test +{ + [TestFixture] + public class SelectTest : BaseTest + { + [Test] + [Ignore("this doesn't work yet")] + public void CanSelectAnimals() + { + var animals = session.Linq<Animal>(); + Assert.IsNotNull(animals); + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |