|
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 ...
[truncated message content] |
|
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
===================================================================
--- trun...
[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.
|