From af71604f8c0cc4a6550d554f45ef1793a684b1d5 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Sun, 7 Jul 2013 19:22:29 -0700 Subject: [PATCH] #19855: Fixing Random sort for database other than Sql Server Work Item: 19855 --HG-- branch : 1.x --- .../ContentManagement/ContentQueryTests.cs | 2 ++ .../DefaultContentManagerTests.cs | 2 ++ .../DynamicContentQueryTests.cs | 2 ++ .../ContentManagement/HqlExpressionTests.cs | 5 ++++ .../DefaultContentManager.cs | 10 ++++++- .../ContentManagement/DefaultHqlQuery.cs | 28 +++++++++++++++++-- .../Data/Providers/ISqlStatementProvider.cs | 6 ++++ .../Data/Providers/MySqlStatementProvider.cs | 16 +++++++++++ .../Data/Providers/SqlCeStatementProvider.cs | 16 +++++++++++ .../Providers/SqlServerStatementProvider.cs | 16 +++++++++++ src/Orchard/Orchard.Framework.csproj | 4 +++ 11 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 src/Orchard/Data/Providers/ISqlStatementProvider.cs create mode 100644 src/Orchard/Data/Providers/MySqlStatementProvider.cs create mode 100644 src/Orchard/Data/Providers/SqlCeStatementProvider.cs create mode 100644 src/Orchard/Data/Providers/SqlServerStatementProvider.cs diff --git a/src/Orchard.Tests/ContentManagement/ContentQueryTests.cs b/src/Orchard.Tests/ContentManagement/ContentQueryTests.cs index 3e9d3ea52..2b4415b10 100644 --- a/src/Orchard.Tests/ContentManagement/ContentQueryTests.cs +++ b/src/Orchard.Tests/ContentManagement/ContentQueryTests.cs @@ -11,6 +11,7 @@ using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.Records; using Orchard.DisplayManagement; using Orchard.DisplayManagement.Descriptors; +using Orchard.Environment.Configuration; using Orchard.Environment.Extensions; using Orchard.Tests.ContentManagement.Handlers; using Orchard.Tests.ContentManagement.Records; @@ -53,6 +54,7 @@ namespace Orchard.Tests.ContentManagement { builder.RegisterType().As(); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); + builder.RegisterInstance(new ShellSettings { Name = ShellSettings.DefaultName, DataProvider = "SqlCe" }); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests/ContentManagement/DefaultContentManagerTests.cs b/src/Orchard.Tests/ContentManagement/DefaultContentManagerTests.cs index dad21d5f5..c37702b9d 100644 --- a/src/Orchard.Tests/ContentManagement/DefaultContentManagerTests.cs +++ b/src/Orchard.Tests/ContentManagement/DefaultContentManagerTests.cs @@ -14,6 +14,7 @@ using Orchard.Data; using Orchard.ContentManagement; using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.Records; +using Orchard.Environment.Configuration; using Orchard.Environment.Extensions; using Orchard.Tests.ContentManagement.Handlers; using Orchard.Tests.ContentManagement.Records; @@ -65,6 +66,7 @@ namespace Orchard.Tests.ContentManagement { builder.RegisterType().As(); builder.RegisterInstance(_contentDefinitionManager.Object); builder.RegisterInstance(new Mock().Object); + builder.RegisterInstance(new ShellSettings {Name = ShellSettings.DefaultName, DataProvider = "SqlCe"}); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests/ContentManagement/DynamicContentQueryTests.cs b/src/Orchard.Tests/ContentManagement/DynamicContentQueryTests.cs index 274c16317..331a83448 100644 --- a/src/Orchard.Tests/ContentManagement/DynamicContentQueryTests.cs +++ b/src/Orchard.Tests/ContentManagement/DynamicContentQueryTests.cs @@ -11,6 +11,7 @@ using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.Records; using Orchard.DisplayManagement; using Orchard.DisplayManagement.Descriptors; +using Orchard.Environment.Configuration; using Orchard.Environment.Extensions; using Orchard.Tests.ContentManagement.Handlers; using Orchard.Tests.ContentManagement.Records; @@ -51,6 +52,7 @@ namespace Orchard.Tests.ContentManagement { builder.RegisterType().As(); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); + builder.RegisterInstance(new ShellSettings { Name = ShellSettings.DefaultName, DataProvider = "SqlCe" }); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests/ContentManagement/HqlExpressionTests.cs b/src/Orchard.Tests/ContentManagement/HqlExpressionTests.cs index 94f9f6fb7..0824817a5 100644 --- a/src/Orchard.Tests/ContentManagement/HqlExpressionTests.cs +++ b/src/Orchard.Tests/ContentManagement/HqlExpressionTests.cs @@ -11,8 +11,10 @@ using Orchard.Data; using Orchard.ContentManagement; using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.Records; +using Orchard.Data.Providers; using Orchard.DisplayManagement; using Orchard.DisplayManagement.Descriptors; +using Orchard.Environment.Configuration; using Orchard.Environment.Extensions; using Orchard.Tests.ContentManagement.Handlers; using Orchard.Tests.ContentManagement.Records; @@ -54,6 +56,9 @@ namespace Orchard.Tests.ContentManagement { builder.RegisterType().As(); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); + builder.RegisterInstance(new ShellSettings { Name = ShellSettings.DefaultName, DataProvider = "SqlCe" }); + builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard/ContentManagement/DefaultContentManager.cs b/src/Orchard/ContentManagement/DefaultContentManager.cs index 869385462..3dee024a6 100644 --- a/src/Orchard/ContentManagement/DefaultContentManager.cs +++ b/src/Orchard/ContentManagement/DefaultContentManager.cs @@ -17,6 +17,8 @@ using Orchard.ContentManagement.MetaData.Builders; using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.Records; using Orchard.Data; +using Orchard.Data.Providers; +using Orchard.Environment.Configuration; using Orchard.Indexing; using Orchard.Logging; using Orchard.UI; @@ -34,6 +36,8 @@ namespace Orchard.ContentManagement { private readonly Lazy _sessionLocator; private readonly Lazy> _handlers; private readonly Lazy> _identityResolverSelectors; + private readonly Lazy> _sqlStatementProviders; + private readonly ShellSettings _shellSettings; private readonly ISignals _signals; private const string Published = "Published"; @@ -51,6 +55,8 @@ namespace Orchard.ContentManagement { Lazy sessionLocator, Lazy> handlers, Lazy> identityResolverSelectors, + Lazy> sqlStatementProviders, + ShellSettings shellSettings, ISignals signals) { _context = context; _contentTypeRepository = contentTypeRepository; @@ -60,6 +66,8 @@ namespace Orchard.ContentManagement { _cacheManager = cacheManager; _contentManagerSession = contentManagerSession; _identityResolverSelectors = identityResolverSelectors; + _sqlStatementProviders = sqlStatementProviders; + _shellSettings = shellSettings; _signals = signals; _handlers = handlers; _contentDisplay = contentDisplay; @@ -627,7 +635,7 @@ namespace Orchard.ContentManagement { } public IHqlQuery HqlQuery() { - return new DefaultHqlQuery(this, _sessionLocator.Value.For(typeof(ContentItemVersionRecord))); + return new DefaultHqlQuery(this, _sessionLocator.Value.For(typeof(ContentItemVersionRecord)), _sqlStatementProviders.Value, _shellSettings); } // Insert or Update imported data into the content manager. diff --git a/src/Orchard/ContentManagement/DefaultHqlQuery.cs b/src/Orchard/ContentManagement/DefaultHqlQuery.cs index a9c2e9651..128e566bd 100644 --- a/src/Orchard/ContentManagement/DefaultHqlQuery.cs +++ b/src/Orchard/ContentManagement/DefaultHqlQuery.cs @@ -7,12 +7,16 @@ using System.Text; using NHibernate; using NHibernate.Transform; using Orchard.ContentManagement.Records; +using Orchard.Data.Providers; +using Orchard.Environment.Configuration; using Orchard.Utility.Extensions; namespace Orchard.ContentManagement { public class DefaultHqlQuery : IHqlQuery { private readonly ISession _session; + private readonly IEnumerable _sqlStatementProviders; + private readonly ShellSettings _shellSettings; private VersionOptions _versionOptions; protected IJoin _from; @@ -22,8 +26,14 @@ namespace Orchard.ContentManagement { public IContentManager ContentManager { get; private set; } - public DefaultHqlQuery(IContentManager contentManager, ISession session) { + public DefaultHqlQuery( + IContentManager contentManager, + ISession session, + IEnumerable sqlStatementProviders, + ShellSettings shellSettings) { _session = session; + _sqlStatementProviders = sqlStatementProviders; + _shellSettings = shellSettings; ContentManager = contentManager; } @@ -253,8 +263,20 @@ namespace Orchard.ContentManagement { sort.Item2(sortFactory); if (sortFactory.Randomize) { - //sb.Append(" newid()"); - sb.Append("newid()"); + + string command = null; + + foreach (var sqlStatementProvider in _sqlStatementProviders) { + if (!String.Equals(sqlStatementProvider.DataProvider, _shellSettings.DataProvider)) { + continue; + } + + command = sqlStatementProvider.GetStatement("random") ?? command; + } + + if (command != null) { + sb.Append(command); + } } else { sb.Append(sort.Item1.Name).Append(".").Append(sortFactory.PropertyName); diff --git a/src/Orchard/Data/Providers/ISqlStatementProvider.cs b/src/Orchard/Data/Providers/ISqlStatementProvider.cs new file mode 100644 index 000000000..1c2d185bc --- /dev/null +++ b/src/Orchard/Data/Providers/ISqlStatementProvider.cs @@ -0,0 +1,6 @@ +namespace Orchard.Data.Providers { + public interface ISqlStatementProvider : ISingletonDependency { + string DataProvider { get; } + string GetStatement(string command); + } +} diff --git a/src/Orchard/Data/Providers/MySqlStatementProvider.cs b/src/Orchard/Data/Providers/MySqlStatementProvider.cs new file mode 100644 index 000000000..1b5fe6c55 --- /dev/null +++ b/src/Orchard/Data/Providers/MySqlStatementProvider.cs @@ -0,0 +1,16 @@ +namespace Orchard.Data.Providers { + public class MySqlStatementProvider : ISqlStatementProvider { + public string DataProvider { + get { return "MySql"; } + } + + public string GetStatement(string command) { + switch (command) { + case "random": + return "rand()"; + } + + return null; + } + } +} diff --git a/src/Orchard/Data/Providers/SqlCeStatementProvider.cs b/src/Orchard/Data/Providers/SqlCeStatementProvider.cs new file mode 100644 index 000000000..e28e3b210 --- /dev/null +++ b/src/Orchard/Data/Providers/SqlCeStatementProvider.cs @@ -0,0 +1,16 @@ +namespace Orchard.Data.Providers { + public class SqlCeStatementProvider : ISqlStatementProvider { + public string DataProvider { + get { return "SqlCe"; } + } + + public string GetStatement(string command) { + switch (command) { + case "random": + return "newid()"; + } + + return null; + } + } +} diff --git a/src/Orchard/Data/Providers/SqlServerStatementProvider.cs b/src/Orchard/Data/Providers/SqlServerStatementProvider.cs new file mode 100644 index 000000000..422a56c0f --- /dev/null +++ b/src/Orchard/Data/Providers/SqlServerStatementProvider.cs @@ -0,0 +1,16 @@ +namespace Orchard.Data.Providers { + public class SqlServerStatementProvider : ISqlStatementProvider { + public string DataProvider { + get { return "SqlServer"; } + } + + public string GetStatement(string command) { + switch (command) { + case "random": + return "newid()"; + } + + return null; + } + } +} diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 399721cf9..ad5d681ce 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -178,6 +178,10 @@ + + + +