Skip to content

Commit 490dcb9

Browse files
committed
Merge branch 'rjperes-NH-2611'
2 parents 1525d95 + 6b1c757 commit 490dcb9

14 files changed

+145
-6
lines changed

src/NHibernate.Test/CfgTest/ConfigurationFixture.cs

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
using System.Xml;
55
using NHibernate.Cfg;
66
using NHibernate.DomainModel;
7+
using NHibernate.Engine;
8+
using NHibernate.Linq;
79
using NHibernate.Tool.hbm2ddl;
810
using NHibernate.Util;
911
using NUnit.Framework;
10-
using Environment=NHibernate.Cfg.Environment;
12+
using Environment = NHibernate.Cfg.Environment;
1113

1214
namespace NHibernate.Test.CfgTest
1315
{
@@ -417,5 +419,52 @@ public void NH1348()
417419
cfg.Configure(xtr);
418420
// No exception expected
419421
}
422+
423+
public class SampleQueryProvider : DefaultQueryProvider
424+
{
425+
public SampleQueryProvider(ISessionImplementor session) : base(session)
426+
{
427+
428+
}
429+
}
430+
431+
[Test]
432+
public void NH2890Standard()
433+
{
434+
var cfg = new Configuration();
435+
cfg.Configure("TestEnbeddedConfig.cfg.xml")
436+
.LinqQueryProvider<SampleQueryProvider>()
437+
.SetDefaultAssembly("NHibernate.DomainModel")
438+
.SetDefaultNamespace("NHibernate.DomainModel");
439+
440+
using (var sessionFactory = cfg.BuildSessionFactory())
441+
{
442+
using (var session = sessionFactory.OpenSession())
443+
{
444+
var query = session.Query<NHibernate.DomainModel.A>();
445+
Assert.IsInstanceOf(typeof(SampleQueryProvider), query.Provider);
446+
}
447+
}
448+
}
449+
450+
[Test]
451+
public void NH2890Xml()
452+
{
453+
var cfg = new Configuration();
454+
cfg.Configure("TestEnbeddedConfig.cfg.xml")
455+
.SetDefaultAssembly("NHibernate.DomainModel")
456+
.SetDefaultNamespace("NHibernate.DomainModel");
457+
458+
using (var sessionFactory = cfg.BuildSessionFactory())
459+
{
460+
using (var session = sessionFactory.OpenSession())
461+
{
462+
var query = session.Query<NHibernate.DomainModel.A>();
463+
Assert.IsInstanceOf(typeof(SampleQueryProvider), query.Provider);
464+
}
465+
}
466+
467+
}
468+
420469
}
421470
}

src/NHibernate.Test/CfgTest/Loquacious/ConfigurationFixture.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using NHibernate.Driver;
99
using NHibernate.Exceptions;
1010
using NHibernate.Hql.Ast.ANTLR;
11+
using NHibernate.Linq;
1112
using NHibernate.Type;
1213
using NUnit.Framework;
1314

@@ -124,5 +125,26 @@ public void UseConnectionStringName()
124125

125126
Assert.That(cfg.Properties[Environment.ConnectionStringName], Is.EqualTo("MyName"));
126127
}
128+
129+
[Test]
130+
public void NH2890Loquacious()
131+
{
132+
var cfg = new Configuration();
133+
cfg.Configure("TestEnbeddedConfig.cfg.xml")
134+
.SetDefaultAssembly("NHibernate.DomainModel")
135+
.SetDefaultNamespace("NHibernate.DomainModel")
136+
.SessionFactory()
137+
.ParsingLinqThrough<NHibernate.Test.CfgTest.ConfigurationFixture.SampleQueryProvider>();
138+
139+
using (var sessionFactory = cfg.BuildSessionFactory())
140+
{
141+
using (var session = sessionFactory.OpenSession())
142+
{
143+
var query = session.Query<NHibernate.DomainModel.A>();
144+
Assert.IsInstanceOf(typeof(NHibernate.Test.CfgTest.ConfigurationFixture.SampleQueryProvider), query.Provider);
145+
}
146+
}
147+
}
148+
127149
}
128150
}

