From 957452989891bbe59e3425e6642a69f95d206b1b Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 8 Jun 2010 11:42:32 -0700 Subject: [PATCH] Prevent empty content items to be indexed (menu item) Added an IsDirty property to IIndexDocument Once handlers have contributed to index information, if a document is not dirty, don't add it to the index --HG-- branch : dev --- .../Indexing/DefaultIndexProviderTests.cs | 33 +++++++++++++++++++ .../Indexing/Lucene/DefaultIndexDocument.cs | 10 ++++++ .../Indexing/Services/IndexingTaskExecutor.cs | 19 +++++++---- src/Orchard/Indexing/IIndexDocument.cs | 4 +++ 4 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/Orchard.Core.Tests/Indexing/DefaultIndexProviderTests.cs b/src/Orchard.Core.Tests/Indexing/DefaultIndexProviderTests.cs index f92333d91..9152c2b98 100644 --- a/src/Orchard.Core.Tests/Indexing/DefaultIndexProviderTests.cs +++ b/src/Orchard.Core.Tests/Indexing/DefaultIndexProviderTests.cs @@ -216,5 +216,38 @@ namespace Orchard.Tests.Indexing { _provider.Store("default", _provider.New(1).Add("body", null)); Assert.That(_provider.IsEmpty("default"), Is.False); } + + [Test] + public void IsDirtyShouldBeFalseForNewDocuments() { + IIndexDocument doc = _provider.New(1); + Assert.That(doc.IsDirty, Is.False); + } + + + [Test] + public void IsDirtyShouldBeTrueWhenIndexIsModified() { + IIndexDocument doc; + + doc = _provider.New(1); + doc.Add("foo", "value"); + Assert.That(doc.IsDirty, Is.True); + + doc = _provider.New(1); + doc.Add("foo", false); + Assert.That(doc.IsDirty, Is.True); + + doc = _provider.New(1); + doc.Add("foo", (float)1.0); + Assert.That(doc.IsDirty, Is.True); + + doc = _provider.New(1); + doc.Add("foo", 1); + Assert.That(doc.IsDirty, Is.True); + + doc = _provider.New(1); + doc.Add("foo", DateTime.Now); + Assert.That(doc.IsDirty, Is.True); + + } } } diff --git a/src/Orchard.Web/Core/Indexing/Lucene/DefaultIndexDocument.cs b/src/Orchard.Web/Core/Indexing/Lucene/DefaultIndexDocument.cs index 02eae5b1c..571a06cc0 100644 --- a/src/Orchard.Web/Core/Indexing/Lucene/DefaultIndexDocument.cs +++ b/src/Orchard.Web/Core/Indexing/Lucene/DefaultIndexDocument.cs @@ -12,13 +12,17 @@ namespace Orchard.Core.Indexing.Lucene { public List Fields { get; private set; } private AbstractField _previousField; + public int Id { get; private set; } public DefaultIndexDocument(int documentId) { Fields = new List(); SetContentItemId(documentId); + IsDirty = false; } + public bool IsDirty { get; private set; } + public IIndexDocument Add(string name, string value) { return Add(name, value, false); } @@ -35,36 +39,42 @@ namespace Orchard.Core.Indexing.Lucene { } _previousField = new Field(name, value, Field.Store.YES, Field.Index.ANALYZED); + IsDirty = true; return this; } public IIndexDocument Add(string name, DateTime value) { AppendPreviousField(); _previousField = new Field(name, DateTools.DateToString(value, DateTools.Resolution.SECOND), Field.Store.YES, Field.Index.NOT_ANALYZED); + IsDirty = true; return this; } public IIndexDocument Add(string name, int value) { AppendPreviousField(); _previousField = new NumericField(name, Field.Store.YES, true).SetIntValue(value); + IsDirty = true; return this; } public IIndexDocument Add(string name, bool value) { AppendPreviousField(); _previousField = new Field(name, value.ToString().ToLower(), Field.Store.YES, Field.Index.NOT_ANALYZED); + IsDirty = true; return this; } public IIndexDocument Add(string name, float value) { AppendPreviousField(); _previousField = new NumericField(name, Field.Store.YES, true).SetFloatValue(value); + IsDirty = true; return this; } public IIndexDocument Add(string name, object value) { AppendPreviousField(); _previousField = new Field(name, value.ToString(), Field.Store.NO, Field.Index.NOT_ANALYZED); + IsDirty = true; return this; } diff --git a/src/Orchard.Web/Core/Indexing/Services/IndexingTaskExecutor.cs b/src/Orchard.Web/Core/Indexing/Services/IndexingTaskExecutor.cs index baa9b1b8d..bb1bff80f 100644 --- a/src/Orchard.Web/Core/Indexing/Services/IndexingTaskExecutor.cs +++ b/src/Orchard.Web/Core/Indexing/Services/IndexingTaskExecutor.cs @@ -91,10 +91,12 @@ namespace Orchard.Core.Indexing.Services { handler.Indexing(context); } - updateIndexDocuments.Add(context.IndexDocument); + if ( context.IndexDocument.IsDirty ) { + updateIndexDocuments.Add(context.IndexDocument); - foreach (var handler in _handlers) { - handler.Indexed(context); + foreach ( var handler in _handlers ) { + handler.Indexed(context); + } } } catch (Exception ex) { @@ -146,11 +148,14 @@ namespace Orchard.Core.Indexing.Services { handler.Indexing(context); } - updateIndexDocuments.Add(context.IndexDocument); - - foreach (var handler in _handlers) { - handler.Indexed(context); + if ( context.IndexDocument.IsDirty ) { + updateIndexDocuments.Add(context.IndexDocument); + + foreach (var handler in _handlers) { + handler.Indexed(context); + } } + } catch (Exception ex) { Logger.Warning(ex, "Unable to process indexing task #{0}", taskRecord.Id); diff --git a/src/Orchard/Indexing/IIndexDocument.cs b/src/Orchard/Indexing/IIndexDocument.cs index 36abb1b22..574eb612b 100644 --- a/src/Orchard/Indexing/IIndexDocument.cs +++ b/src/Orchard/Indexing/IIndexDocument.cs @@ -24,6 +24,10 @@ namespace Orchard.Indexing { /// IIndexDocument Analyze(bool analyze); + /// + /// Whether some property have been added to this document, or otherwise if it's empty + /// + bool IsDirty { get; } } } \ No newline at end of file