mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
#19855: Fixing Random sort for database other than Sql Server
Work Item: 19855 --HG-- branch : 1.x
This commit is contained in:
@@ -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>();
|
||||
|
@@ -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>();
|
||||
|
@@ -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>();
|
||||
|
@@ -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>();
|
||||
|
@@ -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.
|
||||
|
@@ -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);
|
||||
|
6
src/Orchard/Data/Providers/ISqlStatementProvider.cs
Normal file
6
src/Orchard/Data/Providers/ISqlStatementProvider.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Orchard.Data.Providers {
|
||||
public interface ISqlStatementProvider : ISingletonDependency {
|
||||
string DataProvider { get; }
|
||||
string GetStatement(string command);
|
||||
}
|
||||
}
|
16
src/Orchard/Data/Providers/MySqlStatementProvider.cs
Normal file
16
src/Orchard/Data/Providers/MySqlStatementProvider.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
16
src/Orchard/Data/Providers/SqlCeStatementProvider.cs
Normal file
16
src/Orchard/Data/Providers/SqlCeStatementProvider.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
16
src/Orchard/Data/Providers/SqlServerStatementProvider.cs
Normal file
16
src/Orchard/Data/Providers/SqlServerStatementProvider.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -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" />
|
||||
|
Reference in New Issue
Block a user