using System;
using System.Linq;
using Examine;
using Examine.LuceneEngine.Providers;
using Examine.Providers;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Umbraco.Core.Logging;
using Umbraco.Web.Composing;
namespace Umbraco.Web.Search
{
///
/// Extension methods for the LuceneIndexer
///
internal static class ExamineExtensions
{
///
/// Checks if the index can be read/opened
///
///
/// The exception returned if there was an error
///
public static bool IsHealthy(this LuceneIndexer indexer, out Exception ex)
{
try
{
using (indexer.GetIndexWriter().GetReader())
{
ex = null;
return true;
}
}
catch (Exception e)
{
ex = e;
return false;
}
}
///
/// Return the number of indexed documents in Lucene
///
///
///
public static int GetIndexDocumentCount(this LuceneIndexer indexer)
{
try
{
var searcher = indexer.GetSearcher().GetSearcher() as IndexSearcher;
if (searcher == null) return 0;
using (searcher)
using (var reader = searcher.IndexReader)
{
return reader.NumDocs();
}
}
catch (AlreadyClosedException)
{
Current.Logger.Warn(typeof(ExamineExtensions), "Cannot get GetIndexDocumentCount, the writer is already closed");
return 0;
}
}
///
/// Return the total number of fields in the index
///
///
///
public static int GetIndexFieldCount(this LuceneIndexer indexer)
{
//TODO: check for closing! and AlreadyClosedException
try
{
var searcher = indexer.GetSearcher().GetSearcher() as IndexSearcher;
if (searcher == null) return 0;
using (searcher)
using (var reader = searcher.IndexReader)
{
return reader.GetFieldNames(IndexReader.FieldOption.ALL).Count;
}
}
catch (AlreadyClosedException)
{
Current.Logger.Warn(typeof(ExamineExtensions), "Cannot get GetIndexFieldCount, the writer is already closed");
return 0;
}
}
///
/// Returns true if the index is optimized or not
///
///
///
public static bool IsIndexOptimized(this LuceneIndexer indexer)
{
try
{
var searcher = indexer.GetSearcher().GetSearcher() as IndexSearcher;
if (searcher == null) return true;
using (searcher)
using (var reader = searcher.IndexReader)
{
return reader.IsOptimized();
}
}
catch (AlreadyClosedException)
{
Current.Logger.Warn(typeof(ExamineExtensions), "Cannot get IsIndexOptimized, the writer is already closed");
return false;
}
}
///
/// Check if the index is locked
///
///
///
///
/// If the index does not exist we'll consider it locked
///
public static bool IsIndexLocked(this LuceneIndexer indexer)
{
return indexer.IndexExists() == false
|| IndexWriter.IsLocked(indexer.GetLuceneDirectory());
}
///
/// The number of documents deleted in the index
///
///
///
public static int GetDeletedDocumentsCount(this LuceneIndexer indexer)
{
try
{
var searcher = indexer.GetSearcher().GetSearcher() as IndexSearcher;
if (searcher == null) return 0;
using (searcher)
using (var reader = searcher.IndexReader)
{
return reader.NumDeletedDocs;
}
}
catch (AlreadyClosedException)
{
Current.Logger.Warn(typeof(ExamineExtensions), "Cannot get GetDeletedDocumentsCount, the writer is already closed");
return 0;
}
}
}
}