From: <fab...@us...> - 2010-09-22 16:04:23
|
Revision: 5199 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5199&view=rev Author: fabiomaulo Date: 2010-09-22 16:04:12 +0000 (Wed, 22 Sep 2010) Log Message: ----------- Fix NH-2288 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate/Cfg/Mappings.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingRootBinder.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/AclassWithDefault.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/AclassWithNothing.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/AclassWithSpecific.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2010-09-21 15:00:19 UTC (rev 5198) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2010-09-22 16:04:12 UTC (rev 5199) @@ -552,11 +552,14 @@ /// </summary> public Mappings CreateMappings(Dialect.Dialect dialect) { + string defaultCatalog = PropertiesHelper.GetString(Environment.DefaultCatalog, properties, null); + string defaultSchema = PropertiesHelper.GetString(Environment.DefaultSchema, properties, null); + ProcessPreMappingBuildProperties(); return new Mappings(classes, collections, tables, NamedQueries, NamedSQLQueries, SqlResultSetMappings, Imports, secondPasses, filtersSecondPasses, propertyReferences, namingStrategy, typeDefs, FilterDefinitions, extendsQueue, auxiliaryDatabaseObjects, tableNameBinding, columnNameBindingPerTable, defaultAssembly, - defaultNamespace, dialect); + defaultNamespace, defaultCatalog, defaultSchema, dialect); } private void ProcessPreMappingBuildProperties() Modified: trunk/nhibernate/src/NHibernate/Cfg/Mappings.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Mappings.cs 2010-09-21 15:00:19 UTC (rev 5198) +++ trunk/nhibernate/src/NHibernate/Cfg/Mappings.cs 2010-09-22 16:04:12 UTC (rev 5199) @@ -110,6 +110,8 @@ IDictionary<Table, ColumnNames> columnNameBindingPerTable, string defaultAssembly, string defaultNamespace, + string defaultCatalog, + string defaultSchema, Dialect.Dialect dialect) { this.classes = classes; @@ -130,6 +132,8 @@ this.columnNameBindingPerTable = columnNameBindingPerTable; this.defaultAssembly = defaultAssembly; this.defaultNamespace = defaultNamespace; + DefaultCatalog = defaultCatalog; + DefaultSchema = defaultSchema; this.dialect = dialect; this.filtersSecondPasses = filtersSecondPasses; } @@ -209,6 +213,9 @@ set { defaultAssembly = value; } } + public string DefaultCatalog { get; set; } + public string DefaultSchema { get; set; } + public Mapping.Collection GetCollection(string role) { return collections[role]; Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingRootBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingRootBinder.cs 2010-09-21 15:00:19 UTC (rev 5198) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingRootBinder.cs 2010-09-22 16:04:12 UTC (rev 5199) @@ -57,8 +57,8 @@ private void SetMappingsProperties(HbmMapping mappingSchema) { - mappings.SchemaName = mappingSchema.schema; - mappings.CatalogName = mappingSchema.catalog; + mappings.SchemaName = mappingSchema.schema ?? mappings.DefaultSchema; + mappings.CatalogName = mappingSchema.catalog ?? mappings.DefaultCatalog; mappings.DefaultCascade = mappingSchema.defaultcascade; mappings.DefaultAccess = mappingSchema.defaultaccess; mappings.DefaultLazy = mappingSchema.defaultlazy; Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/AclassWithDefault.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/AclassWithDefault.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/AclassWithDefault.hbm.xml 2010-09-22 16:04:12 UTC (rev 5199) @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH2288" + assembly="NHibernate.Test" + catalog="nhibernate" + schema="dbo"> + + <class name="Aclass"> + <id name="Id"> + <generator class="native"/> + </id> + </class> + + <class name="Bclass"> + <id name="Id"> + <generator class="native"/> + </id> + <bag name="Aclasses"> + <key foreign-key="Aclasses_Id_FK" /> + <one-to-many class="Aclass"/> + </bag> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/AclassWithNothing.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/AclassWithNothing.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/AclassWithNothing.hbm.xml 2010-09-22 16:04:12 UTC (rev 5199) @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH2288" + assembly="NHibernate.Test"> + + <class name="Aclass"> + <id name="Id"> + <generator class="native"/> + </id> + </class> + + <class name="Bclass"> + <id name="Id"> + <generator class="native"/> + </id> + <bag name="Aclasses"> + <key foreign-key="Aclasses_Id_FK" /> + <one-to-many class="Aclass"/> + </bag> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/AclassWithSpecific.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/AclassWithSpecific.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/AclassWithSpecific.hbm.xml 2010-09-22 16:04:12 UTC (rev 5199) @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH2288" + assembly="NHibernate.Test" + catalog="somethingDifferent" + schema="somethingDifferent"> + + <class name="Aclass" catalog="nhibernate" schema="dbo"> + <id name="Id"> + <generator class="native"/> + </id> + </class> + + <class name="Bclass" catalog="nhibernate" schema="dbo"> + <id name="Id"> + <generator class="native"/> + </id> + <bag name="Aclasses"> + <key foreign-key="Aclasses_Id_FK" /> + <one-to-many class="Aclass"/> + </bag> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2288/Fixture.cs 2010-09-22 16:04:12 UTC (rev 5199) @@ -0,0 +1,84 @@ +using System.Collections; +using System.Text; +using NHibernate.Cfg; +using NHibernate.Tool.hbm2ddl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2288 +{ + [TestFixture] + public class Fixture + { + private static void CheckDialect(Configuration configuration) + { + if (!configuration.Properties[Environment.Dialect].Contains("MsSql")) + Assert.Ignore("Specific test for MsSQL dialects"); + } + + private static void AssertThatCheckOnTableExistenceIsCorrect(Configuration configuration) + { + var su = new SchemaExport(configuration); + var sb = new StringBuilder(500); + su.Execute(x => sb.AppendLine(x), false, false); + string script = sb.ToString(); + script.Should().Contain( + "if exists (select 1 from sys.objects where object_id = OBJECT_ID(N'dbo.[Aclasses_Id_FK]') AND parent_object_id = OBJECT_ID('dbo.Aclass'))"); + } + + [Test] + public void TestForClassWithDefaultSchema() + { + Configuration cfg = TestConfigurationHelper.GetDefaultConfiguration(); + CheckDialect(cfg); + cfg.SetProperty(Environment.DefaultCatalog, "nhibernate"); + cfg.SetProperty(Environment.DefaultSchema, "dbo"); + cfg.AddResource("NHibernate.Test.NHSpecificTest.NH2288.AclassWithNothing.hbm.xml", GetType().Assembly); + AssertThatCheckOnTableExistenceIsCorrect(cfg); + } + + [Test] + public void WithDefaultValuesInMapping() + { + Configuration cfg = TestConfigurationHelper.GetDefaultConfiguration(); + CheckDialect(cfg); + cfg.SetProperty(Environment.DefaultCatalog, "nhibernate"); + cfg.SetProperty(Environment.DefaultSchema, "somethingDifferent"); + cfg.AddResource("NHibernate.Test.NHSpecificTest.NH2288.AclassWithDefault.hbm.xml", GetType().Assembly); + AssertThatCheckOnTableExistenceIsCorrect(cfg); + } + + [Test] + public void WithSpecificValuesInMapping() + { + Configuration cfg = TestConfigurationHelper.GetDefaultConfiguration(); + CheckDialect(cfg); + cfg.SetProperty(Environment.DefaultCatalog, "nhibernate"); + cfg.SetProperty(Environment.DefaultSchema, "somethingDifferent"); + cfg.AddResource("NHibernate.Test.NHSpecificTest.NH2288.AclassWithSpecific.hbm.xml", GetType().Assembly); + AssertThatCheckOnTableExistenceIsCorrect(cfg); + } + + [Test] + public void WithDefaultValuesInConfigurationPriorityToMapping() + { + Configuration cfg = TestConfigurationHelper.GetDefaultConfiguration(); + CheckDialect(cfg); + cfg.SetProperty(Environment.DefaultCatalog, "nhibernate"); + cfg.SetProperty(Environment.DefaultSchema, "somethingDifferent"); + cfg.AddResource("NHibernate.Test.NHSpecificTest.NH2288.AclassWithDefault.hbm.xml", GetType().Assembly); + AssertThatCheckOnTableExistenceIsCorrect(cfg); + } + } + + public class Aclass + { + public int Id { get; set; } + } + + public class Bclass + { + public int Id { get; set; } + public ICollection Aclasses { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-21 15:00:19 UTC (rev 5198) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-22 16:04:12 UTC (rev 5199) @@ -487,6 +487,7 @@ <Compile Include="NHSpecificTest\NH2279\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2287\Domain.cs" /> <Compile Include="NHSpecificTest\NH2287\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2288\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2293\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2294\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2302\Fixture.cs" /> @@ -2290,6 +2291,9 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2288\AclassWithDefault.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\NH2288\AclassWithNothing.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\NH2288\AclassWithSpecific.hbm.xml" /> <EmbeddedResource Include="TypesTest\XmlDocClass.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2302\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2303\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-09-22 19:57:50
|
Revision: 5201 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5201&view=rev Author: fabiomaulo Date: 2010-09-22 19:57:43 +0000 (Wed, 22 Sep 2010) Log Message: ----------- Fix NH-2289 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/NhRelinqQueryParser.cs trunk/nhibernate/src/NHibernate.Test/Linq/WhereTests.cs Modified: trunk/nhibernate/src/NHibernate/Linq/NhRelinqQueryParser.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/NhRelinqQueryParser.cs 2010-09-22 17:05:14 UTC (rev 5200) +++ trunk/nhibernate/src/NHibernate/Linq/NhRelinqQueryParser.cs 2010-09-22 19:57:43 UTC (rev 5201) @@ -29,15 +29,17 @@ }, typeof (AggregateExpressionNode)); - MethodCallRegistry.Register( - new[] - { - MethodCallExpressionNodeTypeRegistry.GetRegisterableMethodDefinition( - ReflectionHelper.GetMethodDefinition((List<object> l) => l.Contains(null))), + // Here would be useful to have something like our ReflectionHelper.IsMethodOf because it is impossible to know + // which is the implementation of ICollection<T> used by our user. Reported to Stefan Wenig as possible (via mail instead of their JIAR) + MethodCallRegistry.Register( + new[] + { + MethodCallExpressionNodeTypeRegistry.GetRegisterableMethodDefinition( + ReflectionHelper.GetMethodDefinition((List<object> l) => l.Contains(null))), + typeof (ICollection<>).GetMethod("Contains"), + }, + typeof (ContainsExpressionNode)); - }, - typeof (ContainsExpressionNode)); - MethodCallRegistry.Register(new[] { typeof(EagerFetchingExtensionMethods).GetMethod("Fetch") }, typeof(FetchOneExpressionNode)); MethodCallRegistry.Register(new[] { typeof(EagerFetchingExtensionMethods).GetMethod("FetchMany") }, typeof(FetchManyExpressionNode)); MethodCallRegistry.Register(new[] { typeof(EagerFetchingExtensionMethods).GetMethod("ThenFetch") }, typeof(ThenFetchOneExpressionNode)); Modified: trunk/nhibernate/src/NHibernate.Test/Linq/WhereTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Linq/WhereTests.cs 2010-09-22 17:05:14 UTC (rev 5200) +++ trunk/nhibernate/src/NHibernate.Test/Linq/WhereTests.cs 2010-09-22 19:57:43 UTC (rev 5201) @@ -326,7 +326,7 @@ Assert.AreEqual(2, query.Count); } - [Test, Ignore("Not fixed yet NH-2289")] + [Test] public void WhenTheSourceOfConstantIsICollectionThenNoThrows() { ICollection<string> names = new List<string> {"ayende", "rahien"}; @@ -340,6 +340,19 @@ } [Test] + public void WhenTheSourceOfConstantIsIListThenNoThrows() + { + IList<string> names = new List<string> { "ayende", "rahien" }; + + var query = (from user in db.Users + where names.Contains(user.Name) + select user); + List<User> result = null; + Executing.This(() => result = query.ToList()).Should().NotThrow(); + result.Count.Should().Be(2); + } + + [Test] public void TimesheetsWithCollectionContains() { var entry = session.Get<TimesheetEntry>(1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-09-22 20:25:16
|
Revision: 5202 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5202&view=rev Author: fabiomaulo Date: 2010-09-22 20:25:09 +0000 (Wed, 22 Sep 2010) Log Message: ----------- Fixed one of the two issues reported in NH-2206 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/Linq/WhereTests.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessCast.cs Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs 2010-09-22 19:57:43 UTC (rev 5201) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs 2010-09-22 20:25:09 UTC (rev 5202) @@ -80,7 +80,8 @@ ResultOperatorMap.Add<FetchManyRequest, ProcessFetchMany>(); ResultOperatorMap.Add<CacheableResultOperator, ProcessCacheable>(); ResultOperatorMap.Add<OfTypeResultOperator, ProcessOfType>(); - } + ResultOperatorMap.Add<CastResultOperator, ProcessCast>(); + } private QueryModelVisitor(VisitorParameters visitorParameters, bool root, QueryModel queryModel) { Added: trunk/nhibernate/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessCast.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessCast.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessCast.cs 2010-09-22 20:25:09 UTC (rev 5202) @@ -0,0 +1,16 @@ +using Remotion.Data.Linq.Clauses.ResultOperators; + +namespace NHibernate.Linq.Visitors.ResultOperatorProcessors +{ + public class ProcessCast : IResultOperatorProcessor<CastResultOperator> + { + public void Process(CastResultOperator resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree) + { + // what we can do with Cast, so far, is only ignore it. + // The meaning of Cast<T>() is different than OfType<T>. + // With OfType<T> the user selects a specific entity-type; + // with Cast<T> the user "hopes" that everything will work with the same type + // When we will have some more detail we can change this "implementation" ;) + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-09-22 19:57:43 UTC (rev 5201) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-09-22 20:25:09 UTC (rev 5202) @@ -694,6 +694,7 @@ <Compile Include="Linq\ReWriters\RemoveUnnecessaryBodyOperators.cs" /> <Compile Include="Linq\Clauses\LeftJoinClause.cs" /> <Compile Include="Linq\IntermediateHqlTree.cs" /> + <Compile Include="Linq\Visitors\ResultOperatorProcessors\ProcessCast.cs" /> <Compile Include="Linq\Visitors\ResultOperatorProcessors\ProcessOfType.cs" /> <Compile Include="Linq\Visitors\ResultOperatorProcessors\ProcessCacheable.cs" /> <Compile Include="Linq\Visitors\QuerySourceLocator.cs" /> @@ -1554,9 +1555,6 @@ <ItemGroup> <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" /> </ItemGroup> - <ItemGroup> - <Folder Include="Cache\Access" /> - </ItemGroup> <Import Project="$(MSBuildBinPath)\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.Test/Linq/WhereTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Linq/WhereTests.cs 2010-09-22 19:57:43 UTC (rev 5201) +++ trunk/nhibernate/src/NHibernate.Test/Linq/WhereTests.cs 2010-09-22 20:25:09 UTC (rev 5202) @@ -430,7 +430,7 @@ Assert.AreEqual(2, query.Count); } - [Test(Description = "Reported as bug NH-2206"), Ignore("Not fixed yet")] + [Test(Description = "Reported as bug NH-2206")] public void SearchOnObjectTypeUpCastWithExtensionMethod() { var query = (from o in session.Query<Dog>() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ric...@us...> - 2010-09-22 21:01:41
|
Revision: 5203 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5203&view=rev Author: ricbrown Date: 2010-09-22 21:01:34 +0000 (Wed, 22 Sep 2010) Log Message: ----------- Fix NH-2024 (Max results parameter could not provided to sub-query) Pushed QuotedAndParenthesisStringTokenizer up to Dialect base class to share with Oracle. On Oracle, fixes: NHibernate.Test.Criteria.CriteriaQueryTest.SubqueryPagination NHibernate.Test.Criteria.CriteriaQueryTest.SubqueryPaginationOnlyWithFirst NHibernate.Test.NHSpecificTest.NH2251.Fixture.MultiplePagingParametersInSingleQuery Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/SubqueryExpression.cs trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs trunk/nhibernate/src/NHibernate/Dialect/Oracle8iDialect.cs trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/SubqueryExpression.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/SubqueryExpression.cs 2010-09-22 20:25:09 UTC (rev 5202) +++ trunk/nhibernate/src/NHibernate/Criterion/SubqueryExpression.cs 2010-09-22 21:01:34 UTC (rev 5203) @@ -68,10 +68,11 @@ if (criteriaImpl.FirstResult != 0 || criteriaImpl.MaxResults != RowSelection.NoValue) { - int maxResults = (criteriaImpl.MaxResults != RowSelection.NoValue) ? criteriaImpl.MaxResults : int.MaxValue; - int? offsetParameterIndex = criteriaQuery.CreatePagingParameter(criteriaImpl.FirstResult); + int firstResults = Loader.Loader.GetFirstRow(parameters.RowSelection); + int maxResults = Loader.Loader.GetMaxOrLimit(factory.Dialect, parameters.RowSelection); + int? offsetParameterIndex = criteriaQuery.CreatePagingParameter(firstResults); int? limitParameterIndex = criteriaQuery.CreatePagingParameter(maxResults); - sql = factory.Dialect.GetLimitString(sql, criteriaImpl.FirstResult, criteriaImpl.MaxResults, offsetParameterIndex, limitParameterIndex); + sql = factory.Dialect.GetLimitString(sql, firstResults, maxResults, offsetParameterIndex, limitParameterIndex); } if (op != null) Modified: trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs 2010-09-22 20:25:09 UTC (rev 5202) +++ trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs 2010-09-22 21:01:34 UTC (rev 5203) @@ -1,10 +1,10 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Text; using Iesi.Collections.Generic; - using NHibernate.Dialect.Function; using NHibernate.Dialect.Lock; using NHibernate.Dialect.Schema; @@ -1337,6 +1337,256 @@ return value ? "1" : "0"; } + protected static void ExtractColumnOrAliasNames(SqlString select, out List<SqlString> columnsOrAliases, + out Dictionary<SqlString, SqlString> aliasToColumn) + { + columnsOrAliases = new List<SqlString>(); + aliasToColumn = new Dictionary<SqlString, SqlString>(); + + IList<SqlString> tokens = new QuotedAndParenthesisStringTokenizer(select).GetTokens(); + int index = 0; + while (index < tokens.Count) + { + SqlString token = tokens[index]; + + int nextTokenIndex = index += 1; + + if (token.StartsWithCaseInsensitive("select")) + continue; + + if (token.StartsWithCaseInsensitive("distinct")) + continue; + + if (token.StartsWithCaseInsensitive(",")) + continue; + + if (token.StartsWithCaseInsensitive("from")) + break; + + // handle composite expressions like "2 * 4 as foo" + while ((nextTokenIndex < tokens.Count) + && (tokens[nextTokenIndex].StartsWithCaseInsensitive("as") == false + && tokens[nextTokenIndex].StartsWithCaseInsensitive("from") == false + && tokens[nextTokenIndex].StartsWithCaseInsensitive(",") == false)) + { + SqlString nextToken = tokens[nextTokenIndex]; + token = token.Append(nextToken); + nextTokenIndex = index += 1; + } + + // if there is no alias, the token and the alias will be the same + SqlString alias = token; + + bool isFunctionCallOrQuotedString = token.IndexOfCaseInsensitive("'") >= 0 || token.IndexOfCaseInsensitive("(") >= 0; + + // this is heuristic guess, if the expression contains ' or (, it is probably + // not appropriate to just slice parts off of it + if (isFunctionCallOrQuotedString == false) + { + // its a simple column reference, so lets set the alias to the + // column name minus the table qualifier if it exists + int dot = token.IndexOfCaseInsensitive("."); + if (dot != -1) + alias = token.Substring(dot + 1); + } + + // notice! we are checking here the existence of "as" "alias", two + // tokens from the current one + if (nextTokenIndex + 1 < tokens.Count) + { + SqlString nextToken = tokens[nextTokenIndex]; + if (nextToken.IndexOfCaseInsensitive("as") >= 0) + { + SqlString tokenAfterNext = tokens[nextTokenIndex + 1]; + alias = tokenAfterNext; + index += 2; //skip the "as" and the alias + } + } + + columnsOrAliases.Add(alias); + aliasToColumn[alias] = token; + } + } + + /// <summary> + /// This specialized string tokenizier will break a string to tokens, taking + /// into account single quotes, parenthesis and commas and [ ] + /// Notice that we aren't differenciating between [ ) and ( ] on purpose, it would complicate + /// the code and it is not legal at any rate. + /// </summary> + public class QuotedAndParenthesisStringTokenizer : IEnumerable<SqlString> + { + private readonly SqlString original; + + public QuotedAndParenthesisStringTokenizer(SqlString original) + { + this.original = original; + } + + IEnumerator<SqlString> IEnumerable<SqlString>.GetEnumerator() + { + TokenizerState state = TokenizerState.WhiteSpace; + int parenthesisCount = 0; + bool escapeQuote = false; + char quoteType = '\''; + int tokenStart = 0; + int tokenLength = 0; + string originalString = original.ToString(); + + for (int i = 0; i < originalString.Length; i++) + { + char ch = originalString[i]; + switch (state) + { + case TokenizerState.WhiteSpace: + if (ch == '\'') + { + state = TokenizerState.Quoted; + quoteType = '\''; + tokenLength += 1; + } + else if (ch == '"') + { + state = TokenizerState.Quoted; + quoteType = '"'; + tokenLength += 1; + } + else if (ch == ',') + { + yield return new SqlString(","); + tokenStart += 1; + } + else if (ch == '(' || ch == '[') + { + state = TokenizerState.InParenthesis; + tokenLength += 1; + parenthesisCount = 1; + } + else if (char.IsWhiteSpace(ch) == false) + { + state = TokenizerState.Token; + tokenLength += 1; + } + else + { + tokenStart += 1; + } + break; + case TokenizerState.Quoted: + if (escapeQuote) + { + escapeQuote = false; + tokenLength += 1; + } + // handle escaping of ' by using '' or \' + else if (ch == '\\' || (ch == quoteType && i + 1 < originalString.Length && originalString[i + 1] == quoteType)) + { + escapeQuote = true; + tokenLength += 1; + } + else if (ch == quoteType) + { + yield return original.Substring(tokenStart, tokenLength + 1); + tokenStart += tokenLength + 1; + tokenLength = 0; + state = TokenizerState.WhiteSpace; + } + else + { + tokenLength += 1; + } + break; + case TokenizerState.InParenthesis: + if (ch == ')' || ch == ']') + { + tokenLength += 1; + parenthesisCount -= 1; + if (parenthesisCount == 0) + { + yield return original.Substring(tokenStart, tokenLength); + tokenStart += tokenLength; + tokenLength = 0; + state = TokenizerState.WhiteSpace; + } + } + else if (ch == '(' || ch == '[') + { + tokenLength += 1; + parenthesisCount += 1; + } + else + { + tokenLength += 1; + } + break; + case TokenizerState.Token: + if (char.IsWhiteSpace(ch)) + { + yield return original.Substring(tokenStart, tokenLength); + tokenStart += tokenLength + 1; + tokenLength = 0; + state = TokenizerState.WhiteSpace; + } + else if (ch == ',') // stop current token, and send the , as well + { + yield return original.Substring(tokenStart, tokenLength); + yield return new SqlString(","); + tokenStart += tokenLength + 1; + tokenLength = 0; + state = TokenizerState.WhiteSpace; + } + else if (ch == '(' || ch == '[') + { + state = TokenizerState.InParenthesis; + parenthesisCount = 1; + tokenLength += 1; + } + else if (ch == '\'') + { + state = TokenizerState.Quoted; + quoteType = '\''; + tokenLength += 1; + } + else if (ch == '"') + { + state = TokenizerState.Quoted; + quoteType = '"'; + tokenLength += 1; + } + else + { + tokenLength += 1; + } + break; + default: + throw new InvalidExpressionException("Could not understand the string " + original); + } + } + if (tokenLength > 0) + { + yield return original.Substring(tokenStart, tokenLength); + } + } + + public IEnumerator GetEnumerator() + { + return ((IEnumerable<SqlString>)this).GetEnumerator(); + } + + public enum TokenizerState + { + WhiteSpace, + Quoted, + InParenthesis, + Token + } + + public IList<SqlString> GetTokens() + { + return new List<SqlString>(this); + } + } + #endregion #region limit/offset support Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2010-09-22 20:25:09 UTC (rev 5202) +++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2010-09-22 21:01:34 UTC (rev 5203) @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.Collections.Generic; using System.Data; using NHibernate.Mapping; @@ -153,74 +152,6 @@ throw new NotSupportedException("The query should start with 'SELECT' or 'SELECT DISTINCT'"); } - private static void ExtractColumnOrAliasNames(SqlString select, out List<SqlString> columnsOrAliases, - out Dictionary<SqlString, SqlString> aliasToColumn) - { - columnsOrAliases = new List<SqlString>(); - aliasToColumn = new Dictionary<SqlString, SqlString>(); - - IList<SqlString> tokens = new QuotedAndParenthesisStringTokenizer(select).GetTokens(); - int index = 0; - while (index < tokens.Count) - { - SqlString token = tokens[index]; - - int nextTokenIndex = index += 1; - - if (token.StartsWithCaseInsensitive("select")) - continue; - - if (token.StartsWithCaseInsensitive("distinct")) - continue; - - if (token.StartsWithCaseInsensitive(",")) - continue; - - if (token.StartsWithCaseInsensitive("from")) - break; - - // handle composite expressions like "2 * 4 as foo" - while ((nextTokenIndex < tokens.Count) && (tokens[nextTokenIndex].StartsWithCaseInsensitive("as") == false && tokens[nextTokenIndex].StartsWithCaseInsensitive(",") == false)) - { - SqlString nextToken = tokens[nextTokenIndex]; - token = token.Append(nextToken); - nextTokenIndex = index += 1; - } - - // if there is no alias, the token and the alias will be the same - SqlString alias = token; - - bool isFunctionCallOrQuotedString = token.IndexOfCaseInsensitive("'") >= 0 || token.IndexOfCaseInsensitive("(") >= 0; - - // this is heuristic guess, if the expression contains ' or (, it is probably - // not appropriate to just slice parts off of it - if (isFunctionCallOrQuotedString == false) - { - // its a simple column reference, so lets set the alias to the - // column name minus the table qualifier if it exists - int dot = token.IndexOfCaseInsensitive("."); - if (dot != -1) - alias = token.Substring(dot + 1); - } - - // notice! we are checking here the existence of "as" "alias", two - // tokens from the current one - if (nextTokenIndex + 1 < tokens.Count) - { - SqlString nextToken = tokens[nextTokenIndex]; - if (nextToken.IndexOfCaseInsensitive("as") >= 0) - { - SqlString tokenAfterNext = tokens[nextTokenIndex + 1]; - alias = tokenAfterNext; - index += 2; //skip the "as" and the alias - } - } - - columnsOrAliases.Add(alias); - aliasToColumn[alias] = token; - } - } - /// <summary> /// Indicates whether the string fragment contains matching parenthesis /// </summary> @@ -309,164 +240,5 @@ get { return false; } } - /// <summary> - /// This specialized string tokenizier will break a string to tokens, taking - /// into account single quotes, parenthesis and commas and [ ] - /// Notice that we aren't differenciating between [ ) and ( ] on purpose, it would complicate - /// the code and it is not legal at any rate. - /// </summary> - public class QuotedAndParenthesisStringTokenizer : IEnumerable<SqlString> - { - private readonly SqlString original; - - public QuotedAndParenthesisStringTokenizer(SqlString original) - { - this.original = original; - } - - IEnumerator<SqlString> IEnumerable<SqlString>.GetEnumerator() - { - TokenizerState state = TokenizerState.WhiteSpace; - int parenthesisCount = 0; - bool escapeQuote = false; - int tokenStart = 0; - int tokenLength = 0; - string originalString = original.ToString(); - - for (int i = 0; i < originalString.Length; i++) - { - char ch = originalString[i]; - switch (state) - { - case TokenizerState.WhiteSpace: - if (ch == '\'') - { - state = TokenizerState.Quoted; - tokenLength += 1; - } - else if (ch == ',') - { - yield return new SqlString(","); - //tokenLength += 1? - } - else if (ch == '(' || ch == '[') - { - state = TokenizerState.InParenthesis; - tokenLength += 1; - parenthesisCount = 1; - } - else if (char.IsWhiteSpace(ch) == false) - { - state = TokenizerState.Token; - tokenLength += 1; - } - break; - case TokenizerState.Quoted: - if (escapeQuote) - { - escapeQuote = false; - tokenLength += 1; - } - // handle escaping of ' by using '' or \' - else if (ch == '\\' || (ch == '\'' && i + 1 < originalString.Length && originalString[i + 1] == '\'')) - { - escapeQuote = true; - tokenLength += 1; - } - else if (ch == '\'') - { - yield return original.Substring(tokenStart, tokenLength); - tokenStart += tokenLength + 1; - tokenLength = 0; - state = TokenizerState.WhiteSpace; - } - else - { - tokenLength += 1; - } - break; - case TokenizerState.InParenthesis: - if (ch == ')' || ch == ']') - { - tokenLength += 1; - parenthesisCount -= 1; - if (parenthesisCount == 0) - { - yield return original.Substring(tokenStart, tokenLength); - tokenStart += tokenLength + 1; - tokenLength = 0; - state = TokenizerState.WhiteSpace; - } - } - else if (ch == '(' || ch == '[') - { - tokenLength += 1; - parenthesisCount += 1; - } - else - { - tokenLength += 1; - } - break; - case TokenizerState.Token: - if (char.IsWhiteSpace(ch)) - { - yield return original.Substring(tokenStart, tokenLength); - tokenStart += tokenLength + 1; - tokenLength = 0; - state = TokenizerState.WhiteSpace; - } - else if (ch == ',') // stop current token, and send the , as well - { - yield return original.Substring(tokenStart, tokenLength); - yield return new SqlString(","); - tokenStart += tokenLength + 2; - tokenLength = 0; - state = TokenizerState.WhiteSpace; - } - else if (ch == '(' || ch == '[') - { - state = TokenizerState.InParenthesis; - parenthesisCount = 1; - tokenLength += 1; - } - else if (ch == '\'') - { - state = TokenizerState.Quoted; - tokenLength += 1; - } - else - { - tokenLength += 1; - } - break; - default: - throw new InvalidExpressionException("Could not understand the string " + original); - } - } - if (tokenLength > 0) - { - yield return original.Substring(tokenStart, tokenLength); - } - } - - public IEnumerator GetEnumerator() - { - return ((IEnumerable<SqlString>)this).GetEnumerator(); - } - - public enum TokenizerState - { - WhiteSpace, - Quoted, - InParenthesis, - Token - } - - public IList<SqlString> GetTokens() - { - return new List<SqlString>(this); - } - } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Dialect/Oracle8iDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Oracle8iDialect.cs 2010-09-22 20:25:09 UTC (rev 5202) +++ trunk/nhibernate/src/NHibernate/Dialect/Oracle8iDialect.cs 2010-09-22 21:01:34 UTC (rev 5203) @@ -1,14 +1,16 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Data; +using System.Data.Common; using NHibernate.Dialect.Function; using NHibernate.Dialect.Schema; using NHibernate.Engine; using NHibernate.SqlCommand; using NHibernate.SqlTypes; using NHibernate.Type; -using Environment=NHibernate.Cfg.Environment; -using System.Data.Common; +using NHibernate.Util; +using Environment = NHibernate.Cfg.Environment; namespace NHibernate.Dialect { @@ -259,14 +261,16 @@ isForUpdate = true; } + string selectColumns = ExtractColumnOrAliasNames(sql); + var pagingSelect = new SqlStringBuilder(sql.Parts.Count + 10); if (hasOffset) { - pagingSelect.Add("select * from ( select row_.*, rownum rownum_ from ( "); + pagingSelect.Add("select " + selectColumns + " from ( select row_.*, rownum rownum_ from ( "); } else { - pagingSelect.Add("select * from ( "); + pagingSelect.Add("select " + selectColumns + " from ( "); } pagingSelect.Add(sql); if (hasOffset) @@ -286,6 +290,15 @@ return pagingSelect.ToSqlString(); } + private string ExtractColumnOrAliasNames(SqlString select) + { + List<SqlString> columnsOrAliases; + Dictionary<SqlString, SqlString> aliasToColumn; + ExtractColumnOrAliasNames(select, out columnsOrAliases, out aliasToColumn); + + return StringHelper.Join(",", columnsOrAliases); + } + /// <summary> /// Allows access to the basic <see cref="Dialect.GetSelectClauseNullString"/> /// implementation... Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2010-09-22 20:25:09 UTC (rev 5202) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2010-09-22 21:01:34 UTC (rev 5203) @@ -378,6 +378,7 @@ var result = session.CreateCriteria(typeof(Student)) .Add(Subqueries.PropertyIn("Name", dc)) + .AddOrder(Order.Asc("StudentNumber")) .List<Student>(); Assert.That(result.Count, Is.EqualTo(2)); Modified: trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs 2010-09-22 20:25:09 UTC (rev 5202) +++ trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs 2010-09-22 21:01:34 UTC (rev 5203) @@ -159,6 +159,35 @@ Assert.AreEqual(current, expected.Length); } + [Test] + public void QuotedStringTokenizerTests() + { + MsSql2005Dialect.QuotedAndParenthesisStringTokenizer tokenizier = + new MsSql2005Dialect.QuotedAndParenthesisStringTokenizer( + new SqlString("SELECT fish.\"id column\", fish.'fish name' as 'bar\\' column', f FROM fish")); + string[] expected = new string[] + { + "SELECT", + "fish.\"id column\"", + ",", + "fish.'fish name'", + "as", + "'bar\\' column'", + ",", + "f", + "FROM", + "fish" + }; + int current = 0; + IList<SqlString> tokens = tokenizier.GetTokens(); + foreach (SqlString token in tokens) + { + Assert.AreEqual(expected[current], token.ToString()); + current += 1; + } + Assert.AreEqual(current, expected.Length); + } + [Test] public void GetIfExistsDropConstraintTest_without_schema() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-09-23 17:07:27
|
Revision: 5206 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5206&view=rev Author: fabiomaulo Date: 2010-09-23 17:07:21 +0000 (Thu, 23 Sep 2010) Log Message: ----------- Fix NH-2138 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ResultSetMappingBinder.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2138/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2138/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2138/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ResultSetMappingBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ResultSetMappingBinder.cs 2010-09-23 15:51:58 UTC (rev 5205) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ResultSetMappingBinder.cs 2010-09-23 17:07:21 UTC (rev 5206) @@ -98,11 +98,11 @@ if (StringHelper.IsEmpty(alias)) alias = "alias_" + count; // hack/workaround as sqlquery impl depend on having a key. - string entityName = GetClassName(returnSchema.@class, mappings); - - if (entityName == null) + if (string.IsNullOrEmpty(returnSchema.@class) && string.IsNullOrEmpty(returnSchema.entityname)) throw new MappingException("<return alias='" + alias + "'> must specify either a class or entity-name"); + string entityName = returnSchema.entityname ?? GetClassName(returnSchema.@class, mappings); + LockMode lockMode = GetLockMode(returnSchema.lockmode); PersistentClass pc = mappings.GetClass(entityName); Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2138/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2138/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2138/Fixture.cs 2010-09-23 17:07:21 UTC (rev 5206) @@ -0,0 +1,21 @@ +using NHibernate.Engine.Query.Sql; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2138 +{ + [TestFixture] + public class Fixture + { + [Test] + public void AfterAddAppingShouldHaveAResultsetWithEntityName() + { + var cfg = TestConfigurationHelper.GetDefaultConfiguration(); + cfg.AddResource("NHibernate.Test.NHSpecificTest.NH2138.Mappings.hbm.xml", GetType().Assembly); + cfg.Executing(c => c.BuildMappings()).NotThrows(); + var sqlQuery = cfg.NamedSQLQueries["AllCoders"]; + var rootReturn = (NativeSQLQueryRootReturn)sqlQuery.QueryReturns[0]; + rootReturn.ReturnEntityName.Should().Be("Coder"); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2138/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2138/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2138/Mappings.hbm.xml 2010-09-23 17:07:21 UTC (rev 5206) @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> + + <class entity-name="Coder" table="persons"> + <id type="int"> + <generator class="increment" /> + </id> + <property name="Name" type="string"/> + </class> + + <sql-query name="AllCoders"> + <return entity-name="Coder" alias="c" /> + SELECT {c.*} + FROM persons c + </sql-query> +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-23 15:51:58 UTC (rev 5205) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-23 17:07:21 UTC (rev 5206) @@ -467,6 +467,7 @@ <Compile Include="NHSpecificTest\NH1836\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2111\A.cs" /> <Compile Include="NHSpecificTest\NH2111\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2138\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2148\BugFixture.cs" /> <Compile Include="NHSpecificTest\NH2148\Domain.cs" /> <Compile Include="NHSpecificTest\NH2224\Domain.cs" /> @@ -2291,6 +2292,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2138\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2288\AclassWithDefault.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2288\AclassWithNothing.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2288\AclassWithSpecific.hbm.xml" /> @@ -2628,7 +2630,6 @@ <EmbeddedResource Include="DynamicEntity\Tuplizer\Customer.hbm.xml" /> </ItemGroup> <ItemGroup> - <Folder Include="NHSpecificTest\NH1136" /> <Folder Include="Properties\" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-09-23 23:10:37
|
Revision: 5207 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5207&view=rev Author: fabiomaulo Date: 2010-09-23 23:10:31 +0000 (Thu, 23 Sep 2010) Log Message: ----------- Fix NH-2147 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/PersistentClass.cs trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2147/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2147/DefaultBatchSize.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2147/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Mapping/PersistentClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/PersistentClass.cs 2010-09-23 17:07:21 UTC (rev 5206) +++ trunk/nhibernate/src/NHibernate/Mapping/PersistentClass.cs 2010-09-23 23:10:31 UTC (rev 5207) @@ -36,7 +36,7 @@ private readonly List<Table> subclassTables = new List<Table>(); private bool dynamicInsert; private bool dynamicUpdate; - private int batchSize = 1; + private int? batchSize; private bool selectBeforeUpdate; private IDictionary<string, MetaAttribute> metaAttributes; private readonly List<Join> joins = new List<Join>(); @@ -372,7 +372,7 @@ /// <summary> /// /// </summary> - public int BatchSize + public int? BatchSize { get { return batchSize; } set { batchSize = value; } Modified: trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2010-09-23 17:07:21 UTC (rev 5206) +++ trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2010-09-23 23:10:31 UTC (rev 5207) @@ -278,11 +278,8 @@ entityNameBySubclass[subclass.MappedClass] = subclass.EntityName; } } - int batch = persistentClass.BatchSize; - if (batch == -1) - batch = factory.Settings.DefaultBatchFetchSize; - batchSize = batch; + batchSize = persistentClass.BatchSize.HasValue ? persistentClass.BatchSize.Value : factory.Settings.DefaultBatchFetchSize; hasSubselectLoadableCollections = persistentClass.HasSubselectLoadableCollections; propertyMapping = new BasicEntityPropertyMapping(this); Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2147/DefaultBatchSize.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2147/DefaultBatchSize.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2147/DefaultBatchSize.cs 2010-09-23 23:10:31 UTC (rev 5207) @@ -0,0 +1,62 @@ +using System.Reflection; +using NHibernate.Cfg; +using NHibernate.Engine; +using NHibernate.Persister.Entity; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2147 +{ + public class DefaultBatchSize + { + private const BindingFlags DefaultFlags = + BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly; + + private readonly FieldInfo fieldInfo = typeof(AbstractEntityPersister).GetField("batchSize", DefaultFlags); + + [Test] + public void WhenNoDefaultAndNoSpecificThenUse1() + { + var cfg = TestConfigurationHelper.GetDefaultConfiguration(); + cfg.AddResource("NHibernate.Test.NHSpecificTest.NH2147.Mappings.hbm.xml", GetType().Assembly); + var sf = (ISessionFactoryImplementor)cfg.BuildSessionFactory(); + var persister = sf.GetEntityPersister("MyClassWithoutBatchSize"); + persister.IsBatchLoadable.Should().Be.False(); + + // hack + fieldInfo.GetValue(persister).Should().Be(1); + } + + [Test] + public void WhenDefaultAndNoSpecificThenUseDefault() + { + var cfg = TestConfigurationHelper.GetDefaultConfiguration(); + cfg.SetProperty(Environment.DefaultBatchFetchSize, "20"); + + cfg.AddResource("NHibernate.Test.NHSpecificTest.NH2147.Mappings.hbm.xml", GetType().Assembly); + var sf = (ISessionFactoryImplementor)cfg.BuildSessionFactory(); + var persister = sf.GetEntityPersister("MyClassWithoutBatchSize"); + + persister.IsBatchLoadable.Should().Be.True(); + + // hack + fieldInfo.GetValue(persister).Should().Be(20); + } + + [Test] + public void WhenDefaultAndSpecificThenUseSpecific() + { + var cfg = TestConfigurationHelper.GetDefaultConfiguration(); + cfg.SetProperty(Environment.DefaultBatchFetchSize, "20"); + + cfg.AddResource("NHibernate.Test.NHSpecificTest.NH2147.Mappings.hbm.xml", GetType().Assembly); + var sf = (ISessionFactoryImplementor)cfg.BuildSessionFactory(); + var persister = sf.GetEntityPersister("MyClassWithBatchSize"); + + persister.IsBatchLoadable.Should().Be.True(); + + // hack + fieldInfo.GetValue(persister).Should().Be(10); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2147/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2147/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2147/Mappings.hbm.xml 2010-09-23 23:10:31 UTC (rev 5207) @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> + <class entity-name="MyClassWithoutBatchSize"> + <id type="int"> + <generator class="native" /> + </id> + <property name="Name" type="string"/> + </class> + + <class entity-name="MyClassWithBatchSize" batch-size="10"> + <id type="int"> + <generator class="native" /> + </id> + <property name="Name" type="string"/> + </class> + +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-23 17:07:21 UTC (rev 5206) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-23 23:10:31 UTC (rev 5207) @@ -468,6 +468,7 @@ <Compile Include="NHSpecificTest\NH2111\A.cs" /> <Compile Include="NHSpecificTest\NH2111\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2138\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2147\DefaultBatchSize.cs" /> <Compile Include="NHSpecificTest\NH2148\BugFixture.cs" /> <Compile Include="NHSpecificTest\NH2148\Domain.cs" /> <Compile Include="NHSpecificTest\NH2224\Domain.cs" /> @@ -2292,6 +2293,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2147\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2138\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2288\AclassWithDefault.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2288\AclassWithNothing.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-09-24 04:50:58
|
Revision: 5211 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5211&view=rev Author: fabiomaulo Date: 2010-09-24 04:50:50 +0000 (Fri, 24 Sep 2010) Log Message: ----------- Fix NH-2112 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Type/GenericMapType.cs trunk/nhibernate/src/NHibernate/Type/MapType.cs trunk/nhibernate/src/NHibernate.Test/App.config trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Model.cs Modified: trunk/nhibernate/src/NHibernate/Type/GenericMapType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/GenericMapType.cs 2010-09-24 03:01:49 UTC (rev 5210) +++ trunk/nhibernate/src/NHibernate/Type/GenericMapType.cs 2010-09-24 04:50:50 UTC (rev 5211) @@ -79,6 +79,14 @@ result[key] = value; } + var originalPc = original as IPersistentCollection; + var resultPc = result as IPersistentCollection; + if (originalPc != null && resultPc != null) + { + if (!originalPc.IsDirty) + resultPc.ClearDirty(); + } + return result; } Modified: trunk/nhibernate/src/NHibernate/Type/MapType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/MapType.cs 2010-09-24 03:01:49 UTC (rev 5210) +++ trunk/nhibernate/src/NHibernate/Type/MapType.cs 2010-09-24 04:50:50 UTC (rev 5211) @@ -89,6 +89,14 @@ result[key] = value; } + var originalPc = original as IPersistentCollection; + var resultPc = result as IPersistentCollection; + if (originalPc != null && resultPc != null) + { + if (!originalPc.IsDirty) + resultPc.ClearDirty(); + } + return result; } Modified: trunk/nhibernate/src/NHibernate.Test/App.config =================================================================== --- trunk/nhibernate/src/NHibernate.Test/App.config 2010-09-24 03:01:49 UTC (rev 5210) +++ trunk/nhibernate/src/NHibernate.Test/App.config 2010-09-24 04:50:50 UTC (rev 5211) @@ -126,7 +126,7 @@ </logger> <logger name="NHibernate.SQL"> - <level value="OFF" /> + <level value="DEBUG" /> </logger> <logger name="NHibernate.AdoNet.AbstractBatcher"> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Fixture.cs 2010-09-24 04:50:50 UTC (rev 5211) @@ -0,0 +1,78 @@ +using NUnit.Framework; +using NHibernate.Cfg; + +namespace NHibernate.Test.NHSpecificTest.NH2112 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void Configure(Configuration configuration) + { + configuration.SetProperty(Environment.GenerateStatistics, "true"); + configuration.SetProperty(Environment.BatchSize, "0"); + } + + protected override void OnTearDown() + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateSQLQuery("DELETE FROM AMapB").ExecuteUpdate(); + s.CreateSQLQuery("DELETE FROM TableA").ExecuteUpdate(); + s.CreateSQLQuery("DELETE FROM TableB").ExecuteUpdate(); + tx.Commit(); + } + } + + [Test] + public void Test() + { + A a; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + a = new A(); + a.Name = "A"; + B b1 = new B{ Name = "B1"}; + s.Save(b1); + B b2 = new B{ Name = "B2"}; + s.Save(b2); + a.Map.Add(b1 , "B1Text"); + a.Map.Add(b2, "B2Text"); + s.Save(a); + s.Flush(); + tx.Commit(); + } + ClearCounts(); + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + A aCopy = (A)s.Merge(a); + s.Flush(); + tx.Commit(); + } + AssertUpdateCount(0); + AssertInsertCount(0); + } + protected void ClearCounts() + { + sessions.Statistics.Clear(); + } + + protected void AssertInsertCount(long expected) + { + Assert.That(sessions.Statistics.EntityInsertCount, Is.EqualTo(expected), "unexpected insert count"); + } + + protected void AssertUpdateCount(int expected) + { + Assert.That(sessions.Statistics.EntityUpdateCount, Is.EqualTo(expected), "unexpected update count"); + } + + protected void AssertDeleteCount(int expected) + { + Assert.That(sessions.Statistics.EntityDeleteCount, Is.EqualTo(expected), "unexpected delete count"); + } + + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Mappings.hbm.xml 2010-09-24 04:50:50 UTC (rev 5211) @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH2112" + assembly="NHibernate.Test"> + + <class name="A" table="TableA"> + <id name="Id"> + <generator class="native"/> + </id> + <version name="Version" column="Version"/> + <property name="Name"/> + <map name="Map" table ="AMapB" cascade="all-delete-orphan" lazy="true"> + <key column="AId"/> + <index-many-to-many class="B" column="BId"/> + <element column="Text" type="System.String"/> + </map> + </class> + + <class name="B" table="TableB"> + <id name="Id"> + <generator class="native"/> + </id> + <property name="Name"/> + </class> +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Model.cs 2010-09-24 04:50:50 UTC (rev 5211) @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH2112 +{ + [Serializable] + public abstract class BaseEntity<TEntity, TKey> : IEquatable<TEntity> + where TEntity : BaseEntity<TEntity, TKey> + where TKey : struct + { + public virtual TKey? Id { get; set; } + + public virtual bool Equals(TEntity other) + { + if (other == null) return false; + if (object.ReferenceEquals(this, other)) return true; + if (Id != null && other.Id == null) return false; + if (Id == null && other.Id != null) return false; + if (Id == null && other.Id == null) + return object.ReferenceEquals(this, other); + else + return Id.Value.Equals(other.Id.Value); + } + public override bool Equals(object obj) + { + + return this.Equals(obj as TEntity); + } + private int? mHashCode; + public override int GetHashCode() + { + if (mHashCode == null) // le hashcode retourné doit être le meme tout le long de la vie de l'objet + { + if (this.Id != null) + mHashCode = this.Id.GetHashCode(); + else mHashCode = base.GetHashCode(); + } + return mHashCode.Value; + } + public virtual bool IsNew + { + get + { + return (Id == null); + } + } + } + + public class A : BaseEntity<A, int> + { + public A() + { + Map = new Dictionary<B, string>(); + } + + private int version; + public virtual int Version + { + get { return version; } + set { version = value; } + } + + public virtual string Name { get; set; } + public virtual IDictionary<B, string> Map { get; set; } + + } + + public class B : BaseEntity<B, int> + { + public virtual string Name { get; set; } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-24 03:01:49 UTC (rev 5210) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-24 04:50:50 UTC (rev 5211) @@ -467,6 +467,8 @@ <Compile Include="NHSpecificTest\NH1836\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2111\A.cs" /> <Compile Include="NHSpecificTest\NH2111\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2112\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2112\Model.cs" /> <Compile Include="NHSpecificTest\NH2138\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2147\DefaultBatchSize.cs" /> <Compile Include="NHSpecificTest\NH2148\BugFixture.cs" /> @@ -2293,6 +2295,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2112\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2147\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2138\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2288\AclassWithDefault.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-09-24 12:18:27
|
Revision: 5213 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5213&view=rev Author: fabiomaulo Date: 2010-09-24 12:18:20 +0000 (Fri, 24 Sep 2010) Log Message: ----------- Fix NH-2096 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/BinaryBlobTypeFixture.cs Modified: trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs 2010-09-24 04:51:37 UTC (rev 5212) +++ trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs 2010-09-24 12:18:20 UTC (rev 5213) @@ -83,7 +83,11 @@ { int length = (int)rs.GetBytes(index, 0, null, 0, 0); byte[] buffer = new byte[length]; - rs.GetBytes(index, 0, buffer, 0, length); + if (length > 0) + { + // The "if" is to make happy MySQL NH-2096 + rs.GetBytes(index, 0, buffer, 0, length); + } return ToExternalFormat(buffer); } Modified: trunk/nhibernate/src/NHibernate.Test/TypesTest/BinaryBlobTypeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/BinaryBlobTypeFixture.cs 2010-09-24 04:51:37 UTC (rev 5212) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/BinaryBlobTypeFixture.cs 2010-09-24 12:18:20 UTC (rev 5213) @@ -1,6 +1,7 @@ using System; using System.Text; using NUnit.Framework; +using SharpTestsEx; namespace NHibernate.Test.TypesTest { @@ -50,5 +51,26 @@ s.Flush(); s.Close(); } + + [Test] + public void ReadWriteZeroLen() + { + object savedId; + using (ISession s = OpenSession()) + { + BinaryBlobClass b = new BinaryBlobClass(); + b.BinaryBlob = new byte[0]; + savedId = s.Save(b); + s.Flush(); + } + + using (var s = OpenSession()) + { + var b = s.Get<BinaryBlobClass>(savedId); + b.BinaryBlob.Should().Not.Be.Null().And.Have.Count.EqualTo(0); + s.Delete(b); + s.Flush(); + } + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-09-24 13:46:00
|
Revision: 5215 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5215&view=rev Author: fabiomaulo Date: 2010-09-24 13:45:53 +0000 (Fri, 24 Sep 2010) Log Message: ----------- fix NH-2344 (thanks to Jose Romaniello) 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/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/Model.cs Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs 2010-09-24 12:30:53 UTC (rev 5214) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs 2010-09-24 13:45:53 UTC (rev 5215) @@ -420,5 +420,10 @@ { return new HqlBitwiseOr(_factory, lhs, rhs); } + + public HqlTreeNode Coalesce(HqlExpression lhs, HqlExpression rhs) + { + return new HqlCoalesce(_factory, lhs, rhs); + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs 2010-09-24 12:30:53 UTC (rev 5214) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs 2010-09-24 13:45:53 UTC (rev 5215) @@ -595,6 +595,16 @@ } } + public class HqlCoalesce : HqlExpression + { + public HqlCoalesce(IASTFactory factory, HqlExpression lhs, HqlExpression rhs) + : base(HqlSqlWalker.METHOD_CALL, "coalesce", factory) + { + AddChild(new HqlIdent(factory, "coalesce")); + AddChild(new HqlExpressionList(factory, lhs, rhs)); + } + } + public class HqlExpressionList : HqlStatement { public HqlExpressionList(IASTFactory factory, params HqlExpression[] expressions) Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2010-09-24 12:30:53 UTC (rev 5214) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2010-09-24 13:45:53 UTC (rev 5215) @@ -325,6 +325,9 @@ case ExpressionType.GreaterThanOrEqual: return _hqlTreeBuilder.GreaterThanOrEqual(lhs, rhs); + + case ExpressionType.Coalesce: + return _hqlTreeBuilder.Coalesce(lhs, rhs); } throw new InvalidOperationException(); Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/Fixture.cs 2010-09-24 13:45:53 UTC (rev 5215) @@ -0,0 +1,44 @@ +using System.Linq; +using NHibernate.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2344 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnTearDown() + { + using (ISession s = OpenSession()) + { + s.Delete("from Person"); + s.Flush(); + } + base.OnTearDown(); + } + + [Test] + public void CoalesceShouldWork() + { + int personId; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + var p1 = new Person { Name = "inserted name" }; + var p2 = new Person { Name = null}; + + s.Save(p1); + s.Save(p2); + personId = p2.Id; + tx.Commit(); + } + + using (ISession s = OpenSession()) + using (s.BeginTransaction()) + { + var person = s.Query<Person>().Where(p => (p.Name ?? "e") == "e").First(); + Assert.AreEqual(personId, person.Id); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/Mappings.hbm.xml 2010-09-24 13:45:53 UTC (rev 5215) @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2344"> + + <class name="Person"> + <id name="Id"> + <generator class="hilo" /> + </id> + <property name="Name"/> + </class> + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2344/Model.cs 2010-09-24 13:45:53 UTC (rev 5215) @@ -0,0 +1,8 @@ +namespace NHibernate.Test.NHSpecificTest.NH2344 +{ + public class Person + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-24 12:30:53 UTC (rev 5214) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-24 13:45:53 UTC (rev 5215) @@ -501,6 +501,8 @@ <Compile Include="NHSpecificTest\NH2322\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2322\Model.cs" /> <Compile Include="NHSpecificTest\NH2322\PostUpdateEventListener.cs" /> + <Compile Include="NHSpecificTest\NH2344\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2344\Model.cs" /> <Compile Include="TypesTest\CharClass.cs" /> <Compile Include="TypesTest\CharClassFixture.cs" /> <Compile Include="TypesTest\DateTimeClass.cs" /> @@ -2295,6 +2297,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2344\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2112\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2147\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2138\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-09-25 18:06:20
|
Revision: 5218 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5218&view=rev Author: fabiomaulo Date: 2010-09-25 18:06:13 +0000 (Sat, 25 Sep 2010) Log Message: ----------- Fix NH-2188 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2188/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2188/AppDomainWithMultipleSearchPath.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2010-09-25 15:47:16 UTC (rev 5217) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2010-09-25 18:06:13 UTC (rev 5218) @@ -4,6 +4,7 @@ using System.Configuration; using System.Diagnostics; using System.IO; +using System.Linq; using System.Reflection; using System.Text; using System.Xml; @@ -1837,11 +1838,11 @@ LogAndThrow(new MappingException(message, args.Exception)); } - private static string GetDefaultConfigurationFilePath() + protected virtual string GetDefaultConfigurationFilePath() { string baseDir = AppDomain.CurrentDomain.BaseDirectory; - string relativeSearchPath = AppDomain.CurrentDomain.RelativeSearchPath; - string binPath = relativeSearchPath == null ? baseDir : Path.Combine(baseDir, relativeSearchPath); + string relativeSearchPath = AppDomain.CurrentDomain.RelativeSearchPath.Split(';').First(); + string binPath = Path.Combine(baseDir, relativeSearchPath); return Path.Combine(binPath, DefaultHibernateCfgFileName); } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2188/AppDomainWithMultipleSearchPath.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2188/AppDomainWithMultipleSearchPath.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2188/AppDomainWithMultipleSearchPath.cs 2010-09-25 18:06:13 UTC (rev 5218) @@ -0,0 +1,37 @@ +using System; +using System.IO; +using NHibernate.Cfg; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2188 +{ + public class AppDomainWithMultipleSearchPath + { + public class MyNhConfiguration: Configuration + { + public string DefaultConfigurationFilePath() + { + return GetDefaultConfigurationFilePath(); + } + } + [Test] + public void WhenSerchInMultiplePathsThenNotThrows() + { + string binPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"); + var expected = Path.Combine(binPath, Configuration.DefaultHibernateCfgFileName); + + try + { + AppDomain.CurrentDomain.AppendPrivatePath("bin"); + AppDomain.CurrentDomain.AppendPrivatePath("DbScripts"); + var configuration = new MyNhConfiguration(); + configuration.DefaultConfigurationFilePath().Should().Be(expected); + } + finally + { + AppDomain.CurrentDomain.ClearPrivatePath(); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-25 15:47:16 UTC (rev 5217) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-25 18:06:13 UTC (rev 5218) @@ -473,6 +473,7 @@ <Compile Include="NHSpecificTest\NH2147\DefaultBatchSize.cs" /> <Compile Include="NHSpecificTest\NH2148\BugFixture.cs" /> <Compile Include="NHSpecificTest\NH2148\Domain.cs" /> + <Compile Include="NHSpecificTest\NH2188\AppDomainWithMultipleSearchPath.cs" /> <Compile Include="NHSpecificTest\NH2224\Domain.cs" /> <Compile Include="NHSpecificTest\NH2224\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2245\Fixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jul...@us...> - 2010-09-26 02:53:59
|
Revision: 5220 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5220&view=rev Author: julian-maughan Date: 2010-09-26 02:53:50 +0000 (Sun, 26 Sep 2010) Log Message: ----------- Added support for projections using composite keys and components (NH-2202). See also HHH-1088 (r19110). Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/AliasedProjection.cs trunk/nhibernate/src/NHibernate/Criterion/Distinct.cs trunk/nhibernate/src/NHibernate/Criterion/IProjection.cs trunk/nhibernate/src/NHibernate/Criterion/ProjectionList.cs trunk/nhibernate/src/NHibernate/Criterion/PropertyProjection.cs trunk/nhibernate/src/NHibernate/Criterion/SimpleProjection.cs trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/Criteria/Course.cs trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Enrolment.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Enrolment.hbm.xml trunk/nhibernate/src/NHibernate.Test/Criteria/Student.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Criterion/IEnhancedProjection.cs trunk/nhibernate/src/NHibernate.Test/Criteria/CityState.cs trunk/nhibernate/src/NHibernate.Test/Criteria/CourseMeeting.cs trunk/nhibernate/src/NHibernate.Test/Criteria/CourseMeetingId.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/Model.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/AliasedProjection.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/AliasedProjection.cs 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate/Criterion/AliasedProjection.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -1,14 +1,14 @@ using System; +using System.Collections.Generic; + using NHibernate.SqlCommand; +using NHibernate.Engine; using NHibernate.Type; namespace NHibernate.Criterion { - using System.Collections.Generic; - using Engine; - [Serializable] - public class AliasedProjection : IProjection + public class AliasedProjection : IEnhancedProjection { private readonly IProjection projection; private readonly string alias; @@ -36,9 +36,9 @@ public virtual IType[] GetTypes(String alias, ICriteria criteria, ICriteriaQuery criteriaQuery) { - return this.alias.Equals(alias) ? - GetTypes(criteria, criteriaQuery) : - null; + return this.alias.Equals(alias) + ? GetTypes(criteria, criteriaQuery) + : null; } public virtual string[] GetColumnAliases(int loc) @@ -48,10 +48,24 @@ public virtual string[] GetColumnAliases(string alias, int loc) { - return this.alias.Equals(alias) ? - GetColumnAliases(loc) : - null; + return this.alias.Equals(alias) + ? GetColumnAliases(loc) + : null; } + + public string[] GetColumnAliases(int position, ICriteria criteria, ICriteriaQuery criteriaQuery) + { + return projection is IEnhancedProjection + ? ((IEnhancedProjection)projection).GetColumnAliases(position, criteria, criteriaQuery) + : this.GetColumnAliases(position); + } + + public string[] GetColumnAliases(string alias, int position, ICriteria criteria, ICriteriaQuery criteriaQuery) + { + return this.alias.Equals(alias) + ? GetColumnAliases(position, criteria, criteriaQuery) + : null; + } public virtual string[] Aliases { @@ -84,4 +98,4 @@ return projection.ToString() + " as " + alias; } } -} +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Criterion/Distinct.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Distinct.cs 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate/Criterion/Distinct.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -1,14 +1,13 @@ using System; +using System.Collections.Generic; +using NHibernate.Engine; using NHibernate.SqlCommand; using NHibernate.Type; namespace NHibernate.Criterion { - using System.Collections.Generic; - using Engine; - [Serializable] - public class Distinct : IProjection + public class Distinct : IEnhancedProjection { private readonly IProjection projection; @@ -42,11 +41,25 @@ { return projection.GetColumnAliases(loc); } + + public virtual string[] GetColumnAliases(int position, ICriteria criteria, ICriteriaQuery criteriaQuery) + { + return projection is IEnhancedProjection + ? ((IEnhancedProjection)projection).GetColumnAliases(position, criteria, criteriaQuery) + : GetColumnAliases(position); + } public virtual string[] GetColumnAliases(string alias, int loc) { return projection.GetColumnAliases(alias, loc); } + + public virtual string[] GetColumnAliases(string alias, int position, ICriteria criteria, ICriteriaQuery criteriaQuery) + { + return projection is IEnhancedProjection + ? ((IEnhancedProjection)projection).GetColumnAliases(alias, position, criteria, criteriaQuery) + : GetColumnAliases(alias, position); + } public virtual string[] Aliases { @@ -79,4 +92,4 @@ return "distinct " + projection.ToString(); } } -} +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Criterion/IEnhancedProjection.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/IEnhancedProjection.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Criterion/IEnhancedProjection.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -0,0 +1,33 @@ +using System; + +namespace NHibernate.Criterion +{ + /// <summary> + /// An "enhanced" Projection for a <see cref="ICriteria" /> query. + /// </summary> + public interface IEnhancedProjection : IProjection + { + /// <summary> + /// Get the SQL column aliases used by this projection for the columns it writes for inclusion into the + /// <code>SELECT</code> clause <see cref="IProjection.ToSqlString" />. NHibernate always uses column aliases + /// to extract data from the <see cref="System.Data.IDataReader" />, so it is important that these be implemented + /// correctly in order for NHibernate to be able to extract these values correctly. + /// </summary> + /// <param name="position">Just as in <see cref="IProjection.ToSqlString" />, represents the number of columns rendered prior to this projection.</param> + /// <param name="criteria">The local criteria to which this project is attached (for resolution).</param> + /// <param name="criteriaQuery">The overall criteria query instance.</param> + /// <returns>The columns aliases.</returns> + string[] GetColumnAliases(int position, ICriteria criteria, ICriteriaQuery criteriaQuery); + + /// <summary> + /// Get the SQL column aliases used by this projection for the columns it writes for inclusion into the + /// <code>SELECT</code> clause (<see cref="IProjection.ToSqlString" />) for a particular criteria-level alias. + /// </summary> + /// <param name="alias">The criteria-level alias.</param> + /// <param name="position">Just as in <see cref="IProjection.ToSqlString" />, represents the number of columns rendered prior to this projection.</param> + /// <param name="criteria">The local criteria to which this project is attached (for resolution).</param> + /// <param name="criteriaQuery">The overall criteria query instance.</param> + /// <returns>The columns aliases.</returns> + string[] GetColumnAliases(string alias, int position, ICriteria criteria, ICriteriaQuery criteriaQuery); + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Criterion/IProjection.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/IProjection.cs 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate/Criterion/IProjection.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -1,13 +1,12 @@ using System; +using System.Collections.Generic; using NHibernate.SqlCommand; +using NHibernate.Engine; +using NHibernate.Loader.Criteria; using NHibernate.Type; namespace NHibernate.Criterion { - using System.Collections.Generic; - using Engine; - using NHibernate.Loader.Criteria; - public interface IProjection { /// <summary> Modified: trunk/nhibernate/src/NHibernate/Criterion/ProjectionList.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/ProjectionList.cs 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate/Criterion/ProjectionList.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -1,16 +1,18 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq.Expressions; + +using NHibernate.Engine; using NHibernate.Impl; using NHibernate.SqlCommand; using NHibernate.Type; +using NHibernate.Util; namespace NHibernate.Criterion { - using Engine; - [Serializable] - public class ProjectionList : IProjection + public class ProjectionList : IEnhancedProjection { private IList<IProjection> elements = new List<IProjection>(); @@ -60,8 +62,8 @@ for (int i = 0; i < Length; i++) { IProjection proj = this[i]; - buf.Add(proj.ToSqlString(criteria, loc, criteriaQuery,enabledFilters)); - loc += proj.GetColumnAliases(loc).Length; + buf.Add(proj.ToSqlString(criteria, loc, criteriaQuery, enabledFilters)); + loc += GetColumnAliases(loc, criteria, criteriaQuery, proj).Length; if (i < elements.Count - 1) { buf.Add(", "); @@ -89,7 +91,7 @@ return buf.ToSqlString(); } - public String[] GetColumnAliases(int loc) + public string[] GetColumnAliases(int loc) { IList<string> aliases = new List<string>(Length); @@ -105,7 +107,7 @@ return result; } - public String[] GetColumnAliases(string alias, int loc) + public string[] GetColumnAliases(string alias, int loc) { for (int i = 0; i < Length; i++) { @@ -115,7 +117,44 @@ } return null; } + + public string[] GetColumnAliases(int position, ICriteria criteria, ICriteriaQuery criteriaQuery) + { + IList result = new ArrayList(this.Length); + for (int i = 0; i < this.Length; i++) + { + string[] colAliases = ProjectionList.GetColumnAliases(position, criteria, criteriaQuery, this[i]); + ArrayHelper.AddAll(result, colAliases); + position += colAliases.Length; + } + return ArrayHelper.ToStringArray(result); + } + + public string[] GetColumnAliases(string alias, int position, ICriteria criteria, ICriteriaQuery criteriaQuery) + { + for (int i = 0; i < this.Length; i++) + { + string[] result = GetColumnAliases(alias, position, criteria, criteriaQuery, this[i]); + if (result != null) return result; + position += GetColumnAliases(position, criteria, criteriaQuery, this[i]).Length; + } + return null; + } + + private static string[] GetColumnAliases(int position, ICriteria criteria, ICriteriaQuery criteriaQuery, IProjection projection) + { + return projection is IEnhancedProjection + ? ((IEnhancedProjection)projection).GetColumnAliases(position, criteria, criteriaQuery) + : projection.GetColumnAliases(position); + } + private static string[] GetColumnAliases(string alias, int position, ICriteria criteria, ICriteriaQuery criteriaQuery, IProjection projection) + { + return projection is IEnhancedProjection + ? ((IEnhancedProjection)projection).GetColumnAliases(alias, position, criteria, criteriaQuery) + : projection.GetColumnAliases(alias, position); + } + public IType[] GetTypes(string alias, ICriteria criteria, ICriteriaQuery criteriaQuery) { for (int i = 0; i < Length; i++) Modified: trunk/nhibernate/src/NHibernate/Criterion/PropertyProjection.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/PropertyProjection.cs 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate/Criterion/PropertyProjection.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -1,11 +1,10 @@ using System; +using System.Collections.Generic; using NHibernate.SqlCommand; using NHibernate.Type; namespace NHibernate.Criterion { - using System.Collections.Generic; - /// <summary> /// A property value, or grouped property value /// </summary> @@ -53,13 +52,18 @@ public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters) { - return new SqlString(new object[] - { - criteriaQuery.GetColumn(criteria, propertyName), - " as y", - loc.ToString(), - "_" - }); + SqlStringBuilder s = new SqlStringBuilder(); + string[] cols = criteriaQuery.GetColumnsUsingProjection(criteria, propertyName); + for (int i = 0; i < cols.Length; i++) + { + s.Add(cols[i]); + s.Add(" as y"); + s.Add((loc + i).ToString()); + s.Add("_"); + if (i < cols.Length - 1) + s.Add(", "); + } + return s.ToSqlString(); } public override SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters) @@ -71,4 +75,4 @@ return new SqlString(criteriaQuery.GetColumn(criteria, propertyName)); } } -} +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Criterion/SimpleProjection.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/SimpleProjection.cs 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate/Criterion/SimpleProjection.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -1,17 +1,16 @@ using System; +using System.Collections.Generic; using NHibernate.SqlCommand; +using NHibernate.Engine; using NHibernate.Type; namespace NHibernate.Criterion { - using System.Collections.Generic; - using Engine; - /// <summary> /// A single-column projection that may be aliased /// </summary> [Serializable] - public abstract class SimpleProjection : IProjection + public abstract class SimpleProjection : IEnhancedProjection { public IProjection As(string alias) { @@ -32,7 +31,24 @@ { return new string[] {"y" + loc + "_"}; } + + public string[] GetColumnAliases(string alias, int position, ICriteria criteria, ICriteriaQuery criteriaQuery) + { + return GetColumnAliases(alias, position); + } + public String[] GetColumnAliases(int position, ICriteria criteria, ICriteriaQuery criteriaQuery) + { + int numColumns = this.GetColumnCount(criteria, criteriaQuery); + string[] aliases = new string[numColumns]; + for (int i = 0; i < numColumns; i++) + { + aliases[i] = "y" + position + "_"; + position++; + } + return aliases; + } + public virtual string[] Aliases { get { return new String[1]; } @@ -44,7 +60,6 @@ public abstract bool IsAggregate { get; } - /// <summary> /// Gets the typed values for parameters in this projection /// </summary> @@ -59,5 +74,16 @@ public abstract SqlString ToSqlString(ICriteria criteria, int position, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters); public abstract IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuery); + + private int GetColumnCount(ICriteria criteria, ICriteriaQuery criteriaQuery) + { + IType[] types = this.GetTypes(criteria, criteriaQuery); + int count = 0; + for (int i = 0; i < types.Length; i++) + { + count += types[i].GetColumnSpan(criteriaQuery.Factory); + } + return count; + } } } Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaLoader.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -8,6 +8,7 @@ using NHibernate.SqlCommand; using NHibernate.Transform; using NHibernate.Type; +using NHibernate.Util; namespace NHibernate.Loader.Criteria { @@ -84,10 +85,21 @@ IType[] types = translator.ProjectedTypes; result = new object[types.Length]; string[] columnAliases = translator.ProjectedColumnAliases; - - for (int i = 0; i < result.Length; i++) + + for (int i = 0, position = 0; i < result.Length; i++) { - result[i] = types[i].NullSafeGet(rs, columnAliases[i], session, null); + int numColumns = types[i].GetColumnSpan(session.Factory); + + if ( numColumns > 1 ) + { + string[] typeColumnAliases = ArrayHelper.Slice(columnAliases, position, numColumns); + result[i] = types[i].NullSafeGet(rs, typeColumnAliases, session, null); + } + else + { + result[i] = types[i].NullSafeGet(rs, columnAliases[position], session, null); + } + position += numColumns; } aliases = translator.ProjectedAliases; } Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Text; using Iesi.Collections.Generic; - using NHibernate.Criterion; using NHibernate.Engine; using NHibernate.Hql.Util; @@ -172,7 +171,12 @@ public string[] ProjectedColumnAliases { - get { return rootCriteria.Projection.GetColumnAliases(0); } + get + { + return rootCriteria.Projection is IEnhancedProjection + ? ((IEnhancedProjection)rootCriteria.Projection).GetColumnAliases(0, rootCriteria, this) + : rootCriteria.Projection.GetColumnAliases(0); + } } public string[] ProjectedAliases @@ -402,7 +406,7 @@ IType type = lastEntity.ToType(componentPath); if (type.IsAssociationType) { - if(type.IsCollectionType) + if(type.IsCollectionType) { // ignore joinables for composite collections var collectionType = (CollectionType)type; @@ -535,8 +539,7 @@ } /// <summary> - /// Get the names of the columns constrained - /// by this criterion. + /// Get the names of the columns constrained by this criterion. /// </summary> public string[] GetColumnsUsingProjection(ICriteria subcriteria, string propertyName) { Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-09-26 02:53:50 UTC (rev 5220) @@ -109,6 +109,7 @@ <Compile Include="Connection\DriverConnectionProvider.cs" /> <Compile Include="Connection\IConnectionProvider.cs" /> <Compile Include="Connection\UserSuppliedConnectionProvider.cs" /> + <Compile Include="Criterion\IEnhancedProjection.cs" /> <Compile Include="Dialect\DB2Dialect.cs" /> <Compile Include="Dialect\Dialect.cs" /> <Compile Include="Dialect\FirebirdDialect.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/Criteria/CityState.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/CityState.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/CityState.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -0,0 +1,31 @@ +using System; + +namespace NHibernate.Test.Criteria +{ + [Serializable] + public class CityState + { + private string city; + private string state; + + public CityState() {} + + public CityState(string city, string state) + { + this.city = city; + this.state = state; + } + + public virtual string City + { + get { return this.city; } + set { this.city = value; } + } + + public virtual string State + { + get { return this.state; } + set { this.state = value; } + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Course.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Course.cs 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Course.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -1,23 +1,30 @@ using System; +using Iesi.Collections.Generic; namespace NHibernate.Test.Criteria { public class Course { private string courseCode; - + private string description; + private ISet<CourseMeeting> courseMeetings = new HashedSet<CourseMeeting>(); + public virtual string CourseCode { get { return courseCode; } set { courseCode = value; } } - private string description; - public virtual string Description { get { return description; } set { description = value; } } + + public virtual ISet<CourseMeeting> CourseMeetings + { + get { return courseMeetings; } + set { courseMeetings = value; } + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Criteria/CourseMeeting.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/CourseMeeting.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/CourseMeeting.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -0,0 +1,28 @@ +namespace NHibernate.Test.Criteria +{ + public class CourseMeeting + { + private CourseMeetingId id; + private Course course; + + public CourseMeeting() { } + + public CourseMeeting(Course course, string day, int period, string location) + { + this.id = new CourseMeetingId(course, day, period, location); + this.course = course; + } + + public virtual CourseMeetingId Id + { + get { return id; } + set { id = value; } + } + + public virtual Course Course + { + get { return course; } + set { course = value; } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Criteria/CourseMeetingId.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/CourseMeetingId.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/CourseMeetingId.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -0,0 +1,60 @@ +using System; + +namespace NHibernate.Test.Criteria +{ + [Serializable] + public class CourseMeetingId + { + private string courseCode; + private string day; + private int period; + private string location; + + public CourseMeetingId() { } + + public CourseMeetingId(Course course, string day, int period, string location) + { + this.courseCode = course.CourseCode; + this.day = day; + this.period = period; + this.location = location; + } + + public virtual string CourseCode + { + get { return courseCode; } + set { courseCode = value; } + } + + public virtual string Day + { + get { return day; } + set { day = value; } + } + + public virtual int Period + { + get { return period; } + set { period = value; } + } + + public virtual string Location + { + get { return location; } + set { location = value; } + } + + public override bool Equals(object obj) + { + CourseMeetingId that = obj as CourseMeetingId; + if (that == null) + return false; + return courseCode == that.CourseCode && day == that.Day && period == that.Period && location == that.Location; + } + + public override int GetHashCode() + { + return courseCode.GetHashCode() ^ day.GetHashCode() ^ period.GetHashCode() ^ location.GetHashCode(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -67,7 +67,7 @@ using (ISession session = OpenSession()) { - // finds all courses which contain '%' as the first char in the description + // finds all courses which contain '%' as the first char in the description Course example = new Course(); example.Description = "&%%"; IList result = @@ -237,8 +237,14 @@ t.Commit(); session.Close(); } - + [Test] + [Ignore("To be implemented")] + public void SubselectWithComponent() + { + } + + [Test] public void CloningCriteria() { ISession s = OpenSession(); @@ -255,7 +261,7 @@ } [Test] - public void CloningCriteria_AddCount_RemoveOrderring() + public void CloningCriteria_AddCount_RemoveOrdering() { ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); @@ -353,7 +359,7 @@ [Test] public void SubqueryPagination() - { + { using (ISession session = OpenSession()) using (ITransaction t = session.BeginTransaction()) { @@ -690,7 +696,7 @@ Enrolment key = new Enrolment(); key.CourseCode = "HIB"; - key.StudentNumber = 101;// xam + key.StudentNumber = 101;// xam //since we didn't load xam's entrollments before (skipped by orderring) //it should not be already loaded Enrolment shouldNotBeLoaded = (Enrolment)s.Load(typeof(Enrolment), key); @@ -1228,6 +1234,7 @@ object[] array = (object[])s.CreateCriteria(typeof(Enrolment)) .SetProjection(Projections.ProjectionList().Add(p1).Add(p2)) .UniqueResult(); + Assert.AreEqual(7, array.Length); IList list = s.CreateCriteria(typeof(Enrolment)) @@ -1249,8 +1256,20 @@ t.Commit(); s.Close(); } + + [Test] + [Ignore("To be implemented")] + public void DistinctProjectionsOfComponents() + { + } [Test] + [Ignore("To be implemented")] + public void GroupByComponent() + { + } + + [Test] public void CloningProjectionsUsingProperty() { ISession s = OpenSession(); @@ -1479,8 +1498,182 @@ t.Rollback(); s.Close(); } + + [Test] + public void ProjectedEmbeddedCompositeId() + { + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + Course course = new Course(); + course.CourseCode = "HIB"; + course.Description = "Hibernate Training"; + s.Save(course); + + Student gavin = new Student(); + gavin.Name = "Gavin King"; + gavin.StudentNumber = 667; + s.Save(gavin); + + Student xam = new Student(); + xam.Name = "Max Rydahl Andersen"; + xam.StudentNumber = 101; + s.Save(xam); + + Enrolment enrolment = new Enrolment(); + enrolment.Course = course; + enrolment.CourseCode = course.CourseCode; + enrolment.Semester = 1; + enrolment.Year = 1999; + enrolment.Student = xam; + enrolment.StudentNumber = xam.StudentNumber; + gavin.Enrolments.Add(enrolment); + s.Save(enrolment); + + enrolment = new Enrolment(); + enrolment.Course = course; + enrolment.CourseCode = course.CourseCode; + enrolment.Semester = 3; + enrolment.Year = 1998; + enrolment.Student = gavin; + enrolment.StudentNumber = gavin.StudentNumber; + gavin.Enrolments.Add(enrolment); + s.Save(enrolment); + + s.Flush(); + + IList enrolments = (IList)s.CreateCriteria<Enrolment>() + .SetProjection(Projections.Id()) + .List(); + + t.Rollback(); + } + } + + [Test] + public void ProjectedListIncludesEmbeddedCompositeId() + { + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + Course course = new Course(); + course.CourseCode = "HIB"; + course.Description = "Hibernate Training"; + s.Save(course); + + Student gavin = new Student(); + gavin.Name = "Gavin King"; + gavin.StudentNumber = 667; + s.Save(gavin); + + Student xam = new Student(); + xam.Name = "Max Rydahl Andersen"; + xam.StudentNumber = 101; + s.Save(xam); + + Enrolment enrolment = new Enrolment(); + enrolment.Course = course; + enrolment.CourseCode = course.CourseCode; + enrolment.Semester = 1; + enrolment.Year = 1999; + enrolment.Student = xam; + enrolment.StudentNumber = xam.StudentNumber; + gavin.Enrolments.Add(enrolment); + s.Save(enrolment); + + enrolment = new Enrolment(); + enrolment.Course = course; + enrolment.CourseCode = course.CourseCode; + enrolment.Semester = 3; + enrolment.Year = 1998; + enrolment.Student = gavin; + enrolment.StudentNumber = gavin.StudentNumber; + gavin.Enrolments.Add(enrolment); + s.Save(enrolment); + + s.Flush(); + + IList data = (IList)s.CreateCriteria<Enrolment>() + .SetProjection(Projections.ProjectionList() + .Add(Projections.Property("Semester")) + .Add(Projections.Property("Year")) + .Add(Projections.Id())) + .List(); + + t.Rollback(); + } + } + + [Test] + public void ProjectedCompositeId() + { + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + Course course = new Course(); + course.CourseCode = "HIB"; + course.Description = "Hibernate Training"; + course.CourseMeetings.Add(new CourseMeeting(course, "Monday", 1, "1313 Mockingbird Lane")); + s.Save(course); + s.Flush(); + + IList data = (IList)s.CreateCriteria<CourseMeeting>().SetProjection(Projections.Id()).List(); + t.Rollback(); + } + } + [Test] + [Ignore("To be implemented")] + public void ProjectedCompositeIdWithAlias() + { + } + + [Test] + public void ProjectedComponent() + { + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + Student gaith = new Student(); + gaith.Name = "Gaith Bell"; + gaith.StudentNumber = 123; + gaith.CityState = new CityState("Chicago", "Illinois"); + s.Save(gaith); + s.Flush(); + + IList cityStates = (IList)s.CreateCriteria<Student>() + .SetProjection(Projections.Property("CityState")) + .List(); + + t.Rollback(); + } + } + + [Test] + public void ProjectedListIncludesComponent() + { + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + Student gaith = new Student(); + gaith.Name = "Gaith Bell"; + gaith.StudentNumber = 123; + gaith.CityState = new CityState("Chicago", "Illinois"); + s.Save(gaith); + s.Flush(); + + IList data = (IList)s.CreateCriteria<Student>() + .SetProjection(Projections.ProjectionList() + .Add(Projections.Property("CityState")) + .Add(Projections.Property("Name"))) + .List(); + + t.Rollback(); + } + } + + [Test] public void CloningProjectedId() { ISession s = OpenSession(); @@ -1871,7 +2064,7 @@ t.Commit(); } } - + [Test] public void TransformToRowCountTest() { @@ -1910,53 +2103,53 @@ } [Test] - public void OrderProjectionAliasedTest() - { - ISession session = OpenSession(); - ITransaction t = session.BeginTransaction(); + public void OrderProjectionAliasedTest() + { + ISession session = OpenSession(); + ITransaction t = session.BeginTransaction(); - Course courseA = new Course(); - courseA.CourseCode = "HIB-A"; - courseA.Description = "Hibernate Training A"; - session.Save(courseA); + Course courseA = new Course(); + courseA.CourseCode = "HIB-A"; + courseA.Description = "Hibernate Training A"; + session.Save(courseA); - Student gavin = new Student(); - gavin.Name = "Gavin King"; - gavin.StudentNumber = 232; - gavin.PreferredCourse = courseA; - session.Save(gavin); + Student gavin = new Student(); + gavin.Name = "Gavin King"; + gavin.StudentNumber = 232; + gavin.PreferredCourse = courseA; + session.Save(gavin); - Student leonardo = new Student(); - leonardo.Name = "Leonardo Quijano"; - leonardo.StudentNumber = 233; - leonardo.PreferredCourse = courseA; - session.Save(leonardo); + Student leonardo = new Student(); + leonardo.Name = "Leonardo Quijano"; + leonardo.StudentNumber = 233; + leonardo.PreferredCourse = courseA; + session.Save(leonardo); - Student johnDoe = new Student(); - johnDoe.Name = "John Doe"; - johnDoe.StudentNumber = 235; - johnDoe.PreferredCourse = null; - session.Save(johnDoe); + Student johnDoe = new Student(); + johnDoe.Name = "John Doe"; + johnDoe.StudentNumber = 235; + johnDoe.PreferredCourse = null; + session.Save(johnDoe); - IProjection conditional = + IProjection conditional = Projections.Conditional( - Restrictions.Eq("Name", "Gavin King"), - Projections.Constant("Name"), + Restrictions.Eq("Name", "Gavin King"), + Projections.Constant("Name"), Projections.Constant("AnotherName")); - ICriteria criteria = session.CreateCriteria(typeof(Student)); - criteria.SetMaxResults(1); - criteria.SetFirstResult(1); - IList result = criteria.SetProjection(Projections.Alias(conditional, "CheckName")) - .AddOrder(Order.Asc("CheckName")) - .List(); + ICriteria criteria = session.CreateCriteria(typeof(Student)); + criteria.SetMaxResults(1); + criteria.SetFirstResult(1); + IList result = criteria.SetProjection(Projections.Alias(conditional, "CheckName")) + .AddOrder(Order.Asc("CheckName")) + .List(); - session.Delete(gavin); - session.Delete(leonardo); - session.Delete(johnDoe); - session.Delete(courseA); - t.Commit(); - session.Close(); + session.Delete(gavin); + session.Delete(leonardo); + session.Delete(johnDoe); + session.Delete(courseA); + t.Commit(); + session.Close(); } [Test] Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Enrolment.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Enrolment.cs 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Enrolment.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -6,47 +6,42 @@ public class Enrolment { private Student student; - + private Course course; + private long studentNumber; + private string courseCode = string.Empty; + private short year; + private short semester; + public virtual Student Student { get { return student; } set { student = value; } } - private Course course; - public virtual Course Course { get { return course; } set { course = value; } } - private long studentNumber; - public virtual long StudentNumber { get { return studentNumber; } set { studentNumber = value; } } - private string courseCode = string.Empty; - public virtual string CourseCode { get { return courseCode; } set { courseCode = value; } } - private short year; - public virtual short Year { get { return year; } set { year = value; } } - private short semester; - public virtual short Semester { get { return semester; } Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Enrolment.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Enrolment.hbm.xml 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Enrolment.hbm.xml 2010-09-26 02:53:50 UTC (rev 5220) @@ -1,5 +1,6 @@ <?xml version="1.0"?> -<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" namespace="NHibernate.Test.Criteria"> @@ -8,19 +9,39 @@ <generator class="assigned"/> </id> <property name="Description"/> + <set name="CourseMeetings" inverse="true" cascade="all-delete-orphan"> + <key column="CourseCode"/> + <one-to-many class="CourseMeeting"/> + </set> </class> + <class name="CourseMeeting"> + <composite-id name="Id" class="CourseMeetingId"> + <key-property name="CourseCode"/> + <key-property name="Day"/> + <key-property name="Period"/> + <key-property name="Location"/> + </composite-id> + <many-to-one name="Course" insert="false" update="false"> + <column name="courseCode"/> + </many-to-one> + </class> + <class name="Student"> <id name="StudentNumber"> - <column name="studentId"/> + <column name="studentId"/> <generator class="assigned"/> </id> <property name="Name" not-null="true"/> + <component name="CityState"> + <property name="City" column="address_city"/> + <property name="State" column="address_state"/> + </component> <set name="Enrolments" inverse="true" cascade="delete" fetch="subselect"> <key column="studentId"/> <one-to-many class="Enrolment"/> </set> - <many-to-one name="PreferredCourse" column="preferredCourseCode"/> + <many-to-one name="PreferredCourse" column="preferredCourseCode"/> </class> <class name="Enrolment"> Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Student.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Student.cs 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Student.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -6,31 +6,35 @@ public class Student { private long studentNumber; - + private string name; + private CityState cityState; + private Course preferredCourse; + private ISet enrolments = new HashedSet(); + public virtual long StudentNumber { get { return studentNumber; } set { studentNumber = value; } } - private string name; - public virtual string Name { get { return name; } set { name = value; } } + + public virtual CityState CityState + { + get { return cityState; } + set { cityState = value; } + } - private Course preferredCourse; - public virtual Course PreferredCourse { get { return preferredCourse; } set { preferredCourse = value; } } - private ISet enrolments = new HashedSet(); - public virtual ISet Enrolments { get { return enrolments; } Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/Fixture.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -0,0 +1,58 @@ +namespace NHibernate.Test.NHSpecificTest.NH2202 +{ + using System.Linq; + using Criterion; + using NUnit.Framework; + + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnSetUp() + { + base.OnSetUp(); + + using (var s = OpenSession()) + using (var tx = s.BeginTransaction()) + { + var emp = new Employee() {EmployeeId = 1, NationalId = 1000}; + emp.Addresses.Add(new EmployeeAddress() { Employee = emp, Type = "Postal" }); + emp.Addresses.Add(new EmployeeAddress() { Employee = emp, Type = "Shipping" }); + s.Save(emp); + tx.Commit(); + } + } + + protected override void OnTearDown() + { + using (var s = OpenSession()) + using (var tx = s.BeginTransaction()) + { + s.Delete("from EmployeeAddress"); + tx.Commit(); + } + + using (var s = OpenSession()) + using (var tx = s.BeginTransaction()) + { + s.Delete("from Employee"); + tx.Commit(); + } + + base.OnTearDown(); + } + + [Test] + public void CanProjectEmployeeFromAddressUsingCriteria() + { + using (var s = OpenSession()) + { + var employees = s.CreateCriteria<EmployeeAddress>("x3") + .Add(Restrictions.Eq("Type", "Postal")) + .SetProjection(Projections.Property("Employee")) + .List<Employee>(); + + Assert.That(employees.FirstOrDefault(), Is.InstanceOf<Employee>()); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/Mappings.hbm.xml 2010-09-26 02:53:50 UTC (rev 5220) @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2202"> + + <class name="Employee"> + + <composite-id> + <key-property name="NationalId" /> + <key-property name="EmployeeId" /> + </composite-id> + + <set name="Addresses" cascade="save-update"> + <key> + <column name="NationalId" /> + <column name="EmployeeId" /> + </key> + <one-to-many class="EmployeeAddress"/> + </set> + + </class> + + <class name="EmployeeAddress"> + + <composite-id> + <key-many-to-one name="Employee" class="Employee"> + <column name="NationalId" /> + <column name="EmployeeId" /> + </key-many-to-one> + <key-property name="Type" /> + </composite-id> + + </class> + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2202/Model.cs 2010-09-26 02:53:50 UTC (rev 5220) @@ -0,0 +1,77 @@ +using System; +using Iesi.Collections; + +namespace NHibernate.Test.NHSpecificTest.NH2202 +{ + public class Employee + { + private ISet _addresses; + + public virtual int NationalId { get; set; } + public virtual int EmployeeId { get; set; } + + public virtual ISet Addresses + { + get + { + return _addresses ?? (_addresses = new HashedSet()); + } + set + { + _addresses = value; + } + } + + public virtual bool Equals(Employee other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return other.NationalId == NationalId && other.EmployeeId == EmployeeId; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != typeof (Employee)) return false; + return Equals((Employee) obj); + } + + public override int GetHashCode() + { + unchecked + { + return (NationalId*397) ^ EmployeeId; + } + } + } + + public class EmployeeAddress + { + public virtual Employee Employee { get; set; } + public virtual string Type { get; set; } + + public virtual bool Equals(EmployeeAddress other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return Equals(other.Employee, Employee) && Equals(other.Type, Type); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != typeof (EmployeeAddress)) return false; + return Equals((EmployeeAddress) obj); + } + + public override int GetHashCode() + { + unchecked + { + return ((Employee != null ? Employee.GetHashCode() : 0)*397) ^ (Type != null ? Type.GetHashCode() : 0); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-25 20:07:30 UTC (rev 5219) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-26 02:53:50 UTC (rev 5220) @@ -164,7 +164,10 @@ <Compile Include="ConventionsTestCase.cs" /> <Compile Include="Criteria\AddNumberProjection.cs" /> <Compile Include="Criteria\Animal.cs" /> + <Compile Include="Criteria\CityState.cs" /> <Compile Include="Criteria\Course.cs" /> + <Compile Include="Criteria\CourseMeeting.cs" /> + <Compile Include="Criteria\CourseMeetingId.cs" /> <Compile Include="Criteria\CriteriaQueryTest.cs" /> <Compile Include="Criteria\DetachedCriteriaSerializable.cs" /> <Compile Include="Criteria\Enrolment.cs" /> @@ -474,6 +477,8 @@ <Compile Include="NHSpecificTest\NH2148\BugFixture.cs" /> <Compile Include="NHSpecificTest\NH2148\Domain.cs" /> <Compile Include="NHSpecificTest\NH2188\AppDomainWithMultipleSearchPath.cs" /> + <Compile Include="NHSpecificTest\NH2202\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2202\Model.cs" /> <Compile Include="NHSpecificTest\NH2224\Domain.cs" /> <Compile Include="NHSpecificTest\NH2224\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2245\Fixture.cs" /> @@ -1791,6 +1796,7 @@ <EmbeddedResource Include="NHSpecificTest\NH2322\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2278\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1136\Mappings.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\NH2202\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\NHibernate.ByteCode.Castle\NHibernate.ByteCode.Castle.csproj"> @@ -2644,6 +2650,7 @@ <EmbeddedResource Include="DynamicEntity\Tuplizer\Customer.hbm.xml" /> </ItemGroup> <ItemGroup> + <Folder Include="NHSpecificTest\NH2202" /> <Folder Include="Properties\" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jul...@us...> - 2010-09-26 03:53:34
|
Revision: 5222 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5222&view=rev Author: julian-maughan Date: 2010-09-26 03:53:27 +0000 (Sun, 26 Sep 2010) Log Message: ----------- Fixed "QueryException thrown when grouping by component". Port of HHH-5082 (r19183). Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/ICriteriaQuery.cs trunk/nhibernate/src/NHibernate/Criterion/PropertyProjection.cs trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/ICriteriaQuery.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/ICriteriaQuery.cs 2010-09-26 03:00:13 UTC (rev 5221) +++ trunk/nhibernate/src/NHibernate/Criterion/ICriteriaQuery.cs 2010-09-26 03:53:27 UTC (rev 5222) @@ -13,8 +13,11 @@ { ISessionFactoryImplementor Factory { get; } - /// <summary> Get the names of the columns mapped by a property path, ignoring projection aliases </summary> + /// <summary> Get the name of the column mapped by a property path, ignoring projection alias</summary> string GetColumn(ICriteria criteria, string propertyPath); + + /// <summary> Get the names of the columns mapped by a property path, ignoring projection aliases</summary> + string[] GetColumns(ICriteria criteria, string propertyPath); /// <summary> Get the type of a property path, ignoring projection aliases</summary> IType GetType(ICriteria criteria, string propertyPath); @@ -75,4 +78,4 @@ /// </summary> int? CreatePagingParameter(int value); } -} +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Criterion/PropertyProjection.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/PropertyProjection.cs 2010-09-26 03:00:13 UTC (rev 5221) +++ trunk/nhibernate/src/NHibernate/Criterion/PropertyProjection.cs 2010-09-26 03:53:27 UTC (rev 5222) @@ -2,6 +2,7 @@ using System.Collections.Generic; using NHibernate.SqlCommand; using NHibernate.Type; +using NHibernate.Util; namespace NHibernate.Criterion { @@ -72,7 +73,7 @@ { throw new InvalidOperationException("not a grouping projection"); } - return new SqlString(criteriaQuery.GetColumn(criteria, propertyName)); + return new SqlString(StringHelper.Join(",", criteriaQuery.GetColumns(criteria, propertyName))); } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2010-09-26 03:00:13 UTC (rev 5221) +++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2010-09-26 03:53:27 UTC (rev 5222) @@ -530,7 +530,7 @@ public string GetColumn(ICriteria criteria, string propertyName) { - string[] cols = GetColumns(propertyName, criteria); + string[] cols = GetColumns(criteria, propertyName); if (cols.Length != 1) { throw new QueryException("property does not map to a single column: " + propertyName); @@ -546,7 +546,7 @@ // NH Different behavior: we don't use the projection alias for NH-1023 try { - return GetColumns(propertyName, subcriteria); + return GetColumns(subcriteria, propertyName); } catch (HibernateException) { @@ -579,7 +579,7 @@ return new TypedValue(loadable.IdentifierType, value, EntityMode.Poco); } - private string[] GetColumns(string propertyName, ICriteria subcriteria) + public string[] GetColumns(ICriteria subcriteria, string propertyName) { string entName = GetEntityName(subcriteria, propertyName); if (entName == null) @@ -795,7 +795,7 @@ //look for a property try { - return GetColumns(propertyName, subcriteria); + return GetColumns(subcriteria, propertyName); } catch (HibernateException) { Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2010-09-26 03:00:13 UTC (rev 5221) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2010-09-26 03:53:27 UTC (rev 5222) @@ -239,9 +239,170 @@ } [Test] - [Ignore("To be implemented")] public void SubselectWithComponent() { + Course course = null; + Student gavin = null; + DetachedCriteria dc = null; + CityState odessaWa = null; + Enrolment enrolment2 = null; + + using (ISession session = OpenSession()) + using (ITransaction t = session.BeginTransaction()) + { + course = new Course(); + course.CourseCode = "HIB"; + course.Description = "Hibernate Training"; + session.Save(course); + + odessaWa = new CityState("Odessa", "WA"); + + gavin = new Student(); + gavin.Name = "Gavin King"; + gavin.StudentNumber = 232; + gavin.CityState = odessaWa; + session.Save(gavin); + + enrolment2 = new Enrolment(); + enrolment2.Course = course; + enrolment2.CourseCode = course.CourseCode; + enrolment2.Semester = 3; + enrolment2.Year = 1998; + enrolment2.Student = gavin; + enrolment2.StudentNumber = gavin.StudentNumber; + gavin.Enrolments.Add(enrolment2); + + session.Persist(enrolment2); + + dc = DetachedCriteria.For<Student>() + .Add(Property.ForName("CityState").Eq(odessaWa)) + .SetProjection(Property.ForName("CityState")); + + session.CreateCriteria<Student>() + .Add(Subqueries.Exists(dc)) + .List(); + + t.Commit(); + } + + using (ISession session = OpenSession()) + using (ITransaction t = session.BeginTransaction()) + { + try + { + session.CreateCriteria<Student>() + .Add(Subqueries.PropertyEqAll("CityState", dc)) + .List(); + + Assert.Fail("should have failed because cannot compare subquery results with multiple columns"); + } + catch (QueryException ex) + { + // expected + } + t.Rollback(); + } + + using (ISession session = OpenSession()) + using (ITransaction t = session.BeginTransaction()) + { + try + { + session.CreateCriteria<Student>() + .Add(Property.ForName("CityState").EqAll(dc)) + .List(); + + Assert.Fail("should have failed because cannot compare subquery results with multiple columns"); + } + catch (QueryException ex) + { + // expected + } + finally + { + t.Rollback(); + } + } + + using (ISession session = OpenSession()) + using (ITransaction t = session.BeginTransaction()) + { + try + { + session.CreateCriteria<Student>() + .Add(Subqueries.In(odessaWa, dc)) + .List(); + + Assert.Fail("should have failed because cannot compare subquery results with multiple columns"); + } + catch (NHibernate.Exceptions.GenericADOException ex) + { + // expected + } + finally + { + t.Rollback(); + } + } + + using (ISession session = OpenSession()) + using (ITransaction t = session.BeginTransaction()) + { + DetachedCriteria dc2 = DetachedCriteria.For<Student>("st1") + .Add(Property.ForName("st1.CityState").EqProperty("st2.CityState")) + .SetProjection(Property.ForName("CityState")); + + try + { + session.CreateCriteria<Student>("st2") + .Add( Subqueries.Eq(odessaWa, dc2)) + .List(); + Assert.Fail("should have failed because cannot compare subquery results with multiple columns"); + } + catch (NHibernate.Exceptions.GenericADOException ex) + { + // expected + } + finally + { + t.Rollback(); + } + } + + using (ISession session = OpenSession()) + using (ITransaction t = session.BeginTransaction()) + { + DetachedCriteria dc3 = DetachedCriteria.For<Student>("st") + .CreateCriteria("Enrolments") + .CreateCriteria("Course") + .Add(Property.ForName("Description").Eq("Hibernate Training")) + .SetProjection(Property.ForName("st.CityState")); + try + { + session.CreateCriteria<Enrolment>("e") + .Add(Subqueries.Eq(odessaWa, dc3)) + .List(); + + Assert.Fail("should have failed because cannot compare subquery results with multiple columns"); + } + catch (NHibernate.Exceptions.GenericADOException ex) + { + // expected + } + finally + { + t.Rollback(); + } + } + + using (ISession session = OpenSession()) + using (ITransaction t = session.BeginTransaction()) + { + session.Delete(enrolment2); + session.Delete(gavin); + session.Delete(course); + t.Commit(); + } } [Test] @@ -1090,11 +1251,15 @@ Course course = new Course(); course.CourseCode = "HIB"; course.Description = "Hibernate Training"; + course.CourseMeetings.Add(new CourseMeeting(course, "Monday", 1, "1313 Mockingbird Lane")); s.Save(course); Student gavin = new Student(); gavin.Name = "Gavin King"; gavin.StudentNumber = 667; + CityState odessaWa = new CityState("Odessa", "WA"); + gavin.CityState = odessaWa; + gavin.PreferredCourse = course; s.Save(gavin); Student xam = new Student(); @@ -1123,11 +1288,92 @@ s.Save(enrolment); s.Flush(); + // Subtest #1 + IList resultList = s.CreateCriteria<Enrolment>() + .SetProjection(Projections.ProjectionList() + .Add(Property.ForName("Student"), "student") + .Add(Property.ForName("Course"), "course") + .Add(Property.ForName("Semester"), "semester") + .Add(Property.ForName("Year"), "year") + ).List(); + + Assert.That(resultList.Count, Is.EqualTo(2)); + + foreach (object[] objects in resultList) + { + Assert.That(objects.Length, Is.EqualTo(4)); + Assert.That(objects[0], Is.InstanceOf<Student>()); + Assert.That(objects[1], Is.InstanceOf<Course>()); + Assert.That(objects[2], Is.InstanceOf<short>()); + Assert.That(objects[3], Is.InstanceOf<short>()); + } + + // Subtest #2 + resultList = s.CreateCriteria<Student>() + .SetProjection(Projections.ProjectionList() + .Add(Projections.Id().As("StudentNumber")) + .Add(Property.ForName("Name"), "name") + .Add(Property.ForName("CityState"), "cityState") + .Add(Property.ForName("PreferredCourse"), "preferredCourse") + ).List(); + + Assert.That(resultList.Count, Is.EqualTo(2)); + + foreach(object[] objects in resultList) + { + Assert.That(objects.Length, Is.EqualTo(4)); + Assert.That(objects[0], Is.InstanceOf<long>()); + Assert.That(objects[1], Is.InstanceOf<string>()); + + if ("Gavin King".Equals(objects[1])) + { + Assert.That(objects[2], Is.InstanceOf<CityState>()); + Assert.That(objects[3], Is.InstanceOf<Course>()); + } + else + { + Assert.That(objects[2], Is.Null); + Assert.That(objects[3], Is.Null); + } + } + + // Subtest #3 + resultList = s.CreateCriteria<Student>() + .Add(Restrictions.Eq("Name", "Gavin King")) + .SetProjection(Projections.ProjectionList() + .Add(Projections.Id().As("StudentNumber")) + .Add(Property.ForName("Name"), "name") + .Add(Property.ForName("CityState"), "cityState") + .Add(Property.ForName("PreferredCourse"), "preferredCourse") + ).List(); + + Assert.That(resultList.Count, Is.EqualTo(1)); + + // Subtest #4 + object[] aResult = (object[])s.CreateCriteria<Student>() + .Add(Restrictions.IdEq(667L)) + .SetProjection(Projections.ProjectionList() + .Add(Projections.Id().As("StudentNumber")) + .Add(Property.ForName("Name"), "name") + .Add(Property.ForName("CityState"), "cityState") + .Add(Property.ForName("PreferredCourse"), "preferredCourse") + ).UniqueResult(); + + Assert.That(aResult, Is.Not.Null); + Assert.That(aResult.Length, Is.EqualTo(4)); + Assert.That(aResult[0], Is.InstanceOf<long>()); + Assert.That(aResult[1], Is.InstanceOf<string>()); + Assert.That(aResult[2], Is.InstanceOf<CityState>()); + Assert.That(aResult[3], Is.InstanceOf<Course>()); + + // Subtest #5 int count = (int)s.CreateCriteria(typeof(Enrolment)) .SetProjection(Property.ForName("StudentNumber").Count().SetDistinct()) .UniqueResult(); + Assert.AreEqual(2, count); + // Subtest #6 object obj = s.CreateCriteria(typeof(Enrolment)) .SetProjection(Projections.ProjectionList() .Add(Property.ForName("StudentNumber").Count()) @@ -1136,6 +1382,7 @@ .Add(Property.ForName("StudentNumber").Avg()) ) .UniqueResult(); + object[] result = (object[])obj; Assert.AreEqual(2, result[0]); @@ -1143,7 +1390,7 @@ Assert.AreEqual(101L, result[2]); Assert.AreEqual(384.0D, (double)result[3], 0.01D); - + // Subtest #7 s.CreateCriteria(typeof(Enrolment)) .Add(Property.ForName("StudentNumber").Gt(665L)) .Add(Property.ForName("StudentNumber").Lt(668L)) @@ -1152,6 +1399,7 @@ .AddOrder(Property.ForName("StudentNumber").Asc()) .UniqueResult(); + // Subtest #8 IList resultWithMaps = s.CreateCriteria(typeof(Enrolment)) .SetProjection(Projections.ProjectionList() .Add(Property.ForName("StudentNumber").As("stNumber")) @@ -1164,11 +1412,12 @@ .List(); Assert.AreEqual(1, resultWithMaps.Count); + IDictionary m1 = (IDictionary)resultWithMaps[0]; - Assert.AreEqual(667L, m1["stNumber"]); Assert.AreEqual(course.CourseCode, m1["cCode"]); + // Subtest #9 resultWithMaps = s.CreateCriteria(typeof(Enrolment)) .SetProjection(Property.ForName("StudentNumber").As("stNumber")) .AddOrder(Order.Desc("stNumber")) @@ -1176,19 +1425,19 @@ .List(); Assert.AreEqual(2, resultWithMaps.Count); + IDictionary m0 = (IDictionary)resultWithMaps[0]; m1 = (IDictionary)resultWithMaps[1]; - Assert.AreEqual(101L, m1["stNumber"]); Assert.AreEqual(667L, m0["stNumber"]); - + // Subtest #10 IList resultWithAliasedBean = s.CreateCriteria(typeof(Enrolment)) .CreateAlias("Student", "st") .CreateAlias("Course", "co") .SetProjection(Projections.ProjectionList() - .Add(Property.ForName("st.Name").As("studentName")) - .Add(Property.ForName("co.Description").As("courseDescription")) + .Add(Property.ForName("st.Name").As("studentName")) + .Add(Property.ForName("co.Description").As("courseDescription")) ) .AddOrder(Order.Desc("studentName")) .SetResultTransformer(Transformers.AliasToBean(typeof(StudentDTO))) @@ -1196,10 +1445,29 @@ Assert.AreEqual(2, resultWithAliasedBean.Count); + // Subtest #11 StudentDTO dto = (StudentDTO)resultWithAliasedBean[0]; Assert.IsNotNull(dto.Description); Assert.IsNotNull(dto.Name); + // Subtest #12 + CourseMeeting courseMeetingDto = s.CreateCriteria<CourseMeeting>() + .SetProjection(Projections.ProjectionList() + .Add(Property.ForName("Id").As("id")) + .Add(Property.ForName("Course").As("course")) + ) + .AddOrder(Order.Desc("id")) + .SetResultTransformer(Transformers.AliasToBean<CourseMeeting>()) + .UniqueResult<CourseMeeting>(); + + Assert.That(courseMeetingDto.Id, Is.Not.Null); + Assert.That(courseMeetingDto.Id.CourseCode, Is.EqualTo(course.CourseCode)); + Assert.That(courseMeetingDto.Id.Day, Is.EqualTo("Monday")); + Assert.That(courseMeetingDto.Id.Location, Is.EqualTo("1313 Mockingbird Lane")); + Assert.That(courseMeetingDto.Id.Period, Is.EqualTo(1)); + Assert.That(courseMeetingDto.Course.Description, Is.EqualTo(course.Description)); + + // Subtest #13 s.CreateCriteria(typeof(Student)) .Add(Expression.Like("Name", "Gavin", MatchMode.Start)) .AddOrder(Order.Asc("Name")) @@ -1209,14 +1477,15 @@ .CreateCriteria("Course", "c") .AddOrder(Order.Asc("Description")) .SetProjection(Projections.ProjectionList() - .Add(Property.ForName("this.Name")) - .Add(Property.ForName("e.Year")) - .Add(Property.ForName("e.Semester")) - .Add(Property.ForName("c.CourseCode")) - .Add(Property.ForName("c.Description")) + .Add(Property.ForName("this.Name")) + .Add(Property.ForName("e.Year")) + .Add(Property.ForName("e.Semester")) + .Add(Property.ForName("c.CourseCode")) + .Add(Property.ForName("c.Description")) ) .UniqueResult(); + // Subtest #14 ProjectionList p1 = Projections.ProjectionList() .Add(Property.ForName("StudentNumber").Count()) .Add(Property.ForName("StudentNumber").Max()) @@ -1226,10 +1495,10 @@ .Add(Property.ForName("StudentNumber").Min()) .Add(Property.ForName("StudentNumber").Avg()) .Add(Projections.SqlProjection( - "1 as constOne, count(*) as countStar", - new String[] { "constOne", "countStar" }, - new IType[] { NHibernateUtil.Int32, NHibernateUtil.Int32 } - )); + "1 as constOne, count(*) as countStar", + new String[] { "constOne", "countStar" }, + new IType[] { NHibernateUtil.Int32, NHibernateUtil.Int32 } + )); object[] array = (object[])s.CreateCriteria(typeof(Enrolment)) .SetProjection(Projections.ProjectionList().Add(p1).Add(p2)) @@ -1237,18 +1506,49 @@ Assert.AreEqual(7, array.Length); + // Subtest #15 IList list = s.CreateCriteria(typeof(Enrolment)) .CreateAlias("Student", "st") .CreateAlias("Course", "co") .SetProjection(Projections.ProjectionList() - .Add(Property.ForName("co.CourseCode").Group()) - .Add(Property.ForName("st.StudentNumber").Count().SetDistinct()) - .Add(Property.ForName("Year").Group()) + .Add(Property.ForName("co.CourseCode").Group()) + .Add(Property.ForName("st.StudentNumber").Count().SetDistinct()) + .Add(Property.ForName("Year").Group()) ) .List(); Assert.AreEqual(2, list.Count); + // Subtest #16 + list = s.CreateCriteria<Enrolment>() + .CreateAlias("Student", "st") + .CreateAlias("Course", "co") + .SetProjection(Projections.ProjectionList() + .Add(Property.ForName("co.CourseCode").Group().As("courseCode")) + .Add(Property.ForName("st.StudentNumber").Count().SetDistinct().As("studentNumber")) + .Add(Property.ForName("Year").Group()) + ) + .AddOrder(Order.Asc("courseCode")) + .AddOrder(Order.Asc("studentNumber")) + .List(); + + Assert.That(list.Count, Is.EqualTo(2)); + + // Subtest #17 + list = s.CreateCriteria<Enrolment>() + .CreateAlias("Student", "st") + .CreateAlias("Course", "co") + .SetProjection(Projections.ProjectionList() + .Add(Property.ForName("co.CourseCode").Group().As("cCode")) + .Add(Property.ForName("st.StudentNumber").Count().SetDistinct().As("stNumber")) + .Add(Property.ForName("Year").Group()) + ) + .AddOrder(Order.Asc("cCode")) + .AddOrder(Order.Asc("stNumber")) + .List(); + + Assert.That(list.Count, Is.EqualTo(2)); + s.Delete(gavin); s.Delete(xam); s.Delete(course); @@ -1258,15 +1558,272 @@ } [Test] - [Ignore("To be implemented")] public void DistinctProjectionsOfComponents() { + ISession s = OpenSession(); + ITransaction t = s.BeginTransaction(); + + Course course = new Course(); + course.CourseCode = "HIB"; + course.Description = "Hibernate Training"; + s.Save(course); + + Student gavin = new Student(); + gavin.Name = "Gavin King"; + gavin.StudentNumber = 667; + gavin.CityState = new CityState("Odessa", "WA");; + s.Save(gavin); + + Student xam = new Student(); + xam.Name = "Max Rydahl Andersen"; + xam.StudentNumber = 101; + xam.PreferredCourse = course; + xam.CityState = new CityState("Odessa", "WA");; + s.Save(xam); + + Enrolment enrolment = new Enrolment(); + enrolment.Course = course; + enrolment.CourseCode = course.CourseCode; + enrolment.Semester = 1; + enrolment.Year = 1999; + enrolment.Student = xam; + enrolment.StudentNumber = xam.StudentNumber; + xam.Enrolments.Add(enrolment); + s.Save(enrolment); + + enrolment = new Enrolment(); + enrolment.Course = course; + enrolment.CourseCode = course.CourseCode; + enrolment.Semester = 3; + enrolment.Year = 1998; + enrolment.Student = gavin; + enrolment.StudentNumber = gavin.StudentNumber; + gavin.Enrolments.Add(enrolment); + s.Save(enrolment); + s.Flush(); + + object result = s.CreateCriteria<Student>() + .SetProjection(Projections.Distinct(Property.ForName("CityState"))) + .UniqueResult(); + + Assert.That(result, Is.InstanceOf<CityState>()); + Assert.That(((CityState)result).City, Is.EqualTo("Odessa")); + Assert.That(((CityState)result).State, Is.EqualTo("WA")); + + result = s.CreateCriteria<Student>() + .SetProjection(Projections.Distinct(Property.ForName("CityState").As("cityState"))) + .AddOrder(Order.Asc("cityState")) + .UniqueResult(); + + Assert.That(result, Is.InstanceOf<CityState>()); + Assert.That(((CityState)result).City, Is.EqualTo("Odessa")); + Assert.That(((CityState)result).State, Is.EqualTo("WA")); + + result = s.CreateCriteria<Student>() + .SetProjection(Projections.Count("CityState.City")) + .UniqueResult(); + + Assert.That(result, Is.EqualTo(2)); + + result = s.CreateCriteria<Student>() + .SetProjection(Projections.CountDistinct("CityState.City")) + .UniqueResult(); + + Assert.That(result, Is.EqualTo(1)); + + t.Commit(); + s.Close(); + +// s = OpenSession(); +// t = s.BeginTransaction(); +// try +// { +// result = s.CreateCriteria<Student>() +// .SetProjection(Projections.Count("CityState")) +// .UniqueResult(); +// +// if (!Dialect.SupportsTupleCounts) +// { +// fail( "expected SQLGrammarException" ); +// } +// +// Assert.That((long)result, Is.EqualTo(1L)); +// } +// catch (NHibernate.Exceptions.SQLGrammarException ex) +// { +// throw ex; +// if (!Dialect.SupportsTupleCounts) +// { +// // expected +// } +// else +// { +// throw ex; +// } +// } +// finally +// { +// t.Rollback(); +// s.Close(); +// } + +// s = OpenSession(); +// t = s.BeginTransaction(); +// try +// { +// result = s.CreateCriteria<Student>() +// .SetProjection(Projections.CountDistinct("CityState")) +// .UniqueResult(); +// +// if (!Dialect.SupportsTupleDistinctCounts) +// { +// fail("expected SQLGrammarException"); +// } +// +// Assert.That((long)result, Is.EqualTo(1L)); +// } +// catch (NHibernate.Exceptions.SQLGrammarException ex) +// { +// throw ex; +// if (Dialect.SupportsTupleDistinctCounts) +// { +// // expected +// } +// else +// { +// throw ex; +// } +// } +// finally +// { +// t.Rollback(); +// s.Close(); +// } + + s = OpenSession(); + t = s.BeginTransaction(); + s.Delete(gavin); + s.Delete(xam); + s.Delete(course); + + t.Commit(); + s.Close(); } [Test] - [Ignore("To be implemented")] public void GroupByComponent() { + ISession s = OpenSession(); + ITransaction t = s.BeginTransaction(); + + Course course = new Course(); + course.CourseCode = "HIB"; + course.Description = "Hibernate Training"; + s.Save(course); + + Student gavin = new Student(); + gavin.Name = "Gavin King"; + gavin.StudentNumber = 667; + gavin.CityState = new CityState("Odessa", "WA");; + s.Save(gavin); + + Student xam = new Student(); + xam.Name = "Max Rydahl Andersen"; + xam.StudentNumber = 101; + xam.PreferredCourse = course; + xam.CityState = new CityState("Odessa", "WA");; + s.Save(xam); + + Enrolment enrolment = new Enrolment(); + enrolment.Course = course; + enrolment.CourseCode = course.CourseCode; + enrolment.Semester = 1; + enrolment.Year = 1999; + enrolment.Student = xam; + enrolment.StudentNumber = xam.StudentNumber; + xam.Enrolments.Add(enrolment); + s.Save(enrolment); + + enrolment = new Enrolment(); + enrolment.Course = course; + enrolment.CourseCode = course.CourseCode; + enrolment.Semester = 3; + enrolment.Year = 1998; + enrolment.Student = gavin; + enrolment.StudentNumber = gavin.StudentNumber; + gavin.Enrolments.Add(enrolment); + s.Save(enrolment); + s.Flush(); + + object result = s.CreateCriteria<Student>() + .SetProjection(Projections.GroupProperty("CityState")) + .UniqueResult(); + + Assert.That(result, Is.InstanceOf<CityState>()); + Assert.That(((CityState)result).City, Is.EqualTo("Odessa")); + Assert.That(((CityState)result).State, Is.EqualTo("WA")); + + result = s.CreateCriteria<Student>("st") + .SetProjection(Projections.GroupProperty("st.CityState")) + .UniqueResult(); + + Assert.That(result, Is.InstanceOf<CityState>()); + Assert.That(((CityState)result).City, Is.EqualTo("Odessa")); + Assert.That(((CityState)result).State, Is.EqualTo("WA")); + + result = s.CreateCriteria<Student>("st") + .SetProjection(Projections.GroupProperty("st.CityState")) + .AddOrder(Order.Asc("CityState")) + .UniqueResult(); + + Assert.That(result, Is.InstanceOf<CityState>()); + Assert.That(((CityState)result).City, Is.EqualTo("Odessa")); + Assert.That(((CityState)result).State, Is.EqualTo("WA")); + + result = s.CreateCriteria<Student>("st") + .SetProjection(Projections.GroupProperty("st.CityState").As("cityState")) + .AddOrder(Order.Asc("cityState")) + .UniqueResult(); + + Assert.That(result, Is.InstanceOf<CityState>()); + Assert.That(((CityState)result).City, Is.EqualTo("Odessa")); + Assert.That(((CityState)result).State, Is.EqualTo("WA")); + + result = s.CreateCriteria<Student>("st") + .SetProjection(Projections.GroupProperty("st.CityState").As("cityState")) + .AddOrder(Order.Asc("cityState")) + .UniqueResult(); + + Assert.That(result, Is.InstanceOf<CityState>()); + Assert.That(((CityState)result).City, Is.EqualTo("Odessa")); + Assert.That(((CityState)result).State, Is.EqualTo("WA")); + + result = s.CreateCriteria<Student>("st") + .SetProjection(Projections.GroupProperty("st.CityState").As("cityState")) + .Add(Restrictions.Eq("st.CityState", new CityState("Odessa", "WA"))) + .AddOrder(Order.Asc("cityState")) + .UniqueResult(); + + Assert.That(result, Is.InstanceOf<CityState>()); + Assert.That(((CityState)result).City, Is.EqualTo("Odessa")); + Assert.That(((CityState)result).State, Is.EqualTo("WA")); + + IList list = s.CreateCriteria<Enrolment>() + .CreateAlias("Student", "st") + .CreateAlias("Course", "co") + .SetProjection(Projections.ProjectionList() + .Add(Property.ForName("co.CourseCode").Group()) + .Add(Property.ForName("st.CityState").Group()) + .Add(Property.ForName("Year").Group()) + ) + .List(); + + s.Delete(gavin); + s.Delete(xam); + s.Delete(course); + + t.Commit(); + s.Close(); } [Test] @@ -1624,9 +2181,24 @@ } [Test] - [Ignore("To be implemented")] public void ProjectedCompositeIdWithAlias() { + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + Course course = new Course(); + course.CourseCode = "HIB"; + course.Description = "Hibernate Training"; + course.CourseMeetings.Add(new CourseMeeting(course, "Monday", 1, "1313 Mockingbird Lane")); + s.Save(course); + s.Flush(); + + IList data = (IList)s.CreateCriteria<CourseMeeting>() + .SetProjection(Projections.Id().As("id")) + .List(); + + t.Rollback(); + } } [Test] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-09-26 16:54:22
|
Revision: 5224 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5224&view=rev Author: fabiomaulo Date: 2010-09-26 16:54:16 +0000 (Sun, 26 Sep 2010) Log Message: ----------- Fix NH-2348 (thanks to Patrick Earl for the idea) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/ trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/Domain.cs trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/PolymorphicGetAndLoadTest.cs Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs 2010-09-26 14:26:22 UTC (rev 5223) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) @@ -1,6 +1,6 @@ using System; using System.Diagnostics; - +using System.Text; using NHibernate.Cache; using NHibernate.Cache.Access; using NHibernate.Cache.Entry; @@ -36,7 +36,7 @@ } else { - persister = source.Factory.GetEntityPersister(@event.EntityClassName); + persister = GetEntityPersister(source.Factory, @event.EntityClassName); } if (persister == null) @@ -384,7 +384,7 @@ } if (options.IsAllowNulls) { - IEntityPersister persister = @event.Session.Factory.GetEntityPersister(@event.EntityClassName); + IEntityPersister persister = GetEntityPersister(@event.Session.Factory, @event.EntityClassName); if (!persister.IsInstance(old, @event.Session.EntityMode)) { return InconsistentRTNClassMarker; @@ -493,5 +493,32 @@ } return result; } + + protected virtual IEntityPersister GetEntityPersister(ISessionFactoryImplementor factory, string entityName) + { + // Check for an exact match. + IEntityPersister persister = factory.TryGetEntityPersister(entityName); + if (persister != null) + { + return persister; + } + + // Couldn't find persister through exact name, try finding a single implementing class. + string[] implementors = factory.GetImplementors(entityName); + if (implementors.Length > 1) + { + var messageBuilder = new StringBuilder(512); + messageBuilder.AppendLine(string.Format("Ambiguous persister for {0} implemented by more than one hierarchy: ", + entityName)); + Array.ForEach(implementors, s=> messageBuilder.AppendLine(s)); + + throw new HibernateException(messageBuilder.ToString()); + } + if (implementors.Length == 0) + { + return null; + } + return factory.GetEntityPersister(implementors[0]); + } } } Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-26 14:26:22 UTC (rev 5223) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-26 16:54:16 UTC (rev 5224) @@ -517,6 +517,8 @@ <Compile Include="NHSpecificTest\NH2331\Person.cs" /> <Compile Include="NHSpecificTest\NH2344\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2344\Model.cs" /> + <Compile Include="PolymorphicGetAndLoad\Domain.cs" /> + <Compile Include="PolymorphicGetAndLoad\PolymorphicGetAndLoadTest.cs" /> <Compile Include="TypesTest\CharClass.cs" /> <Compile Include="TypesTest\CharClassFixture.cs" /> <Compile Include="TypesTest\DateTimeClass.cs" /> @@ -2312,6 +2314,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="PolymorphicGetAndLoad\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2331\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2324\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2344\Mappings.hbm.xml" /> @@ -2655,7 +2658,6 @@ <EmbeddedResource Include="DynamicEntity\Tuplizer\Customer.hbm.xml" /> </ItemGroup> <ItemGroup> - <Folder Include="NHSpecificTest\NH2202" /> <Folder Include="Properties\" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> Added: trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/Domain.cs 2010-09-26 16:54:16 UTC (rev 5224) @@ -0,0 +1,41 @@ +namespace NHibernate.Test.PolymorphicGetAndLoad +{ + public class A: INamed + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + } + + public interface IOccuped + { + string Occupation { get; set; } + } + + public class B: A, IOccuped + { + public virtual string Occupation { get; set; } + } + + public interface INamed + { + string Name { get; set; } + } + + public class GraphA : IMultiGraphNamed + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + } + + public class GraphB : IMultiGraphNamed + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + } + + public interface IMultiGraphNamed + { + string Name { get; set; } + } + +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/Mappings.hbm.xml 2010-09-26 16:54:16 UTC (rev 5224) @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.PolymorphicGetAndLoad"> + + <class name="A"> + <id name="Id"> + <generator class="hilo" /> + </id> + <property name="Name"/> + <joined-subclass name="B"> + <key column="AId"/> + <property name="Occupation"/> + </joined-subclass> + </class> + + <class name="GraphA"> + <id name="Id"> + <generator class="hilo" /> + </id> + <property name="Name"/> + </class> + + <class name="GraphB"> + <id name="Id"> + <generator class="hilo" /> + </id> + <property name="Name"/> + </class> + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/PolymorphicGetAndLoadTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/PolymorphicGetAndLoadTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/PolymorphicGetAndLoad/PolymorphicGetAndLoadTest.cs 2010-09-26 16:54:16 UTC (rev 5224) @@ -0,0 +1,260 @@ +using System; +using System.Collections; +using NHibernate.Engine; +using NHibernate.Proxy; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.PolymorphicGetAndLoad +{ + public class PolymorphicGetAndLoadTest: TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get { return new[] { "PolymorphicGetAndLoad.Mappings.hbm.xml" }; } + } + + public class ScenarioWithA : IDisposable + { + private readonly ISessionFactory factory; + private readonly A a; + + public ScenarioWithA(ISessionFactory factory) + { + this.factory = factory; + a = new A { Name = "Patrick" }; + using (var s = factory.OpenSession()) + { + s.Save(a); + s.Flush(); + } + } + + public A A + { + get { return a; } + } + + public void Dispose() + { + using (var s = factory.OpenSession()) + { + s.Delete(a); + s.Flush(); + } + } + } + + public class ScenarioWithB : IDisposable + { + private readonly ISessionFactory factory; + private readonly B b; + + public ScenarioWithB(ISessionFactory factory) + { + this.factory = factory; + b = new B { Name = "Patrick", Occupation = "hincha pelotas (en el buen sentido), but good candidate to be committer."}; + using (var s = factory.OpenSession()) + { + s.Save(b); + s.Flush(); + } + } + + public B B + { + get { return b; } + } + + public void Dispose() + { + using (var s = factory.OpenSession()) + { + s.Delete(b); + s.Flush(); + } + } + } + + [Test] + public void WhenSaveDeleteBaseClassCastedToInterfaceThenNotThrows() + { + INamed a = new A { Name = "Patrick" }; + Executing.This(() => + { + using (var s = OpenSession()) + { + s.Save(a); + s.Flush(); + } + }).Should().NotThrow(); + + Executing.This(() => + { + using (var s = OpenSession()) + { + s.Delete(a); + s.Flush(); + } + }).Should().NotThrow(); + + } + + [Test] + public void WhenLoadBaseClassUsingInterfaceThenNotThrows() + { + using (var scenario = new ScenarioWithA(Sfi)) + { + using (var s = OpenSession()) + { + s.Executing(session => session.Load<INamed>(scenario.A.Id)).NotThrows(); + } + } + } + + [Test] + public void WhenGetBaseClassUsingInterfaceThenNotThrows() + { + using (var scenario = new ScenarioWithA(Sfi)) + { + using (var s = OpenSession()) + { + s.Executing(session => session.Get<INamed>(scenario.A.Id)).NotThrows(); + } + } + } + + [Test] + public void WhenLoadInheritedClassUsingInterfaceThenNotThrows() + { + using (var scenario = new ScenarioWithB(Sfi)) + { + using (var s = OpenSession()) + { + Executing.This(()=> s.Load<INamed>(scenario.B.Id) ).Should().NotThrow(); + } + } + } + + [Test] + public void WhenLoadInheritedClassUsingInterfaceThenShouldAllowNarrowingProxy() + { + using (var scenario = new ScenarioWithB(Sfi)) + { + using (var s = OpenSession()) + { + INamed loadedEntity = null; + Executing.This(() => loadedEntity = s.Load<INamed>(scenario.B.Id)).Should().NotThrow(); + NHibernateProxyHelper.GetClassWithoutInitializingProxy(loadedEntity).Should().Be(typeof(A)); + + var narrowedProxy = s.Load<B>(scenario.B.Id); + + NHibernateProxyHelper.GetClassWithoutInitializingProxy(narrowedProxy).Should().Be(typeof(B)); + + var firstLoadedImpl = ((INHibernateProxy)loadedEntity).HibernateLazyInitializer.GetImplementation((ISessionImplementor)s); + var secondLoadedImpl = ((INHibernateProxy)narrowedProxy).HibernateLazyInitializer.GetImplementation((ISessionImplementor)s); + firstLoadedImpl.Should().Be.SameInstanceAs(secondLoadedImpl); + } + } + } + + [Test] + public void WhenLoadInterfaceThenShouldAllowNarrowingProxy() + { + using (var scenario = new ScenarioWithB(Sfi)) + { + using (var s = OpenSession()) + { + INamed loadedEntity = null; + Executing.This(() => loadedEntity = s.Load<INamed>(scenario.B.Id)).Should().NotThrow(); + NHibernateProxyHelper.GetClassWithoutInitializingProxy(loadedEntity).Should().Be(typeof(A)); + + var narrowedProxy = s.Load<IOccuped>(scenario.B.Id); + + NHibernateProxyHelper.GetClassWithoutInitializingProxy(narrowedProxy).Should().Be(typeof(B)); + + var firstLoadedImpl = ((INHibernateProxy)loadedEntity).HibernateLazyInitializer.GetImplementation((ISessionImplementor)s); + var secondLoadedImpl = ((INHibernateProxy)narrowedProxy).HibernateLazyInitializer.GetImplementation((ISessionImplementor)s); + firstLoadedImpl.Should().Be.SameInstanceAs(secondLoadedImpl); + } + } + } + + [Test] + public void WhenGetInheritedClassUsingInterfaceThenNotThrows() + { + using (var scenario = new ScenarioWithB(Sfi)) + { + using (var s = OpenSession()) + { + INamed loadedEntity = null; + Executing.This(() => loadedEntity = s.Get<INamed>(scenario.B.Id)).Should().NotThrow(); + loadedEntity.Should().Be.OfType<B>(); + } + } + } + + [Test] + public void WhenLoadClassUsingInterfaceOfMultippleHierarchyThenThrows() + { + using (var s = OpenSession()) + { + Executing.This(() => s.Load<IMultiGraphNamed>(1)) + .Should().Throw<HibernateException>() + .And.ValueOf.Message.Should() + .Contain("Ambiguous") + .And.Contain("GraphA") + .And.Contain("GraphB") + .And.Contain("IMultiGraphNamed"); + } + } + + [Test] + public void WhenGetClassUsingInterfaceOfMultippleHierarchyThenThrows() + { + using (var s = OpenSession()) + { + Executing.This(() => s.Get<IMultiGraphNamed>(1)) + .Should().Throw<HibernateException>() + .And.ValueOf.Message.Should() + .Contain("Ambiguous") + .And.Contain("GraphA") + .And.Contain("GraphB") + .And.Contain("IMultiGraphNamed"); + } + } + + [Test] + public void WhenGetBaseClassUsingInterfaceFromSessionCacheThenNotThrows() + { + using (var scenario = new ScenarioWithA(Sfi)) + { + using (var s = OpenSession()) + { + var id = scenario.A.Id; + s.Get<A>(id); + s.Executing(session => session.Get<INamed>(id)).NotThrows(); + } + } + } + + [Test] + public void WhenGetInheritedClassUsingInterfaceFromSessionCacheThenNotThrows() + { + using (var scenario = new ScenarioWithB(Sfi)) + { + using (var s = OpenSession()) + { + var id = scenario.B.Id; + s.Get<B>(id); + s.Executing(session => session.Get<INamed>(id)).NotThrows(); + } + } + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-09-26 17:49:26
|
Revision: 5225 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5225&view=rev Author: fabiomaulo Date: 2010-09-26 17:49:15 +0000 (Sun, 26 Sep 2010) Log Message: ----------- Renamed internal logger interface to make happy Castle's logging facility Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs trunk/nhibernate/src/NHibernate/AdoNet/ConnectionManager.cs trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs trunk/nhibernate/src/NHibernate/Cache/CacheFactory.cs trunk/nhibernate/src/NHibernate/Cache/NoCacheProvider.cs trunk/nhibernate/src/NHibernate/Cache/NonstrictReadWriteCache.cs trunk/nhibernate/src/NHibernate/Cache/ReadOnlyCache.cs trunk/nhibernate/src/NHibernate/Cache/ReadWriteCache.cs trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs trunk/nhibernate/src/NHibernate/Cache/UpdateTimestampsCache.cs trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/HibernateConfiguration.cs trunk/nhibernate/src/NHibernate/Cfg/Environment.cs trunk/nhibernate/src/NHibernate/Cfg/Mappings.cs trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/Binder.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/FilterDefinitionFactory.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingLogExtensions.cs trunk/nhibernate/src/NHibernate/Collection/PersistentArrayHolder.cs trunk/nhibernate/src/NHibernate/Connection/ConnectionProvider.cs trunk/nhibernate/src/NHibernate/Connection/ConnectionProviderFactory.cs trunk/nhibernate/src/NHibernate/Connection/DriverConnectionProvider.cs trunk/nhibernate/src/NHibernate/Connection/UserSuppliedConnectionProvider.cs trunk/nhibernate/src/NHibernate/Context/ThreadLocalSessionContext.cs trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs trunk/nhibernate/src/NHibernate/Dialect/Lock/UpdateLockingStrategy.cs trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractTableMetadata.cs trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs trunk/nhibernate/src/NHibernate/Driver/NHybridDataReader.cs trunk/nhibernate/src/NHibernate/Engine/ActionQueue.cs trunk/nhibernate/src/NHibernate/Engine/Cascade.cs trunk/nhibernate/src/NHibernate/Engine/CascadingAction.cs trunk/nhibernate/src/NHibernate/Engine/CollectionEntry.cs trunk/nhibernate/src/NHibernate/Engine/Collections.cs trunk/nhibernate/src/NHibernate/Engine/ForeignKeys.cs trunk/nhibernate/src/NHibernate/Engine/IdentifierValue.cs trunk/nhibernate/src/NHibernate/Engine/Loading/CollectionLoadContext.cs trunk/nhibernate/src/NHibernate/Engine/Loading/LoadContexts.cs trunk/nhibernate/src/NHibernate/Engine/Query/HQLQueryPlan.cs trunk/nhibernate/src/NHibernate/Engine/Query/NativeSQLQueryPlan.cs trunk/nhibernate/src/NHibernate/Engine/Query/QueryPlanCache.cs trunk/nhibernate/src/NHibernate/Engine/QueryParameters.cs trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs trunk/nhibernate/src/NHibernate/Engine/Transaction/Isolater.cs trunk/nhibernate/src/NHibernate/Engine/TwoPhaseLoad.cs trunk/nhibernate/src/NHibernate/Engine/VersionValue.cs trunk/nhibernate/src/NHibernate/Engine/Versioning.cs trunk/nhibernate/src/NHibernate/Event/Default/AbstractFlushingEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/AbstractLockUpgradeEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/AbstractReassociateEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/AbstractSaveEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultAutoFlushEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultDeleteEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultDirtyCheckEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultEvictEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultInitializeCollectionEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultMergeEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultPersistEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultRefreshEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultReplicateEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultSaveOrUpdateEventListener.cs trunk/nhibernate/src/NHibernate/Event/Default/EvictVisitor.cs trunk/nhibernate/src/NHibernate/Event/Default/ReattachVisitor.cs trunk/nhibernate/src/NHibernate/Event/Default/WrapVisitor.cs trunk/nhibernate/src/NHibernate/Exceptions/SQLExceptionConverterFactory.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/ErrorCounter.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Exec/AbstractStatementExecutor.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Exec/BasicExecutor.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Exec/MultiTableDeleteExecutor.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Exec/MultiTableUpdateExecutor.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/HqlParser.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/QueryTranslatorImpl.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/AbstractRestrictableStatement.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/DeleteStatement.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/FromClause.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementFactory.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementType.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/FromReferenceNode.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/IndexNode.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/MethodNode.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/QueryNode.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Tree/UpdateStatement.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Util/JoinProcessor.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Util/LiteralProcessor.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Util/PathHelper.cs trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Util/SyntheticAndFactory.cs trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs trunk/nhibernate/src/NHibernate/Hql/QuerySplitter.cs trunk/nhibernate/src/NHibernate/Id/Enhanced/OptimizerFactory.cs trunk/nhibernate/src/NHibernate/Id/Enhanced/SequenceStructure.cs trunk/nhibernate/src/NHibernate/Id/Enhanced/SequenceStyleGenerator.cs trunk/nhibernate/src/NHibernate/Id/Enhanced/TableStructure.cs trunk/nhibernate/src/NHibernate/Id/IdentifierGeneratorFactory.cs trunk/nhibernate/src/NHibernate/Id/IncrementGenerator.cs trunk/nhibernate/src/NHibernate/Id/NativeGuidGenerator.cs trunk/nhibernate/src/NHibernate/Id/SequenceGenerator.cs trunk/nhibernate/src/NHibernate/Id/SequenceHiLoGenerator.cs trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs trunk/nhibernate/src/NHibernate/Id/TableHiLoGenerator.cs trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs trunk/nhibernate/src/NHibernate/Impl/EnumerableImpl.cs trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs trunk/nhibernate/src/NHibernate/Impl/Printer.cs trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs trunk/nhibernate/src/NHibernate/Impl/SessionFactoryObjectFactory.cs trunk/nhibernate/src/NHibernate/Impl/SessionImpl.cs trunk/nhibernate/src/NHibernate/Impl/StatelessSessionImpl.cs trunk/nhibernate/src/NHibernate/Linq/Functions/LinqToHqlGeneratorsRegistryFactory.cs trunk/nhibernate/src/NHibernate/Loader/Collection/BasicCollectionLoader.cs trunk/nhibernate/src/NHibernate/Loader/Collection/OneToManyLoader.cs trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaJoinWalker.cs trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs trunk/nhibernate/src/NHibernate/Loader/Custom/Sql/SQLCustomQuery.cs trunk/nhibernate/src/NHibernate/Loader/Custom/Sql/SQLQueryReturnProcessor.cs trunk/nhibernate/src/NHibernate/Loader/Entity/AbstractEntityLoader.cs trunk/nhibernate/src/NHibernate/Loader/Entity/CollectionElementLoader.cs trunk/nhibernate/src/NHibernate/Loader/Loader.cs trunk/nhibernate/src/NHibernate/Logging.cs trunk/nhibernate/src/NHibernate/Mapping/RootClass.cs trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs trunk/nhibernate/src/NHibernate/Persister/Collection/NamedQueryCollectionInitializer.cs trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs trunk/nhibernate/src/NHibernate/Persister/Entity/NamedQueryLoader.cs trunk/nhibernate/src/NHibernate/SqlCommand/InsertSelect.cs trunk/nhibernate/src/NHibernate/SqlCommand/SqlDeleteBuilder.cs trunk/nhibernate/src/NHibernate/SqlCommand/SqlInsertBuilder.cs trunk/nhibernate/src/NHibernate/SqlCommand/SqlSelectBuilder.cs trunk/nhibernate/src/NHibernate/SqlCommand/SqlUpdateBuilder.cs trunk/nhibernate/src/NHibernate/Stat/StatisticsImpl.cs trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/DatabaseMetadata.cs trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs trunk/nhibernate/src/NHibernate/Transaction/AdoNetTransactionFactory.cs trunk/nhibernate/src/NHibernate/Transaction/AdoNetWithDistributedTransactionFactory.cs trunk/nhibernate/src/NHibernate/Transaction/AdoTransaction.cs trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs trunk/nhibernate/src/NHibernate/Tuple/Component/AbstractComponentTuplizer.cs trunk/nhibernate/src/NHibernate/Tuple/Entity/AbstractEntityTuplizer.cs trunk/nhibernate/src/NHibernate/Tuple/Entity/DynamicMapEntityTuplizer.cs trunk/nhibernate/src/NHibernate/Tuple/Entity/EntityMetamodel.cs trunk/nhibernate/src/NHibernate/Tuple/Entity/PocoEntityTuplizer.cs trunk/nhibernate/src/NHibernate/Tuple/PocoInstantiator.cs trunk/nhibernate/src/NHibernate/Type/DbTimestampType.cs trunk/nhibernate/src/NHibernate/Type/NullableType.cs trunk/nhibernate/src/NHibernate/Util/ADOExceptionReporter.cs trunk/nhibernate/src/NHibernate/Util/IdentityMap.cs trunk/nhibernate/src/NHibernate/Util/JoinedEnumerable.cs trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactory.cs trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ProxyFactory.cs Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -21,7 +21,7 @@ /// </summary> public abstract class AbstractBatcher : IBatcher { - protected static readonly ILogger log = LoggerProvider.LoggerFor(typeof(AbstractBatcher)); + protected static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(AbstractBatcher)); private static int openCommandCount; private static int openReaderCount; Modified: trunk/nhibernate/src/NHibernate/AdoNet/ConnectionManager.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/ConnectionManager.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/AdoNet/ConnectionManager.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -17,7 +17,7 @@ [Serializable] public class ConnectionManager : ISerializable, IDeserializationCallback { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(ConnectionManager)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(ConnectionManager)); public interface Callback { Modified: trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -8,7 +8,7 @@ /// <summary> Centralize logging handling for SQL statements. </summary> public class SqlStatementLogger { - private static readonly ILogger log = LoggerProvider.LoggerFor("NHibernate.SQL"); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor("NHibernate.SQL"); /// <summary> Constructs a new SqlStatementLogger instance.</summary> public SqlStatementLogger() : this(false, false) { } Modified: trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -13,7 +13,7 @@ /// </summary> public class BytecodeProviderImpl : AbstractBytecodeProvider { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof (BytecodeProviderImpl)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof (BytecodeProviderImpl)); #region IBytecodeProvider Members Modified: trunk/nhibernate/src/NHibernate/Cache/CacheFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/CacheFactory.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cache/CacheFactory.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -9,7 +9,7 @@ /// </summary> public static class CacheFactory { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(CacheFactory)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(CacheFactory)); public const string ReadOnly = "read-only"; public const string ReadWrite = "read-write"; Modified: trunk/nhibernate/src/NHibernate/Cache/NoCacheProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/NoCacheProvider.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cache/NoCacheProvider.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -9,7 +9,7 @@ /// </summary> public class NoCacheProvider : ICacheProvider { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(NoCacheProvider)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(NoCacheProvider)); public const string WarnMessage = "Second-level cache is enabled in a class, but no cache provider was selected. Fake cache used."; Modified: trunk/nhibernate/src/NHibernate/Cache/NonstrictReadWriteCache.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/NonstrictReadWriteCache.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cache/NonstrictReadWriteCache.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -16,7 +16,7 @@ { private ICache cache; - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(NonstrictReadWriteCache)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(NonstrictReadWriteCache)); /// <summary> /// Gets the cache region name. Modified: trunk/nhibernate/src/NHibernate/Cache/ReadOnlyCache.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/ReadOnlyCache.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cache/ReadOnlyCache.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -10,7 +10,7 @@ public class ReadOnlyCache : ICacheConcurrencyStrategy { private ICache cache; - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(ReadOnlyCache)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(ReadOnlyCache)); /// <summary> /// Gets the cache region name. Modified: trunk/nhibernate/src/NHibernate/Cache/ReadWriteCache.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/ReadWriteCache.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cache/ReadWriteCache.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -30,7 +30,7 @@ bool IsPuttable(long txTimestamp, object newVersion, IComparer comparator); } - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(ReadWriteCache)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(ReadWriteCache)); private readonly object _lockObject = new object(); private ICache cache; Modified: trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -18,7 +18,7 @@ /// </summary> public class StandardQueryCache : IQueryCache { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof (StandardQueryCache)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof (StandardQueryCache)); private readonly ICache queryCache; private readonly string regionName; private readonly UpdateTimestampsCache updateTimestampsCache; Modified: trunk/nhibernate/src/NHibernate/Cache/UpdateTimestampsCache.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/UpdateTimestampsCache.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cache/UpdateTimestampsCache.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -16,7 +16,7 @@ /// </summary> public class UpdateTimestampsCache { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(UpdateTimestampsCache)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(UpdateTimestampsCache)); private ICache updateTimestamps; private readonly string regionName = typeof(UpdateTimestampsCache).Name; Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -76,7 +76,7 @@ protected IDictionary<string, Mappings.TableDescription> tableNameBinding; protected IDictionary<Table, Mappings.ColumnNames> columnNameBindingPerTable; - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(Configuration)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(Configuration)); protected internal SettingsFactory settingsFactory; Modified: trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/HibernateConfiguration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/HibernateConfiguration.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cfg/ConfigurationSchema/HibernateConfiguration.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -23,7 +23,7 @@ /// </summary> public class HibernateConfiguration : IHibernateConfiguration { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(HibernateConfiguration)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(HibernateConfiguration)); /// <summary> /// Initializes a new instance of the <see cref="HibernateConfiguration"/> class. Modified: trunk/nhibernate/src/NHibernate/Cfg/Environment.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -167,7 +167,7 @@ private static IBytecodeProvider BytecodeProviderInstance; private static bool EnableReflectionOptimizer; - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof (Environment)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof (Environment)); /// <summary> /// Issue warnings to user when any obsolete property names are used. Modified: trunk/nhibernate/src/NHibernate/Cfg/Mappings.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Mappings.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cfg/Mappings.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -47,7 +47,7 @@ #endregion - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(Mappings)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(Mappings)); private readonly IDictionary<string, PersistentClass> classes; private readonly IDictionary<string, Mapping.Collection> collections; Modified: trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -22,7 +22,7 @@ [Serializable] public sealed class SettingsFactory { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(SettingsFactory)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(SettingsFactory)); private static readonly string DefaultCacheProvider = typeof(NoCacheProvider).AssemblyQualifiedName; public Settings BuildSettings(IDictionary<string, string> properties) Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/Binder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/Binder.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/Binder.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -10,7 +10,7 @@ { public abstract class Binder { - protected static readonly ILogger log = LoggerProvider.LoggerFor(typeof (Binder)); + protected static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof (Binder)); protected static readonly IDictionary<string, MetaAttribute> EmptyMeta = new CollectionHelper.EmptyMapClass<string, MetaAttribute>(); Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/FilterDefinitionFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/FilterDefinitionFactory.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/FilterDefinitionFactory.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -8,7 +8,7 @@ { public class FilterDefinitionFactory { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof (FilterDefinitionFactory)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof (FilterDefinitionFactory)); public static FilterDefinition CreateFilterDefinition(HbmFilterDef filterDefSchema) { Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingLogExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingLogExtensions.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingLogExtensions.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -5,7 +5,7 @@ { public static class MappingLogExtensions { - public static void LogMapped(this Mapping.Property property, ILogger log) + public static void LogMapped(this Mapping.Property property, IInternalLogger log) { if (log.IsDebugEnabled) { Modified: trunk/nhibernate/src/NHibernate/Collection/PersistentArrayHolder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Collection/PersistentArrayHolder.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Collection/PersistentArrayHolder.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -20,7 +20,7 @@ [DebuggerTypeProxy(typeof (CollectionProxy))] public class PersistentArrayHolder : AbstractPersistentCollection, ICollection { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof (PersistentArrayHolder)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof (PersistentArrayHolder)); private Array array; Modified: trunk/nhibernate/src/NHibernate/Connection/ConnectionProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Connection/ConnectionProvider.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Connection/ConnectionProvider.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -15,7 +15,7 @@ /// </summary> public abstract class ConnectionProvider : IConnectionProvider { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(ConnectionProvider)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(ConnectionProvider)); private string connString; private IDriver driver; Modified: trunk/nhibernate/src/NHibernate/Connection/ConnectionProviderFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Connection/ConnectionProviderFactory.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Connection/ConnectionProviderFactory.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -11,7 +11,7 @@ /// </summary> public sealed class ConnectionProviderFactory { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(ConnectionProviderFactory)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(ConnectionProviderFactory)); // cannot be instantiated private ConnectionProviderFactory() Modified: trunk/nhibernate/src/NHibernate/Connection/DriverConnectionProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Connection/DriverConnectionProvider.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Connection/DriverConnectionProvider.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -9,7 +9,7 @@ /// </summary> public class DriverConnectionProvider : ConnectionProvider { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DriverConnectionProvider)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DriverConnectionProvider)); /// <summary> /// Closes and Disposes of the <see cref="IDbConnection"/>. Modified: trunk/nhibernate/src/NHibernate/Connection/UserSuppliedConnectionProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Connection/UserSuppliedConnectionProvider.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Connection/UserSuppliedConnectionProvider.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -14,7 +14,7 @@ /// </remarks> public class UserSuppliedConnectionProvider : ConnectionProvider { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(UserSuppliedConnectionProvider)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(UserSuppliedConnectionProvider)); /// <summary> /// Throws an <see cref="InvalidOperationException"/> if this method is called Modified: trunk/nhibernate/src/NHibernate/Context/ThreadLocalSessionContext.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Context/ThreadLocalSessionContext.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Context/ThreadLocalSessionContext.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -30,7 +30,7 @@ [Serializable] public class ThreadLocalSessionContext : ICurrentSessionContext { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(ThreadLocalSessionContext)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(ThreadLocalSessionContext)); [ThreadStatic] protected static IDictionary<ISessionFactory, ISession> context; Modified: trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Dialect/Dialect.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -31,7 +31,7 @@ /// </remarks> public abstract class Dialect { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(Dialect)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(Dialect)); private readonly TypeNames typeNames = new TypeNames(); private readonly TypeNames hibernateTypeNames = new TypeNames(); Modified: trunk/nhibernate/src/NHibernate/Dialect/Lock/UpdateLockingStrategy.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Lock/UpdateLockingStrategy.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Dialect/Lock/UpdateLockingStrategy.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -15,7 +15,7 @@ /// <remarks> This strategy is not valid for read style locks. </remarks> public class UpdateLockingStrategy : ILockingStrategy { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(UpdateLockingStrategy)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(UpdateLockingStrategy)); private readonly ILockable lockable; private readonly LockMode lockMode; private readonly SqlString sql; Modified: trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractTableMetadata.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractTableMetadata.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractTableMetadata.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -7,7 +7,7 @@ { public abstract class AbstractTableMetadata : ITableMetadata { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(ITableMetadata)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(ITableMetadata)); private string catalog; private string schema; private string name; Modified: trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Driver/DriverBase.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -14,7 +14,7 @@ /// </summary> public abstract class DriverBase : IDriver, ISqlParameterFormatter { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DriverBase)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DriverBase)); private int commandTimeout; private bool prepareSql; Modified: trunk/nhibernate/src/NHibernate/Driver/NHybridDataReader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Driver/NHybridDataReader.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Driver/NHybridDataReader.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -22,7 +22,7 @@ /// </remarks> public class NHybridDataReader : IDataReader { - private ILogger log = LoggerProvider.LoggerFor(typeof(NHybridDataReader)); + private IInternalLogger log = LoggerProvider.LoggerFor(typeof(NHybridDataReader)); private IDataReader _reader; private bool _isMidstream = false; Modified: trunk/nhibernate/src/NHibernate/Engine/ActionQueue.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/ActionQueue.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/ActionQueue.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -21,7 +21,7 @@ [Serializable] public class ActionQueue { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(ActionQueue)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(ActionQueue)); private const int InitQueueListSize = 5; private ISessionImplementor session; Modified: trunk/nhibernate/src/NHibernate/Engine/Cascade.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Cascade.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/Cascade.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -70,7 +70,7 @@ /// </summary> public sealed class Cascade { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(Cascade)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(Cascade)); private CascadePoint point; private readonly IEventSource eventSource; Modified: trunk/nhibernate/src/NHibernate/Engine/CascadingAction.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/CascadingAction.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/CascadingAction.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -14,7 +14,7 @@ /// </summary> public abstract class CascadingAction { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(CascadingAction)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(CascadingAction)); #region The CascadingAction contract Modified: trunk/nhibernate/src/NHibernate/Engine/CollectionEntry.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/CollectionEntry.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/CollectionEntry.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -14,7 +14,7 @@ [Serializable] public class CollectionEntry { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof (CollectionEntry)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof (CollectionEntry)); /// <summary>session-start/post-flush persistent state</summary> private object snapshot; Modified: trunk/nhibernate/src/NHibernate/Engine/Collections.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Collections.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/Collections.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -8,7 +8,7 @@ { public static class Collections { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(Collections)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(Collections)); /// <summary> /// Record the fact that this collection was dereferenced Modified: trunk/nhibernate/src/NHibernate/Engine/ForeignKeys.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/ForeignKeys.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/ForeignKeys.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -9,7 +9,7 @@ /// <summary> Algorithms related to foreign key constraint transparency </summary> public static class ForeignKeys { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(ForeignKeys)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(ForeignKeys)); public class Nullifier { Modified: trunk/nhibernate/src/NHibernate/Engine/IdentifierValue.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/IdentifierValue.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/IdentifierValue.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -9,7 +9,7 @@ /// </summary> public class IdentifierValue { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(IdentifierValue)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(IdentifierValue)); private readonly object value; Modified: trunk/nhibernate/src/NHibernate/Engine/Loading/CollectionLoadContext.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Loading/CollectionLoadContext.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/Loading/CollectionLoadContext.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -22,7 +22,7 @@ /// </remarks> public class CollectionLoadContext { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(CollectionLoadContext)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(CollectionLoadContext)); private readonly LoadContexts loadContexts; private readonly IDataReader resultSet; private readonly ISet<CollectionKey> localLoadingCollectionKeys = new HashedSet<CollectionKey>(); Modified: trunk/nhibernate/src/NHibernate/Engine/Loading/LoadContexts.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Loading/LoadContexts.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/Loading/LoadContexts.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -26,7 +26,7 @@ /// </remarks> public class LoadContexts { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(LoadContexts)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(LoadContexts)); [NonSerialized] private readonly IPersistenceContext persistenceContext; Modified: trunk/nhibernate/src/NHibernate/Engine/Query/HQLQueryPlan.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Query/HQLQueryPlan.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/Query/HQLQueryPlan.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -31,7 +31,7 @@ [Serializable] public class HQLQueryPlan : IQueryPlan { - protected static readonly ILogger Log = LoggerProvider.LoggerFor(typeof(HQLQueryPlan)); + protected static readonly IInternalLogger Log = LoggerProvider.LoggerFor(typeof(HQLQueryPlan)); private readonly string _sourceQuery; Modified: trunk/nhibernate/src/NHibernate/Engine/Query/NativeSQLQueryPlan.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Query/NativeSQLQueryPlan.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/Query/NativeSQLQueryPlan.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -19,7 +19,7 @@ [Serializable] public class NativeSQLQueryPlan { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(NativeSQLQueryPlan)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(NativeSQLQueryPlan)); private readonly string sourceQuery; private readonly SQLCustomQuery customQuery; Modified: trunk/nhibernate/src/NHibernate/Engine/Query/QueryPlanCache.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Query/QueryPlanCache.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/Query/QueryPlanCache.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -11,7 +11,7 @@ [Serializable] public class QueryPlanCache { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(QueryPlanCache)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(QueryPlanCache)); private readonly ISessionFactoryImplementor factory; Modified: trunk/nhibernate/src/NHibernate/Engine/QueryParameters.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/QueryParameters.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/QueryParameters.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -22,7 +22,7 @@ { public delegate int[] GetNamedParameterLocations(string parameterName); - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof (QueryParameters)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof (QueryParameters)); private IType[] _positionalParameterTypes; private object[] _positionalParameterValues; Modified: trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -32,8 +32,8 @@ public class StatefulPersistenceContext : IPersistenceContext, ISerializable, IDeserializationCallback { private const int InitCollectionSize = 8; - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(StatefulPersistenceContext)); - private static readonly ILogger ProxyWarnLog = LoggerProvider.LoggerFor(typeof(StatefulPersistenceContext).FullName + ".ProxyWarnLog"); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(StatefulPersistenceContext)); + private static readonly IInternalLogger ProxyWarnLog = LoggerProvider.LoggerFor(typeof(StatefulPersistenceContext).FullName + ".ProxyWarnLog"); public static readonly object NoRow = new object(); Modified: trunk/nhibernate/src/NHibernate/Engine/Transaction/Isolater.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Transaction/Isolater.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/Transaction/Isolater.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -28,7 +28,7 @@ /// </remarks> public class Isolater { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(Isolater)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(Isolater)); /// <summary> /// Ensures that all processing actually performed by the given work will Modified: trunk/nhibernate/src/NHibernate/Engine/TwoPhaseLoad.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/TwoPhaseLoad.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/TwoPhaseLoad.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -18,7 +18,7 @@ /// </summary> public static class TwoPhaseLoad { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(TwoPhaseLoad)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(TwoPhaseLoad)); /// <summary> /// Register the "hydrated" state of an entity instance, after the first step of 2-phase loading. Modified: trunk/nhibernate/src/NHibernate/Engine/VersionValue.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/VersionValue.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/VersionValue.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -11,7 +11,7 @@ /// </summary> public class VersionValue { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(VersionValue)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(VersionValue)); private readonly object value; Modified: trunk/nhibernate/src/NHibernate/Engine/Versioning.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Versioning.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Engine/Versioning.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -17,7 +17,7 @@ All = 2 } - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(Versioning)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(Versioning)); /// <summary> /// Increment the given version number Modified: trunk/nhibernate/src/NHibernate/Event/Default/AbstractFlushingEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/AbstractFlushingEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/AbstractFlushingEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -18,7 +18,7 @@ [Serializable] public abstract class AbstractFlushingEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof (AbstractFlushingEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof (AbstractFlushingEventListener)); protected virtual object Anything { Modified: trunk/nhibernate/src/NHibernate/Event/Default/AbstractLockUpgradeEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/AbstractLockUpgradeEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/AbstractLockUpgradeEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -16,7 +16,7 @@ [Serializable] public class AbstractLockUpgradeEventListener : AbstractReassociateEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(AbstractLockUpgradeEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(AbstractLockUpgradeEventListener)); /// <summary> /// Performs a pessimistic lock upgrade on a given entity, if needed. Modified: trunk/nhibernate/src/NHibernate/Event/Default/AbstractReassociateEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/AbstractReassociateEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/AbstractReassociateEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -15,7 +15,7 @@ [Serializable] public class AbstractReassociateEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(AbstractReassociateEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(AbstractReassociateEventListener)); /// <summary> /// Associates a given entity (either transient or associated with another session) to the given session. Modified: trunk/nhibernate/src/NHibernate/Event/Default/AbstractSaveEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/AbstractSaveEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/AbstractSaveEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -28,7 +28,7 @@ [Serializable] public abstract class AbstractSaveEventListener : AbstractReassociateEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(AbstractSaveEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(AbstractSaveEventListener)); protected virtual bool? AssumedUnsaved { Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultAutoFlushEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultAutoFlushEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultAutoFlushEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -11,7 +11,7 @@ [Serializable] public class DefaultAutoFlushEventListener : AbstractFlushingEventListener, IAutoFlushEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DefaultAutoFlushEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DefaultAutoFlushEventListener)); #region IAutoFlushEventListener Members Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultDeleteEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultDeleteEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultDeleteEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -19,7 +19,7 @@ [Serializable] public class DefaultDeleteEventListener : IDeleteEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DefaultDeleteEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DefaultDeleteEventListener)); #region IDeleteEventListener Members Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultDirtyCheckEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultDirtyCheckEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultDirtyCheckEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -10,7 +10,7 @@ [Serializable] public class DefaultDirtyCheckEventListener : AbstractFlushingEventListener, IDirtyCheckEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DefaultDirtyCheckEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DefaultDirtyCheckEventListener)); public virtual void OnDirtyCheck(DirtyCheckEvent @event) { Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultEvictEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultEvictEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultEvictEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -16,7 +16,7 @@ [Serializable] public class DefaultEvictEventListener : IEvictEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DefaultEvictEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DefaultEvictEventListener)); public virtual void OnEvict(EvictEvent @event) { Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -16,7 +16,7 @@ [Serializable] public class DefaultFlushEntityEventListener : IFlushEntityEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DefaultFlushEntityEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DefaultFlushEntityEventListener)); /// <summary> /// Flushes a single entity's state to the database, by scheduling an update action, if necessary Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultInitializeCollectionEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultInitializeCollectionEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultInitializeCollectionEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -13,7 +13,7 @@ [Serializable] public class DefaultInitializeCollectionEventListener : IInitializeCollectionEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DefaultInitializeCollectionEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DefaultInitializeCollectionEventListener)); /// <summary> called by a collection that wants to initialize itself</summary> public virtual void OnInitializeCollection(InitializeCollectionEvent @event) Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -19,7 +19,7 @@ [Serializable] public class DefaultLoadEventListener : AbstractLockUpgradeEventListener, ILoadEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DefaultLoadEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DefaultLoadEventListener)); public static readonly object RemovedEntityMarker = new object(); public static readonly object InconsistentRTNClassMarker= new object(); public static readonly LockMode DefaultLockMode = LockMode.None; Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultMergeEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultMergeEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultMergeEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -18,7 +18,7 @@ [Serializable] public class DefaultMergeEventListener : AbstractSaveEventListener, IMergeEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DefaultMergeEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DefaultMergeEventListener)); protected override CascadingAction CascadeAction { Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultPersistEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultPersistEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultPersistEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -15,7 +15,7 @@ [Serializable] public class DefaultPersistEventListener : AbstractSaveEventListener, IPersistEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DefaultPersistEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DefaultPersistEventListener)); protected override CascadingAction CascadeAction { Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultRefreshEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultRefreshEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultRefreshEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -17,7 +17,7 @@ [Serializable] public class DefaultRefreshEventListener : IRefreshEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DefaultRefreshEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DefaultRefreshEventListener)); public virtual void OnRefresh(RefreshEvent @event) { Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultReplicateEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultReplicateEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultReplicateEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -13,7 +13,7 @@ [Serializable] public class DefaultReplicateEventListener : AbstractSaveEventListener, IReplicateEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DefaultReplicateEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DefaultReplicateEventListener)); public virtual void OnReplicate(ReplicateEvent @event) { Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultSaveOrUpdateEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultSaveOrUpdateEventListener.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultSaveOrUpdateEventListener.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -14,7 +14,7 @@ [Serializable] public class DefaultSaveOrUpdateEventListener : AbstractSaveEventListener, ISaveOrUpdateEventListener { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(DefaultSaveOrUpdateEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DefaultSaveOrUpdateEventListener)); protected override CascadingAction CascadeAction { Modified: trunk/nhibernate/src/NHibernate/Event/Default/EvictVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/EvictVisitor.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/EvictVisitor.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -13,7 +13,7 @@ /// </summary> public class EvictVisitor : AbstractVisitor { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(EvictVisitor)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(EvictVisitor)); public EvictVisitor(IEventSource session) : base(session) { } Modified: trunk/nhibernate/src/NHibernate/Event/Default/ReattachVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/ReattachVisitor.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/ReattachVisitor.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -13,7 +13,7 @@ { private readonly object ownerIdentifier; private readonly object owner; - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(AbstractFlushingEventListener)); + private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(AbstractFlushingEventListener)); protected ReattachVisitor(IEventSource session, object ownerIdentifier, object owner) : base(session) Modified: trunk/nhibernate/src/NHibernate/Event/Default/WrapVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/WrapVisitor.cs 2010-09-26 16:54:16 UTC (rev 5224) +++ trunk/nhibernate/src/NHibernate/Event/Default/WrapVisitor.cs 2010-09-26 17:49:15 UTC (rev 5225) @@ -12,7 +12,7 @@ /// </summary> public class WrapVisitor : ProxyVisitor { - private static readonly ILogger log = LoggerProvider.LoggerFor(typeof(WrapVisitor)); + priv... [truncated message content] |
From: <fab...@us...> - 2010-10-01 11:55:50
|
Revision: 5230 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5230&view=rev Author: fabiomaulo Date: 2010-10-01 11:55:44 +0000 (Fri, 01 Oct 2010) Log Message: ----------- Fix NH-2355 (by Roger Kratz) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassCompositeIdBinder.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameAndCompositeId/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameAndCompositeId/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameAndCompositeId/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassCompositeIdBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassCompositeIdBinder.cs 2010-09-30 16:27:15 UTC (rev 5229) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassCompositeIdBinder.cs 2010-10-01 11:55:44 UTC (rev 5230) @@ -19,7 +19,7 @@ compositeId = new Component(rootClass); compositeId.IsKey = true; - + rootClass.Identifier = compositeId; if (idSchema.name == null) @@ -41,7 +41,16 @@ compositeId.Table.SetIdentifierValue(compositeId); compositeId.NullValue = idSchema.unsavedvalue.ToNullValue(); - System.Type compIdClass = compositeId.ComponentClass; + if (!compositeId.IsDynamic) + { + CheckEqualsAndGetHashCodeOverride(); + } + // Serializability check not ported + } + + private void CheckEqualsAndGetHashCodeOverride() + { + var compIdClass = compositeId.ComponentClass; if (!ReflectHelper.OverridesEquals(compIdClass)) { throw new MappingException("composite-id class must override Equals(): " + compIdClass.FullName); @@ -51,7 +60,6 @@ { throw new MappingException("composite-id class must override GetHashCode(): " + compIdClass.FullName); } - // Serializability check not ported } private void BindComponent(System.Type reflectedClass, string path, HbmCompositeId idSchema) @@ -70,8 +78,16 @@ else { // an "embedded" component (ids only) - compositeId.ComponentClass = compositeId.Owner.MappedClass; - compositeId.IsEmbedded = true; + if (compositeId.Owner.HasPocoRepresentation) + { + compositeId.ComponentClass = compositeId.Owner.MappedClass; + compositeId.IsEmbedded = true; + } + else + { + // if not - treat compositeid as a dynamic-component + compositeId.IsDynamic = true; + } } foreach (object item in idSchema.Items ?? new object[0]) Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameAndCompositeId/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameAndCompositeId/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameAndCompositeId/Fixture.cs 2010-10-01 11:55:44 UTC (rev 5230) @@ -0,0 +1,48 @@ +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.EntityNameAndCompositeId +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnTearDown() + { + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateSQLQuery("delete from Person").ExecuteUpdate(); + tx.Commit(); + } + } + } + + [Test] + public void CanPersistAndRead() + { + object id; + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + id = s.Save("Person", new Dictionary<string, object> + { + {"OuterId", new Dictionary<string, int> {{"InnerId", 1}}}, + {"Data", "hello"} + }); + tx.Commit(); + } + } + using (ISession s = OpenSession()) + { + using (s.BeginTransaction()) + { + var p = (IDictionary) s.Get("Person", id); + Assert.AreEqual("hello", p["Data"]); + } + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameAndCompositeId/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameAndCompositeId/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameAndCompositeId/Mappings.hbm.xml 2010-10-01 11:55:44 UTC (rev 5230) @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.EntityNameAndCompositeId" + assembly="NHibernate.Test"> + <class entity-name="Person"> + <composite-id name="OuterId"> + <key-property name="InnerId" type="Int32" /> + </composite-id> + <property name="Data" type="string"/> + </class> +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-30 16:27:15 UTC (rev 5229) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-01 11:55:44 UTC (rev 5230) @@ -453,6 +453,7 @@ <Compile Include="Linq\ReadonlyTestCase.cs" /> <Compile Include="Logging\Log4NetLoggerTest.cs" /> <Compile Include="Logging\LoggerProviderTest.cs" /> + <Compile Include="NHSpecificTest\EntityNameAndCompositeId\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1136\Address.cs" /> <Compile Include="NHSpecificTest\NH1136\FeeMatrixType.cs" /> <Compile Include="NHSpecificTest\NH1136\Fixture.cs" /> @@ -2317,6 +2318,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\EntityNameAndCompositeId\Mappings.hbm.xml" /> <EmbeddedResource Include="PolymorphicGetAndLoad\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2331\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2324\Mappings.hbm.xml" /> @@ -2661,7 +2663,6 @@ <EmbeddedResource Include="DynamicEntity\Tuplizer\Customer.hbm.xml" /> </ItemGroup> <ItemGroup> - <Folder Include="NHSpecificTest\NH1869" /> <Folder Include="Properties\" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-10-06 17:09:47
|
Revision: 5231 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5231&view=rev Author: fabiomaulo Date: 2010-10-06 17:09:41 +0000 (Wed, 06 Oct 2010) Log Message: ----------- Applied NH-2357 by Daniel Guenter Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/Linq/BooleanMethodExtensionExample.cs Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs 2010-10-01 11:55:44 UTC (rev 5230) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs 2010-10-06 17:09:41 UTC (rev 5231) @@ -351,6 +351,11 @@ return new HqlMethodCall(_factory, methodName, parameters); } + public HqlBooleanMethodCall BooleanMethodCall(string methodName, IEnumerable<HqlExpression> parameters) + { + return new HqlBooleanMethodCall(_factory, methodName, parameters); + } + public HqlDistinctHolder DistinctHolder(params HqlTreeNode[] children) { return new HqlDistinctHolder(_factory, children); Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs 2010-10-01 11:55:44 UTC (rev 5230) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs 2010-10-06 17:09:41 UTC (rev 5231) @@ -810,6 +810,16 @@ } } + public class HqlBooleanMethodCall : HqlBooleanExpression + { + public HqlBooleanMethodCall(IASTFactory factory, string methodName, IEnumerable<HqlExpression> parameters) + : base(HqlSqlWalker.METHOD_CALL, "method", factory) + { + AddChild(new HqlIdent(factory, methodName)); + AddChild(new HqlExpressionList(factory, parameters)); + } + } + public class HqlDistinctHolder : HqlExpression { public HqlDistinctHolder(IASTFactory factory, HqlTreeNode[] children) : base(int.MinValue, "distinct holder", factory, children) Added: trunk/nhibernate/src/NHibernate.Test/Linq/BooleanMethodExtensionExample.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Linq/BooleanMethodExtensionExample.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Linq/BooleanMethodExtensionExample.cs 2010-10-06 17:09:41 UTC (rev 5231) @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using NHibernate.Cfg; +using NHibernate.Cfg.Loquacious; +using NHibernate.Hql.Ast; +using NHibernate.Linq; +using NHibernate.Linq.Functions; +using NHibernate.Linq.Visitors; +using NHibernate.Test.Linq.Entities; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.Linq +{ + public static class BooleanLinqExtensions + { + public static bool FreeText(this string source, string pattern) + { + throw new NotImplementedException(); + } + } + + public class FreetextGenerator : BaseHqlGeneratorForMethod + { + public FreetextGenerator() + { + SupportedMethods = new[] {ReflectionHelper.GetMethodDefinition(() => BooleanLinqExtensions.FreeText(null, null))}; + } + + public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, + ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, + IHqlExpressionVisitor visitor) + { + IEnumerable<HqlExpression> args = arguments.Select(a => visitor.Visit(a)) + .Cast<HqlExpression>(); + + return treeBuilder.BooleanMethodCall("FREETEXT", args); + } + } + + [TestFixture] + public class BooleanMethodExtensionExample : LinqTestCase + { + public class MyLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry + { + public MyLinqToHqlGeneratorsRegistry() + { + RegisterGenerator(ReflectionHelper.GetMethodDefinition(() => BooleanLinqExtensions.FreeText(null, null)), + new FreetextGenerator()); + } + } + + protected override void Configure(Configuration configuration) + { + configuration.LinqToHqlGeneratorsRegistry<MyLinqToHqlGeneratorsRegistry>(); + } + + [Test, Ignore("It work only with full-text indexes enabled.")] + public void CanUseMyCustomExtension() + { + List<Customer> contacts = (from c in db.Customers where c.ContactName.FreeText("Thomas") select c).ToList(); + contacts.Count.Should().Be.GreaterThan(0); + contacts.Select(customer => customer.ContactName).All(c => c.Satisfy(customer => customer.Contains("Thomas"))); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-01 11:55:44 UTC (rev 5230) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-06 17:09:41 UTC (rev 5231) @@ -404,6 +404,7 @@ <Compile Include="Linq\AggregateTests.cs" /> <Compile Include="Linq\BinaryBooleanExpressionTests.cs" /> <Compile Include="Linq\BinaryExpressionOrdererTests.cs" /> + <Compile Include="Linq\BooleanMethodExtensionExample.cs" /> <Compile Include="Linq\CasingTest.cs" /> <Compile Include="Linq\CollectionAssert.cs" /> <Compile Include="Linq\CustomExtensionsExample.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-10-06 18:58:19
|
Revision: 5233 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5233&view=rev Author: fabiomaulo Date: 2010-10-06 18:58:13 +0000 (Wed, 06 Oct 2010) Log Message: ----------- Fix NH-2364 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs trunk/nhibernate/src/NHibernate/Tuple/Entity/EntityMetamodel.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameWithFullName/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameWithFullName/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameWithFullName/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2010-10-06 17:40:17 UTC (rev 5232) +++ trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs 2010-10-06 18:58:13 UTC (rev 5233) @@ -600,6 +600,11 @@ // and take the System.Type directly from the persister (className have high probability to be entityName) if (entityPersisters.TryGetValue(className, out checkPersister)) { + if(!checkPersister.EntityMetamodel.HasPocoRepresentation) + { + // we found the persister but it is a dynamic entity without class + return new[] { className }; + } // NH : take care with this because we are forcing the Poco EntityMode clazz = checkPersister.GetMappedClass(EntityMode.Poco); } Modified: trunk/nhibernate/src/NHibernate/Tuple/Entity/EntityMetamodel.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tuple/Entity/EntityMetamodel.cs 2010-10-06 17:40:17 UTC (rev 5232) +++ trunk/nhibernate/src/NHibernate/Tuple/Entity/EntityMetamodel.cs 2010-10-06 18:58:13 UTC (rev 5233) @@ -125,7 +125,7 @@ bool foundInsertGeneratedValue = false; bool foundUpdateGeneratedValue = false; bool foundNonIdentifierPropertyNamedId = false; - + HasPocoRepresentation = persistentClass.HasPocoRepresentation; foreach (Mapping.Property prop in persistentClass.PropertyClosureIterator) { // NH: A lazy property is a simple property marked with lazy=true or a relation (in this case many-to-one or one-to-one marked as "no-proxy") @@ -301,6 +301,8 @@ tuplizerMapping = new EntityEntityModeToTuplizerMapping(persistentClass, this); } + public bool HasPocoRepresentation { get; private set; } + private static void VerifyCanInterceptPropertiesForLazyOrGhostProperties(PersistentClass persistentClass) { foreach (var prop in persistentClass.PropertyClosureIterator) Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameWithFullName/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameWithFullName/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameWithFullName/Fixture.cs 2010-10-06 18:58:13 UTC (rev 5233) @@ -0,0 +1,79 @@ +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.EntityNameWithFullName +{ + public class Fixture : BugTestCase + { + protected override void OnTearDown() + { + using (var s = OpenSession()) + { + using (var tx = s.BeginTransaction()) + { + s.CreateSQLQuery("delete from Parent").ExecuteUpdate(); + tx.Commit(); + } + } + } + + [Test] + public void CanPersistAndRead() + { + using (var s = OpenSession()) + { + using (var tx = s.BeginTransaction()) + { + s.Save("NHibernate.Test.NHSpecificTest.EntityNameWithFullName.Parent", new Dictionary<string, object> + { + {"SomeData", "hello"} + }); + tx.Commit(); + } + } + using (var s = OpenSession()) + { + using (s.BeginTransaction()) + { + var p = (IDictionary)s.CreateQuery(@"select p from NHibernate.Test.NHSpecificTest.EntityNameWithFullName.Parent p where p.SomeData = :data") + .SetString("data", "hello") + .List()[0]; + Assert.AreEqual("hello", p["SomeData"]); + } + } + } + + [Test] + public void OnlyOneSelect() + { + using (var s = OpenSession()) + { + var sf = s.SessionFactory; + var onOffBefore = turnOnStatistics(s); + try + { + using (s.BeginTransaction()) + { + s.CreateQuery(@"select p from NHibernate.Test.NHSpecificTest.EntityNameWithFullName.Parent p where p.SomeData = :data") + .SetString("data", "hello") + .List(); + } + Assert.AreEqual(1, sf.Statistics.QueryExecutionCount); + } + finally + { + sf.Statistics.IsStatisticsEnabled = onOffBefore; + } + } + } + + private static bool turnOnStatistics(ISession session) + { + var onOff = session.SessionFactory.Statistics.IsStatisticsEnabled; + session.SessionFactory.Statistics.IsStatisticsEnabled = true; + session.SessionFactory.Statistics.Clear(); + return onOff; + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameWithFullName/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameWithFullName/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/EntityNameWithFullName/Mappings.hbm.xml 2010-10-06 18:58:13 UTC (rev 5233) @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test"> + <class entity-name="NHibernate.Test.NHSpecificTest.EntityNameWithFullName.Parent"> + <id name="Id" type="Int32"> + <generator class="native"/> + </id> + <property name="SomeData" type="string"/> + </class> + + <!-- just a dummy mapping here to show the problem --> + <class entity-name="NHibernate.Test.NHSpecificTest.EntityNameWithFullName.Parent2"> + <id name="Id" type="Int32"> + <generator class="native"/> + </id> + <property name="SomeOtherData" type="string"/> + </class> + +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-06 17:40:17 UTC (rev 5232) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-06 18:58:13 UTC (rev 5233) @@ -455,6 +455,7 @@ <Compile Include="Logging\Log4NetLoggerTest.cs" /> <Compile Include="Logging\LoggerProviderTest.cs" /> <Compile Include="NHSpecificTest\EntityNameAndCompositeId\Fixture.cs" /> + <Compile Include="NHSpecificTest\EntityNameWithFullName\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1136\Address.cs" /> <Compile Include="NHSpecificTest\NH1136\FeeMatrixType.cs" /> <Compile Include="NHSpecificTest\NH1136\Fixture.cs" /> @@ -2320,6 +2321,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\EntityNameWithFullName\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2361\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\EntityNameAndCompositeId\Mappings.hbm.xml" /> <EmbeddedResource Include="PolymorphicGetAndLoad\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-10-07 12:34:46
|
Revision: 5235 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5235&view=rev Author: fabiomaulo Date: 2010-10-07 12:34:39 +0000 (Thu, 07 Oct 2010) Log Message: ----------- Fix NH-2367 (UriType) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/NHibernateUtil.cs trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Type/UriType.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/UriTypeFixture.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-10-06 20:55:15 UTC (rev 5234) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-10-07 12:34:39 UTC (rev 5235) @@ -859,6 +859,7 @@ <Compile Include="Type\DefaultCollectionTypeFactory.cs" /> <Compile Include="Bytecode\ICollectionTypeFactory.cs" /> <Compile Include="Type\LocalDateTimeType.cs" /> + <Compile Include="Type\UriType.cs" /> <Compile Include="Type\UtcDateTimeType.cs" /> <Compile Include="Type\XmlDocType.cs" /> <Compile Include="Util\ExpressionsHelper.cs" /> Modified: trunk/nhibernate/src/NHibernate/NHibernateUtil.cs =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2010-10-06 20:55:15 UTC (rev 5234) +++ trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2010-10-07 12:34:39 UTC (rev 5235) @@ -283,6 +283,8 @@ public static readonly NullableType XmlDoc = new XmlDocType(); + public static readonly NullableType Uri = new UriType(); + /// <summary> /// A NHibernate persistent enum type /// </summary> Modified: trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2010-10-06 20:55:15 UTC (rev 5234) +++ trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2010-10-07 12:34:39 UTC (rev 5235) @@ -208,6 +208,8 @@ RegisterType(typeof (UInt64), NHibernateUtil.UInt64, new[] {"ulong"}); RegisterType(typeof (XmlDocument), NHibernateUtil.XmlDoc, new[] {"xmldoc", "xmldocument", "xml"}); + + RegisterType(typeof (Uri), NHibernateUtil.Uri, new[] {"uri", "url"}); // object needs to have both class and serializable setup before it can // be created. Added: trunk/nhibernate/src/NHibernate/Type/UriType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/UriType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/UriType.cs 2010-10-07 12:34:39 UTC (rev 5235) @@ -0,0 +1,64 @@ +using System; +using System.Data; +using NHibernate.SqlTypes; + +namespace NHibernate.Type +{ + [Serializable] + public class UriType : ImmutableType, IDiscriminatorType + { + public UriType() + : base(new StringSqlType()) + { + } + + public UriType(SqlType sqlType) : base(sqlType) + { + } + + public override string Name + { + get { return "Uri"; } + } + + public override System.Type ReturnedClass + { + get { return typeof(Uri); } + } + + public object StringToObject(string xml) + { + return new Uri(xml); + } + + public override void Set(IDbCommand cmd, object value, int index) + { + ((IDataParameter)cmd.Parameters[index]).Value = ToString(value); + } + + public override object Get(IDataReader rs, int index) + { + return StringToObject(Convert.ToString(rs[index])); + } + + public override object Get(IDataReader rs, string name) + { + return StringToObject(Convert.ToString(rs[name])); + } + + public override string ToString(object val) + { + return ((Uri)val).OriginalString; + } + + public override object FromStringValue(string xml) + { + return StringToObject(xml); + } + + public string ObjectToSQLString(object value, Dialect.Dialect dialect) + { + return "'" + ((Uri)value).OriginalString + "'"; + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-06 20:55:15 UTC (rev 5234) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-07 12:34:39 UTC (rev 5235) @@ -529,6 +529,8 @@ <Compile Include="TypesTest\CharClassFixture.cs" /> <Compile Include="TypesTest\DateTimeClass.cs" /> <Compile Include="TypesTest\LocalDateTimeTypeFixture.cs" /> + <Compile Include="TypesTest\UriClass.cs" /> + <Compile Include="TypesTest\UriTypeFixture.cs" /> <Compile Include="TypesTest\UtcDateTimeTypeFixture.cs" /> <Compile Include="TypesTest\XmlDocClass.cs" /> <Compile Include="TypesTest\XmlDocTypeFixture.cs" /> @@ -2321,6 +2323,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="TypesTest\UriClass.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\EntityNameWithFullName\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2361\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\EntityNameAndCompositeId\Mappings.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.cs 2010-10-07 12:34:39 UTC (rev 5235) @@ -0,0 +1,11 @@ +using System; + +namespace NHibernate.Test.TypesTest +{ + public class UriClass + { + public int Id { get; set; } + public Uri Url { get; set; } + public Uri AutoUri { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.hbm.xml 2010-10-07 12:34:39 UTC (rev 5235) @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> + <class name="NHibernate.Test.TypesTest.UriClass, NHibernate.Test" table="nh_uri"> + <id name="Id" column="id"> + <generator class="assigned" /> + </id> + + <property name="Url" type="Uri" /> + <property name="AutoUri" /> + </class> +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/UriTypeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/UriTypeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/UriTypeFixture.cs 2010-10-07 12:34:39 UTC (rev 5235) @@ -0,0 +1,73 @@ +using System; +using NHibernate.Type; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.TypesTest +{ + public class UriTypeFixture : TypeFixtureBase + { + protected override string TypeName + { + get { return "Uri"; } + } + + [Test] + public void ReadWrite() + { + using (var s = OpenSession()) + { + var entity = new UriClass { Id = 1 }; + entity.Url = new Uri("http://www.fabiomaulo.blogspot.com/"); + s.Save(entity); + s.Flush(); + } + + using (var s = OpenSession()) + { + var entity = s.Get<UriClass>(1); + entity.Url.Should().Not.Be.Null(); + entity.Url.OriginalString.Should().Be("http://www.fabiomaulo.blogspot.com/"); + entity.Url = new Uri("http://fabiomaulo.blogspot.com/2010/10/nhibernate-30-cookbook.html"); + s.Save(entity); + s.Flush(); + } + using (var s = OpenSession()) + { + var entity = s.Get<UriClass>(1); + entity.Url.OriginalString.Should().Be("http://fabiomaulo.blogspot.com/2010/10/nhibernate-30-cookbook.html"); + s.Delete(entity); + s.Flush(); + } + } + + [Test] + public void InsertNullValue() + { + using (ISession s = OpenSession()) + { + var entity = new UriClass { Id = 1 }; + entity.Url = null; + s.Save(entity); + s.Flush(); + } + + using (ISession s = OpenSession()) + { + var entity = s.Get<UriClass>(1); + entity.Url.Should().Be.Null(); + s.Delete(entity); + s.Flush(); + } + } + + [Test] + public void AutoDiscoverFromNetType() + { + // integration test to be 100% sure + var propertyType = sessions.GetEntityPersister(typeof(UriClass).FullName).GetPropertyType("AutoUri"); + propertyType.Should().Be.InstanceOf<UriType>(); + } + + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-10-07 13:48:46
|
Revision: 5236 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5236&view=rev Author: fabiomaulo Date: 2010-10-07 13:48:36 +0000 (Thu, 07 Oct 2010) Log Message: ----------- Fix NH-2313 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2010-10-07 12:34:39 UTC (rev 5235) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2010-10-07 13:48:36 UTC (rev 5236) @@ -196,8 +196,8 @@ private PersistentClass GetPersistentClass(string className) { - PersistentClass pc = configuration.classes[className]; - if (pc == null) + PersistentClass pc; + if (!configuration.classes.TryGetValue(className, out pc)) { throw new MappingException("persistent class not known: " + className); } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/Domain.cs 2010-10-07 13:48:36 UTC (rev 5236) @@ -0,0 +1,12 @@ +namespace NHibernate.Test.NHSpecificTest.NH2313 +{ + public class MyClass + { + public virtual TheOtherPart TheOtherPart { get; set; } + } + + public class TheOtherPart + { + + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/Fixture.cs 2010-10-07 13:48:36 UTC (rev 5236) @@ -0,0 +1,17 @@ +using NHibernate.Cfg; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.NHSpecificTest.NH2313 +{ + public class Fixture + { + [Test] + public void WhenLoadWorngMappingThenMessageShouldContaingWrongClassName() + { + Configuration cfg = TestConfigurationHelper.GetDefaultConfiguration(); + cfg.AddResource("NHibernate.Test.NHSpecificTest.NH2313.Mappings.hbm.xml", GetType().Assembly); + cfg.Executing(c=> c.BuildSessionFactory()).Throws<MappingException>().And.ValueOf.Message.Should().Contain("TheOther"); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2313/Mappings.hbm.xml 2010-10-07 13:48:36 UTC (rev 5236) @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2313"> + + <class name="MyClass"> + <id type="int"> + <generator class="native" /> + </id> + <one-to-one name="TheOtherPart" class="TheOther"/> + </class> + + <class name="TheOtherPart"> + <id type="int"> + <generator class="native" /> + </id> + </class> +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-07 12:34:39 UTC (rev 5235) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-07 13:48:36 UTC (rev 5236) @@ -509,6 +509,8 @@ <Compile Include="NHSpecificTest\NH2302\StringLengthEntity.cs" /> <Compile Include="NHSpecificTest\NH2303\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2303\Model.cs" /> + <Compile Include="NHSpecificTest\NH2313\Domain.cs" /> + <Compile Include="NHSpecificTest\NH2313\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2322\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2322\Model.cs" /> <Compile Include="NHSpecificTest\NH2322\PostUpdateEventListener.cs" /> @@ -2323,6 +2325,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2313\Mappings.hbm.xml" /> <EmbeddedResource Include="TypesTest\UriClass.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\EntityNameWithFullName\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2361\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2010-10-07 16:30:51
|
Revision: 5237 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5237&view=rev Author: ayenderahien Date: 2010-10-07 16:30:45 +0000 (Thu, 07 Oct 2010) Log Message: ----------- NH-2309 - Futures queries with Linq Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Person.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs Modified: trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs 2010-10-07 13:48:36 UTC (rev 5236) +++ trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs 2010-10-07 16:30:45 UTC (rev 5237) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; @@ -3,10 +4,14 @@ namespace NHibernate.Impl { - internal class DelayedEnumerator<T> : IEnumerable<T> + internal class DelayedEnumerator<T> : IEnumerable<T>, IDelayedValue { public delegate IEnumerable<T> GetResult(); private readonly GetResult result; + + public Delegate ExecuteOnEval { get; set;} + + public DelayedEnumerator(GetResult result) { @@ -18,7 +23,10 @@ { get { - foreach (T item in result()) + var value = result(); + if(ExecuteOnEval != null) + value = (IEnumerable<T>)ExecuteOnEval.DynamicInvoke(value); + foreach (T item in value) { yield return item; } @@ -39,4 +47,9 @@ #endregion } + + internal interface IDelayedValue + { + Delegate ExecuteOnEval { get; set; } + } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs 2010-10-07 13:48:36 UTC (rev 5236) +++ trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs 2010-10-07 16:30:45 UTC (rev 5237) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; @@ -3,5 +4,5 @@ namespace NHibernate.Impl { - internal class FutureValue<T> : IFutureValue<T> + internal class FutureValue<T> : IFutureValue<T>, IDelayedValue { public delegate IEnumerable<T> GetResult(); @@ -23,11 +24,24 @@ if (!enumerator.MoveNext()) { - return default(T); - } + var defVal = default(T); + if (ExecuteOnEval != null) + defVal = (T)ExecuteOnEval.DynamicInvoke(defVal); + return defVal; + } - return enumerator.Current; + var val = enumerator.Current; + + if (ExecuteOnEval != null) + val = (T)ExecuteOnEval.DynamicInvoke(val); + + return val; } } + + public Delegate ExecuteOnEval + { + get; set; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs 2010-10-07 13:48:36 UTC (rev 5236) +++ trunk/nhibernate/src/NHibernate/Linq/LinqExtensionMethods.cs 2010-10-07 16:30:45 UTC (rev 5237) @@ -1,5 +1,8 @@ +using System; +using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using NHibernate.Impl; namespace NHibernate.Linq { @@ -36,5 +39,30 @@ return new NhQueryable<T>(query.Provider, callExpression); } + + public static IEnumerable<T> ToFuture<T>(this IEnumerable<T> query) + { + var nhQueryable = query as NhQueryable<T>; + if (nhQueryable == null) + throw new NotSupportedException("You can also use the AsFuture() method on NhQueryable"); + + + var future = ((NhQueryProvider)nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression); + return (IEnumerable<T>)future; + } + + public static IFutureValue<T> ToFutureValue<T>(this IEnumerable<T> query) + { + var nhQueryable = query as NhQueryable<T>; + if (nhQueryable == null) + throw new NotSupportedException("You can also use the AsFuture() method on NhQueryable"); + + var future = ((NhQueryProvider)nhQueryable.Provider).ExecuteFuture(nhQueryable.Expression); + if(future is DelayedEnumerator<T>) + { + return new FutureValue<T>(() => ((IEnumerable<T>) future)); + } + return (IFutureValue<T>)future; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs 2010-10-07 13:48:36 UTC (rev 5236) +++ trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs 2010-10-07 16:30:45 UTC (rev 5237) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -19,38 +20,84 @@ public object Execute(Expression expression) { - var nhLinqExpression = new NhLinqExpression(expression); + IQuery query; + NhLinqExpression nhQuery; + NhLinqExpression nhLinqExpression = PrepareQuery(expression, out query, out nhQuery); + + return ExecuteQuery(nhLinqExpression, query, nhQuery); + } - var query = _session.CreateQuery(nhLinqExpression); + public object ExecuteFuture(Expression expression) + { + IQuery query; + NhLinqExpression nhQuery; + NhLinqExpression nhLinqExpression = PrepareQuery(expression, out query, out nhQuery); + return ExecuteFutureQuery(nhLinqExpression, query, nhQuery); + } - var nhQuery = query.As<ExpressionQueryImpl>().QueryExpression.As<NhLinqExpression>(); + private NhLinqExpression PrepareQuery(Expression expression, out IQuery query, out NhLinqExpression nhQuery) + { + var nhLinqExpression = new NhLinqExpression(expression); - SetParameters(query, nhLinqExpression.ParameterValuesByName); - SetResultTransformerAndAdditionalCriteria(query, nhQuery, nhLinqExpression.ParameterValuesByName); + query = _session.CreateQuery(nhLinqExpression); - var results = query.List(); + nhQuery = query.As<ExpressionQueryImpl>().QueryExpression.As<NhLinqExpression>(); - if (nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer != null) + SetParameters(query, nhLinqExpression.ParameterValuesByName); + SetResultTransformerAndAdditionalCriteria(query, nhQuery, nhLinqExpression.ParameterValuesByName); + return nhLinqExpression; + } + + private object ExecuteFutureQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) + { + MethodInfo method; + if (nhLinqExpression.ReturnType == NhLinqExpressionReturnType.Sequence) + { + method = typeof (IQuery).GetMethod("Future").MakeGenericMethod(nhQuery.Type); + } + else { - try - { - return nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer.DynamicInvoke(results.AsQueryable()); - } - catch (TargetInvocationException e) - { - throw e.InnerException; - } + method = typeof(IQuery).GetMethod("FutureValue").MakeGenericMethod(nhQuery.Type); } - if (nhLinqExpression.ReturnType == NhLinqExpressionReturnType.Sequence) - { - return results.AsQueryable(); - } + var result = method.Invoke(query, new object[0]); - return results[0]; - } - public TResult Execute<TResult>(Expression expression) + + if (nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer != null) + { + ((IDelayedValue) result).ExecuteOnEval = nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer; + } + + return result; + + } + + private object ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) + { + var results = query.List(); + + if (nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer != null) + { + try + { + return nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer.DynamicInvoke(results.AsQueryable()); + } + catch (TargetInvocationException e) + { + throw e.InnerException; + } + } + + if (nhLinqExpression.ReturnType == NhLinqExpressionReturnType.Sequence) + { + return results.AsQueryable(); + } + + return results[0]; + } + + public TResult Execute<TResult>(Expression expression) { return (TResult) Execute(expression); } Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs 2010-10-07 13:48:36 UTC (rev 5236) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs 2010-10-07 16:30:45 UTC (rev 5237) @@ -80,8 +80,8 @@ ResultOperatorMap.Add<FetchManyRequest, ProcessFetchMany>(); ResultOperatorMap.Add<CacheableResultOperator, ProcessCacheable>(); ResultOperatorMap.Add<OfTypeResultOperator, ProcessOfType>(); - ResultOperatorMap.Add<CastResultOperator, ProcessCast>(); - } + ResultOperatorMap.Add<CastResultOperator, ProcessCast>(); + } private QueryModelVisitor(VisitorParameters visitorParameters, bool root, QueryModel queryModel) { Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs 2010-10-07 16:30:45 UTC (rev 5237) @@ -0,0 +1,164 @@ +using NHibernate.Impl; +using NUnit.Framework; +using NHibernate.Linq; +using System.Linq; + +namespace NHibernate.Test.NHSpecificTest.Futures +{ + using System.Collections; + + [TestFixture] + public class LinqFutureFixture : FutureFixture + { + + [Test] + public void CoalesceShouldWorkForFutures() + { + int personId; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + var p1 = new Person { Name = "inserted name" }; + var p2 = new Person { Name = null }; + + s.Save(p1); + s.Save(p2); + personId = p2.Id; + tx.Commit(); + } + + using (ISession s = OpenSession()) + using (s.BeginTransaction()) + { + var person = s.Query<Person>().Where(p => (p.Name ?? "e") == "e").ToFutureValue(); + Assert.AreEqual(personId, person.Value.Id); + } + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from Person"); + tx.Commit(); + } + } + [Test] + public void CanUseFutureQuery() + { + using (var s = sessions.OpenSession()) + { + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); + + var persons10 = s.Query<Person>() + .Take(10) + .ToFuture(); + var persons5 = s.Query<Person>() + .Take(5) + .ToFuture(); + + using (var logSpy = new SqlLogSpy()) + { + foreach (var person in persons5) + { + + } + + foreach (var person in persons10) + { + + } + + var events = logSpy.Appender.GetEvents(); + Assert.AreEqual(1, events.Length); + } + } + } + + [Test] + public void TwoFuturesRunInTwoRoundTrips() + { + using (var s = sessions.OpenSession()) + { + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); + + using (var logSpy = new SqlLogSpy()) + { + var persons10 = s.Query<Person>() + .Take(10) + .ToFuture(); + + foreach (var person in persons10) { } // fire first future round-trip + + var persons5 = s.Query<Person>() + .Take(5) + .ToFuture(); + + foreach (var person in persons5) { } // fire second future round-trip + + var events = logSpy.Appender.GetEvents(); + Assert.AreEqual(2, events.Length); + } + } + } + + [Test] + public void CanCombineSingleFutureValueWithEnumerableFutures() + { + using (var s = sessions.OpenSession()) + { + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); + + var persons = s.Query<Person>() + .Take(10) + .ToFuture(); + + var personCount = s.Query<Person>() + .Select(x=>x.Id) + .ToFutureValue(); + + using (var logSpy = new SqlLogSpy()) + { + long count = personCount.Value; + + foreach (var person in persons) + { + } + + var events = logSpy.Appender.GetEvents(); + Assert.AreEqual(1, events.Length); + } + } + } + + [Test] + public void CanExecuteMultipleQueriesOnSameExpression() + { + using (var s = sessions.OpenSession()) + { + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); + + var meContainer = s.Query<Person>() + .Where(x=>x.Id == 1) + .ToFutureValue(); + + var possiblefriends = s.Query<Person>() + .Where(x => x.Id != 2) + .ToFuture(); + + using (var logSpy = new SqlLogSpy()) + { + var me = meContainer.Value; + + foreach (var person in possiblefriends) + { + } + + var events = logSpy.Appender.GetEvents(); + Assert.AreEqual(1, events.Length); + var wholeLog = logSpy.GetWholeLog(); + Assert.True(wholeLog.Contains("@p0 = 1 [Type: Int32 (0)], @p1 = 2 [Type: Int32 (0)]")); + } + } + + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Mappings.hbm.xml 2010-10-07 13:48:36 UTC (rev 5236) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Mappings.hbm.xml 2010-10-07 16:30:45 UTC (rev 5237) @@ -7,6 +7,7 @@ <id name="Id"> <generator class="native"/> </id> + <property name="Name"/> <many-to-one name="Parent" /> <list name="Children" cascade="all"> <key column="parent_id" /> Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Person.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Person.cs 2010-10-07 13:48:36 UTC (rev 5236) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/Person.cs 2010-10-07 16:30:45 UTC (rev 5237) @@ -9,6 +9,8 @@ private int id; private Person parent; + public virtual string Name { get; set; } + public virtual Person Parent { get { return parent; } Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-07 13:48:36 UTC (rev 5236) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-07 16:30:45 UTC (rev 5237) @@ -456,6 +456,7 @@ <Compile Include="Logging\LoggerProviderTest.cs" /> <Compile Include="NHSpecificTest\EntityNameAndCompositeId\Fixture.cs" /> <Compile Include="NHSpecificTest\EntityNameWithFullName\Fixture.cs" /> + <Compile Include="NHSpecificTest\Futures\LinqFutureFixture.cs" /> <Compile Include="NHSpecificTest\NH1136\Address.cs" /> <Compile Include="NHSpecificTest\NH1136\FeeMatrixType.cs" /> <Compile Include="NHSpecificTest\NH1136\Fixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aye...@us...> - 2010-10-07 20:57:14
|
Revision: 5238 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5238&view=rev Author: ayenderahien Date: 2010-10-07 20:57:08 +0000 (Thu, 07 Oct 2010) Log Message: ----------- Fixing NH2331 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2331/Nh2331Test.cs Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2010-10-07 16:30:45 UTC (rev 5237) +++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2010-10-07 20:57:08 UTC (rev 5238) @@ -520,13 +520,13 @@ return alias; } - public string GetEntityName(ICriteria criteria) - { - ICriteriaInfoProvider result; - if(criteriaInfoMap.TryGetValue(criteria, out result)==false) - throw new ArgumentException("Could not find a matching criteria info provider to: " + criteria); - return result.Name; - } + public string GetEntityName(ICriteria criteria) + { + ICriteriaInfoProvider result; + if (criteriaInfoMap.TryGetValue(criteria, out result) == false) + return null; + return result.Name; + } public string GetColumn(ICriteria criteria, string propertyName) { Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2331/Nh2331Test.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2331/Nh2331Test.cs 2010-10-07 16:30:45 UTC (rev 5237) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2331/Nh2331Test.cs 2010-10-07 20:57:08 UTC (rev 5238) @@ -13,7 +13,7 @@ public double Sum { get; set; } } - [TestFixture, Ignore("Not fixed yet.")] + [TestFixture] public class Nh2331Test : BugTestCase { private Guid person0Id; @@ -106,46 +106,46 @@ { using (ISession session = OpenSession()) { - DetachedCriteria memberGroupCriteria - = DetachedCriteria - .For<MemberGroup>() - .CreateAlias("Members", "m") - .CreateAlias("Forums", "f") - .Add(Restrictions.EqProperty("m.Id", "p.Id")) - .SetProjection(Projections.Property("f.Id")) - ; + DetachedCriteria memberGroupCriteria + = DetachedCriteria + .For<MemberGroup>() + .CreateAlias("Members", "m") + .CreateAlias("Forums", "f") + .Add(Restrictions.EqProperty("m.Id", "p.Id")) + .SetProjection(Projections.Property("f.Id")) + ; - var ids = new List<Guid>(); - ids.Add(person0Id); - ids.Add(person1Id); + var ids = new List<Guid>(); + ids.Add(person0Id); + ids.Add(person1Id); - DetachedCriteria forumCriteria - = DetachedCriteria - .For<Forum>("fff") - .Add(Restrictions.NotEqProperty("Id", "p.Id")) - .Add(Subqueries.PropertyIn("Id", memberGroupCriteria)) - .SetProjection - ( - Projections.Sum("Dollars") - ) - ; + DetachedCriteria forumCriteria + = DetachedCriteria + .For<Forum>("fff") + .Add(Restrictions.NotEqProperty("Id", "p.Id")) + .Add(Subqueries.PropertyIn("Id", memberGroupCriteria)) + .SetProjection + ( + Projections.Sum("Dollars") + ) + ; - DetachedCriteria personCriteria - = DetachedCriteria - .For<Person>("p") - .Add(Restrictions.InG("Id", ids)) - .SetProjection - ( - Projections - .ProjectionList() - .Add(Projections.Property("Name"), "Name") - .Add(Projections.SubQuery(forumCriteria), "Sum") - ) - .SetResultTransformer(Transformers.AliasToBean(typeof (Bar))) - ; + DetachedCriteria personCriteria + = DetachedCriteria + .For<Person>("p") + .Add(Restrictions.InG("Id", ids)) + .SetProjection + ( + Projections + .ProjectionList() + .Add(Projections.Property("Name"), "Name") + .Add(Projections.SubQuery(forumCriteria), "Sum") + ) + .SetResultTransformer(Transformers.AliasToBean(typeof (Bar))) + ; - ICriteria criteria = personCriteria.GetExecutableCriteria(session); - criteria.Executing(c => c.List()).NotThrows(); + ICriteria criteria = personCriteria.GetExecutableCriteria(session); + criteria.Executing(c => c.List()).NotThrows(); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-10-09 11:29:30
|
Revision: 5240 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5240&view=rev Author: fabiomaulo Date: 2010-10-09 11:29:22 +0000 (Sat, 09 Oct 2010) Log Message: ----------- Fix NH-2001 (thanks to Ricardo Stuven) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs trunk/nhibernate/src/NHibernate.Test/Linq/LinqQuerySamples.cs Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2010-10-07 23:56:06 UTC (rev 5239) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2010-10-09 11:29:22 UTC (rev 5240) @@ -239,6 +239,13 @@ var lhs2 = VisitExpression(expression.Left).AsExpression(); var rhs2 = VisitExpression(expression.Right).AsExpression(); + if (expression.Right is ConstantExpression + && expression.Right.Type.IsNullableOrReference() + && ((ConstantExpression)expression.Right).Value == null) + { + return _hqlTreeBuilder.IsNull(lhs2); + } + return _hqlTreeBuilder.BooleanOr( _hqlTreeBuilder.BooleanAnd( _hqlTreeBuilder.IsNull(lhs), @@ -275,6 +282,13 @@ var lhs3 = VisitExpression(expression.Left).AsExpression(); var rhs3 = VisitExpression(expression.Right).AsExpression(); + if (expression.Right is ConstantExpression + && expression.Right.Type.IsNullableOrReference() + && ((ConstantExpression)expression.Right).Value == null) + { + return _hqlTreeBuilder.IsNotNull(lhs2); + } + return _hqlTreeBuilder.BooleanOr( _hqlTreeBuilder.BooleanOr( Modified: trunk/nhibernate/src/NHibernate.Test/Linq/LinqQuerySamples.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Linq/LinqQuerySamples.cs 2010-10-07 23:56:06 UTC (rev 5239) +++ trunk/nhibernate/src/NHibernate.Test/Linq/LinqQuerySamples.cs 2010-10-09 11:29:22 UTC (rev 5240) @@ -1564,6 +1564,48 @@ ObjectDumper.Write(q); } + + [Category("WHERE")] + [Test(Description = "This sample uses WHERE to filter for orders with shipping date equals to null.")] + public void DLinq2B() + { + IQueryable<Order> q = + from o in db.Orders + where o.ShippingDate == null + select o; + + AssertByIds(q, + new[] + { + 11008, 11019, 11039, 11040, 11045, 11051, 11054, + 11058, 11059, 11061, 11062, 11065, 11068, 11070, + 11071, 11072, 11073, 11074, 11075, 11076, 11077 + }, + x => x.OrderId); + } + + [Category("WHERE")] + [Test(Description = "This sample uses WHERE to filter for orders with shipping date not equals to null.")] + public void DLinq2C() + { + var q = + (from o in db.Orders + where o.ShippingDate != null + select o.OrderId).ToArray(); + + + var withNullShippingDate = + new[] + { + 11008, 11019, 11039, 11040, 11045, 11051, 11054, + 11058, 11059, 11061, 11062, 11065, 11068, 11070, + 11071, 11072, 11073, 11074, 11075, 11076, 11077 + }; + + Assert.AreEqual(809, q.Length); + + Assert.That(!q.Any(orderid => withNullShippingDate.Contains(orderid))); + } } public class ParentChildBatch<T, TKey, TSub> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ric...@us...> - 2010-10-10 07:47:23
|
Revision: 5243 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5243&view=rev Author: ricbrown Date: 2010-10-10 07:47:16 +0000 (Sun, 10 Oct 2010) Log Message: ----------- Partial Fix NH-2328 (Linq query on <Any/> fails): Fixed for QueryOver Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Model.cs Modified: trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2010-10-09 12:43:41 UTC (rev 5242) +++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2010-10-10 07:47:16 UTC (rev 5243) @@ -425,7 +425,7 @@ if (expression is TypeBinaryExpression) { TypeBinaryExpression typeBinaryExpression = (TypeBinaryExpression)expression; - return Restrictions.Eq(ClassMember(typeBinaryExpression.Expression), typeBinaryExpression.TypeOperand); + return Restrictions.Eq(ClassMember(typeBinaryExpression.Expression), typeBinaryExpression.TypeOperand.FullName); } throw new Exception("Could not determine member type from " + expression.NodeType + ", " + expression.ToString() + ", " + expression.GetType()); Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2010-10-09 12:43:41 UTC (rev 5242) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2010-10-10 07:47:16 UTC (rev 5243) @@ -210,6 +210,78 @@ } [Test] + public void IsType() + { + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + var father1 = new Person() { Name = "Father 1" }; + var father2 = new CustomPerson() { Name = "Father 2" }; + + var person1 = new Person() { Name = "Person 1", Father = father2 }; + var person2 = new CustomPerson() { Name = "Person 2", Father = father1 }; + + s.Save(father1); + s.Save(father2); + + s.Save(person1); + s.Save(person2); + + t.Commit(); + } + + using (ISession s = OpenSession()) + { + var actual = + s.QueryOver<Person>() + .Where(p => p is CustomPerson) + .And(p => p.Father != null) + .List(); + + Assert.That(actual.Count, Is.EqualTo(1)); + Assert.That(actual[0].Name, Is.EqualTo("Person 2")); + } + + using (ISession s = OpenSession()) + { + var actual = + s.QueryOver<Person>() + .Where(p => p.GetType() == typeof(CustomPerson)) + .And(p => p.Father != null) + .List(); + + Assert.That(actual.Count, Is.EqualTo(1)); + Assert.That(actual[0].Name, Is.EqualTo("Person 2")); + } + + using (ISession s = OpenSession()) + { + Person f = null; + var actual = + s.QueryOver<Person>() + .JoinAlias(p => p.Father, () => f) + .Where(() => f is CustomPerson) + .List(); + + Assert.That(actual.Count, Is.EqualTo(1)); + Assert.That(actual[0].Name, Is.EqualTo("Person 1")); + } + + using (ISession s = OpenSession()) + { + Person f = null; + var actual = + s.QueryOver<Person>() + .JoinAlias(p => p.Father, () => f) + .Where(() => f.GetType() == typeof(CustomPerson)) + .List(); + + Assert.That(actual.Count, Is.EqualTo(1)); + Assert.That(actual[0].Name, Is.EqualTo("Person 1")); + } + } + + [Test] public void SubCriteria() { using (ISession s = OpenSession()) Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Mappings.hbm.xml 2010-10-09 12:43:41 UTC (rev 5242) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Mappings.hbm.xml 2010-10-10 07:47:16 UTC (rev 5243) @@ -7,13 +7,16 @@ <id name="Id"> <generator class="native"/> </id> + <discriminator type="string" /> <property name="Name" /> <property name="Age" /> <property name="Blood" /> + <many-to-one name="Father" class="Person" /> <bag name="Children" inverse="true" cascade="all-delete-orphan"> <key column="Parent" /> <one-to-many class="Child" /> </bag> + <subclass name="CustomPerson" /> </class> <class name="Child"> Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2010-10-09 12:43:41 UTC (rev 5242) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2010-10-10 07:47:16 UTC (rev 5243) @@ -28,7 +28,7 @@ .Add(Restrictions.Lt("Age", 50)) .Add(Restrictions.Le("Age", 49)) .Add(Restrictions.Eq("class", typeof(Person))) - .Add(Restrictions.Eq("class", typeof(Person))); + .Add(Restrictions.Eq("class", typeof(Person).FullName)); IQueryOver<Person> actual = CreateTestQueryOver<Person>() @@ -187,7 +187,7 @@ .Add(Restrictions.Lt("personAlias.Age", 50)) .Add(Restrictions.Le("personAlias.Age", 49)) .Add(Restrictions.Eq("personAlias.class", typeof(Person))) - .Add(Restrictions.Eq("personAlias.class", typeof(Person))); + .Add(Restrictions.Eq("personAlias.class", typeof(Person).FullName)); Person personAlias = null; IQueryOver<Person> actual = Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs 2010-10-10 07:47:16 UTC (rev 5243) @@ -0,0 +1,89 @@ +using System.Linq; +using NHibernate.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2328 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnSetUp() + { + base.OnSetUp(); + + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + var circle = new Circle(); + var square = new Square(); + + s.Save(circle); + s.Save(square); + + s.Save(new ToyBox() { Name = "Box1", Shape = circle }); + s.Save(new ToyBox() { Name = "Box2", Shape = square }); + t.Commit(); + } + } + + protected override void OnTearDown() + { + base.OnTearDown(); + + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + s.CreateQuery("delete from ToyBox").ExecuteUpdate(); + s.CreateQuery("delete from Circle").ExecuteUpdate(); + s.CreateQuery("delete from Square").ExecuteUpdate(); + t.Commit(); + } + } + + [Test] + public void AnyIs_QueryOver() + { + using (ISession s = OpenSession()) + { + var boxes = + s.QueryOver<ToyBox>() + .Where(t => t.Shape is Square) + .List(); + + Assert.That(boxes.Count, Is.EqualTo(1)); + Assert.That(boxes[0].Name, Is.EqualTo("Box2")); + } + } + + [Test] + [Ignore("VisitTypeBinaryExpression generates HQL tree with string constant, but DB has a number")] + public void AnyIs_Linq() + { + using (ISession s = OpenSession()) + { + var boxes = + (from t in s.Query<ToyBox>() + where t.Shape is Square + select t).ToList(); + + Assert.That(boxes.Count, Is.EqualTo(1)); + Assert.That(boxes[0].Name, Is.EqualTo("Box2")); + } + } + + [Test] + [Description("Is this right? - the HQL translation should turn the class-string to an int, not the user?")] + public void AnyIs_HqlRequiresNumberIn() + { + using (ISession s = OpenSession()) + { + var boxes = + s.CreateQuery("from ToyBox t where t.Shape.class = 2") + .List<ToyBox>(); + + Assert.That(boxes.Count, Is.EqualTo(1)); + Assert.That(boxes[0].Name, Is.EqualTo("Box2")); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Mappings.hbm.xml 2010-10-10 07:47:16 UTC (rev 5243) @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2328"> + + <class name="ToyBox"> + <id name="Id"> + <generator class="native"/> + </id> + <property name="Name" /> + <any name="Shape" id-type="int" meta-type="int"> + <meta-value value="1" class="Circle"/> + <meta-value value="2" class="Square"/> + <column name="s_object_id" /> + <column name="object_id" /> + </any> + </class> + + <class name="Square"> + <id name="Id"> + <generator class="native"/> + </id> + </class> + + <class name="Circle"> + <id name="Id"> + <generator class="native"/> + </id> + </class> + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2328/Model.cs 2010-10-10 07:47:16 UTC (rev 5243) @@ -0,0 +1,23 @@ +namespace NHibernate.Test.NHSpecificTest.NH2328 +{ + public class ToyBox + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual IShape Shape { get; set; } + } + + public interface IShape + { + } + + public class Circle : IShape + { + public virtual int Id { get; set; } + } + + public class Square : IShape + { + public virtual int Id { get; set; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-09 12:43:41 UTC (rev 5242) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-10 07:47:16 UTC (rev 5243) @@ -519,6 +519,8 @@ <Compile Include="NHSpecificTest\NH2324\CompositeUserType.cs" /> <Compile Include="NHSpecificTest\NH2324\Entity.cs" /> <Compile Include="NHSpecificTest\NH2324\BulkUpdateWithCustomCompositeType.cs" /> + <Compile Include="NHSpecificTest\NH2328\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2328\Model.cs" /> <Compile Include="NHSpecificTest\NH2331\Forum.cs" /> <Compile Include="NHSpecificTest\NH2331\MemberGroup.cs" /> <Compile Include="NHSpecificTest\NH2331\Nh2331Test.cs" /> @@ -2326,6 +2328,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2328\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2313\Mappings.hbm.xml" /> <EmbeddedResource Include="TypesTest\UriClass.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\EntityNameWithFullName\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-10-12 16:15:22
|
Revision: 5245 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5245&view=rev Author: fabiomaulo Date: 2010-10-12 16:15:16 +0000 (Tue, 12 Oct 2010) Log Message: ----------- Fix NH-2374 (thanks to Remco Ros for the investigation, the test, the port and the patch) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Id/ForeignGenerator.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2374/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2374/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2374/NH2374Fixture.cs Modified: trunk/nhibernate/src/NHibernate/Id/ForeignGenerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Id/ForeignGenerator.cs 2010-10-12 05:41:30 UTC (rev 5244) +++ trunk/nhibernate/src/NHibernate/Id/ForeignGenerator.cs 2010-10-12 16:15:16 UTC (rev 5245) @@ -39,30 +39,41 @@ /// </returns> public object Generate(ISessionImplementor sessionImplementor, object obj) { - ISession session = (ISession)sessionImplementor; + ISession session = (ISession) sessionImplementor; - object associatedObject = sessionImplementor.Factory - .GetClassMetadata(obj.GetType()) - .GetPropertyValue(obj, propertyName, sessionImplementor.EntityMode); + var persister = sessionImplementor.Factory.GetEntityPersister(entityName); + object associatedObject = persister.GetPropertyValue(obj, propertyName, sessionImplementor.EntityMode); if (associatedObject == null) { throw new IdentifierGenerationException("attempted to assign id from null one-to-one property: " + propertyName); } - EntityType type = (EntityType)sessionImplementor.Factory.GetClassMetadata(obj.GetType()).GetPropertyType(propertyName); + EntityType foreignValueSourceType; + IType propertyType = persister.GetPropertyType(propertyName); + if (propertyType.IsEntityType) + { + foreignValueSourceType = (EntityType) propertyType; + } + else + { + // try identifier mapper + foreignValueSourceType = (EntityType) persister.GetPropertyType("_identifierMapper." + propertyName); + } object id; try { - id = ForeignKeys.GetEntityIdentifierIfNotUnsaved(type.GetAssociatedEntityName(), associatedObject, sessionImplementor); + id = ForeignKeys.GetEntityIdentifierIfNotUnsaved( + foreignValueSourceType.GetAssociatedEntityName(), + associatedObject, + sessionImplementor); } catch (TransientObjectException) { - id = session.Save(associatedObject); + id = session.Save(foreignValueSourceType.GetAssociatedEntityName(), associatedObject); } - if (session.Contains(obj)) { //abort the save (the object is already saved by a circular cascade) Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2374/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2374/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2374/Mappings.hbm.xml 2010-10-12 16:15:16 UTC (rev 5245) @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2374"> + <class entity-name="Parent"> + <id name="Id" type="System.Int32"> + <generator class="increment"/> + </id> + <many-to-one name="Child" entity-name="Child" cascade="all-delete-orphan" /> + </class> + <class entity-name="Child"> + <id name="Id" type="System.Int32"> + <generator class="foreign"> + <param name="property">Parent</param> + </generator> + </id> + <one-to-one name="Parent" entity-name="Parent" /> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2374/NH2374Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2374/NH2374Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2374/NH2374Fixture.cs 2010-10-12 16:15:16 UTC (rev 5245) @@ -0,0 +1,90 @@ +using System.Collections; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2374 +{ + [TestFixture] + public class NH2374Fixture : BugTestCase + { + [Test] + public void OneToOne_with_EntityMode_Map() + { + int id; + + using (ISession sroot = OpenSession()) + { + using (ISession s = sroot.GetSession(EntityMode.Map)) + { + using (ITransaction t = s.BeginTransaction()) + { + var parent = new Hashtable(); + var child = new Hashtable + { + {"Parent", parent} + }; + + parent["Child"] = child; + + id = (int) s.Save("Parent", parent); + s.Flush(); + + t.Commit(); + } + } + } + + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var p = s.Get("Parent", id) as IDictionary; + + Assert.That(p["Child"], Is.Not.Null); + + s.Delete("Parent", p); + + t.Commit(); + } + } + } + + [Test] + public void OneToOne_with_EntityMode_Poco() + { + int id; + + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var parent = new Hashtable(); + var child = new Hashtable + { + {"Parent", parent} + }; + + parent["Child"] = child; + + id = (int) s.Save("Parent", parent); + s.Flush(); + + t.Commit(); + } + } + + using (ISession s = OpenSession()) + { + using (ITransaction t = s.BeginTransaction()) + { + var p = s.Get("Parent", id) as IDictionary; + + Assert.That(p["Child"], Is.Not.Null); + + s.Delete("Parent", p); + + t.Commit(); + } + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-12 05:41:30 UTC (rev 5244) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-12 16:15:16 UTC (rev 5245) @@ -528,6 +528,7 @@ <Compile Include="NHSpecificTest\NH2344\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2344\Model.cs" /> <Compile Include="NHSpecificTest\NH2361\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2374\NH2374Fixture.cs" /> <Compile Include="PolymorphicGetAndLoad\Domain.cs" /> <Compile Include="PolymorphicGetAndLoad\PolymorphicGetAndLoadTest.cs" /> <Compile Include="TypesTest\CharClass.cs" /> @@ -2328,6 +2329,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2374\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2328\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2313\Mappings.hbm.xml" /> <EmbeddedResource Include="TypesTest\UriClass.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2010-10-12 17:25:38
|
Revision: 5246 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5246&view=rev Author: fabiomaulo Date: 2010-10-12 17:25:31 +0000 (Tue, 12 Oct 2010) Log Message: ----------- Apply NH-2342 XDocument support and System.Xml.Linq reference :(( Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/NHibernateUtil.cs trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Type/XDocType.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocTypeFixture.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-10-12 16:15:16 UTC (rev 5245) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-10-12 17:25:31 UTC (rev 5246) @@ -67,6 +67,9 @@ <HintPath>..\..\lib\net\3.5\Remotion.Data.Linq.dll</HintPath> </Reference> <Reference Include="System.Configuration" /> + <Reference Include="System.Xml.Linq"> + <RequiredTargetFramework>3.5</RequiredTargetFramework> + </Reference> </ItemGroup> <ItemGroup> <Compile Include="ADOException.cs" /> @@ -861,6 +864,7 @@ <Compile Include="Type\LocalDateTimeType.cs" /> <Compile Include="Type\UriType.cs" /> <Compile Include="Type\UtcDateTimeType.cs" /> + <Compile Include="Type\XDocType.cs" /> <Compile Include="Type\XmlDocType.cs" /> <Compile Include="Util\ExpressionsHelper.cs" /> <Compile Include="Util\NullableDictionary.cs" /> Modified: trunk/nhibernate/src/NHibernate/NHibernateUtil.cs =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2010-10-12 16:15:16 UTC (rev 5245) +++ trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2010-10-12 17:25:31 UTC (rev 5246) @@ -283,6 +283,8 @@ public static readonly NullableType XmlDoc = new XmlDocType(); + public static readonly NullableType XDoc = new XDocType(); + public static readonly NullableType Uri = new UriType(); /// <summary> Modified: trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2010-10-12 16:15:16 UTC (rev 5245) +++ trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2010-10-12 17:25:31 UTC (rev 5246) @@ -4,6 +4,7 @@ using System.Globalization; using System.Reflection; using System.Xml; +using System.Xml.Linq; using NHibernate.Bytecode; using NHibernate.Classic; using NHibernate.Engine; @@ -211,6 +212,8 @@ RegisterType(typeof (Uri), NHibernateUtil.Uri, new[] {"uri", "url"}); + RegisterType(typeof(XDocument), NHibernateUtil.XDoc, new[] { "xdoc", "xdocument" }); + // object needs to have both class and serializable setup before it can // be created. RegisterType(typeof (Object), NHibernateUtil.Object, new[] {"object"}); Added: trunk/nhibernate/src/NHibernate/Type/XDocType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/XDocType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/XDocType.cs 2010-10-12 17:25:31 UTC (rev 5246) @@ -0,0 +1,85 @@ +using System; +using System.Data; +using System.Xml.Linq; +using NHibernate.SqlTypes; + +namespace NHibernate.Type +{ + [Serializable] + public class XDocType : MutableType + { + public XDocType() + : base(new XmlSqlType()) + { + } + + public XDocType(SqlType sqlType) + : base(sqlType) + { + } + + public override string Name + { + get { return "XDoc"; } + } + + public override System.Type ReturnedClass + { + get { return typeof (XDocument); } + } + + public override void Set(IDbCommand cmd, object value, int index) + { + ((IDataParameter) cmd.Parameters[index]).Value = ((XDocument) value).ToString(SaveOptions.DisableFormatting); + } + + public override object Get(IDataReader rs, int index) + { + // according to documentation, GetValue should return a string, at list for MsSQL + // hopefully all DataProvider has the same behaviour + string xmlString = Convert.ToString(rs.GetValue(index)); + return FromStringValue(xmlString); + } + + public override object Get(IDataReader rs, string name) + { + return Get(rs, rs.GetOrdinal(name)); + } + + public override string ToString(object val) + { + return val == null ? null : val.ToString(); + } + + public override object FromStringValue(string xml) + { + if (xml != null) + { + return XDocument.Parse(xml); + } + + return null; + } + + public override object DeepCopyNotNull(object value) + { + var original = (XDocument) value; + var copy = new XDocument(original); + return copy; + } + + public override bool IsEqual(object x, object y) + { + if (x == null && y == null) + { + return true; + } + if (x == null || y == null) + { + return false; + } + + return XNode.DeepEquals((XDocument) x, (XDocument) y); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-12 16:15:16 UTC (rev 5245) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-12 17:25:31 UTC (rev 5246) @@ -80,6 +80,9 @@ </Reference> <Reference Include="System.Transactions" /> <Reference Include="System.Xml" /> + <Reference Include="System.Xml.Linq"> + <RequiredTargetFramework>3.5</RequiredTargetFramework> + </Reference> </ItemGroup> <ItemGroup> <Compile Include="Ado\AlmostSimple.cs" /> @@ -538,6 +541,8 @@ <Compile Include="TypesTest\UriClass.cs" /> <Compile Include="TypesTest\UriTypeFixture.cs" /> <Compile Include="TypesTest\UtcDateTimeTypeFixture.cs" /> + <Compile Include="TypesTest\XDocClass.cs" /> + <Compile Include="TypesTest\XDocTypeFixture.cs" /> <Compile Include="TypesTest\XmlDocClass.cs" /> <Compile Include="TypesTest\XmlDocTypeFixture.cs" /> <Compile Include="UtilityTest\ReflectionHelperIsMethodOfTests.cs" /> @@ -2329,6 +2334,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="TypesTest\XDocClass.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2374\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2328\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2313\Mappings.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.cs 2010-10-12 17:25:31 UTC (rev 5246) @@ -0,0 +1,11 @@ +using System.Xml.Linq; + +namespace NHibernate.Test.TypesTest +{ + public class XDocClass + { + public int Id { get; set; } + public XDocument Document { get; set; } + public XDocument AutoDocument { get; set; } + } +} Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.hbm.xml 2010-10-12 17:25:31 UTC (rev 5246) @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> + <class name="NHibernate.Test.TypesTest.XDocClass, NHibernate.Test" table="nh_xdoc"> + <id name="Id" column="id"> + <generator class="assigned" /> + </id> + + <property name="Document" type="XDoc" /> + <property name="AutoDocument" /> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocTypeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocTypeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocTypeFixture.cs 2010-10-12 17:25:31 UTC (rev 5246) @@ -0,0 +1,76 @@ +using System.Xml.Linq; +using NHibernate.Type; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.TypesTest +{ + [TestFixture] + public class XDocTypeFixture : TypeFixtureBase + { + protected override string TypeName + { + get { return "XDoc"; } + } + + [Test] + public void ReadWrite() + { + using (var s = OpenSession()) + { + var docEntity = new XDocClass {Id = 1 }; + docEntity.Document = XDocument.Parse("<MyNode>my Text</MyNode>"); + s.Save(docEntity); + s.Flush(); + } + + using (var s = OpenSession()) + { + var docEntity = s.Get<XDocClass>(1); + var document = docEntity.Document; + document.Should().Not.Be.Null(); + document.Document.Root.ToString(SaveOptions.DisableFormatting).Should().Contain("<MyNode>my Text</MyNode>"); + var xmlElement = new XElement("Pizza", new XAttribute("temp", "calda")); + document.Document.Root.Add(xmlElement); + s.Save(docEntity); + s.Flush(); + } + using (var s = OpenSession()) + { + var docEntity = s.Get<XDocClass>(1); + var document = docEntity.Document; + document.Document.Root.ToString(SaveOptions.DisableFormatting).Should().Contain("Pizza temp=\"calda\""); + s.Delete(docEntity); + s.Flush(); + } + } + + [Test] + public void InsertNullValue() + { + using (ISession s = OpenSession()) + { + var docEntity = new XDocClass { Id = 1 }; + docEntity.Document = null; + s.Save(docEntity); + s.Flush(); + } + + using (ISession s = OpenSession()) + { + var docEntity = s.Get<XDocClass>(1); + docEntity.Document.Should().Be.Null(); + s.Delete(docEntity); + s.Flush(); + } + } + + [Test] + public void AutoDiscoverFromNetType() + { + // integration test to be 100% sure + var propertyType = sessions.GetEntityPersister(typeof (XDocClass).FullName).GetPropertyType("AutoDocument"); + propertyType.Should().Be.InstanceOf<XDocType>(); + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |