From 0751aff31f49831806449bb88d9b7ecab39eec00 Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Wed, 20 Feb 2013 00:13:35 +0600 Subject: [PATCH] Fixes more of #U4-1706 and adds another unit test. Ensures we never return items from the recycle bin even if the indexes exist. Updated logic to ensure items don't get indexed even if they are saved and currently exist in the recycle bin and ensures that indexes are removed on both trashed and deleted. --- .../PublishedContent/PublishedMediaTests.cs | 39 ++++++++++++++++++- src/Umbraco.Web/DefaultPublishedMediaStore.cs | 7 +++- .../umbraco/Search/ExamineEvents.cs | 36 ++++++++++------- 3 files changed, 66 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs index 8a8f693bd7..eeb7cb4022 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs @@ -108,7 +108,44 @@ namespace Umbraco.Tests.PublishedContent return GetNode(id, GetUmbracoContext("/test", 1234)); } - [Test] + [Test] + public void Do_Not_Find_In_Recycle_Bin() + { + var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString())); + var indexInit = new IndexInitializer(); + var indexer = indexInit.GetUmbracoIndexer(newIndexFolder); + indexer.RebuildIndex(); + var searcher = indexInit.GetUmbracoSearcher(newIndexFolder); + var store = new DefaultPublishedMediaStore(searcher); + var ctx = GetUmbracoContext("/test", 1234); + + //ensure it is found + var publishedMedia = store.GetDocumentById(ctx, 3113); + Assert.IsNotNull(publishedMedia); + + //move item to recycle bin + var newXml = XElement.Parse(@" + + 115 + 268 + 10726 + jpg + "); + indexer.ReIndexNode(newXml, "media"); + + //ensure it still exists in the index (raw examine search) + var criteria = searcher.CreateSearchCriteria(); + var filter = criteria.Id(3113); + var found = searcher.Search(filter.Compile()); + Assert.IsNotNull(found); + Assert.AreEqual(1, found.TotalItemCount); + + //ensure it does not show up in the published media store + var recycledMedia = store.GetDocumentById(ctx, 3113); + Assert.IsNull(recycledMedia); + } + + [Test] public void Children_With_Examine() { var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString())); diff --git a/src/Umbraco.Web/DefaultPublishedMediaStore.cs b/src/Umbraco.Web/DefaultPublishedMediaStore.cs index 2a35ca3619..64c6d760f0 100644 --- a/src/Umbraco.Web/DefaultPublishedMediaStore.cs +++ b/src/Umbraco.Web/DefaultPublishedMediaStore.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Xml.XPath; using Examine; +using Examine.LuceneEngine.SearchCriteria; using Examine.Providers; using Lucene.Net.Documents; using Umbraco.Core; @@ -108,7 +109,11 @@ namespace Umbraco.Web { //first check in Examine as this is WAY faster var criteria = searchProvider.CreateSearchCriteria("media"); - var filter = criteria.Id(id).Not().Field(UmbracoContentIndexer.IndexPathFieldName, "-21"); + + var filter = criteria.Id(id).Not().Field(UmbracoContentIndexer.IndexPathFieldName, "-1,-21,".MultipleCharacterWildcard()); + //the above filter will create a query like this, NOTE: That since the use of the wildcard, it automatically escapes it in Lucene. + //+(+__NodeId:3113 -__Path:-1,-21,*) +__IndexType:media + var results = searchProvider.Search(filter.Compile()); if (results.Any()) { diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Search/ExamineEvents.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Search/ExamineEvents.cs index 45abc5be22..e3077abd09 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Search/ExamineEvents.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Search/ExamineEvents.cs @@ -62,12 +62,12 @@ namespace umbraco.presentation.umbraco.Search void ContentService_Trashed(IContentService sender, Umbraco.Core.Events.MoveEventArgs e) { - IndexContent(e.Entity); + DeleteContent(e.Entity); } void MediaService_Trashed(IMediaService sender, Umbraco.Core.Events.MoveEventArgs e) { - IndexMedia(e.Entity); + DeleteMedia(e.Entity); } void ContentService_Moved(IContentService sender, Umbraco.Core.Events.MoveEventArgs e) @@ -77,16 +77,13 @@ namespace umbraco.presentation.umbraco.Search void ContentService_Deleted(IContentService sender, Umbraco.Core.Events.DeleteEventArgs e) { - e.DeletedEntities.ForEach( - content => - ExamineManager.Instance.DeleteFromIndex( - content.Id.ToString(), - ExamineManager.Instance.IndexProviderCollection.OfType().Where(x => x.EnableDefaultEventHandler))); + e.DeletedEntities.ForEach(DeleteContent); } void ContentService_Saved(IContentService sender, Umbraco.Core.Events.SaveEventArgs e) { - e.SavedEntities.ForEach(IndexContent); + //ensure we do not re-index it if it is in the bin + e.SavedEntities.Where(x => !x.Trashed).ForEach(IndexContent); } void MediaService_Moved(IMediaService sender, Umbraco.Core.Events.MoveEventArgs e) @@ -96,16 +93,13 @@ namespace umbraco.presentation.umbraco.Search void MediaService_Deleted(IMediaService sender, Umbraco.Core.Events.DeleteEventArgs e) { - e.DeletedEntities.ForEach( - media => - ExamineManager.Instance.DeleteFromIndex( - media.Id.ToString(), - ExamineManager.Instance.IndexProviderCollection.OfType().Where(x => x.EnableDefaultEventHandler))); + e.DeletedEntities.ForEach(DeleteMedia); } void MediaService_Saved(IMediaService sender, Umbraco.Core.Events.SaveEventArgs e) { - e.SavedEntities.ForEach(IndexMedia); + //ensure we do not re-index it if it is in the bin + e.SavedEntities.Where(x => !x.Trashed).ForEach(IndexMedia); } private void IndexMedia(IMedia sender) @@ -115,6 +109,20 @@ namespace umbraco.presentation.umbraco.Search ExamineManager.Instance.IndexProviderCollection.OfType().Where(x => x.EnableDefaultEventHandler)); } + private void DeleteContent(IContent sender) + { + ExamineManager.Instance.DeleteFromIndex( + sender.Id.ToString(), + ExamineManager.Instance.IndexProviderCollection.OfType().Where(x => x.EnableDefaultEventHandler)); + } + + private void DeleteMedia(IMedia sender) + { + ExamineManager.Instance.DeleteFromIndex( + sender.Id.ToString(), + ExamineManager.Instance.IndexProviderCollection.OfType().Where(x => x.EnableDefaultEventHandler)); + } + private void IndexContent(IContent sender) { ExamineManager.Instance.ReIndexNode(