#19855: Fixing Random sort for database other than Sql Server

Work Item: 19855

--HG--
branch : 1.x
This commit is contained in:
Sebastien Ros
2013-07-07 19:22:29 -07:00
parent 9093e77b15
commit af71604f8c
11 changed files with 103 additions and 4 deletions

View File

@@ -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<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object);
builder.RegisterInstance(new Mock<IContentDisplay>().Object);
builder.RegisterInstance(new ShellSettings { Name = ShellSettings.DefaultName, DataProvider = "SqlCe" });
builder.RegisterType<AlphaPartHandler>().As<IContentHandler>();
builder.RegisterType<BetaPartHandler>().As<IContentHandler>();

View File

@@ -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<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterInstance(_contentDefinitionManager.Object);
builder.RegisterInstance(new Mock<IContentDisplay>().Object);
builder.RegisterInstance(new ShellSettings {Name = ShellSettings.DefaultName, DataProvider = "SqlCe"});
builder.RegisterType<AlphaPartHandler>().As<IContentHandler>();
builder.RegisterType<BetaPartHandler>().As<IContentHandler>();

View File

@@ -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<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object);
builder.RegisterInstance(new Mock<IContentDisplay>().Object);
builder.RegisterInstance(new ShellSettings { Name = ShellSettings.DefaultName, DataProvider = "SqlCe" });
builder.RegisterType<AlphaPartHandler>().As<IContentHandler>();
builder.RegisterType<BetaPartHandler>().As<IContentHandler>();

View File

@@ -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<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object);
builder.RegisterInstance(new Mock<IContentDisplay>().Object);
builder.RegisterInstance(new ShellSettings { Name = ShellSettings.DefaultName, DataProvider = "SqlCe" });
builder.RegisterType<SqlCeStatementProvider>().As<ISqlStatementProvider>();
builder.RegisterType<MySqlStatementProvider>().As<ISqlStatementProvider>();
builder.RegisterType<AlphaPartHandler>().As<IContentHandler>();
builder.RegisterType<BetaPartHandler>().As<IContentHandler>();

View File

@@ -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<ISessionLocator> _sessionLocator;
private readonly Lazy<IEnumerable<IContentHandler>> _handlers;
private readonly Lazy<IEnumerable<IIdentityResolverSelector>> _identityResolverSelectors;
private readonly Lazy<IEnumerable<ISqlStatementProvider>> _sqlStatementProviders;
private readonly ShellSettings _shellSettings;
private readonly ISignals _signals;
private const string Published = "Published";
@@ -51,6 +55,8 @@ namespace Orchard.ContentManagement {
Lazy<ISessionLocator> sessionLocator,
Lazy<IEnumerable<IContentHandler>> handlers,
Lazy<IEnumerable<IIdentityResolverSelector>> identityResolverSelectors,
Lazy<IEnumerable<ISqlStatementProvider>> 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.

View File

@@ -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<ISqlStatementProvider> _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<ISqlStatementProvider> 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);

View File

@@ -0,0 +1,6 @@
namespace Orchard.Data.Providers {
public interface ISqlStatementProvider : ISingletonDependency {
string DataProvider { get; }
string GetStatement(string command);
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -178,6 +178,10 @@
<Compile Include="Data\Bags\SArray.cs" />
<Compile Include="Data\FetchRequest.cs" />
<Compile Include="Data\Migration\Interpreters\MySqlCommandInterpreter.cs" />
<Compile Include="Data\Providers\MySqlStatementProvider.cs" />
<Compile Include="Data\Providers\SqlCeStatementProvider.cs" />
<Compile Include="Data\Providers\ISqlStatementProvider.cs" />
<Compile Include="Data\Providers\SqlServerStatementProvider.cs" />
<Compile Include="DisplayManagement\Arguments.cs" />
<Compile Include="Data\Bags\SConvert.cs" />
<Compile Include="Data\Bags\Serialization\IBagSerializer.cs" />