From f30427e9596b6c2701ab2544e56ae08142d9f8d7 Mon Sep 17 00:00:00 2001 From: Onur Gumus Date: Thu, 11 Apr 2013 12:56:21 +0300 Subject: [PATCH 1/3] fixes NH-2285 --- src/NHibernate.Test/Linq/QueryLock.cs | 46 +++++++++++++ src/NHibernate.Test/NHibernate.Test.csproj | 1 + .../GroupBy/AggregatingGroupByRewriter.cs | 1 + src/NHibernate/Linq/LinqExtensionMethods.cs | 29 +++++--- src/NHibernate/Linq/NhRelinqQueryParser.cs | 69 ++++++++++++++++++- .../QueryReferenceExpressionFlattener.cs | 3 +- .../Linq/Visitors/QueryModelVisitor.cs | 1 + src/NHibernate/NHibernate.csproj | 1 + 8 files changed, 137 insertions(+), 14 deletions(-) create mode 100644 src/NHibernate.Test/Linq/QueryLock.cs diff --git a/src/NHibernate.Test/Linq/QueryLock.cs b/src/NHibernate.Test/Linq/QueryLock.cs new file mode 100644 index 00000000000..cb9308da0d2 --- /dev/null +++ b/src/NHibernate.Test/Linq/QueryLock.cs @@ -0,0 +1,46 @@ +using System.Linq; +using NHibernate.AdoNet; +using NHibernate.Cfg; +using NHibernate.Engine; +using NHibernate.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.Linq +{ + public class QueryLock : LinqTestCase + { + + [Test] + public void CanSetLockLinqQueries() + { + var result = (from e in db.Customers + where e.CompanyName == "Corp" + select e).SetLockMode(LockMode.Upgrade).ToList(); + + } + + + [Test] + public void CanSetLockOnLinqPagingQuery() + { + var result = (from e in db.Customers + where e.CompanyName == "Corp" + select e).Skip(5).Take(5).SetLockMode(LockMode.Upgrade).ToList(); + } + + + [Test] + public void CanLockBeforeSkipOnLinqOrderedPageQuery() + { + var result = (from e in db.Customers + orderby e.CompanyName + select e) + .SetLockMode(LockMode.Upgrade).Skip(5).Take(5).ToList(); + + + } + + + } + +} diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj index e69c0f4b8b2..79a8320c9f0 100644 --- a/src/NHibernate.Test/NHibernate.Test.csproj +++ b/src/NHibernate.Test/NHibernate.Test.csproj @@ -513,6 +513,7 @@ + diff --git a/src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs b/src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs index e7b3acd7654..8fec9d2c3f3 100644 --- a/src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs +++ b/src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs @@ -38,6 +38,7 @@ public static class AggregatingGroupByRewriter typeof (AnyResultOperator), typeof (AllResultOperator), typeof (TimeoutResultOperator), + typeof (LockResultOperator), }; public static void ReWrite(QueryModel queryModel) diff --git a/src/NHibernate/Linq/LinqExtensionMethods.cs b/src/NHibernate/Linq/LinqExtensionMethods.cs index c8b9acb2c0b..fe546d764f7 100755 --- a/src/NHibernate/Linq/LinqExtensionMethods.cs +++ b/src/NHibernate/Linq/LinqExtensionMethods.cs @@ -22,7 +22,7 @@ public static IQueryable Query(this IStatelessSession session) public static IQueryable Cacheable(this IQueryable query) { - var method = ReflectionHelper.GetMethodDefinition(() => Cacheable(null)).MakeGenericMethod(typeof (T)); + var method = ReflectionHelper.GetMethodDefinition(() => Cacheable(null)).MakeGenericMethod(typeof(T)); var callExpression = Expression.Call(method, query.Expression); @@ -31,7 +31,7 @@ public static IQueryable Cacheable(this IQueryable query) public static IQueryable CacheMode(this IQueryable query, CacheMode cacheMode) { - var method = ReflectionHelper.GetMethodDefinition(() => CacheMode(null, NHibernate.CacheMode.Normal)).MakeGenericMethod(typeof (T)); + var method = ReflectionHelper.GetMethodDefinition(() => CacheMode(null, NHibernate.CacheMode.Normal)).MakeGenericMethod(typeof(T)); var callExpression = Expression.Call(method, query.Expression, Expression.Constant(cacheMode)); @@ -40,7 +40,7 @@ public static IQueryable CacheMode(this IQueryable query, CacheMode cac public static IQueryable CacheRegion(this IQueryable query, string region) { - var method = ReflectionHelper.GetMethodDefinition(() => CacheRegion(null, null)).MakeGenericMethod(typeof (T)); + var method = ReflectionHelper.GetMethodDefinition(() => CacheRegion(null, null)).MakeGenericMethod(typeof(T)); var callExpression = Expression.Call(method, query.Expression, Expression.Constant(region)); @@ -57,15 +57,24 @@ public static IQueryable Timeout(this IQueryable query, int timeout) return new NhQueryable(query.Provider, callExpression); } + public static IQueryable SetLockMode(this IQueryable query, LockMode lockMode) + { + var method = ReflectionHelper.GetMethodDefinition(() => SetLockMode(null, LockMode.Read)).MakeGenericMethod(typeof(T)); + + var callExpression = Expression.Call(method, query.Expression, Expression.Constant(lockMode)); + + return new NhQueryable(query.Provider, callExpression); + } + public static IEnumerable ToFuture(this IQueryable query) { var nhQueryable = query as QueryableBase; if (nhQueryable == null) throw new NotSupportedException("Query needs to be of type QueryableBase"); - var provider = (INhQueryProvider) nhQueryable.Provider; + var provider = (INhQueryProvider)nhQueryable.Provider; var future = provider.ExecuteFuture(nhQueryable.Expression); - return (IEnumerable) future; + return (IEnumerable)future; } public static IFutureValue ToFutureValue(this IQueryable query) @@ -74,14 +83,14 @@ public static IFutureValue ToFutureValue(this IQueryable query) if (nhQueryable == null) throw new NotSupportedException("Query needs to be of type QueryableBase"); - var provider = (INhQueryProvider) nhQueryable.Provider; + var provider = (INhQueryProvider)nhQueryable.Provider; var future = provider.ExecuteFuture(nhQueryable.Expression); if (future is IEnumerable) { - return new FutureValue(() => ((IEnumerable) future)); + return new FutureValue(() => ((IEnumerable)future)); } - return (IFutureValue) future; + return (IFutureValue)future; } public static IFutureValue ToFutureValue(this IQueryable query, Expression, TResult>> selector) @@ -90,13 +99,13 @@ public static IFutureValue ToFutureValue(this IQueryable if (nhQueryable == null) throw new NotSupportedException("Query needs to be of type QueryableBase"); - var provider = (INhQueryProvider) query.Provider; + var provider = (INhQueryProvider)query.Provider; var expression = ReplacingExpressionTreeVisitor.Replace(selector.Parameters.Single(), query.Expression, selector.Body); - return (IFutureValue) provider.ExecuteFuture(expression); + return (IFutureValue)provider.ExecuteFuture(expression); } } } diff --git a/src/NHibernate/Linq/NhRelinqQueryParser.cs b/src/NHibernate/Linq/NhRelinqQueryParser.cs index 4ef1f85ac29..35f44d9e38e 100644 --- a/src/NHibernate/Linq/NhRelinqQueryParser.cs +++ b/src/NHibernate/Linq/NhRelinqQueryParser.cs @@ -75,9 +75,15 @@ public NHibernateNodeTypeProvider() new[] { ReflectionHelper.GetMethodDefinition(() => LinqExtensionMethods.Timeout(null, 0)), - }, typeof (TimeoutExpressionNode) + }, typeof(TimeoutExpressionNode) ); + methodInfoRegistry.Register( + new[] + { + ReflectionHelper.GetMethodDefinition(() => LinqExtensionMethods.SetLockMode(null, LockMode.Read)), + }, typeof(LockExpressionNode) + ); var nodeTypeProvider = ExpressionTreeParser.CreateDefaultNodeTypeProvider(); nodeTypeProvider.InnerProviders.Add(methodInfoRegistry); defaultNodeTypeProvider = nodeTypeProvider; @@ -100,7 +106,8 @@ public System.Type GetNodeType(MethodInfo method) public class AsQueryableExpressionNode : MethodCallExpressionNodeBase { - public AsQueryableExpressionNode(MethodCallExpressionParseInfo parseInfo) : base(parseInfo) + public AsQueryableExpressionNode(MethodCallExpressionParseInfo parseInfo) + : base(parseInfo) { } @@ -120,7 +127,8 @@ public class CacheableExpressionNode : ResultOperatorExpressionNodeBase private readonly MethodCallExpressionParseInfo _parseInfo; private readonly ConstantExpression _data; - public CacheableExpressionNode(MethodCallExpressionParseInfo parseInfo, ConstantExpression data) : base(parseInfo, null, null) + public CacheableExpressionNode(MethodCallExpressionParseInfo parseInfo, ConstantExpression data) + : base(parseInfo, null, null) { _parseInfo = parseInfo; _data = data; @@ -192,6 +200,29 @@ protected override ResultOperatorBase CreateResultOperator(ClauseGenerationConte } } + internal class LockExpressionNode : ResultOperatorExpressionNodeBase + { + private readonly MethodCallExpressionParseInfo _parseInfo; + private readonly ConstantExpression _lockMode; + + public LockExpressionNode(MethodCallExpressionParseInfo parseInfo, ConstantExpression lockMode) + : base(parseInfo, null, null) + { + _parseInfo = parseInfo; + _lockMode = lockMode; + } + + public override Expression Resolve(ParameterExpression inputParameter, Expression expressionToBeResolved, ClauseGenerationContext clauseGenerationContext) + { + return Source.Resolve(inputParameter, expressionToBeResolved, clauseGenerationContext); + } + + protected override ResultOperatorBase CreateResultOperator(ClauseGenerationContext clauseGenerationContext) + { + return new LockResultOperator(_parseInfo, _lockMode); + } + } + internal class TimeoutResultOperator : ResultOperatorBase { public MethodCallExpressionParseInfo ParseInfo { get; private set; } @@ -222,4 +253,36 @@ public override void TransformExpressions(Func transform { } } + internal class LockResultOperator : ResultOperatorBase + { + public MethodCallExpressionParseInfo ParseInfo { get; private set; } + public ConstantExpression LockMode { get; private set; } + + public LockResultOperator(MethodCallExpressionParseInfo parseInfo, ConstantExpression lockMode) + { + ParseInfo = parseInfo; + LockMode = lockMode; + } + + public override IStreamedData ExecuteInMemory(IStreamedData input) + { + throw new NotImplementedException(); + } + + public override IStreamedDataInfo GetOutputDataInfo(IStreamedDataInfo inputInfo) + { + return inputInfo; + } + + public override ResultOperatorBase Clone(CloneContext cloneContext) + { + throw new NotImplementedException(); + } + + public override void TransformExpressions(Func transformation) + { + } + } + + } \ No newline at end of file diff --git a/src/NHibernate/Linq/ReWriters/QueryReferenceExpressionFlattener.cs b/src/NHibernate/Linq/ReWriters/QueryReferenceExpressionFlattener.cs index 00da7152879..914725100c2 100644 --- a/src/NHibernate/Linq/ReWriters/QueryReferenceExpressionFlattener.cs +++ b/src/NHibernate/Linq/ReWriters/QueryReferenceExpressionFlattener.cs @@ -16,6 +16,7 @@ public class QueryReferenceExpressionFlattener : ExpressionTreeVisitor { typeof(CacheableResultOperator), typeof (TimeoutResultOperator), + typeof (LockResultOperator), }; private QueryReferenceExpressionFlattener(QueryModel model) @@ -33,7 +34,7 @@ protected override Expression VisitSubQueryExpression(SubQueryExpression subQuer { var subQueryModel = subQuery.QueryModel; var hasBodyClauses = subQueryModel.BodyClauses.Count > 0; - if(hasBodyClauses) + if (hasBodyClauses) { return base.VisitSubQueryExpression(subQuery); } diff --git a/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs b/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs index 3457d85b5ab..739a41160f1 100644 --- a/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs +++ b/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs @@ -106,6 +106,7 @@ static QueryModelVisitor() ResultOperatorMap.Add(); ResultOperatorMap.Add(); ResultOperatorMap.Add(); + ResultOperatorMap.Add(); ResultOperatorMap.Add(); ResultOperatorMap.Add(); } diff --git a/src/NHibernate/NHibernate.csproj b/src/NHibernate/NHibernate.csproj index 552e5ce0697..57d00ecb130 100644 --- a/src/NHibernate/NHibernate.csproj +++ b/src/NHibernate/NHibernate.csproj @@ -312,6 +312,7 @@ + From dbb5476dee4fee71758aa67af9b8d928a0690404 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 16 Apr 2013 08:52:45 +0300 Subject: [PATCH 2/3] add lockresult operator --- .../Linq/ReWriters/ResultOperatorRewriter.cs | 1 + .../ResultOperatorProcessors/ProcessLock.cs | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessLock.cs diff --git a/src/NHibernate/Linq/ReWriters/ResultOperatorRewriter.cs b/src/NHibernate/Linq/ReWriters/ResultOperatorRewriter.cs index 553f9ff27e1..30316ff4902 100644 --- a/src/NHibernate/Linq/ReWriters/ResultOperatorRewriter.cs +++ b/src/NHibernate/Linq/ReWriters/ResultOperatorRewriter.cs @@ -67,6 +67,7 @@ private class ResultOperatorExpressionRewriter : ExpressionTreeVisitor typeof(OfTypeResultOperator), typeof(CacheableResultOperator), typeof(TimeoutResultOperator), + typeof (LockResultOperator), typeof(CastResultOperator), // see ProcessCast class }; diff --git a/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessLock.cs b/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessLock.cs new file mode 100644 index 00000000000..deb079e351f --- /dev/null +++ b/src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessLock.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NHibernate.Linq.Visitors.ResultOperatorProcessors +{ + internal class ProcessLock : IResultOperatorProcessor + { + public void Process(LockResultOperator resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree) + { + tree.AddAdditionalCriteria((q, p) => q.SetLockMode(queryModelVisitor.Model.MainFromClause.ItemName, (LockMode)resultOperator.LockMode.Value)); + } + } +} From 4fc6317903768c9ac0ad153741e42059ec73a682 Mon Sep 17 00:00:00 2001 From: Onur Gumus Date: Sat, 17 May 2014 13:51:44 +0300 Subject: [PATCH 3/3] change git ignore --- .gitignore | 13 +++++++++++++ Tools/nant/bin/NDoc.Documenter.NAnt.dll | Bin 131072 -> 0 bytes 2 files changed, 13 insertions(+) delete mode 100644 Tools/nant/bin/NDoc.Documenter.NAnt.dll diff --git a/.gitignore b/.gitignore index 846284a0fd1..9a9926b3127 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,16 @@ current-test-configuration # This will be copied from the build directory to the lib directory in order # to satisfy later build steps. But it should not be committed. NHibernate.dll +src/packages/Antlr4.StringTemplate.4.0.6.9004/Antlr4.StringTemplate.4.0.6.9004.nupkg +src/packages/Iesi.Collections.4.0.1.4000/Iesi.Collections.4.0.1.4000.nupkg +src/packages/Iesi.Collections.4.0.1.4000/lib/net40/Iesi.Collections.xml +src/packages/Remotion.Linq.1.15.9.0/Remotion.Linq.1.15.9.0.nupkg +src/packages/Remotion.Linq.1.15.9.0/lib/net45/Remotion.Linq.xml +src/packages/log4net.2.0.3/lib/net10-full/log4net.xml +src/packages/log4net.2.0.3/lib/net11-full/log4net.xml +src/packages/log4net.2.0.3/lib/net20-full/log4net.xml +src/packages/log4net.2.0.3/lib/net35-client/log4net.xml +src/packages/log4net.2.0.3/lib/net35-full/log4net.xml +src/packages/log4net.2.0.3/lib/net40-client/log4net.xml +src/packages/log4net.2.0.3/lib/net40-full/log4net.xml +src/packages/log4net.2.0.3/log4net.2.0.3.nupkg diff --git a/Tools/nant/bin/NDoc.Documenter.NAnt.dll b/Tools/nant/bin/NDoc.Documenter.NAnt.dll deleted file mode 100644 index d9dcccb470cf30e1a48fbe868600e0120dd207fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131072 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 TfffZ?6lhVPMS&ItTnhaEdh$-!