Updates latest examine + api updates + fixes tests, gets different validation working (valid, failed, filtered)
This commit is contained in:
@@ -125,13 +125,11 @@ namespace Umbraco.Web.Search
|
||||
|
||||
//create the indexes and register them with the manager
|
||||
foreach(var index in indexCreator.Create())
|
||||
{
|
||||
_examineManager.AddIndex(index);
|
||||
}
|
||||
|
||||
profilingLogger.Logger.Debug<ExamineComponent>("Examine shutdown registered with MainDom");
|
||||
|
||||
var registeredIndexers = examineManager.IndexProviders.Values.OfType<IUmbracoIndexer>().Count(x => x.EnableDefaultEventHandler);
|
||||
var registeredIndexers = examineManager.Indexes.OfType<IUmbracoIndexer>().Count(x => x.EnableDefaultEventHandler);
|
||||
|
||||
profilingLogger.Logger.Info<ExamineComponent>("Adding examine event handlers for {RegisteredIndexers} index providers.", registeredIndexers);
|
||||
|
||||
@@ -205,7 +203,7 @@ namespace Umbraco.Web.Search
|
||||
|
||||
_isConfigured = true;
|
||||
|
||||
foreach (var luceneIndexer in examineManager.IndexProviders.Values.OfType<LuceneIndex>())
|
||||
foreach (var luceneIndexer in examineManager.Indexes.OfType<LuceneIndex>())
|
||||
{
|
||||
//We now need to disable waiting for indexing for Examine so that the appdomain is shutdown immediately and doesn't wait for pending
|
||||
//indexing operations. We used to wait for indexing operations to complete but this can cause more problems than that is worth because
|
||||
@@ -377,7 +375,7 @@ namespace Umbraco.Web.Search
|
||||
//Delete all content of this content/media/member type that is in any content indexer by looking up matched examine docs
|
||||
foreach (var id in ci.Value.removedIds)
|
||||
{
|
||||
foreach (var index in _examineManager.IndexProviders.Values.OfType<IUmbracoIndexer>())
|
||||
foreach (var index in _examineManager.Indexes.OfType<IUmbracoIndexer>())
|
||||
{
|
||||
var searcher = index.GetSearcher();
|
||||
|
||||
@@ -707,7 +705,7 @@ namespace Umbraco.Web.Search
|
||||
{
|
||||
var valueSet = examineComponent._contentValueSetBuilder.GetValueSets(content).ToList();
|
||||
|
||||
foreach (var index in examineComponent._examineManager.IndexProviders.Values.OfType<IUmbracoIndexer>()
|
||||
foreach (var index in examineComponent._examineManager.Indexes.OfType<IUmbracoIndexer>()
|
||||
// only for the specified indexers
|
||||
.Where(x => supportUnpublished.HasValue == false || supportUnpublished.Value == x.SupportSoftDelete)
|
||||
.Where(x => x.EnableDefaultEventHandler))
|
||||
@@ -739,7 +737,7 @@ namespace Umbraco.Web.Search
|
||||
{
|
||||
var valueSet = examineComponent._mediaValueSetBuilder.GetValueSets(media).ToList();
|
||||
|
||||
foreach (var index in examineComponent._examineManager.IndexProviders.Values.OfType<IUmbracoIndexer>()
|
||||
foreach (var index in examineComponent._examineManager.Indexes.OfType<IUmbracoIndexer>()
|
||||
// index this item for all indexers if the media is not trashed, otherwise if the item is trashed
|
||||
// then only index this for indexers supporting unpublished media
|
||||
.Where(x => isPublished || (x.SupportSoftDelete))
|
||||
@@ -769,7 +767,7 @@ namespace Umbraco.Web.Search
|
||||
public static void Execute(ExamineComponent examineComponent, IMember member)
|
||||
{
|
||||
var valueSet = examineComponent._memberValueSetBuilder.GetValueSets(member).ToList();
|
||||
foreach (var index in examineComponent._examineManager.IndexProviders.Values.OfType<IUmbracoIndexer>()
|
||||
foreach (var index in examineComponent._examineManager.Indexes.OfType<IUmbracoIndexer>()
|
||||
//ensure that only the providers are flagged to listen execute
|
||||
.Where(x => x.EnableDefaultEventHandler))
|
||||
{
|
||||
@@ -799,7 +797,7 @@ namespace Umbraco.Web.Search
|
||||
public static void Execute(ExamineComponent examineComponent, int id, bool keepIfUnpublished)
|
||||
{
|
||||
var strId = id.ToString(CultureInfo.InvariantCulture);
|
||||
foreach (var index in examineComponent._examineManager.IndexProviders.Values.OfType<IUmbracoIndexer>()
|
||||
foreach (var index in examineComponent._examineManager.Indexes.OfType<IUmbracoIndexer>()
|
||||
// if keepIfUnpublished == true then only delete this item from indexes not supporting unpublished content,
|
||||
// otherwise if keepIfUnpublished == false then remove from all indexes
|
||||
.Where(x => keepIfUnpublished == false || x.SupportSoftDelete == false)
|
||||
|
||||
@@ -11,26 +11,11 @@ namespace Umbraco.Web.Search
|
||||
{
|
||||
public ExamineSearcherModel()
|
||||
{
|
||||
ProviderProperties = new Dictionary<string, string>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// If the index is not healthy this represents the index error state
|
||||
/// </summary>
|
||||
[DataMember(Name = "error")]
|
||||
public string Error { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// If the index can be open/read
|
||||
/// </summary>
|
||||
[DataMember(Name = "isHealthy")]
|
||||
public bool IsHealthy { get; set; }
|
||||
|
||||
[DataMember(Name = "name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[DataMember(Name = "providerProperties")]
|
||||
public IDictionary<string, string> ProviderProperties { get; private set; }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -110,12 +110,12 @@ namespace Umbraco.Web.Search
|
||||
return luceneDir;
|
||||
}
|
||||
|
||||
public virtual IValueSetValidator GetContentValueSetValidator()
|
||||
public virtual IContentValueSetValidator GetContentValueSetValidator()
|
||||
{
|
||||
return new ContentValueSetValidator(true, true, PublicAccessService);
|
||||
}
|
||||
|
||||
public virtual IValueSetValidator GetPublishedContentValueSetValidator()
|
||||
public virtual IContentValueSetValidator GetPublishedContentValueSetValidator()
|
||||
{
|
||||
return new ContentValueSetValidator(false, false, PublicAccessService);
|
||||
}
|
||||
|
||||
@@ -11,15 +11,27 @@ using Umbraco.Core.Composing;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Web.Models.ContentEditing;
|
||||
using Umbraco.Web.Trees;
|
||||
|
||||
namespace Umbraco.Web.Search
|
||||
{
|
||||
internal class UmbracoTreeSearcher
|
||||
/// <summary>
|
||||
/// Used for internal Umbraco implementations of <see cref="ISearchableTree"/>
|
||||
/// </summary>
|
||||
public class UmbracoTreeSearcher
|
||||
{
|
||||
private readonly IExamineManager _examineManager;
|
||||
private readonly UmbracoHelper _umbracoHelper;
|
||||
|
||||
public UmbracoTreeSearcher(IExamineManager examineManager, UmbracoHelper umbracoHelper)
|
||||
{
|
||||
_examineManager = examineManager ?? throw new ArgumentNullException(nameof(examineManager));
|
||||
_umbracoHelper = umbracoHelper ?? throw new ArgumentNullException(nameof(umbracoHelper));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Searches for results based on the entity type
|
||||
/// </summary>
|
||||
/// <param name="umbracoHelper"></param>
|
||||
/// <param name="query"></param>
|
||||
/// <param name="entityType"></param>
|
||||
/// <param name="totalFound"></param>
|
||||
@@ -30,7 +42,6 @@ namespace Umbraco.Web.Search
|
||||
/// <param name="pageIndex"></param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<SearchResultItem> ExamineSearch(
|
||||
UmbracoHelper umbracoHelper,
|
||||
string query,
|
||||
UmbracoEntityTypes entityType,
|
||||
int pageSize,
|
||||
@@ -39,16 +50,16 @@ namespace Umbraco.Web.Search
|
||||
var sb = new StringBuilder();
|
||||
|
||||
string type;
|
||||
var indexer = Constants.Examine.InternalIndexer;
|
||||
var indexName = Constants.Examine.InternalIndexer;
|
||||
var fields = new[] { "id", "__NodeId" };
|
||||
|
||||
var umbracoContext = umbracoHelper.UmbracoContext;
|
||||
var umbracoContext = _umbracoHelper.UmbracoContext;
|
||||
|
||||
//TODO: WE should really just allow passing in a lucene raw query
|
||||
switch (entityType)
|
||||
{
|
||||
case UmbracoEntityTypes.Member:
|
||||
indexer = Constants.Examine.InternalMemberIndexer;
|
||||
indexName = Constants.Examine.InternalMemberIndexer;
|
||||
type = "member";
|
||||
fields = new[] { "id", "__NodeId", "email", "loginName" };
|
||||
if (searchFrom != null && searchFrom != Constants.Conventions.MemberTypes.AllMembersListId && searchFrom.Trim() != "-1")
|
||||
@@ -72,7 +83,10 @@ namespace Umbraco.Web.Search
|
||||
throw new NotSupportedException("The " + typeof(UmbracoTreeSearcher) + " currently does not support searching against object type " + entityType);
|
||||
}
|
||||
|
||||
var internalSearcher = ExamineManager.Instance.GetSearcher(indexer);
|
||||
if (!_examineManager.TryGetIndex(indexName, out var index))
|
||||
throw new InvalidOperationException("No index found by name " + indexName);
|
||||
|
||||
var internalSearcher = index.GetSearcher();
|
||||
|
||||
//build a lucene query:
|
||||
// the __nodeName will be boosted 10x without wildcards
|
||||
@@ -197,7 +211,7 @@ namespace Umbraco.Web.Search
|
||||
case UmbracoEntityTypes.Media:
|
||||
return MediaFromSearchResults(pagedResult);
|
||||
case UmbracoEntityTypes.Document:
|
||||
return ContentFromSearchResults(umbracoHelper, pagedResult);
|
||||
return ContentFromSearchResults(pagedResult);
|
||||
default:
|
||||
throw new NotSupportedException("The " + typeof(UmbracoTreeSearcher) + " currently does not support searching against object type " + entityType);
|
||||
}
|
||||
@@ -205,15 +219,13 @@ namespace Umbraco.Web.Search
|
||||
|
||||
private void AppendPath(StringBuilder sb, UmbracoObjectTypes objectType, int[] startNodeIds, string searchFrom, IEntityService entityService)
|
||||
{
|
||||
if (sb == null) throw new ArgumentNullException("sb");
|
||||
if (entityService == null) throw new ArgumentNullException("entityService");
|
||||
if (sb == null) throw new ArgumentNullException(nameof(sb));
|
||||
if (entityService == null) throw new ArgumentNullException(nameof(entityService));
|
||||
|
||||
Udi udi;
|
||||
Udi.TryParse(searchFrom, true, out udi);
|
||||
Udi.TryParse(searchFrom, true, out var udi);
|
||||
searchFrom = udi == null ? searchFrom : entityService.GetId(udi).Result.ToString();
|
||||
|
||||
int searchFromId;
|
||||
var entityPath = int.TryParse(searchFrom, out searchFromId) && searchFromId > 0
|
||||
var entityPath = int.TryParse(searchFrom, out var searchFromId) && searchFromId > 0
|
||||
? entityService.GetAllPaths(objectType, searchFromId).FirstOrDefault()
|
||||
: null;
|
||||
if (entityPath != null)
|
||||
@@ -284,8 +296,7 @@ namespace Umbraco.Web.Search
|
||||
}
|
||||
if (searchResult.Values.ContainsKey("__key") && searchResult.Values["__key"] != null)
|
||||
{
|
||||
Guid key;
|
||||
if (Guid.TryParse(searchResult.Values["__key"], out key))
|
||||
if (Guid.TryParse(searchResult.Values["__key"], out var key))
|
||||
{
|
||||
m.Key = key;
|
||||
}
|
||||
@@ -317,10 +328,9 @@ namespace Umbraco.Web.Search
|
||||
/// <summary>
|
||||
/// Returns a collection of entities for content based on search results
|
||||
/// </summary>
|
||||
/// <param name="umbracoHelper"></param>
|
||||
/// <param name="results"></param>
|
||||
/// <returns></returns>
|
||||
private IEnumerable<SearchResultItem> ContentFromSearchResults(UmbracoHelper umbracoHelper, IEnumerable<SearchResult> results)
|
||||
private IEnumerable<SearchResultItem> ContentFromSearchResults(IEnumerable<SearchResult> results)
|
||||
{
|
||||
var mapped = Mapper.Map<IEnumerable<SearchResultItem>>(results).ToArray();
|
||||
//add additional data
|
||||
@@ -329,7 +339,7 @@ namespace Umbraco.Web.Search
|
||||
var intId = m.Id.TryConvertTo<int>();
|
||||
if (intId.Success)
|
||||
{
|
||||
m.AdditionalData["Url"] = umbracoHelper.Url(intId.Result);
|
||||
m.AdditionalData["Url"] = _umbracoHelper.Url(intId.Result);
|
||||
}
|
||||
}
|
||||
return mapped;
|
||||
|
||||
Reference in New Issue
Block a user