src/NHibernate.Test/TestEnbeddedConfig.cfg.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
<property name="connection.connection_string">Server=localhost;initial catalog=nhibernate;User Id=;Password=</property>
88
<property name="query.substitutions">true 1, false 0, yes 1, no 0</property>
99
<property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>
10+
<property name="query.linq_provider_class">NHibernate.Test.CfgTest.ConfigurationFixture+SampleQueryProvider, NHibernate.Test</property>
1011
</session-factory>
1112
</hibernate-configuration>

src/NHibernate/Cfg/ConfigurationExtensions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using NHibernate.Context;
44
using NHibernate.Engine;
55
using NHibernate.Hql;
6+
using NHibernate.Linq;
67
using NHibernate.Linq.Functions;
78
using NHibernate.Util;
89

@@ -46,6 +47,12 @@ public static Configuration HqlQueryTranslator<TQueryTranslator>(this Configurat
4647
return configuration;
4748
}
4849

50+
public static Configuration LinqQueryProvider<TQueryProvider>(this Configuration configuration) where TQueryProvider : INhQueryProvider
51+
{
52+
configuration.SetProperty(Environment.QueryLinqProvider, typeof(TQueryProvider).AssemblyQualifiedName);
53+
return configuration;
54+
}
55+
4956
public static Configuration LinqToHqlGeneratorsRegistry<TLinqToHqlGeneratorsRegistry>(this Configuration configuration) where TLinqToHqlGeneratorsRegistry : ILinqToHqlGeneratorsRegistry
5057
{
5158
configuration.SetProperty(Environment.LinqToHqlGeneratorsRegistry, typeof(TLinqToHqlGeneratorsRegistry).AssemblyQualifiedName);

src/NHibernate/Cfg/Environment.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ public static string Version
141141
// The classname of the HQL query parser factory
142142
public const string QueryTranslator = "query.factory_class";
143143

144+
// The class name of the LINQ query provider class, implementing from <see cref="INhQueryProvider"/>
145+
public const string QueryLinqProvider = "query.linq_provider_class";
146+
144147
public const string QueryImports = "query.imports";
145148
public const string Hbm2ddlAuto = "hbm2ddl.auto";
146149
public const string Hbm2ddlKeyWords = "hbm2ddl.keywords";

src/NHibernate/Cfg/Loquacious/FluentSessionFactoryConfiguration.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using NHibernate.Bytecode;
22
using NHibernate.Hql;
3+
using NHibernate.Linq;
34

45
namespace NHibernate.Cfg.Loquacious
56
{
@@ -53,6 +54,13 @@ public IFluentSessionFactoryConfiguration ParsingHqlThrough<TQueryTranslator>()
5354
return this;
5455
}
5556

57+
public IFluentSessionFactoryConfiguration ParsingLinqThrough<TQueryProvider>()
58+
where TQueryProvider : INhQueryProvider
59+
{
60+
configuration.SetProperty(Environment.QueryLinqProvider, typeof(TQueryProvider).AssemblyQualifiedName);
61+
return this;
62+
}
63+
5664
public IProxyConfiguration Proxy { get; private set; }
5765
public ICollectionFactoryConfiguration GeneratingCollections { get; private set; }
5866
public IMappingsConfiguration Mapping { get; private set; }

src/NHibernate/Cfg/Loquacious/IFluentSessionFactoryConfiguration.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using NHibernate.Hql;
2+
using NHibernate.Linq;
23
namespace NHibernate.Cfg.Loquacious
34
{
45
public interface IFluentSessionFactoryConfiguration
@@ -26,6 +27,7 @@ public interface IFluentSessionFactoryConfiguration
2627
IFluentSessionFactoryConfiguration GenerateStatistics();
2728
IFluentSessionFactoryConfiguration Using(EntityMode entityMode);
2829
IFluentSessionFactoryConfiguration ParsingHqlThrough<TQueryTranslator>() where TQueryTranslator : IQueryTranslatorFactory;
30+
IFluentSessionFactoryConfiguration ParsingLinqThrough<TQueryProvider>() where TQueryProvider : INhQueryProvider;
2931

3032
IProxyConfiguration Proxy { get; }
3133

src/NHibernate/Cfg/Settings.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ public Settings()
100100

101101
public IQueryTranslatorFactory QueryTranslatorFactory { get; internal set; }
102102

103+
public System.Type LinqQueryProviderType { get; internal set; }
104+
103105
public ISQLExceptionConverter SqlExceptionConverter { get; internal set; }
104106

105107
public bool IsWrapResultSetsEnabled { get; internal set; }

src/NHibernate/Cfg/SettingsFactory.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
using System.Collections;
33
using System.Collections.Generic;
44
using System.Data;
5-
65
using NHibernate.AdoNet;
76
using NHibernate.AdoNet.Util;
87
using NHibernate.Cache;
98
using NHibernate.Connection;
109
using NHibernate.Dialect;
1110
using NHibernate.Exceptions;
1211
using NHibernate.Hql;
12+
using NHibernate.Linq;
1313
using NHibernate.Linq.Functions;
1414
using NHibernate.Linq.Visitors;
1515
using NHibernate.Transaction;
@@ -137,6 +137,8 @@ public Settings BuildSettings(IDictionary<string, string> properties)
137137

138138
settings.QueryTranslatorFactory = CreateQueryTranslatorFactory(properties);
139139

140+
settings.LinqQueryProviderType = CreateLinqQueryProviderType(properties);
141+
140142
IDictionary<string, string> querySubstitutions = PropertiesHelper.ToDictionary(Environment.QuerySubstitutions,
141143
" ,=;:\n\t\r\f", properties);
142144
if (log.IsInfoEnabled)
@@ -365,6 +367,21 @@ private static IQueryTranslatorFactory CreateQueryTranslatorFactory(IDictionary<
365367
}
366368
}
367369

370+
private static System.Type CreateLinqQueryProviderType(IDictionary<string, string> properties)
371+
{
372+
string className = PropertiesHelper.GetString(
373+
Environment.QueryLinqProvider, properties, typeof(DefaultQueryProvider).FullName);
374+
log.Info("Query provider: " + className);
375+
try
376+
{
377+
return System.Type.GetType(className, true);
378+
}
379+
catch (Exception cnfe)
380+
{
381+
throw new HibernateException("could not find query provider class: " + className, cnfe);
382+
}
383+
}
384+
368385
private static ITransactionFactory CreateTransactionFactory(IDictionary<string, string> properties)
369386
{
370387
string className = PropertiesHelper.GetString(

src/NHibernate/Linq/DefaultQueryProvider.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public interface INhQueryProvider : IQueryProvider
1818

1919
public class DefaultQueryProvider : INhQueryProvider
2020
{
21-
private static readonly MethodInfo CreateQueryMethodDefinition = ReflectionHelper.GetMethodDefinition((DefaultQueryProvider p) => p.CreateQuery<object>(null));
21+
private static readonly MethodInfo CreateQueryMethodDefinition = ReflectionHelper.GetMethodDefinition((INhQueryProvider p) => p.CreateQuery<object>(null));
2222

2323
private readonly WeakReference _session;
2424

@@ -66,7 +66,7 @@ public virtual object ExecuteFuture(Expression expression)
6666
return ExecuteFutureQuery(nhLinqExpression, query, nhQuery);
6767
}
6868

69-
protected NhLinqExpression PrepareQuery(Expression expression, out IQuery query, out NhLinqExpression nhQuery)
69+
protected virtual NhLinqExpression PrepareQuery(Expression expression, out IQuery query, out NhLinqExpression nhQuery)
7070
{
7171
var nhLinqExpression = new NhLinqExpression(expression, Session.Factory);
7272

@@ -161,7 +161,7 @@ private static void SetParameters(IQuery query, IDictionary<string, Tuple<object
161161
}
162162
}
163163

164-
public void SetResultTransformerAndAdditionalCriteria(IQuery query, NhLinqExpression nhExpression, IDictionary<string, Tuple<object, IType>> parameters)
164+
public virtual void SetResultTransformerAndAdditionalCriteria(IQuery query, NhLinqExpression nhExpression, IDictionary<string, Tuple<object, IType>> parameters)
165165
{
166166
query.SetResultTransformer(nhExpression.ExpressionToHqlTranslationResults.ResultTransformer);
167167

0 commit comments

Comments
 (0)