Managing multiple indexes

--HG--
branch : 1.x
extra : rebase_source : 930ebcb3cc0c50b45beac39a81658ace562c8e04
This commit is contained in:
Sebastien Ros
2013-03-04 16:00:55 -08:00
parent 6c24f4a57f
commit 2015448c44
15 changed files with 256 additions and 82 deletions

View File

@@ -11,6 +11,7 @@ namespace Orchard.Indexing.Services {
}
public interface IIndexingService : IDependency {
void DeleteIndex(string indexName);
void RebuildIndex(string indexName);
void UpdateIndex(string indexName);
IndexEntry GetIndexEntry(string indexName);

View File

@@ -4,7 +4,8 @@ namespace Orchard.Indexing.Services {
public enum IndexingStatus {
Rebuilding,
Updating,
Idle
Idle,
Unavailable
}
public interface IIndexStatisticsProvider : IDependency {
DateTime GetLastIndexedUtc(string indexName);

View File

@@ -1,6 +1,7 @@
namespace Orchard.Indexing.Services {
public interface IIndexingTaskExecutor : IDependency {
bool DeleteIndex(string indexName);
bool RebuildIndex(string indexName);
bool UpdateIndexBatch(string indexName);
}
}

View File

@@ -1,6 +1,7 @@
using System.Collections.Generic;
using Orchard.Localization;
using Orchard.UI.Notify;
using Orchard.Validation;
namespace Orchard.Indexing.Services
{
@@ -28,12 +29,14 @@ namespace Orchard.Indexing.Services
public Localizer T { get; set; }
public void RebuildIndex(string indexName) {
Argument.ThrowIfNullOrEmpty(indexName, "indexName");
if (!_indexManager.HasIndexProvider()) {
Services.Notifier.Warning(T("There is no search index to rebuild."));
Services.Notifier.Warning(T("There is no index to rebuild."));
return;
}
if(_indexingTaskExecutor.DeleteIndex(indexName)) {
if(_indexingTaskExecutor.RebuildIndex(indexName)) {
Services.Notifier.Information(T("The index {0} has been rebuilt.", indexName));
UpdateIndex(indexName);
}
@@ -42,7 +45,24 @@ namespace Orchard.Indexing.Services
}
}
public void DeleteIndex(string indexName) {
Argument.ThrowIfNullOrEmpty(indexName, "indexName");
if (!_indexManager.HasIndexProvider()) {
Services.Notifier.Warning(T("There is no index to delete."));
return;
}
if (_indexingTaskExecutor.DeleteIndex(indexName)) {
Services.Notifier.Information(T("The index {0} has been deleted.", indexName));
}
else {
Services.Notifier.Warning(T("The index {0} could not be deleted. It might already be in use, please try again later.", indexName));
}
}
public void UpdateIndex(string indexName) {
Argument.ThrowIfNullOrEmpty(indexName, "indexName");
foreach(var handler in _indexNotifierHandlers) {
handler.UpdateIndex(indexName);
@@ -52,6 +72,8 @@ namespace Orchard.Indexing.Services
}
IndexEntry IIndexingService.GetIndexEntry(string indexName) {
Argument.ThrowIfNullOrEmpty(indexName, "indexName");
var provider = _indexManager.GetSearchIndexProvider();
if (provider == null)
return null;

View File

@@ -9,18 +9,26 @@ namespace Orchard.Indexing.Services {
[UsedImplicitly]
public class IndexingBackgroundTask : IBackgroundTask {
private readonly IIndexNotifierHandler _indexNotifierHandler;
private const string SearchIndexName = "Search";
private readonly IIndexManager _indexManager;
public IndexingBackgroundTask(
IIndexNotifierHandler indexNotifierHandler) {
IIndexNotifierHandler indexNotifierHandler,
IIndexManager indexManager) {
_indexNotifierHandler = indexNotifierHandler;
_indexManager = indexManager;
Logger = NullLogger.Instance;
}
public ILogger Logger { get; set; }
public void Sweep() {
_indexNotifierHandler.UpdateIndex(SearchIndexName);
if (!_indexManager.HasIndexProvider()) {
return;
}
foreach (var index in _indexManager.GetSearchIndexProvider().List()) {
_indexNotifierHandler.UpdateIndex(index);
}
}
}
}

View File

@@ -58,6 +58,17 @@ namespace Orchard.Indexing.Services {
public ILogger Logger { get; set; }
public bool RebuildIndex(string indexName) {
if (DeleteIndex(indexName)) {
var searchProvider = _indexManager.GetSearchIndexProvider();
searchProvider.CreateIndex(indexName);
return true;
}
return false;
}
public bool DeleteIndex(string indexName) {
ILockFile lockFile = null;
var settingsFilename = GetSettingsFileName(indexName);