diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs index 04278bfe2..61711eda0 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Storage/AliasStorage.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Xml.Linq; using Orchard.Alias.Records; using Orchard.Data; @@ -13,8 +14,9 @@ namespace Orchard.Alias.Implementation.Storage { void Remove(string path); void Remove(string path, string aliasSource); void RemoveBySource(string aliasSource); - IEnumerable, string>> List(); - IEnumerable, string>> List(string sourceStartsWith); + IEnumerable, string, int>> List(Expression> predicate); + IEnumerable, string, int>> List(); + IEnumerable, string, int>> List(string sourceStartsWith); } public class AliasStorage : IAliasStorage { @@ -124,15 +126,25 @@ namespace Orchard.Alias.Implementation.Storage { } } - public IEnumerable, string>> List() { - return _aliasRepository.Table.OrderBy(a => a.Id).Select(ToDictionary).ToList(); + public IEnumerable, string, int>> List() { + return List((Expression>) null); } - public IEnumerable, string>> List(string sourceStartsWith) { - return _aliasRepository.Table.Where(a => a.Source.StartsWith(sourceStartsWith)).OrderBy(a => a.Id).Select(ToDictionary).ToList(); + public IEnumerable, string, int>> List(Expression> predicate) { + var table = _aliasRepository.Table; + + if (predicate != null) { + table = table.Where(predicate); + } + + return table.OrderBy(a => a.Id).Select(ToDictionary).ToList(); } - private static Tuple, string> ToDictionary(AliasRecord aliasRecord) { + public IEnumerable, string, int>> List(string sourceStartsWith) { + return List(a => a.Source.StartsWith(sourceStartsWith)); + } + + private static Tuple, string, int> ToDictionary(AliasRecord aliasRecord) { IDictionary routeValues = new Dictionary(); if (aliasRecord.Action.Area != null) { routeValues.Add("area", aliasRecord.Action.Area); @@ -148,7 +160,7 @@ namespace Orchard.Alias.Implementation.Storage { routeValues.Add(attr.Name.LocalName, attr.Value); } } - return Tuple.Create(aliasRecord.Path, aliasRecord.Action.Area, routeValues, aliasRecord.Source); + return Tuple.Create(aliasRecord.Path, aliasRecord.Action.Area, routeValues, aliasRecord.Source, aliasRecord.Id); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasUpdateCursor.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasUpdateCursor.cs new file mode 100644 index 000000000..c4202d562 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasUpdateCursor.cs @@ -0,0 +1,5 @@ +namespace Orchard.Alias.Implementation.Updater { + public class AliasUpdateCursor : IAliasUpdateCursor { + public int Cursor { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasUpdater.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasUpdater.cs index ec47459f0..067605fe6 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasUpdater.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/AliasUpdater.cs @@ -1,10 +1,7 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Web; using Orchard.Alias.Implementation.Holder; using Orchard.Alias.Implementation.Storage; -using Orchard.Data; using Orchard.Environment; using Orchard.Tasks; using Orchard.Logging; @@ -13,12 +10,14 @@ namespace Orchard.Alias.Implementation.Updater { public class AliasHolderUpdater : IOrchardShellEvents, IBackgroundTask { private readonly IAliasHolder _aliasHolder; private readonly IAliasStorage _storage; + private readonly IAliasUpdateCursor _cursor; public ILogger Logger { get; set; } - public AliasHolderUpdater(IAliasHolder aliasHolder, IAliasStorage storage) { + public AliasHolderUpdater(IAliasHolder aliasHolder, IAliasStorage storage, IAliasUpdateCursor cursor) { _aliasHolder = aliasHolder; _storage = storage; + _cursor = cursor; Logger = NullLogger.Instance; } @@ -31,7 +30,14 @@ namespace Orchard.Alias.Implementation.Updater { private void Refresh() { try { - var aliases = _storage.List(); + // only retreive aliases which have not been processed yet + var aliases = _storage.List(x => x.Id > _cursor.Cursor).ToArray(); + + // update the last processed id + if (aliases.Any()) { + _cursor.Cursor = aliases.Last().Item5; + } + _aliasHolder.SetAliases(aliases.Select(alias => new AliasInfo { Path = alias.Item1, Area = alias.Item2, RouteValues = alias.Item3 })); } catch (Exception ex) { diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/IAliasUpdateCursor.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/IAliasUpdateCursor.cs new file mode 100644 index 000000000..c80d50678 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/Updater/IAliasUpdateCursor.cs @@ -0,0 +1,5 @@ +namespace Orchard.Alias.Implementation.Updater { + public interface IAliasUpdateCursor : ISingletonDependency { + int Cursor { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Orchard.Alias.csproj b/src/Orchard.Web/Modules/Orchard.Alias/Orchard.Alias.csproj index 83cbde8c7..0eb998400 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Orchard.Alias.csproj +++ b/src/Orchard.Web/Modules/Orchard.Alias/Orchard.Alias.csproj @@ -21,6 +21,10 @@ false + + + + true @@ -67,6 +71,8 @@ + +